X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=main.c;h=d3905545135790ea965c69045cadfe423202ec96;hb=90919fb720235d8f3551cbc31b81e70078498f20;hp=e733e81587186f979731ddab067dd862ba746d3d;hpb=98801c6e5d8a04f06c7e3f3d9de73919b593e4eb;p=protos%2Frc_servos.git diff --git a/main.c b/main.c index e733e81..d390554 100644 --- a/main.c +++ b/main.c @@ -19,10 +19,43 @@ static struct servo servo_table[] = { .command = 1023, }, }; -static volatile uint8_t rxbuf[16]; -static volatile uint8_t rxlen; -static volatile uint8_t portval; +#define NB_SERVO (sizeof(servo_table)/sizeof(*servo_table)) + +static volatile uint8_t bypass; static volatile uint8_t done; +static volatile uint8_t portval; +static volatile uint8_t rxidx; + +#define BYPASS_ENABLE 14 +#define BYPASS_DISABLE 15 + +/* + * SPI protocol: + * + * A command is stored on 2 bytes. The first one has its msb to 0, and the + * second one to 1. The first received byte contains the command number, and the + * msb of the servo value. The second byte contains the lsb of the servo value. + * + * Commands 0 to NB_SERVO are to set the value of servo. + * Command 14 is to enable bypass mode. + * Command 15 is to disable bypass mode. + */ +static volatile union { + uint8_t u8; + struct { + uint8_t zero:1; + uint8_t cmd_num:4; + uint8_t val_msb:3; + }; +} byte0; + +static volatile union { + uint8_t u8; + struct { + uint8_t one:1; + uint8_t val_lsb:7; + }; +} byte1; SIGNAL(TIMER1_COMPA_vect) { @@ -33,6 +66,46 @@ SIGNAL(TIMER1_COMPA_vect) static void poll_spi(void) { + uint8_t c; + + /* reception complete ? */ + if (!(SPSR & (1<