parse rx hello frames
authorOlivier Matz <zer0@droids-corp.org>
Tue, 12 Nov 2013 22:36:59 +0000 (23:36 +0100)
committerOlivier Matz <zer0@droids-corp.org>
Sun, 9 Mar 2014 21:13:08 +0000 (22:13 +0100)
commands.c
main.c

index f5676be..2e02551 100644 (file)
@@ -573,19 +573,24 @@ const parse_inst_t PROGMEM cmd_sendmsg = {
 struct cmd_send_hello_result {
        fixed_string_t send_hello;
        uint64_t addr;
+       struct xbee_neigh *neigh;
        uint16_t period;
        uint16_t count;
        fixed_string_t data;
 };
 
 /* function called when cmd_send_hello is parsed successfully */
-static void cmd_send_hello_parsed(void *parsed_result, void *data)
+static void cmd_send_hello_parsed(void *parsed_result, void *use_neigh)
 {
        struct cmd_send_hello_result *res = parsed_result;
        uint16_t now, next, diff;
        uint8_t flags;
+       uint64_t addr;
 
-       (void)data;
+       if (use_neigh)
+               addr = res->neigh->addr;
+       else
+               addr = res->addr;
 
        IRQ_LOCK(flags);
        now = global_ms;
@@ -593,7 +598,7 @@ static void cmd_send_hello_parsed(void *parsed_result, void *data)
 
        next = now;
 
-       while (!cmdline_keypressed() || res->count == 0) {
+       while (!cmdline_keypressed() && res->count != 0) {
                IRQ_LOCK(flags);
                now = global_ms;
                IRQ_UNLOCK(flags);
@@ -602,8 +607,9 @@ static void cmd_send_hello_parsed(void *parsed_result, void *data)
                if (diff < res->period)
                        continue;
 
-               rc_proto_send_hello(res->addr, res->data, strlen(res->data));
+               rc_proto_send_hello(addr, res->data, strlen(res->data));
                next += res->period;
+               res->count--;
        }
 }
 
@@ -642,6 +648,24 @@ const parse_inst_t PROGMEM cmd_send_hello = {
        },
 };
 
+const parse_token_neighbor_t PROGMEM cmd_send_hello_neigh =
+       TOKEN_NEIGHBOR_INITIALIZER(struct cmd_send_hello_result, neigh,
+                                  &xbee_dev);
+
+const parse_inst_t PROGMEM cmd_send_hello_name = {
+       .f = cmd_send_hello_parsed,  /* function to call */
+       .data = (void *)1,      /* 2nd arg of func */
+       .help_str = help_send_hello,
+       .tokens = {        /* token list, NULL terminated */
+               (PGM_P)&cmd_send_hello_send_hello,
+               (PGM_P)&cmd_send_hello_neigh,
+               (PGM_P)&cmd_send_hello_period,
+               (PGM_P)&cmd_send_hello_count,
+               (PGM_P)&cmd_send_hello_data,
+               NULL,
+       },
+};
+
 /* ************* */
 
 /* this structure is filled when cmd_sendmsg_name is parsed successfully */
@@ -1885,6 +1909,7 @@ const parse_ctx_t PROGMEM main_ctx[] = {
        &cmd_write_u32,
        &cmd_sendmsg,
        &cmd_send_hello,
+       &cmd_send_hello_name,
        &cmd_sendmsg_name,
        &cmd_range,
        &cmd_range_period,
diff --git a/main.c b/main.c
index 2d280a4..c3511b5 100644 (file)
--- a/main.c
+++ b/main.c
@@ -266,6 +266,16 @@ int xbee_recv_data(struct xbee_recv_hdr *recvframe, unsigned len)
                        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:
                        return -1;
        }