8 volatile uint8_t recv_buf[32];
10 uint8_t recv_tail = 0;
11 volatile uint8_t recv_fill = 0;
12 volatile uint8_t recv_overrun = 0;
14 void process_commands(void);
15 uint8_t dispatch_command(const uint8_t *, uint8_t);
17 void interface_init(void)
19 DDRD = (DDRD&0xFC)|0x02;
24 void interface_check(void)
28 interface_send1(RECEIVE_OVERRUN);
35 void process_commands(void)
40 uint8_t length = ~recv_buf[recv_tail];
48 for(i=0, j=recv_tail+1; i<length; ++i, ++j)
50 if(j>=sizeof(recv_buf))
58 interface_send1(FRAMING_ERROR);
61 recv_tail += length+1;
62 if(recv_tail>=sizeof(recv_buf))
63 recv_tail -= sizeof(recv_buf);
64 recv_fill -= length+1;
68 uint8_t result = dispatch_command(cmd, length);
69 interface_send1(result);
74 uint8_t dispatch_command(const uint8_t *cmd, uint8_t length)
76 uint8_t type = cmd[0]>>4;
79 uint8_t subtype = (cmd[0]>>3)&1;
81 return output_command(cmd, length);
83 return monitor_command(cmd, length);
86 return motorola_command(cmd, length);
88 return s88_command(cmd, length);
90 return INVALID_COMMAND;
93 void interface_send(const uint8_t *cmd, uint8_t length)
97 serial_write(~length);
98 for(i=0; i<length; ++i)
102 void interface_send1(uint8_t cmd)
108 static inline void receive(uint8_t c)
110 if(recv_fill>=sizeof(recv_buf))
116 recv_buf[recv_head++] = c;
117 if(recv_head>=sizeof(recv_buf))
122 SERIAL_SET_CALLBACK(receive)