diff --git a/data_storage.cpp b/data_storage.cpp index 8c2660b84f6c1947f37a53dcd35d23ac69687ecc..daef44f3d3156575c1de3665abf209a87bf96c17 100644 --- a/data_storage.cpp +++ b/data_storage.cpp @@ -1,6 +1,7 @@ #include "data_storage.hpp" #include <algorithm> +#include <cstring> namespace insite { @@ -141,4 +142,17 @@ std::unordered_map<std::uint64_t, std::unordered_map<std::string, return measurements; } +void DataStorage::SetCurrentSimulationTime(double simulation_time) { + uint64_t simulation_time_int; + memcpy(&simulation_time_int, &simulation_time, sizeof(simulation_time_int)); + current_simulation_time_ = simulation_time_int; +} + +double DataStorage::GetCurrentSimulationTime() const { + const uint64_t simulation_time_int =current_simulation_time_; + double simulation_time; + memcpy(&simulation_time, &simulation_time_int, sizeof(simulation_time)); + return simulation_time; +} + } // namespace insite diff --git a/data_storage.hpp b/data_storage.hpp index 2f9de3cbfb8b640d224d3d38e85f504857105f54..0ecdbefd9dce8bacc09dbdfdcfa1bb917e87db84 100644 --- a/data_storage.hpp +++ b/data_storage.hpp @@ -7,6 +7,7 @@ #include <string> #include <unordered_map> #include <vector> +#include <atomic> namespace insite { @@ -45,6 +46,9 @@ class DataStorage { std::unordered_map<std::uint64_t, std::unordered_map<std::string, MultimeterMeasurements>> GetMultimeterMeasurements(); + void SetCurrentSimulationTime(double simulation_time); + double GetCurrentSimulationTime() const; + private: // std::unique_ptr<H5::H5File> h5_file_; @@ -54,6 +58,8 @@ class DataStorage { // H5::DataSet spikes_neurons_dataset_; std::mutex spike_mutex_; + std::atomic_uint64_t current_simulation_time_; + // Device ID to attribute index to measurement map. std::unordered_map<std::uint64_t, std::unordered_map<std::string, MultimeterMeasurements>> buffered_measurements_; diff --git a/http_server.cpp b/http_server.cpp index e8a3a31127f7c704a128c951bccc2084a9051c1e..7acd6425655111f03795471c15bb56fad835f943 100644 --- a/http_server.cpp +++ b/http_server.cpp @@ -14,6 +14,9 @@ HttpServer::HttpServer(web::http::uri address, DataStorage* storage) } else if (request.method() == "GET" && request.relative_uri().path() == "/multimeter_measurement") { request.reply(GetMultimeterMeasurement(request)); + } else if (request.method() == "GET" && + request.relative_uri().path() == "/current_simulation_time") { + request.reply(GetCurrentSimulationTime(request)); } else { std::cerr << "Invalid request: " << request.to_string() << "\n"; request.reply(web::http::status_codes::NotFound); @@ -24,6 +27,14 @@ HttpServer::HttpServer(web::http::uri address, DataStorage* storage) std::cout << "HTTP server is listening...\n"; } +web::http::http_response HttpServer::GetCurrentSimulationTime( + const web::http::http_request& request) { + web::http::http_response response(web::http::status_codes::OK); + web::json::value simulation_time = storage_->GetCurrentSimulationTime(); + response.set_body(simulation_time); + return response; +} + web::http::http_response HttpServer::GetSpikes( const web::http::http_request& request) { const auto parameters = web::uri::split_query(request.request_uri().query()); diff --git a/http_server.hpp b/http_server.hpp index 74ae309254f67a40b1eae2098e7b732c65889de6..7e9a73447e996f71c94ff5e7ec0f03f7edad5cb2 100644 --- a/http_server.hpp +++ b/http_server.hpp @@ -16,6 +16,8 @@ class HttpServer { web::http::experimental::listener::http_listener http_listener_; DataStorage* storage_; + web::http::http_response GetCurrentSimulationTime(const web::http::http_request& request); + web::http::http_response GetSpikes(const web::http::http_request& request); web::http::http_response GetMultimeterMeasurement( diff --git a/recording_backend_insite.cpp b/recording_backend_insite.cpp index 32304854f5f7d3de5f5aa3c10a8367a19f39d06f..7b80a00eb4a890b5bef7eec68a3ca074cdac3504 100644 --- a/recording_backend_insite.cpp +++ b/recording_backend_insite.cpp @@ -128,18 +128,19 @@ void RecordingBackendInsite::post_run_hook() { } void RecordingBackendInsite::post_step_hook() { - // Send simulation time - { - pqxx::work txn(database_connection_); - txn.exec0( - "UPDATE nest_simulation_node " - "SET current_simulation_time = " + - std::to_string(latest_simulation_time_) + - "" - "WHERE id = " + - std::to_string(simulation_node_id_)); - txn.commit(); - } + // // Send simulation time + // { + // pqxx::work txn(database_connection_); + // txn.exec0( + // "UPDATE nest_simulation_node " + // "SET current_simulation_time = " + + // std::to_string(latest_simulation_time_) + + // "" + // "WHERE id = " + + // std::to_string(simulation_node_id_)); + // txn.commit(); + // } + data_storage_.SetCurrentSimulationTime(latest_simulation_time_); if (new_neuron_infos_.size() > 0) { std::stringstream neuron_query; @@ -190,30 +191,30 @@ void RecordingBackendInsite::post_step_hook() { } // Send multimeter info - for (auto& kvp : multimeter_infos_) { - auto& multimeter = kvp.second; - if (!multimeter.needs_update) continue; - multimeter.needs_update = false; - - if (multimeter.gids.size() > 0) { - std::stringstream neuron_multimeter_query; - neuron_multimeter_query - << "INSERT INTO nest_neuron_multimeter (neuron_id, multimeter_id) " - << "VALUES "; - - for (const auto& neuron_id : multimeter.gids) { - const bool first = neuron_id == multimeter.gids[0]; - neuron_multimeter_query << (first ? "" : ",") << "(" << neuron_id << "," - << multimeter.device_id << ")"; - } - - neuron_multimeter_query << " ON CONFLICT DO NOTHING;"; - - pqxx::work txn(database_connection_); - txn.exec0(neuron_multimeter_query.str()); - txn.commit(); - } - } + // for (auto& kvp : multimeter_infos_) { + // auto& multimeter = kvp.second; + // if (!multimeter.needs_update) continue; + // multimeter.needs_update = false; + + // if (multimeter.gids.size() > 0) { + // std::stringstream neuron_multimeter_query; + // neuron_multimeter_query + // << "INSERT INTO nest_neuron_multimeter (neuron_id, multimeter_id) " + // << "VALUES "; + + // for (const auto& neuron_id : multimeter.gids) { + // const bool first = neuron_id == multimeter.gids[0]; + // neuron_multimeter_query << (first ? "" : ",") << "(" << neuron_id << "," + // << multimeter.device_id << ")"; + // } + + // neuron_multimeter_query << " ON CONFLICT DO NOTHING;"; + + // pqxx::work txn(database_connection_); + // txn.exec0(neuron_multimeter_query.str()); + // txn.commit(); + // } + // } } void RecordingBackendInsite::write(const nest::RecordingDevice& device,