[Firebug-cvs] fireboard/tools/src/xlisten args.c, NONE, 1.1 args.h, NONE, 1.1 fbpacket.c, NONE, 1.1
Brought to you by:
doolin
From: David M. D. <do...@us...> - 2006-07-10 17:19:30
|
Update of /cvsroot/firebug/fireboard/tools/src/xlisten In directory sc8-pr-cvs5.sourceforge.net:/tmp/cvs-serv20688 Added Files: args.c args.h fbpacket.c Log Message: updating from beta. --- NEW FILE: fbpacket.c --- /** * $Id: fbpacket.c,v 1.1 2006/07/10 17:19:27 doolin Exp $ */ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <time.h> #include <sys/times.h> #include "xdb.h" #include "xsensors.h" #include "boards/fireboard.h" #include "args.h" /* uint8_t hours; uint8_t minutes; uint8_t Lat_deg; uint8_t Long_deg; float dec_sec; float Lat_dec_min; float Long_dec_min; uint8_t NSEWind; uint8_t fixQuality; uint8_t num_sats; */ // This next block is required to get the program to // link, has no use in the program. const char *g_version = "$Id: fbpacket.c,v 1.1 2006/07/10 17:19:27 doolin Exp $"; int g_istream; //!< Handle of input stream int xmain_get_verbose(s_params * g_params) { //return !g_params->bits.mode_quiet; return 0; } // end useless block /* Function call adds 1 clock_t to each cycle * through the loop compared to setting the * values in the loop. */ void init_gga_data(GGA_Data * gga_data) { gga_data->hours = 1; gga_data->minutes = 1; gga_data->Lat_deg = 1; gga_data->Long_deg = 1; gga_data->dec_sec = 1; gga_data->Lat_dec_min = 1; gga_data->Long_dec_min = 1; gga_data->NSEWind = 1; gga_data->fixQuality = 1; gga_data->num_sats = 1; } /** Clocking code is shitty, should be abstracted * out into a set of small useful functions, or * use a more convenient libc API. */ int main(int argc, char **argv) { int i; //struct tms tms_start, tms_end; clock_t start, stop; GGA_Data gga_data = {0}; XbowSensorboardPacket packet = {0}; start = clock(); printf("start: %d\n",start); init_gga_data(&gga_data); // This is a royal pain in the ass because the packets // on the mote side are built using unions to for // embedded headers, but on the processing side the data // is assumed to be aggregated. What a fuckin bitch for // writing test code. memcpy(packet.data,&gga_data,sizeof(packet.data)); for (i=0; i<100; i++) { fb_pg_log_gga_data(&packet); } stop = clock(); printf("stop: %d\n",stop); printf("clocks per sec: %d\n", CLOCKS_PER_SEC); printf("Elapsed time: %f\n", ((float)(stop - start)/CLOCKS_PER_SEC)); return 0; } --- NEW FILE: args.c --- #include "xsensors.h" #include "args.h" /** Global var containing xlisten cvs Id tag. */ extern const char *g_version; /** FILE pointer for the input device. * TODO: Open this device in main instead of * here where it is set. */ extern int g_istream; // TODO: 1. Move the argument parsing code in here. // 2. Change to getopts parsing. /** * Extracts command line options and sets flags internally. * * @param argc Argument count * @param argv Argument vector * * @author Martin Turon * * @version 2004/3/10 mturon Intial version * @n 2004/3/12 mturon Added -b,-s,-q,-x * @n 2004/8/04 mturon Added -l [ver. 1.11] * @n 2004/8/22 mturon Added -i [ver. 1.13] * @n 2004/9/27 mturon Added -t [ver. 1.15] * @n 2004/9/29 mturon Added -f,-a [v 1.16] */ void parse_args(int argc, char **argv, s_params * g_params) { // This value is set if/when the bitflag is set. unsigned baudrate = 0; char *server, *port; g_params->flat = 0; /* default to no params set */ while (argc) { if ((argv[argc]) && (*argv[argc] == '-')) { switch(argv[argc][1]) { case '?': g_params->bits.display_help = 1; break; case 'q': g_params->bits.mode_quiet = 1; break; case 'p': g_params->bits.display_parsed = 1; break; case 'r': g_params->bits.display_raw = 1; break; case 'a': g_params->bits.display_ascii = 1; break; case 'c': g_params->bits.display_cooked = 1; break; case 'x': switch (argv[argc][2]) { case 'c': g_params->bits.export_cooked = 1; break; default: case 'r': g_params->bits.export_parsed = 1; break; } break; case 'f': switch (argv[argc][2]) { case '=': // specify arbitrary offset g_params->bits.mode_framing = atoi(argv[argc]+3)&3; break; case 'a': // automatic deframing g_params->bits.mode_framing = 0; break; case '0': case 'n': // assume no framing g_params->bits.mode_framing = 2; break; case '1': // force framing default: g_params->bits.mode_framing = 1; break; } break; case 'w': case 'h': { int offset = XPACKET_DATASTART_MULTIHOP; g_params->bits.mode_header = 1; switch (argv[argc][2]) { case '=': // specify arbitrary offset offset = atoi(argv[argc]+3); break; case '0': // direct uart (no wireless) case '1': // single hop offset offset = XPACKET_DATASTART_STANDARD; break; } xpacket_set_start(offset); break; } case 'l': g_params->bits.log_cooked = 1; if (argv[argc][2] == '=') { //xdb_set_table(argv[argc]+3); if (!xdb_db_exists(argv[argc]+3)) { xdb_createdb(argv[argc]+3); xdb_set_dbname(argv[argc]+3); } } break; case 'b': if (argv[argc][2] == '=') { baudrate = xserial_set_baud(argv[argc]+3); g_params->bits.display_baud = 1; } break; case 's': switch (argv[argc][2]) { case '=': xserial_set_device(argv[argc]+3); break; case 'f': g_params->bits.mode_sf = 1; g_params->bits.mode_socket = 1; if (argv[argc][3] == '=') { server = argv[argc]+4; port = strchr(server, ':'); if (port) { *port++ = '\0'; xsocket_set_port(port); } xsocket_set_server(server); } break; } break; case 't': g_params->bits.display_time = 1; break; case 'i': g_params->bits.mode_sf = 0; g_params->bits.mode_socket = 1; if (argv[argc][2] == '=') { server = argv[argc]+3; port = strchr(server, ':'); if (port) { *port++ = '\0'; xsocket_set_port(port); } xsocket_set_server(server); } break; case 'v': g_params->bits.mode_version = 1; break; case 'd': g_params->bits.mode_debug = 1; break; } } argc--; } if (!g_params->bits.mode_quiet) { // Summarize parameter settings printf("xlisten Ver:%s\n", g_version); if (g_params->bits.mode_version) xpacket_print_versions(); printf("Using params: "); if (g_params->bits.display_help) printf("[help] "); if (g_params->bits.display_baud) printf("[baud=0x%04x] ", baudrate); if (g_params->bits.display_raw) printf("[raw] "); if (g_params->bits.display_ascii) printf("[ascii] "); if (g_params->bits.display_parsed) printf("[parsed] "); if (g_params->bits.display_cooked) printf("[cooked] "); if (g_params->bits.export_parsed) printf("[export] "); if (g_params->bits.display_time) printf("[timed] "); if (g_params->bits.export_cooked) printf("[convert] "); if (g_params->bits.log_cooked) printf("[logging] "); if (g_params->bits.mode_framing==1)printf("[framed] "); if (g_params->bits.mode_framing==2)printf("[unframed] "); if (g_params->bits.mode_header) printf("[header=%i] ", xpacket_get_start()); if (g_params->bits.mode_socket) printf("[inet=%s:%u] ", xsocket_get_server(), xsocket_get_port()); if (g_params->bits.mode_debug) { printf("[debug - serial dump!] \n"); xserial_port_dump(); } printf("\n"); } if (g_params->bits.display_help) { printf( "\nUsage: xlisten <-?|r|p|c|x|l|d|v|q> <-l=table>" "\n <-s=device> <-b=baud> <-i=server:port>" "\n -? = display help [help]" "\n -r = raw display of tos packets [raw]" "\n -a = ascii display of tos packets [ascii]" "\n -p = parse packet into raw sensor readings [parsed]" "\n -c = convert data to engineering units [cooked]" "\n -l = log data to database or file [logged]" "\n -xr = export raw readings in csv spreadsheet format [export]" "\n -xc = export cooked in csv spreadsheet format [export]" "\n -d = debug serial port by dumping bytes [debug]" "\n -b = set the baudrate [baud=#|mica2|mica2dot]" "\n -s = set serial port device [device=com1]" "\n -i = use socket input [inet=host:port]" "\n -sf = use serial forwarder input [inet=host:port]" "\n -f = specify framing (0=auto|1=on|2=off)" "\n -h = specify header size [header=offset]" "\n -t = display time packet was received [timed]" "\n -q = quiet mode (suppress headers)" "\n -v = show version of all modules" "\n" ); exit(0); } /* Default to displaying packets as raw, parsed, and cooked. */ if (g_params->options.output == 0) { g_params->bits.display_raw = 1; g_params->bits.display_parsed = 1; g_params->bits.display_cooked = 1; } /** TODO: This should probably go back into main. * Once the code is tested out, delete the following. */ #if 0 /* Stream initialization */ // Set STDOUT and STDERR to be line buffered, so output is not delayed. setlinebuf(stdout); setlinebuf(stderr); if (g_params->bits.mode_socket) { g_istream = xsocket_port_open(); } else { g_istream = xserial_port_open(); } #endif } --- NEW FILE: args.h --- /** A structure to store parsed parameter flags. */ typedef union { unsigned flat; struct { // output display options unsigned display_raw : 1; //!< raw TOS packets unsigned display_parsed : 1; //!< pull out sensor readings unsigned display_cooked : 1; //!< convert to engineering units unsigned export_parsed : 1; //!< output comma delimited fields unsigned export_cooked : 1; //!< output comma delimited fields unsigned log_parsed : 1; //!< log output to database unsigned log_cooked : 1; //!< log output to database unsigned display_time : 1; //!< display timestamp of packet unsigned display_ascii : 1; //!< display packet as ASCII characters unsigned display_rsvd : 7; //!< pad first word for output options // modes of operation unsigned display_help : 1; unsigned display_baud : 1; //!< baud was set by user unsigned mode_debug : 1; //!< debug serial port unsigned mode_quiet : 1; //!< suppress headers unsigned mode_version : 1; //!< print versions of all modules unsigned mode_header : 1; //!< user using custom packet header unsigned mode_socket : 1; //!< connect to a serial socket unsigned mode_sf : 1; //!< connect to a serial forwarder unsigned mode_framing : 2; //!< auto=0, framed=1, unframed=2 } bits; struct { unsigned short output; //!< one output option required unsigned short mode; } options; } s_params; void parse_args (int argc, char **argv, s_params * g_params); |