Skip to content

Commit 0dc1f1b

Browse files
committed
More work with decoding and regenerating P25.
1 parent 30467a7 commit 0dc1f1b

22 files changed

+450
-164
lines changed

Hamming.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,54 @@ void CHamming::encode1393(bool* d)
179179
d[12] = d[0] ^ d[2] ^ d[4] ^ d[5] ^ d[8];
180180
}
181181

182+
// Hamming (10,6,3) check a boolean data array
183+
bool CHamming::decode1063(bool* d)
184+
{
185+
assert(d != NULL);
186+
187+
// Calculate the checksum this column should have
188+
bool c0 = d[0] ^ d[1] ^ d[2] ^ d[5];
189+
bool c1 = d[0] ^ d[1] ^ d[3] ^ d[5];
190+
bool c2 = d[0] ^ d[2] ^ d[3] ^ d[4];
191+
bool c3 = d[1] ^ d[2] ^ d[3] ^ d[4];
192+
193+
unsigned char n = 0x00U;
194+
n |= (c0 != d[6]) ? 0x01U : 0x00U;
195+
n |= (c1 != d[7]) ? 0x02U : 0x00U;
196+
n |= (c2 != d[8]) ? 0x04U : 0x00U;
197+
n |= (c3 != d[9]) ? 0x08U : 0x00U;
198+
199+
switch (n) {
200+
// Parity bit errors
201+
case 0x01U: d[6] = !d[6]; return true;
202+
case 0x02U: d[7] = !d[7]; return true;
203+
case 0x04U: d[8] = !d[8]; return true;
204+
case 0x08U: d[9] = !d[9]; return true;
205+
206+
// Data bit erros
207+
case 0x07U: d[0] = !d[0]; return true;
208+
case 0x0BU: d[1] = !d[1]; return true;
209+
case 0x0DU: d[2] = !d[2]; return true;
210+
case 0x0EU: d[3] = !d[3]; return true;
211+
case 0x0CU: d[4] = !d[4]; return true;
212+
case 0x03U: d[5] = !d[5]; return true;
213+
214+
// No bit errors
215+
default: return false;
216+
}
217+
}
218+
219+
void CHamming::encode1063(bool* d)
220+
{
221+
assert(d != NULL);
222+
223+
// Calculate the checksum this column should have
224+
d[6] = d[0] ^ d[1] ^ d[2] ^ d[5];
225+
d[7] = d[0] ^ d[1] ^ d[3] ^ d[5];
226+
d[8] = d[0] ^ d[2] ^ d[3] ^ d[4];
227+
d[9] = d[1] ^ d[2] ^ d[3] ^ d[4];
228+
}
229+
182230
// A Hamming (16,11,4) Check
183231
bool CHamming::decode16114(bool* d)
184232
{

Hamming.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ class CHamming {
3030
static void encode1393(bool* d);
3131
static bool decode1393(bool* d);
3232

33+
static void encode1063(bool* d);
34+
static bool decode1063(bool* d);
35+
3336
static void encode16114(bool* d);
3437
static bool decode16114(bool* d);
3538

MMDVM.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ TXLevel=50
4747
OscOffset=0
4848
RSSIMultiplier=1
4949
RSSIOffset=10
50-
Debug=1
50+
Debug=0
5151

5252
[D-Star]
5353
Enable=1

MMDVMHost.vcxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,9 @@
185185
<ClInclude Include="P25Control.h" />
186186
<ClInclude Include="P25Defines.h" />
187187
<ClInclude Include="P25Data.h" />
188+
<ClInclude Include="P25LowSpeedData.h" />
188189
<ClInclude Include="P25NID.h" />
190+
<ClInclude Include="P25Utils.h" />
189191
<ClInclude Include="QR1676.h" />
190192
<ClInclude Include="RingBuffer.h" />
191193
<ClInclude Include="RS129.h" />
@@ -242,7 +244,9 @@
242244
<ClCompile Include="P25Audio.cpp" />
243245
<ClCompile Include="P25Control.cpp" />
244246
<ClCompile Include="P25Data.cpp" />
247+
<ClCompile Include="P25LowSpeedData.cpp" />
245248
<ClCompile Include="P25NID.cpp" />
249+
<ClCompile Include="P25Utils.cpp" />
246250
<ClCompile Include="QR1676.cpp" />
247251
<ClCompile Include="RS129.cpp" />
248252
<ClCompile Include="SerialController.cpp" />

MMDVMHost.vcxproj.filters

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,12 @@
188188
<ClInclude Include="P25Data.h">
189189
<Filter>Header Files</Filter>
190190
</ClInclude>
191+
<ClInclude Include="P25Utils.h">
192+
<Filter>Header Files</Filter>
193+
</ClInclude>
194+
<ClInclude Include="P25LowSpeedData.h">
195+
<Filter>Header Files</Filter>
196+
</ClInclude>
191197
</ItemGroup>
192198
<ItemGroup>
193199
<ClCompile Include="BPTC19696.cpp">
@@ -346,5 +352,11 @@
346352
<ClCompile Include="P25Data.cpp">
347353
<Filter>Source Files</Filter>
348354
</ClCompile>
355+
<ClCompile Include="P25Utils.cpp">
356+
<Filter>Source Files</Filter>
357+
</ClCompile>
358+
<ClCompile Include="P25LowSpeedData.cpp">
359+
<Filter>Source Files</Filter>
360+
</ClCompile>
349361
</ItemGroup>
350362
</Project>

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ LDFLAGS = -g
99
OBJECTS = \
1010
AMBEFEC.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedLC.o DMRFullLC.o DMRIPSC.o DMRLookup.o DMRLC.o \
1111
DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o Log.o MMDVMHost.o \
12-
Modem.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25NID.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o \
13-
Timer.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
12+
Modem.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25NID.o P25Utils.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o \
13+
Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
1414

1515
all: MMDVMHost
1616

Makefile.Pi.Adafruit

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ LDFLAGS = -g -L/usr/local/lib
99
OBJECTS = \
1010
AMBEFEC.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedLC.o DMRFullLC.o DMRIPSC.o DMRLookup.o DMRLC.o \
1111
DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o Log.o \
12-
MMDVMHost.o Modem.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25NID.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o \
13-
Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
12+
MMDVMHost.o Modem.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25NID.o P25Utils.o QR1676.o RS129.o SerialController.o SHA256.o \
13+
StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
1414

1515
all: MMDVMHost
1616

Makefile.Pi.HD44780

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ LDFLAGS = -g -L/usr/local/lib
99
OBJECTS = \
1010
AMBEFEC.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedLC.o DMRFullLC.o DMRIPSC.o DMRLookup.o DMRLC.o \
1111
DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o Log.o \
12-
MMDVMHost.o Modem.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25NID.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o \
13-
Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
12+
MMDVMHost.o Modem.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25NID.o P25Utils.o QR1676.o RS129.o SerialController.o SHA256.o \
13+
StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
1414

1515
all: MMDVMHost
1616

Makefile.Pi.OLED

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ LDFLAGS = -g -L/usr/local/lib
99
OBJECTS = \
1010
AMBEFEC.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedLC.o DMRFullLC.o DMRIPSC.o DMRLookup.o DMRLC.o \
1111
DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o OLED.o Log.o \
12-
MMDVMHost.o Modem.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25NID.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o \
13-
Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
12+
MMDVMHost.o Modem.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25NID.o P25Utils.o QR1676.o RS129.o SerialController.o SHA256.o \
13+
StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
1414

1515
all: MMDVMHost
1616

Makefile.Pi.PCF8574

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ LDFLAGS = -g -L/usr/local/lib
99
OBJECTS = \
1010
AMBEFEC.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedLC.o DMRFullLC.o DMRIPSC.o DMRLookup.o DMRLC.o \
1111
DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o Log.o \
12-
MMDVMHost.o Modem.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25NID.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o \
13-
Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
12+
MMDVMHost.o Modem.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25NID.o P25Utils.o QR1676.o RS129.o SerialController.o SHA256.o \
13+
StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
1414

1515
all: MMDVMHost
1616

Makefile.Solaris

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ LDFLAGS = -g
99
OBJECTS = \
1010
AMBEFEC.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedLC.o DMRFullLC.o DMRIPSC.o DMRLookup.o DMRLC.o \
1111
DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o Log.o MMDVMHost.o \
12-
Modem.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25NID.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o \
13-
Timer.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
12+
Modem.o Nextion.o NullDisplay.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25NID.o P25Utils.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o \
13+
Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
1414

1515
all: MMDVMHost
1616

P25Audio.cpp

Lines changed: 19 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,11 @@
1717
*/
1818

1919
#include "P25Audio.h"
20+
#include "P25Utils.h"
2021

2122
#include <cstdio>
2223
#include <cassert>
2324

24-
const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U };
25-
26-
#define WRITE_BIT(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7])
27-
#define READ_BIT(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7])
28-
2925
CP25Audio::CP25Audio() :
3026
m_fec()
3127
{
@@ -43,65 +39,41 @@ unsigned int CP25Audio::process(unsigned char* data)
4339

4440
unsigned char imbe[18U];
4541

46-
read(data, imbe, 114U, 262U, 142U, 143U, 214U, 215U);
42+
CP25Utils::decode(data, imbe, 114U, 262U);
4743
errs += m_fec.regenerateIMBE(imbe);
48-
write(data, imbe, 114U, 262U, 142U, 143U, 214U, 215U);
44+
CP25Utils::encode(imbe, data, 114U, 262U);
4945

50-
read(data, imbe, 262U, 410U, 286U, 287U, 358U, 359U);
46+
CP25Utils::decode(data, imbe, 262U, 410U);
5147
errs += m_fec.regenerateIMBE(imbe);
52-
write(data, imbe, 262U, 410U, 286U, 287U, 358U, 359U);
48+
CP25Utils::encode(imbe, data, 262U, 410U);
5349

54-
read(data, imbe, 452U, 600U, 502U, 503U, 574U, 575U);
50+
CP25Utils::decode(data, imbe, 452U, 600U);
5551
errs += m_fec.regenerateIMBE(imbe);
56-
write(data, imbe, 452U, 600U, 502U, 503U, 574U, 575U);
52+
CP25Utils::encode(imbe, data, 452U, 600U);
5753

58-
read(data, imbe, 640U, 788U, 646U, 647U, 718U, 719U);
54+
CP25Utils::decode(data, imbe, 640U, 788U);
5955
errs += m_fec.regenerateIMBE(imbe);
60-
write(data, imbe, 640U, 788U, 646U, 647U, 718U, 719U);
56+
CP25Utils::encode(imbe, data, 640U, 788U);
6157

62-
read(data, imbe, 830U, 978U, 862U, 863U, 934U, 935U);
58+
CP25Utils::decode(data, imbe, 830U, 978U);
6359
errs += m_fec.regenerateIMBE(imbe);
64-
write(data, imbe, 830U, 978U, 862U, 863U, 934U, 935U);
60+
CP25Utils::encode(imbe, data, 830U, 978U);
6561

66-
read(data, imbe, 1020U, 1168U, 1078U, 1079U, 1150U, 1151U);
62+
CP25Utils::decode(data, imbe, 1020U, 1168U);
6763
errs += m_fec.regenerateIMBE(imbe);
68-
write(data, imbe, 1020U, 1168U, 1078U, 1079U, 1150U, 1151U);
64+
CP25Utils::encode(imbe, data, 1020U, 1168U);
6965

70-
read(data, imbe, 1208U, 1356U, 1222U, 1223U, 1294U, 1295U);
66+
CP25Utils::decode(data, imbe, 1208U, 1356U);
7167
errs += m_fec.regenerateIMBE(imbe);
72-
write(data, imbe, 1208U, 1356U, 1222U, 1223U, 1294U, 1295U);
68+
CP25Utils::encode(imbe, data, 1208U, 1356U);
7369

74-
read(data, imbe, 1398U, 1546U, 1438U, 1439U, 1510U, 1511U);
70+
CP25Utils::decode(data, imbe, 1398U, 1546U);
7571
errs += m_fec.regenerateIMBE(imbe);
76-
write(data, imbe, 1398U, 1546U, 1438U, 1439U, 1510U, 1511U);
72+
CP25Utils::encode(imbe, data, 1398U, 1546U);
7773

78-
read(data, imbe, 1578U, 1726U, 1582U, 1583U, 1654U, 1655U);
74+
CP25Utils::decode(data, imbe, 1578U, 1726U);
7975
errs += m_fec.regenerateIMBE(imbe);
80-
write(data, imbe, 1578U, 1726U, 1582U, 1583U, 1654U, 1655U);
76+
CP25Utils::encode(imbe, data, 1578U, 1726U);
8177

8278
return errs;
8379
}
84-
85-
void CP25Audio::read(const unsigned char* data, unsigned char* out, unsigned int start, unsigned int stop, unsigned int avoid1, unsigned int avoid2, unsigned int avoid3, unsigned int avoid4)
86-
{
87-
unsigned int n = 0U;
88-
for (unsigned int offset = start; offset < stop; offset++) {
89-
if (offset != avoid1 && offset != avoid2 && offset != avoid3 && offset != avoid4) {
90-
bool b = READ_BIT(data, offset);
91-
WRITE_BIT(out, n, b);
92-
n++;
93-
}
94-
}
95-
}
96-
97-
void CP25Audio::write(unsigned char* data, const unsigned char* in, unsigned int start, unsigned int stop, unsigned int avoid1, unsigned int avoid2, unsigned int avoid3, unsigned int avoid4)
98-
{
99-
unsigned int n = 0U;
100-
for (unsigned int offset = start; offset < stop; offset++) {
101-
if (offset != avoid1 && offset != avoid2 && offset != avoid3 && offset != avoid4) {
102-
bool b = READ_BIT(in, n);
103-
WRITE_BIT(data, offset, b);
104-
n++;
105-
}
106-
}
107-
}

P25Audio.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@ class CP25Audio {
3030

3131
private:
3232
CAMBEFEC m_fec;
33-
34-
void read(const unsigned char* data, unsigned char* out, unsigned int start, unsigned int stop, unsigned int avoid1, unsigned int avoid2, unsigned int avoid3, unsigned int avoid4);
35-
void write(unsigned char* data, const unsigned char* in, unsigned int start, unsigned int stop, unsigned int avoid1, unsigned int avoid2, unsigned int avoid3, unsigned int avoid4);
3633
};
3734

3835
#endif

P25Control.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818

1919
#include "P25Control.h"
20+
#include "P25LowSpeedData.h"
2021
#include "P25Defines.h"
2122
#include "Sync.h"
2223
#include "Log.h"
@@ -62,7 +63,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
6263
{
6364
assert(data != NULL);
6465

65-
CUtils::dump(1U, "P25 Data", data, len);
66+
// CUtils::dump(1U, "P25 Data", data, len);
6667

6768
bool sync = data[1U] == 0x01U;
6869

@@ -129,6 +130,9 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
129130
// Regenerate LDU1 Data
130131
m_rfData.processLDU1(data + 2U);
131132

133+
// Regenerate the Low Speed Data
134+
CP25LowSpeedData::process(data + 2U);
135+
132136
// Regenerate Audio
133137
unsigned int errors = m_audio.process(data + 2U);
134138
LogDebug("P25, LDU1 audio, errs: %u/1233", errors);
@@ -159,13 +163,14 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
159163
if (m_rfState == RS_RF_LISTENING)
160164
return false;
161165

162-
// Decode LDU2
163-
m_rfData.processLDU2(data + 2U);
164-
165166
// Regenerate Sync
166167
CSync::addP25Sync(data + 2U);
167168

168169
// Regenerate LDU2 Data
170+
m_rfData.processLDU2(data + 2U);
171+
172+
// Regenerate the Low Speed Data
173+
CP25LowSpeedData::process(data + 2U);
169174

170175
// Regenerate Audio
171176
unsigned int errors = m_audio.process(data + 2U);

0 commit comments

Comments
 (0)