#include "cmdline.h"
#include "callout.h"
#include "rc_proto.h"
+#include "spi_servo.h"
#include "main.h"
struct xbeeboard xbeeboard;
#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 */
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;
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;
+ TIMSK4 = 0;
+ TIMSK5 = 0;
EIMSK = 0;
+ UCSR0B = 0;
+ UCSR1B = 0;
+ UCSR2B = 0;
+ UCSR3B = 0;
SPCR = 0;
TWCR = 0;
ACSR = 0;
ADCSRA = 0;
- __asm__ __volatile__ ("ldi r31,0xf0\n");
+ EIND = 1;
+ __asm__ __volatile__ ("ldi r31,0xf8\n");
__asm__ __volatile__ ("ldi r30,0x00\n");
- __asm__ __volatile__ ("ijmp\n");
-
- /* never returns */
+ __asm__ __volatile__ ("eijmp\n");
+#endif
}
void xbee_mainloop(void)
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
#else
uart_init();
+ uart_register_rx_event(CMDLINE_UART, emergency);
#endif
fdevopen(cmdline_dev_send, cmdline_dev_recv);
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);