@@ -62,7 +62,9 @@ m_rfErrs(0U),
62
62
m_rfBits(1U ),
63
63
m_rfLastLICH(),
64
64
m_rfLayer3(),
65
+ m_netLayer3(),
65
66
m_rfMask(0x00U ),
67
+ m_netMask(0x00U ),
66
68
m_rssiMapper(rssiMapper),
67
69
m_rssi(0U ),
68
70
m_maxRSSI(0U ),
@@ -646,6 +648,9 @@ void CNXDNControl::writeEndNet()
646
648
{
647
649
m_netState = RS_NET_IDLE;
648
650
651
+ m_netMask = 0x00U ;
652
+ m_netLayer3.reset ();
653
+
649
654
m_netTimeoutTimer.stop ();
650
655
m_networkWatchdog.stop ();
651
656
m_packetTimer.stop ();
@@ -774,8 +779,44 @@ void CNXDNControl::writeNetwork()
774
779
m_netFrames++;
775
780
CUtils::dump (2U , " NXDN, interesting non superblock network frame" , netData, 33U );
776
781
}
777
- } else if (m_netState == RS_NET_IDLE) {
782
+ } else {
778
783
if (m_netState == RS_NET_IDLE) {
784
+ unsigned char structure = (netData[1U ] >> 6 ) & 0x03U ;
785
+ switch (structure) {
786
+ case NXDN_SR_1_4:
787
+ m_netLayer3.decode (netData + 2U , 18U , 0U );
788
+ if (m_netLayer3.getMessageType () == NXDN_MESSAGE_TYPE_VCALL)
789
+ m_netMask = 0x01U ;
790
+ else
791
+ m_netMask = 0x00U ;
792
+ break ;
793
+ case NXDN_SR_2_4:
794
+ m_netMask |= 0x02U ;
795
+ m_netLayer3.decode (netData + 2U , 18U , 18U );
796
+ break ;
797
+ case NXDN_SR_3_4:
798
+ m_netMask |= 0x04U ;
799
+ m_netLayer3.decode (netData + 2U , 18U , 36U );
800
+ break ;
801
+ case NXDN_SR_4_4:
802
+ m_netMask |= 0x08U ;
803
+ m_netLayer3.decode (netData + 2U , 18U , 54U );
804
+ break ;
805
+ default :
806
+ break ;
807
+ }
808
+
809
+ if (m_netMask != 0x0FU )
810
+ return ;
811
+
812
+ unsigned char type = m_netLayer3.getMessageType ();
813
+ if (type != NXDN_MESSAGE_TYPE_VCALL)
814
+ return ;
815
+
816
+ unsigned short srcId = m_netLayer3.getSourceUnitId ();
817
+ unsigned short dstId = m_netLayer3.getDestinationGroupId ();
818
+ bool grp = m_netLayer3.getIsGroup ();
819
+
779
820
std::string source = m_lookup->find (srcId);
780
821
LogMessage (" NXDN, received network transmission from %s to %s%u" , source.c_str (), grp ? " TG " : " " , dstId);
781
822
m_display->writeNXDN (source.c_str (), grp, dstId, " N" );
@@ -784,10 +825,45 @@ void CNXDNControl::writeNetwork()
784
825
m_packetTimer.start ();
785
826
m_elapsed.start ();
786
827
m_netState = RS_NET_AUDIO;
787
- m_netFrames = 0U ;
828
+ m_netFrames = 1U ;
788
829
m_netLost = 0U ;
830
+
831
+ // Create a dummy start message
832
+ unsigned char start[NXDN_FRAME_LENGTH_BYTES + 2U ];
833
+
834
+ start[0U ] = TAG_DATA;
835
+ start[1U ] = 0x00U ;
836
+
837
+ // Generate the sync
838
+ CSync::addNXDNSync (start + 2U );
839
+
840
+ // Generate the LICH
841
+ CNXDNLICH lich;
842
+ lich.setRFCT (NXDN_LICH_RFCT_RDCH);
843
+ lich.setFCT (NXDN_LICH_USC_SACCH_NS);
844
+ lich.setOption (NXDN_LICH_STEAL_FACCH);
845
+ lich.setDirection (m_remoteGateway ? NXDN_LICH_DIRECTION_INBOUND : NXDN_LICH_DIRECTION_OUTBOUND);
846
+ lich.encode (start + 2U );
847
+
848
+ CNXDNSACCH sacch;
849
+ sacch.setRAN (m_ran);
850
+ sacch.setStructure (NXDN_SR_SINGLE);
851
+ sacch.setData (SACCH_IDLE);
852
+ sacch.encode (start + 2U );
853
+
854
+ unsigned char message[22U ];
855
+ m_netLayer3.getData (message);
856
+
857
+ CNXDNFACCH1 facch;
858
+ facch.setData (message);
859
+ facch.encode (start + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS);
860
+ facch.encode (start + 2U , NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS);
861
+
862
+ scrambler (start + 2U );
863
+
864
+ writeQueueNet (start);
789
865
}
790
- } else {
866
+
791
867
m_netFrames++;
792
868
793
869
data[0U ] = TAG_DATA;
0 commit comments