@@ -27,6 +27,8 @@ struct Transition
2727 uint16_t node_uid;
2828 // enough bits to contain NodeStatus
2929 uint8_t status;
30+
31+ uint8_t padding[5 ];
3032};
3133
3234std::array<char ,16 > CreateRandomUUID ()
@@ -94,6 +96,7 @@ struct Groot2Publisher::PImpl
9496
9597 std::atomic_bool recording = false ;
9698 std::deque<Transition> transitions_buffer;
99+ std::chrono::microseconds recording_fist_time;
97100
98101 std::thread heartbeat_thread;
99102
@@ -206,13 +209,15 @@ void Groot2Publisher::callback(Duration ts, const TreeNode& node,
206209 status = 10 + static_cast <char >(prev_status);
207210 }
208211 *(_p->status_buffermap .at (node.UID ())) = status;
212+
209213 if (_p->recording )
210214 {
211215 Transition trans;
212216 trans.node_uid = node.UID ();
213217 trans.status = static_cast <uint8_t >(new_status);
218+ auto timestamp = ts -_p->recording_fist_time ;
214219 trans.timestamp_usec =
215- std::chrono::duration_cast<std::chrono::microseconds>(ts ).count ();
220+ std::chrono::duration_cast<std::chrono::microseconds>(timestamp ).count ();
216221 _p->transitions_buffer .push_back (trans);
217222 while (_p->transitions_buffer .size () > 1000 ) {
218223 _p->transitions_buffer .pop_front ();
@@ -417,9 +422,16 @@ void Groot2Publisher::serverLoop()
417422 }
418423
419424 auto const cmd = (requestMsg[1 ].to_string ());
425+ std::cout << cmd << std::endl;
426+
420427 if (cmd == " start" )
421428 {
422429 _p->recording = true ;
430+ auto now = std::chrono::system_clock::now ();
431+
432+ _p->recording_fist_time = std::chrono::duration_cast<std::chrono::microseconds>
433+ (now.time_since_epoch ());
434+
423435 std::unique_lock<std::mutex> lk (_p->status_mutex );
424436 _p->transitions_buffer .clear ();
425437 }
@@ -432,17 +444,23 @@ void Groot2Publisher::serverLoop()
432444 case Monitor::RequestType::GET_TRANSITIONS:
433445 {
434446 thread_local std::string trans_buffer;
435- const size_t N = sizeof (Transition);
436- trans_buffer.resize (N * _p->transitions_buffer .size ());
447+ trans_buffer.resize (9 * _p->transitions_buffer .size ());
437448
438449 std::unique_lock<std::mutex> lk (_p->status_mutex );
439450 size_t offset = 0 ;
440451 for (const auto & trans: _p->transitions_buffer )
441452 {
442- std::memcpy (&trans_buffer[offset], &trans, N);
443- offset += N;
453+ std::memcpy (&trans_buffer[offset], &trans.timestamp_usec , 6 );
454+ offset += 6 ;
455+ std::memcpy (&trans_buffer[offset], &trans.node_uid , 2 );
456+ offset += 2 ;
457+ std::memcpy (&trans_buffer[offset], &trans.status , 1 );
458+ offset += 1 ;
444459 }
460+ std::cout << " GET_TRANSITIONS " << _p->transitions_buffer .size () << " \n " ;
445461 _p->transitions_buffer .clear ();
462+ trans_buffer.resize (offset);
463+ reply_msg.addstr (trans_buffer);
446464 } break ;
447465
448466 default : {
0 commit comments