Wed, 18 Jan 2017 23:19:13 +0100
Stuff...
5 | 1 | #ifndef HP34COMM_H |
2 | #define HP34COMM_H | |
3 | ||
4 | #include "mbed.h" | |
5 | #include "CircularBuffer.h" | |
6 | ||
7 | /***** HP 34970A communication class ***/ | |
8 | ||
9 | #define MAX_ERRS 10 | |
8 | 10 | #define MAX_BUFF 16 |
11 | #define BUF_SIZE 16 | |
5 | 12 | |
18
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
13 | |
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
14 | |
5 | 15 | class HPSerial { |
16 | ||
17 | public: | |
18 | typedef struct _CMD | |
19 | { | |
20 | uint8_t cmd; | |
21 | uint8_t size; | |
22 | char value[MAX_BUFF+1]; | |
23 | unsigned long id; | |
24 | } CMD; | |
25 | ||
18
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
26 | HPSerial(PinName tx, PinName rx); |
19 | 27 | |
5 | 28 | bool cmd_available(void); |
29 | bool pop(CMD& cmd); | |
30 | bool cmd_buf_full(void); | |
31 | unsigned int nerrors(uint8_t errorno); | |
19 | 32 | |
33 | void startup(void); | |
34 | void send(const uint8_t *buf, uint8_t size); | |
35 | void sendkey(uint8_t keycode); | |
5 | 36 | |
37 | private: | |
18
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
38 | void pushCmd(uint8_t cmd, uint8_t size, char *payload); |
5 | 39 | void rxIrq(void); |
40 | void timeout(void); | |
19 | 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 | } | |
5 | 46 | |
47 | private: | |
18
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
48 | RawSerial serial; |
5 | 49 | uint8_t buf[BUF_SIZE]; |
50 | uint8_t head; | |
51 | CircularBuffer<CMD, 32> cmdbuf; | |
52 | unsigned long ncmd; | |
53 | unsigned int errs[MAX_ERRS]; | |
54 | Ticker timeouter; | |
18
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
55 | |
19 | 56 | public: |
57 | // global state machine | |
58 | typedef enum { | |
59 | GSTATE_STARTING, | |
60 | GSTATE_STARTING2, | |
61 | GSTATE_IDLE, | |
62 | GSTATE_TX, | |
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(); */ | |
18
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
69 | |
19 | 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 { | |
18
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
95 | uint8_t cmd; |
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
96 | uint8_t size; |
19 | 97 | uint8_t pos; |
18
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
98 | char payload[MAX_BUFF]; |
19 | 99 | } state_data_t; |
18
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
100 | |
19 | 101 | void _startup(void); |
102 | void _startup2(void); | |
103 | state_t do_state_initial(uint8_t c=0x00); | |
104 | state_t do_state_command(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); | |
18
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
109 | |
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
110 | void send_ack(uint8_t c); |
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
111 | |
19 | 112 | typedef state_t(HPSerial::*statemethod)(uint8_t c); |
113 | static statemethod state_table[NUM_STATES]; | |
114 | state_t run_state(state_t cur_state, uint8_t c); | |
18
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
115 | |
4fd621551d55
[full replacement] implement a state machine for Rx
David Douard <david.douard@logilab.fr>
parents:
10
diff
changeset
|
116 | state_t cur_state; |
19 | 117 | state_data_t tr_data; |
5 | 118 | }; |
119 | ||
19 | 120 | |
5 | 121 | #endif |