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)
27 interface_send1(RECEIVE_OVERRUN);
34 void process_commands(void)
39 uint8_t length = ~recv_buf[recv_tail];
47 for(i=0, j=recv_tail+1; i<length; ++i, ++j)
49 if(j>=sizeof(recv_buf))
57 interface_send1(FRAMING_ERROR);
60 recv_tail += length+1;
61 if(recv_tail>=sizeof(recv_buf))
62 recv_tail -= sizeof(recv_buf);
63 recv_fill -= length+1;
67 uint8_t result = dispatch_command(cmd, length);
68 interface_send1(result);
73 uint8_t dispatch_command(const uint8_t *cmd, uint8_t length)
75 uint8_t type = cmd[0]>>4;
78 uint8_t subtype = (cmd[0]>>3)&1;
80 return output_command(cmd, length);
82 return monitor_command(cmd, length);
85 return motorola_command(cmd, length);
87 return INVALID_COMMAND;
90 void interface_send(const uint8_t *cmd, uint8_t length)
94 serial_write(~length);
95 for(i=0; i<length; ++i)
99 void interface_send1(uint8_t cmd)
105 static inline void receive(uint8_t c)
107 if(recv_fill>=sizeof(recv_buf))
113 recv_buf[recv_head++] = c;
114 if(recv_head>=sizeof(recv_buf))
119 SERIAL_SET_CALLBACK(receive)