/* ----------------------------------------------------------------------- */ int __stdcall parse_seaway1_6( sixbit *state, seaway1_6 *result ) { int length; int i; int j; if( !state ) return 1; if( !result ) return 1; length = sixbit_length(state); if( (length < 0) || (length > 1008) ) return 2; /* Clear out the structure first */ memset( result, 0, sizeof( seaway1_6 ) ); for( i=0; i<6; i++ ) { if( get_timetag( state, &result->report[i].utc_time ) ) return 3; /* Get the Callsign, convert to ASCII */ j = 0; while( j != 7 ) { result->report[i].station_id[j] = ais2ascii( (char) get_6bit( state, 6 )); j++; } result->report[i].station_id[j] = 0; result->report[i].longitude = (long) get_6bit( state, 25 ); result->report[i].latitude = (long) get_6bit( state, 24 ); result->report[i].flow = (int) get_6bit( state, 14 ); result->report[i].spare = (long) get_6bit( state, 19 ); /* Convert the position to signed value */ result->report[i].longitude *= 10; result->report[i].latitude *= 10; conv_pos( &result->report[i].latitude, &result->report[i].longitude); /* Is there enough data for another? */ if( sixbit_length(state) < 144) break; } return 0; }
int test_ais_24A( void ) { ais_state state; aismsg_24 message; unsigned int result; /* 24A !AIVDM,1,1,,A,H52IRsP518Tj0l59D0000000000,2*45 */ char s[] = "H52IRsP518Tj0l59D0000000000"; /* Clear out the structure first */ memset( &message, 0, sizeof( aismsg_24 )); init_6bit( &state.six_state ); strcpy( state.six_state.bits, s ); state.msgid = (char) get_6bit( &state.six_state, 6 ); if( (result = parse_ais_24( &state, &message )) != 0 ) { fprintf( stderr, "test_ais_24A() failed: error %d\n", result); return 0; } /* Check the results */ if( message.msgid != 24 ) { fprintf( stderr, "test_ais_24A() failed: msgid\n"); return 0; } if( message.flags != 1 ) { fprintf( stderr, "test_ais_24A() failed: flags\n"); return 0; } if( message.repeat != 0 ) { fprintf( stderr, "test_ais_24A() failed: repeat\n"); return 0; } if( message.userid != 338060014 ) { fprintf( stderr, "test_ais_24A() failed: userid\n"); return 0; } if( message.part_number != 0 ) { fprintf( stderr, "test_ais_24A() failed: part_number\n"); return 0; } if( strcmp( message.name, "APRIL MARU@@@@@@@@@@") != 0 ) { fprintf( stderr, "test_ais_24A() failed: name\n"); return 0; } fprintf( stderr, "test_ais_24A() passed\n"); return 1; }
/* ----------------------------------------------------------------------- */ int __stdcall parse_seaway32_1( sixbit *state, seaway32_1 *result ) { int length; if( !state ) return 1; if( !result ) return 1; length = sixbit_length(state); if( (length < 0) || (length > 1008) ) return 2; /* Clear out the structure first */ memset( result, 0, sizeof( seaway32_1 ) ); result->major = (unsigned char) get_6bit( state, 8 ); result->minor = (unsigned char) get_6bit( state, 8 ); result->spare2= (unsigned char) get_6bit( state, 8 ); return 0; }
void* receptor(void* data) { boat* barco = (boat*) data; char msg[256]; ais_state ais; aismsg_1 msg_1; // Solo se contempla mensages de tipo 1. long lat,lon; double lat_dd, long_ddd; float time; while (1) { time = 0; memset( &ais, 0, sizeof( ais_state ) ); pthread_mutex_lock(&lock); if (list != NULL) { list = remove_message(list, msg); pthread_mutex_unlock(&lock); if (assemble_vdm( &ais, msg ) == 0) { ais.msgid = (unsigned char) get_6bit( &ais.six_state, 6 ); if( (ais.msgid == 1)&&(parse_ais_1( &ais, &msg_1 ) == 0) ) { float dist = distancia(barco->cog, msg_1.cog, barco->sog, msg_1.sog, barco->latitude, barco->longitude, msg_1.latitude, msg_1.longitude); lat = msg_1.latitude; lon = msg_1.longitude; conv_pos(&lat, &lon); pos2ddd( lat, lon, &lat_dd, &long_ddd ); printf("*****-----*****-----*****-----*****\n"); printf( "MESSAGE ID: %d\t", ais.msgid ); printf( "USER ID : %ld\n", msg_1.userid ); printf( "SOG : %d\t", msg_1.sog ); printf( "COG : %d\n", msg_1.cog ); printf( "POSITION : Lat %0.6f Lon %0.6f\n", lat_dd, long_ddd ); printf("MDCPA :%0.6f \n", dist); }else printf("ERROR!!\nmsgid:%d msg:%s \n", ais.msgid, msg); } } else { pthread_mutex_unlock(&lock); printf("No hay mensages\n"); sleep(1); time += 1; } usleep(100000); // 0.1 seg time += 0.1; boat_new_pos(barco, time); } }
int test_ais_9( void ) { ais_state state; aismsg_9 message; unsigned int result; /* !AIVDM,1,1,,B,900048wwTcJb0mpF16IobRP2086Q,0*48 */ char s[] = "900048wwTcJb0mpF16IobRP2086Q"; init_6bit( &state.six_state ); strcpy( state.six_state.bits, s ); state.msgid = (char) get_6bit( &state.six_state, 6 ); if( (result = parse_ais_9( &state, &message )) != 0 ) { fprintf( stderr, "test_ais_9() failed: error %d\n", result); return 0; } /* Check the results */ if( message.msgid != 9 ) { fprintf( stderr, "test_ais_9() failed: msgid\n"); return 0; } if( message.repeat != 0 ) { fprintf( stderr, "test_ais_9() failed: repeat\n"); return 0; } if( message.userid != 1059 ) { fprintf( stderr, "test_ais_9() failed: userid\n"); return 0; } if( message.altitude != 4094 ) { fprintf( stderr, "test_ais_9() failed: altitude\n"); return 0; } if( message.sog != 299 ) { fprintf( stderr, "test_ais_9() failed: sog\n"); return 0; } if( message.pos_acc != 0 ) { fprintf( stderr, "test_ais_9() failed: pos_acc\n"); return 0; } if( message.longitude != -44824900 ) { fprintf( stderr, "test_ais_9() failed: longitude\n"); return 0; } if( message.latitude != 23086695 ) { fprintf( stderr, "test_ais_9() failed: latitude\n"); return 0; } if( message.cog != 1962 ) { fprintf( stderr, "test_ais_9() failed: cog\n"); return 0; } if( message.utc_sec != 10 ) { fprintf( stderr, "test_ais_9() failed: utc_sec\n"); return 0; } if( message.regional != 0 ) { fprintf( stderr, "test_ais_9() failed: regional\n"); return 0; } if( message.dte != 1 ) { fprintf( stderr, "test_ais_9() failed: dte\n"); return 0; } if( message.spare != 0 ) { fprintf( stderr, "test_ais_9() failed: spare\n"); return 0; } if( message.assigned != 0 ) { fprintf( stderr, "test_ais_9() failed: assigned\n"); return 0; } if( message.raim != 0 ) { fprintf( stderr, "test_ais_9() failed: raim\n"); return 0; } if( message.comm_state != 0 ) { fprintf( stderr, "test_ais_9() failed: comm_state\n"); return 0; } if( message.comm_state != 0 ) { fprintf( stderr, "test_ais_9() failed: comm_state\n"); return 0; } if( message.sotdma.sync_state != 0 ) { fprintf( stderr, "test_ais_9() failed: sotdma.sync_state\n"); return 0; } if( message.sotdma.slot_timeout != 2 ) { fprintf( stderr, "test_ais_9() failed: sotdma.slot_timeout\n"); return 0; } if( message.sotdma.sub_message != 417 ) { fprintf( stderr, "test_ais_9() failed: sotdma.sub_message\n"); return 0; } fprintf( stderr, "test_ais_9() passed\n"); return 1; }
int test_ais_7( void ) { ais_state state; aismsg_7 message; unsigned int result; /* !AIVDM,1,1,,A,703Owpi9lmaQ,0*3B */ char s[] = "703Owpi9lmaQ"; init_6bit( &state.six_state ); strcpy( state.six_state.bits, s ); state.msgid = (char) get_6bit( &state.six_state, 6 ); if( (result = parse_ais_7( &state, &message )) != 0 ) { fprintf( stderr, "test_ais_7() failed: error %d\n", result); return 0; } /* Check the results */ if( message.msgid != 7 ) { fprintf( stderr, "test_ais_7() failed: msgid\n"); return 0; } if( message.repeat != 0 ) { fprintf( stderr, "test_ais_7() failed: repeat\n"); return 0; } if( message.userid != 3669987 ) { fprintf( stderr, "test_ais_7() failed: userid\n"); return 0; } if( message.spare != 0 ) { fprintf( stderr, "test_ais_7() failed: spare\n"); return 0; } if( message.destid_1 != 309647000 ) { fprintf( stderr, "test_ais_7() failed: destid_1\n"); return 0; } if( message.sequence_1 != 1 ) { fprintf( stderr, "test_ais_7() failed: sequence_1\n"); return 0; } if( message.num_acks != 1 ) { fprintf( stderr, "test_ais_7() failed: num_acks\n"); return 0; } fprintf( stderr, "test_ais_7() passed\n"); return 1; }
int test_ais_5( void ) { ais_state state; aismsg_5 message; unsigned int result; /* !AIVDM,2,1,9,A,55Mf@6P00001MUS;7GQL4hh61L4hh6222222220t41H,0*49 !AIVDM,2,2,9,A,==40HtI4i@E531H1QDTVH51DSCS0,2*16 */ char s[] = "55Mf@6P00001MUS;7GQL4hh61L4hh6222222220t41H==40HtI4i@E531H1QDTVH51DSCS0"; init_6bit( &state.six_state ); strcpy( state.six_state.bits, s ); state.msgid = (char) get_6bit( &state.six_state, 6 ); if( (result = parse_ais_5( &state, &message )) != 0 ) { fprintf( stderr, "test_ais_4() failed: error %d\n", result); return 0; } /* Check the results */ if( message.msgid != 5 ) { fprintf( stderr, "test_ais_5() failed: msgid\n"); return 0; } if( message.repeat != 0 ) { fprintf( stderr, "test_ais_5() failed: repeat\n"); return 0; } if( message.userid != 366710810 ) { fprintf( stderr, "test_ais_5() failed: userid\n"); return 0; } if( message.version != 0 ) { fprintf( stderr, "test_ais_5() failed: version\n"); return 0; } if( message.imo != 0 ) { fprintf( stderr, "test_ais_5() failed: imo\n"); return 0; } if( strcmp(message.callsign, "WYX2158") != 0 ) { fprintf( stderr, "test_ais_5() failed: callsign\n"); return 0; } if( strcmp( message.name, "WALLA WALLA ") != 0 ) { fprintf( stderr, "test_ais_5() failed: name\n"); return 0; } if( message.ship_type != 60 ) { fprintf( stderr, "test_ais_5() failed: ship_type\n"); return 0; } if( message.dim_bow != 32 ) { fprintf( stderr, "test_ais_5() failed: dim_bow\n"); return 0; } if( message.dim_stern != 88 ) { fprintf( stderr, "test_ais_5() failed: dim_stern\n"); return 0; } if( message.dim_port != 13 ) { fprintf( stderr, "test_ais_5() failed: dim_port\n"); return 0; } if( message.dim_starboard != 13 ) { fprintf( stderr, "test_ais_5() failed: dim_starboard\n"); return 0; } if( message.pos_type != 1 ) { fprintf( stderr, "test_ais_5() failed: pos_type\n"); return 0; } if( message.eta != 1596 ) { fprintf( stderr, "test_ais_5() failed: eta\n"); return 0; } if( message.draught != 100 ) { fprintf( stderr, "test_ais_5() failed: draught\n"); return 0; } if( strcmp(message.dest, "SEATTLE FERRY TERMNL") != 0 ) { fprintf( stderr, "test_ais_5() failed: dest\n"); return 0; } if( message.dte != 0 ) { fprintf( stderr, "test_ais_5() failed: dte\n"); return 0; } if( message.spare != 0 ) { fprintf( stderr, "test_ais_5() failed: spare\n"); return 0; } fprintf( stderr, "test_ais_5() passed\n"); return 1; }
int test_ais_4( void ) { ais_state state; aismsg_4 message; unsigned int result; /* !AIVDM,1,1,,A,403OwpiuIKl:Ro=sbvK=CG700<3b,0*5E */ char s[] = "403OwpiuIKl:Ro=sbvK=CG700<3b"; init_6bit( &state.six_state ); strcpy( state.six_state.bits, s ); state.msgid = (char) get_6bit( &state.six_state, 6 ); if( (result = parse_ais_4( &state, &message )) != 0 ) { fprintf( stderr, "test_ais_4() failed: error %d\n", result); return 0; } /* Check the results */ if( message.msgid != 4 ) { fprintf( stderr, "test_ais_4() failed: msgid\n"); return 0; } if( message.repeat != 0 ) { fprintf( stderr, "test_ais_4() failed: repeat\n"); return 0; } if( message.userid != 3669987 ) { fprintf( stderr, "test_ais_4() failed: userid\n"); return 0; } if( message.utc_year != 2006 ) { fprintf( stderr, "test_ais_4() failed: utc_year\n"); return 0; } if( message.utc_month != 5 ) { fprintf( stderr, "test_ais_4() failed: utc_month\n"); return 0; } if( message.utc_day != 23 ) { fprintf( stderr, "test_ais_4() failed: utc_day\n"); return 0; } if( message.utc_hour != 20 ) { fprintf( stderr, "test_ais_4() failed: utc_hour\n"); return 0; } if( message.utc_minute != 10 ) { fprintf( stderr, "test_ais_4() failed: utc_minute\n"); return 0; } if( message.utc_second != 34) { fprintf( stderr, "test_ais_4() failed: utc_second\n"); return 0; } if( message.pos_acc != 1 ) { fprintf( stderr, "test_ais_4() failed: pos_acc\n"); return 0; } if( message.longitude != -73671329 ) { fprintf( stderr, "test_ais_4() failed: longitude\n"); return 0; } if( message.latitude != 28529500 ) { fprintf( stderr, "test_ais_4() failed: utc_latitude\n"); return 0; } if( message.pos_type != 7 ) { fprintf( stderr, "test_ais_4() failed: pos_type\n"); return 0; } if( message.spare != 0 ) { fprintf( stderr, "test_ais_4() failed: spare\n"); return 0; } if( message.raim != 0 ) { fprintf( stderr, "test_ais_4() failed: raim\n"); return 0; } if( message.sync_state != 0 ) { fprintf( stderr, "test_ais_4() failed: sync_state\n"); return 0; } if( message.slot_timeout != 3 ) { fprintf( stderr, "test_ais_4() failed: slot_timeout\n"); return 0; } if( message.sub_message != 234 ) { fprintf( stderr, "test_ais_4() failed: sub_message\n"); return 0; } fprintf( stderr, "test_ais_4() passed\n"); return 1; }
int main( int argc, char *argv[] ) { ais_state ais; char buf[256]; /* AIS message structures, only parse ones with positions */ aismsg_1 msg_1; aismsg_2 msg_2; aismsg_3 msg_3; aismsg_4 msg_4; aismsg_9 msg_9; aismsg_18 msg_18; aismsg_19 msg_19; /* Position in DD.DDDDDD */ double lat_dd; double long_ddd; long userid; /* Clear out the structures */ memset( &ais, 0, sizeof( ais_state ) ); /* Output JSON structure header */ printf("<markers>\n"); /* Process incoming packets from stdin */ while( !feof(stdin) ) { if (fgets( buf, 255, stdin ) == NULL ) break; if (assemble_vdm( &ais, buf ) == 0) { /* Get the 6 bit message id */ ais.msgid = (unsigned char) get_6bit( &ais.six_state, 6 ); /* process message with appropriate parser */ switch( ais.msgid ) { case 1: if( parse_ais_1( &ais, &msg_1 ) == 0 ) { userid = msg_1.userid; pos2ddd( msg_1.latitude, msg_1.longitude, &lat_dd, &long_ddd ); } break; case 2: if( parse_ais_2( &ais, &msg_2 ) == 0 ) { userid = msg_2.userid; pos2ddd( msg_2.latitude, msg_2.longitude, &lat_dd, &long_ddd ); } break; case 3: if( parse_ais_3( &ais, &msg_3 ) == 0 ) { userid = msg_3.userid; pos2ddd( msg_3.latitude, msg_3.longitude, &lat_dd, &long_ddd ); } break; case 4: if( parse_ais_4( &ais, &msg_4 ) == 0 ) { userid = msg_4.userid; pos2ddd( msg_4.latitude, msg_4.longitude, &lat_dd, &long_ddd ); } break; case 9: if( parse_ais_9( &ais, &msg_9 ) == 0 ) { userid = msg_9.userid; pos2ddd( msg_9.latitude, msg_9.longitude, &lat_dd, &long_ddd ); } break; case 18: if( parse_ais_18( &ais, &msg_18 ) == 0 ) { userid = msg_18.userid; pos2ddd( msg_18.latitude, msg_18.longitude, &lat_dd, &long_ddd ); } break; case 19: if( parse_ais_19( &ais, &msg_19 ) == 0 ) { userid = msg_19.userid; pos2ddd( msg_19.latitude, msg_19.longitude, &lat_dd, &long_ddd ); } break; } /* switch msgid */ printf( " <marker lat=\"%0.6f\" lng=\"%0.6f\" />\n", lat_dd, long_ddd ); } /* if */ } /* while */ /* Output JSON footer */ printf("</markers>\n"); return 0; }
/* ----------------------------------------------------------------------- */ int __stdcall parse_pawss2_3( sixbit *state, pawss2_3 *result ) { int length; int i; int j; if( !state ) return 1; if( !result ) return 1; length = sixbit_length(state); if( (length < 0) || (length > 1008) ) return 2; /* Clear out the structure first */ memset( result, 0, sizeof( pawss2_3 ) ); if( get_timetag( state, &result->utc_time ) ) return 3; /* Get the Direction, convert to ASCII */ j = 0; while( j != 16 ) { result->direction[j] = ais2ascii( (char) get_6bit( state, 6 )); j++; } result->direction[j] = 0; result->longitude = (long) get_6bit( state, 25 ); result->latitude = (long) get_6bit( state, 24 ); result->spare2 = (char) get_6bit( state, 3 ); /* Convert the position to signed value */ result->longitude *= 10; result->latitude *= 10; conv_pos( &result->latitude, &result->longitude); for( i=0; i<4; i++ ) { result->report[i].order = (char) get_6bit( state, 5 ); /* Get the Vessel Name, convert to ASCII */ j = 0; while( j != 15 ) { result->report[i].vessel_name[j] = ais2ascii( (char) get_6bit( state, 6 )); j++; } result->report[i].vessel_name[j] = 0; /* Get the Vessel Name, convert to ASCII */ j = 0; while( j != 13 ) { result->report[i].position_name[j] = ais2ascii( (char) get_6bit( state, 6 )); j++; } result->report[i].position_name[j] = 0; result->report[i].time_hh = (char) get_6bit( state, 5 ); result->report[i].time_mm = (char) get_6bit( state, 6 ); result->report[i].spare = (char) get_6bit( state, 6 ); /* Is there enough data for another? */ if( sixbit_length(state) < 184) break; } return 0; }
/* ----------------------------------------------------------------------- */ int __stdcall parse_seaway2_2( sixbit *state, seaway2_2 *result ) { int length; int j; if( !state ) return 1; if( !result ) return 1; length = sixbit_length(state); if( (length < 0) || (length > 1008) ) return 2; /* Clear out the structure first */ memset( result, 0, sizeof( seaway2_2 ) ); if( get_timetag( state, &result->utc_time ) ) return 3; /* Get the vessel name, convert to ASCII */ j = 0; while( j != 15 ) { result->name[j] = ais2ascii( (char) get_6bit( state, 6 )); j++; } result->name[j] = 0; /* Get the Last Location, convert to ASCII */ j = 0; while( j != 7 ) { result->last_location[j] = ais2ascii( (char) get_6bit( state, 6 )); j++; } result->last_location[j] = 0; if( get_timetag( state, &result->last_ata ) ) return 3; /* Get the First Lock, convert to ASCII */ j = 0; while( j != 7 ) { result->first_lock[j] = ais2ascii( (char) get_6bit( state, 6 )); j++; } result->first_lock[j] = 0; if( get_timetag( state, &result->first_eta ) ) return 3; /* Get the Second Lock, convert to ASCII */ j = 0; while( j != 7 ) { result->second_lock[j] = ais2ascii( (char) get_6bit( state, 6 )); j++; } result->second_lock[j] = 0; if( get_timetag( state, &result->second_eta ) ) return 3; /* Get the Delay, convert to ASCII */ j = 0; while( j != 7 ) { result->delay[j] = ais2ascii( (char) get_6bit( state, 6 )); j++; } result->delay[j] = 0; result->spare2 = (int) get_6bit( state, 4 ); return 0; }
int test_ais_20( void ) { ais_state state; aismsg_20 message; unsigned int result; /* !AIVDM,1,1,,A,D03OwphiIN>4,0*25 */ char s[] = "D03OwphiIN>4"; init_6bit( &state.six_state ); strcpy( state.six_state.bits, s ); state.msgid = (char) get_6bit( &state.six_state, 6 ); if( (result = parse_ais_20( &state, &message )) != 0 ) { fprintf( stderr, "test_ais_20() failed: error %d\n", result); return 0; } /* Check the results */ if( message.msgid != 20 ) { fprintf( stderr, "test_ais_20() failed: msgid\n"); return 0; } if( message.repeat != 0 ) { fprintf( stderr, "test_ais_20() failed: repeat\n"); return 0; } if( message.userid != 3669987 ) { fprintf( stderr, "test_ais_20() failed: userid\n"); return 0; } if( message.spare1 != 0 ) { fprintf( stderr, "test_ais_20() failed: spare1\n"); return 0; } if( message.offset1 != 790 ) { fprintf( stderr, "test_ais_20() failed: offset1\n"); return 0; } if( message.slots1 != 5 ) { fprintf( stderr, "test_ais_20() failed: slots1\n"); return 0; } if( message.timeout1 != 7 ) { fprintf( stderr, "test_ais_20() failed: timeout1\n"); return 0; } if( message.increment1 != 225 ) { fprintf( stderr, "test_ais_20() failed: increment1\n"); return 0; } if( message.offset2 != 0 ) { fprintf( stderr, "test_ais_20() failed: offset2\n"); return 0; } if( message.slots2 != 0 ) { fprintf( stderr, "test_ais_20() failed: slots2\n"); return 0; } if( message.timeout2 != 0 ) { fprintf( stderr, "test_ais_20() failed: timeout2\n"); return 0; } if( message.increment2 != 0 ) { fprintf( stderr, "test_ais_20() failed: increment2\n"); return 0; } if( message.offset3 != 0 ) { fprintf( stderr, "test_ais_20() failed: offset3\n"); return 0; } if( message.slots3 != 0 ) { fprintf( stderr, "test_ais_20() failed: slots3\n"); return 0; } if( message.timeout3 != 0 ) { fprintf( stderr, "test_ais_20() failed: timeout3\n"); return 0; } if( message.increment3 != 0 ) { fprintf( stderr, "test_ais_20() failed: increment3\n"); return 0; } if( message.offset4 != 0 ) { fprintf( stderr, "test_ais_20() failed: offset4\n"); return 0; } if( message.slots4 != 0 ) { fprintf( stderr, "test_ais_20() failed: slots4\n"); return 0; } if( message.timeout4 != 0 ) { fprintf( stderr, "test_ais_20() failed: timeout4\n"); return 0; } if( message.increment4 != 0 ) { fprintf( stderr, "test_ais_20() failed: increment4\n"); return 0; } if( message.spare2 != 0 ) { fprintf( stderr, "test_ais_20() failed: spare2\n"); return 0; } fprintf( stderr, "test_ais_20() passed\n"); return 1; }
int test_ais_18( void ) { ais_state state; aismsg_18 message; unsigned int result; /* !AIVDM,1,1,,A,B52IRsP005=abWRnlQP03w`UkP06,0*2A */ char s[] = "B52IRsP005=abWRnlQP03w`UkP06"; init_6bit( &state.six_state ); strcpy( state.six_state.bits, s ); state.msgid = (char) get_6bit( &state.six_state, 6 ); if( (result = parse_ais_18( &state, &message )) != 0 ) { fprintf( stderr, "test_ais_18() failed: error %d\n", result); return 0; } /* Check the results */ if( message.msgid != 18 ) { fprintf( stderr, "test_ais_18() failed: msgid\n"); return 0; } if( message.repeat != 0 ) { fprintf( stderr, "test_ais_18() failed: repeat\n"); return 0; } if( message.userid != 338060014 ) { fprintf( stderr, "test_ais_18() failed: userid\n"); return 0; } if( message.regional1 != 0 ) { fprintf( stderr, "test_ais_18() failed: regional1\n"); return 0; } if( message.sog != 0 ) { fprintf( stderr, "test_ais_18() failed: sog\n"); return 0; } if( message.pos_acc != 0 ) { fprintf( stderr, "test_ais_18() failed: pos_acc\n"); return 0; } if( message.longitude != -93506225 ) { fprintf( stderr, "test_ais_18() failed: longitude\n"); return 0; } if( message.latitude != 11981336 ) { fprintf( stderr, "test_ais_18() failed: latitude\n"); return 0; } if( message.cog != 0 ) { fprintf( stderr, "test_ais_18() failed: cog\n"); return 0; } if( message.true_heading != 511 ) { fprintf( stderr, "test_ais_18() failed: true_heading\n"); return 0; } if( message.utc_sec != 17 ) { fprintf( stderr, "test_ais_18() failed: utc_sec\n"); return 0; } if( message.regional2 != 0 ) { fprintf( stderr, "test_ais_18() failed: regional2\n"); return 0; } if( message.unit_flag != 1 ) { fprintf( stderr, "test_ais_18() failed: unit_flag\n"); return 0; } if( message.display_flag != 0 ) { fprintf( stderr, "test_ais_18() failed: display_flag\n"); return 0; } if( message.dsc_flag != 1 ) { fprintf( stderr, "test_ais_18() failed: dsc_flag\n"); return 0; } if( message.band_flag != 1 ) { fprintf( stderr, "test_ais_18() failed: band_flag\n"); return 0; } if( message.msg22_flag != 1 ) { fprintf( stderr, "test_ais_18() failed: msg22_flag\n"); return 0; } if( message.mode_flag != 0 ) { fprintf( stderr, "test_ais_18() failed: mode_flag\n"); return 0; } if( message.raim != 0 ) { fprintf( stderr, "test_ais_18() failed: raim\n"); return 0; } if( message.comm_state != 1 ) { fprintf( stderr, "test_ais_18() failed: comm_state\n"); return 0; } if( message.itdma.sync_state != 3 ) { fprintf( stderr, "test_ais_18() failed: itdma.sync_state\n"); return 0; } if( message.itdma.slot_inc != 0 ) { fprintf( stderr, "test_ais_18() failed: itdma.slot_inc\n"); return 0; } if( message.itdma.num_slots != 3 ) { fprintf( stderr, "test_ais_18() failed: itdma.num_slots\n"); return 0; } if( message.itdma.keep_flag != 0 ) { fprintf( stderr, "test_ais_18() failed: itdma.keep_flag\n"); return 0; } fprintf( stderr, "test_ais_18() passed\n"); return 1; }
int test_ais_15( void ) { ais_state state; aismsg_15 message; unsigned int result; /* !AIVDM,1,1,,A,?03OwpiGPmD0000,2*07 Note that this is an invlid interrogation, it does not specify a message number or an offset. But it did come from a base station so I believe that it is not noise. */ char s[] = "?03OwpiGPmD0000"; init_6bit( &state.six_state ); strcpy( state.six_state.bits, s ); state.msgid = (char) get_6bit( &state.six_state, 6 ); if( (result = parse_ais_15( &state, &message )) != 0 ) { fprintf( stderr, "test_ais_15() failed: error %d\n", result); return 0; } /* Check the results */ if( message.msgid != 15 ) { fprintf( stderr, "test_ais_15() failed: msgid\n"); return 0; } if( message.repeat != 0 ) { fprintf( stderr, "test_ais_15() failed: repeat\n"); return 0; } if( message.userid != 3669987 ) { fprintf( stderr, "test_ais_15() failed: userid\n"); return 0; } if( message.spare1 != 0 ) { fprintf( stderr, "test_ais_15() failed: spare1\n"); return 0; } if( message.destid1 != 367056192 ) { fprintf( stderr, "test_ais_15() failed: destid1\n"); return 0; } if( message.msgid1_1 != 0 ) { fprintf( stderr, "test_ais_15() failed: msgid1_1\n"); return 0; } if( message.offset1_1 != 0 ) { fprintf( stderr, "test_ais_15() failed: offset1_1\n"); return 0; } if( message.spare2 != 0 ) { fprintf( stderr, "test_ais_15() failed: spare2\n"); return 0; } if( message.msgid1_2 != 0 ) { fprintf( stderr, "test_ais_15() failed: msgid1_2\n"); return 0; } if( message.offset1_2 != 0 ) { fprintf( stderr, "test_ais_15() failed: offset1_2\n"); return 0; } if( message.spare3 != 0 ) { fprintf( stderr, "test_ais_15() failed: spare3\n"); return 0; } if( message.destid2 != 0 ) { fprintf( stderr, "test_ais_15() failed: destid2\n"); return 0; } if( message.msgid2_1 != 0 ) { fprintf( stderr, "test_ais_15() failed: msgid2_1\n"); return 0; } if( message.offset2_1 != 0 ) { fprintf( stderr, "test_ais_15() failed: offset2_1\n"); return 0; } if( message.spare4 != 0 ) { fprintf( stderr, "test_ais_15() failed: spare4\n"); return 0; } fprintf( stderr, "test_ais_15() passed\n"); return 1; }
int test_ais_12( void ) { ais_state state; aismsg_12 message; unsigned int result; /* !AIVDM,1,1,,A,<03Owph00002QG51D85BP1<5BDQP,0*7D */ char s[] = "<03Owph00002QG51D85BP1<5BDQP"; init_6bit( &state.six_state ); strcpy( state.six_state.bits, s ); state.msgid = (char) get_6bit( &state.six_state, 6 ); if( (result = parse_ais_12( &state, &message )) != 0 ) { fprintf( stderr, "test_ais_12() failed: error %d\n", result); return 0; } /* Check the results */ if( message.msgid != 12 ) { fprintf( stderr, "test_ais_12() failed: msgid\n"); return 0; } if( message.repeat != 0 ) { fprintf( stderr, "test_ais_12() failed: repeat\n"); return 0; } if( message.userid != 3669987 ) { fprintf( stderr, "test_ais_12() failed: userid\n"); return 0; } if( message.sequence != 0 ) { fprintf( stderr, "test_ais_12() failed: sequence\n"); return 0; } if( message.destination != 0 ) { fprintf( stderr, "test_ais_12() failed: destination\n"); return 0; } if( message.retransmit != 1 ) { fprintf( stderr, "test_ais_12() failed: retransmit\n"); return 0; } if( message.spare != 0 ) { fprintf( stderr, "test_ais_12() failed: spare\n"); return 0; } if( strcmp( message.message, "!WEATHER ALERT! ") != 0 ) { fprintf( stderr, "test_ais_12() failed: message\n"); return 0; } fprintf( stderr, "test_ais_12() passed\n"); return 1; }
void test_access() { int i; ais_state state; aismsg_8 message; seaway1_3 msg1_3; sixbit *seaway; water_level_report *report; timetag *utc_time; int dac, fi, spare, msgid; unsigned int result; char *test_messages[] = { "!AIVDM,2,1,2,B,8030ojA?0@=DE3@?BDPA3onQiUFttP1Wh01DE3<1EJ?>0onlkUG0e01I,0*3D", "!AIVDM,2,2,2,B,h00,2*7D", "!AIVDM,2,1,9,B,8030ojA?0@=DE3C?B5<00o`O1UA@V01vh01DE63>DB3?5oW@PU?d4P1i,0*55", "!AIVDM,2,2,9,B,h00,2*76", "!AIVDM,2,1,3,B,8030ojA?0@=DE9CD:?B9Fot`9UKQW03Gh01DE9CD6B19?oqHd5H=WP11,0*51", "!AIVDM,2,2,3,B,h00,2*7C" }; memset( &state, 0, sizeof(state) ); for (i=0; i<6; i++) { if( assemble_vdm( &state, test_messages[i] ) == 0) { state.msgid = (char) get_6bit( &state.six_state, 6 ); if (state.msgid != 8) continue; if( (result = parse_ais_8( &state, &message )) != 0 ) { fprintf( stderr, "test_ais_1() failed: error %d\n", result); return; } seaway = get_msg8_data( &message ); dac = message.app_id >> 6; fi = message.app_id & 0x3F; spare = (char) get_6bit( seaway, 2); msgid = (char) get_6bit( seaway, 6); printf( "AppID: 0x%04X\n", message.app_id ); printf( "DAC : 0x%03X (%d)\n", dac, dac ); printf( "FI : 0x%02X (%d)\n", fi, fi); printf( "Spare: 0x%02X (%d)\n", spare, spare ); printf( "msgid: 0x%02X (%d)\n", msgid, msgid ); if ((fi == 1) && (msgid == 3)) { if ( (result = parse_seaway1_3( seaway, &msg1_3)) != 0 ) { fprintf( stderr, "parse_seaway1_3 failed: %d\n", result); } int r; for (r=0; r<6; r++) { report = get_water_level_report( &msg1_3, r); utc_time = get_water_level_utc_time( report ); printf("month : %d\n", utc_time->month); printf("day : %d\n", utc_time->day); printf("hours : %d\n", utc_time->hours); printf("minutes : %d\n", utc_time->minutes); printf("station : %s\n", report->station_id); printf("longitude : %ld\n", report->longitude); printf("latitude : %ld\n", report->latitude); printf("type : %d\n", report->type); printf("level : %d\n", report->level); printf("datum : %d\n", report->datum); printf("spare : %d\n", report->spare); printf("\n\n"); } } memset( &state, 0, sizeof(state) ); } }
/* ----------------------------------------------------------------------- */ int __stdcall parse_seaway2_1( sixbit *state, seaway2_1 *result ) { int length; int i; int j; if( !state ) return 1; if( !result ) return 1; length = sixbit_length(state); if( (length < 0) || (length > 1008) ) return 2; /* Clear out the structure first */ memset( result, 0, sizeof( seaway2_1 ) ); if( get_timetag( state, &result->utc_time ) ) return 3; /* Get the Callsign, convert to ASCII */ j = 0; while( j != 7 ) { result->lock_id[j] = ais2ascii( (char) get_6bit( state, 6 )); j++; } result->lock_id[j] = 0; result->longitude = (long) get_6bit( state, 25 ); result->latitude = (long) get_6bit( state, 24 ); result->spare2 = (int) get_6bit( state, 9 ); /* Convert the position to signed value */ result->longitude *= 10; result->latitude *= 10; conv_pos( &result->latitude, &result->longitude); for( i=0; i<6; i++ ) { /* Get the Callsign, convert to ASCII */ j = 0; while( j != 15 ) { result->schedule[i].name[j] = ais2ascii( (char) get_6bit( state, 6 )); j++; } result->schedule[i].name[j] = 0; result->schedule[i].direction = (char) get_6bit( state, 1 ); if ( get_timetag( state, &result->schedule[i].eta ) ) return 4; result->schedule[i].spare = (int) get_6bit( state, 9 ); /* Is there enough data for another? */ if( sixbit_length(state) < 120) break; } return 0; }
int test_ais_24B( void ) { ais_state state; aismsg_24 message; unsigned int result; /* 24B !AIVDM,1,1,,A,H52IRsTU000000000000000@5120,0*76 */ char s[] = "H52IRsTU000000000000000@5120"; /* Clear out the structure first */ memset( &message, 0, sizeof( aismsg_24 )); init_6bit( &state.six_state ); strcpy( state.six_state.bits, s ); state.msgid = (char) get_6bit( &state.six_state, 6 ); if( (result = parse_ais_24( &state, &message )) != 0 ) { fprintf( stderr, "test_ais_24B() failed: error %d\n", result); return 0; } /* Check the results */ if( message.msgid != 24 ) { fprintf( stderr, "test_ais_24B() failed: msgid\n"); return 0; } if( message.flags != 2 ) { fprintf( stderr, "test_ais_24B() failed: flags\n"); return 0; } if( message.repeat != 0 ) { fprintf( stderr, "test_ais_24B() failed: repeat\n"); return 0; } if( message.userid != 338060014 ) { fprintf( stderr, "test_ais_24B() failed: userid\n"); return 0; } if( message.part_number != 1 ) { fprintf( stderr, "test_ais_24B() failed: part_number\n"); return 0; } if( message.ship_type != 37 ) { fprintf( stderr, "test_ais_24B() failed: ship_type\n"); return 0; } if( strcmp( message.vendor_id, "@@@@@@@") != 0 ) { fprintf( stderr, "test_ais_24B() failed: vendor_id\n"); return 0; } if( strcmp( message.callsign, "@@@@@@@") != 0 ) { fprintf( stderr, "test_ais_24B() failed: callsign\n"); return 0; } if( message.dim_bow != 2 ) { fprintf( stderr, "test_ais_24B() failed: dim_bow\n"); return 0; } if( message.dim_stern != 5 ) { fprintf( stderr, "test_ais_24B() failed: dim_stern\n"); return 0; } if( message.dim_port != 1 ) { fprintf( stderr, "test_ais_24B() failed: dim_port\n"); return 0; } if( message.dim_starboard != 2 ) { fprintf( stderr, "test_ais_24B() failed: dim_starboard\n"); return 0; } if( message.spare != 0 ) { fprintf( stderr, "test_ais_24B() failed: spare\n"); return 0; } fprintf( stderr, "test_ais_24B() passed\n"); return 1; }
int test_ais_1( void ) { ais_state state; aismsg_1 message; unsigned int result; /* !AIVDM,1,1,,B,19NS7Sp02wo?HETKA2K6mUM20<L=,0*27 */ char s[] = "19NS7Sp02wo?HETKA2K6mUM20<L="; init_6bit( &state.six_state ); strcpy( state.six_state.bits, s ); state.msgid = (char) get_6bit( &state.six_state, 6 ); if( (result = parse_ais_1( &state, &message )) != 0 ) { fprintf( stderr, "test_ais_1() failed: error %d\n", result); return 0; } /* Check the results */ if( message.msgid != 1 ) { fprintf( stderr, "test_ais_1() failed: msgid\n"); return 0; } if( message.repeat != 0 ) { fprintf( stderr, "test_ais_1() failed: repeat\n"); return 0; } if( message.userid != 636012431 ) { fprintf( stderr, "test_ais_1() failed: userid/MMSI\n"); return 0; } if( message.nav_status != 8 ) { fprintf( stderr, "test_ais_1() failed: nav_status\n"); return 0; } if( message.rot != 0 ) { fprintf( stderr, "test_ais_1() failed: rot\n"); return 0; } if( message.sog != 191 ) { fprintf( stderr, "test_ais_1() failed: sog\n"); return 0; } if( message.longitude != -73481550 ) { fprintf( stderr, "test_ais_1() failed: longitude\n"); return 0; } if( message.latitude != 28590700 ) { fprintf( stderr, "test_ais_1() failed: latitude\n"); return 0; } if( message.cog != 1750 ) { fprintf( stderr, "test_ais_1() failed: cog\n"); return 0; } if( message.true_heading != 174 ) { fprintf( stderr, "test_ais_1() failed: true_heading\n"); return 0; } if( message.utc_sec != 33 ) { fprintf( stderr, "test_ais_1() failed: utc_sec\n"); return 0; } if( message.regional != 0 ) { fprintf( stderr, "test_ais_1() failed: regional\n"); return 0; } if( message.spare != 0 ) { fprintf( stderr, "test_ais_1() failed: spare\n"); return 0; } if( message.raim != 0 ) { fprintf( stderr, "test_ais_1() failed: raim\n"); return 0; } if( message.sync_state != 0 ) { fprintf( stderr, "test_ais_1() failed: sync_state\n"); return 0; } if( message.slot_timeout != 3 ) { fprintf( stderr, "test_ais_1() failed: slot_timeout\n"); return 0; } if( message.sub_message != 1805 ) { fprintf( stderr, "test_ais_1() failed: sub_message\n"); return 0; } fprintf( stderr, "test_ais_1() passed\n"); return 1; }
int test_ais_3( void ) { ais_state state; aismsg_3 message; unsigned int result; /* !AIVDM,1,1,,B,35Mk33gOkSG?bLtK?;B2dRO`00`A,0*30 */ char s[] = "35Mk33gOkSG?bLtK?;B2dRO`00`A"; init_6bit( &state.six_state ); strcpy( state.six_state.bits, s ); state.msgid = (char) get_6bit( &state.six_state, 6 ); if( (result = parse_ais_3( &state, &message )) != 0 ) { fprintf( stderr, "test_ais_3() failed: error %d\n", result); return 0; } /* Check the results */ if( message.msgid != 3 ) { fprintf( stderr, "test_ais_3() failed: msgid\n"); return 0; } if( message.repeat != 0 ) { fprintf( stderr, "test_ais_3() failed: repeat\n"); return 0; } if( message.userid != 366789390 ) { fprintf( stderr, "test_ais_3() failed: userid/MMSI\n"); return 0; } if( message.nav_status != 15 ) { fprintf( stderr, "test_ais_3() failed: nav_status\n"); return 0; } if( message.rot != 127 ) { fprintf( stderr, "test_ais_3() failed: rot\n"); return 0; } if( message.sog != 227 ) { fprintf( stderr, "test_ais_3() failed: sog\n"); return 0; } if( message.longitude != -73444450 ) { fprintf( stderr, "test_ais_3() failed: longitude\n"); return 0; } if( message.latitude != 28560200 ) { fprintf( stderr, "test_ais_3() failed: latitude\n"); return 0; } if( message.cog != 690 ) { fprintf( stderr, "test_ais_3() failed: cog\n"); return 0; } if( message.true_heading != 79 ) { fprintf( stderr, "test_ais_3() failed: true_heading\n"); return 0; } if( message.utc_sec != 52 ) { fprintf( stderr, "test_ais_3() failed: utc_sec\n"); return 0; } if( message.regional != 0 ) { fprintf( stderr, "test_ais_3() failed: regional\n"); return 0; } if( message.spare != 0 ) { fprintf( stderr, "test_ais_3() failed: spare\n"); return 0; } if( message.raim != 0 ) { fprintf( stderr, "test_ais_3() failed: raim\n"); return 0; } if( message.sync_state != 0 ) { fprintf( stderr, "test_ais_3() failed: sync_state\n"); return 0; } if( message.slot_increment != 161 ) { fprintf( stderr, "test_ais_3() failed: slot_increment\n"); return 0; } if( message.num_slots != 0 ) { fprintf( stderr, "test_ais_3() failed: num_slots\n"); return 0; } if( message.keep != 1 ) { fprintf( stderr, "test_ais_3() failed: keep\n"); return 0; } fprintf( stderr, "test_ais_3() passed\n"); return 1; }
/* ----------------------------------------------------------------------- */ int __stdcall parse_seaway1_1( sixbit *state, seaway1_1 *result ) { int length; int i; int j; if( !state ) return 1; if( !result ) return 1; length = sixbit_length(state); if( (length < 0) || (length > 1008) ) return 2; /* Clear out the structure first */ memset( result, 0, sizeof( seaway1_1 ) ); for( i=0; i<4; i++ ) { if( get_timetag( state, &result->report[i].utc_time ) ) return 3; /* Get the Callsign, convert to ASCII */ j = 0; while( j != 7 ) { result->report[i].station_id[j] = ais2ascii( (char) get_6bit( state, 6 )); j++; } result->report[i].station_id[j] = 0; result->report[i].longitude = (long) get_6bit( state, 25 ); result->report[i].latitude = (long) get_6bit( state, 24 ); result->report[i].speed = (int) get_6bit( state, 10 ); result->report[i].gust = (int) get_6bit( state, 10 ); result->report[i].direction = (int) get_6bit( state, 9 ); result->report[i].pressure = (int) get_6bit( state, 14 ); result->report[i].air_temp = (int) get_6bit( state, 10 ); result->report[i].dew_point = (int) get_6bit( state, 10 ); result->report[i].visibility= (unsigned char) get_6bit( state, 8 ); result->report[i].water_temp= (int) get_6bit( state, 10 ); /* Convert the position to signed value */ result->report[i].longitude *= 10; result->report[i].latitude *= 10; conv_pos( &result->report[i].latitude, &result->report[i].longitude); /* Convert the air_temp, dew_point and water_temp to a signed value */ conv_sign( 0x0200, &result->report[i].air_temp); conv_sign( 0x0200, &result->report[i].dew_point); conv_sign( 0x0200, &result->report[i].water_temp); /* Is there enough data for another? */ if( sixbit_length(state) < 192) break; } return 0; }
int main( int argc, char *argv[] ) { ais_state ais; unsigned int i; /* AIS message structures */ aismsg_1 msg_1; aismsg_2 msg_2; aismsg_3 msg_3; aismsg_4 msg_4; aismsg_5 msg_5; aismsg_12 msg_12; aismsg_18 msg_18; aismsg_24 msg_24; char *test_msgs[] = { "19NS7Sp02wo?HETKA2K6mUM20<L=", "35Mk33gOkSG?bLtK?;B2dRO`00`", "403OwpiuIKl:Ro=sbvK=CG700<3b", "55Mf@6P00001MUS;7GQL4hh61L4hh6222222220t41H==40HtI4i@E531H1QDTVH51DSCS0", "703Owpi9lmaQ", "<03Owph00002QG51D85BP1<5BDQP", "=03Owpi;Eo7`", "?03OwpiGPmD0000", "D03OwphiIN>4", "B52IRsP005=abWRnlQP03w`UkP06", "H52IRsP518Tj0l59D0000000000", "H52IRsTU000000000000000@5120" }; #define NUM_DEMO_MSGS 9 char *demo_msgs[] = { "!AIVDM,1,1,,B,15MqvC0Oh9G?qinK?VlPhA480@2n,0*1F,123,14", "!AIVDM,1,1,,B,15Mf@6P001G?v68K??4SejL<00Sl,0*71", "!AIVDM,1,1,,B,15Mn4kPP01G?qNvK>:grkOv<0<11,0*55", "!AIVDM,1,1,,B,15O1Pv0022o?GeNKB3f7QV2>00SP,0*26", "!AIVDM,1,1,,B,15MqvC0Oh:G?qj0K?Vp@di4B0@5>,0*44", "!AIVDM,1,1,,B,15Mts3?P@;G8RB@JLbgamrBF0H6B,0*16", "$BSVDM,1,1,,B,15MqvC0Oh:G?qj0K?Vp@di4B0@5>,0*5D", "!AIVDM,1,1,,B,15Mts3?P@;G8RB@JLbgamrBF0H6B,0*16,142,aass,12311", "!AIVDM,1,1,,A,34a=CB1001JwAEhHra0qk4wF2000,0*5B" }; if (test_ahextobin() != 1) { exit(-1); } if (test_nmea_next_field() != 1) { exit(-1); } if (test_nmea_uint() != 1) { exit(-1); } if (test_nmea_copy_field() != 1) { exit(-1); } if (test_find_nmea_start() != 1) { exit(-1); } if (test_nmea_checksum() != 1) { exit(-1); } if (test_check_nmea_checksum() != 1) { exit(-1); } if (test_binfrom6bit() != 1) { exit(-1); } if (test_init_6bit() != 1) { exit(-1); } if (test_get_6bit() != 1) { exit(-1); } if (test_ais2ascii() != 1) { exit(-1); } if (test_conv_pos() != 1) { exit(-1); } if (test_pos2ddd() != 1) { exit(-1); } if (test_pos2dmm() != 1) { exit(-1); } if (test_assemble_vdm() != 1) { exit(-1); } if( test_ais_1() != 1 ) { exit(-1); } if( test_ais_3() != 1 ) { exit(-1); } if( test_ais_4() != 1 ) { exit(-1); } if( test_ais_5() != 1 ) { exit(-1); } if( test_ais_7() != 1 ) { exit(-1); } if( test_ais_9() != 1 ) { exit(-1); } if( test_ais_12() != 1 ) { exit(-1); } if( test_ais_13() != 1 ) { exit(-1); } if( test_ais_15() != 1 ) { exit(-1); } if( test_ais_18() != 1 ) { exit(-1); } if( test_ais_20() != 1 ) { exit(-1); } if( test_ais_24A() != 1 ) { exit(-1); } if( test_ais_24B() != 1 ) { exit(-1); } printf("Testing test_msgs\n"); /* Clear out the structures */ memset( &ais, 0, sizeof( ais_state ) ); for (i=0; i<12; i++) { init_6bit( &ais.six_state ); strcpy( ais.six_state.bits, test_msgs[i] ); ais.msgid = (unsigned char) get_6bit( &ais.six_state, 6 ); /* Process the AIS message */ printf( "Message %d\n", ais.msgid ); /* process message with appropriate parser */ switch( ais.msgid ) { case 1: if( parse_ais_1( &ais, &msg_1 ) == 0 ) { /* Do something with results */ printf( "MMSI : %09ld\n", msg_1.userid ); printf( "Lat : %ld\n", msg_1.latitude ); printf( "Long : %ld\n", msg_1.longitude ); } break; case 2: if( parse_ais_2( &ais, &msg_2 ) == 0 ) { /* Do something with results */ printf( "MMSI : %09ld\n", msg_2.userid ); printf( "Lat : %ld\n", msg_1.latitude ); printf( "Long : %ld\n", msg_1.longitude ); } break; case 3: if( parse_ais_3( &ais, &msg_3 ) == 0 ) { /* Do something with results */ printf( "MMSI : %09ld\n", msg_3.userid ); printf( "Lat : %ld\n", msg_1.latitude ); printf( "Long : %ld\n", msg_1.longitude ); } break; case 4: if( parse_ais_4( &ais, &msg_4 ) == 0 ) { /* Do something with results */ printf( "MMSI : %09ld\n", msg_4.userid ); printf( "Lat : %ld\n", msg_1.latitude ); printf( "Long : %ld\n", msg_1.longitude ); } break; case 5: if( parse_ais_5( &ais, &msg_5 ) == 0 ) { /* Do something with results */ printf( "MMSI : %09ld\n", msg_5.userid ); printf( "Callsign : %s\n", msg_5.callsign ); printf( "Name : %s\n", msg_5.name ); printf( "Destination : %s\n", msg_5.dest ); } break; case 12: if (parse_ais_12(&ais, &msg_12) == 0) { /* Do something with the resu;ts */ printf( "MMSI : %09ld\n", msg_12.userid ); printf( "Message : %s\n", msg_12.message ); } break; case 18: if( parse_ais_18( &ais, &msg_18 ) == 0 ) { /* Do something with results */ printf( "MMSI : %09ld\n", msg_18.userid ); printf( "Lat : %ld\n", msg_18.latitude ); printf( "Long : %ld\n", msg_18.longitude ); } break; case 24: if( parse_ais_24( &ais, &msg_24 ) == 0 ) { /* Do something with results */ printf( "MMSI : %09ld\n", msg_24.userid ); if (msg_24.flags & 1) { printf("Name : %s\n", msg_24.name ); } if (msg_24.flags & 2) { printf("Callsign : %s\n", msg_24.callsign ); } } break; } } /* St. Lawrence msg8 testing */ test_seaway(); printf("Testing demo_msgs\n"); /* Clear out the structures */ memset( &ais, 0, sizeof( ais_state ) ); for (i=0; i<NUM_DEMO_MSGS; i++) { if( assemble_vdm( &ais, demo_msgs[i] ) != 0 ) continue; ais.msgid = (unsigned char) get_6bit( &ais.six_state, 6 ); /* Process the AIS message */ printf( "%d of %d: %s\n", i+1, NUM_DEMO_MSGS, demo_msgs[i]); printf( "msgid : %d\n", ais.msgid ); /* process message with appropriate parser */ switch( ais.msgid ) { case 1: if( parse_ais_1( &ais, &msg_1 ) == 0 ) { printf("repeat : %d\n", msg_1.repeat ); printf("userid : %ld\n", msg_1.userid ); printf("nav_status : %d\n", msg_1.nav_status ); printf("rot : %d\n", msg_1.rot ); printf("sog : %d\n", msg_1.sog ); printf("pos_acc : %d\n", msg_1.pos_acc ); printf("longitude : %ld\n", msg_1.longitude ); printf("latitude : %ld\n", msg_1.latitude ); printf("cog : %d\n", msg_1.cog ); printf("true : %d\n", msg_1.true ); printf("utc_sec : %d\n", msg_1.utc_sec ); printf("regional : %d\n", msg_1.regional ); printf("spare : %d\n", msg_1.spare ); printf("raim : %d\n", msg_1.raim ); printf("sync_state : %d\n", msg_1.sync_state ); printf("slot_timeout: %d\n", msg_1.slot_timeout ); printf("sub_message : %d\n", msg_1.sub_message ); } break; case 3: if( parse_ais_3( &ais, &msg_3 ) == 0 ) { printf("repeat : %d\n", msg_3.repeat ); printf("userid : %ld\n", msg_3.userid ); printf("nav_status : %d\n", msg_3.nav_status ); printf("rot : %d\n", msg_3.rot ); printf("sog : %d\n", msg_3.sog ); printf("pos_acc : %d\n", msg_3.pos_acc ); printf("longitude : %ld\n", msg_3.longitude ); printf("latitude : %ld\n", msg_3.latitude ); printf("cog : %d\n", msg_3.cog ); printf("true : %d\n", msg_3.true ); printf("utc_sec : %d\n", msg_3.utc_sec ); printf("regional : %d\n", msg_3.regional ); printf("spare : %d\n", msg_3.spare ); printf("raim : %d\n", msg_3.raim ); printf("sync_state : %d\n", msg_3.sync_state ); printf("slot_inc : %d\n", msg_3.slot_increment ); printf("num_slots : %d\n", msg_3.num_slots ); printf("keep : %d\n", msg_3.keep); } break; }