20 uint8_t cmd; |
20 uint8_t cmd; |
21 uint8_t size; |
21 uint8_t size; |
22 char value[MAX_BUFF+1]; |
22 char value[MAX_BUFF+1]; |
23 unsigned long id; |
23 unsigned long id; |
24 } CMD; |
24 } CMD; |
25 |
|
26 |
|
27 |
25 |
28 HPSerial(PinName tx, PinName rx); |
26 HPSerial(PinName tx, PinName rx); |
29 |
27 |
30 bool cmd_available(void); |
28 bool cmd_available(void); |
31 bool pop(CMD& cmd); |
29 bool pop(CMD& cmd); |
32 bool cmd_buf_full(void); |
30 bool cmd_buf_full(void); |
33 unsigned int nerrors(uint8_t errorno); |
31 unsigned int nerrors(uint8_t errorno); |
34 |
32 |
|
33 void startup(void); |
|
34 void send(const uint8_t *buf, uint8_t size); |
|
35 void sendkey(uint8_t keycode); |
35 |
36 |
36 private: |
37 private: |
37 void pushCmd(uint8_t cmd, uint8_t size, char *payload); |
38 void pushCmd(uint8_t cmd, uint8_t size, char *payload); |
38 void rxIrq(void); |
39 void rxIrq(void); |
39 void timeout(void); |
40 void timeout(void); |
|
41 void set_timer(float v=0.0) { |
|
42 timeouter.detach(); |
|
43 if (v > 0.0) |
|
44 timeouter.attach(callback(this, &HPSerial::timeout), v); |
|
45 } |
40 |
46 |
41 private: |
47 private: |
42 RawSerial serial; |
48 RawSerial serial; |
43 uint8_t buf[BUF_SIZE]; |
49 uint8_t buf[BUF_SIZE]; |
44 uint8_t head; |
50 uint8_t head; |
45 CircularBuffer<CMD, 32> cmdbuf; |
51 CircularBuffer<CMD, 32> cmdbuf; |
46 unsigned long ncmd; |
52 unsigned long ncmd; |
47 unsigned int errs[MAX_ERRS]; |
53 unsigned int errs[MAX_ERRS]; |
48 Ticker timeouter; |
54 Ticker timeouter; |
49 |
55 |
50 // state machine stuff |
56 public: |
51 typedef enum {STATE_IDLE, |
57 // global state machine |
52 STATE_HANDCHEKED, |
58 typedef enum { |
53 STATE_COMMAND, |
59 GSTATE_STARTING, |
54 STATE_PAYLOAD_SIZE, |
60 GSTATE_STARTING2, |
55 STATE_PAYLOAD, |
61 GSTATE_IDLE, |
56 NUM_STATES} state_t; |
62 GSTATE_TX, |
57 |
63 GSTATE_RX, |
|
64 NUM_GSTATES} gstate_t; |
|
65 gstate_t gstate() {return cur_gstate;}; |
|
66 /* gstate_t do_start(); */ |
|
67 /* gstate_t do_send(); */ |
|
68 /* gstate_t do_receive(); */ |
58 |
69 |
59 typedef struct instance_data { |
70 /* typedef gstate_t(HPSerial::*gstatemethod)(); */ |
|
71 /* statemethod const gstate_table[NUM_GSTATES] = { */ |
|
72 /* &HPSerial::do_start, */ |
|
73 /* &HPSerial::do_send, */ |
|
74 /* &HPSerial::do_receive, */ |
|
75 /* }; */ |
|
76 |
|
77 /* gstate_t run_gstate(gstate_t cur_state); */ |
|
78 private: |
|
79 gstate_t cur_gstate; |
|
80 |
|
81 public: |
|
82 // transmission state machine |
|
83 typedef enum { |
|
84 STATE_IDLE, |
|
85 STATE_COMMAND, |
|
86 STATE_PAYLOAD_SIZE, |
|
87 STATE_PAYLOAD, |
|
88 STATE_SENDING, |
|
89 STATE_EOT, |
|
90 NUM_STATES} state_t; |
|
91 state_t state() {return cur_state;}; |
|
92 |
|
93 private: |
|
94 typedef struct state_data { |
60 uint8_t cmd; |
95 uint8_t cmd; |
61 uint8_t size; |
96 uint8_t size; |
62 uint8_t received; |
97 uint8_t pos; |
63 char payload[MAX_BUFF]; |
98 char payload[MAX_BUFF]; |
64 } instance_data_t; |
99 } state_data_t; |
65 |
100 |
66 state_t do_state_initial(instance_data_t *data, uint8_t c); |
101 void _startup(void); |
67 state_t do_state_handcheck(instance_data_t *data, uint8_t c); |
102 void _startup2(void); |
68 state_t do_state_command(instance_data_t *data, uint8_t c); |
103 state_t do_state_initial(uint8_t c=0x00); |
69 state_t do_state_payload_size(instance_data_t *data, uint8_t c); |
104 state_t do_state_command(uint8_t c); |
70 state_t do_state_payload(instance_data_t *data, uint8_t c); |
105 state_t do_state_payload_size(uint8_t c); |
|
106 state_t do_state_payload(uint8_t c); |
|
107 state_t do_state_sending(uint8_t c=0x00); |
|
108 state_t do_state_eot(uint8_t c=0x00); |
71 |
109 |
72 void send_ack(uint8_t c); |
110 void send_ack(uint8_t c); |
73 |
111 |
74 // pointer to "state method" (ie. one of the just above) |
112 typedef state_t(HPSerial::*statemethod)(uint8_t c); |
75 typedef state_t(HPSerial::*statemethod)(instance_data_t *data, uint8_t c); |
113 static statemethod state_table[NUM_STATES]; |
76 statemethod const state_table[NUM_STATES] = { |
114 state_t run_state(state_t cur_state, uint8_t c); |
77 &HPSerial::do_state_initial, |
|
78 &HPSerial::do_state_handcheck, |
|
79 &HPSerial::do_state_command, |
|
80 &HPSerial::do_state_payload_size, |
|
81 &HPSerial::do_state_payload, |
|
82 }; |
|
83 |
|
84 state_t run_state(state_t cur_state, instance_data_t *data, uint8_t c); |
|
85 |
115 |
86 state_t cur_state; |
116 state_t cur_state; |
87 instance_data rx_data; |
117 state_data_t tr_data; |
88 }; |
118 }; |
89 |
119 |
|
120 |
90 #endif |
121 #endif |