35 cur_gstate(GSTATE_IDLE), |
36 cur_gstate(GSTATE_IDLE), |
36 ncmd(0) |
37 ncmd(0) |
37 { |
38 { |
38 serial.baud(187500); |
39 serial.baud(187500); |
39 cur_state = STATE_IDLE; |
40 cur_state = STATE_IDLE; |
40 serial.attach(callback(this, &HPSerial::rxIrq), Serial::RxIrq); |
41 serial.attach(callback(this, &HPSerial::rxIrq), SerialBase::RxIrq); |
41 } |
42 } |
42 |
43 |
43 void HPSerial::startup(void) { |
44 void HPSerial::startup(void) { |
44 cur_gstate = GSTATE_STARTING; |
45 cur_gstate = GSTATE_STARTING; |
45 set_timer(0.002); // launch the startup in 10ms |
46 set_timer(0.002); // launch the startup in 10ms |
182 // TODO: check ACK values (c is the received ack) |
183 // TODO: check ACK values (c is the received ack) |
183 if (tr_data.pos >= tr_data.size) |
184 if (tr_data.pos >= tr_data.size) |
184 { |
185 { |
185 return do_state_eot(); |
186 return do_state_eot(); |
186 } |
187 } |
187 serial.putc(tr_data.payload[tr_data.pos++]); |
188 serial.write(&tr_data.payload[tr_data.pos++], 1); |
188 set_timer(RXTIMEOUT); |
189 set_timer(RXTIMEOUT); |
189 return HPSerial::STATE_SENDING; |
190 return HPSerial::STATE_SENDING; |
190 } |
191 } |
191 |
192 |
192 HPSerial::state_t HPSerial::do_state_eot(uint8_t c) |
193 HPSerial::state_t HPSerial::do_state_eot(uint8_t c) |
193 { |
194 { |
194 serial.putc(0x55); // EoT |
195 serial.write(&c, 1); // EoT |
195 cur_gstate = GSTATE_IDLE; |
196 cur_gstate = GSTATE_IDLE; |
196 set_timer(); // We are IDLE, detach the timeouter |
197 set_timer(); // We are IDLE, detach the timeouter |
197 return STATE_IDLE; |
198 return STATE_IDLE; |
198 } |
199 } |
199 |
200 |