diff --git a/streaming_recording_backend.cpp b/streaming_recording_backend.cpp index 5893486545aebd8f87ae4352e83dea57236fba43..6b5cac34341ee95691245f6c2d89f1889f4acbeb 100644 --- a/streaming_recording_backend.cpp +++ b/streaming_recording_backend.cpp @@ -23,6 +23,8 @@ #include "streaming_recording_backend.h" #include "recording_device.h" +#include "nesci/producer/nest_multimeter.hpp" +#include "nesci/producer/spike_detector.hpp" #include <iostream> #include <memory> @@ -70,23 +72,37 @@ void StreamingRecordingBackend::enroll( long_parameter_names.push_back(value_name.toString()); } - if (device.get_type() == nest::RecordingDevice::Type::MULTIMETER) { - devices_[std::this_thread::get_id()][device.get_name()] = - std::make_unique<nesci::producer::NestMultimeter>( - device.get_name(), double_parameter_names, long_parameter_names); - } - - std::cout << std::this_thread::get_id() << ' '; - std::cout << device.get_name() << ' '; - std::cout << "double_value_names: "; - for (const auto &name : double_value_names) { - std::cout << name << ' '; - } - std::cout << ", long_value_names: "; - for (const auto &name : long_value_names) { - std::cout << name << ' '; + switch (device.get_type()) { + case nest::RecordingDevice::Type::MULTIMETER: + devices_[std::this_thread::get_id()][device.get_name()] = + std::make_unique<nesci::producer::NestMultimeter>( + device.get_name(), double_parameter_names, long_parameter_names); + std::cout << "Thread " << std::this_thread::get_id() + << ": enrolled multimeter `" << device.get_name() + << "` recording "; + for (const auto &double_value : double_value_names) { + std::cout << '`' << double_value << "` "; + } + for (const auto &long_value : long_value_names) { + std::cout << '`' << long_value << "` "; + } + std::cout << std::endl; + break; + + case nest::RecordingDevice::Type::SPIKE_DETECTOR: + devices_[std::this_thread::get_id()][device.get_name()] = + std::make_unique<nesci::producer::SpikeDetector>(device.get_name()); + std::cout << "Thread " << std::this_thread::get_id() + << ": enrolled spike detector `" << device.get_name() << "`" + << std::endl; + std::cout << std::endl; + break; + + default: + std::cerr << "Invalid recording device type for " << device.get_name() + << std::endl; + break; } - std::cout << std::endl; } void StreamingRecordingBackend::write(const nest::RecordingDevice &device, @@ -113,6 +129,15 @@ void StreamingRecordingBackend::write(const nest::RecordingDevice &device, static_cast<nesci::producer::NestMultimeter *>(nesci_device.get()); multimeter->Record(event.get_stamp().get_ms(), event.get_sender_gid(), double_values.data(), long_values.data()); + } else if (device.get_type() == nest::RecordingDevice::Type::SPIKE_DETECTOR) { + auto spike_detector = + static_cast<nesci::producer::SpikeDetector *>(nesci_device.get()); + nesci::producer::SpikeDetector::Datum datum{event.get_stamp().get_ms(), + event.get_sender_gid()}; + spike_detector->Record(datum); + } else { + std::cerr << "Error: no device registered for `" << device.get_name() << '`' + << std::endl; } } @@ -125,12 +150,13 @@ void StreamingRecordingBackend::synchronize() { } for (const auto &device : thread_devices->second) { + const auto node = device.second->node(); + // TODO: check if node is empty { std::lock_guard<std::mutex> lock_guard(relay_mutex_); - relay_.Send(device.second->node(), false); + relay_.Send(node, false); } - static_cast<nesci::producer::NestMultimeter *>(device.second.get()) - ->Clear(); + device.second->Clear(); } } diff --git a/streaming_recording_backend.h b/streaming_recording_backend.h index 52643d7fa67e200790f95395de1f5cde5625784a..e78cccadaa879e90bdf5e372937a93fad193713f 100644 --- a/streaming_recording_backend.h +++ b/streaming_recording_backend.h @@ -36,7 +36,6 @@ #include "contra/relay.hpp" #include "contra/shared_memory/shared_memory_transport.hpp" #include "nesci/producer/device.hpp" -#include "nesci/producer/nest_multimeter.hpp" namespace streamingnest {