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