9 static uint8_t cmd_buffer[15];
10 static uint8_t cmd_length = 0;
11 static uint8_t cmd_read_pos = 0;
13 static uint8_t dispatch_command(const uint8_t *, uint8_t);
15 void interface_init(void)
18 DDRD = (DDRD&0xFC)|0x02;
23 void interface_check(void)
25 if(serial_read_overrun())
26 interface_send1(RECEIVE_OVERRUN);
28 uint8_t count = serial_read_available();
34 uint8_t l = ~serial_read();
38 interface_send1(FRAMING_ERROR);
47 if(cmd_read_pos<cmd_length)
49 if(cmd_read_pos+count>cmd_length)
50 count = cmd_length-cmd_read_pos;
51 for(uint8_t i=0; i<count; ++i)
52 cmd_buffer[cmd_read_pos++] = serial_read();
54 if(cmd_read_pos>=cmd_length)
56 uint8_t result = dispatch_command(cmd_buffer, cmd_length);
57 interface_send1(result);
65 static uint8_t dispatch_command(const uint8_t *cmd, uint8_t length)
67 uint8_t type = cmd[0]>>4;
70 uint8_t subtype = (cmd[0]>>3)&1;
72 return output_command(cmd, length);
74 return monitor_command(cmd, length);
77 return motorola_command(cmd, length);
79 return s88_command(cmd, length);
81 return INVALID_COMMAND;
84 void interface_send(const uint8_t *cmd, uint8_t length)
86 serial_write(~length);
87 for(uint8_t i=0; i<length; ++i)
91 void interface_send1(uint8_t cmd)