@@ -51,6 +51,42 @@ OccServer::~OccServer()
5151 m_checkerThread.join ();
5252}
5353
54+ grpc::Status OccServer::EventStream (grpc::ServerContext* context,
55+ const occ_pb::EventStreamRequest* request,
56+ grpc::ServerWriter<occ_pb::EventStreamReply>* writer)
57+ {
58+ std::cout << " [request StateStream] handler BEGIN" << std::endl;
59+
60+ boost::uuids::basic_random_generator<boost::mt19937> gen;
61+ std::string id = boost::uuids::to_string (gen ());
62+
63+ boost::lockfree::queue<pb::DeviceEvent*> eventQueue;
64+ m_eventQueues[id] = &eventQueue;
65+ DEFER ({
66+ m_eventQueues.erase (id);
67+ });
68+
69+ bool isStreamOpen = true ;
70+ while (!m_destroying && isStreamOpen) {
71+ pb::DeviceEvent *newEvent;
72+ bool ok = eventQueue.pop (newEvent);
73+ if (!ok) { // queue empty, sleep and retry
74+ std::this_thread::sleep_for (2ms);
75+ continue ;
76+ }
77+
78+ pb::EventStreamReply response;
79+ if (newEvent) {
80+ response.mutable_event ()->CopyFrom (*newEvent);
81+ isStreamOpen = writer->Write (response);
82+ delete newEvent;
83+ }
84+ }
85+
86+ std::cout << " [request StateStream] handler END" << std::endl;
87+ return ::grpc::Status::OK;
88+ }
89+
5490grpc::Status OccServer::StateStream (grpc::ServerContext* context,
5591 const pb::StateStreamRequest* request,
5692 grpc::ServerWriter<pb::StateStreamReply>* writer)
@@ -132,9 +168,9 @@ grpc::Status OccServer::Transition(grpc::ServerContext* context,
132168 }
133169
134170 std::string srcStateStr = request->srcstate ();
135- std::string event = request->event ();
171+ std::string event = request->transitionevent ();
136172 auto arguments = request->arguments ();
137- const std::string finalState = EXPECTED_FINAL_STATE.at (request->event ());
173+ const std::string finalState = EXPECTED_FINAL_STATE.at (request->transitionevent ());
138174
139175 t_State currentState = m_rco->getState ();
140176 std::string currentStateStr = getStringFromState (currentState);
@@ -161,7 +197,7 @@ grpc::Status OccServer::Transition(grpc::ServerContext* context,
161197 std::string newStateStr = getStringFromState (newState);
162198
163199 response->set_state (newStateStr);
164- response->set_event (request->event ());
200+ response->set_transitionevent (request->transitionevent ());
165201 response->set_ok (newStateStr == finalState);
166202 if (newState == error) { // ERROR state
167203 response->set_trigger (pb::DEVICE_ERROR);
@@ -329,6 +365,16 @@ void OccServer::publishState(t_State s)
329365 }
330366}
331367
368+ void OccServer::pushEvent (pb::DeviceEvent* event)
369+ {
370+ for (auto item : m_eventQueues) {
371+ item.second ->push (event);
372+ }
373+ printf (" Object: %s - pushing event = %s\n " ,
374+ m_rco->getName ().c_str (),
375+ pb::DeviceEventType_Name (event->type ()).c_str ());
376+ }
377+
332378bool OccServer::checkMachineDone ()
333379{
334380 std::lock_guard<std::mutex> lock (m_mu);
@@ -350,7 +396,12 @@ void OccServer::runChecker()
350396 // execute periodic actions, as defined for t_State::running
351397 if (currentState == t_State::running) {
352398 int err = m_rco->iterateRunning ();
353- if (err) {
399+ if (err == 1 ) { // signal EndOfData event
400+ auto eodEvent = new pb::DeviceEvent;
401+ eodEvent->set_type (pb::END_OF_DATA);
402+ pushEvent (eodEvent);
403+ }
404+ else if (err) {
354405 updateState (t_State::error);
355406 }
356407 }
@@ -367,4 +418,4 @@ void OccServer::runChecker()
367418 std::this_thread::sleep_for (1ms);
368419 }
369420 }
370- }
421+ }
0 commit comments