@@ -64,6 +64,7 @@ static void App_cmdChannelCallback(const uint8_t* payload, const uint8_t payload
6464static void App_motorSpeedSetpointsChannelCallback (const uint8_t * payload, const uint8_t payloadSize, void * userData);
6565static void App_statusChannelCallback (const uint8_t * payload, const uint8_t payloadSize, void * userData);
6666static void App_robotSpeedSetpointChannelCallback (const uint8_t * payload, const uint8_t payloadSize, void * userData);
67+ static void App_timeSyncReqChannelCallback (const uint8_t * payload, const uint8_t payloadSize, void * userData);
6768
6869/* *****************************************************************************
6970 * Local Variables
@@ -78,6 +79,7 @@ App::App() :
7879 m_serialMuxProtChannelIdCurrentVehicleData(0U ),
7980 m_serialMuxProtChannelIdStatus(0U ),
8081 m_serialMuxProtChannelIdLineSensors(0U ),
82+ m_serialMuxProtChannelIdTimeSyncRsp(0U ),
8183 m_systemStateMachine(),
8284 m_controlInterval(),
8385 m_reportTimer(),
@@ -340,6 +342,9 @@ void App::reportVehicleData()
340342 averageCounts = m_movAvgProximitySensor.write (maxCounts);
341343
342344 odometry.getPosition (xPos, yPos);
345+
346+ payload.timestamp = static_cast <int64_t >(millis ());
347+
343348 payload.xPos = xPos;
344349 payload.yPos = yPos;
345350 payload.orientation = odometry.getOrientation ();
@@ -361,6 +366,7 @@ bool App::setupSerialMuxProt()
361366 m_smpServer.subscribeToChannel (MOTOR_SPEED_SETPOINT_CHANNEL_NAME, App_motorSpeedSetpointsChannelCallback);
362367 m_smpServer.subscribeToChannel (STATUS_CHANNEL_NAME, App_statusChannelCallback);
363368 m_smpServer.subscribeToChannel (ROBOT_SPEED_SETPOINT_CHANNEL_NAME, App_robotSpeedSetpointChannelCallback);
369+ m_smpServer.subscribeToChannel (TIME_SYNC_REQUEST_CHANNEL_NAME, App_timeSyncReqChannelCallback);
364370
365371 /* Channel creation. */
366372 m_serialMuxProtChannelIdRemoteCtrlRsp =
@@ -369,10 +375,13 @@ bool App::setupSerialMuxProt()
369375 m_smpServer.createChannel (CURRENT_VEHICLE_DATA_CHANNEL_NAME, CURRENT_VEHICLE_DATA_CHANNEL_DLC);
370376 m_serialMuxProtChannelIdStatus = m_smpServer.createChannel (STATUS_CHANNEL_NAME, STATUS_CHANNEL_DLC);
371377 m_serialMuxProtChannelIdLineSensors = m_smpServer.createChannel (LINE_SENSOR_CHANNEL_NAME, LINE_SENSOR_CHANNEL_DLC);
378+ m_serialMuxProtChannelIdTimeSyncRsp =
379+ m_smpServer.createChannel (TIME_SYNC_RESPONSE_CHANNEL_NAME, TIME_SYNC_RESPONSE_CHANNEL_DLC);
372380
373381 /* Channels succesfully created? */
374382 if ((0U != m_serialMuxProtChannelIdCurrentVehicleData) && (0U != m_serialMuxProtChannelIdRemoteCtrlRsp) &&
375- (0U != m_serialMuxProtChannelIdStatus) && (0U != m_serialMuxProtChannelIdLineSensors))
383+ (0U != m_serialMuxProtChannelIdStatus) && (0U != m_serialMuxProtChannelIdLineSensors) &&
384+ (0U != m_serialMuxProtChannelIdTimeSyncRsp))
376385 {
377386 isSuccessful = true ;
378387 }
@@ -483,4 +492,42 @@ void App_robotSpeedSetpointChannelCallback(const uint8_t* payload, const uint8_t
483492 /* Set the robot speeds. */
484493 DrivingState::getInstance ().setRobotSpeeds (centerSpeed, angularSpeed);
485494 }
495+ }
496+
497+ /* *
498+ * Receives time sync requests and responds with timestamps.
499+ *
500+ * @param[in] payload TimeSyncRequest structure.
501+ * @param[in] payloadSize Size of TimeSyncRequest structure.
502+ * @param[in] userData Instance of App class.
503+ */
504+ void App_timeSyncReqChannelCallback (const uint8_t * payload,
505+ uint8_t payloadSize,
506+ void * userData)
507+ {
508+ const uint32_t t2 = millis ();
509+ if ((payload == nullptr ) ||
510+ (userData == nullptr ) ||
511+ (payloadSize != TIME_SYNC_REQUEST_CHANNEL_DLC))
512+ {
513+ return ;
514+ }
515+
516+ App* app = static_cast <App*>(userData);
517+
518+ TimeSyncRequest req;
519+ memcpy (&req, payload, sizeof (req));
520+
521+ app->handleTimeSyncRequest (req, t2);
522+ }
523+
524+ void App::handleTimeSyncRequest (const TimeSyncRequest& req, const uint32_t t2)
525+ {
526+ TimeSyncResponse rsp{req.seq , req.t1_ms , t2, millis ()};
527+
528+ if (m_serialMuxProtChannelIdTimeSyncRsp == 0U )
529+ {
530+ return ;
531+ }
532+ (void )m_smpServer.sendData (m_serialMuxProtChannelIdTimeSyncRsp, &rsp, sizeof (rsp));
486533}
0 commit comments