7 volatile uint8_t recv_buf[32];
10 volatile uint8_t recv_fill = 0;
11 volatile uint8_t recv_overrun = 0;
15 void process_commands(void);
16 uint8_t process_command(void);
18 void interface_init(void)
20 DDRD = (DDRD&0xFC)|0x02;
25 void interface_check(void)
30 serial_write(RECEIVE_OVERRUN);
37 void process_commands(void)
42 uint8_t c = recv_buf[recv_tail];
49 if(recv_fill<=cmd_length)
53 for(i=0, j=recv_tail+1; i<cmd_length; ++i, ++j)
55 if(j>=sizeof(recv_buf))
57 cmd_buf[i] = recv_buf[j];
60 consumed = 1+cmd_length;
65 serial_write(FRAMING_ERROR);
69 recv_tail += consumed;
70 if(recv_tail>=sizeof(recv_buf))
71 recv_tail -= sizeof(recv_buf);
72 recv_fill -= consumed;
76 uint8_t result = process_command();
83 uint8_t process_command(void)
85 uint8_t type = cmd_buf[0]>>4;
88 uint8_t subtype = (cmd_buf[0]>>3)&1;
90 return output_command();
92 return monitor_command();
95 return motorola_command();
97 return INVALID_COMMAND;
100 static inline void receive(uint8_t c)
102 if(recv_fill>=sizeof(recv_buf))
108 recv_buf[recv_head++] = c;
109 if(recv_head>=sizeof(recv_buf))
114 SERIAL_SET_CALLBACK(receive)