X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=arducontrol%2Finterface.c;h=a8ae2a28af9a0fce11cd391b5dd80da3634cf38b;hb=9106943c465894bd1a8862b0a6d7ffdd89f8b643;hp=675770f771ab09881256ac19ee43ba0b1c165119;hpb=70404f704dc8acbfa4bae971661dd484a997085a;p=model-railway-devices.git diff --git a/arducontrol/interface.c b/arducontrol/interface.c index 675770f..a8ae2a2 100644 --- a/arducontrol/interface.c +++ b/arducontrol/interface.c @@ -6,7 +6,11 @@ #include "serial.h" #include "s88.h" -uint8_t dispatch_command(const uint8_t *, uint8_t); +static uint8_t cmd_buffer[15]; +static uint8_t cmd_length = 0; +static uint8_t cmd_read_pos = 0; + +static uint8_t dispatch_command(const uint8_t *, uint8_t); void interface_init(void) { @@ -17,30 +21,47 @@ void interface_init(void) void interface_check(void) { + uint8_t count; if(serial_read_overrun()) interface_send1(RECEIVE_OVERRUN); - while(serial_read_available()) + count = serial_read_available(); + if(count>0) { - uint8_t length = ~serial_read(); + if(cmd_length==0) + { + uint8_t l = ~serial_read(); + if(l==0) + serial_write(0xFF); + else if(l>=0x10) + interface_send1(FRAMING_ERROR); + else + { + cmd_length = l; + --count; + cmd_read_pos = 0; + } + } - if(length>=0x10) - interface_send1(FRAMING_ERROR); - else if(length>0) + if(cmd_read_poscmd_length) + count = cmd_length-cmd_read_pos; + for(i=0; i=cmd_length) + { + uint8_t result = dispatch_command(cmd_buffer, cmd_length); + interface_send1(result); + cmd_length = 0; + } } } } -uint8_t dispatch_command(const uint8_t *cmd, uint8_t length) +static uint8_t dispatch_command(const uint8_t *cmd, uint8_t length) { uint8_t type = cmd[0]>>4; if(type==0)