7 volatile uint8_t recv_buf[32];
10 volatile uint8_t recv_fill = 0;
11 volatile uint8_t recv_overrun = 0;
13 void process_commands(void);
14 uint8_t dispatch_command(const uint8_t *, uint8_t);
16 void interface_init(void)
18 DDRD = (DDRD&0xFC)|0x02;
23 void interface_check(void)
28 serial_write(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))
59 serial_write(FRAMING_ERROR);
62 recv_tail += length+1;
63 if(recv_tail>=sizeof(recv_buf))
64 recv_tail -= sizeof(recv_buf);
65 recv_fill -= length+1;
69 uint8_t result = dispatch_command(cmd, length);
76 uint8_t dispatch_command(const uint8_t *cmd, uint8_t length)
78 uint8_t type = cmd[0]>>4;
81 uint8_t subtype = (cmd[0]>>3)&1;
83 return output_command(cmd, length);
85 return monitor_command(cmd, length);
88 return motorola_command(cmd, length);
90 return INVALID_COMMAND;
93 static inline void receive(uint8_t c)
95 if(recv_fill>=sizeof(recv_buf))
101 recv_buf[recv_head++] = c;
102 if(recv_head>=sizeof(recv_buf))
107 SERIAL_SET_CALLBACK(receive)