use callout from aversive
[protos/xbee-avr.git] / main.c
diff --git a/main.c b/main.c
index 0d5cad6..3959ee4 100644 (file)
--- a/main.c
+++ b/main.c
@@ -58,7 +58,7 @@
 
 struct xbeeboard xbeeboard;
 volatile uint16_t global_ms;
-struct callout_manager cm;
+struct callout_mgr cm;
 
 #define TIMEOUT_MS 1000
 
@@ -203,15 +203,16 @@ static int dump_atcmd(struct xbee_ctx *ctx, struct xbee_atresp_hdr *frame,
        result = (void *)frame->data;
        len -= offsetof(struct xbee_atresp_hdr, data);
        if (cmd.flags & XBEE_ATCMD_F_PARAM_U8 && len == sizeof(uint8_t))
-               printf_P(PSTR("<%s> is 0x%x\r\n"), atcmd_str, result->u8);
+               printf_P(PSTR("<%s> is 0x%x (%d)\r\n"), atcmd_str, result->u8,
+                        result->u8);
        else if (cmd.flags & XBEE_ATCMD_F_PARAM_U16 && len == sizeof(uint16_t))
-               printf_P(PSTR("<%s> is 0x%x\r\n"),
+               printf_P(PSTR("<%s> is 0x%x (%d)\r\n"),
                         atcmd_str,
-                        ntohs(result->u16));
+                        ntohs(result->u16), ntohs(result->u16));
        else if (cmd.flags & XBEE_ATCMD_F_PARAM_U32 && len == sizeof(uint32_t))
-               printf_P(PSTR("<%s> is 0x%"PRIx32"\r\n"),
+               printf_P(PSTR("<%s> is 0x%"PRIx32" (%"PRIu32")\r\n"),
                         atcmd_str,
-                        ntohl(result->u32));
+                        ntohl(result->u32), ntohs(result->u32));
        else if (cmd.flags & XBEE_ATCMD_F_PARAM_S16 && len == sizeof(int16_t))
                printf_P(PSTR("<%s> is %d\r\n"), atcmd_str, ntohs(result->s16));
        else if (len == 0)
@@ -237,6 +238,7 @@ int xbee_recv_data(struct xbee_recv_hdr *recvframe, unsigned len)
                return -1;
 
        switch (rch->type) {
+#if 0
                case RC_PROTO_TYPE_CHANNEL: {
                        struct rc_proto_channel *rcc =
                                (struct rc_proto_channel *) recvframe->data;
@@ -261,6 +263,17 @@ int xbee_recv_data(struct xbee_recv_hdr *recvframe, unsigned len)
 
                        rc_proto_rx_range(rcr->power_level);
 
+                       break;
+               }
+#endif
+               case RC_PROTO_HELLO: {
+                       struct rc_proto_hello *rch =
+                               (struct rc_proto_hello *) recvframe->data;
+
+                       if (xbee_debug)
+                               printf_P(PSTR("recv hello len=%d\r\n"),
+                                        rch->datalen);
+
                        break;
                }
                default:
@@ -271,11 +284,11 @@ int xbee_recv_data(struct xbee_recv_hdr *recvframe, unsigned len)
 }
 
 /* socat /dev/ttyUSB0,raw,echo=0,b115200 /dev/ttyACM1,raw,echo=0,b115200 */
-void xbee_rx(struct xbee_dev *dev, int channel, int type,
+int8_t xbeeapp_rx(struct xbee_dev *dev, int channel, int type,
             void *frame, unsigned len, void *opaque)
 {
        struct xbee_ctx *ctx = opaque;
-       int do_hexdump = xbee_hexdump;
+       int8_t ret = 0;
 
        if (xbee_debug)
                printf_P(PSTR("type=0x%x, channel=%d, ctx=%p\r\n"),
@@ -317,24 +330,28 @@ void xbee_rx(struct xbee_dev *dev, int channel, int type,
 
                        /* this answer contains an atcmd answer at offset 10 */
                        if (dump_atcmd(ctx, frame + 10, len - 10) < 0)
-                               do_hexdump = 1;
+                               ret = -1;
+
                        break;
                }
                case XBEE_TYPE_ATRESP: {
                        if (dump_atcmd(ctx, frame, len) < 0)
-                               do_hexdump = 1;
+                               ret = -1;
+
                        break;
                }
 
                case XBEE_TYPE_XMIT_STATUS: {
                        if (parse_xmit_status(ctx, frame, len) < 0)
-                               do_hexdump = 1;
+                               ret = -1;
+
                        break;
                }
 
                case XBEE_TYPE_RECV: {
                        if (xbee_recv_data(frame, len) < 0)
-                               do_hexdump = 1;
+                               ret = -1;
+
                        break;
                }
 
@@ -347,11 +364,13 @@ void xbee_rx(struct xbee_dev *dev, int channel, int type,
                case XBEE_TYPE_NODE_ID:
                default:
                        printf_P(PSTR("Invalid frame\r\n"));
-                       do_hexdump = 1;
+                       ret = -1;
                        break;
        }
 
-       if (do_hexdump)
+       if (ret < 0)
+               hexdump("undecoded rx frame", frame, len);
+       else if (xbee_hexdump)
                hexdump("undecoded rx frame", frame, len);
 
        /* restart command line if it was a blocking query */
@@ -377,7 +396,7 @@ static int xbeeapp_send(struct xbee_ctx *ctx, int type, void *buf, unsigned len,
 
        /* register a channel */
        channel = xbee_register_channel(xbee_dev, XBEE_CHANNEL_ANY,
-                                       xbee_rx, NULL);
+                                       xbeeapp_rx, NULL);
        if (channel < 0) {
                printf_P(PSTR("cannot send: no free channel\r\n"));
                return -1;
@@ -395,8 +414,7 @@ static int xbeeapp_send(struct xbee_ctx *ctx, int type, void *buf, unsigned len,
                hexdump("xmit frame", buf, len);
 
        /* transmit the frame on this channel */
-       ret = xbee_proto_xmit(xbee_dev, channel, type, buf,
-                             len);
+       ret = xbee_tx(xbee_dev, channel, type, buf, len);
        if (ret < 0) {
                printf_P(PSTR("cannot send\r\n"));
                xbee_unregister_channel(xbee_dev, channel);
@@ -483,7 +501,7 @@ void xbee_stdin_disable(void)
        xbee_cmdline_input_enabled = 0;
 }
 
-static void evt_timeout(struct callout_manager *cm, struct callout *clt,
+static void evt_timeout(struct callout_mgr *cm, struct callout *clt,
                        void *arg)
 {
        struct xbee_ctx *ctx = arg;
@@ -503,7 +521,8 @@ static void evt_timeout(struct callout_manager *cm, struct callout *clt,
 
 void xbee_load_timeout(struct xbee_ctx *ctx)
 {
-       callout_reset(&cm, &ctx->timeout, TIMEOUT_MS, SINGLE, evt_timeout, ctx);
+       callout_init(&ctx->timeout, evt_timeout, ctx, 0);
+       callout_schedule(&cm, &ctx->timeout, TIMEOUT_MS);
 }
 
 void xbee_unload_timeout(struct xbee_ctx *ctx)
@@ -574,7 +593,7 @@ void xbee_mainloop(void)
                else {
                        if (xbee_cmdline_input_enabled)
                                cmdline_poll();
-                       xbee_proto_rx(xbee_dev);
+                       xbee_rx(xbee_dev);
                }
        }
 }
@@ -638,10 +657,7 @@ int main(void)
        spi_servo_init();
        beep_init();
 
-       printf_P(PSTR("\r\n"));
-       rdline_newline(&xbeeboard.rdl, xbeeboard.prompt);
-
-       callout_manager_init(&cm, get_time_ms);
+       callout_mgr_init(&cm, get_time_ms);
        //callout_reset(&cm, &t1, 500, PERIODICAL, do_led_blink, NULL);
 
        /* initialize libxbee */
@@ -657,13 +673,17 @@ int main(void)
 
        /* register default channel with a callback */
        if (xbee_register_channel(xbee_dev, XBEE_DEFAULT_CHANNEL,
-                                 xbee_rx, NULL) < 0) {
+                                 xbeeapp_rx, NULL) < 0) {
                fprintf(stderr, "cannot register default channel\n");
                return -1;
        }
        sei();
 
        eeprom_load_config();
+
+       printf_P(PSTR("\r\n"));
+       rdline_newline(&xbeeboard.rdl, xbeeboard.prompt);
+
        xbee_mainloop();
        return 0;
 }