From 0d46a911833fe3c9c230c27621831bb3c711f09e Mon Sep 17 00:00:00 2001 From: Tom Early Date: Mon, 17 Jan 2022 06:27:41 -0700 Subject: [PATCH] ProcessPacket added to DV300{0,3} devices --- DV3000.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ DV3000.h | 1 + DV3003.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ DV3003.h | 1 + DVSIDevice.cpp | 40 ++-------------------------------------- DVSIDevice.h | 3 ++- 6 files changed, 87 insertions(+), 39 deletions(-) diff --git a/DV3000.cpp b/DV3000.cpp index 657c066..9e57375 100644 --- a/DV3000.cpp +++ b/DV3000.cpp @@ -110,3 +110,43 @@ bool CDV3000::SendData(const uint8_t /* channel */, const uint8_t *data) const return false; } + +void CDV3000::ProcessPacket(const SDV_Packet &p) +{ + auto packet = PopWaitingPacket(PKT_CHANNEL0); + if (PKT_CHANNEL == p.header.packet_type) + { + if (11!=ntohs(p.header.payload_length) || PKT_CHAND!=p.field_id || 72!=p.payload.ambe3k.num_bits) + dump("Improper ambe packet:", &p, packet_size(p)); + buffer_depth--; + if (Encoding::dstar == type) + packet->SetDStarData(p.payload.ambe3k.data); + else + packet->SetDMRData(p.payload.ambe3k.data); + + } + else if (PKT_SPEECH == p.header.packet_type) + { + if (322!=ntohs(p.header.payload_length) || PKT_SPEECHD!=p.field_id || 160!=p.payload.audio3k.num_samples) + dump("Improper audio packet:", &p, packet_size(p)); + buffer_depth--; + packet->SetAudioSamples(p.payload.audio3k.samples, true); + } + else + { + dump("ReadDevice() ERROR: Read an unexpected device packet:", &p, packet_size(p)); + return; + } + if (Encoding::dstar == type) // is this a DMR or a DStar device? + { + Controller.dstar_mux.lock(); + Controller.RouteDstPacket(packet); + Controller.dstar_mux.unlock(); + } + else + { + Controller.dmrst_mux.lock(); + Controller.RouteDmrPacket(packet); + Controller.dmrst_mux.unlock(); + } +} diff --git a/DV3000.h b/DV3000.h index b87f268..51ab591 100644 --- a/DV3000.h +++ b/DV3000.h @@ -28,6 +28,7 @@ public: protected: void PushWaitingPacket(unsigned int channel, std::shared_ptr packet); std::shared_ptr PopWaitingPacket(unsigned int channel); + void ProcessPacket(const SDV_Packet &p); bool SendAudio(const uint8_t channel, const int16_t *audio) const; bool SendData(const uint8_t channel, const uint8_t *data) const; diff --git a/DV3003.cpp b/DV3003.cpp index a64716d..7638b2d 100644 --- a/DV3003.cpp +++ b/DV3003.cpp @@ -112,3 +112,44 @@ bool CDV3003::SendData(const uint8_t channel, const uint8_t *data) const return false; } + +void CDV3003::ProcessPacket(const SDV_Packet &p) +{ + unsigned int channel = p.field_id - PKT_CHANNEL0; + auto packet = PopWaitingPacket(channel); + if (PKT_CHANNEL == p.header.packet_type) + { + if (12!=ntohs(p.header.payload_length) || PKT_CHAND!=p.payload.ambe.chand || 72!=p.payload.ambe.num_bits) + dump("Improper ambe packet:", &p, packet_size(p)); + buffer_depth--; + if (Encoding::dstar == type) + packet->SetDStarData(p.payload.ambe.data); + else + packet->SetDMRData(p.payload.ambe.data); + + } + else if (PKT_SPEECH == p.header.packet_type) + { + if (323!=ntohs(p.header.payload_length) || PKT_SPEECHD!=p.payload.audio.speechd || 160!=p.payload.audio.num_samples) + dump("Improper audio packet:", &p, packet_size(p)); + buffer_depth--; + packet->SetAudioSamples(p.payload.audio.samples, true); + } + else + { + dump("ReadDevice() ERROR: Read an unexpected device packet:", &p, packet_size(p)); + return; + } + if (Encoding::dstar == type) // is this a DMR or a DStar device? + { + Controller.dstar_mux.lock(); + Controller.RouteDstPacket(packet); + Controller.dstar_mux.unlock(); + } + else + { + Controller.dmrst_mux.lock(); + Controller.RouteDmrPacket(packet); + Controller.dmrst_mux.unlock(); + } +} diff --git a/DV3003.h b/DV3003.h index f1794bb..d19bb37 100644 --- a/DV3003.h +++ b/DV3003.h @@ -28,6 +28,7 @@ public: protected: void PushWaitingPacket(unsigned int channel, std::shared_ptr packet); std::shared_ptr PopWaitingPacket(unsigned int channel); + void ProcessPacket(const SDV_Packet &p); bool SendAudio(const uint8_t channel, const int16_t *audio) const; bool SendData(const uint8_t channel, const uint8_t *data) const; diff --git a/DVSIDevice.cpp b/DVSIDevice.cpp index 11da48f..b8ac791 100644 --- a/DVSIDevice.cpp +++ b/DVSIDevice.cpp @@ -513,7 +513,7 @@ void CDVDevice::AddPacket(const std::shared_ptr packet) input_queue.push(packet); } -void CDVDevice::dump(const char *title, void *pointer, int length) const +void CDVDevice::dump(const char *title, const void *pointer, int length) const { const uint8_t *data = (const uint8_t *)pointer; @@ -628,43 +628,7 @@ void CDVDevice::ReadDevice() SDV_Packet p; if (! GetResponse(p)) { - unsigned int channel = p.field_id - PKT_CHANNEL0; - auto packet = PopWaitingPacket(channel); - if (PKT_CHANNEL == p.header.packet_type) - { - if (12!=ntohs(p.header.payload_length) || PKT_CHAND!=p.payload.ambe.chand || 72!=p.payload.ambe.num_bits) - dump("Improper ambe packet:", &p, packet_size(p)); - buffer_depth--; - if (Encoding::dstar == type) - packet->SetDStarData(p.payload.ambe.data); - else - packet->SetDMRData(p.payload.ambe.data); - - } - else if (PKT_SPEECH == p.header.packet_type) - { - if (323!=ntohs(p.header.payload_length) || PKT_SPEECHD!=p.payload.audio.speechd || 160!=p.payload.audio.num_samples) - dump("Improper audio packet:", &p, packet_size(p)); - buffer_depth--; - packet->SetAudioSamples(p.payload.audio.samples, true); - } - else - { - dump("ReadDevice() ERROR: Read an unexpected device packet:", &p, packet_size(p)); - continue; - } - if (Encoding::dstar == type) // is this a DMR or a DStar device? - { - Controller.dstar_mux.lock(); - Controller.RouteDstPacket(packet); - Controller.dstar_mux.unlock(); - } - else - { - Controller.dmrst_mux.lock(); - Controller.RouteDmrPacket(packet); - Controller.dmrst_mux.unlock(); - } + ProcessPacket(p); } } } diff --git a/DVSIDevice.h b/DVSIDevice.h index b701698..4232fe0 100644 --- a/DVSIDevice.h +++ b/DVSIDevice.h @@ -54,11 +54,12 @@ protected: void FeedDevice(); void ReadDevice(); void FTDI_Error(const char *where, FT_STATUS status) const; - void dump(const char *title, void *data, int length) const; + void dump(const char *title, const void *data, int length) const; // pure virtual methods unique to the device type virtual void PushWaitingPacket(unsigned int channel, std::shared_ptr packet) = 0; virtual std::shared_ptr PopWaitingPacket(unsigned int channel) = 0; + virtual void ProcessPacket(const SDV_Packet &p) = 0; virtual bool SendAudio(const uint8_t channel, const int16_t *audio) const = 0; virtual bool SendData(const uint8_t channel, const uint8_t *data) const = 0; };