[Firebug-cvs] fireboard/beta/tools/src/xlisten args.c,NONE,1.1 args.h,NONE,1.1 Makefile,1.7,1.8 xdb.
Brought to you by:
doolin
From: David M. D. <do...@us...> - 2005-06-19 22:28:43
|
Update of /cvsroot/firebug/fireboard/beta/tools/src/xlisten In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9568 Modified Files: Makefile xdb.c xdb.h xlisten.c Added Files: args.c args.h Log Message: Database connection can now specified from the command using the -l option. Index: xdb.c =================================================================== RCS file: /cvsroot/firebug/fireboard/beta/tools/src/xlisten/xdb.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** xdb.c 17 Jun 2005 23:23:36 -0000 1.5 --- xdb.c 19 Jun 2005 22:28:33 -0000 1.6 *************** *** 14,17 **** --- 14,21 ---- #include <libpq-fe.h> + /** These variables should be read in from a + * a local configuration file which is not + * archived in cvs. + */ static char *g_server = "localhost"; //!< Postgres server IP or hostname static char *g_port = "5432"; //!< Postgres server port *************** *** 24,51 **** void xdb_set_table(char *table) { g_table = table; } - void - xdb_set_dbname(char *dbname) { - - int errno; - char command[256]; - char * statement = "create database %s"; - sprintf(command,statement,dbname); - errno = xdb_execute(command); - - #if 0 - if (errno == 0) { - g_dbname = dbname; - } else { - exit(0); - } - #endif - - } - - PGconn *xdb_exit(PGconn *conn) - { PQfinish(conn); return NULL; --- 28,36 ---- void xdb_set_table(char *table) { g_table = table; } + PGconn * + xdb_exit(PGconn *conn) { PQfinish(conn); return NULL; *************** *** 83,92 **** * check to see that the backend connection was successfully made */ ! if (PQstatus(conn) == CONNECTION_BAD) ! { ! fprintf(stderr, "error: Connection to database '%s' failed.\n", ! g_dbname); ! fprintf(stderr, "%s", PQerrorMessage(conn)); ! conn = xdb_exit(conn); } --- 68,75 ---- * check to see that the backend connection was successfully made */ ! if (PQstatus(conn) == CONNECTION_BAD) { ! //fprintf(stderr, "error: Connection to database '%s' failed.\n", g_dbname); ! fprintf(stderr, "%s", PQerrorMessage(conn)); ! conn = xdb_exit(conn); } *************** *** 181,182 **** --- 164,202 ---- return xdb_execute(command); } + + + #define PG_DB_NOT_EXISTS "FATAL: database %s does not exist" + + + + void + xdb_set_dbname(char *dbname) { + + g_dbname = dbname; + } + + + int + xdb_db_exists(const char * dbname) { + + PGconn *conn; + conn = PQsetdbLogin(g_server, g_port, NULL, NULL, + dbname, g_user, g_passwd); + + if (PQstatus(conn) == CONNECTION_BAD) { + return 0; + } + return 1; + } + + void + xdb_createdb(char * dbname) { + + int errno; + char command[256]; + char * statement = "create database %s"; + sprintf(command,statement,dbname); + errno = xdb_execute(command); + } + + --- 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); Index: xdb.h =================================================================== RCS file: /cvsroot/firebug/fireboard/beta/tools/src/xlisten/xdb.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** xdb.h 17 Jun 2005 22:09:49 -0000 1.4 --- xdb.h 19 Jun 2005 22:28:33 -0000 1.5 *************** *** 17,28 **** #include "timestamp/timestamp.h" - PGconn *xdb_connect (); - PGconn *xdb_exit (PGconn *conn); - int xdb_execute (char *command); ! char *xdb_get_table (); ! void xdb_set_table (char *table); void xdb_set_dbname (char *table); ! int xdb_table_exists (char *table); #endif /* __XDB_H__ */ --- 17,34 ---- #include "timestamp/timestamp.h" ! PGconn *xdb_connect (void); ! PGconn *xdb_exit (PGconn *conn); ! int xdb_execute (char *command); ! ! char *xdb_get_table (void); ! void xdb_set_table (char *table); void xdb_set_dbname (char *table); ! int xdb_table_exists (char *table); ! ! /** Requires an existing database for connecting. */ ! void xdb_createdb (char * dbname); ! ! int xdb_db_exists (const char * dbname); #endif /* __XDB_H__ */ Index: Makefile =================================================================== RCS file: /cvsroot/firebug/fireboard/beta/tools/src/xlisten/Makefile,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** Makefile 2 Jun 2005 00:00:24 -0000 1.7 --- Makefile 19 Jun 2005 22:28:33 -0000 1.8 *************** *** 10,14 **** # Main xlisten sources SRCS = xlisten.c xpacket.c xconvert.c xdb.c ! SRCS += xserial.c xsocket.c # Add Mote Sensor board support --- 10,14 ---- # Main xlisten sources SRCS = xlisten.c xpacket.c xconvert.c xdb.c ! SRCS += xserial.c xsocket.c args.c # Add Mote Sensor board support Index: xlisten.c =================================================================== RCS file: /cvsroot/firebug/fireboard/beta/tools/src/xlisten/xlisten.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** xlisten.c 17 Jun 2005 23:23:41 -0000 1.5 --- xlisten.c 19 Jun 2005 22:28:33 -0000 1.6 *************** *** 12,60 **** #include "xsensors.h" ! static const char *g_version = "$Id$"; - /** 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; ! /** A variable to store parsed parameter flags. */ ! static s_params g_params; ! static int g_istream; //!< Handle of input stream /** ! * Extracts command line options and sets flags internally. * * @param argc Argument count --- 12,35 ---- #include "xsensors.h" + #include "args.h" ! /** It's OK to make this global. */ ! const char *g_version = "$Id$"; ! /** TODO: Set the name of the input stream in the argument ! * parsing code, but open it in main. ! */ ! int g_istream; //!< Handle of input stream ! ! ! int ! xmain_get_verbose(s_params * g_params) { ! return !g_params->bits.mode_quiet; ! } /** ! * The main entry point for the sensor listener console application. * * @param argc Argument count *************** *** 62,296 **** * * @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) ! { ! // 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); ! printf("dbname=%s\n",argv[argc]+3); ! xdb_set_dbname(argv[argc]+3); ! //exit(0); ! } ! 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; ! } ! /* 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(); --- 37,55 ---- * * @author Martin Turon * @version 2004/3/10 mturon Intial version */ ! int ! main(int argc, char **argv) { ! int length; ! unsigned char buffer[255]; ! /* A variable to store parsed parameter flags. */ ! s_params g_params; + parse_args(argc, argv, &g_params); + /* 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(); *************** *** 298,322 **** g_istream = xserial_port_open(); } - } - - int xmain_get_verbose() { - return !g_params.bits.mode_quiet; - } ! /** ! * The main entry point for the sensor listener console application. ! * ! * @param argc Argument count ! * @param argv Argument vector ! * ! * @author Martin Turon ! * @version 2004/3/10 mturon Intial version ! */ ! int main(int argc, char **argv) ! { ! int length; ! unsigned char buffer[255]; ! ! parse_args(argc, argv); xpacket_initialize(); --- 57,64 ---- g_istream = xserial_port_open(); } ! /* Each different sensor board has different packet ! * layouts, which are initialized in the following. ! */ xpacket_initialize(); |