X-Git-Url: http://git.droids-corp.org/?p=protos%2Fxbee-avr.git;a=blobdiff_plain;f=commands.c;h=f5676bea87b64240f06934a68e2bdd28d34f1868;hp=319e1faf439807fff88f8227da03a57c7e208264;hb=9d53e5fccc7924c9ac24b8963376fb30c79b968e;hpb=c552a01853bea12a3cd44e35be8c0df49ed7d7d0 diff --git a/commands.c b/commands.c index 319e1fa..f5676be 100644 --- a/commands.c +++ b/commands.c @@ -569,6 +569,81 @@ const parse_inst_t PROGMEM cmd_sendmsg = { /* ************* */ +/* this structure is filled when cmd_send_hello is parsed successfully */ +struct cmd_send_hello_result { + fixed_string_t send_hello; + uint64_t addr; + 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) +{ + struct cmd_send_hello_result *res = parsed_result; + uint16_t now, next, diff; + uint8_t flags; + + (void)data; + + IRQ_LOCK(flags); + now = global_ms; + IRQ_UNLOCK(flags); + + next = now; + + while (!cmdline_keypressed() || res->count == 0) { + IRQ_LOCK(flags); + now = global_ms; + IRQ_UNLOCK(flags); + + diff = now - next; + if (diff < res->period) + continue; + + rc_proto_send_hello(res->addr, res->data, strlen(res->data)); + next += res->period; + } +} + +const char PROGMEM str_send_hello[] = "send_hello"; + +const parse_token_string_t PROGMEM cmd_send_hello_send_hello = + TOKEN_STRING_INITIALIZER(struct cmd_send_hello_result, send_hello, + str_send_hello); + +const parse_token_num_t PROGMEM cmd_send_hello_addr = + TOKEN_NUM_INITIALIZER(struct cmd_send_hello_result, addr, UINT64); + +const parse_token_num_t PROGMEM cmd_send_hello_period = + TOKEN_NUM_INITIALIZER(struct cmd_send_hello_result, period, UINT16); + +const parse_token_num_t PROGMEM cmd_send_hello_count = + TOKEN_NUM_INITIALIZER(struct cmd_send_hello_result, count, UINT16); + +const parse_token_string_t PROGMEM cmd_send_hello_data = + TOKEN_STRING_INITIALIZER(struct cmd_send_hello_result, data, NULL); + +const char PROGMEM help_send_hello[] = + "Send hello msg to a node: addr, period_ms, count, str"; + +const parse_inst_t PROGMEM cmd_send_hello = { + .f = cmd_send_hello_parsed, /* function to call */ + .data = NULL, /* 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_addr, + (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 */ struct cmd_sendmsg_name_result { fixed_string_t sendmsg_name; @@ -1809,6 +1884,7 @@ const parse_ctx_t PROGMEM main_ctx[] = { &cmd_write_u16, &cmd_write_u32, &cmd_sendmsg, + &cmd_send_hello, &cmd_sendmsg_name, &cmd_range, &cmd_range_period,