src/hp34comm.cpp

Wed, 26 Oct 2016 22:41:16 +0200

author
David Douard <david.douard@logilab.fr>
date
Wed, 26 Oct 2016 22:41:16 +0200
changeset 17
162fe523c37d
parent 16
c5e5bdc5ef49
child 18
4fd621551d55
permissions
-rw-r--r--

almost working... before killing the 87C51...

5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
1 #include "hp34comm.h"
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
2 #include "mbed.h"
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
3 #include "CircularBuffer.h"
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
4
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
5 /***** HP 34970A communication class ***/
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
6
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
7 #ifdef DEBUG2
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
8
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
9 DigitalOut inrx(D9);
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
10 DigitalOut intx(D5);
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
11 DigitalOut ack(D6);
15
ec327bf8f224 use A10 and D10 instead of D7 and D8 as dbg pins
David Douard <david.douard@logilab.fr>
parents: 10
diff changeset
12 DigitalOut staterx(A0);
ec327bf8f224 use A10 and D10 instead of D7 and D8 as dbg pins
David Douard <david.douard@logilab.fr>
parents: 10
diff changeset
13 DigitalOut statetx(D10);
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
14
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
15 #endif
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
16
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
17 DigitalOut lled(LED1);
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
18
10
David Douard <david.douard@logilab.fr>
parents: 9
diff changeset
19 HPSerial::HPSerial(PinName rx):
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
20 serial_rx(NC, rx),
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
21 ncmd(0) {
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
22
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
23 //pc.printf("HPSerial init\n");
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
24
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
25 for(uint8_t i=0; i<MAX_ERRS; i++)
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
26 errs[i] = 0;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
27 reset();
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
28
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
29 serial_rx.baud(187500);
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
30 serial_rx.attach(this, &HPSerial::rxIrq, Serial::RxIrq);
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
31 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
32
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
33 bool HPSerial::cmd_available(void) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
34 return !cmdbuf.empty();
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
35 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
36
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
37 bool HPSerial::pop(CMD& cmd) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
38 return cmdbuf.pop(cmd);
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
39 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
40
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
41 bool HPSerial::cmd_buf_full(void) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
42 return cmdbuf.full();
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
43 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
44
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
45 unsigned int HPSerial::nerrors(uint8_t errorno) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
46 return errs[errorno];
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
47 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
48
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
49
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
50
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
51 void HPSerial::reset(uint8_t errorno) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
52 timeouter.detach();
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
53 head = 0;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
54 tx_state = Idle;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
55 setstatedbg();
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
56 tx_cmd = 0xFF;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
57 tx_ack = false;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
58 tx_len = 0xFF;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
59 memset(buf, 0, BUF_SIZE);
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
60 if (errorno != 0xFF){
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
61 errs[errorno]++;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
62 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
63
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
64 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
65
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
66 void HPSerial::handleAck(uint8_t val) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
67 if ((tx_state == Rx) & (tx_cmd == 0xFF) & (tx_ack == false) & (val == 0x66)) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
68 // special case: keypad does not acknwledge and takes precedence
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
69 // on the "bus"
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
70 tx_state = Tx;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
71 setstatedbg();
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
72 } else
9
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
73 if (tx_cmd == 0xFF) // beginning of a packet, expect 0x99 as ack
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
74 if (val == 0x99)
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
75 {
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
76 tx_ack = true;
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
77 #ifdef DEBUG2
9
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
78 ack = 1;
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
79 wait_us(2);
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
80 ack = 0;
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
81 #endif
9
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
82 }
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
83 else
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
84 reset(1);
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
85
9
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
86 else // expect 0x00 as ack
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
87 if (val == 0x00)
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
88 {
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
89 tx_ack = true;
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
90 #ifdef DEBUG2
9
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
91 ack = 1;
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
92 wait_us(2);
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
93 ack = 0;
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
94 #endif
9
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
95 }
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
96 else
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
97 reset(2);
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
98 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
99
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
100 void HPSerial::pushCmd(TrState direction, uint8_t cmd, uint8_t size, char *payload) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
101 CMD val;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
102 uint8_t i;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
103 val.id = ncmd++;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
104 val.direction = direction;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
105 val.cmd = cmd;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
106 val.size = size;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
107 for(i=0; i<size; i++)
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
108 val.value[i] = payload[i];
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
109 val.value[i] = 0x00;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
110 cmdbuf.push(val);
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
111 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
112
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
113 void HPSerial::handleChar(uint8_t val) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
114 if (tx_ack == false)
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
115 reset(3);
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
116 else // remaining of the state machine
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
117 if (tx_cmd == 0xFF) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
118 // begin of transmission, expect a cmd
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
119 tx_cmd = val;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
120 tx_ack = false;
9
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
121 tx_len = 0xFF;
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
122 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
123 else if (tx_len == 0xFF) {
16
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
124 if (val == 0x55) {
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
125 // packet was in fact a keystroke, tx_cmd is in fact the key
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
126 // stroke and no payload is expected
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
127 #ifdef DEBUG2
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
128 statetx = 1;
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
129 #endif
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
130 pushCmd((TrState)Tx, tx_cmd, 0, (char*)buf);
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
131 #ifdef DEBUG2
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
132 wait_us(2);
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
133 statetx = 0;
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
134 #endif
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
135 reset();
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
136 } else {
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
137 // got a cmd, expect a payload size
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
138 tx_len = val;
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
139 tx_ack = false;
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
140 }
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
141 }
9
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
142 else if (tx_len == 0x55) {
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
143 // packet was in fact a keystroke, tx_cmd is in fact the key
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
144 // stroke and no payload is expected
16
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
145 #ifdef DEBUG2
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
146 statetx = 1;
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
147 #endif
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
148 pushCmd((TrState)Tx, tx_cmd, 0, (char*)buf);
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
149 #ifdef DEBUG2
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
150 wait_us(2);
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
151 statetx = 0;
c5e5bdc5ef49 [hp34comm] fix key stroke reception code
David Douard <david.douard@logilab.fr>
parents: 15
diff changeset
152 #endif
9
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
153 reset();
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
154 }
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
155 else if (tx_len > 0) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
156 // a payload char
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
157 buf[head++] = val;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
158 tx_len--;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
159 tx_ack = false;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
160 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
161 else { // end of payload, manage sent content
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
162 uint8_t cur_state = tx_state;
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
163 pushCmd((TrState)tx_state, tx_cmd, head, (char*)buf);
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
164
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
165 switch(val) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
166 case 0x66: // a new transmisson
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
167 reset();
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
168 tx_state = cur_state;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
169 setstatedbg();
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
170 break;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
171 case 0x55:
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
172 reset();
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
173 break;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
174 default:
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
175 reset(6);
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
176 break;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
177 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
178 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
179 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
180
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
181
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
182
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
183 void HPSerial::setstatedbg(void) {
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
184 #ifdef DEBUG2
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
185 if (tx_state == Rx)
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
186 staterx = 1;
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
187 else
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
188 staterx = 0;
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
189 if (tx_state == Tx)
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
190 statetx = 1;
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
191 else
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
192 statetx = 0;
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
193 #endif
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
194 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
195
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
196 void HPSerial::rxIrq(void) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
197 uint8_t val;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
198 if(serial_rx.readable()) { // no reason why we would end here without this condition, but hey
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
199 #ifdef DEBUG2
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
200 inrx=1;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
201 #endif
9
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
202 lled = 1;
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
203 val = serial_rx.getc();
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
204
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
205 timeouter.attach(this, &HPSerial::timeout, 0.001); // if nothing else happen in the next ms, reset
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
206
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
207 if (tx_state == Idle)
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
208 if (val == 0x66) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
209 // no transmission in progress, expect a start of transmission
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
210 tx_state = Rx;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
211 tx_ack = false;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
212 setstatedbg();
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
213 }
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
214 else {
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
215 reset(4);
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
216 }
9
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
217 else if (tx_ack == false) // manage the acks
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
218 handleAck(val);
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
219 else
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
220 handleChar(val);
9
e5254c6aa0c8 use only one USART
David Douard <david.douard@logilab.fr>
parents: 8
diff changeset
221 lled = 0;
8
55021f3f1929 pff so many stuff
David Douard <david.douard@logilab.fr>
parents: 5
diff changeset
222 #ifdef DEBUG2
5
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
223 inrx=0;
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
224 #endif
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
225 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
226 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
227
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
228
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
229 void HPSerial::timeout(void) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
230 if (tx_state != Idle) {
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
231 reset(7);
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
232 }
f1c85c2500f2 several improvements
David Douard <david.douard@logilab.fr>
parents:
diff changeset
233 }

mercurial