00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00031 #ifdef HAVE_CONFIG_H
00032 #include <config.h>
00033 #endif
00034 #include "fap.h"
00035
00036 #include <stdlib.h>
00037 #include <stdio.h>
00038 #include <string.h>
00039 #include <ctype.h>
00040
00041
00042
00043 #define FEND 0xc0
00044 #define FESC 0xdb
00045 #define TFEND 0xdc
00046 #define TFESC 0xdd
00047
00048
00049
00050 #define BUFFER_LEN 512
00051 char buffer[BUFFER_LEN];
00052
00053
00054
00055
00056 void print_packet(fap_packet_t* packet)
00057 {
00058 int i;
00059
00060 if ( packet->error_code ) printf("error_code: %d\n", *packet->error_code);
00061 if ( packet->error_message ) printf("error_message: %s\n", packet->error_message);
00062 if ( packet->type ) printf("type: %d\n", *packet->type);
00063
00064 if ( packet->orig_packet ) printf("orig_packet: %s\n", packet->orig_packet);
00065 printf("orig_packet_len: %d\n", packet->orig_packet_len);
00066
00067 if ( packet->header ) printf("header: %s\n", packet->header);
00068 if ( packet->body ) printf("body: %s\n", packet->body);
00069 printf("body_len: %d\n", packet->body_len);
00070 if ( packet->src_callsign ) printf("src_callsign: %s\n", packet->src_callsign);
00071 if ( packet->dst_callsign ) printf("dst_callsign: %s\n", packet->dst_callsign);
00072 if ( packet->path )
00073 {
00074 printf("path:");
00075 for ( i = 0; i < packet->path_len; ++i )
00076 {
00077 printf(" %s", packet->path[i]);
00078 }
00079 printf("\n");
00080 }
00081 printf("path_len: %d\n", packet->path_len);
00082
00083 if ( packet->latitude ) printf("latitude: %f\n", *packet->latitude);
00084 if ( packet->longitude ) printf("longitude: %f\n", *packet->longitude);
00085 if ( packet->pos_resolution ) printf("pos_resolution: %f\n", *packet->pos_resolution);
00086 if ( packet->pos_ambiguity ) printf("pos_ambiguity: %d\n", *packet->pos_ambiguity);
00087 if ( packet->dao_datum_byte ) printf("dao_datum_byte: %c\n", packet->dao_datum_byte);
00088
00089 if ( packet->altitude ) printf("altitude: %f\n", *packet->altitude);
00090 if ( packet->course ) printf("course: %d\n", *packet->course);
00091 if ( packet->speed ) printf("speed: %f\n", *packet->speed);
00092
00093 if ( packet->symbol_table ) printf("symbol_table: %c\n", packet->symbol_table);
00094 if ( packet->symbol_code ) printf("symbol_code: %c\n", packet->symbol_code);
00095
00096 if ( packet->messaging ) printf("messaging: %d\n", *packet->messaging);
00097 if ( packet->destination ) printf("destination: %s\n", packet->destination);
00098 if ( packet->message ) printf("message: %s\n", packet->message);
00099 if ( packet->message_ack ) printf("message_ack: %s\n", packet->message_ack);
00100 if ( packet->message_id ) printf("message_id: %s\n", packet->message_id);
00101 if ( packet->comment ) printf("comment: %s\n", packet->comment);
00102 printf("comment_len: %d\n", packet->comment_len);
00103
00104 if ( packet->object_or_item_name ) printf("object_or_item_name: %s\n", packet->object_or_item_name);
00105 if ( packet->alive ) printf("alive: %d\n", *packet->alive);
00106
00107 if ( packet->gps_fix_status ) printf("gps_fix_status: %d\n", *packet->gps_fix_status);
00108 if ( packet->radio_range ) printf("radio_range: %d\n", *packet->radio_range);
00109 if ( packet->phg ) printf("phg: %s\n", packet->phg);
00110 if ( packet->timestamp ) printf("timestamp: %d (%s)\n", (unsigned int)*packet->timestamp, ctime(packet->timestamp));
00111 if ( packet->nmea_checksum_ok ) printf("nmea_checksum_ok: %d\n", *packet->nmea_checksum_ok);
00112
00113 if ( packet->wx_report )
00114 {
00115 printf("wx_report:\n");
00116 if ( packet->wx_report->wind_gust) printf("\twind_gust: %f\n", *packet->wx_report->wind_gust);
00117 if ( packet->wx_report->wind_dir ) printf("\twind_dir: %d\n", *packet->wx_report->wind_dir);
00118 if ( packet->wx_report->wind_speed ) printf("\twind_speed: %f\n", *packet->wx_report->wind_speed);
00119 if ( packet->wx_report->temp ) printf("\ttemp: %f\n", *packet->wx_report->temp);
00120 if ( packet->wx_report->temp_in ) printf("\ttemp_in: %f\n", *packet->wx_report->temp_in);
00121 if ( packet->wx_report->rain_1h ) printf("\train_1h: %f\n", *packet->wx_report->rain_1h);
00122 if ( packet->wx_report->rain_24h ) printf("\train_24h: %f\n", *packet->wx_report->rain_24h);
00123 if ( packet->wx_report->rain_midnight ) printf("\train_midnight: %f\n", *packet->wx_report->rain_midnight);
00124 if ( packet->wx_report->humidity ) printf("\thumidity: %d\n", *packet->wx_report->humidity);
00125 if ( packet->wx_report->humidity_in ) printf("\thumidity_in: %d\n", *packet->wx_report->humidity_in);
00126 if ( packet->wx_report->pressure ) printf("\tpressure: %f\n", *packet->wx_report->pressure);
00127 if ( packet->wx_report->luminosity ) printf("\tluminosity: %d\n", *packet->wx_report->luminosity);
00128 if ( packet->wx_report->snow_24h ) printf("\tsnow_24h: %f\n", *packet->wx_report->snow_24h);
00129 if ( packet->wx_report->soft ) printf("\tsoft: %s\n", packet->wx_report->soft);
00130 }
00131
00132 if ( packet->telemetry )
00133 {
00134 printf("telemetry:\n");
00135 printf("\tseq: %d\n", packet->telemetry->seq);
00136 printf("\tval1: %f\n", packet->telemetry->val1);
00137 printf("\tval2: %f\n", packet->telemetry->val2);
00138 printf("\tval3: %f\n", packet->telemetry->val3);
00139 printf("\tval4: %f\n", packet->telemetry->val4);
00140 printf("\tval5: %f\n", packet->telemetry->val5);
00141 printf("\tbits: %s\n", packet->telemetry->bits);
00142 }
00143
00144 if ( packet->messagebits ) printf("messagebits: %s (%s)\n", packet->messagebits, fap_mice_mbits_to_message(packet->messagebits));
00145 if ( packet->status ) printf("status: %s\n", packet->status);
00146 printf("status_len: %d\n", packet->status_len);
00147
00148 if ( packet->capabilities )
00149 {
00150 printf("capabilities:");
00151 printf("\n");
00152 }
00153 printf("capabilites_len: %d\n", packet->capabilities_len);
00154 }
00155
00156
00157
00158
00159 int test_parser()
00160 {
00161 fap_packet_t* packet;
00162 int retval = 1;
00163
00164 memset(buffer, 0, BUFFER_LEN);
00165 sprintf(buffer, "OH2GVE-15>APRS,TCPIP*:!//H*{TPI.L{0Ctest");
00166 printf("########################################\n");
00167 printf("Testing parser with packet (%s) ... ", buffer);
00168 packet = fap_parseaprs(buffer, strlen(buffer), 0);
00169 if ( packet->error_code )
00170 {
00171 printf("failed: %s\n", fap_explain_error(*packet->error_code));
00172 retval = 0;
00173 }
00174 else printf("success\n");
00175 print_packet(packet);
00176 printf("########################################\n");
00177 fap_free(packet);
00178
00179 memset(buffer, 0, BUFFER_LEN);
00180 sprintf(buffer, "OH3RBE-1>APND0Z,WIDE1-1:)ACUTA!6130.32N/02348.81E+ 24h Emergency Ward ACUTA +358 3 5657 0023");
00181 printf("########################################\n");
00182 printf("Testing parser with packet (%s) ... ", buffer);
00183 packet = fap_parseaprs(buffer, strlen(buffer), 0);
00184 if ( packet->error_code )
00185 {
00186 printf("failed: %s\n", fap_explain_error(*packet->error_code));
00187 retval = 0;
00188 }
00189 else printf("success\n");
00190 print_packet(packet);
00191 printf("########################################\n");
00192 fap_free(packet);
00193
00194 memset(buffer, 0, BUFFER_LEN);
00195 sprintf(buffer, "OH3RDH>APNU19,OH3RBE-3*:!6059.33NU02530.82E#PHG5330 [Hollola KP20SX UIDIGI 1.9B3] 2");
00196 printf("########################################\n");
00197 printf("Testing parser with packet (%s) ... ", buffer);
00198 packet = fap_parseaprs(buffer, strlen(buffer), 0);
00199 if ( packet->error_code )
00200 {
00201 printf("failed: %s\n", fap_explain_error(*packet->error_code));
00202 retval = 0;
00203 }
00204 else printf("success\n");
00205 print_packet(packet);
00206 printf("########################################\n");
00207 fap_free(packet);
00208
00209 memset(buffer, 0, BUFFER_LEN);
00210 sprintf(buffer, "OH3RBE>APD225,OH3RBE-1*,WIDE1*:}OH3KV>APU25N,TCPIP*,OH3RBE*:=6055.91N/02335.96E#RX-igate KOIJARVI OH3KV {UIV32}");
00211 printf("########################################\n");
00212 printf("Testing parser with packet (%s) ... ", buffer);
00213 packet = fap_parseaprs(buffer, strlen(buffer), 0);
00214 if ( packet->error_code )
00215 {
00216 printf("failed: %s\n", fap_explain_error(*packet->error_code));
00217 retval = 0;
00218 }
00219 else printf("success\n");
00220 print_packet(packet);
00221 printf("########################################\n");
00222 fap_free(packet);
00223
00224 memset(buffer, 0, BUFFER_LEN);
00225 sprintf(buffer, "OH5LEP-9>V0SS62,OH2RDU*,OH3RBE-3*:`4V.l!e>/AZO-592");
00226 printf("########################################\n");
00227 printf("Testing parser with packet (%s) ... ", buffer);
00228 packet = fap_parseaprs(buffer, strlen(buffer), 0);
00229 if ( packet->error_code )
00230 {
00231 printf("failed: %s\n", fap_explain_error(*packet->error_code));
00232 retval = 0;
00233 }
00234 else printf("success\n");
00235 print_packet(packet);
00236 printf("########################################\n");
00237 fap_free(packet);
00238
00239 memset(buffer, 0, BUFFER_LEN);
00240 sprintf(buffer, "OH3RUX>BEACON,OH3RBE-1*,TRACE2-1:!6213.36N/02404.22E#PHG9500/R,W,T OH3RUX Virrat");
00241 printf("########################################\n");
00242 printf("Testing parser with packet (%s) ... ", buffer);
00243 packet = fap_parseaprs(buffer, strlen(buffer), 1);
00244 if ( packet->error_code )
00245 {
00246 printf("failed: %s\n", fap_explain_error(*packet->error_code));
00247 retval = 0;
00248 }
00249 else printf("success\n");
00250 print_packet(packet);
00251 printf("########################################\n");
00252 fap_free(packet);
00253
00254 memset(buffer, 0, BUFFER_LEN);
00255 sprintf(buffer, "OH7LZB-11>APRS,W4GR*,WIDE2-1,qAR,WA4DSY:$GPRMC,145526,A,3349.0378,N,08406.2617,W,23.726,27.9,121207,4.9,W*7A");
00256 printf("########################################\n");
00257 printf("Testing parser with packet (%s) ... ", buffer);
00258 packet = fap_parseaprs(buffer, strlen(buffer), 0);
00259 if ( packet->error_code )
00260 {
00261 printf("failed: %s\n", fap_explain_error(*packet->error_code));
00262 retval = 0;
00263 }
00264 else printf("success\n");
00265 print_packet(packet);
00266 printf("########################################\n");
00267 fap_free(packet);
00268
00269
00270
00271 return retval;
00272 }
00273
00274
00275
00276
00277 int test_converters(char const* filename)
00278 {
00279 FILE* infile;
00280
00281 int retval = 1, badness = 0, i = 0;
00282
00283 unsigned int out_len = BUFFER_LEN, tnc_id = 666;
00284 unsigned int kissframe_len = BUFFER_LEN;
00285 char outbuffer[out_len];
00286
00287 char orig_data[BUFFER_LEN];
00288 unsigned int orig_data_len;
00289
00290
00291 printf("Reading test data from %s:", filename);
00292 memset(buffer, 0, BUFFER_LEN);
00293 infile = fopen(filename, "r");
00294 while ( !feof(infile) )
00295 {
00296 buffer[i] = getc(infile);
00297 orig_data[i] = buffer[i];
00298 if ( !feof(infile) )
00299 {
00300 printf(" %2hhx", buffer[i]);
00301 ++i;
00302 }
00303 else
00304 {
00305 break;
00306 }
00307 }
00308 orig_data_len = i;
00309 fclose(infile);
00310 printf("\n");
00311
00312
00313 printf("########################################\n");
00314 printf("Testing kiss_to_tnc2() with a %d-byte input ... ", i);
00315 memset(outbuffer, 0, out_len);
00316 if ( fap_kiss_to_tnc2(buffer, i, (char*)&outbuffer, &out_len, &tnc_id) )
00317 {
00318 printf("success.\n");
00319 }
00320 else
00321 {
00322 printf("failure.\n");
00323 retval = 0;
00324 }
00325 printf("tnc2frame=(%s) len=(%d) tnc_id=(%d)\n", outbuffer, out_len, tnc_id);
00326 if ( !retval ) return 0;
00327 printf("########################################\n");
00328
00329
00330 printf("########################################\n");
00331 printf("Testing tnc2_to_kiss() by trying to convert output of previous test back to KISS frame ... ");
00332 memset(buffer, 0, BUFFER_LEN);
00333 if ( fap_tnc2_to_kiss(outbuffer, out_len, tnc_id, buffer, &kissframe_len) )
00334 {
00335 printf("success.\n");
00336 }
00337 else
00338 {
00339 printf("failure.\n");
00340 retval = 0;
00341 }
00342 printf("Comparing output to original test data:");
00343 for ( i = 0; i < orig_data_len; ++i )
00344 {
00345 if ( orig_data[i] != buffer[i] )
00346 {
00347 printf("!%2hhx%2hhx", orig_data[i], buffer[i]);
00348 badness = 1;
00349 }
00350 else
00351 {
00352 printf(" %2hhx%2hhx", orig_data[i], buffer[i]);
00353 }
00354 }
00355 printf("\n");
00356 if ( badness || kissframe_len != orig_data_len )
00357 {
00358 printf("Differences found, test failed!\n");
00359 retval = 0;
00360 }
00361 printf("Original test data had %d bytes, tnc2_to_kiss() returned %d bytes.\n", orig_data_len, kissframe_len);
00362 return retval;
00363 }
00364
00365
00366
00367 int main(int argc, char* argv[])
00368 {
00369 int retval;
00370 char const* kiss_datafile_name = "smoketest.data";
00371 FILE* tmp;
00372
00373 fap_init();
00374
00375 printf("Testing the parser.\n");
00376 retval = test_parser();
00377 if ( (tmp = fopen(kiss_datafile_name, "r")) != NULL )
00378 {
00379 fclose(tmp);
00380 printf("Found test data file, engaging converter tests.\n");
00381 retval = test_converters(kiss_datafile_name) && retval;
00382 }
00383
00384 fap_cleanup();
00385
00386 if ( !retval ) return EXIT_FAILURE;
00387 return EXIT_SUCCESS;
00388 }