8 |
8 |
9 DigitalOut inrx(D9); |
9 DigitalOut inrx(D9); |
10 |
10 |
11 #endif |
11 #endif |
12 |
12 |
13 DigitalOut lled(LED1); |
13 DigitalOut lled(LED3); |
14 |
14 |
15 #define RXTIMEOUT 0.05 |
15 #define RXTIMEOUT 0.05 |
16 #define STARTUPRETRY 0.5 |
16 #define STARTUPRETRY 0.5 |
|
17 |
17 const uint8_t startup_seq[] = { |
18 const uint8_t startup_seq[] = { |
18 0x33, |
|
19 0x01, |
|
20 0x01, |
|
21 0x40, |
|
22 // 0x02, |
|
23 }; |
|
24 |
|
25 const uint8_t startup_seq2[] = { |
|
26 0x33, |
19 0x33, |
27 0x02, |
20 0x02, |
28 0x00, |
21 0x00, |
29 0x00, |
|
30 // 0x02, |
|
31 }; |
22 }; |
32 |
23 |
33 HPSerial::statemethod HPSerial::state_table[NUM_STATES] = { |
24 HPSerial::statemethod HPSerial::state_table[NUM_STATES] = { |
34 &HPSerial::do_state_initial, |
25 &HPSerial::do_state_initial, |
35 &HPSerial::do_state_command, |
26 &HPSerial::do_state_command, |
42 HPSerial::HPSerial(PinName tx, PinName rx): |
33 HPSerial::HPSerial(PinName tx, PinName rx): |
43 serial(tx, rx), |
34 serial(tx, rx), |
44 cur_gstate(GSTATE_IDLE), |
35 cur_gstate(GSTATE_IDLE), |
45 ncmd(0) |
36 ncmd(0) |
46 { |
37 { |
47 serial.baud(187500); |
38 serial.baud(187500); |
48 cur_state = STATE_IDLE; |
39 cur_state = STATE_IDLE; |
49 serial.attach(callback(this, &HPSerial::rxIrq), Serial::RxIrq); |
40 serial.attach(callback(this, &HPSerial::rxIrq), Serial::RxIrq); |
50 } |
41 } |
51 |
42 |
52 void HPSerial::startup(void) { |
43 void HPSerial::startup(void) { |
53 if (cur_gstate != GSTATE_STARTING) { |
44 cur_gstate = GSTATE_STARTING; |
54 //_startup(); |
|
55 cur_gstate = GSTATE_STARTING; |
|
56 } |
|
57 set_timer(0.002); // launch the startup in 10ms |
45 set_timer(0.002); // launch the startup in 10ms |
58 } |
46 } |
59 |
47 |
60 void HPSerial::_startup(void) |
48 void HPSerial::_startup(void) |
61 { |
49 { |
66 for(uint8_t i=0; i<tr_data.size; i++) |
54 for(uint8_t i=0; i<tr_data.size; i++) |
67 tr_data.payload[i] = startup_seq[i]; |
55 tr_data.payload[i] = startup_seq[i]; |
68 cur_state = do_state_sending(); |
56 cur_state = do_state_sending(); |
69 } |
57 } |
70 |
58 |
71 void HPSerial::_startup2(void) |
|
72 { |
|
73 cur_gstate = GSTATE_STARTING2; |
|
74 tr_data.size = sizeof(startup_seq2); |
|
75 tr_data.cmd = 0xFF; |
|
76 tr_data.pos = 0; |
|
77 for(uint8_t i=0; i<tr_data.size; i++) |
|
78 tr_data.payload[i] = startup_seq2[i]; |
|
79 cur_state = do_state_sending(); |
|
80 } |
|
81 |
|
82 void HPSerial::send(const uint8_t *buf, uint8_t size) |
59 void HPSerial::send(const uint8_t *buf, uint8_t size) |
83 { |
60 { |
84 // tx_data-> |
61 // tx_data-> |
85 //send(startup, sizeof(startup)/sizeof(startup[0])); |
62 //send(startup, sizeof(startup)/sizeof(startup[0])); |
86 } |
63 } |
169 send_ack(0x00); |
146 send_ack(0x00); |
170 |
147 |
171 if (c == 0x86) { // shutdown |
148 if (c == 0x86) { // shutdown |
172 pushCmd(tr_data.cmd, tr_data.size, tr_data.payload); |
149 pushCmd(tr_data.cmd, tr_data.size, tr_data.payload); |
173 return HPSerial::STATE_IDLE; |
150 return HPSerial::STATE_IDLE; |
174 } |
151 } |
175 return STATE_PAYLOAD_SIZE; |
152 return STATE_PAYLOAD_SIZE; |
176 } |
153 } |
177 |
154 |
178 HPSerial::state_t HPSerial::do_state_payload_size(uint8_t c) |
155 HPSerial::state_t HPSerial::do_state_payload_size(uint8_t c) |
179 { |
156 { |
196 |
173 |
197 HPSerial::state_t HPSerial::do_state_sending(uint8_t c) |
174 HPSerial::state_t HPSerial::do_state_sending(uint8_t c) |
198 { |
175 { |
199 // ghee |
176 // ghee |
200 if (c == 0xFF) |
177 if (c == 0xFF) |
201 { |
178 { // resend current char |
202 tr_data.pos--; |
179 tr_data.pos--; |
203 tr_data.payload[tr_data.pos] += 1; |
180 tr_data.payload[tr_data.pos] += 1; |
204 } |
181 } |
205 // TODO: check ACK values (c is the received ack) |
182 // TODO: check ACK values (c is the received ack) |
206 if (tr_data.pos >= tr_data.size) |
183 if (tr_data.pos >= tr_data.size) |
207 { |
184 { |
208 return do_state_eot(); |
185 return do_state_eot(); |
209 } |
186 } |
210 serial.putc(tr_data.payload[tr_data.pos++]); |
187 serial.putc(tr_data.payload[tr_data.pos++]); |
211 set_timer(RXTIMEOUT); |
188 set_timer(RXTIMEOUT); |
212 return HPSerial::STATE_SENDING; |
189 return HPSerial::STATE_SENDING; |
213 } |
190 } |
214 |
191 |
215 HPSerial::state_t HPSerial::do_state_eot(uint8_t c) |
192 HPSerial::state_t HPSerial::do_state_eot(uint8_t c) |
216 { |
193 { |
217 serial.putc(0x55); // EoT |
194 serial.putc(0x55); // EoT |
218 if (cur_gstate == GSTATE_STARTING) { |
195 cur_gstate = GSTATE_IDLE; |
219 cur_gstate = GSTATE_STARTING2; |
196 set_timer(); // We are IDLE, detach the timeouter |
220 set_timer(0.002); // launch startup2 in 10ms |
|
221 } |
|
222 else { |
|
223 cur_gstate = GSTATE_IDLE; |
|
224 set_timer(); // We are IDLE, detach the timeouter |
|
225 } |
|
226 return STATE_IDLE; |
197 return STATE_IDLE; |
227 } |
198 } |
228 |
199 |
229 HPSerial::state_t HPSerial::run_state(HPSerial::state_t cur_state, |
200 HPSerial::state_t HPSerial::run_state(HPSerial::state_t cur_state, |
230 uint8_t c) |
201 uint8_t c) |
232 return (this->*(HPSerial::state_table[cur_state]))(c); |
203 return (this->*(HPSerial::state_table[cur_state]))(c); |
233 }; |
204 }; |
234 |
205 |
235 void HPSerial::rxIrq(void) { |
206 void HPSerial::rxIrq(void) { |
236 uint8_t val; |
207 uint8_t val; |
237 if(serial.readable()) { // no reason why we would end here without |
208 if(serial.readable()) |
238 // this condition, but hey |
209 { // no reason why we would end here without |
|
210 // this condition, but hey |
239 #ifdef DEBUG2 |
211 #ifdef DEBUG2 |
240 inrx=1; |
212 inrx=1; |
241 #endif |
213 #endif |
242 lled = 1; |
214 //lled = 1; |
243 val = serial.getc(); |
215 val = serial.getc(); |
244 cur_state = run_state(cur_state, val); |
216 cur_state = run_state(cur_state, val); |
245 lled = 0; |
217 //lled = 0; |
246 #ifdef DEBUG2 |
218 #ifdef DEBUG2 |
247 inrx=0; |
219 inrx=0; |
248 #endif |
220 #endif |
249 } |
221 } |
250 } |
222 } |
252 |
224 |
253 void HPSerial::timeout(void) { |
225 void HPSerial::timeout(void) { |
254 set_timer(); // detach the timeouter |
226 set_timer(); // detach the timeouter |
255 if (cur_gstate == GSTATE_STARTING) |
227 if (cur_gstate == GSTATE_STARTING) |
256 _startup(); |
228 _startup(); |
257 else if (cur_gstate == GSTATE_STARTING2) |
|
258 _startup2(); |
|
259 else // reset |
229 else // reset |
260 { |
230 { |
261 cur_gstate = GSTATE_IDLE; |
231 cur_gstate = GSTATE_IDLE; |
262 cur_state = STATE_IDLE; |
232 cur_state = STATE_IDLE; |
263 } |
233 } |
264 } |
234 } |
265 |
|
266 |
|