X-Git-Url: http://git.droids-corp.org/?p=protos%2Fxbee-avr.git;a=blobdiff_plain;f=rc_proto.c;h=1c1a29fec54d5714af6d5b39b154eb832b5d6af5;hp=8ea3767b26b7fc54d8ba8bfcb57e6b78a2849406;hb=refs%2Fheads%2Fmaster;hpb=6811941dc02f68dd0305a30f3c1cf72a23566b6b diff --git a/rc_proto.c b/rc_proto.c index 8ea3767..1c1a29f 100644 --- a/rc_proto.c +++ b/rc_proto.c @@ -149,7 +149,7 @@ static void rc_proto_rx_power_probe(int power_level) (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; @@ -183,8 +183,13 @@ static void compute_best_power(void) 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; @@ -264,7 +269,7 @@ int8_t rc_proto_send_echo_req(uint64_t addr, void *data, uint8_t data_len, /* 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; @@ -273,6 +278,7 @@ int8_t rc_proto_send_echo_ans(uint64_t addr, void *data, uint8_t data_len, hdr.type = RC_PROTO_ECHO_ANS; hdr.datalen = data_len; + hdr.timestamp = timestamp; msg.iovlen = 2; msg.iov[0].buf = &hdr; @@ -607,7 +613,8 @@ int rc_proto_rx(struct xbee_recv_hdr *recvframe, unsigned len) 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; @@ -728,10 +735,12 @@ static void rc_proto_cb(struct callout_mgr *cm, struct callout *tim, void *arg) } /* 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 */ @@ -783,7 +792,7 @@ void rc_proto_dump_stats(void) 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); }