66
66
import io .github .dsheirer .module .decode .dmr .message .data .lc .full .UnitToUnitVoiceChannelUser ;
67
67
import io .github .dsheirer .module .decode .dmr .message .data .lc .full .hytera .HyteraGroupVoiceChannelUser ;
68
68
import io .github .dsheirer .module .decode .dmr .message .data .lc .full .hytera .HyteraUnitToUnitVoiceChannelUser ;
69
+ import io .github .dsheirer .module .decode .dmr .message .data .lc .full .motorola .CapacityMaxVoiceChannelUser ;
69
70
import io .github .dsheirer .module .decode .dmr .message .data .lc .full .motorola .CapacityPlusEncryptedVoiceChannelUser ;
70
71
import io .github .dsheirer .module .decode .dmr .message .data .lc .full .motorola .CapacityPlusWideAreaVoiceChannelUser ;
71
72
import io .github .dsheirer .module .decode .dmr .message .data .lc .full .motorola .MotorolaGroupVoiceChannelUser ;
@@ -142,6 +143,16 @@ public DMRDecoderState(Channel channel, int timeslot, DMRTrafficChannelManager t
142
143
}
143
144
}
144
145
146
+ /**
147
+ * Indicates if the message is valid or if the Ignore CRC Checksums feature is enabled.
148
+ * @param message to check
149
+ * @return true if ignore CRC checksums or if the message is valid, meaning the message has passed CRC check.
150
+ */
151
+ private boolean isValid (IMessage message )
152
+ {
153
+ return mIgnoreCRCChecksums || message .isValid ();
154
+ }
155
+
145
156
/**
146
157
* Indicates if this decoder state has an (optional) traffic channel manager.
147
158
*/
@@ -206,21 +217,21 @@ public void receive(IMessage message)
206
217
{
207
218
if (message .getTimeslot () == getTimeslot ())
208
219
{
209
- if (message instanceof VoiceMessage )
220
+ if (message instanceof VoiceMessage voice )
210
221
{
211
- processVoice (( VoiceMessage ) message );
222
+ processVoice (voice );
212
223
}
213
- else if (message instanceof DataMessage )
224
+ else if (message instanceof DataMessage data )
214
225
{
215
- processData (( DataMessage ) message );
226
+ processData (data );
216
227
}
217
- else if (( message . isValid () || mIgnoreCRCChecksums ) && message instanceof LCMessage )
228
+ else if (isValid (message ) && message instanceof LCMessage lcMessage )
218
229
{
219
- processLinkControl (( LCMessage ) message , false );
230
+ processLinkControl (lcMessage , false );
220
231
}
221
- else if (message . isValid () && message instanceof DMRPacketMessage )
232
+ else if (isValid (message ) && message instanceof DMRPacketMessage packet )
222
233
{
223
- processPacket (( DMRPacketMessage ) message );
234
+ processPacket (packet );
224
235
}
225
236
else if (message instanceof UDTShortMessageService sms )
226
237
{
@@ -232,16 +243,15 @@ else if(message instanceof DMRMessage)
232
243
}
233
244
}
234
245
//SLCO messages on timeslot 0 to catch capacity plus rest channel events
235
- else if (( message . isValid () || mIgnoreCRCChecksums ) && message .getTimeslot () == 0 && message instanceof LCMessage )
246
+ else if (isValid (message ) && message .getTimeslot () == 0 && message instanceof LCMessage lcMessage )
236
247
{
237
- processLinkControl (( LCMessage ) message , false );
248
+ processLinkControl (lcMessage , false );
238
249
}
239
250
240
251
//Pass the message to the network configuration monitor, if this decoder state has a non-null instance
241
- if (mNetworkConfigurationMonitor != null && (message .isValid () || mIgnoreCRCChecksums ) &&
242
- message instanceof DMRMessage )
252
+ if (mNetworkConfigurationMonitor != null && isValid (message ) && message instanceof DMRMessage dmrMessage )
243
253
{
244
- mNetworkConfigurationMonitor .process (( DMRMessage ) message );
254
+ mNetworkConfigurationMonitor .process (dmrMessage );
245
255
}
246
256
}
247
257
@@ -503,7 +513,7 @@ private void processHeader(HeaderMessage header)
503
513
//Process the link control message to get the identifiers
504
514
LCMessage lc = header .getLCMessage ();
505
515
506
- if (lc . isValid ())
516
+ if (isValid (lc ))
507
517
{
508
518
processLinkControl (lc , false );
509
519
}
@@ -520,15 +530,15 @@ private void processData(DataMessage message)
520
530
switch (message .getSlotType ().getDataType ())
521
531
{
522
532
case CSBK :
523
- if (( message . isValid () || mIgnoreCRCChecksums ) && message instanceof CSBKMessage )
533
+ if (isValid (message ) && message instanceof CSBKMessage csbk )
524
534
{
525
- processCSBK (( CSBKMessage ) message );
535
+ processCSBK (csbk );
526
536
}
527
537
break ;
528
538
case VOICE_HEADER :
529
- if (message instanceof HeaderMessage )
539
+ if (message instanceof HeaderMessage header )
530
540
{
531
- processVoiceHeader (( HeaderMessage ) message );
541
+ processVoiceHeader (header );
532
542
}
533
543
break ;
534
544
case USB_DATA :
@@ -539,9 +549,9 @@ private void processData(DataMessage message)
539
549
case MBC_ENC_HEADER :
540
550
case DATA_ENC_HEADER :
541
551
case CHANNEL_CONTROL_ENC_HEADER :
542
- if (message instanceof HeaderMessage )
552
+ if (message instanceof HeaderMessage header )
543
553
{
544
- processHeader (( HeaderMessage ) message );
554
+ processHeader (header );
545
555
}
546
556
break ;
547
557
case SLOT_IDLE :
@@ -579,7 +589,7 @@ private void processTerminator(Terminator terminator)
579
589
580
590
LCMessage lcMessage = terminator .getLCMessage ();
581
591
582
- if (lcMessage . isValid ())
592
+ if (isValid (lcMessage ))
583
593
{
584
594
processLinkControl (lcMessage , true );
585
595
}
@@ -592,7 +602,7 @@ private void processVoiceHeader(HeaderMessage voiceHeader)
592
602
{
593
603
LCMessage lcMessage = voiceHeader .getLCMessage ();
594
604
595
- if (lcMessage . isValid ())
605
+ if (isValid (lcMessage ))
596
606
{
597
607
processLinkControl (lcMessage , false );
598
608
}
@@ -1133,6 +1143,23 @@ private void processLinkControl(LCMessage message, boolean isTerminator)
1133
1143
}
1134
1144
}
1135
1145
break ;
1146
+ case FULL_CAPACITY_MAX_GROUP_VOICE_CHANNEL_USER :
1147
+ if (message instanceof CapacityMaxVoiceChannelUser cmvcu )
1148
+ {
1149
+ if (isTerminator )
1150
+ {
1151
+ getIdentifierCollection ().remove (Role .FROM );
1152
+ getIdentifierCollection ().update (cmvcu .getTalkgroup ());
1153
+ }
1154
+ else
1155
+ {
1156
+ getIdentifierCollection ().update (message .getIdentifiers ());
1157
+ ServiceOptions serviceOptions = cmvcu .getServiceOptions ();
1158
+ updateCurrentCall (serviceOptions .isEncrypted () ? DecodeEventType .CALL_GROUP_ENCRYPTED :
1159
+ DecodeEventType .CALL_GROUP , serviceOptions .toString (), message .getTimestamp ());
1160
+ }
1161
+ }
1162
+ break ;
1136
1163
case FULL_CAPACITY_PLUS_WIDE_AREA_VOICE_CHANNEL_USER :
1137
1164
if (message instanceof CapacityPlusWideAreaVoiceChannelUser )
1138
1165
{
0 commit comments