1 /*
2  * This is code generated by jsongen.py. Do not hand-hack it!
3  */
4  #define NITEMS(x) (int)(sizeof(x)/sizeof(x[0]))
5 
6 
7     const struct json_attr_t json_ais1[] = {
8 	AIS_HEADER
9 	{"status",        t_uinteger,  .addr.uinteger = &ais->type1.status,
10                                        .dflt.uinteger = 0},
11 	{"status_text",   t_ignore},
12 	{"turn",          t_integer,   .addr.integer = &ais->type1.turn,
13                                        .dflt.integer = AIS_TURN_NOT_AVAILABLE},
14 	{"speed",         t_uinteger,  .addr.uinteger = &ais->type1.speed,
15                                        .dflt.uinteger = AIS_SPEED_NOT_AVAILABLE},
16 	{"accuracy",      t_boolean,   .addr.boolean = &ais->type1.accuracy,
17                                        .dflt.boolean = false},
18 	{"lon",           t_integer,   .addr.integer = &ais->type1.lon,
19                                        .dflt.integer = AIS_LON_NOT_AVAILABLE},
20 	{"lat",           t_integer,   .addr.integer = &ais->type1.lat,
21                                        .dflt.integer = AIS_LAT_NOT_AVAILABLE},
22 	{"course",        t_uinteger,  .addr.uinteger = &ais->type1.course,
23                                        .dflt.uinteger = AIS_COURSE_NOT_AVAILABLE},
24 	{"heading",       t_uinteger,  .addr.uinteger = &ais->type1.heading,
25                                        .dflt.uinteger = AIS_HEADING_NOT_AVAILABLE},
26 	{"second",        t_uinteger,  .addr.uinteger = &ais->type1.second,
27                                        .dflt.uinteger = AIS_SEC_NOT_AVAILABLE},
28 	{"maneuver",      t_uinteger,  .addr.uinteger = &ais->type1.maneuver,
29                                        .dflt.uinteger = AIS_SEC_INOPERATIVE},
30 	{"raim",          t_boolean,   .addr.boolean = &ais->type1.raim,
31                                        .dflt.boolean = false},
32 	{"radio",         t_uinteger,  .addr.uinteger = &ais->type1.radio,
33                                        .dflt.uinteger = 0},
34         {NULL}
35     };
36 
37     char timestamp[JSON_VAL_MAX+1];
38     const struct json_attr_t json_ais4[] = {
39 	AIS_HEADER
40 	{"timestamp",     t_string,    .addr.string = timestamp,
41                                        .len = sizeof(timestamp)},
42 	{"accuracy",      t_boolean,   .addr.boolean = &ais->type4.accuracy,
43                                        .dflt.boolean = true},
44 	{"lon",           t_integer,   .addr.integer = &ais->type4.lon,
45                                        .dflt.integer = AIS_LON_NOT_AVAILABLE},
46 	{"lat",           t_integer,   .addr.integer = &ais->type4.lat,
47                                        .dflt.integer = AIS_LAT_NOT_AVAILABLE},
48 	{"epfd",          t_uinteger,  .addr.uinteger = &ais->type4.epfd,
49                                        .dflt.uinteger = 0},
50 	{"epfd_text",   t_ignore},
51 	{"raim",          t_boolean,   .addr.boolean = &ais->type4.raim,
52                                        .dflt.boolean = false},
53 	{"radio",         t_uinteger,  .addr.uinteger = &ais->type4.radio,
54                                        .dflt.uinteger = 0},
55         {NULL}
56     };
57 
58     char eta[JSON_VAL_MAX+1];
59     const struct json_attr_t json_ais5[] = {
60 	AIS_HEADER
61 	{"imo",           t_uinteger,  .addr.uinteger = &ais->type5.imo,
62                                        .dflt.uinteger = 0},
63 	{"ais_version",   t_uinteger,  .addr.uinteger = &ais->type5.ais_version,
64                                        .dflt.uinteger = 0},
65 	{"callsign",      t_string,    .addr.string = ais->type5.callsign,
66                                        .len = sizeof(ais->type5.callsign)},
67 	{"shipname",      t_string,    .addr.string = ais->type5.shipname,
68                                        .len = sizeof(ais->type5.shipname)},
69 	{"shiptype",      t_uinteger,  .addr.uinteger = &ais->type5.shiptype,
70                                        .dflt.uinteger = 0},
71 	{"shiptype_text",   t_ignore},
72 	{"to_bow",        t_uinteger,  .addr.uinteger = &ais->type5.to_bow,
73                                        .dflt.uinteger = 0},
74 	{"to_stern",      t_uinteger,  .addr.uinteger = &ais->type5.to_stern,
75                                        .dflt.uinteger = 0},
76 	{"to_port",       t_uinteger,  .addr.uinteger = &ais->type5.to_port,
77                                        .dflt.uinteger = 0},
78 	{"to_starboard",  t_uinteger,  .addr.uinteger = &ais->type5.to_starboard,
79                                        .dflt.uinteger = 0},
80 	{"epfd",          t_uinteger,  .addr.uinteger = &ais->type5.epfd,
81                                        .dflt.uinteger = 0},
82 	{"epfd_text",   t_ignore},
83 	{"eta",           t_string,    .addr.string = eta,
84                                        .len = sizeof(eta)},
85 	{"draught",       t_uinteger,  .addr.uinteger = &ais->type5.draught,
86                                        .dflt.uinteger = 0},
87 	{"destination",   t_string,    .addr.string = ais->type5.destination,
88                                        .len = sizeof(ais->type5.destination)},
89 	{"dte",           t_uinteger,  .addr.uinteger = &ais->type5.dte,
90                                        .dflt.uinteger = 1},
91         {NULL}
92     };
93 
94     char data[JSON_VAL_MAX+1];
95     const struct json_attr_t json_ais6[] = {
96 	AIS_HEADER
97 	AIS_TYPE6
98 	{"data",          t_string,    .addr.string = data,
99                                        .len = sizeof(data)},
100         {NULL}
101     };
102 
103     const struct json_attr_t json_ais6_fid10[] = {
104 	AIS_HEADER
105 	AIS_TYPE6
106 	{"ana_int",       t_uinteger,  .addr.uinteger = &ais->type6.dac235fid10.ana_int,
107                                        .dflt.uinteger = 0},
108 	{"ana_ext1",      t_uinteger,  .addr.uinteger = &ais->type6.dac235fid10.ana_ext1,
109                                        .dflt.uinteger = 0},
110 	{"ana_ext2",      t_uinteger,  .addr.uinteger = &ais->type6.dac235fid10.ana_ext2,
111                                        .dflt.uinteger = 0},
112 	{"racon",         t_uinteger,  .addr.uinteger = &ais->type6.dac235fid10.racon,
113                                        .dflt.uinteger = 0},
114 	{"racon_text",   t_ignore},
115 	{"light",         t_uinteger,  .addr.uinteger = &ais->type6.dac235fid10.light,
116                                        .dflt.uinteger = 0},
117 	{"light_text",   t_ignore},
118 	{"alarm",         t_boolean,   .addr.boolean = &ais->type6.dac235fid10.alarm,
119                                        .dflt.boolean = false},
120 	{"stat_ext",      t_uinteger,  .addr.uinteger = &ais->type6.dac235fid10.stat_ext,
121                                        .dflt.uinteger = 0},
122 	{"off_pos",       t_boolean,   .addr.boolean = &ais->type6.dac235fid10.off_pos,
123                                        .dflt.boolean = false},
124         {NULL}
125     };
126 
127     char departure[JSON_VAL_MAX+1];
128     const struct json_attr_t json_ais6_fid12[] = {
129 	AIS_HEADER
130 	AIS_TYPE6
131 	{"lastport",      t_string,    .addr.string = ais->type6.dac1fid12.lastport,
132                                        .len = sizeof(ais->type6.dac1fid12.lastport)},
133 	{"departure",     t_string,    .addr.string = departure,
134                                        .len = sizeof(departure)},
135 	{"nextport",      t_string,    .addr.string = ais->type6.dac1fid12.nextport,
136                                        .len = sizeof(ais->type6.dac1fid12.nextport)},
137 	{"eta",           t_string,    .addr.string = eta,
138                                        .len = sizeof(eta)},
139 	{"dangerous",     t_string,    .addr.string = ais->type6.dac1fid12.dangerous,
140                                        .len = sizeof(ais->type6.dac1fid12.dangerous)},
141 	{"imdcat",        t_string,    .addr.string = ais->type6.dac1fid12.imdcat,
142                                        .len = sizeof(ais->type6.dac1fid12.imdcat)},
143 	{"unid",          t_uinteger,  .addr.uinteger = &ais->type6.dac1fid12.unid,
144                                        .dflt.uinteger = 0},
145 	{"amount",        t_uinteger,  .addr.uinteger = &ais->type6.dac1fid12.amount,
146                                        .dflt.uinteger = 0},
147 	{"unit",          t_uinteger,  .addr.uinteger = &ais->type6.dac1fid12.unit,
148                                        .dflt.uinteger = 0},
149         {NULL}
150     };
151 
152     const struct json_attr_t json_ais6_fid15[] = {
153 	AIS_HEADER
154 	AIS_TYPE6
155 	{"airdraught",    t_uinteger,  .addr.uinteger = &ais->type6.dac1fid15.airdraught,
156                                        .dflt.uinteger = 0},
157         {NULL}
158     };
159 
160     const struct json_attr_t json_ais6_fid16[] = {
161 	AIS_HEADER
162 	AIS_TYPE6
163 	{"persons",       t_uinteger,  .addr.uinteger = &ais->type6.dac1fid16.persons,
164                                        .dflt.uinteger = 0},
165         {NULL}
166     };
167 
168     char arrival[JSON_VAL_MAX+1];
169     const struct json_attr_t json_ais6_fid18[] = {
170 	AIS_HEADER
171 	AIS_TYPE6
172 	{"linkage",       t_uinteger,  .addr.uinteger = &ais->type6.dac1fid18.linkage,
173                                        .dflt.uinteger = 0},
174 	{"arrival",       t_string,    .addr.string = arrival,
175                                        .len = sizeof(arrival)},
176 	{"portname",      t_string,    .addr.string = ais->type6.dac1fid18.portname,
177                                        .len = sizeof(ais->type6.dac1fid18.portname)},
178 	{"destination",   t_string,    .addr.string = ais->type6.dac1fid18.destination,
179                                        .len = sizeof(ais->type6.dac1fid18.destination)},
180 	{"lon",           t_integer,   .addr.integer = &ais->type6.dac1fid18.lon,
181                                        .dflt.integer = AIS_LON3_NOT_AVAILABLE},
182 	{"lat",           t_integer,   .addr.integer = &ais->type6.dac1fid18.lat,
183                                        .dflt.integer = AIS_LAT3_NOT_AVAILABLE},
184         {NULL}
185     };
186 
187     char berth_name[JSON_VAL_MAX+1];
188     const struct json_attr_t json_ais6_fid20[] = {
189 	AIS_HEADER
190 	AIS_TYPE6
191 	{"linkage",       t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.linkage,
192                                        .dflt.uinteger = 0},
193 	{"berth_length",  t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.berth_length,
194                                        .dflt.uinteger = 0},
195 	{"berth_depth",   t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.berth_depth,
196                                        .dflt.uinteger = 0},
197 	{"position",      t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.position,
198                                        .dflt.uinteger = 0},
199 	{"position_text",   t_ignore},
200 	{"arrival",       t_string,    .addr.string = arrival,
201                                        .len = sizeof(arrival)},
202 	{"availability",  t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.availability,
203                                        .dflt.uinteger = 0},
204 	{"agent",         t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.agent,
205                                        .dflt.uinteger = 0},
206 	{"fuel",          t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.fuel,
207                                        .dflt.uinteger = 0},
208 	{"chandler",      t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.chandler,
209                                        .dflt.uinteger = 0},
210 	{"stevedore",     t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.stevedore,
211                                        .dflt.uinteger = 0},
212 	{"electrical",    t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.electrical,
213                                        .dflt.uinteger = 0},
214 	{"water",         t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.water,
215                                        .dflt.uinteger = 0},
216 	{"customs",       t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.customs,
217                                        .dflt.uinteger = 0},
218 	{"cartage",       t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.cartage,
219                                        .dflt.uinteger = 0},
220 	{"crane",         t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.crane,
221                                        .dflt.uinteger = 0},
222 	{"lift",          t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.lift,
223                                        .dflt.uinteger = 0},
224 	{"medical",       t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.medical,
225                                        .dflt.uinteger = 0},
226 	{"navrepair",     t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.navrepair,
227                                        .dflt.uinteger = 0},
228 	{"provisions",    t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.provisions,
229                                        .dflt.uinteger = 0},
230 	{"shiprepair",    t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.shiprepair,
231                                        .dflt.uinteger = 0},
232 	{"surveyor",      t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.surveyor,
233                                        .dflt.uinteger = 0},
234 	{"steam",         t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.steam,
235                                        .dflt.uinteger = 0},
236 	{"tugs",          t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.tugs,
237                                        .dflt.uinteger = 0},
238 	{"solidwaste",    t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.solidwaste,
239                                        .dflt.uinteger = 0},
240 	{"liquidwaste",   t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.liquidwaste,
241                                        .dflt.uinteger = 0},
242 	{"hazardouswaste",t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.hazardouswaste,
243                                        .dflt.uinteger = 0},
244 	{"ballast",       t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.ballast,
245                                        .dflt.uinteger = 0},
246 	{"additional",    t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.additional,
247                                        .dflt.uinteger = 0},
248 	{"regional1",     t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.regional1,
249                                        .dflt.uinteger = 0},
250 	{"regional2",     t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.regional2,
251                                        .dflt.uinteger = 0},
252 	{"future1",       t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.future1,
253                                        .dflt.uinteger = 0},
254 	{"future2",       t_uinteger,  .addr.uinteger = &ais->type6.dac1fid20.future2,
255                                        .dflt.uinteger = 0},
256 	{"berth_name",    t_string,    .addr.string = berth_name,
257                                        .len = sizeof(berth_name)},
258 	{"berth_lon",     t_integer,   .addr.integer = &ais->type6.dac1fid20.berth_lon,
259                                        .dflt.integer = AIS_LON3_NOT_AVAILABLE},
260 	{"berth_lat",     t_integer,   .addr.integer = &ais->type6.dac1fid20.berth_lat,
261                                        .dflt.integer = AIS_LAT3_NOT_AVAILABLE},
262         {NULL}
263     };
264 
265     const struct json_attr_t json_ais6_fid21[] = {
266 	AIS_HEADER
267 	AIS_TYPE6
268 	{"country",       t_string,    .addr.string = ais->type6.dac200fid21.country,
269                                        .len = sizeof(ais->type6.dac200fid21.country)},
270 	{"locode",        t_string,    .addr.string = ais->type6.dac200fid21.locode,
271                                        .len = sizeof(ais->type6.dac200fid21.locode)},
272 	{"section",       t_string,    .addr.string = ais->type6.dac200fid21.section,
273                                        .len = sizeof(ais->type6.dac200fid21.section)},
274 	{"terminal",      t_string,    .addr.string = ais->type6.dac200fid21.terminal,
275                                        .len = sizeof(ais->type6.dac200fid21.terminal)},
276 	{"hectometre",    t_string,    .addr.string = ais->type6.dac200fid21.hectometre,
277                                        .len = sizeof(ais->type6.dac200fid21.hectometre)},
278 	{"eta",           t_string,    .addr.string = eta,
279                                        .len = sizeof(eta)},
280 	{"tugs",          t_uinteger,  .addr.uinteger = &ais->type6.dac200fid21.tugs,
281                                        .dflt.uinteger = 0},
282 	{"airdraught",    t_uinteger,  .addr.uinteger = &ais->type6.dac200fid21.airdraught,
283                                        .dflt.uinteger = 0},
284         {NULL}
285     };
286 
287     char rta[JSON_VAL_MAX+1];
288     const struct json_attr_t json_ais6_fid22[] = {
289 	AIS_HEADER
290 	AIS_TYPE6
291 	{"country",       t_string,    .addr.string = ais->type6.dac200fid22.country,
292                                        .len = sizeof(ais->type6.dac200fid22.country)},
293 	{"locode",        t_string,    .addr.string = ais->type6.dac200fid22.locode,
294                                        .len = sizeof(ais->type6.dac200fid22.locode)},
295 	{"section",       t_string,    .addr.string = ais->type6.dac200fid22.section,
296                                        .len = sizeof(ais->type6.dac200fid22.section)},
297 	{"terminal",      t_string,    .addr.string = ais->type6.dac200fid22.terminal,
298                                        .len = sizeof(ais->type6.dac200fid22.terminal)},
299 	{"hectometre",    t_string,    .addr.string = ais->type6.dac200fid22.hectometre,
300                                        .len = sizeof(ais->type6.dac200fid22.hectometre)},
301 	{"rta",           t_string,    .addr.string = rta,
302                                        .len = sizeof(rta)},
303 	{"status",        t_uinteger,  .addr.uinteger = &ais->type6.dac200fid22.status,
304                                        .dflt.uinteger = DAC200FID22_STATUS_NOT_AVAILABLE},
305         {NULL}
306     };
307 
308     const struct json_attr_t json_ais6_fid25_cargos_subtype[] = {
309 	{"code",          t_uinteger,STRUCTOBJECT(struct cargo_t, code),
310                                        .dflt.uinteger = 0},
311 	{"subtype",       t_uinteger,STRUCTOBJECT(struct cargo_t, subtype),
312                                        .dflt.uinteger = 0},
313         {NULL}
314     };
315     const struct json_attr_t json_ais6_fid25[] = {
316 	AIS_HEADER
317 	AIS_TYPE6
318 	{"unit",          t_uinteger,  .addr.uinteger = &ais->type6.dac1fid25.unit,
319                                        .dflt.uinteger = 0},
320 	{"amount",        t_uinteger,  .addr.uinteger = &ais->type6.dac1fid25.amount,
321                                        .dflt.uinteger = 0},
322 	{"cargos",        t_array,     STRUCTARRAY(ais->type6.dac1fid25.cargos, json_ais6_fid25_cargos_subtype, &ais->type6.dac1fid25.ncargos)},
323         {NULL}
324     };
325 
326     char start[JSON_VAL_MAX+1];
327     const struct json_attr_t json_ais6_fid28_waypoints_subtype[] = {
328 	{"lon",           t_integer, STRUCTOBJECT(struct waypoint_t, lon),
329                                        .dflt.integer = AIS_LON4_NOT_AVAILABLE},
330 	{"lat",           t_integer, STRUCTOBJECT(struct waypoint_t, lat),
331                                        .dflt.integer = AIS_LAT4_NOT_AVAILABLE},
332         {NULL}
333     };
334     const struct json_attr_t json_ais6_fid28[] = {
335 	AIS_HEADER
336 	AIS_TYPE6
337 	{"linkage",       t_uinteger,  .addr.uinteger = &ais->type6.dac1fid28.linkage,
338                                        .dflt.uinteger = 0},
339 	{"sender",        t_uinteger,  .addr.uinteger = &ais->type6.dac1fid28.sender,
340                                        .dflt.uinteger = 0},
341 	{"rtype",         t_uinteger,  .addr.uinteger = &ais->type6.dac1fid28.rtype,
342                                        .dflt.uinteger = 0},
343 	{"rtype_text",   t_ignore},
344 	{"start",         t_string,    .addr.string = start,
345                                        .len = sizeof(start)},
346 	{"duration",      t_uinteger,  .addr.uinteger = &ais->type6.dac1fid28.duration,
347                                        .dflt.uinteger = 0},
348 	{"waypoints",     t_array,     STRUCTARRAY(ais->type6.dac1fid28.waypoints, json_ais6_fid28_waypoints_subtype, &ais->type6.dac1fid28.waycount)},
349         {NULL}
350     };
351 
352     const struct json_attr_t json_ais6_fid30[] = {
353 	AIS_HEADER
354 	AIS_TYPE6
355 	{"linkage",       t_uinteger,  .addr.uinteger = &ais->type6.dac1fid30.linkage,
356                                        .dflt.uinteger = 0},
357 	{"text",          t_string,    .addr.string = ais->type6.dac1fid30.text,
358                                        .len = sizeof(ais->type6.dac1fid30.text)},
359         {NULL}
360     };
361 
362     const struct json_attr_t json_ais6_fid32_tidals_subtype[] = {
363 	{"lon",           t_integer, STRUCTOBJECT(struct tidal_t, lon),
364                                        .dflt.integer = AIS_LON3_NOT_AVAILABLE},
365 	{"lat",           t_integer, STRUCTOBJECT(struct tidal_t, lat),
366                                        .dflt.integer = AIS_LAT3_NOT_AVAILABLE},
367 	{"from_hour",     t_uinteger,STRUCTOBJECT(struct tidal_t, from_hour),
368                                        .dflt.uinteger = AIS_MONTH_NOT_AVAILABLE},
369 	{"from_min",      t_uinteger,STRUCTOBJECT(struct tidal_t, from_min),
370                                        .dflt.uinteger = AIS_MINUTE_NOT_AVAILABLE},
371 	{"to_hour",       t_uinteger,STRUCTOBJECT(struct tidal_t, to_hour),
372                                        .dflt.uinteger = AIS_HOUR_NOT_AVAILABLE},
373 	{"to_min",        t_uinteger,STRUCTOBJECT(struct tidal_t, to_min),
374                                        .dflt.uinteger = AIS_MINUTE_NOT_AVAILABLE},
375 	{"cdir",          t_uinteger,STRUCTOBJECT(struct tidal_t, cdir),
376                                        .dflt.uinteger = DAC1FID32_CDIR_NOT_AVAILABLE},
377 	{"cspeed",        t_uinteger,STRUCTOBJECT(struct tidal_t, cspeed),
378                                        .dflt.uinteger = DAC1FID32_CSPEED_NOT_AVAILABLE},
379         {NULL}
380     };
381     const struct json_attr_t json_ais6_fid32[] = {
382 	AIS_HEADER
383 	AIS_TYPE6
384 	{"month",         t_uinteger,  .addr.uinteger = &ais->type6.dac1fid32.month,
385                                        .dflt.uinteger = AIS_MONTH_NOT_AVAILABLE},
386 	{"day",           t_uinteger,  .addr.uinteger = &ais->type6.dac1fid32.day,
387                                        .dflt.uinteger = AIS_DAY_NOT_AVAILABLE},
388 	{"tidals",        t_array,     STRUCTARRAY(ais->type6.dac1fid32.tidals, json_ais6_fid32_tidals_subtype, &ais->type6.dac1fid32.ntidals)},
389         {NULL}
390     };
391 
392     const struct json_attr_t json_ais6_fid55[] = {
393 	AIS_HEADER
394 	AIS_TYPE6
395 	{"crew",          t_uinteger,  .addr.uinteger = &ais->type6.dac200fid55.crew,
396                                        .dflt.uinteger = DAC200FID55_COUNT_NOT_AVAILABLE},
397 	{"passengers",    t_uinteger,  .addr.uinteger = &ais->type6.dac200fid55.passengers,
398                                        .dflt.uinteger = DAC200FID55_COUNT_NOT_AVAILABLE},
399 	{"personnel",     t_uinteger,  .addr.uinteger = &ais->type6.dac200fid55.personnel,
400                                        .dflt.uinteger = DAC200FID55_COUNT_NOT_AVAILABLE},
401         {NULL}
402     };
403 
404     const struct json_attr_t json_ais7[] = {
405 	AIS_HEADER
406 	{"mmsi1",         t_uinteger,  .addr.uinteger = &ais->type7.mmsi1,
407                                        .dflt.uinteger = 0},
408 	{"mmsi2",         t_uinteger,  .addr.uinteger = &ais->type7.mmsi2,
409                                        .dflt.uinteger = 0},
410 	{"mmsi3",         t_uinteger,  .addr.uinteger = &ais->type7.mmsi3,
411                                        .dflt.uinteger = 0},
412 	{"mmsi4",         t_uinteger,  .addr.uinteger = &ais->type7.mmsi4,
413                                        .dflt.uinteger = 0},
414 	{"seqno1",        t_uinteger,  .addr.uinteger = &ais->type7.seqno1,
415                                        .dflt.uinteger = 0},
416 	{"seqno2",        t_uinteger,  .addr.uinteger = &ais->type7.seqno2,
417                                        .dflt.uinteger = 0},
418 	{"seqno3",        t_uinteger,  .addr.uinteger = &ais->type7.seqno3,
419                                        .dflt.uinteger = 0},
420 	{"seqno4",        t_uinteger,  .addr.uinteger = &ais->type7.seqno4,
421                                        .dflt.uinteger = 0},
422         {NULL}
423     };
424 
425     const struct json_attr_t json_ais8[] = {
426 	AIS_HEADER
427 	AIS_TYPE8
428 	{"data",          t_string,    .addr.string = data,
429                                        .len = sizeof(data)},
430         {NULL}
431     };
432 
433     const struct json_attr_t json_ais8_fid10[] = {
434 	AIS_HEADER
435 	AIS_TYPE8
436 	{"vin",           t_string,    .addr.string = ais->type8.dac200fid10.vin,
437                                        .len = sizeof(ais->type8.dac200fid10.vin)},
438 	{"length",        t_uinteger,  .addr.uinteger = &ais->type8.dac200fid10.length,
439                                        .dflt.uinteger = 0},
440 	{"beam",          t_uinteger,  .addr.uinteger = &ais->type8.dac200fid10.beam,
441                                        .dflt.uinteger = 0},
442 	{"shiptype",      t_uinteger,  .addr.uinteger = &ais->type8.dac200fid10.shiptype,
443                                        .dflt.uinteger = 0},
444 	{"shiptype_text",   t_ignore},
445 	{"hazard",        t_uinteger,  .addr.uinteger = &ais->type8.dac200fid10.hazard,
446                                        .dflt.uinteger = 0},
447 	{"hazard_text",   t_ignore},
448 	{"draught",       t_uinteger,  .addr.uinteger = &ais->type8.dac200fid10.draught,
449                                        .dflt.uinteger = 0},
450 	{"loaded",        t_uinteger,  .addr.uinteger = &ais->type8.dac200fid10.loaded,
451                                        .dflt.uinteger = 0},
452 	{"loaded_text",   t_ignore},
453 	{"speed_q",       t_boolean,   .addr.boolean = &ais->type8.dac200fid10.speed_q,
454                                        .dflt.boolean = false},
455 	{"course_q",      t_boolean,   .addr.boolean = &ais->type8.dac200fid10.course_q,
456                                        .dflt.boolean = false},
457 	{"heading_q",     t_boolean,   .addr.boolean = &ais->type8.dac200fid10.heading_q,
458                                        .dflt.boolean = false},
459         {NULL}
460     };
461 
462     const struct json_attr_t json_ais8_fid11[] = {
463 	AIS_HEADER
464 	AIS_TYPE8
465 	{"lat",           t_integer,   .addr.integer = &ais->type8.dac1fid11.lat,
466                                        .dflt.integer = DAC1FID11_LAT_NOT_AVAILABLE},
467 	{"lon",           t_integer,   .addr.integer = &ais->type8.dac1fid11.lon,
468                                        .dflt.integer = DAC1FID11_LON_NOT_AVAILABLE},
469 	{"timestamp",     t_string,    .addr.string = timestamp,
470                                        .len = sizeof(timestamp)},
471 	{"wspeed",        t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.wspeed,
472                                        .dflt.uinteger = DAC1FID11_WSPEED_NOT_AVAILABLE},
473 	{"wgust",         t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.wgust,
474                                        .dflt.uinteger = DAC1FID11_WSPEED_NOT_AVAILABLE},
475 	{"wdir",          t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.wdir,
476                                        .dflt.uinteger = DAC1FID11_WDIR_NOT_AVAILABLE},
477 	{"wgustdir",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.wgustdir,
478                                        .dflt.uinteger = DAC1FID11_WDIR_NOT_AVAILABLE},
479 	{"airtemp",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.airtemp,
480                                        .dflt.uinteger = DAC1FID11_AIRTEMP_NOT_AVAILABLE},
481 	{"humidity",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.humidity,
482                                        .dflt.uinteger = DAC1FID11_HUMIDITY_NOT_AVAILABLE},
483 	{"dewpoint",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.dewpoint,
484                                        .dflt.uinteger = DAC1FID11_DEWPOINT_NOT_AVAILABLE},
485 	{"pressure",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.pressure,
486                                        .dflt.uinteger = DAC1FID11_PRESSURE_NOT_AVAILABLE},
487 	{"pressuretend",  t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.pressuretend,
488                                        .dflt.uinteger = DAC1FID11_PRESSURETREND_NOT_AVAILABLE},
489 	{"visibility",    t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.visibility,
490                                        .dflt.uinteger = DAC1FID11_VISIBILITY_NOT_AVAILABLE},
491 	{"waterlevel",    t_integer,   .addr.integer = &ais->type8.dac1fid11.waterlevel,
492                                        .dflt.integer = DAC1FID11_WATERLEVEL_NOT_AVAILABLE},
493 	{"leveltrend",    t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.leveltrend,
494                                        .dflt.uinteger = DAC1FID11_WATERLEVELTREND_NOT_AVAILABLE},
495 	{"cspeed",        t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.cspeed,
496                                        .dflt.uinteger = DAC1FID11_CSPEED_NOT_AVAILABLE},
497 	{"cdir",          t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.cdir,
498                                        .dflt.uinteger = DAC1FID11_CDIR_NOT_AVAILABLE},
499 	{"cspeed2",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.cspeed2,
500                                        .dflt.uinteger = DAC1FID11_CSPEED_NOT_AVAILABLE},
501 	{"cdir2",         t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.cdir2,
502                                        .dflt.uinteger = DAC1FID11_CDIR_NOT_AVAILABLE},
503 	{"cdepth2",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.cdepth2,
504                                        .dflt.uinteger = DAC1FID11_CDEPTH_NOT_AVAILABLE},
505 	{"cspeed3",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.cspeed3,
506                                        .dflt.uinteger = DAC1FID11_CSPEED_NOT_AVAILABLE},
507 	{"cdir3",         t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.cdir3,
508                                        .dflt.uinteger = DAC1FID11_CDIR_NOT_AVAILABLE},
509 	{"cdepth3",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.cdepth3,
510                                        .dflt.uinteger = DAC1FID11_CDEPTH_NOT_AVAILABLE},
511 	{"waveheight",    t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.waveheight,
512                                        .dflt.uinteger = DAC1FID11_WAVEHEIGHT_NOT_AVAILABLE},
513 	{"waveperiod",    t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.waveperiod,
514                                        .dflt.uinteger = DAC1FID11_WAVEPERIOD_NOT_AVAILABLE},
515 	{"wavedir",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.wavedir,
516                                        .dflt.uinteger = DAC1FID11_WAVEDIR_NOT_AVAILABLE},
517 	{"swellheight",   t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.swellheight,
518                                        .dflt.uinteger = DAC1FID11_WAVEHEIGHT_NOT_AVAILABLE},
519 	{"swellperiod",   t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.swellperiod,
520                                        .dflt.uinteger = DAC1FID11_WAVEPERIOD_NOT_AVAILABLE},
521 	{"swelldir",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.swelldir,
522                                        .dflt.uinteger = DAC1FID11_WAVEDIR_NOT_AVAILABLE},
523 	{"seastate",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.seastate,
524                                        .dflt.uinteger = DAC1FID11_SEASTATE_NOT_AVAILABLE},
525 	{"watertemp",     t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.watertemp,
526                                        .dflt.uinteger = DAC1FID11_WATERTEMP_NOT_AVAILABLE},
527 	{"preciptype",    t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.preciptype,
528                                        .dflt.uinteger = DAC1FID11_PRECIPTYPE_NOT_AVAILABLE},
529 	{"preciptype_text",   t_ignore},
530 	{"salinity",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.salinity,
531                                        .dflt.uinteger = DAC1FID11_SALINITY_NOT_AVAILABLE},
532 	{"ice",           t_uinteger,  .addr.uinteger = &ais->type8.dac1fid11.ice,
533                                        .dflt.uinteger = DAC1FID11_ICE_NOT_AVAILABLE},
534 	{"ice_text",   t_ignore},
535         {NULL}
536     };
537 
538     char closefrom[JSON_VAL_MAX+1];
539     char closeto[JSON_VAL_MAX+1];
540     const struct json_attr_t json_ais8_fid13[] = {
541 	AIS_HEADER
542 	AIS_TYPE8
543 	{"reason",        t_string,    .addr.string = ais->type8.dac1fid13.reason,
544                                        .len = sizeof(ais->type8.dac1fid13.reason)},
545 	{"closefrom",     t_string,    .addr.string = closefrom,
546                                        .len = sizeof(closefrom)},
547 	{"closeto",       t_string,    .addr.string = closeto,
548                                        .len = sizeof(closeto)},
549 	{"radius",        t_uinteger,  .addr.uinteger = &ais->type8.dac1fid13.radius,
550                                        .dflt.uinteger = AIS_DAC1FID13_RADIUS_NOT_AVAILABLE},
551 	{"extunit",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid13.extunit,
552                                        .dflt.uinteger = AIS_DAC1FID13_EXTUNIT_NOT_AVAILABLE},
553 	{"fday",          t_uinteger,  .addr.uinteger = &ais->type8.dac1fid13.fday,
554                                        .dflt.uinteger = AIS_DAY_NOT_AVAILABLE},
555 	{"fmonth",        t_uinteger,  .addr.uinteger = &ais->type8.dac1fid13.fmonth,
556                                        .dflt.uinteger = AIS_MONTH_NOT_AVAILABLE},
557 	{"fhour",         t_uinteger,  .addr.uinteger = &ais->type8.dac1fid13.fhour,
558                                        .dflt.uinteger = AIS_HOUR_NOT_AVAILABLE},
559 	{"fminute",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid13.fminute,
560                                        .dflt.uinteger = AIS_MINUTE_NOT_AVAILABLE},
561 	{"tday",          t_uinteger,  .addr.uinteger = &ais->type8.dac1fid13.tday,
562                                        .dflt.uinteger = AIS_DAY_NOT_AVAILABLE},
563 	{"tmonth",        t_uinteger,  .addr.uinteger = &ais->type8.dac1fid13.tmonth,
564                                        .dflt.uinteger = AIS_MONTH_NOT_AVAILABLE},
565 	{"thour",         t_uinteger,  .addr.uinteger = &ais->type8.dac1fid13.thour,
566                                        .dflt.uinteger = AIS_HOUR_NOT_AVAILABLE},
567 	{"tminute",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid13.tminute,
568                                        .dflt.uinteger = AIS_MINUTE_NOT_AVAILABLE},
569         {NULL}
570     };
571 
572     const struct json_attr_t json_ais8_fid15[] = {
573 	AIS_HEADER
574 	AIS_TYPE8
575 	{"airdraught",    t_uinteger,  .addr.uinteger = &ais->type8.dac1fid15.airdraught,
576                                        .dflt.uinteger = 0},
577         {NULL}
578     };
579 
580     const struct json_attr_t json_ais8_fid16[] = {
581 	AIS_HEADER
582 	AIS_TYPE8
583 	{"persons",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid16.persons,
584                                        .dflt.uinteger = 0},
585         {NULL}
586     };
587 
588     const struct json_attr_t json_ais8_fid17_targets_subtype[] = {
589 	{"idtype",        t_uinteger,STRUCTOBJECT(struct target_t, idtype),
590                                        .dflt.uinteger = DAC1FID17_IDTYPE_OTHER},
591 	{"id.mmsi",       t_uinteger,STRUCTOBJECT(struct target_t, id.mmsi),
592                                        .dflt.uinteger = 0},
593 	{"id.imo",        t_uinteger,STRUCTOBJECT(struct target_t, id.imo),
594                                        .dflt.uinteger = 0},
595 	{"id.callsign",   t_string,  STRUCTOBJECT(struct target_t, id.callsign),
596                                        .len = DAC1FID17_ID_LENGTH},
597 	{"id.other",      t_string,  STRUCTOBJECT(struct target_t, id.other),
598                                        .len = DAC1FID17_ID_LENGTH},
599 	{"lat",           t_integer, STRUCTOBJECT(struct target_t, lat),
600                                        .dflt.integer = AIS_LAT3_NOT_AVAILABLE},
601 	{"lon",           t_integer, STRUCTOBJECT(struct target_t, lon),
602                                        .dflt.integer = AIS_LON3_NOT_AVAILABLE},
603 	{"course",        t_uinteger,STRUCTOBJECT(struct target_t, course),
604                                        .dflt.uinteger = DAC1FID17_COURSE_NOT_AVAILABLE},
605 	{"second",        t_uinteger,STRUCTOBJECT(struct target_t, second),
606                                        .dflt.uinteger = AIS_SECOND_NOT_AVAILABLE},
607 	{"speed",         t_uinteger,STRUCTOBJECT(struct target_t, speed),
608                                        .dflt.uinteger = DAC1FID17_SPEED_NOT_AVAILABLE},
609         {NULL}
610     };
611     const struct json_attr_t json_ais8_fid17[] = {
612 	AIS_HEADER
613 	AIS_TYPE8
614 	{"targets",       t_array,     STRUCTARRAY(ais->type8.dac1fid17.targets, json_ais8_fid17_targets_subtype, &ais->type8.dac1fid17.ntargets)},
615         {NULL}
616     };
617 
618     const struct json_attr_t json_ais8_fid19[] = {
619 	AIS_HEADER
620 	AIS_TYPE8
621 	{"linkage",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid19.linkage,
622                                        .dflt.uinteger = 0},
623 	{"station",       t_string,    .addr.string = ais->type8.dac1fid19.station,
624                                        .len = sizeof(ais->type8.dac1fid19.station)},
625 	{"lon",           t_integer,   .addr.integer = &ais->type8.dac1fid19.lon,
626                                        .dflt.integer = AIS_LON3_NOT_AVAILABLE},
627 	{"lat",           t_integer,   .addr.integer = &ais->type8.dac1fid19.lat,
628                                        .dflt.integer = AIS_LAT3_NOT_AVAILABLE},
629 	{"status",        t_uinteger,  .addr.uinteger = &ais->type8.dac1fid19.status,
630                                        .dflt.uinteger = 0},
631 	{"signal",        t_uinteger,  .addr.uinteger = &ais->type8.dac1fid19.signal,
632                                        .dflt.uinteger = 0},
633 	{"signal_text",   t_ignore},
634 	{"hour",          t_uinteger,  .addr.uinteger = &ais->type8.dac1fid19.hour,
635                                        .dflt.uinteger = AIS_HOUR_NOT_AVAILABLE},
636 	{"minute",        t_uinteger,  .addr.uinteger = &ais->type8.dac1fid19.minute,
637                                        .dflt.uinteger = AIS_MINUTE_NOT_AVAILABLE},
638 	{"nextsignal",    t_uinteger,  .addr.uinteger = &ais->type8.dac1fid19.nextsignal,
639                                        .dflt.uinteger = 0},
640 	{"nextsignal_type",   t_ignore},
641         {NULL}
642     };
643 
644     char end[JSON_VAL_MAX+1];
645     const struct json_attr_t json_ais8_fid23[] = {
646 	AIS_HEADER
647 	AIS_TYPE8
648 	{"start",         t_string,    .addr.string = start,
649                                        .len = sizeof(start)},
650 	{"end",           t_string,    .addr.string = end,
651                                        .len = sizeof(end)},
652 	{"start_lon",     t_integer,   .addr.integer = &ais->type8.dac200fid23.start_lon,
653                                        .dflt.integer = AIS_LON4_NOT_AVAILABLE},
654 	{"start_lat",     t_integer,   .addr.integer = &ais->type8.dac200fid23.start_lat,
655                                        .dflt.integer = AIS_LAT4_NOT_AVAILABLE},
656 	{"end_lon",       t_integer,   .addr.integer = &ais->type8.dac200fid23.end_lon,
657                                        .dflt.integer = AIS_LON4_NOT_AVAILABLE},
658 	{"end_lat",       t_integer,   .addr.integer = &ais->type8.dac200fid23.end_lat,
659                                        .dflt.integer = AIS_LAT4_NOT_AVAILABLE},
660 	{"type",          t_uinteger,  .addr.uinteger = &ais->type8.dac200fid23.type,
661                                        .dflt.uinteger = DAC200FID23_TYPE_UNKNOWN},
662 	{"type_text",   t_ignore},
663 	{"min",           t_integer,   .addr.integer = &ais->type8.dac200fid23.min,
664                                        .dflt.integer = DAC200FID23_MIN_UNKNOWN},
665 	{"max",           t_integer,   .addr.integer = &ais->type8.dac200fid23.max,
666                                        .dflt.integer = DAC200FID23_MAX_UNKNOWN},
667 	{"intensity",     t_uinteger,  .addr.uinteger = &ais->type8.dac200fid23.intensity,
668                                        .dflt.uinteger = DAC200FID23_CLASS_UNKNOWN},
669 	{"intensity_text",   t_ignore},
670 	{"wind",          t_uinteger,  .addr.uinteger = &ais->type8.dac200fid23.wind,
671                                        .dflt.uinteger = DAC200FID23_WIND_UNKNOWN},
672 	{"wind_text",   t_ignore},
673         {NULL}
674     };
675 
676     const struct json_attr_t json_ais8_fid24_gauges_subtype[] = {
677 	{"id",            t_uinteger,STRUCTOBJECT(struct gauge_t, id),
678                                        .dflt.uinteger = DAC200FID24_GAUGE_ID_UNKNOWN},
679 	{"level",         t_integer, STRUCTOBJECT(struct gauge_t, level),
680                                        .dflt.integer = DAC200FID24_GAUGE_LEVEL_UNKNOWN},
681         {NULL}
682     };
683     const struct json_attr_t json_ais8_fid24[] = {
684 	AIS_HEADER
685 	AIS_TYPE8
686 	{"country",       t_string,    .addr.string = ais->type8.dac200fid24.country,
687                                        .len = sizeof(ais->type8.dac200fid24.country)},
688 	{"gauges",        t_array,     STRUCTARRAY(ais->type8.dac200fid24.gauges, json_ais8_fid24_gauges_subtype, &ais->type8.dac200fid24.ngauges)},
689         {NULL}
690     };
691 
692     const struct json_attr_t json_ais8_fid27_waypoints_subtype[] = {
693 	{"lon",           t_integer, STRUCTOBJECT(struct waypoint_t, lon),
694                                        .dflt.integer = AIS_LON4_NOT_AVAILABLE},
695 	{"lat",           t_integer, STRUCTOBJECT(struct waypoint_t, lat),
696                                        .dflt.integer = AIS_LAT4_NOT_AVAILABLE},
697         {NULL}
698     };
699     const struct json_attr_t json_ais8_fid27[] = {
700 	AIS_HEADER
701 	AIS_TYPE8
702 	{"linkage",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid27.linkage,
703                                        .dflt.uinteger = 0},
704 	{"sender",        t_uinteger,  .addr.uinteger = &ais->type8.dac1fid27.sender,
705                                        .dflt.uinteger = 0},
706 	{"rtype",         t_uinteger,  .addr.uinteger = &ais->type8.dac1fid27.rtype,
707                                        .dflt.uinteger = 0},
708 	{"rtype_text",   t_ignore},
709 	{"start",         t_string,    .addr.string = start,
710                                        .len = sizeof(start)},
711 	{"duration",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid27.duration,
712                                        .dflt.uinteger = 0},
713 	{"waypoints",     t_array,     STRUCTARRAY(ais->type8.dac1fid27.waypoints, json_ais8_fid27_waypoints_subtype, &ais->type8.dac1fid27.waycount)},
714         {NULL}
715     };
716 
717     const struct json_attr_t json_ais8_fid29[] = {
718 	AIS_HEADER
719 	AIS_TYPE8
720 	{"linkage",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid29.linkage,
721                                        .dflt.uinteger = 0},
722 	{"text",          t_string,    .addr.string = ais->type8.dac1fid29.text,
723                                        .len = sizeof(ais->type8.dac1fid29.text)},
724         {NULL}
725     };
726 
727     const struct json_attr_t json_ais8_fid31[] = {
728 	AIS_HEADER
729 	AIS_TYPE8
730 	{"lon",           t_integer,   .addr.integer = &ais->type8.dac1fid31.lon,
731                                        .dflt.integer = DAC1FID31_LON_NOT_AVAILABLE},
732 	{"lat",           t_integer,   .addr.integer = &ais->type8.dac1fid31.lat,
733                                        .dflt.integer = DAC1FID31_LAT_NOT_AVAILABLE},
734 	{"accuracy",      t_boolean,   .addr.boolean = &ais->type8.dac1fid31.accuracy,
735                                        .dflt.boolean = false},
736 	{"timestamp",     t_string,    .addr.string = timestamp,
737                                        .len = sizeof(timestamp)},
738 	{"wspeed",        t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.wspeed,
739                                        .dflt.uinteger = DAC1FID31_WIND_NOT_AVAILABLE},
740 	{"wgust",         t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.wgust,
741                                        .dflt.uinteger = DAC1FID31_WIND_NOT_AVAILABLE},
742 	{"wdir",          t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.wdir,
743                                        .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE},
744 	{"wgustdir",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.wgustdir,
745                                        .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE},
746 	{"airtemp",       t_integer,   .addr.integer = &ais->type8.dac1fid31.airtemp,
747                                        .dflt.integer = DAC1FID31_AIRTEMP_NOT_AVAILABLE},
748 	{"humidity",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.humidity,
749                                        .dflt.uinteger = DAC1FID31_HUMIDITY_NOT_AVAILABLE},
750 	{"dewpoint",      t_integer,   .addr.integer = &ais->type8.dac1fid31.dewpoint,
751                                        .dflt.integer = DAC1FID31_DEWPOINT_NOT_AVAILABLE},
752 	{"pressure",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.pressure,
753                                        .dflt.uinteger = DAC1FID31_PRESSURE_NOT_AVAILABLE},
754 	{"pressuretend",  t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.pressuretend,
755                                        .dflt.uinteger = DAC1FID31_PRESSURETEND_NOT_AVAILABLE},
756 	{"visgreater",    t_boolean,   .addr.boolean = &ais->type8.dac1fid31.visgreater,
757                                        .dflt.boolean = false},
758 	{"visibility",    t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.visibility,
759                                        .dflt.uinteger = DAC1FID31_VISIBILITY_NOT_AVAILABLE},
760 	{"waterlevel",    t_integer,   .addr.integer = &ais->type8.dac1fid31.waterlevel,
761                                        .dflt.integer = DAC1FID31_WATERLEVEL_NOT_AVAILABLE},
762 	{"leveltrend",    t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.leveltrend,
763                                        .dflt.uinteger = DAC1FID31_WATERLEVELTREND_NOT_AVAILABLE},
764 	{"cspeed",        t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.cspeed,
765                                        .dflt.uinteger = DAC1FID31_CSPEED_NOT_AVAILABLE},
766 	{"cdir",          t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.cdir,
767                                        .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE},
768 	{"cspeed2",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.cspeed2,
769                                        .dflt.uinteger = DAC1FID31_CSPEED_NOT_AVAILABLE},
770 	{"cdir2",         t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.cdir2,
771                                        .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE},
772 	{"cdepth2",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.cdepth2,
773                                        .dflt.uinteger = DAC1FID31_CDEPTH_NOT_AVAILABLE},
774 	{"cspeed3",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.cspeed3,
775                                        .dflt.uinteger = DAC1FID31_CSPEED_NOT_AVAILABLE},
776 	{"cdir3",         t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.cdir3,
777                                        .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE},
778 	{"cdepth3",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.cdepth3,
779                                        .dflt.uinteger = DAC1FID31_CDEPTH_NOT_AVAILABLE},
780 	{"waveheight",    t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.waveheight,
781                                        .dflt.uinteger = DAC1FID31_HEIGHT_NOT_AVAILABLE},
782 	{"waveperiod",    t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.waveperiod,
783                                        .dflt.uinteger = DAC1FID31_PERIOD_NOT_AVAILABLE},
784 	{"wavedir",       t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.wavedir,
785                                        .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE},
786 	{"swellheight",   t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.swellheight,
787                                        .dflt.uinteger = DAC1FID31_HEIGHT_NOT_AVAILABLE},
788 	{"swellperiod",   t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.swellperiod,
789                                        .dflt.uinteger = DAC1FID31_PERIOD_NOT_AVAILABLE},
790 	{"swelldir",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.swelldir,
791                                        .dflt.uinteger = DAC1FID31_DIR_NOT_AVAILABLE},
792 	{"seastate",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.seastate,
793                                        .dflt.uinteger = DAC1FID31_SEASTATE_NOT_AVAILABLE},
794 	{"watertemp",     t_integer,   .addr.integer = &ais->type8.dac1fid31.watertemp,
795                                        .dflt.integer = DAC1FID31_WATERTEMP_NOT_AVAILABLE},
796 	{"preciptype",    t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.preciptype,
797                                        .dflt.uinteger = DAC1FID31_PRECIPTYPE_NOT_AVAILABLE},
798 	{"preciptype_text",   t_ignore},
799 	{"salinity",      t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.salinity,
800                                        .dflt.uinteger = DAC1FID31_SALINITY_NOT_AVAILABLE},
801 	{"ice",           t_uinteger,  .addr.uinteger = &ais->type8.dac1fid31.ice,
802                                        .dflt.uinteger = DAC1FID31_ICE_NOT_AVAILABLE},
803         {NULL}
804     };
805 
806     const struct json_attr_t json_ais8_fid40[] = {
807 	AIS_HEADER
808 	AIS_TYPE8
809 	{"form",          t_uinteger,  .addr.uinteger = &ais->type8.dac200fid40.form,
810                                        .dflt.uinteger = DAC200FID40_FORM_UNKNOWN},
811 	{"facing",        t_uinteger,  .addr.uinteger = &ais->type8.dac200fid40.facing,
812                                        .dflt.uinteger = DAC200FID40_FACING_UNKNOWN},
813 	{"direction",     t_uinteger,  .addr.uinteger = &ais->type8.dac200fid40.direction,
814                                        .dflt.uinteger = DAC200FID40_DIRECTION_UNKNOWN},
815 	{"direction_text",   t_ignore},
816 	{"status",        t_uinteger,  .addr.uinteger = &ais->type8.dac200fid40.status,
817                                        .dflt.uinteger = DAC200FID40_STATUS_UNKNOWN},
818 	{"status_text",   t_ignore},
819         {NULL}
820     };
821 
822     const struct json_attr_t json_ais9[] = {
823 	AIS_HEADER
824 	{"alt",           t_uinteger,  .addr.uinteger = &ais->type9.alt,
825                                        .dflt.uinteger = AIS_ALT_NOT_AVAILABLE},
826 	{"speed",         t_uinteger,  .addr.uinteger = &ais->type9.speed,
827                                        .dflt.uinteger = AIS_SPEED_NOT_AVAILABLE},
828 	{"accuracy",      t_boolean,   .addr.boolean = &ais->type9.accuracy,
829                                        .dflt.boolean = false},
830 	{"lon",           t_integer,   .addr.integer = &ais->type9.lon,
831                                        .dflt.integer = AIS_LON_NOT_AVAILABLE},
832 	{"lat",           t_integer,   .addr.integer = &ais->type9.lat,
833                                        .dflt.integer = AIS_LAT_NOT_AVAILABLE},
834 	{"course",        t_uinteger,  .addr.uinteger = &ais->type9.course,
835                                        .dflt.uinteger = AIS_COURSE_NOT_AVAILABLE},
836 	{"second",        t_uinteger,  .addr.uinteger = &ais->type9.second,
837                                        .dflt.uinteger = AIS_SEC_NOT_AVAILABLE},
838 	{"regional",      t_uinteger,  .addr.uinteger = &ais->type9.regional,
839                                        .dflt.uinteger = 0},
840 	{"dte",           t_uinteger,  .addr.uinteger = &ais->type9.dte,
841                                        .dflt.uinteger = 1},
842 	{"raim",          t_boolean,   .addr.boolean = &ais->type9.raim,
843                                        .dflt.boolean = false},
844 	{"radio",         t_uinteger,  .addr.uinteger = &ais->type9.radio,
845                                        .dflt.uinteger = 0},
846         {NULL}
847     };
848 
849     const struct json_attr_t json_ais10[] = {
850 	AIS_HEADER
851 	{"dest_mmsi",     t_uinteger,  .addr.uinteger = &ais->type10.dest_mmsi,
852                                        .dflt.uinteger = 0},
853         {NULL}
854     };
855 
856     const struct json_attr_t json_ais12[] = {
857 	AIS_HEADER
858 	{"seqno",         t_uinteger,  .addr.uinteger = &ais->type12.seqno,
859                                        .dflt.uinteger = 0},
860 	{"dest_mmsi",     t_uinteger,  .addr.uinteger = &ais->type12.dest_mmsi,
861                                        .dflt.uinteger = 0},
862 	{"retransmit",    t_boolean,   .addr.boolean = &ais->type12.retransmit,
863                                        .dflt.boolean = 0},
864 	{"text",          t_string,    .addr.string = ais->type12.text,
865                                        .len = sizeof(ais->type12.text)},
866         {NULL}
867     };
868 
869     const struct json_attr_t json_ais14[] = {
870 	AIS_HEADER
871 	{"text",          t_string,    .addr.string = ais->type14.text,
872                                        .len = sizeof(ais->type14.text)},
873         {NULL}
874     };
875 
876     const struct json_attr_t json_ais15[] = {
877 	AIS_HEADER
878 	{"mmsi1",         t_uinteger,  .addr.uinteger = &ais->type15.mmsi1,
879                                        .dflt.uinteger = 0},
880 	{"type1_1",       t_uinteger,  .addr.uinteger = &ais->type15.type1_1,
881                                        .dflt.uinteger = 0},
882 	{"offset1_1",     t_uinteger,  .addr.uinteger = &ais->type15.offset1_1,
883                                        .dflt.uinteger = 0},
884 	{"type1_2",       t_uinteger,  .addr.uinteger = &ais->type15.type1_2,
885                                        .dflt.uinteger = 0},
886 	{"offset1_2",     t_uinteger,  .addr.uinteger = &ais->type15.offset1_2,
887                                        .dflt.uinteger = 0},
888 	{"mmsi2",         t_uinteger,  .addr.uinteger = &ais->type15.mmsi2,
889                                        .dflt.uinteger = 0},
890 	{"type2_1",       t_uinteger,  .addr.uinteger = &ais->type15.type2_1,
891                                        .dflt.uinteger = 0},
892 	{"offset2_1",     t_uinteger,  .addr.uinteger = &ais->type15.offset2_1,
893                                        .dflt.uinteger = 0},
894         {NULL}
895     };
896 
897     const struct json_attr_t json_ais16[] = {
898 	AIS_HEADER
899 	{"mmsi1",         t_uinteger,  .addr.uinteger = &ais->type16.mmsi1,
900                                        .dflt.uinteger = 0},
901 	{"offset1",       t_uinteger,  .addr.uinteger = &ais->type16.offset1,
902                                        .dflt.uinteger = 0},
903 	{"increment1",    t_uinteger,  .addr.uinteger = &ais->type16.increment1,
904                                        .dflt.uinteger = 0},
905 	{"mmsi2",         t_uinteger,  .addr.uinteger = &ais->type16.mmsi2,
906                                        .dflt.uinteger = 0},
907 	{"offset2",       t_uinteger,  .addr.uinteger = &ais->type16.offset2,
908                                        .dflt.uinteger = 0},
909 	{"increment2",    t_uinteger,  .addr.uinteger = &ais->type16.increment2,
910                                        .dflt.uinteger = 0},
911         {NULL}
912     };
913 
914     const struct json_attr_t json_ais17[] = {
915 	AIS_HEADER
916 	{"lon",           t_integer,   .addr.integer = &ais->type17.lon,
917                                        .dflt.integer = AIS_GNS_LON_NOT_AVAILABLE},
918 	{"lat",           t_integer,   .addr.integer = &ais->type17.lat,
919                                        .dflt.integer = AIS_GNS_LAT_NOT_AVAILABLE},
920 	{"data",          t_string,    .addr.string = data,
921                                        .len = sizeof(data)},
922         {NULL}
923     };
924 
925     const struct json_attr_t json_ais18[] = {
926 	AIS_HEADER
927 	{"reserved",      t_uinteger,  .addr.uinteger = &ais->type18.reserved,
928                                        .dflt.uinteger = 0},
929 	{"speed",         t_uinteger,  .addr.uinteger = &ais->type18.speed,
930                                        .dflt.uinteger = AIS_SPEED_NOT_AVAILABLE},
931 	{"accuracy",      t_boolean,   .addr.boolean = &ais->type18.accuracy,
932                                        .dflt.boolean = false},
933 	{"lon",           t_integer,   .addr.integer = &ais->type18.lon,
934                                        .dflt.integer = AIS_LON_NOT_AVAILABLE},
935 	{"lat",           t_integer,   .addr.integer = &ais->type18.lat,
936                                        .dflt.integer = AIS_LAT_NOT_AVAILABLE},
937 	{"course",        t_uinteger,  .addr.uinteger = &ais->type18.course,
938                                        .dflt.uinteger = AIS_COURSE_NOT_AVAILABLE},
939 	{"heading",       t_uinteger,  .addr.uinteger = &ais->type18.heading,
940                                        .dflt.uinteger = AIS_HEADING_NOT_AVAILABLE},
941 	{"second",        t_uinteger,  .addr.uinteger = &ais->type18.second,
942                                        .dflt.uinteger = AIS_SEC_NOT_AVAILABLE},
943 	{"regional",      t_uinteger,  .addr.uinteger = &ais->type18.regional,
944                                        .dflt.uinteger = 0},
945 	{"cs",            t_boolean,   .addr.boolean = &ais->type18.cs,
946                                        .dflt.boolean = false},
947 	{"display",       t_boolean,   .addr.boolean = &ais->type18.display,
948                                        .dflt.boolean = false},
949 	{"dsc",           t_boolean,   .addr.boolean = &ais->type18.dsc,
950                                        .dflt.boolean = false},
951 	{"band",          t_boolean,   .addr.boolean = &ais->type18.band,
952                                        .dflt.boolean = false},
953 	{"msg22",         t_boolean,   .addr.boolean = &ais->type18.msg22,
954                                        .dflt.boolean = false},
955 	{"raim",          t_boolean,   .addr.boolean = &ais->type18.raim,
956                                        .dflt.boolean = false},
957 	{"radio",         t_uinteger,  .addr.uinteger = &ais->type18.radio,
958                                        .dflt.uinteger = 0},
959         {NULL}
960     };
961 
962     const struct json_attr_t json_ais19[] = {
963 	AIS_HEADER
964 	{"reserved",      t_uinteger,  .addr.uinteger = &ais->type19.reserved,
965                                        .dflt.uinteger = 0},
966 	{"speed",         t_uinteger,  .addr.uinteger = &ais->type19.speed,
967                                        .dflt.uinteger = AIS_SPEED_NOT_AVAILABLE},
968 	{"accuracy",      t_boolean,   .addr.boolean = &ais->type19.accuracy,
969                                        .dflt.boolean = false},
970 	{"lon",           t_integer,   .addr.integer = &ais->type19.lon,
971                                        .dflt.integer = AIS_LON_NOT_AVAILABLE},
972 	{"lat",           t_integer,   .addr.integer = &ais->type19.lat,
973                                        .dflt.integer = AIS_LAT_NOT_AVAILABLE},
974 	{"course",        t_uinteger,  .addr.uinteger = &ais->type19.course,
975                                        .dflt.uinteger = AIS_COURSE_NOT_AVAILABLE},
976 	{"heading",       t_uinteger,  .addr.uinteger = &ais->type19.heading,
977                                        .dflt.uinteger = AIS_HEADING_NOT_AVAILABLE},
978 	{"second",        t_uinteger,  .addr.uinteger = &ais->type19.second,
979                                        .dflt.uinteger = AIS_SEC_NOT_AVAILABLE},
980 	{"regional",      t_uinteger,  .addr.uinteger = &ais->type19.regional,
981                                        .dflt.uinteger = 0},
982 	{"shipname",      t_string,    .addr.string = ais->type19.shipname,
983                                        .len = sizeof(ais->type19.shipname)},
984 	{"shiptype",      t_uinteger,  .addr.uinteger = &ais->type19.shiptype,
985                                        .dflt.uinteger = 0},
986 	{"shiptype_text",   t_ignore},
987 	{"to_bow",        t_uinteger,  .addr.uinteger = &ais->type19.to_bow,
988                                        .dflt.uinteger = 0},
989 	{"to_stern",      t_uinteger,  .addr.uinteger = &ais->type19.to_stern,
990                                        .dflt.uinteger = 0},
991 	{"to_port",       t_uinteger,  .addr.uinteger = &ais->type19.to_port,
992                                        .dflt.uinteger = 0},
993 	{"to_starboard",  t_uinteger,  .addr.uinteger = &ais->type19.to_starboard,
994                                        .dflt.uinteger = 0},
995 	{"epfd",          t_uinteger,  .addr.uinteger = &ais->type19.epfd,
996                                        .dflt.uinteger = 0},
997 	{"epfd_text",   t_ignore},
998 	{"raim",          t_boolean,   .addr.boolean = &ais->type19.raim,
999                                        .dflt.boolean = false},
1000 	{"dte",           t_uinteger,  .addr.uinteger = &ais->type19.dte,
1001                                        .dflt.uinteger = 1},
1002 	{"assigned",      t_boolean,   .addr.boolean = &ais->type19.assigned,
1003                                        .dflt.boolean = false},
1004         {NULL}
1005     };
1006 
1007     const struct json_attr_t json_ais20[] = {
1008 	AIS_HEADER
1009 	{"offset1",       t_uinteger,  .addr.uinteger = &ais->type20.offset1,
1010                                        .dflt.uinteger = 0},
1011 	{"number1",       t_uinteger,  .addr.uinteger = &ais->type20.number1,
1012                                        .dflt.uinteger = 0},
1013 	{"timeout1",      t_uinteger,  .addr.uinteger = &ais->type20.timeout1,
1014                                        .dflt.uinteger = 0},
1015 	{"increment1",    t_uinteger,  .addr.uinteger = &ais->type20.increment1,
1016                                        .dflt.uinteger = 0},
1017 	{"offset2",       t_uinteger,  .addr.uinteger = &ais->type20.offset2,
1018                                        .dflt.uinteger = 0},
1019 	{"number2",       t_uinteger,  .addr.uinteger = &ais->type20.number2,
1020                                        .dflt.uinteger = 0},
1021 	{"timeout2",      t_uinteger,  .addr.uinteger = &ais->type20.timeout2,
1022                                        .dflt.uinteger = 0},
1023 	{"increment2",    t_uinteger,  .addr.uinteger = &ais->type20.increment2,
1024                                        .dflt.uinteger = 0},
1025 	{"offset3",       t_uinteger,  .addr.uinteger = &ais->type20.offset3,
1026                                        .dflt.uinteger = 0},
1027 	{"number3",       t_uinteger,  .addr.uinteger = &ais->type20.number3,
1028                                        .dflt.uinteger = 0},
1029 	{"timeout3",      t_uinteger,  .addr.uinteger = &ais->type20.timeout3,
1030                                        .dflt.uinteger = 0},
1031 	{"increment3",    t_uinteger,  .addr.uinteger = &ais->type20.increment3,
1032                                        .dflt.uinteger = 0},
1033 	{"offset4",       t_uinteger,  .addr.uinteger = &ais->type20.offset4,
1034                                        .dflt.uinteger = 0},
1035 	{"number4",       t_uinteger,  .addr.uinteger = &ais->type20.number4,
1036                                        .dflt.uinteger = 0},
1037 	{"timeout4",      t_uinteger,  .addr.uinteger = &ais->type20.timeout4,
1038                                        .dflt.uinteger = 0},
1039 	{"increment4",    t_uinteger,  .addr.uinteger = &ais->type20.increment4,
1040                                        .dflt.uinteger = 0},
1041         {NULL}
1042     };
1043 
1044     const struct json_attr_t json_ais21[] = {
1045 	AIS_HEADER
1046 	{"aid_type",      t_uinteger,  .addr.uinteger = &ais->type21.aid_type,
1047                                        .dflt.uinteger = 0},
1048 	{"aid_type_text",   t_ignore},
1049 	{"name",          t_string,    .addr.string = ais->type21.name,
1050                                        .len = sizeof(ais->type21.name)},
1051 	{"accuracy",      t_boolean,   .addr.boolean = &ais->type21.accuracy,
1052                                        .dflt.boolean = false},
1053 	{"lon",           t_integer,   .addr.integer = &ais->type21.lon,
1054                                        .dflt.integer = AIS_LON_NOT_AVAILABLE},
1055 	{"lat",           t_integer,   .addr.integer = &ais->type21.lat,
1056                                        .dflt.integer = AIS_LAT_NOT_AVAILABLE},
1057 	{"to_bow",        t_uinteger,  .addr.uinteger = &ais->type21.to_bow,
1058                                        .dflt.uinteger = 0},
1059 	{"to_stern",      t_uinteger,  .addr.uinteger = &ais->type21.to_stern,
1060                                        .dflt.uinteger = 0},
1061 	{"to_port",       t_uinteger,  .addr.uinteger = &ais->type21.to_port,
1062                                        .dflt.uinteger = 0},
1063 	{"to_starboard",  t_uinteger,  .addr.uinteger = &ais->type21.to_starboard,
1064                                        .dflt.uinteger = 0},
1065 	{"epfd",          t_uinteger,  .addr.uinteger = &ais->type21.epfd,
1066                                        .dflt.uinteger = 0},
1067 	{"epfd_text",   t_ignore},
1068 	{"second",        t_uinteger,  .addr.uinteger = &ais->type21.second,
1069                                        .dflt.uinteger = 0},
1070 	{"regional",      t_uinteger,  .addr.uinteger = &ais->type21.regional,
1071                                        .dflt.uinteger = 0},
1072 	{"off_position",  t_boolean,   .addr.boolean = &ais->type21.off_position,
1073                                        .dflt.boolean = false},
1074 	{"raim",          t_boolean,   .addr.boolean = &ais->type21.raim,
1075                                        .dflt.boolean = false},
1076 	{"virtual_aid",   t_boolean,   .addr.boolean = &ais->type21.virtual_aid,
1077                                        .dflt.boolean = false},
1078         {NULL}
1079     };
1080 
1081     const struct json_attr_t json_ais22[] = {
1082 	AIS_HEADER
1083 	{"channel_a",     t_uinteger,  .addr.uinteger = &ais->type22.channel_a,
1084                                        .dflt.uinteger = 0},
1085 	{"channel_b",     t_uinteger,  .addr.uinteger = &ais->type22.channel_b,
1086                                        .dflt.uinteger = 0},
1087 	{"txrx",          t_uinteger,  .addr.uinteger = &ais->type22.txrx,
1088                                        .dflt.uinteger = 0},
1089 	{"power",         t_boolean,   .addr.boolean = &ais->type22.power,
1090                                        .dflt.boolean = false},
1091 	{"ne_lon",        t_integer,   .addr.integer = &ais->type22.area.ne_lon,
1092                                        .dflt.integer = AIS_GNS_LON_NOT_AVAILABLE},
1093 	{"ne_lat",        t_integer,   .addr.integer = &ais->type22.area.ne_lat,
1094                                        .dflt.integer = AIS_GNS_LAT_NOT_AVAILABLE},
1095 	{"sw_lon",        t_integer,   .addr.integer = &ais->type22.area.sw_lon,
1096                                        .dflt.integer = AIS_GNS_LON_NOT_AVAILABLE},
1097 	{"sw_lat",        t_integer,   .addr.integer = &ais->type22.area.sw_lat,
1098                                        .dflt.integer = AIS_GNS_LAT_NOT_AVAILABLE},
1099 	{"dest1",         t_uinteger,  .addr.uinteger = &ais->type22.mmsi.dest1,
1100                                        .dflt.uinteger = 0},
1101 	{"dest2",         t_uinteger,  .addr.uinteger = &ais->type22.mmsi.dest2,
1102                                        .dflt.uinteger = 0},
1103 	{"addressed",     t_boolean,   .addr.boolean = &ais->type22.addressed,
1104                                        .dflt.boolean = false},
1105 	{"band_a",        t_boolean,   .addr.boolean = &ais->type22.band_a,
1106                                        .dflt.boolean = false},
1107 	{"band_b",        t_boolean,   .addr.boolean = &ais->type22.band_b,
1108                                        .dflt.boolean = false},
1109 	{"zonesize",      t_uinteger,  .addr.uinteger = &ais->type22.zonesize,
1110                                        .dflt.uinteger = 0},
1111         {NULL}
1112     };
1113 
1114     const struct json_attr_t json_ais23[] = {
1115 	AIS_HEADER
1116 	{"ne_lon",        t_integer,   .addr.integer = &ais->type23.ne_lon,
1117                                        .dflt.integer = AIS_GNS_LON_NOT_AVAILABLE},
1118 	{"ne_lat",        t_integer,   .addr.integer = &ais->type23.ne_lat,
1119                                        .dflt.integer = AIS_GNS_LAT_NOT_AVAILABLE},
1120 	{"sw_lon",        t_integer,   .addr.integer = &ais->type23.sw_lon,
1121                                        .dflt.integer = AIS_GNS_LON_NOT_AVAILABLE},
1122 	{"sw_lat",        t_integer,   .addr.integer = &ais->type23.sw_lat,
1123                                        .dflt.integer = AIS_GNS_LAT_NOT_AVAILABLE},
1124 	{"stationtype",   t_uinteger,  .addr.uinteger = &ais->type23.stationtype,
1125                                        .dflt.uinteger = 0},
1126 	{"stationtype_text",   t_ignore},
1127 	{"shiptype",      t_uinteger,  .addr.uinteger = &ais->type23.shiptype,
1128                                        .dflt.uinteger = 0},
1129 	{"shiptype_text",   t_ignore},
1130 	{"txrx",          t_uinteger,  .addr.uinteger = &ais->type23.txrx,
1131                                        .dflt.uinteger = 0},
1132 	{"interval",      t_uinteger,  .addr.uinteger = &ais->type23.interval,
1133                                        .dflt.uinteger = 0},
1134 	{"quiet",         t_uinteger,  .addr.uinteger = &ais->type23.quiet,
1135                                        .dflt.uinteger = 0},
1136         {NULL}
1137     };
1138 
1139     const struct json_attr_t json_ais24[] = {
1140 	AIS_HEADER
1141 	{"shipname",      t_string,    .addr.string = ais->type24.shipname,
1142                                        .len = sizeof(ais->type24.shipname)},
1143 	{"shiptype",      t_uinteger,  .addr.uinteger = &ais->type24.shiptype,
1144                                        .dflt.uinteger = 0},
1145 	{"shiptype_text",   t_ignore},
1146 	{"vendorid",      t_string,    .addr.string = ais->type24.vendorid,
1147                                        .len = sizeof(ais->type24.vendorid)},
1148 	{"model",         t_uinteger,  .addr.uinteger = &ais->type24.model,
1149                                        .dflt.uinteger = 0},
1150 	{"serial",        t_uinteger,  .addr.uinteger = &ais->type24.serial,
1151                                        .dflt.uinteger = 0},
1152 	{"callsign",      t_string,    .addr.string = ais->type24.callsign,
1153                                        .len = sizeof(ais->type24.callsign)},
1154 	{"mothership_mmsi",t_uinteger,  .addr.uinteger = &ais->type24.mothership_mmsi,
1155                                        .dflt.uinteger = 0},
1156 	{"to_bow",        t_uinteger,  .addr.uinteger = &ais->type24.dim.to_bow,
1157                                        .dflt.uinteger = 0},
1158 	{"to_stern",      t_uinteger,  .addr.uinteger = &ais->type24.dim.to_stern,
1159                                        .dflt.uinteger = 0},
1160 	{"to_port",       t_uinteger,  .addr.uinteger = &ais->type24.dim.to_port,
1161                                        .dflt.uinteger = 0},
1162 	{"to_starboard",  t_uinteger,  .addr.uinteger = &ais->type24.dim.to_starboard,
1163                                        .dflt.uinteger = 0},
1164         {NULL}
1165     };
1166 
1167     const struct json_attr_t json_ais25[] = {
1168 	AIS_HEADER
1169 	{"addressed",     t_boolean,   .addr.boolean = &ais->type25.addressed,
1170                                        .dflt.boolean = false},
1171 	{"structured",    t_boolean,   .addr.boolean = &ais->type25.structured,
1172                                        .dflt.boolean = false},
1173 	{"dest_mmsi",     t_uinteger,  .addr.uinteger = &ais->type25.dest_mmsi,
1174                                        .dflt.uinteger = 0},
1175 	{"app_id",        t_uinteger,  .addr.uinteger = &ais->type25.app_id,
1176                                        .dflt.uinteger = 0},
1177 	{"data",          t_string,    .addr.string = data,
1178                                        .len = sizeof(data)},
1179         {NULL}
1180     };
1181 
1182     const struct json_attr_t json_ais26[] = {
1183 	AIS_HEADER
1184 	{"addressed",     t_boolean,   .addr.boolean = &ais->type26.addressed,
1185                                        .dflt.boolean = false},
1186 	{"structured",    t_boolean,   .addr.boolean = &ais->type26.structured,
1187                                        .dflt.boolean = false},
1188 	{"dest_mmsi",     t_uinteger,  .addr.uinteger = &ais->type26.dest_mmsi,
1189                                        .dflt.uinteger = 0},
1190 	{"app_id",        t_uinteger,  .addr.uinteger = &ais->type26.app_id,
1191                                        .dflt.uinteger = 0},
1192 	{"data",          t_string,    .addr.string = data,
1193                                        .len = sizeof(data)},
1194 	{"radio",         t_uinteger,  .addr.uinteger = &ais->type26.radio,
1195                                        .dflt.uinteger = 0},
1196         {NULL}
1197     };
1198 
1199     const struct json_attr_t json_ais27[] = {
1200 	AIS_HEADER
1201 	{"status",        t_uinteger,  .addr.uinteger = &ais->type27.status,
1202                                        .dflt.uinteger = 0},
1203 	{"speed",         t_uinteger,  .addr.uinteger = &ais->type27.speed,
1204                                        .dflt.uinteger = AIS_LONGRANGE_SPEED_NOT_AVAILABLE},
1205 	{"accuracy",      t_boolean,   .addr.boolean = &ais->type27.accuracy,
1206                                        .dflt.boolean = false},
1207 	{"lon",           t_integer,   .addr.integer = &ais->type27.lon,
1208                                        .dflt.integer = AIS_LONGRANGE_LON_NOT_AVAILABLE},
1209 	{"lat",           t_integer,   .addr.integer = &ais->type27.lat,
1210                                        .dflt.integer = AIS_LONGRANGE_LAT_NOT_AVAILABLE},
1211 	{"course",        t_uinteger,  .addr.uinteger = &ais->type27.course,
1212                                        .dflt.uinteger = AIS_LONGRANGE_COURSE_NOT_AVAILABLE},
1213 	{"raim",          t_boolean,   .addr.boolean = &ais->type27.raim,
1214                                        .dflt.boolean = false},
1215 	{"gnss",          t_boolean,   .addr.boolean = &ais->type27.gnss,
1216                                        .dflt.boolean = true},
1217         {NULL}
1218     };
1219 
1220 
1221 
1222 /* Generated code ends. */
1223 
1224