rc_proto: allow to disable computation of best power level
[protos/xbee-avr.git] / commands.c
index ddce65f..c6a6cc9 100644 (file)
@@ -133,7 +133,7 @@ static void range_cb(struct callout_mgr *cm,
 static int8_t send_msg_cb(int8_t retcode, void *frame, unsigned len,
        void *arg)
 {
-       struct xbee_recv_hdr *recvframe = frame;
+       struct xbee_xmit_status_hdr *recvframe = frame;
        uint8_t *done = arg;
 
        *done = 1;
@@ -142,7 +142,7 @@ static int8_t send_msg_cb(int8_t retcode, void *frame, unsigned len,
                return retcode;
        }
        if (retcode == XBEE_USER_RETCODE_BAD_FRAME ||
-               len  sizeof(*recvframe)) {
+               len != sizeof(*recvframe)) {
                printf_P(PSTR("invalid frame\r\n"));
                return XBEE_USER_RETCODE_BAD_FRAME;
        }
@@ -1613,6 +1613,93 @@ const parse_inst_t PROGMEM cmd_rc_proto_stats = {
 
 /**********************************************************/
 
+/* this structure is filled when cmd_rc_proto_timers is parsed successfully */
+struct cmd_rc_proto_timers_result {
+       fixed_string_t arg0;
+       fixed_string_t arg1;
+       uint16_t servo_min;
+       uint16_t servo_max;
+       uint16_t power_probe;
+       uint16_t autobypass;
+};
+
+static void cmd_rc_proto_timers_parsed(void *parsed_result, void *data)
+{
+       struct cmd_rc_proto_timers_result *res = parsed_result;
+       (void)data;
+
+       if (!strcmp_P(res->arg1, PSTR("set"))) {
+               rc_proto_timers.send_servo_min_ms = res->servo_min;
+               rc_proto_timers.send_servo_max_ms = res->servo_max;
+               rc_proto_timers.send_power_probe_ms = res->power_probe;
+               rc_proto_timers.autobypass_ms = res->autobypass;
+       }
+
+       printf_P(PSTR("rc_proto_timers: min=%d, max=%d, "
+                       "power_probe=%d autobypass=%d\n"),
+               rc_proto_timers.send_servo_min_ms,
+               rc_proto_timers.send_servo_max_ms,
+               rc_proto_timers.send_power_probe_ms,
+               rc_proto_timers.autobypass_ms);
+}
+
+const char PROGMEM str_rc_proto_timers_arg0[] = "rc_proto_timers";
+const parse_token_string_t PROGMEM cmd_rc_proto_timers_arg0 =
+       TOKEN_STRING_INITIALIZER(struct cmd_rc_proto_timers_result, arg0,
+                                str_rc_proto_timers_arg0);
+const char PROGMEM str_rc_proto_timers_arg1[] = "set";
+const parse_token_string_t PROGMEM cmd_rc_proto_timers_arg1 =
+       TOKEN_STRING_INITIALIZER(struct cmd_rc_proto_timers_result, arg1,
+                                str_rc_proto_timers_arg1);
+const parse_token_num_t PROGMEM cmd_rc_proto_timers_servo_min =
+       TOKEN_NUM_INITIALIZER(struct cmd_rc_proto_timers_result, servo_min,
+               UINT16);
+const parse_token_num_t PROGMEM cmd_rc_proto_timers_servo_max =
+       TOKEN_NUM_INITIALIZER(struct cmd_rc_proto_timers_result, servo_max,
+               UINT16);
+const parse_token_num_t PROGMEM cmd_rc_proto_timers_power_probe =
+       TOKEN_NUM_INITIALIZER(struct cmd_rc_proto_timers_result, power_probe,
+               UINT16);
+const parse_token_num_t PROGMEM cmd_rc_proto_timers_autobypass =
+       TOKEN_NUM_INITIALIZER(struct cmd_rc_proto_timers_result, autobypass,
+               UINT16);
+
+const char PROGMEM help_rc_proto_timers[] = "set rc_proto_timers (servo_min, "
+       "servo_max, pow_probe, autobypass)";
+const parse_inst_t PROGMEM cmd_rc_proto_timers = {
+       .f = cmd_rc_proto_timers_parsed,  /* function to call */
+       .data = NULL,      /* 2nd arg of func */
+       .help_str = help_rc_proto_timers,
+       .tokens = {        /* token list, NULL terminated */
+               (PGM_P)&cmd_rc_proto_timers_arg0,
+               (PGM_P)&cmd_rc_proto_timers_arg1,
+               (PGM_P)&cmd_rc_proto_timers_servo_min,
+               (PGM_P)&cmd_rc_proto_timers_servo_max,
+               (PGM_P)&cmd_rc_proto_timers_power_probe,
+               (PGM_P)&cmd_rc_proto_timers_autobypass,
+               NULL,
+       },
+};
+
+const char PROGMEM str_rc_proto_timers_show_arg1[] = "show";
+const parse_token_string_t PROGMEM cmd_rc_proto_timers_show_arg1 =
+       TOKEN_STRING_INITIALIZER(struct cmd_rc_proto_timers_result, arg1,
+                                str_rc_proto_timers_show_arg1);
+
+const char PROGMEM help_rc_proto_timers_show[] = "show rc_proto timers value";
+const parse_inst_t PROGMEM cmd_rc_proto_timers_show = {
+       .f = cmd_rc_proto_timers_parsed,  /* function to call */
+       .data = NULL,      /* 2nd arg of func */
+       .help_str = help_rc_proto_timers_show,
+       .tokens = {        /* token list, NULL terminated */
+               (PGM_P)&cmd_rc_proto_timers_arg0,
+               (PGM_P)&cmd_rc_proto_timers_show_arg1,
+               NULL,
+       },
+};
+
+/**********************************************************/
+
 /* this structure is filled when cmd_rc_proto_mode is parsed successfully */
 struct cmd_rc_proto_mode_result {
        fixed_string_t arg0;
@@ -1655,6 +1742,12 @@ static void cmd_rc_proto_mode_parsed(void *parsed_result, void *data)
                else
                        flags &= ~RC_PROTO_FLAGS_TX_POW_PROBE;
        }
+       else if (!strcmp_P(res->cmd, PSTR("compute_best_pow"))) {
+               if (on == 1)
+                       flags |= RC_PROTO_FLAGS_COMPUTE_BEST_POW;
+               else
+                       flags &= ~RC_PROTO_FLAGS_COMPUTE_BEST_POW;
+       }
        else if (!strcmp_P(res->cmd, PSTR("tx"))) {
                flags &= ~RC_PROTO_FLAGS_TX_MASK;
                if (!strcmp_P(res->val, PSTR("bypass")))
@@ -1679,6 +1772,8 @@ static void cmd_rc_proto_mode_parsed(void *parsed_result, void *data)
                (flags & RC_PROTO_FLAGS_TX_STATS) ? "on" : "off");
        printf_P(PSTR("rc_proto_mode tx_power_probe %s\n"),
                (flags & RC_PROTO_FLAGS_TX_POW_PROBE) ? "on" : "off");
+       printf_P(PSTR("rc_proto_mode compute_best_pow %s\n"),
+               (flags & RC_PROTO_FLAGS_COMPUTE_BEST_POW) ? "on" : "off");
 }
 
 const char PROGMEM str_rc_proto_mode_arg0[] = "rc_proto_mode";
@@ -1687,7 +1782,7 @@ const parse_token_string_t PROGMEM cmd_rc_proto_mode_arg0 =
                                 str_rc_proto_mode_arg0);
 
 const char PROGMEM str_rc_proto_mode_cmd[] =
-       "rx_copy_spi#rx_autobypass#tx_stats#tx_power_probe";
+       "rx_copy_spi#rx_autobypass#tx_stats#tx_power_probe#compute_best_pow";
 const parse_token_string_t PROGMEM cmd_rc_proto_mode_cmd =
        TOKEN_STRING_INITIALIZER(struct cmd_rc_proto_mode_result, cmd,
                str_rc_proto_mode_cmd);
@@ -2053,7 +2148,6 @@ static void cmd_eeprom_add_parsed(void *parsed_result,
        rdline_init(&rdl, cmdline_write_char, NULL, NULL);
        rdline_newline(&rdl, "> ");
 
-       /* XXX bad: we should not block as we do not serve callout */
        while (1) {
                c = cmdline_dev_recv(NULL);
                if (c < 0)
@@ -2193,6 +2287,8 @@ const parse_ctx_t PROGMEM main_ctx[] = {
        &cmd_test_spi,
        &cmd_dump_xbee_stats,
        &cmd_rc_proto_stats,
+       &cmd_rc_proto_timers,
+       &cmd_rc_proto_timers_show,
        &cmd_rc_proto_mode,
        &cmd_rc_proto_mode2,
        &cmd_rc_proto_mode3,