Skip to content
Snippets Groups Projects
Commit b1ae36ff authored by Tim Übelhör's avatar Tim Übelhör
Browse files

Simplified the grpc.

parent c86bbd8a
No related branches found
No related tags found
No related merge requests found
This diff is collapsed.
This diff is collapsed.
......@@ -4,8 +4,6 @@
#include "Simulator.hpp"
#include "CoSimFmu.h"
using ModeliRpc::Fmi2Status;
ModeliGrpcServer::ModeliGrpcServer(std::unique_ptr<Simulation::Simulator> simulator) :m_simulator(std::move(simulator))
{
}
......@@ -16,13 +14,13 @@ ModeliGrpcServer::~ModeliGrpcServer()
Status ModeliGrpcServer::Play(ServerContext * context, const::ModeliRpc::PlayRequest * request, ::ModeliRpc::PlayResponse * response)
{
response->set_status(static_cast<Fmi2Status>(m_simulator->Play()));
response->set_status(m_simulator->Play());
return Status::OK;
}
Status ModeliGrpcServer::PlayFast(ServerContext * context, const::ModeliRpc::PlayFastRequest * request, ::ModeliRpc::PlayFastResponse * response)
{
response->set_status(static_cast<Fmi2Status>(m_simulator->PlayFast(request->time())));
response->set_status(m_simulator->PlayFast(request->time()));
return Status::OK;
}
......@@ -34,7 +32,7 @@ Status ModeliGrpcServer::Pause(ServerContext * context, const::ModeliRpc::PauseR
Status ModeliGrpcServer::Stop(ServerContext * context, const::ModeliRpc::StopRequest * request, ::ModeliRpc::StopResponse * response)
{
response->set_status(static_cast<Fmi2Status>(m_simulator->Stop()));
response->set_status(m_simulator->Stop());
return Status::OK;
}
......@@ -101,56 +99,34 @@ Status ModeliGrpcServer::RemoveChannelLink(ServerContext * context, const::Model
Status ModeliGrpcServer::SetInt(ServerContext * context, const::ModeliRpc::SetIntRequest * request, ::ModeliRpc::SetIntResponse * response)
{
std::vector<unsigned int> valueRefs;
std::transform(request->int_value().begin(), request->int_value().end(), std::back_inserter(valueRefs),
[](ModeliRpc::IntValue element) { return element.value_ref(); });
std::vector<int> values;
std::transform(request->int_value().begin(), request->int_value().end(), std::back_inserter(values),
[](ModeliRpc::IntValue element) { return element.value(); });
response->set_status(static_cast<Fmi2Status>(
m_simulator->SetInteger(request->instance_name(), valueRefs, values)));
std::vector<unsigned int> vrs(request->values().vrs().begin(), request->values().vrs().end());
std::vector<int> values(request->values().values().begin(), request->values().values().end());
response->set_status(m_simulator->SetInteger(request->instance_name(), vrs, values));
return Status::OK;
}
Status ModeliGrpcServer::SetReal(ServerContext * context, const::ModeliRpc::SetRealRequest * request, ::ModeliRpc::SetRealResponse * response)
{
std::vector<unsigned int> valueRefs;
std::transform(request->real_value().begin(), request->real_value().end(), std::back_inserter(valueRefs),
[](ModeliRpc::RealValue element) { return element.value_ref(); });
std::vector<double> values;
std::transform(request->real_value().begin(), request->real_value().end(), std::back_inserter(values),
[](ModeliRpc::RealValue element) { return element.value(); });
response->set_status(static_cast<Fmi2Status>(
m_simulator->SetReal(request->instance_name(), valueRefs, values)));
std::vector<unsigned int> vrs(request->values().vrs().begin(), request->values().vrs().end());
std::vector<double> values(request->values().values().begin(), request->values().values().end());
response->set_status(m_simulator->SetReal(request->instance_name(), vrs, values));
return Status::OK;
}
Status ModeliGrpcServer::SetBoolean(ServerContext * context, const::ModeliRpc::SetBoolRequest * request, ::ModeliRpc::SetBoolResponse * response)
{
std::vector<unsigned int> valueRefs;
std::transform(request->bool_value().begin(), request->bool_value().end(), std::back_inserter(valueRefs),
[](ModeliRpc::BoolValue element) { return element.value_ref(); });
std::vector<int> values;
std::transform(request->bool_value().begin(), request->bool_value().end(), std::back_inserter(values),
[](ModeliRpc::BoolValue element) { return element.value(); });
response->set_status(static_cast<Fmi2Status>(
m_simulator->SetBoolean(request->instance_name(), valueRefs, values)));
std::vector<unsigned int> vrs(request->values().vrs().begin(), request->values().vrs().end());
std::vector<int> values(request->values().values().begin(), request->values().values().end());
response->set_status(m_simulator->SetBoolean(request->instance_name(), vrs, values));
return Status::OK;
}
Status ModeliGrpcServer::SetString(ServerContext * context, const::ModeliRpc::SetStringRequest * request, ::ModeliRpc::SetStringResponse * response)
{
std::vector<unsigned int> valueRefs;
std::transform(request->string_value().begin(), request->string_value().end(), std::back_inserter(valueRefs),
[](ModeliRpc::StringValue element) { return element.value_ref(); });
std::vector<std::string> values;
std::transform(request->string_value().begin(), request->string_value().end(), std::back_inserter(values),
[](ModeliRpc::StringValue element) { return element.value(); });
response->set_status(static_cast<Fmi2Status>(
m_simulator->SetString(request->instance_name(), valueRefs, values)));
std::vector<unsigned int> vrs(request->values().vrs().begin(), request->values().vrs().end());
std::vector<std::string> values(request->values().values().begin(), request->values().values().end());
response->set_status(m_simulator->SetString(request->instance_name(), vrs, values));
return Status::OK;
}
......@@ -182,34 +158,28 @@ void ModeliGrpcServer::ValuesArrived(const std::string instanceName, double time
response.set_instance_name(instanceName);
response.set_timestamp(timestamp);
// Create repeated fields
using google::protobuf::RepeatedField;
using google::protobuf::uint32;
// int
for (size_t i = 0; i < intVrs.size() && i < intValues.size(); i++)
{
auto added = response.add_int_value();
added->set_value_ref(intVrs[i]);
added->set_value(intValues[i]);
}
RepeatedField<unsigned int> int_vrs(intVrs.begin(), intVrs.end());
RepeatedField<int> int_values(intValues.begin(), intValues.end());
response.mutable_int_values()->mutable_vrs()->Swap(&int_vrs);
response.mutable_int_values()->mutable_values()->Swap(&int_values);
// real
for (size_t i = 0; i < realVrs.size() && i < realValues.size(); i++)
{
auto added = response.add_real_value();
added->set_value_ref(realVrs[i]);
added->set_value(realValues[i]);
}
RepeatedField<unsigned int> real_vrs(realVrs.begin(), realVrs.end());
RepeatedField<double> real_values(realValues.begin(), realValues.end());
response.mutable_real_values()->mutable_vrs()->Swap(&real_vrs);
response.mutable_real_values()->mutable_values()->Swap(&real_values);
// bool
for (size_t i = 0; i < boolVrs.size() && i < boolValues.size(); i++)
{
auto added = response.add_bool_value();
added->set_value_ref(boolVrs[i]);
added->set_value(boolValues[i]);
}
RepeatedField<unsigned int> bool_vrs(boolVrs.begin(), boolVrs.end());
RepeatedField<int> bool_values(boolValues.begin(), boolValues.end());
response.mutable_bool_values()->mutable_vrs()->Swap(&bool_vrs);
response.mutable_bool_values()->mutable_values()->Swap(&bool_values);
// string
for (size_t i = 0; i < stringVrs.size() && i < stringValues.size(); i++)
{
auto added = response.add_string_value();
added->set_value_ref(stringVrs[i]);
added->set_value(stringValues[i]);
}
RepeatedField<unsigned int> string_vrs(stringVrs.begin(), stringVrs.end());
google::protobuf::RepeatedPtrField<std::string> string_values(stringValues.begin(), stringValues.end());
response.mutable_string_values()->mutable_vrs()->Swap(&string_vrs);
response.mutable_string_values()->mutable_values()->Swap(&string_values);
// Buffer the values so the simulation does not have to wait for the network
m_new_values.push(response);
}
......@@ -218,7 +188,7 @@ void ModeliGrpcServer::LogArrived(std::string instanceName, int status, std::str
{
ModeliRpc::LogResponse response;
response.set_instance_name(instanceName);
response.set_status(static_cast<Fmi2Status>(status));
response.set_status(status);
// Buffer the logs so the simulation does not get blocked
m_logs.push(response);
}
......@@ -308,13 +308,15 @@ namespace Simulation
bool Simulator::AddFmu(std::unique_ptr<Files::FmuFile> fmuFile, std::string instance_name)
{
return m_dispatcher.dispatch_fn<bool>([&]()
// Fail early if instance name exists (asking for state -> dispatch)
if (!m_dispatcher.dispatch_fn<bool>([&]()
{
// Fail early if instance name exists
if (m_fmus->Contains(instance_name))
return m_fmus->Contains(instance_name);
}).get())
{
return false;
}
// Heavy instantiation work outside the dispatcher
// Instantiate
std::shared_ptr<FmuEntity> entity = std::make_shared<FmuEntity>(
instance_name,
......@@ -330,6 +332,8 @@ namespace Simulation
{
return false;
}
return m_dispatcher.dispatch_fn<bool>([&]()
{
// When simulation is running fmu must exit initialization mode
if (m_sim_thread.joinable())
{
......@@ -339,7 +343,7 @@ namespace Simulation
return false;
}
}
// We did it
// Fmu ready to add
return m_fmus->Add(entity);
}).get();
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment