X-Git-Url: http://git.droids-corp.org/?p=protos%2Fxbee-avr.git;a=blobdiff_plain;f=main.c;h=20e26b01ab166dd77e65198e63eb17b50378c738;hp=b9fa0a8c345c1a1bcedc653dbdf765e8333cce1e;hb=21d10011bc4b009d7a09131b955953fa7aba3815;hpb=292db1d7238997d4d820370a83fe44d2cb609949 diff --git a/main.c b/main.c index b9fa0a8..20e26b0 100644 --- a/main.c +++ b/main.c @@ -25,6 +25,10 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* fuses: + * avrdude -p atmega1284p -P usb -c avrispmkii -U lfuse:w:0xff:m -U hfuse:w:0x99:m -U efuse:w:0xff:m + */ + #include #include #include @@ -48,16 +52,8 @@ #include #include -#include "xbee_neighbor.h" -#include "xbee_atcmd.h" -#include "xbee_stats.h" -#include "xbee_buf.h" -#include "xbee_proto.h" -#include "xbee.h" -#include "cmdline.h" -#include "callout.h" -#include "rc_proto.h" -#include "spi_servo.h" +#include "eeprom_config.h" +#include "beep.h" #include "main.h" struct xbeeboard xbeeboard; @@ -114,6 +110,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; @@ -144,7 +142,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; @@ -228,17 +226,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; @@ -478,6 +488,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 */ @@ -500,7 +513,6 @@ void xbee_unload_timeout(struct xbee_ctx *ctx) void bootloader(void) { -#ifndef USE_USB #define BOOTLOADER_ADDR 0x3f000 if (pgm_read_byte_far(BOOTLOADER_ADDR) == 0xff) { printf_P(PSTR("Bootloader is not present\r\n")); @@ -512,23 +524,18 @@ void bootloader(void) TIMSK1 = 0; TIMSK2 = 0; TIMSK3 = 0; - TIMSK4 = 0; - TIMSK5 = 0; EIMSK = 0; UCSR0B = 0; UCSR1B = 0; - UCSR2B = 0; - UCSR3B = 0; SPCR = 0; TWCR = 0; ACSR = 0; ADCSRA = 0; - EIND = 1; - __asm__ __volatile__ ("ldi r31,0xf8\n"); - __asm__ __volatile__ ("ldi r30,0x00\n"); - __asm__ __volatile__ ("eijmp\n"); -#endif + /* XXX */ + /* __asm__ __volatile__ ("ldi r31,0xf8\n"); */ + /* __asm__ __volatile__ ("ldi r30,0x00\n"); */ + /* __asm__ __volatile__ ("eijmp\n"); */ } void xbee_mainloop(void) @@ -547,6 +554,11 @@ void xbee_mainloop(void) /* from cmdline to xbee */ c = cmdline_dev_recv(NULL); if (c == 4) { /* CTRL-d */ + xbee_dev_send('A', NULL); + xbee_dev_send('T', NULL); + xbee_dev_send('C', NULL); + xbee_dev_send('N', NULL); + xbee_dev_send('\n', NULL); xbee_raw = 0; rdline_newline(&xbeeboard.rdl, xbeeboard.prompt); @@ -564,12 +576,6 @@ void xbee_mainloop(void) cmdline_poll(); xbee_proto_rx(xbee_dev); } - -#ifdef USE_USB - CDC_Device_USBTask(&VirtualSerial1_CDC_Interface); - CDC_Device_USBTask(&VirtualSerial2_CDC_Interface); - USB_USBTask(); -#endif } } @@ -579,55 +585,48 @@ static uint16_t get_time_ms(void) return global_ms; } -static void do_led_blink(struct callout_manager *cm, - struct callout *clt, void *dummy) +static void main_timer_interrupt(void) { - static uint8_t a = 0; + static uint16_t cycles; + static uint8_t cpt; + + cpt++; -#ifdef USE_USB - if (a & 1) - LEDs_SetAllLEDs(0); + /* interrupt every 2048 cycles */ + cycles += 2048; + if (cycles >= 12000) { + cycles -= 12000; + global_ms ++; + } + + /* LED blink */ + if (global_ms & 0x80) + LED1_ON(); else - LEDs_SetAllLEDs(0xff); -#else - /* XXX */ -#endif - a++; -} + LED1_OFF(); -static void increment_ms(void *dummy) -{ - global_ms++; -} + if (cpt & beep_mask) + BUZZER_ON(); + else + BUZZER_OFF(); -static void main_timer_interrupt(void) -{ - static uint8_t cpt = 0; - cpt++; + /* call scheduler every 682us with interrupt unlocked */ sei(); if ((cpt & 0x3) == 0) scheduler_interrupt(); } -/** Main program entry point. This routine contains the overall program flow, including initial - * setup of all components and the main program loop. - */ int main(void) { - struct callout t1; + //struct callout t1; FILE *xbee_file; int8_t err; struct xbee_dev dev; - spi_servo_init(); -#ifdef USE_USB - SetupHardware(); + DDRA = 0x07 /* LEDs */ | 0x10 /* buzzer */; - LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); -#else uart_init(); uart_register_rx_event(CMDLINE_UART, emergency); -#endif fdevopen(cmdline_dev_send, cmdline_dev_recv); xbee_file = fdevopen(xbee_dev_send, xbee_dev_recv); @@ -635,17 +634,15 @@ int main(void) timer_init(); timer0_register_OV_intr(main_timer_interrupt); - scheduler_add_periodical_event_priority(increment_ms, NULL, - 1000L / SCHEDULER_UNIT, - LED_PRIO); cmdline_init(); -#ifndef USE_USB - /* in usb mode, it's done in usb callback */ + spi_servo_init(); + beep_init(); + printf_P(PSTR("\r\n")); rdline_newline(&xbeeboard.rdl, xbeeboard.prompt); -#endif + callout_manager_init(&cm, get_time_ms); - callout_reset(&cm, &t1, 500, PERIODICAL, do_led_blink, NULL); + //callout_reset(&cm, &t1, 500, PERIODICAL, do_led_blink, NULL); /* initialize libxbee */ err = xbee_init(); @@ -664,8 +661,9 @@ int main(void) fprintf(stderr, "cannot register default channel\n"); return -1; } - sei(); + + eeprom_load_config(); xbee_mainloop(); return 0; }