X-Git-Url: http://git.droids-corp.org/?p=protos%2Fxbee-avr.git;a=blobdiff_plain;f=main.c;h=73a3409cb32a246c3b15487f4fe6a23d292e2155;hp=2bcb3ec974bf6c2ad45334c4b03cd506e24b4279;hb=57895b3bb2fe0582c589685b7df34f3968b346ec;hpb=0e1c93804369af27043c82ccc778c42bf54a9bd4 diff --git a/main.c b/main.c index 2bcb3ec..73a3409 100644 --- a/main.c +++ b/main.c @@ -57,6 +57,7 @@ #include "cmdline.h" #include "callout.h" #include "rc_proto.h" +#include "spi_servo.h" #include "main.h" struct xbeeboard xbeeboard; @@ -87,7 +88,7 @@ static void hexdump(const char *title, const void *buf, unsigned int len) #define LINE_LEN 80 char line[LINE_LEN]; /* space needed 8+16*3+3+16 == 75 */ - printf_P(PSTR("%s at [%p], len=%d\n"), title, data, len); + printf_P(PSTR("%s at [%p], len=%d\r\n"), title, data, len); ofs = 0; while (ofs < len) { /* format 1 line in the buffer, then use printk to print them */ @@ -113,6 +114,8 @@ static void hexdump(const char *title, const void *buf, unsigned int len) static int parse_xmit_status(struct xbee_ctx *ctx, struct xbee_xmit_status_hdr *frame, unsigned len) { + (void)len; + if (ctx == NULL) { printf_P(PSTR("no context\r\n")); return -1; @@ -143,7 +146,7 @@ static int dump_atcmd(struct xbee_ctx *ctx, struct xbee_atresp_hdr *frame, unsigned len) { char atcmd_str[3]; - struct xbee_atcmd_pgm *cmd_pgm; + const struct xbee_atcmd *cmd_pgm; struct xbee_atcmd cmd; union { uint8_t u8; @@ -227,17 +230,29 @@ static int dump_atcmd(struct xbee_ctx *ctx, struct xbee_atresp_hdr *frame, int xbee_recv_data(struct xbee_recv_hdr *recvframe, unsigned len) { - int datalen = len - sizeof(*recvframe); + unsigned int datalen; struct rc_proto_hdr *rch = (struct rc_proto_hdr *) &recvframe->data; + if (len < sizeof(*recvframe)) + return -1; + + datalen = len - sizeof(*recvframe); if (datalen < sizeof(struct rc_proto_hdr)) return -1; switch (rch->type) { - case RC_PROTO_TYPE_CHANNEL: + case RC_PROTO_TYPE_CHANNEL: { + struct rc_proto_channel *rcc = + (struct rc_proto_channel *) recvframe->data; + int16_t val; if (datalen != sizeof(struct rc_proto_channel)) return -1; + val = ntohs(rcc->axis[0]); + val >>= 6; + val += 512; + spi_servo_set(0, val); break; + } case RC_PROTO_TYPE_RANGE: { struct rc_proto_range *rcr = (struct rc_proto_range *) recvframe->data; @@ -477,6 +492,9 @@ static void evt_timeout(struct callout_manager *cm, struct callout *clt, { struct xbee_ctx *ctx = arg; + (void)cm; + (void)clt; + printf_P(PSTR("Timeout\r\n")); /* restart command line */ @@ -499,24 +517,31 @@ void xbee_unload_timeout(struct xbee_ctx *ctx) void bootloader(void) { -#define BOOTLOADER_ADDR 0x1f800 +#ifndef USE_USB +#define BOOTLOADER_ADDR 0x3f000 if (pgm_read_byte_far(BOOTLOADER_ADDR) == 0xff) { printf_P(PSTR("Bootloader is not present\r\n")); return; } cli(); /* ... very specific :( */ + TIMSK0 = 0; + TIMSK1 = 0; + TIMSK2 = 0; + TIMSK3 = 0; EIMSK = 0; + UCSR0B = 0; + UCSR1B = 0; SPCR = 0; TWCR = 0; ACSR = 0; ADCSRA = 0; - __asm__ __volatile__ ("ldi r31,0xf0\n"); - __asm__ __volatile__ ("ldi r30,0x00\n"); - __asm__ __volatile__ ("ijmp\n"); - - /* never returns */ + /* XXX */ + /* __asm__ __volatile__ ("ldi r31,0xf8\n"); */ + /* __asm__ __volatile__ ("ldi r30,0x00\n"); */ + /* __asm__ __volatile__ ("eijmp\n"); */ +#endif } void xbee_mainloop(void) @@ -572,6 +597,10 @@ static void do_led_blink(struct callout_manager *cm, { static uint8_t a = 0; + (void)cm; + (void)clt; + (void)dummy; + #ifdef USE_USB if (a & 1) LEDs_SetAllLEDs(0); @@ -585,6 +614,7 @@ static void do_led_blink(struct callout_manager *cm, static void increment_ms(void *dummy) { + (void)dummy; global_ms++; } @@ -613,6 +643,7 @@ int main(void) LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); #else uart_init(); + uart_register_rx_event(CMDLINE_UART, emergency); #endif fdevopen(cmdline_dev_send, cmdline_dev_recv); @@ -625,8 +656,10 @@ int main(void) 1000L / SCHEDULER_UNIT, LED_PRIO); cmdline_init(); + spi_servo_init(); #ifndef USE_USB /* in usb mode, it's done in usb callback */ + printf_P(PSTR("\r\n")); rdline_newline(&xbeeboard.rdl, xbeeboard.prompt); #endif callout_manager_init(&cm, get_time_ms);