ProcessPacket added to DV300{0,3} devices

main
Tom Early 4 years ago
parent 7876f34013
commit 0d46a91183

@ -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();
}
}

@ -28,6 +28,7 @@ public:
protected:
void PushWaitingPacket(unsigned int channel, std::shared_ptr<CTranscoderPacket> packet);
std::shared_ptr<CTranscoderPacket> 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;

@ -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();
}
}

@ -28,6 +28,7 @@ public:
protected:
void PushWaitingPacket(unsigned int channel, std::shared_ptr<CTranscoderPacket> packet);
std::shared_ptr<CTranscoderPacket> 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;

@ -513,7 +513,7 @@ void CDVDevice::AddPacket(const std::shared_ptr<CTranscoderPacket> 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);
}
}
}

@ -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<CTranscoderPacket> packet) = 0;
virtual std::shared_ptr<CTranscoderPacket> 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;
};

Loading…
Cancel
Save

Powered by TurnKey Linux.