#define RX_DB_THRESHOLD 65 /* mean -65 dB */
-/* XXX make it configurable */
-/* min time between 2 servo_send */
-#define SEND_SERVO_MIN_TIME_MS 50
-/* max time between 2 servo_send */
-#define SEND_SERVO_MAX_TIME_MS 300
-/* time before switching into bypass mode when no servo command received */
-#define AUTO_BYPASS_TIME_MS 500
+/* default values */
+struct rc_proto_timers rc_proto_timers = {
+ .send_servo_min_ms = 50,
+ .send_servo_max_ms = 300,
+ .send_power_probe_ms = 500,
+ .autobypass_ms = 500,
+};
/* rc_proto statistics, accessed with sched_prio=XBEE_PRIO */
struct rc_proto_stats_data {
(void *)(intptr_t)power_level);
}
-/* called every second */
+/* called every second to decide which power should be used */
static void compute_best_power(void)
{
int8_t best_power_level = -1;
power_level_global = best_power_level;
}
-static uint8_t get_best_power(void)
+/* return the best power level, or -1 if best power level computation is
+ * disabled. */
+static int8_t get_best_power(void)
{
+ if ((rc_proto_flags & RC_PROTO_FLAGS_COMPUTE_BEST_POW) == 0)
+ return -1;
+
/* special values */
if (power_level_global == -1) {
power_level_global = -4;
/* send an echo message: expect a reply */
int8_t rc_proto_send_echo_ans(uint64_t addr, void *data, uint8_t data_len,
- int8_t power)
+ int8_t power, uint16_t timestamp)
{
struct rc_proto_echo_ans hdr;
struct xbee_msg msg;
hdr.type = RC_PROTO_ECHO_ANS;
hdr.datalen = data_len;
+ hdr.timestamp = timestamp;
msg.iovlen = 2;
msg.iov[0].buf = &hdr;
/* if we transmitted servos values recently, nothing to do */
ms = get_time_ms();
diff = ms - servo_tx.time;
- if (diff < SEND_SERVO_MIN_TIME_MS)
+ if (diff < rc_proto_timers.send_servo_min_ms)
return 0;
/* prepare values to send */
/* if no value changed and last message is acknowledged, don't transmit
* if we already transmitted quite recently */
if (updated == 0 && ack == servo_tx.seq &&
- diff < SEND_SERVO_MAX_TIME_MS)
+ diff < rc_proto_timers.send_servo_max_ms)
return 0;
/* ok, we need to transmit */
stats.echo_req_rx++;
if (rc_proto_send_echo_ans(ntohll(recvframe->srcaddr),
- rce->data, rce->datalen, power) < 0)
+ rce->data, rce->datalen, power,
+ rce->timestamp) < 0)
return -1;
return 0;
/* send power probe periodically */
if (rc_proto_flags & RC_PROTO_FLAGS_TX_POW_PROBE) {
diff = t - prev_power_probe;
- if (diff > AUTO_BYPASS_TIME_MS) {
+ if (diff > rc_proto_timers.send_power_probe_ms) {
pow_probe++;
if (pow_probe > 4)
pow_probe = 0;
/* on wing, auto bypass servos if no commands since some time */
if (rc_proto_flags & RC_PROTO_FLAGS_RX_AUTOBYPASS) {
diff = t - servo_rx.time;
- if (diff > AUTO_BYPASS_TIME_MS)
+ if (diff > rc_proto_timers.autobypass_ms)
spi_servo_set_bypass(1);
}
/* send stats to peer every second */
- diff = t - prev_compute_pow;
- if (diff >= 1000) {
- compute_best_power();
- prev_compute_pow = t;
+ if (rc_proto_flags & RC_PROTO_FLAGS_COMPUTE_BEST_POW) {
+ diff = t - prev_compute_pow;
+ if (diff >= 1000) {
+ compute_best_power();
+ prev_compute_pow = t;
+ }
}
/* send stats to peer every second */
printf_P(PSTR(" servo_tx: %"PRIu32"\r\n"), peer_stats.servo_tx);
printf_P(PSTR(" stats_rx: %"PRIu32"\r\n"), peer_stats.stats_rx);
printf_P(PSTR(" stats_tx: %"PRIu32"\r\n"), peer_stats.stats_tx);
- if (stats.echo_ans_rx != 0) {
+ if (peer_stats.echo_ans_rx != 0) {
printf_P(PSTR(" echo_ans_latency_ms: %"PRIu32"\r\n"),
peer_stats.echo_ans_latency_sum / peer_stats.echo_ans_rx);
}