support lolo's board
[protos/xbee-avr.git] / main.c
diff --git a/main.c b/main.c
index d5c3f5a..2bcb3ec 100644 (file)
--- 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;
+}