Exemplo n.º 1
0
/** Dumps the raw serial traffic.  Warning: Never exits! */
int xserial_port_dump() 
{
    int cnt, serline;
    serline = xserial_port_open();

    while(1) { 
	unsigned char c;
	cnt = read(serline, &c, 1);

	if (cnt < 0) {
            perror("error reading from serial port");
	    exit(2);
	}
        if (cnt == 1) {
            if (c == SERIAL_START_BYTE) printf("\n");
            printf("%02x ", c);
        }
    }
}
Exemplo n.º 2
0
/**
 * 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) 
{
    // 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 */

    xpacket_initialize();

    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 'r':  g_params.bits.export_parsed = 1;  break;
                        default:   g_params.bits.export_cooked = 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);
//                        xdb_create_table(argv[argc]+3);
    	        }

                case 'b':
                    if (argv[argc][2] == '=') {
                        baudrate = xserial_set_baud(argv[argc]+3);
                        g_params.bits.display_baud = 1;
                    }
                    break;

                case 's':
                    if (argv[argc][2] == '=') {
                        xserial_set_device(argv[argc]+3);
                    }
                    break;

		case 't':
		    g_params.bits.display_time = 1;
		    break;

                case 'i':
		    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   -x = export readings in csv spreadsheet format [export]"
            "\n   -c = convert data to engineering units [cooked]"
            "\n   -l = log data to database or file [logged]"
            "\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 serial forwarder input [inet=host:port]"
            "\n   -o = output (forward serial) to port [onet=port] -!TBA!-"
            "\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();
    } else {
        g_istream = xserial_port_open();
    }
}