41 grpc::ServerBuilder builder;
44 builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
47 builder.RegisterService(
this);
49 _server = builder.BuildAndStart();
52 PRINT_INFO(
"RpcServer listening on " << server_address);
87 if (filename.empty())
return false;
89 corbo::messages::corboParameters msg;
91 std::ifstream file(filename);
98 if (!msg.ParsePartialFromIstream(&file))
103 std::stringstream issues;
115 bool result =
setPlant(msg.plant(), issues);
124 result &=
setTask(msg.task(), issues);
134 if (msg.plant_case() == corbo::messages::Plant::PLANT_NOT_SET)
136 if (issues) *issues <<
"No plant selected." << std::endl;
139 std::string plant_type;
140 if (util::get_oneof_field_type(msg,
"plant", plant_type,
false))
146 util::get_oneof_field_type_expand_isolated(msg,
"plant", plant_type,
false);
152 plant->fromMessage(msg, issues);
154 return issues ? issues->str().empty() :
true;
156 if (issues) *issues <<
"Plant type '" + plant_type +
"' not found." << std::endl;
159 *issues <<
"Cannot determine type of specified plant. Protobuf error." << std::endl;
168 if (msg.controller_case() == corbo::messages::Controller::CONTROLLER_NOT_SET)
170 if (issues) *issues <<
"No controller selected." << std::endl;
173 std::string controller_type;
174 if (util::get_oneof_field_type(msg,
"controller", controller_type,
false))
180 util::get_oneof_field_type_expand_isolated(msg,
"controller", controller_type,
false);
186 controller->fromMessage(msg, issues);
188 return issues ? issues->str().empty() :
true;
190 if (issues) *issues <<
"Controller type '" + controller_type +
"' not found." << std::endl;
193 *issues <<
"Cannot determine type of specified controller. Protobuf error." << std::endl;
202 if (msg.observer_case() == corbo::messages::Observer::OBSERVER_NOT_SET)
204 if (issues) *issues <<
"No observer selected." << std::endl;
207 std::string observer_type;
208 if (util::get_oneof_field_type(msg,
"observer", observer_type,
false))
214 util::get_oneof_field_type_expand_isolated(msg,
"observer", observer_type,
false);
220 observer->fromMessage(msg, issues);
222 return issues ? issues->str().empty() :
true;
224 if (issues) *issues <<
"Observer type '" + observer_type +
"' not found." << std::endl;
227 *issues <<
"Cannot determine type of specified observer. Protobuf error." << std::endl;
232 bool Master::setTask(
const messages::Task& msg, std::stringstream* issues)
234 if (msg.task_case() == corbo::messages::Task::TASK_NOT_SET)
236 if (issues) *issues <<
"No task selected." << std::endl;
239 std::string task_type;
240 if (util::get_oneof_field_type(msg,
"task", task_type,
false))
246 util::get_oneof_field_type_expand_isolated(msg,
"task", task_type,
false);
252 _task->fromMessage(msg, issues);
253 return issues ? issues->str().empty() :
true;
255 if (issues) *issues <<
"Task type '" + task_type +
"' not found." << std::endl;
258 *issues <<
"Cannot determine type of specified task. Protobuf error." << std::endl;
265 std::stringstream issues;
268 response->set_ok(
true);
272 response->set_ok(
false);
273 response->set_text(issues.str());
275 return grpc::Status::OK;
282 return grpc::Status::OK;
287 std::stringstream issues;
290 response->set_ok(
true);
294 response->set_ok(
false);
295 response->set_text(issues.str());
297 return grpc::Status::OK;
304 return grpc::Status::OK;
309 std::stringstream issues;
312 response->set_ok(
true);
316 response->set_ok(
false);
317 response->set_text(issues.str());
319 return grpc::Status::OK;
326 return grpc::Status::OK;
331 std::stringstream issues;
332 if (
setTask(*request, &issues))
334 response->set_ok(
true);
338 response->set_ok(
false);
339 response->set_text(issues.str());
341 return grpc::Status::OK;
346 if (!
_task)
return grpc::Status::CANCELLED;
347 _task->toMessage(*response);
348 return grpc::Status::OK;
352 grpc::ServerWriter<messages::Signal>* response_stream)
356 SignalTargetRPC::Ptr signal_target = std::make_shared<SignalTargetRPC>(response_stream);
359 return grpc::Status::OK;
363 grpc::ServerWriter<messages::Signal>* response_stream)
369 SignalTargetRPC::Ptr signal_target = std::make_shared<SignalTargetRPC>(response_stream);
373 if (!err_msg.empty())
375 return grpc::Status(grpc::StatusCode::ABORTED, err_msg);
378 return grpc::Status::OK;
387 response->set_text(result);
391 response->set_text(
"No task selected!");
393 return grpc::Status::OK;
398 response->set_text(
"got it");
399 response->set_ok(
true);
400 return grpc::Status::OK;
406 return grpc::Status::OK;
grpc::Status ping(grpc::ServerContext *context, const corbo::messages::Void *request, corbo::messages::Status *response) override
Send and receive dummy message in order to check the connectivity between master and client...
bool setController(const corbo::messages::Controller &msg, std::stringstream *issues=nullptr)
#define PRINT_ERROR_NAMED(msg)
bool setTask(const corbo::messages::Task &msg, std::stringstream *issues=nullptr)
bool hasController() const
Check if a controller has been specified.
grpc::Status performTask(grpc::ServerContext *context, const corbo::messages::Void *request, grpc::ServerWriter< corbo::messages::Signal > *response_stream) override
Perform the current task and broadcast stream of signals.
void setObserver(ObserverInterface::Ptr observer)
Set observer.
#define PRINT_ERROR_COND_NAMED(cond, msg)
void setController(ControllerInterface::Ptr controller)
Set controller.
grpc::Status getPlant(grpc::ServerContext *context, const corbo::messages::Void *request, corbo::messages::Plant *response) override
Get current plant configuration.
bool setObserver(const corbo::messages::Observer &msg, std::stringstream *issues=nullptr)
bool hasObserver() const
Check if an observer has been specified.
grpc::Status getTask(grpc::ServerContext *context, const corbo::messages::Void *request, corbo::messages::Task *response) override
Get current task configuration.
void start(const std::string &server_address, bool blocking=true)
Start master server (blocking call)
void setPlant(PlantInterface::Ptr plant)
Set plant.
grpc::Status getAvailableSignals(grpc::ServerContext *context, const corbo::messages::Void *request, grpc::ServerWriter< corbo::messages::Signal > *response_stream) override
Retrieve available signals from task (and included modules)
std::shared_ptr< SystemOutputInterface > Ptr
#define PRINT_DEBUG_NAMED(msg)
const PlantInterface::Ptr & getPlant() const
Read access to the underlying plant.
void setOk(bool ok)
Change the current program state to ok or request the termination of the current action.
bool setPlant(const messages::Plant &msg, std::stringstream *issues=nullptr)
std::shared_ptr< ObserverInterface > Ptr
grpc::Status getObserver(grpc::ServerContext *context, const corbo::messages::Void *request, corbo::messages::Observer *response) override
Get current observer configuration.
grpc::Status stop(grpc::ServerContext *context, const corbo::messages::Void *request, corbo::messages::Void *response) override
Execution stop of the current task requested (setting global ok() variable to false, needs to be supported by the selected task)
bool setcorboMessage(const corbo::messages::corboParameters &msg, std::stringstream *issues)
static Factory & instance()
< Retrieve static instance of the factory
const ObserverInterface::Ptr & getObserver() const
Read access to the underlying observer.
bool hasPlant() const
Check if a plant has been specified.
std::shared_ptr< PlantInterface > Ptr
void setDefault()
Restore default master settings.
bool loadFromFile(const std::string &filename)
std::shared_ptr< Derived > create(const std::string &name, bool print_error=true) const
Create a shared instance of the desired object.
const ControllerInterface::Ptr & getController() const
Read access to the underlying controller.
void printObjects() const
Print registered object names to console.
std::unique_ptr< grpc::Server > _server
std::shared_ptr< ControllerInterface > Ptr
std::shared_ptr< SystemDynamicsInterface > Ptr
#define PRINT_INFO(msg)
Print msg-stream.
grpc::Status getController(grpc::ServerContext *context, const corbo::messages::Void *request, corbo::messages::Controller *response) override
Get current controller configuration.
#define PRINT_ERROR(msg)
Print msg-stream as error msg.
grpc::Status verifyConfig(grpc::ServerContext *context, const corbo::messages::Void *request, corbo::messages::Status *response) override
Check if the current configuration seems to be valid (refer to TaskInterface::verify()) ...