diff --git a/sw/src/userspace/remotectl.cpp b/sw/src/userspace/remotectl.cpp index 091d919..a5978ea 100644 --- a/sw/src/userspace/remotectl.cpp +++ b/sw/src/userspace/remotectl.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -776,6 +777,38 @@ private: return std::to_string(timestamp); } + /** Handle command REALTIME? */ + std::string qry_realtime(CommandEnvironment env) + { + struct timespec tp1, tp2, tp3; + uint64_t ts1, ts2, ts3, ts4; + + // Read approximately simultaneous real time and timestamp. + ts1 = m_device.get_timestamp(); + clock_gettime(CLOCK_REALTIME, &tp1); + ts2 = m_device.get_timestamp(); + clock_gettime(CLOCK_REALTIME, &tp2); + ts3 = m_device.get_timestamp(); + clock_gettime(CLOCK_REALTIME, &tp3); + ts4 = m_device.get_timestamp(); + + // Choose shortest interval out of three. + const uint64_t timestamp_mask = 0xffffffffffff; + uint64_t d1 = (ts2 - ts1) & timestamp_mask; + uint64_t d2 = (ts3 - ts2) & timestamp_mask; + uint64_t d3 = (ts4 - ts3) & timestamp_mask; + if (d3 < d1 && d3 < d2) { + ts1 = ts3; + tp1 = tp3; + } else if (d2 < d1) { + ts1 = ts2; + tp1 = tp2; + } + + return str_format("%lld.%09ld %llu", + (long long)tp1.tv_sec, (long)tp1.tv_nsec, ts1); + } + /** Handle command AIN:CHANNELS:COUNT? */ std::string qry_channels_count(CommandEnvironment env) { @@ -1424,6 +1457,7 @@ private: command_table_no_args = { { "*idn?", &CommandHandler::qry_idn }, { "timestamp?", &CommandHandler::qry_timestamp }, + { "realtime?", &CommandHandler::qry_realtime }, { "ain:channels:count?", &CommandHandler::qry_channels_count }, { "ain:channels:active?", &CommandHandler::qry_channels_active }, { "ain:chN:range?", &CommandHandler::qry_channel_range },