X-Git-Url: http://git.droids-corp.org/?p=protos%2Fxbee-avr.git;a=blobdiff_plain;f=main.c;h=2bcb3ec974bf6c2ad45334c4b03cd506e24b4279;hp=d5c3f5a34bf1df30f013a09b653287c3f1e3848e;hb=0e1c93804369af27043c82ccc778c42bf54a9bd4;hpb=1a0d8b2d8fb17cf4b2c845c52b22dc932efa080b diff --git a/main.c b/main.c index d5c3f5a..2bcb3ec 100644 --- a/main.c +++ b/main.c @@ -60,6 +60,8 @@ #include "main.h" struct xbeeboard xbeeboard; +volatile uint16_t global_ms; +struct callout_manager cm; #define TIMEOUT_MS 1000 @@ -497,7 +499,7 @@ void xbee_unload_timeout(struct xbee_ctx *ctx) void bootloader(void) { -#define BOOTLOADER_ADDR 0x1e000 +#define BOOTLOADER_ADDR 0x1f800 if (pgm_read_byte_far(BOOTLOADER_ADDR) == 0xff) { printf_P(PSTR("Bootloader is not present\r\n")); return; @@ -526,13 +528,12 @@ void xbee_mainloop(void) int16_t c; /* from xbee to cmdline */ - c = CDC_Device_ReceiveByte(&VirtualSerial2_CDC_Interface); + c = xbee_dev_recv(NULL); if (c >= 0) - CDC_Device_SendByte(&VirtualSerial1_CDC_Interface, - (uint8_t)c); + cmdline_dev_send((uint8_t)c, NULL); /* from cmdline to xbee */ - c = CDC_Device_ReceiveByte(&VirtualSerial1_CDC_Interface); + c = cmdline_dev_recv(NULL); if (c == 4) { /* CTRL-d */ xbee_raw = 0; rdline_newline(&xbeeboard.rdl, @@ -540,11 +541,10 @@ void xbee_mainloop(void) } else if (c >= 0) { /* send to xbee */ - CDC_Device_SendByte(&VirtualSerial2_CDC_Interface, - (uint8_t)c); + xbee_dev_send((uint8_t)c, NULL); + /* echo on cmdline */ - CDC_Device_SendByte(&VirtualSerial1_CDC_Interface, - (uint8_t)c); + cmdline_dev_send((uint8_t)c, NULL); } } else { @@ -553,8 +553,104 @@ void xbee_mainloop(void) xbee_proto_rx(xbee_dev); } +#ifdef USE_USB CDC_Device_USBTask(&VirtualSerial1_CDC_Interface); CDC_Device_USBTask(&VirtualSerial2_CDC_Interface); USB_USBTask(); +#endif } } + +/* return time in milliseconds on unsigned 16 bits */ +static uint16_t get_time_ms(void) +{ + return global_ms; +} + +static void do_led_blink(struct callout_manager *cm, + struct callout *clt, void *dummy) +{ + static uint8_t a = 0; + +#ifdef USE_USB + if (a & 1) + LEDs_SetAllLEDs(0); + else + LEDs_SetAllLEDs(0xff); +#else + /* XXX */ +#endif + a++; +} + +static void increment_ms(void *dummy) +{ + global_ms++; +} + +static void main_timer_interrupt(void) +{ + static uint8_t cpt = 0; + cpt++; + sei(); + if ((cpt & 0x3) == 0) + scheduler_interrupt(); +} + +/** Main program entry point. This routine contains the overall program flow, including initial + * setup of all components and the main program loop. + */ +int main(void) +{ + struct callout t1; + FILE *xbee_file; + int8_t err; + struct xbee_dev dev; + +#ifdef USE_USB + SetupHardware(); + + LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); +#else + uart_init(); +#endif + + fdevopen(cmdline_dev_send, cmdline_dev_recv); + xbee_file = fdevopen(xbee_dev_send, xbee_dev_recv); + scheduler_init(); + timer_init(); + timer0_register_OV_intr(main_timer_interrupt); + + scheduler_add_periodical_event_priority(increment_ms, NULL, + 1000L / SCHEDULER_UNIT, + LED_PRIO); + cmdline_init(); +#ifndef USE_USB + /* in usb mode, it's done in usb callback */ + rdline_newline(&xbeeboard.rdl, xbeeboard.prompt); +#endif + callout_manager_init(&cm, get_time_ms); + callout_reset(&cm, &t1, 500, PERIODICAL, do_led_blink, NULL); + + /* initialize libxbee */ + err = xbee_init(); + if (err < 0) + return -1; + + xbee_dev = &dev; + + /* open xbee device */ + if (xbee_open(xbee_dev, xbee_file) < 0) + return -1; + + /* register default channel with a callback */ + if (xbee_register_channel(xbee_dev, XBEE_DEFAULT_CHANNEL, + xbee_rx, NULL) < 0) { + fprintf(stderr, "cannot register default channel\n"); + return -1; + } + + sei(); + xbee_mainloop(); + return 0; +}