X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=arducontrol%2Finterface.c;fp=arducontrol%2Finterface.c;h=96b1f96cd97e8cc1cf78435eb60d0a22123b9b6c;hb=de977f33ed5c55b2b45c8dcae0c0687bd0cbf1e6;hp=041dd67bafc05f07fb9ef096b9f9b8a0668f9c8b;hpb=5ee5a22903f8059bf38bc8b2041eb18dfc58bcf0;p=model-railway-devices.git diff --git a/arducontrol/interface.c b/arducontrol/interface.c index 041dd67..96b1f96 100644 --- a/arducontrol/interface.c +++ b/arducontrol/interface.c @@ -9,11 +9,9 @@ uint8_t recv_head = 0; uint8_t recv_tail = 0; volatile uint8_t recv_fill = 0; volatile uint8_t recv_overrun = 0; -uint8_t cmd_buf[15]; -uint8_t cmd_length; void process_commands(void); -uint8_t process_command(void); +uint8_t dispatch_command(const uint8_t *, uint8_t); void interface_init(void) { @@ -38,61 +36,56 @@ void process_commands(void) { while(recv_fill>0) { - uint8_t consumed; - uint8_t c = recv_buf[recv_tail]; + uint8_t cmd[15]; + uint8_t length = ~recv_buf[recv_tail]; - cmd_length = 0; - - if(c>=0xF0) + if(length<0x10) { - cmd_length = ~c; - if(recv_fill<=cmd_length) + if(recv_fill<=length) break; uint8_t i, j; - for(i=0, j=recv_tail+1; i=sizeof(recv_buf)) j = 0; - cmd_buf[i] = recv_buf[j]; + cmd[i] = recv_buf[j]; } - - consumed = 1+cmd_length; } else { + length = 0; serial_write(0xFE); serial_write(FRAMING_ERROR); - consumed = 1; } - recv_tail += consumed; + recv_tail += length+1; if(recv_tail>=sizeof(recv_buf)) recv_tail -= sizeof(recv_buf); - recv_fill -= consumed; + recv_fill -= length+1; - if(cmd_length>0) + if(length>0) { - uint8_t result = process_command(); + uint8_t result = dispatch_command(cmd, length); serial_write(0xFE); serial_write(result); } } } -uint8_t process_command(void) +uint8_t dispatch_command(const uint8_t *cmd, uint8_t length) { - uint8_t type = cmd_buf[0]>>4; + uint8_t type = cmd[0]>>4; if(type==0) { - uint8_t subtype = (cmd_buf[0]>>3)&1; + uint8_t subtype = (cmd[0]>>3)&1; if(subtype==0) - return output_command(); + return output_command(cmd, length); else - return monitor_command(); + return monitor_command(cmd, length); } else if(type==1) - return motorola_command(); + return motorola_command(cmd, length); else return INVALID_COMMAND; }