AP_AIS: log base station report message

This commit is contained in:
Iampete1 2021-08-06 02:14:09 +01:00 committed by Randy Mackay
parent 193ee8d865
commit 88a5372ab7
3 changed files with 100 additions and 0 deletions

View File

@ -343,6 +343,8 @@ bool AP_AIS::payload_decode(const char *payload)
case 2: // Position Report Class A (Assigned schedule)
case 3: // Position Report Class A (Response to interrogation)
return decode_position_report(payload, type);
case 4: // Base Station Report
return decode_base_station_report(payload);
case 5: // Static and Voyage Related Data
return decode_static_and_voyage_data(payload);
@ -440,6 +442,63 @@ bool AP_AIS::decode_position_report(const char *payload, uint8_t type)
return true;
}
bool AP_AIS::decode_base_station_report(const char *payload)
{
if (strlen(payload) != 28) {
return false;
}
uint8_t repeat = get_bits(payload, 6, 7);
uint32_t mmsi = get_bits(payload, 8, 37);
uint16_t year = get_bits(payload, 38, 51);
uint8_t month = get_bits(payload, 52, 55);
uint8_t day = get_bits(payload, 56, 60);
uint8_t hour = get_bits(payload, 61, 65);
uint8_t minute = get_bits(payload, 66, 71);
uint8_t second = get_bits(payload, 72, 77);
bool fix = get_bits(payload, 78, 78);
int32_t lon = get_bits_signed(payload, 79, 106) * ((1.0f / 600000.0f)*1e7);
int32_t lat = get_bits_signed(payload, 107, 133) * ((1.0f / 600000.0f)*1e7);
uint8_t epfd = get_bits(payload, 134, 137);
// 138 - 147: spare
bool raim = get_bits(payload, 148, 148);
uint32_t radio = get_bits(payload, 149, 167);
// log the raw infomation
if ((_log_options & AIS_OPTIONS_LOG_DECODED) != 0) {
struct log_AIS_msg4 pkt {
LOG_PACKET_HEADER_INIT(LOG_AIS_MSG4),
time_us : AP_HAL::micros64(),
repeat : repeat,
mmsi : mmsi,
year : year,
month : month,
day : day,
hour : hour,
minute : minute,
second : second,
fix : fix,
lon : lon,
lat : lat,
epfd : epfd,
raim : raim,
radio : radio
};
AP::logger().WriteBlock(&pkt, sizeof(pkt));
}
uint16_t index;
if (!get_vessel_index(mmsi, index)) {
return true;
}
_list[index].info.lat = lat; // int32_t [degE7] Latitude
_list[index].info.lon = lon; // int32_t [degE7] Longitude
_list[index].last_update_ms = AP_HAL::millis();
return true;
}
bool AP_AIS::decode_static_and_voyage_data(const char *payload)
{
if (strlen(payload) != 71) {

View File

@ -104,6 +104,7 @@ private:
// decode specific message types
bool decode_position_report(const char *payload, uint8_t type) WARN_IF_UNUSED;
bool decode_base_station_report(const char *payload) WARN_IF_UNUSED;
bool decode_static_and_voyage_data(const char *payload) WARN_IF_UNUSED;
// read the specified bits from the char array each char giving 6 bits

View File

@ -5,6 +5,7 @@
#define LOG_IDS_FROM_AIS \
LOG_AIS_RAW_MSG,\
LOG_AIS_MSG1, \
LOG_AIS_MSG4, \
LOG_AIS_MSG5
struct PACKED log_AIS_raw {
@ -36,6 +37,25 @@ struct PACKED log_AIS_msg1 {
uint32_t radio;
};
struct PACKED log_AIS_msg4 {
LOG_PACKET_HEADER;
uint64_t time_us;
uint8_t repeat;
uint32_t mmsi;
uint16_t year;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t minute;
uint8_t second;
uint8_t fix;
int32_t lon;
int32_t lat;
uint8_t epfd;
uint8_t raim;
uint32_t radio;
};
struct PACKED log_AIS_msg5 {
LOG_PACKET_HEADER;
uint64_t time_us;
@ -83,6 +103,24 @@ struct PACKED log_AIS_msg5 {
// @Field: raim: RAIM flag
// @Field: rad: Radio status
// @LoggerMessage: AIS4
// @Description: Contents of 'Base Station Report' AIS message, see: https://gpsd.gitlab.io/gpsd/AIVDM.html#_type_4_base_station_report
// @Field: US: Time since system startup
// @Field: rep: Repeat Indicator
// @Field: mmsi: MMSI
// @Field: year: Year (UTC)
// @Field: mth: Month (UTC)
// @Field: day: Day (UTC)
// @Field: h: Hour (UTC)
// @Field: m: Minute (UTC)
// @Field: s: Second (UTC)
// @Field: fix: Fix quality
// @Field: lon: Longitude
// @Field: lat: Latitude
// @Field: epfd: Type of EPFD
// @Field: raim: RAIM flag
// @Field: rad: Radio status
// @LoggerMessage: AIS5
// @Description: Contents of 'static and voyage related data' AIS message, see: https://gpsd.gitlab.io/gpsd/AIVDM.html#_type_5_static_and_voyage_related_data
// @Field: US: Time since system startup
@ -107,5 +145,7 @@ struct PACKED log_AIS_msg5 {
"AISR", "QBBBZ", "TimeUS,num,total,ID,payload", "s----", "F0000" }, \
{ LOG_AIS_MSG1, sizeof(log_AIS_msg1), \
"AIS1", "QBBIBbHbLLHHBBbI", "US,typ,rep,mmsi,nav,rot,sog,pos,lon,lat,cog,hed,sec,man,raim,rad", "s---------------", "F000000000000000" }, \
{ LOG_AIS_MSG4, sizeof(log_AIS_msg4), \
"AIS4", "QBIHBBBBBBLLBBI", "US,rep,mmsi,year,mth,day,h,m,s,fix,lon,lat,epfd,raim,rad", "s--------------", "F00000000000000" }, \
{ LOG_AIS_MSG5, sizeof(log_AIS_msg5), \
"AIS5", "QBIBINZBHHBBBBZB", "US,rep,mmsi,ver,imo,cal,nam,typ,bow,stn,prt,str,fix,dght,dst,dte", "s-------mmmm-m--", "F------------A--" }