|
13 | 13 |
|
14 | 14 | #include "NXDNControl.h"
|
15 | 15 | #include "NXDNFACCH1.h"
|
16 |
| -#include "NXDNFACCH2.h" |
17 | 16 | #include "NXDNSACCH.h"
|
18 | 17 | #include "NXDNUDCH.h"
|
19 | 18 | #include "AMBEFEC.h"
|
@@ -209,7 +208,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
|
209 | 208 | return false;
|
210 | 209 |
|
211 | 210 | unsigned char messageType = m_rfSACCHMessage.getMessageType();
|
212 |
| - if (messageType == NXDN_MESSAGE_TYPE_IDLE) |
| 211 | + if (messageType != NXDN_MESSAGE_TYPE_VCALL) |
213 | 212 | return false;
|
214 | 213 |
|
215 | 214 | unsigned short srcId = m_rfSACCHMessage.getSourceUnitId();
|
@@ -247,17 +246,74 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
|
247 | 246 | if (m_rfState != RS_RF_AUDIO)
|
248 | 247 | return false;
|
249 | 248 |
|
| 249 | + unsigned char voiceMode = m_rfSACCHMessage.getCallOptions() & 0x07U; |
| 250 | + |
250 | 251 | if (option == NXDN_LICH_STEAL_NONE) {
|
251 | 252 | CAMBEFEC ambe;
|
252 | 253 | unsigned int errors = 0U;
|
253 |
| - //errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES); |
254 |
| - //errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U); |
255 |
| - //errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U); |
256 |
| - //errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U); |
257 |
| - //LogDebug("NXDN, EHR, AMBE FEC %u/188 (%.1f%%)", errors, float(errors) / 1.88F); |
258 |
| - //errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES); |
259 |
| - //errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U); |
260 |
| - //LogDebug("NXDN, EFR, AMBE FEC %u/288 (%.1f%%)", errors, float(errors) / 2.88F); |
| 254 | + if (voiceMode == NXDN_VOICE_CALL_OPTION_9600_EFR) { |
| 255 | + errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES); |
| 256 | + errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U); |
| 257 | + m_rfErrs += errors; |
| 258 | + m_rfBits += 288U; |
| 259 | + m_display->writeNXDNBER(float(errors) / 2.88F); |
| 260 | + LogDebug("NXDN, EFR, AMBE FEC %u/288 (%.1f%%)", errors, float(errors) / 2.88F); |
| 261 | + } else { |
| 262 | + errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES); |
| 263 | + errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U); |
| 264 | + errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U); |
| 265 | + errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U); |
| 266 | + m_rfErrs += errors; |
| 267 | + m_rfBits += 188U; |
| 268 | + m_display->writeNXDNBER(float(errors) / 1.88F); |
| 269 | + LogDebug("NXDN, EHR, AMBE FEC %u/188 (%.1f%%)", errors, float(errors) / 1.88F); |
| 270 | + } |
| 271 | + } else if (option == NXDN_LICH_STEAL_FACCH1_1) { |
| 272 | + CNXDNFACCH1 facch1; |
| 273 | + facch1.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS); |
| 274 | + |
| 275 | + CAMBEFEC ambe; |
| 276 | + unsigned int errors = 0U; |
| 277 | + if (voiceMode == NXDN_VOICE_CALL_OPTION_9600_EFR) { |
| 278 | + errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U); |
| 279 | + m_rfErrs += errors; |
| 280 | + m_rfBits += 144U; |
| 281 | + m_display->writeNXDNBER(float(errors) / 1.44F); |
| 282 | + LogDebug("NXDN, EFR, AMBE FEC %u/144 (%.1f%%)", errors, float(errors) / 1.44F); |
| 283 | + } else { |
| 284 | + errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U); |
| 285 | + errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U); |
| 286 | + m_rfErrs += errors; |
| 287 | + m_rfBits += 94U; |
| 288 | + m_display->writeNXDNBER(float(errors) / 0.94F); |
| 289 | + LogDebug("NXDN, EHR, AMBE FEC %u/94 (%.1f%%)", errors, float(errors) / 0.94F); |
| 290 | + } |
| 291 | + } else if (option == NXDN_LICH_STEAL_FACCH1_2) { |
| 292 | + CAMBEFEC ambe; |
| 293 | + unsigned int errors = 0U; |
| 294 | + if (voiceMode == NXDN_VOICE_CALL_OPTION_9600_EFR) { |
| 295 | + errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES); |
| 296 | + m_rfErrs += errors; |
| 297 | + m_rfBits += 144U; |
| 298 | + m_display->writeNXDNBER(float(errors) / 1.44F); |
| 299 | + LogDebug("NXDN, EFR, AMBE FEC %u/144 (%.1f%%)", errors, float(errors) / 1.44F); |
| 300 | + } else { |
| 301 | + errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES); |
| 302 | + errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U); |
| 303 | + m_rfErrs += errors; |
| 304 | + m_rfBits += 94U; |
| 305 | + m_display->writeNXDNBER(float(errors) / 0.94F); |
| 306 | + LogDebug("NXDN, EHR, AMBE FEC %u/94 (%.1f%%)", errors, float(errors) / 0.94F); |
| 307 | + } |
| 308 | + |
| 309 | + CNXDNFACCH1 facch1; |
| 310 | + facch1.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS); |
| 311 | + } else { |
| 312 | + CNXDNFACCH1 facch11; |
| 313 | + facch11.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS); |
| 314 | + |
| 315 | + CNXDNFACCH1 facch12; |
| 316 | + facch12.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS); |
261 | 317 | }
|
262 | 318 |
|
263 | 319 | #ifdef notdef
|
@@ -579,65 +635,36 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
|
579 | 635 |
|
580 | 636 | bool CNXDNControl::processData(unsigned char option, unsigned char *data)
|
581 | 637 | {
|
582 |
| - if (option == NXDN_LICH_STEAL_FACCH) { |
583 |
| - CNXDNFACCH2 facch2; |
584 |
| - bool valid = facch2.decode(data + 2U); |
585 |
| - if (valid) { |
586 |
| - unsigned char ran = facch2.getRAN(); |
587 |
| - if (ran != m_ran && ran != 0U) |
588 |
| - return false; |
589 |
| - |
590 |
| - data[0U] = TAG_DATA; |
591 |
| - data[1U] = 0x00U; |
592 |
| - |
593 |
| - CSync::addNXDNSync(data + 2U); |
594 |
| - |
595 |
| - CNXDNLICH lich; |
596 |
| - lich.setRFCT(NXDN_LICH_RFCT_RDCH); |
597 |
| - lich.setFCT(NXDN_LICH_USC_UDCH); |
598 |
| - lich.setOption(NXDN_LICH_STEAL_FACCH); |
599 |
| - lich.setDirection(m_remoteGateway ? NXDN_LICH_DIRECTION_INBOUND : NXDN_LICH_DIRECTION_OUTBOUND); |
600 |
| - lich.encode(data + 2U); |
601 |
| - |
602 |
| - facch2.setRAN(m_ran); |
603 |
| - facch2.encode(data + 2U); |
| 638 | + CNXDNUDCH udch; |
| 639 | + bool valid = udch.decode(data + 2U); |
| 640 | + if (valid) { |
| 641 | + unsigned char ran = udch.getRAN(); |
| 642 | + if (ran != m_ran && ran != 0U) |
| 643 | + return false; |
604 | 644 |
|
605 |
| - writeQueueNet(data); |
| 645 | + data[0U] = TAG_DATA; |
| 646 | + data[1U] = 0x00U; |
606 | 647 |
|
607 |
| - if (m_duplex) |
608 |
| - writeQueueRF(data); |
609 |
| -#if defined(DUMP_NXDN) |
610 |
| - writeFile(data + 2U); |
611 |
| -#endif |
612 |
| - return true; |
613 |
| - } |
614 |
| - } else { |
615 |
| - CNXDNUDCH udch; |
616 |
| - bool valid = udch.decode(data + 2U); |
617 |
| - if (valid) { |
618 |
| - data[0U] = TAG_DATA; |
619 |
| - data[1U] = 0x00U; |
| 648 | + CSync::addNXDNSync(data + 2U); |
620 | 649 |
|
621 |
| - CSync::addNXDNSync(data + 2U); |
| 650 | + CNXDNLICH lich; |
| 651 | + lich.setRFCT(NXDN_LICH_RFCT_RDCH); |
| 652 | + lich.setFCT(NXDN_LICH_USC_UDCH); |
| 653 | + lich.setOption(option); |
| 654 | + lich.setDirection(m_remoteGateway ? NXDN_LICH_DIRECTION_INBOUND : NXDN_LICH_DIRECTION_OUTBOUND); |
| 655 | + lich.encode(data + 2U); |
622 | 656 |
|
623 |
| - CNXDNLICH lich; |
624 |
| - lich.setRFCT(NXDN_LICH_RFCT_RDCH); |
625 |
| - lich.setFCT(NXDN_LICH_USC_UDCH); |
626 |
| - lich.setOption(NXDN_LICH_STEAL_NONE); |
627 |
| - lich.setDirection(m_remoteGateway ? NXDN_LICH_DIRECTION_INBOUND : NXDN_LICH_DIRECTION_OUTBOUND); |
628 |
| - lich.encode(data + 2U); |
| 657 | + udch.setRAN(m_ran); |
| 658 | + udch.encode(data + 2U); |
629 | 659 |
|
630 |
| - udch.encode(data + 2U); |
| 660 | + writeQueueNet(data); |
631 | 661 |
|
632 |
| - writeQueueNet(data); |
633 |
| - |
634 |
| - if (m_duplex) |
635 |
| - writeQueueRF(data); |
| 662 | + if (m_duplex) |
| 663 | + writeQueueRF(data); |
636 | 664 | #if defined(DUMP_NXDN)
|
637 |
| - writeFile(data + 2U); |
| 665 | + writeFile(data + 2U); |
638 | 666 | #endif
|
639 |
| - return true; |
640 |
| - } |
| 667 | + return true; |
641 | 668 | }
|
642 | 669 |
|
643 | 670 | #ifdef notdef
|
|
0 commit comments