Start work on the outgoing network data.

This commit is contained in:
Jonathan Naylor
2016-09-20 07:53:16 +01:00
parent 34bf8f18a7
commit e9b330f01e
3 changed files with 125 additions and 74 deletions

View File

@@ -423,9 +423,6 @@ void CP25Control::writeNetwork(const unsigned char *data, unsigned char type)
switch (type) switch (type)
{ {
case P25_DUID_HEADER:
m_network->writeHeader(data);
break;
case P25_DUID_LDU1: case P25_DUID_LDU1:
m_network->writeLDU1(data); m_network->writeLDU1(data);
break; break;
@@ -437,7 +434,6 @@ void CP25Control::writeNetwork(const unsigned char *data, unsigned char type)
m_network->writeTerminator(data); m_network->writeTerminator(data);
break; break;
default: default:
m_network->writeEnd();
break; break;
} }
} }

View File

@@ -34,8 +34,7 @@ m_address(),
m_port(gatewayPort), m_port(gatewayPort),
m_debug(debug), m_debug(debug),
m_enabled(false), m_enabled(false),
m_buffer(1000U, "P25 Network"), m_buffer(1000U, "P25 Network")
m_pollTimer(1000U, 60U)
{ {
m_address = CUDPSocket::lookup(gatewayAddress); m_address = CUDPSocket::lookup(gatewayAddress);
@@ -54,98 +53,169 @@ bool CP25Network::open()
if (m_address.s_addr == INADDR_NONE) if (m_address.s_addr == INADDR_NONE)
return false; return false;
m_pollTimer.start();
return m_socket.open(); return m_socket.open();
} }
bool CP25Network::writeStart() bool CP25Network::writeHeader(unsigned int tgid)
{ {
return true; unsigned char buffer[30U];
}
// The '00' record
::memset(buffer, 0x00U, 10U);
buffer[0U] = 0x00U;
buffer[1U] = 0x02U;
buffer[2U] = 0x02U; // RT mode enabled
buffer[3U] = 0x0CU; // Start
buffer[4U] = 0x0BU; // Voice
bool CP25Network::writeHeader(const unsigned char* header)
{
assert(header != NULL);
#ifdef notdef
if (m_debug) if (m_debug)
CUtils::dump(1U, "P25 Network Header Sent", buffer, 49U); CUtils::dump(1U, "P25 Network ICW Sent", buffer, 10U);
for (unsigned int i = 0U; i < 2U; i++) { #ifdef notdef
bool ret = m_socket.write(buffer, 49U, m_address, m_port); bool ret = m_socket.write(buffer, 10U, m_address, m_port);
if (!ret) if (!ret)
return false; return false;
}
#endif #endif
// The '60' record
::memset(buffer, 0x00U, 30U);
buffer[0U] = 0x60U;
buffer[1U] = 0x02U;
buffer[2U] = 0x02U; // RT mode enabled
buffer[3U] = 0x0CU; // Start
buffer[4U] = 0x0BU; // Voice
buffer[5U] = 0x1BU; // Quantar
buffer[6U] = 0x00U; // LDU1 RSSI
buffer[7U] = 0x00U; // 1A Flag, no RSSI or MM
buffer[8U] = 0x00U; // LDU1 RSSI
buffer[23U] = 0x08U;
buffer[28U] = 0x02U;
buffer[29U] = 0x36U;
if (m_debug)
CUtils::dump(1U, "P25 Network VHDR1 Sent", buffer, 30U);
#ifdef notdef
bool ret = m_socket.write(buffer, 30U, m_address, m_port);
if (!ret)
return false;
#endif
// The '61' record
::memset(buffer, 0x00U, 22U);
buffer[0U] = 0x61U;
buffer[1U] = (tgid << 8) & 0xFFU;
buffer[2U] = (tgid << 0) & 0xFFU;
buffer[21U] = 0x02U;
if (m_debug)
CUtils::dump(1U, "P25 Network VHDR2 Sent", buffer, 22U);
#ifdef notdef
bool ret = m_socket.write(buffer, 22U, m_address, m_port);
if (!ret)
return false;
#endif
return true; return true;
} }
bool CP25Network::writeLDU1(const unsigned char* ldu1) bool CP25Network::writeLDU1(const unsigned char* ldu1)
{ {
assert(ldu1 != NULL); assert(ldu1 != NULL);
#ifdef notdef
unsigned char buffer[30U]; unsigned char buffer[22U];
// The '62' record
::memset(buffer, 0x00U, 10U);
buffer[0U] = 0x62U;
buffer[1U] = 0x02U;
buffer[2U] = 0x02U; // RT mode enabled
buffer[3U] = 0x0CU; // Start
buffer[4U] = 0x0BU; // Voice
buffer[5U] = 0x1BU; // Quantar
buffer[6U] = 0x00U; // LDU1 RSSI
buffer[7U] = 0x00U; // 1A Flag, no RSSI or MM
buffer[8U] = 0x00U; // LDU1 RSSI
buffer[9U] = 0x00U; // Adj MM
buffer[21U] = 0x02U;
if (m_debug) if (m_debug)
CUtils::dump(1U, "P25 Network Data Sent", buffer, length + 9U); CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 22U);
return m_socket.write(buffer, length + 9U, m_address, m_port); #ifdef notdef
bool ret = m_socket.write(buffer, 22U, m_address, m_port);
if (!ret)
return false;
#endif #endif
return true; return true;
} }
bool CP25Network::writeLDU2(const unsigned char* ldu2) bool CP25Network::writeLDU2(const unsigned char* ldu2)
{ {
assert(ldu2 != NULL); assert(ldu2 != NULL);
#ifdef notdef
unsigned char buffer[30U]; unsigned char buffer[22U];
// The '6B' record
::memset(buffer, 0x00U, 10U);
buffer[0U] = 0x6BU;
buffer[1U] = 0x02U;
buffer[2U] = 0x02U; // RT mode enabled
buffer[3U] = 0x0CU; // Start
buffer[4U] = 0x0BU; // Voice
buffer[5U] = 0x1BU; // Quantar
buffer[6U] = 0x00U; // LDU1 RSSI
buffer[7U] = 0x00U; // 1A Flag, no RSSI or MM
buffer[8U] = 0x00U; // LDU1 RSSI
buffer[9U] = 0x00U; // Adj MM
buffer[21U] = 0x02U;
if (m_debug) if (m_debug)
CUtils::dump(1U, "P25 Network Data Sent", buffer, length + 9U); CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 22U);
return m_socket.write(buffer, length + 9U, m_address, m_port); #ifdef notdef
bool ret = m_socket.write(buffer, 22U, m_address, m_port);
if (!ret)
return false;
#endif #endif
return true; return true;
} }
bool CP25Network::writeTerminator(const unsigned char* term) bool CP25Network::writeTerminator(const unsigned char* term)
{ {
assert(term != NULL); assert(term != NULL);
#ifdef notdef
unsigned char buffer[30U]; unsigned char buffer[30U];
// The '00' record
::memset(buffer, 0x00U, 10U);
buffer[0U] = 0x00U;
buffer[1U] = 0x02U;
buffer[2U] = 0x02U; // RT mode enabled
buffer[3U] = 0x25U; // End
buffer[4U] = 0x0BU; // Voice
if (m_debug) if (m_debug)
CUtils::dump(1U, "P25 Network Data Sent", buffer, length + 9U); CUtils::dump(1U, "P25 Network ICW Sent", buffer, 10U);
return m_socket.write(buffer, length + 9U, m_address, m_port);
#endif
return true;
}
bool CP25Network::writeEnd()
{
return true;
}
bool CP25Network::writePoll()
{
#ifdef notdef #ifdef notdef
// if (m_debug) bool ret = m_socket.write(buffer, 10U, m_address, m_port);
// CUtils::dump(1U, "P25 Network Poll Sent", buffer, 6U + length); if (!ret)
return false;
return m_socket.write(buffer, 6U + length, m_address, m_port); ret = m_socket.write(buffer, 10U, m_address, m_port);
if (!ret)
return false;
#endif #endif
return true; return true;
} }
void CP25Network::clock(unsigned int ms) void CP25Network::clock(unsigned int ms)
{ {
m_pollTimer.clock(ms);
if (m_pollTimer.hasExpired()) {
writePoll();
m_pollTimer.start();
}
unsigned char buffer[BUFFER_LENGTH]; unsigned char buffer[BUFFER_LENGTH];
in_addr address; in_addr address;
@@ -163,9 +233,10 @@ void CP25Network::clock(unsigned int ms)
if (!m_enabled) if (!m_enabled)
return; return;
// Invalid packet type? unsigned char c = length;
if (::memcmp(buffer, "DSRP", 4U) != 0) m_buffer.addData(&c, 1U);
return;
m_buffer.addData(buffer, length);
} }
unsigned int CP25Network::read(unsigned char* data, unsigned int length) unsigned int CP25Network::read(unsigned char* data, unsigned int length)
@@ -178,22 +249,11 @@ unsigned int CP25Network::read(unsigned char* data, unsigned int length)
unsigned char c = 0U; unsigned char c = 0U;
m_buffer.getData(&c, 1U); m_buffer.getData(&c, 1U);
assert(c <= 100U);
assert(c <= length); assert(c <= length);
unsigned char buffer[100U]; m_buffer.getData(data, c);
m_buffer.getData(buffer, c);
switch (buffer[0U]) { return c;
case TAG_HEADER:
case TAG_DATA:
case TAG_EOT:
::memcpy(data, buffer, c);
return c;
default:
return 0U;
}
} }
void CP25Network::reset() void CP25Network::reset()

View File

@@ -21,7 +21,6 @@
#include "RingBuffer.h" #include "RingBuffer.h"
#include "UDPSocket.h" #include "UDPSocket.h"
#include "Timer.h"
#include <cstdint> #include <cstdint>
#include <string> #include <string>
@@ -35,12 +34,9 @@ public:
void enable(bool enabled); void enable(bool enabled);
bool writeStart();
bool writeHeader(const unsigned char* header);
bool writeLDU1(const unsigned char* ldu1); bool writeLDU1(const unsigned char* ldu1);
bool writeLDU2(const unsigned char* ldu2); bool writeLDU2(const unsigned char* ldu2);
bool writeTerminator(const unsigned char* term); bool writeTerminator(const unsigned char* term);
bool writeEnd();
unsigned int read(unsigned char* data, unsigned int length); unsigned int read(unsigned char* data, unsigned int length);
@@ -57,9 +53,8 @@ private:
bool m_debug; bool m_debug;
bool m_enabled; bool m_enabled;
CRingBuffer<unsigned char> m_buffer; CRingBuffer<unsigned char> m_buffer;
CTimer m_pollTimer;
bool writePoll(); bool writeHeader(unsigned int tgid);
}; };
#endif #endif