Fix commit with bad line endings.

This commit is contained in:
Bryan Biedenkapp
2018-05-14 10:25:19 -04:00
parent 0395955ab3
commit 471e084723
5 changed files with 1906 additions and 1897 deletions

View File

@@ -1,6 +1,6 @@
/* /*
* Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX * Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX
* Copyright (C) 2018 by Bryan Biedenkapp <gatekeep@gmail.com> * Copyright (C) 2018 by Bryan Biedenkapp <gatekeep@gmail.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -350,86 +350,86 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
return true; return true;
} }
else if (duid == P25_DUID_TSDU) { else if (duid == P25_DUID_TSDU) {
if (m_rfState != RS_RF_DATA) { if (m_rfState != RS_RF_DATA) {
m_rfPDUCount = 0U; m_rfPDUCount = 0U;
m_rfPDUBits = 0U; m_rfPDUBits = 0U;
m_rfState = RS_RF_DATA; m_rfState = RS_RF_DATA;
m_rfDataFrames = 0U; m_rfDataFrames = 0U;
} }
bool ret = m_rfData.decodeTSDU(data + 2U); bool ret = m_rfData.decodeTSDU(data + 2U);
if (!ret) { if (!ret) {
m_lastDUID = duid; m_lastDUID = duid;
return false; return false;
} }
unsigned int srcId = m_rfData.getSrcId(); unsigned int srcId = m_rfData.getSrcId();
unsigned int dstId = m_rfData.getDstId(); unsigned int dstId = m_rfData.getDstId();
unsigned char data[P25_TSDU_FRAME_LENGTH_BYTES + 2U]; unsigned char data[P25_TSDU_FRAME_LENGTH_BYTES + 2U];
switch (m_rfData.getLCF()) { switch (m_rfData.getLCF()) {
case P25_LCF_TSBK_CALL_ALERT: case P25_LCF_TSBK_CALL_ALERT:
LogMessage("P25, received RF TSDU transmission, CALL ALERT from %u to %u", srcId, dstId); LogMessage("P25, received RF TSDU transmission, CALL ALERT from %u to %u", srcId, dstId);
::memset(data + 2U, 0x00U, P25_TSDU_FRAME_LENGTH_BYTES); ::memset(data + 2U, 0x00U, P25_TSDU_FRAME_LENGTH_BYTES);
// Regenerate Sync // Regenerate Sync
CSync::addP25Sync(data + 2U); CSync::addP25Sync(data + 2U);
// Regenerate NID // Regenerate NID
m_nid.encode(data + 2U, P25_DUID_TSDU); m_nid.encode(data + 2U, P25_DUID_TSDU);
// Regenerate TDULC Data // Regenerate TDULC Data
m_rfData.encodeTSDU(data + 2U); m_rfData.encodeTSDU(data + 2U);
// Add busy bits // Add busy bits
addBusyBits(data + 2U, P25_TSDU_FRAME_LENGTH_BITS, true, false); addBusyBits(data + 2U, P25_TSDU_FRAME_LENGTH_BITS, true, false);
// Set first busy bits to 1,1 // Set first busy bits to 1,1
setBusyBits(data + 2U, P25_SS0_START, true, true); setBusyBits(data + 2U, P25_SS0_START, true, true);
if (m_duplex) { if (m_duplex) {
data[0U] = TAG_DATA; data[0U] = TAG_DATA;
data[1U] = 0x00U; data[1U] = 0x00U;
writeQueueRF(data, P25_TSDU_FRAME_LENGTH_BYTES + 2U); writeQueueRF(data, P25_TSDU_FRAME_LENGTH_BYTES + 2U);
} }
break; break;
case P25_LCF_TSBK_ACK_RSP_FNE: case P25_LCF_TSBK_ACK_RSP_FNE:
LogMessage("P25, received RF TSDU transmission, ACK RESPONSE FNE from %u to %u", srcId, dstId); LogMessage("P25, received RF TSDU transmission, ACK RESPONSE FNE from %u to %u", srcId, dstId);
::memset(data + 2U, 0x00U, P25_TSDU_FRAME_LENGTH_BYTES); ::memset(data + 2U, 0x00U, P25_TSDU_FRAME_LENGTH_BYTES);
// Regenerate Sync // Regenerate Sync
CSync::addP25Sync(data + 2U); CSync::addP25Sync(data + 2U);
// Regenerate NID // Regenerate NID
m_nid.encode(data + 2U, P25_DUID_TSDU); m_nid.encode(data + 2U, P25_DUID_TSDU);
// Regenerate TDULC Data // Regenerate TDULC Data
m_rfData.encodeTSDU(data + 2U); m_rfData.encodeTSDU(data + 2U);
// Add busy bits // Add busy bits
addBusyBits(data + 2U, P25_TSDU_FRAME_LENGTH_BITS, true, false); addBusyBits(data + 2U, P25_TSDU_FRAME_LENGTH_BITS, true, false);
// Set first busy bits to 1,1 // Set first busy bits to 1,1
setBusyBits(data + 2U, P25_SS0_START, true, true); setBusyBits(data + 2U, P25_SS0_START, true, true);
if (m_duplex) { if (m_duplex) {
data[0U] = TAG_DATA; data[0U] = TAG_DATA;
data[1U] = 0x00U; data[1U] = 0x00U;
writeQueueRF(data, P25_TSDU_FRAME_LENGTH_BYTES + 2U); writeQueueRF(data, P25_TSDU_FRAME_LENGTH_BYTES + 2U);
} }
break; break;
default: default:
LogMessage("P25, recieved RF TSDU transmission, unhandled LCF $%02X", m_rfData.getLCF()); LogMessage("P25, recieved RF TSDU transmission, unhandled LCF $%02X", m_rfData.getLCF());
break; break;
} }
m_rfState = RS_RF_LISTENING; m_rfState = RS_RF_LISTENING;
return true; return true;
} }
} else if (duid == P25_DUID_TERM || duid == P25_DUID_TERM_LC) { } else if (duid == P25_DUID_TERM || duid == P25_DUID_TERM_LC) {
if (m_rfState == RS_RF_AUDIO) { if (m_rfState == RS_RF_AUDIO) {
writeNetwork(m_rfLDU, m_lastDUID, true); writeNetwork(m_rfLDU, m_lastDUID, true);
@@ -779,10 +779,10 @@ void CP25Control::writeNetwork(const unsigned char *data, unsigned char type, bo
void CP25Control::setBusyBits(unsigned char* data, unsigned int ssOffset, bool b1, bool b2) void CP25Control::setBusyBits(unsigned char* data, unsigned int ssOffset, bool b1, bool b2)
{ {
assert(data != NULL); assert(data != NULL);
WRITE_BIT(data, ssOffset, b1); WRITE_BIT(data, ssOffset, b1);
WRITE_BIT(data, ssOffset + 1U, b2); WRITE_BIT(data, ssOffset + 1U, b2);
} }
void CP25Control::addBusyBits(unsigned char* data, unsigned int length, bool b1, bool b2) void CP25Control::addBusyBits(unsigned char* data, unsigned int length, bool b1, bool b2)

View File

@@ -1,6 +1,6 @@
/* /*
* Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX * Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX
* Copyright (C) 2018 by Bryan Biedenkapp <gatekeep@gmail.com> * Copyright (C) 2018 by Bryan Biedenkapp <gatekeep@gmail.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by

View File

@@ -1,6 +1,6 @@
/* /*
* Copyright (C) 2016,2017 by Jonathan Naylor G4KLX * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX
* Copyright (C) 2018 by Bryan Biedenkapp <gatekeep@gmail.com> * Copyright (C) 2018 by Bryan Biedenkapp <gatekeep@gmail.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -56,7 +56,6 @@ m_lcf(0x00U),
m_emergency(false), m_emergency(false),
m_srcId(0U), m_srcId(0U),
m_dstId(0U), m_dstId(0U),
m_serviceType(0U),
m_rs241213(), m_rs241213(),
m_trellis() m_trellis()
{ {
@@ -212,112 +211,112 @@ void CP25Data::encodeLDU2(unsigned char* data)
bool CP25Data::decodeTSDU(const unsigned char* data) bool CP25Data::decodeTSDU(const unsigned char* data)
{ {
assert(data != NULL); assert(data != NULL);
// deinterleave // deinterleave
unsigned char tsbk[12U]; unsigned char tsbk[12U];
unsigned char raw[25U]; unsigned char raw[25U];
CP25Utils::decode(data, raw, 114U, 318U); CP25Utils::decode(data, raw, 114U, 318U);
// decode 1/2 rate Trellis & check CRC-CCITT 16 // decode 1/2 rate Trellis & check CRC-CCITT 16
try { try {
bool ret = m_trellis.decode12(raw, tsbk); bool ret = m_trellis.decode12(raw, tsbk);
if (ret) if (ret)
ret = CCRC::checkCCITT162(tsbk, 12U); ret = CCRC::checkCCITT162(tsbk, 12U);
if (!ret) if (!ret)
return false; return false;
} }
catch (...) { catch (...) {
CUtils::dump(2U, "P25, CRC failed with input data", tsbk, 12U); CUtils::dump(2U, "P25, CRC failed with input data", tsbk, 12U);
return false; return false;
} }
m_lcf = tsbk[0U] & 0x3F; m_lcf = tsbk[0U] & 0x3F;
m_mfId = tsbk[1U]; m_mfId = tsbk[1U];
unsigned long long tsbkValue = 0U; unsigned long long tsbkValue = 0U;
// combine bytes into rs value // combine bytes into rs value
tsbkValue = tsbk[2U]; tsbkValue = tsbk[2U];
tsbkValue = (tsbkValue << 8) + tsbk[3U]; tsbkValue = (tsbkValue << 8) + tsbk[3U];
tsbkValue = (tsbkValue << 8) + tsbk[4U]; tsbkValue = (tsbkValue << 8) + tsbk[4U];
tsbkValue = (tsbkValue << 8) + tsbk[5U]; tsbkValue = (tsbkValue << 8) + tsbk[5U];
tsbkValue = (tsbkValue << 8) + tsbk[6U]; tsbkValue = (tsbkValue << 8) + tsbk[6U];
tsbkValue = (tsbkValue << 8) + tsbk[7U]; tsbkValue = (tsbkValue << 8) + tsbk[7U];
tsbkValue = (tsbkValue << 8) + tsbk[8U]; tsbkValue = (tsbkValue << 8) + tsbk[8U];
tsbkValue = (tsbkValue << 8) + tsbk[9U]; tsbkValue = (tsbkValue << 8) + tsbk[9U];
switch (m_lcf) { switch (m_lcf) {
case P25_LCF_TSBK_CALL_ALERT: case P25_LCF_TSBK_CALL_ALERT:
m_dstId = (unsigned int)((tsbkValue >> 24) & 0xFFFFFFU); // Target Radio Address m_dstId = (unsigned int)((tsbkValue >> 24) & 0xFFFFFFU); // Target Radio Address
m_srcId = (unsigned int)(tsbkValue & 0xFFFFFFU); // Source Radio Address m_srcId = (unsigned int)(tsbkValue & 0xFFFFFFU); // Source Radio Address
break; break;
case P25_LCF_TSBK_ACK_RSP_FNE: case P25_LCF_TSBK_ACK_RSP_FNE:
m_serviceType = (unsigned char)((tsbkValue >> 56) & 0xFFU); // Service Type m_serviceType = (unsigned char)((tsbkValue >> 56) & 0xFFU); // Service Type
m_dstId = (unsigned int)((tsbkValue >> 24) & 0xFFFFFFU); // Target Radio Address m_dstId = (unsigned int)((tsbkValue >> 24) & 0xFFFFFFU); // Target Radio Address
m_srcId = (unsigned int)(tsbkValue & 0xFFFFFFU); // Source Radio Address m_srcId = (unsigned int)(tsbkValue & 0xFFFFFFU); // Source Radio Address
break; break;
default: default:
LogMessage("P25, unknown LCF value in TSDU - $%02X", m_lcf); LogMessage("P25, unknown LCF value in TSDU - $%02X", m_lcf);
break; break;
} }
return true; return true;
} }
void CP25Data::encodeTSDU(unsigned char* data) void CP25Data::encodeTSDU(unsigned char* data)
{ {
assert(data != NULL); assert(data != NULL);
unsigned char tsbk[12U]; unsigned char tsbk[12U];
::memset(tsbk, 0x00U, 12U); ::memset(tsbk, 0x00U, 12U);
unsigned long long tsbkValue = 0U; unsigned long long tsbkValue = 0U;
tsbk[0U] = m_lcf; tsbk[0U] = m_lcf;
tsbk[0U] |= 0x80; tsbk[0U] |= 0x80;
tsbk[1U] = m_mfId; tsbk[1U] = m_mfId;
switch (m_lcf) { switch (m_lcf) {
case P25_LCF_TSBK_CALL_ALERT: case P25_LCF_TSBK_CALL_ALERT:
tsbkValue = 0U; tsbkValue = 0U;
tsbkValue = (tsbkValue << 16) + 0U; tsbkValue = (tsbkValue << 16) + 0U;
tsbkValue = (tsbkValue << 24) + m_dstId; // Target Radio Address tsbkValue = (tsbkValue << 24) + m_dstId; // Target Radio Address
tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address
break; break;
case P25_LCF_TSBK_ACK_RSP_FNE: case P25_LCF_TSBK_ACK_RSP_FNE:
tsbkValue = 0U; // Additional Info. Flag tsbkValue = 0U; // Additional Info. Flag
tsbkValue = (tsbkValue << 1) + 0U; // Extended Address Flag tsbkValue = (tsbkValue << 1) + 0U; // Extended Address Flag
tsbkValue = (tsbkValue << 16) + (m_serviceType & 0xFF); // Service Type tsbkValue = (tsbkValue << 16) + (m_serviceType & 0xFF); // Service Type
tsbkValue = (tsbkValue << 32) + m_dstId; // Target Radio Address tsbkValue = (tsbkValue << 32) + m_dstId; // Target Radio Address
tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address
break; break;
default: default:
LogMessage("P25, unknown LCF value in TSDU - $%02X", m_lcf); LogMessage("P25, unknown LCF value in TSDU - $%02X", m_lcf);
break; break;
} }
// split rs value into bytes // split rs value into bytes
tsbk[2U] = (unsigned char)((tsbkValue >> 56) & 0xFFU); tsbk[2U] = (unsigned char)((tsbkValue >> 56) & 0xFFU);
tsbk[3U] = (unsigned char)((tsbkValue >> 48) & 0xFFU); tsbk[3U] = (unsigned char)((tsbkValue >> 48) & 0xFFU);
tsbk[4U] = (unsigned char)((tsbkValue >> 40) & 0xFFU); tsbk[4U] = (unsigned char)((tsbkValue >> 40) & 0xFFU);
tsbk[5U] = (unsigned char)((tsbkValue >> 32) & 0xFFU); tsbk[5U] = (unsigned char)((tsbkValue >> 32) & 0xFFU);
tsbk[6U] = (unsigned char)((tsbkValue >> 24) & 0xFFU); tsbk[6U] = (unsigned char)((tsbkValue >> 24) & 0xFFU);
tsbk[7U] = (unsigned char)((tsbkValue >> 16) & 0xFFU); tsbk[7U] = (unsigned char)((tsbkValue >> 16) & 0xFFU);
tsbk[8U] = (unsigned char)((tsbkValue >> 8) & 0xFFU); tsbk[8U] = (unsigned char)((tsbkValue >> 8) & 0xFFU);
tsbk[9U] = (unsigned char)((tsbkValue >> 0) & 0xFFU); tsbk[9U] = (unsigned char)((tsbkValue >> 0) & 0xFFU);
// compute CRC-CCITT 16 // compute CRC-CCITT 16
CCRC::addCCITT162(tsbk, 12U); CCRC::addCCITT162(tsbk, 12U);
unsigned char raw[25U]; unsigned char raw[25U];
::memset(raw, 0x00U, 25U); ::memset(raw, 0x00U, 25U);
// encode 1/2 rate Trellis // encode 1/2 rate Trellis
m_trellis.encode12(tsbk, raw); m_trellis.encode12(tsbk, raw);
// interleave // interleave
CP25Utils::encode(raw, data, 114U, 318U); CP25Utils::encode(raw, data, 114U, 318U);
} }
void CP25Data::setMI(const unsigned char* mi) void CP25Data::setMI(const unsigned char* mi)
@@ -404,6 +403,16 @@ unsigned int CP25Data::getDstId() const
return m_dstId; return m_dstId;
} }
void CP25Data::setServiceType(unsigned char type)
{
m_serviceType = type;
}
unsigned char CP25Data::getServiceType() const
{
return m_serviceType;
}
void CP25Data::reset() void CP25Data::reset()
{ {
::memset(m_mi, 0x00U, P25_MI_LENGTH_BYTES); ::memset(m_mi, 0x00U, P25_MI_LENGTH_BYTES);

View File

@@ -1,6 +1,6 @@
/* /*
* Copyright (C) 2016,2017 by Jonathan Naylor G4KLX * Copyright (C) 2016,2017 by Jonathan Naylor G4KLX
* Copyright (C) 2018 by Bryan Biedenkapp <gatekeep@gmail.com> * Copyright (C) 2018 by Bryan Biedenkapp <gatekeep@gmail.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@@ -35,8 +35,8 @@ public:
void encodeLDU2(unsigned char* data); void encodeLDU2(unsigned char* data);
bool decodeTSDU(const unsigned char* data); bool decodeTSDU(const unsigned char* data);
void encodeTSDU(unsigned char* data); void encodeTSDU(unsigned char* data);
void setMI(const unsigned char* mi); void setMI(const unsigned char* mi);
void getMI(unsigned char* mi) const; void getMI(unsigned char* mi) const;
@@ -62,8 +62,8 @@ public:
void setDstId(unsigned int id); void setDstId(unsigned int id);
unsigned int getDstId() const; unsigned int getDstId() const;
void setServiceType(unsigned char type); void setServiceType(unsigned char type);
unsigned char getServiceType() const; unsigned char getServiceType() const;
void reset(); void reset();
@@ -76,9 +76,9 @@ private:
bool m_emergency; bool m_emergency;
unsigned int m_srcId; unsigned int m_srcId;
unsigned int m_dstId; unsigned int m_dstId;
unsigned char m_serviceType; unsigned char m_serviceType;
CRS241213 m_rs241213; CRS241213 m_rs241213;
CP25Trellis m_trellis; CP25Trellis m_trellis;
void decodeLDUHamming(const unsigned char* raw, unsigned char* data); void decodeLDUHamming(const unsigned char* raw, unsigned char* data);
void encodeLDUHamming(unsigned char* data, const unsigned char* raw); void encodeLDUHamming(unsigned char* data, const unsigned char* raw);