use callout instead of scheduler
[protos/xbee-avr.git] / main.c
diff --git a/main.c b/main.c
index 3959ee4..b81e0a8 100644 (file)
--- a/main.c
+++ b/main.c
@@ -46,8 +46,6 @@
 #include <errno.h>
 #include <ctype.h>
 
-#include <scheduler.h>
-#include <clock_time.h>
 #include <parse.h>
 #include <rdline.h>
 #include <timer.h>
@@ -57,8 +55,7 @@
 #include "main.h"
 
 struct xbeeboard xbeeboard;
-volatile uint16_t global_ms;
-struct callout_mgr cm;
+volatile uint32_t global_ms;
 
 #define TIMEOUT_MS 1000
 
@@ -517,17 +514,19 @@ static void evt_timeout(struct callout_mgr *cm, struct callout *clt,
 
        /* free event */
        xbee_unregister_channel(xbee_dev, ctx->channel);
+
+       callout_stop(cm, clt);
 }
 
 void xbee_load_timeout(struct xbee_ctx *ctx)
 {
        callout_init(&ctx->timeout, evt_timeout, ctx, 0);
-       callout_schedule(&cm, &ctx->timeout, TIMEOUT_MS);
+       callout_schedule(&xbeeboard.mainloop_cm, &ctx->timeout, TIMEOUT_MS);
 }
 
 void xbee_unload_timeout(struct xbee_ctx *ctx)
 {
-       callout_stop(&cm, &ctx->timeout);
+       callout_stop(&xbeeboard.mainloop_cm, &ctx->timeout);
 }
 
 void bootloader(void)
@@ -560,7 +559,7 @@ void bootloader(void)
 void xbee_mainloop(void)
 {
        while (1) {
-               callout_manage(&cm);
+               callout_manage(&xbeeboard.mainloop_cm);
 
                if (xbee_raw) {
                        int16_t c;
@@ -601,7 +600,7 @@ void xbee_mainloop(void)
 /* return time in milliseconds on unsigned 16 bits */
 static uint16_t get_time_ms(void)
 {
-       return global_ms;
+       return (uint16_t)global_ms;
 }
 
 static void main_timer_interrupt(void)
@@ -611,13 +610,6 @@ static void main_timer_interrupt(void)
 
        cpt++;
 
-       /* interrupt every 2048 cycles */
-       cycles += 2048;
-       if (cycles >= 12000) {
-               cycles -= 12000;
-               global_ms ++;
-       }
-
        /* LED blink */
        if (global_ms & 0x80)
                LED1_ON();
@@ -629,10 +621,17 @@ static void main_timer_interrupt(void)
        else
                BUZZER_OFF();
 
-       /* call scheduler every 682us with interrupt unlocked */
+       /* interrupt every 2048 cycles */
+       cycles += 2048;
+       if (cycles >= 12000) {
+               cycles -= 12000;
+               global_ms ++;
+       }
+
+       /* called every 682us (at 12 Mhz), but global_ms is not incremented at
+        * each call */
        sei();
-       if ((cpt & 0x3) == 0)
-               scheduler_interrupt();
+       callout_manage(&xbeeboard.intr_cm);
 }
 
 int main(void)
@@ -649,17 +648,16 @@ int main(void)
 
        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);
 
+       callout_mgr_init(&xbeeboard.intr_cm, get_time_ms);
+       callout_mgr_init(&xbeeboard.mainloop_cm, get_time_ms);
+
        cmdline_init();
        spi_servo_init();
        beep_init();
 
-       callout_mgr_init(&cm, get_time_ms);
-       //callout_reset(&cm, &t1, 500, PERIODICAL, do_led_blink, NULL);
-
        /* initialize libxbee */
        err = xbee_init();
        if (err < 0)