X-Git-Url: http://git.droids-corp.org/?p=protos%2Fxbee.git;a=blobdiff_plain;f=main.c;fp=main.c;h=fd658a0657d7ff6e1c66606be259859bfcb0aa51;hp=4847d11087363d4c5d24a7a57fca3cb30683877b;hb=93e278d345d286301b3d0b4fe209dd04c734d7bf;hpb=9fdf7fa123e328a13ade691f4b724a187ee39a85 diff --git a/main.c b/main.c index 4847d11..fd658a0 100644 --- a/main.c +++ b/main.c @@ -59,6 +59,7 @@ #include "xbee_proto.h" #include "xbee.h" #include "joystick.h" +#include "rc_proto.h" #include "main.h" #define TIMEOUT_US 1000000 @@ -260,6 +261,41 @@ static int dump_atcmd(struct xbee_ctx *ctx, struct xbee_atresp_hdr *frame, return 0; } +int xbee_recv_data(struct xbee_recv_hdr *recvframe, unsigned len) +{ + int datalen = len - sizeof(*recvframe); + struct rc_proto_hdr *rch = (struct rc_proto_hdr *) &recvframe->data; + + if (datalen < sizeof(struct rc_proto_hdr)) + return -1; + + switch (rch->type) { + case RC_PROTO_TYPE_CHANNEL: + if (datalen != sizeof(struct rc_proto_channel)) + return -1; + break; + case RC_PROTO_TYPE_RANGE: { + struct rc_proto_range *rcr = + (struct rc_proto_range *) recvframe->data; + + if (datalen != sizeof(struct rc_proto_range)) + return -1; + + if (rcr->power_level >= MAX_POWER_LEVEL) + return -1; + + rc_proto_rx_range(rcr->power_level); + + break; + } + default: + return -1; + } + + return 0; +} + + void xbee_rx(struct xbee_dev *dev, int channel, int type, void *frame, unsigned len, void *opaque) { @@ -326,19 +362,8 @@ void xbee_rx(struct xbee_dev *dev, int channel, int type, } case XBEE_TYPE_RECV: { - struct xbee_recv_hdr *recvframe = frame; - int recvlen = len - sizeof(*recvframe); - int on_stdout = 1; - - /* if we receive a range-test frame, ask for RSSI now */ - if (recvlen >= strlen("range") && - !strncmp((char *)recvframe->data, - "range", strlen("range"))) { - xbeeapp_send_atcmd("DB", NULL, 0, 0, NULL, NULL); - on_stdout = 0; - } - hexdump(on_stdout, "rx data", recvframe->data, - recvlen); + if (xbee_recv_data(frame, len) < 0) + do_hexdump = 1; break; } @@ -781,6 +806,9 @@ int main(int argc, char **argv) if (err < 0) return -1; + /* init rc_proto */ + rc_proto_init(); + /* init joystick */ if (joystick_devname != NULL) { if (joystick_init(joystick_devname, &joyinfo) < 0) {