@@ -341,6 +341,48 @@ namespace AIS
341341 }
342342 }
343343
344+ void JSONAIS::ProcessRadio (const AIS ::Message &msg, int start, int len)
345+ {
346+ unsigned radio_value = msg.getUint (start, len);
347+
348+ if (radio_value != 0 && len == 19 )
349+ {
350+ json.Add (AIS ::KEY_RADIO , (int )radio_value);
351+
352+ unsigned sync_state = (radio_value >> 17 ) & 0x03 ;
353+ json.Add (AIS ::KEY_SYNC_STATE , (int )sync_state);
354+
355+ unsigned slot_timeout = (radio_value >> 14 ) & 0x07 ;
356+ json.Add (AIS ::KEY_SLOT_TIMEOUT , (int )slot_timeout);
357+
358+ unsigned sub_msg = radio_value & 0x3FFF ;
359+
360+ if (slot_timeout == 0 )
361+ {
362+ json.Add (AIS ::KEY_SLOT_OFFSET , (int )sub_msg);
363+ }
364+ else if (slot_timeout == 1 )
365+ {
366+ unsigned utc_hour = (sub_msg >> 9 ) & 0x1F ; // 5 bits (13-9)
367+ unsigned utc_minute = (sub_msg >> 2 ) & 0x7F ; // 7 bits (8-2)
368+
369+ json.Add (AIS ::KEY_UTC_HOUR , (int )utc_hour);
370+ json.Add (AIS ::KEY_UTC_MINUTE , (int )utc_minute);
371+ }
372+ else if (slot_timeout == 2 || slot_timeout == 4 || slot_timeout == 6 )
373+ {
374+ json.Add (AIS ::KEY_SLOT_NUMBER , (int )sub_msg);
375+ }
376+ else if (slot_timeout == 3 || slot_timeout == 5 || slot_timeout == 7 )
377+ {
378+ json.Add (AIS ::KEY_RECEIVED_STATIONS , (int )sub_msg);
379+ }
380+ }
381+ else
382+ {
383+ json.Add (AIS ::KEY_RADIO , 0 );
384+ }
385+ }
344386 void JSONAIS::ProcessMsg (const AIS ::Message &msg, TAG &tag)
345387 {
346388
@@ -388,6 +430,7 @@ namespace AIS
388430 case 1 :
389431 case 2 :
390432 case 3 :
433+ {
391434 E (msg, AIS ::KEY_STATUS , 38 , 4 , AIS ::KEY_STATUS_TEXT , &JSON_MAP_STATUS );
392435 TURN (msg, AIS ::KEY_TURN , 42 , 8 );
393436 UL (msg, AIS ::KEY_SPEED , 50 , 10 , 0 .1f , 0 , 1023 );
@@ -400,8 +443,10 @@ namespace AIS
400443 E (msg, AIS ::KEY_MANEUVER , 143 , 2 );
401444 X (msg, AIS ::KEY_SPARE , 145 , 3 );
402445 B (msg, AIS ::KEY_RAIM , 148 , 1 );
403- U (msg, AIS ::KEY_RADIO , 149 , MIN (19 , MAX (msg.getLength () - 149 , 0 )));
446+
447+ ProcessRadio (msg, 149 , MAX (MIN (19 , msg.getLength () - 149 ),0 ));
404448 break ;
449+ }
405450 case 4 :
406451 case 11 :
407452 TIMESTAMP (msg, AIS ::KEY_TIMESTAMP , 38 , 40 , timestamp);
@@ -417,7 +462,8 @@ namespace AIS
417462 E (msg, AIS ::KEY_EPFD , 134 , 4 , AIS ::KEY_EPFD_TEXT , &JSON_MAP_EPFD );
418463 X (msg, AIS ::KEY_SPARE , 138 , 10 );
419464 B (msg, AIS ::KEY_RAIM , 148 , 1 );
420- U (msg, AIS ::KEY_RADIO , 149 , 19 );
465+
466+ ProcessRadio (msg, 149 , MAX (MIN (19 , msg.getLength () - 149 ),0 ));
421467 break ;
422468 case 5 :
423469 U (msg, AIS ::KEY_AIS_VERSION , 38 , 2 );
0 commit comments