From ca7149e9f45f34024b27bae21c0e47e7477f65d4 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Wed, 8 Jan 2025 21:00:13 -0500 Subject: [PATCH] add FSC_REPORT_SEL_MODES; --- src/common/p25/dfsi/frames/FrameDefines.h | 2 ++ src/common/p25/dfsi/frames/Frames.h | 1 + src/common/p25/dfsi/frames/fsc/FSCMessage.cpp | 3 ++ .../modem/port/specialized/V24UDPPort.cpp | 31 +++++++++++++++++++ 4 files changed, 37 insertions(+) diff --git a/src/common/p25/dfsi/frames/FrameDefines.h b/src/common/p25/dfsi/frames/FrameDefines.h index 4798cab8..1277a8fe 100644 --- a/src/common/p25/dfsi/frames/FrameDefines.h +++ b/src/common/p25/dfsi/frames/FrameDefines.h @@ -48,6 +48,8 @@ namespace p25 FSC_HEARTBEAT = 1, //! Heartbeat/Connectivity Maintenance. FSC_ACK = 2, //! Control Service Ack. + FSC_REPORT_SEL_MODES = 8, //! Report Selected Modes + FSC_DISCONNECT = 9, //! Detach Control Service. FSC_INVALID = 127, //! Invalid Control Message. diff --git a/src/common/p25/dfsi/frames/Frames.h b/src/common/p25/dfsi/frames/Frames.h index 3e71e77e..694eeeb5 100644 --- a/src/common/p25/dfsi/frames/Frames.h +++ b/src/common/p25/dfsi/frames/Frames.h @@ -32,6 +32,7 @@ #include "common/p25/dfsi/frames/fsc/FSCMessage.h" #include "common/p25/dfsi/frames/fsc/FSCACK.h" #include "common/p25/dfsi/frames/fsc/FSCConnect.h" +#include "common/p25/dfsi/frames/fsc/FSCReportSelModes.h" #include "common/p25/dfsi/frames/fsc/FSCDisconnect.h" #include "common/p25/dfsi/frames/fsc/FSCHeartbeat.h" diff --git a/src/common/p25/dfsi/frames/fsc/FSCMessage.cpp b/src/common/p25/dfsi/frames/fsc/FSCMessage.cpp index dc3f4f54..efd47a66 100644 --- a/src/common/p25/dfsi/frames/fsc/FSCMessage.cpp +++ b/src/common/p25/dfsi/frames/fsc/FSCMessage.cpp @@ -83,6 +83,9 @@ std::unique_ptr FSCMessage::createMessage(const uint8_t* data) case FSCMessageType::FSC_ACK: message = new FSCACK(); break; + case FSCMessageType::FSC_REPORT_SEL_MODES: + message = new FSCReportSelModes(); + break; case FSCMessageType::FSC_DISCONNECT: message = new FSCDisconnect(); break; diff --git a/src/host/modem/port/specialized/V24UDPPort.cpp b/src/host/modem/port/specialized/V24UDPPort.cpp index 92cc7cec..fe24b974 100644 --- a/src/host/modem/port/specialized/V24UDPPort.cpp +++ b/src/host/modem/port/specialized/V24UDPPort.cpp @@ -492,6 +492,37 @@ void* V24UDPPort::threadedCtrlNetworkRx(void* arg) } break; + case FSCMessageType::FSC_REPORT_SEL_MODES: + { + FSCACK ackResp = FSCACK(); + ackResp.setCorrelationTag(message->getCorrelationTag()); + ackResp.setAckMessageId(FSCMessageType::FSC_REPORT_SEL_MODES); + ackResp.setResponseCode(FSCAckResponseCode::CONTROL_ACK); + ackResp.setAckCorrelationTag(message->getCorrelationTag()); + + // construct connect ACK response data + uint8_t respData[5U]; + ::memset(respData, 0x00U, 5U); + + // bryanb: because DVM is essentially a repeater -- we hardcode these values + respData[0U] = 1U; // Version 1 + respData[1U] = 1U; // Repeat Inbound Audio + respData[2U] = 0U; // Rx Channel Selection + respData[3U] = 0U; // Tx Channel Selection + respData[4U] = 1U; // Monitor Mode + + // pack ack + ackResp.setResponseLength(5U); + ackResp.responseData = respData; + + uint8_t buffer[FSCACK::LENGTH + 5U]; + ::memset(buffer, 0x00U, FSCACK::LENGTH + 5U); + ackResp.encode(buffer); + + network->m_ctrlFrameQueue->write(buffer, FSCACK::LENGTH + 5U, network->m_controlAddr, network->m_ctrlAddrLen); + } + break; + case FSCMessageType::FSC_DISCONNECT: { LogMessage(LOG_MODEM, "V.24 UDP, DFSI FSC Disconnect, vcBasePort = %u", network->m_localPort);