From 34d17d961a1e8a3452fec3bedccd04e7f87f90dd Mon Sep 17 00:00:00 2001 From: W3AXL <29879554+W3AXL@users.noreply.github.com> Date: Wed, 17 Jul 2024 12:32:16 -0400 Subject: [PATCH] added DVMV24 board info reporting --- src/common/Log.h | 1 + src/dfsi/Dfsi.cpp | 8 ++++ src/dfsi/network/SerialService.cpp | 76 +++++++++++++++++++++++------- src/dfsi/network/SerialService.h | 10 ++++ 4 files changed, 79 insertions(+), 16 deletions(-) diff --git a/src/common/Log.h b/src/common/Log.h index 3891f93e..62c7a7bc 100644 --- a/src/common/Log.h +++ b/src/common/Log.h @@ -47,6 +47,7 @@ #define LOG_CAL "CAL" #define LOG_SETUP "SETUP" #define LOG_SERIAL "SERIAL" +#define LOG_DVMV24 "DVMV24" /** @endcond */ diff --git a/src/dfsi/Dfsi.cpp b/src/dfsi/Dfsi.cpp index 3e9ec74c..f52a44a3 100644 --- a/src/dfsi/Dfsi.cpp +++ b/src/dfsi/Dfsi.cpp @@ -203,6 +203,14 @@ int Dfsi::run() ::uname(&utsinfo); ::LogInfoEx(LOG_HOST, "[ OK ] DFSI is up and running on %s %s %s", utsinfo.sysname, utsinfo.release, utsinfo.machine); + + // Get serial board info if connected + if (m_serial) + { + m_serial->getBoardInfo(); + } + + // main execution loop while (!g_killed) { uint32_t ms = stopWatch.elapsed(); diff --git a/src/dfsi/network/SerialService.cpp b/src/dfsi/network/SerialService.cpp index 1d888ff7..60e45dac 100644 --- a/src/dfsi/network/SerialService.cpp +++ b/src/dfsi/network/SerialService.cpp @@ -169,6 +169,24 @@ void SerialService::clock(uint32_t ms) } break; + // Get version string + case CMD_GET_VERSION: + { + // Print proto info + LogMessage(LOG_DVMV24, "V24 board protocol: %02X, CPU: %02X", m_msgBuffer[3U], m_msgBuffer[4U]); + // Print CPU info + switch (m_msgBuffer[4U]) + { + case 2U: + LogMessage(LOG_DVMV24, "ST-Micro ARM, UDID: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", m_msgBuffer[5U], m_msgBuffer[6U], m_msgBuffer[7U], m_msgBuffer[8U], m_msgBuffer[9U], m_msgBuffer[10U], m_msgBuffer[11U], m_msgBuffer[12U], m_msgBuffer[13U], m_msgBuffer[14U], m_msgBuffer[15U], m_msgBuffer[16U]); + break; + default: + LogWarning(LOG_DVMV24, "Unknown CPU type!"); + break; + } + } + break; + // Handle debug messages case CMD_DEBUG1: case CMD_DEBUG2: @@ -177,7 +195,7 @@ void SerialService::clock(uint32_t ms) case CMD_DEBUG5: case CMD_DEBUG_DUMP: printDebug(m_msgBuffer, m_msgLength); - break; + break; // Fallback if we get a message we have no clue how to handle default: @@ -197,7 +215,11 @@ void SerialService::clock(uint32_t ms) // Clear a call in progress flag if we're longer than our timeout value if (m_lclCallInProgress && (now - m_lastLclFrame > m_callTimeout)) { + // Clear the flag m_lclCallInProgress = false; + // Reset the call data + rxResetCallData(); + // Debug print if (m_debug) LogDebug(LOG_SERIAL, "Local call activity timeout"); } @@ -607,9 +629,7 @@ void SerialService::processP25ToNet() // Flag we have a local call (i.e. from V24) in progress m_lclCallInProgress = true; // Reset the call data - m_rxVoiceCallData->resetCallData(); - m_rxLastLDU1->setSrcId(0U); - m_rxLastLDU1->setDstId(0U); + rxResetCallData(); // Generate a new random stream ID m_rxVoiceCallData->newStreamId(); // Log @@ -623,9 +643,7 @@ void SerialService::processP25ToNet() // Send the TDU (using call data which we hope has been filled earlier) m_network->writeP25TDU(*m_rxVoiceControl, *m_rxVoiceLsd); // Reset - m_rxVoiceCallData->resetCallData(); - m_rxLastLDU1->setSrcId(0U); - m_rxLastLDU1->setDstId(0U); + rxResetCallData(); } } } @@ -688,9 +706,7 @@ void SerialService::processP25ToNet() // Flag we have a local call (i.e. from V24) in progress m_lclCallInProgress = true; // Reset the call data - m_rxVoiceCallData->resetCallData(); - m_rxLastLDU1->setSrcId(0U); - m_rxLastLDU1->setDstId(0U); + rxResetCallData(); // Generate a new random stream ID m_rxVoiceCallData->newStreamId(); // Log @@ -1940,6 +1956,34 @@ void SerialService::insertMissingAudio(uint8_t *data, uint32_t& lost) } } +/* Resets the V24 RX call data objects */ + +void SerialService::rxResetCallData() +{ + // Reset the RX call data object + m_rxVoiceCallData->resetCallData(); + // Reset our LDU TGID info + m_rxLastLDU1->setSrcId(0U); + m_rxLastLDU1->setDstId(0U); +} + +/* */ + +void SerialService::getBoardInfo() +{ + uint8_t buffer[3U]; + buffer[0U] = DVM_SHORT_FRAME_START; + buffer[1U] = 3U; + buffer[2U] = CMD_GET_VERSION; + + int ret = m_port->write(buffer, 3U); + + if (ret != 3U) + { + LogError(LOG_SERIAL, "Failed to send version query command to V24 board"); + } +} + /* */ void SerialService::printDebug(const uint8_t* buffer, uint16_t len) @@ -1961,34 +2005,34 @@ void SerialService::printDebug(const uint8_t* buffer, uint16_t len) // Handle the individual debug types if (buffer[2U] == CMD_DEBUG1) { - LogDebug(LOG_SERIAL, "V24 USB: %.*s", len - 3U, buffer + 3U); + LogDebug(LOG_DVMV24, "%.*s", len - 3U, buffer + 3U); } else if (buffer[2U] == CMD_DEBUG2) { short val1 = (buffer[len - 2U] << 8) | buffer[len - 1U]; - LogDebug(LOG_SERIAL, "V24 USB: %.*s %X", len - 5U, buffer + 3U, val1); + LogDebug(LOG_DVMV24, "%.*s %X", len - 5U, buffer + 3U, val1); } else if (buffer[2U] == CMD_DEBUG3) { short val1 = (buffer[len - 4U] << 8) | buffer[len - 3U]; short val2 = (buffer[len - 2U] << 8) | buffer[len - 1U]; - LogDebug(LOG_SERIAL, "V24 USB: %.*s %X %X", len - 7U, buffer + 3U, val1, val2); + LogDebug(LOG_DVMV24, "%.*s %X %X", len - 7U, buffer + 3U, val1, val2); } else if (buffer[2U] == CMD_DEBUG4) { short val1 = (buffer[len - 6U] << 8) | buffer[len - 5U]; short val2 = (buffer[len - 4U] << 8) | buffer[len - 3U]; short val3 = (buffer[len - 2U] << 8) | buffer[len - 1U]; - LogDebug(LOG_SERIAL, "V24 USB: %.*s %X %X %X", len - 9U, buffer + 3U, val1, val2, val3); + LogDebug(LOG_DVMV24, "%.*s %X %X %X", len - 9U, buffer + 3U, val1, val2, val3); } else if (buffer[2U] == CMD_DEBUG5) { short val1 = (buffer[len - 8U] << 8) | buffer[len - 7U]; short val2 = (buffer[len - 6U] << 8) | buffer[len - 5U]; short val3 = (buffer[len - 4U] << 8) | buffer[len - 3U]; short val4 = (buffer[len - 2U] << 8) | buffer[len - 1U]; - LogDebug(LOG_SERIAL, "V24 USB: %.*s %X %X %X %X", len - 11U, buffer + 3U, val1, val2, val3, val4); + LogDebug(LOG_DVMV24, "%.*s %X %X %X %X", len - 11U, buffer + 3U, val1, val2, val3, val4); } else if (buffer[2U] == CMD_DEBUG_DUMP) { uint8_t data[255U]; ::memset(data, 0x00U, 255U); ::memcpy(data, buffer, len); - Utils::dump(1U, "V24 USB Debug Dump", data, len); + Utils::dump(1U, "DVMV24 Debug Dump", data, len); } } \ No newline at end of file diff --git a/src/dfsi/network/SerialService.h b/src/dfsi/network/SerialService.h index 7e8d3c95..f5163d3e 100644 --- a/src/dfsi/network/SerialService.h +++ b/src/dfsi/network/SerialService.h @@ -124,6 +124,11 @@ namespace network */ void processP25ToNet(); + /** + * @brief Send the CMD_GET_VERSION to the connected V24 board to get firmware/UDID info + */ + void getBoardInfo(); + private: std::string m_portName; uint32_t m_baudrate; @@ -242,6 +247,11 @@ namespace network */ void insertMissingAudio(uint8_t* data, uint32_t& lost); + /** + * @brief Resets the current rx call data (stream ID, TGIDs, etc) + */ + void rxResetCallData(); + /** * @brief * @param buffer