Skip to content
Snippets Groups Projects
Commit bb0bb0de authored by Simon Oehrl's avatar Simon Oehrl
Browse files

Add current simulation time endpoint

parent 9052c384
No related branches found
No related tags found
No related merge requests found
Pipeline #163429 passed
#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
......@@ -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_;
......
......@@ -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());
......
......@@ -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(
......
......@@ -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,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment