From 9d53e5fccc7924c9ac24b8963376fb30c79b968e Mon Sep 17 00:00:00 2001 From: Olivier Matz Date: Tue, 12 Nov 2013 22:18:49 +0100 Subject: [PATCH] add send_hello command --- commands.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ rc_proto.c | 22 ++++++++++++++++ rc_proto.h | 10 ++++--- 3 files changed, 105 insertions(+), 3 deletions(-) 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, diff --git a/rc_proto.c b/rc_proto.c index fe5c928..b04e18c 100644 --- a/rc_proto.c +++ b/rc_proto.c @@ -25,6 +25,8 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include + #include #include @@ -76,6 +78,26 @@ void rc_proto_rx_power_probe(int power_level) xbeeapp_send_atcmd("DB", NULL, 0, 0, update_power_level, NULL); } +/* send a hello message */ +// XXX iovec for xbee ? +int8_t rc_proto_send_hello(uint64_t addr, void *data, uint8_t data_len) +{ + struct { + struct rc_proto_echo_req hdr; + char buf[XBEE_MAX_FRAME_LEN - sizeof(struct rc_proto_echo_req)]; + } frame; + + if (data_len > sizeof(frame.buf)) + return -1; + + frame.hdr.type = RC_PROTO_HELLO; + frame.hdr.datalen = data_len; + memcpy(frame.buf, data, data_len); + return xbeeapp_send_msg(addr, &frame, + data_len + sizeof(struct rc_proto_echo_req), 1); +} + + #if 0 #define N_SERVO 6 #define SERVO_NBITS 10 diff --git a/rc_proto.h b/rc_proto.h index 217bb96..a12de34 100644 --- a/rc_proto.h +++ b/rc_proto.h @@ -10,7 +10,7 @@ struct rc_proto_hdr { #define RC_PROTO_HELLO 0 struct rc_proto_hello { uint8_t type; - uint8_t datalen; + uint8_t datalen; /* len of data excluding header */ uint8_t data[]; } __attribute__((packed)); @@ -18,7 +18,7 @@ struct rc_proto_hello { #define RC_PROTO_ECHO_REQ 1 struct rc_proto_echo_req { uint8_t type; - uint8_t datalen; + uint8_t datalen; /* len of data excluding header */ uint8_t data[]; } __attribute__((packed)); @@ -26,7 +26,7 @@ struct rc_proto_echo_req { #define RC_PROTO_ECHO_ANS 2 struct rc_proto_echo_ans { uint8_t type; - uint8_t datalen; + uint8_t datalen; /* len of data excluding header */ uint8_t data[]; } __attribute__((packed)); @@ -52,6 +52,10 @@ struct rc_proto_ack { uint8_t seq; } __attribute__((packed)); + +/* send a Hello message to a peer */ +int8_t rc_proto_send_hello(uint64_t addr, void *data, uint8_t data_len); + void rc_proto_rx_range(int power_level); #endif -- 2.20.1