3
3
#include < cstdio>
4
4
#include < zephyr/drivers/uart.h>
5
5
6
- static const struct device *const uart_dev =
7
- DEVICE_DT_GET (DT_PROP(DT_PATH(zephyr_user), warduino_uarts));
8
-
9
- // Variables used for setting up the sensor.
10
- int payload_bytes = 0 ;
11
- int payload_index = 0 ;
12
- unsigned int current_payload = 0 ;
13
- unsigned char checksum;
14
- bool data_byte = false ;
15
-
16
- // Variables that are used during setup but also by the heartbeat function.
17
- int baudrate = -1 ;
18
- uint8_t mode = 0 ;
19
- volatile int sensor_value = 0 ;
20
-
21
- volatile uint32_t receive_state = ReceiveState::advertise;
22
- bool baudrate_configured = false ;
23
-
24
- void serial_cb ([[maybe_unused]] const struct device *dev, [[maybe_unused]] void *user_data) {
6
+ void serial_cb (const struct device *dev, void *user_data) {
7
+ auto *sensor = static_cast <UartSensor*>(user_data);
25
8
uint8_t data;
26
9
27
- if (!uart_irq_update (uart_dev )) {
10
+ if (!uart_irq_update (dev )) {
28
11
return ;
29
12
}
30
13
31
- if (!uart_irq_rx_ready (uart_dev )) {
14
+ if (!uart_irq_rx_ready (dev )) {
32
15
return ;
33
16
}
34
17
35
- while (uart_fifo_read (uart_dev , &data, 1 ) == 1 ) {
36
- if (receive_state == ReceiveState::data) {
37
- if (data_byte) {
38
- sensor_value = data;
39
- data_byte = false ;
18
+ while (uart_fifo_read (dev , &data, 1 ) == 1 ) {
19
+ if (sensor-> receive_state == ReceiveState::data) {
20
+ if (sensor-> data_byte ) {
21
+ sensor-> sensor_value = data;
22
+ sensor-> data_byte = false ;
40
23
}
41
24
// Check if it's a data message. This indicates the byte after this
42
25
// will contain data.
43
26
else if (data >> 6 == 0b11 ) {
44
27
// Next byte will be data
45
- data_byte = true ;
28
+ sensor-> data_byte = true ;
46
29
}
47
30
continue ;
48
31
}
49
32
50
- if (payload_bytes > 0 ) {
51
- payload_bytes--;
33
+ if (sensor-> payload_bytes > 0 ) {
34
+ sensor-> payload_bytes --;
52
35
53
- if (payload_bytes > 1 ) {
54
- if (receive_state == ReceiveState::final_mode_format && payload_bytes == 5 && data != 0x80 ) {
55
- receive_state = ReceiveState::advertise;
56
- payload_bytes = 0 ;
36
+ if (sensor-> payload_bytes > 1 ) {
37
+ if (sensor-> receive_state == ReceiveState::final_mode_format && sensor-> payload_bytes == 5 && data != 0x80 ) {
38
+ sensor-> receive_state = ReceiveState::advertise;
39
+ sensor-> payload_bytes = 0 ;
57
40
}
58
- checksum ^= data;
59
- current_payload = current_payload |
60
- (((unsigned long )data) << payload_index * 8 );
61
- payload_index++;
62
- } else if (checksum == data) {
63
- if (receive_state == ReceiveState::advertise) {
64
- printf (" Baudrate = %d\n " , current_payload);
65
- baudrate = (int ) current_payload;
41
+ sensor-> checksum ^= data;
42
+ sensor-> current_payload = sensor-> current_payload |
43
+ (((unsigned long )data) << sensor-> payload_index * 8 );
44
+ sensor-> payload_index ++;
45
+ } else if (sensor-> checksum == data) {
46
+ if (sensor-> receive_state == ReceiveState::advertise) {
47
+ printf (" Baudrate = %d\n " , sensor-> current_payload );
48
+ sensor-> baudrate = (int ) sensor-> current_payload ;
66
49
}
67
- else if (receive_state == ReceiveState::final_mode_format){
68
- receive_state = ReceiveState::modes_complete;
50
+ else if (sensor-> receive_state == ReceiveState::final_mode_format){
51
+ sensor-> receive_state = ReceiveState::modes_complete;
69
52
}
70
53
}
71
54
}
@@ -75,10 +58,10 @@ void serial_cb([[maybe_unused]] const struct device *dev, [[maybe_unused]] void
75
58
// If we receive an ACK after the final format message and we
76
59
// know which speed to communicate at then we should send an ACK to
77
60
// switch to data mode.
78
- if (receive_state == ReceiveState::modes_complete && baudrate > 0 ) {
61
+ if (sensor-> receive_state == ReceiveState::modes_complete && sensor-> baudrate > 0 ) {
79
62
printf (" Completing pairing sequence\n " );
80
- uart_poll_out (uart_dev , 0b00000100 ); // Send ACK back
81
- receive_state = ReceiveState::data;
63
+ uart_poll_out (dev , 0b00000100 ); // Send ACK back
64
+ sensor-> receive_state = ReceiveState::data;
82
65
}
83
66
}
84
67
@@ -87,98 +70,96 @@ void serial_cb([[maybe_unused]] const struct device *dev, [[maybe_unused]] void
87
70
uint8_t sensor_mode = data & 0b111 ;
88
71
printf (" FORMAT for mode %d\n " , sensor_mode);
89
72
if (sensor_mode == 0 ) {
90
- receive_state = ReceiveState::final_mode_format;
91
- payload_bytes = 6 ;
92
- payload_index = 0 ;
93
- current_payload = 0 ;
94
- checksum = 0xff ^ data;
73
+ sensor-> receive_state = ReceiveState::final_mode_format;
74
+ sensor-> payload_bytes = 6 ;
75
+ sensor-> payload_index = 0 ;
76
+ sensor-> current_payload = 0 ;
77
+ sensor-> checksum = 0xff ^ data;
95
78
}
96
79
}
97
80
98
81
// Handle speed command.
99
82
if (data == 0b01010010 ) {
100
- payload_bytes = 5 ;
101
- payload_index = 0 ;
102
- current_payload = 0 ;
103
- checksum = 0xff ^ 0b01010010 ;
83
+ sensor-> payload_bytes = 5 ;
84
+ sensor-> payload_index = 0 ;
85
+ sensor-> current_payload = 0 ;
86
+ sensor-> checksum = 0xff ^ 0b01010010 ;
104
87
}
105
88
}
106
89
}
107
90
108
- void set_sensor_mode (uint8_t new_mode) {
109
- uart_poll_out (uart_dev , 0x43 );
110
- uart_poll_out (uart_dev , new_mode);
111
- uart_poll_out (uart_dev , 0xff ^ 0x43 ^ new_mode);
91
+ void set_sensor_mode (UartSensor *sensor, uint8_t new_mode) {
92
+ uart_poll_out (sensor-> dev , 0x43 );
93
+ uart_poll_out (sensor-> dev , new_mode);
94
+ uart_poll_out (sensor-> dev , 0xff ^ 0x43 ^ new_mode);
112
95
113
96
// Invalidate current sensor values. This prevents the program reading values that it normally cannot read in a
114
97
// particular mode.
115
- sensor_value = -1 ;
98
+ sensor-> sensor_value = -1 ;
116
99
}
117
100
118
- void uartHeartbeat () {
119
- if (receive_state != ReceiveState::data) {
101
+ bool configure_uart_sensor (UartSensor *sensor, uint8_t new_mode) {
102
+ if (!sensor_ready (sensor)) {
103
+ printf (" Input port is not ready!\n " );
104
+ return false ;
105
+ }
106
+
107
+ printf (" Setting up uart\n " );
108
+ int ret = uart_irq_callback_user_data_set (sensor->dev , serial_cb, sensor);
109
+ if (ret < 0 ) {
110
+ if (ret == -ENOTSUP) {
111
+ printf (" Interrupt-driven UART API support not enabled\n " );
112
+ } else if (ret == -ENOSYS) {
113
+ printf (" UART device does not support interrupt-driven API\n " );
114
+ } else {
115
+ printf (" Error setting UART callback: %d\n " , ret);
116
+ }
117
+ return false ;
118
+ }
119
+ uart_irq_rx_enable (sensor->dev );
120
+ if (sensor->receive_state == ReceiveState::data && sensor->mode != new_mode) {
121
+ set_sensor_mode (sensor, new_mode);
122
+ }
123
+ sensor->mode = new_mode;
124
+ return true ;
125
+ }
126
+
127
+ void uartHeartbeat (UartSensor *sensor) {
128
+ if (sensor->receive_state != ReceiveState::data) {
120
129
return ;
121
130
}
122
131
123
- if (!baudrate_configured) {
124
- printf (" Changing baudrate to %d\n " , baudrate);
132
+ if (!sensor-> baudrate_configured ) {
133
+ printf (" Changing baudrate to %d\n " , sensor-> baudrate );
125
134
uart_config cfg{};
126
- uart_config_get (uart_dev , &cfg);
127
- cfg.baudrate = baudrate;
135
+ uart_config_get (sensor-> dev , &cfg);
136
+ cfg.baudrate = sensor-> baudrate ;
128
137
129
- int config_err = uart_configure (uart_dev , &cfg);
138
+ int config_err = uart_configure (sensor-> dev , &cfg);
130
139
printf (" config_err = %d\n " , config_err);
131
140
if (config_err) {
132
141
printf (" UART configure error %d" , config_err);
133
142
}
134
143
135
- config_err = uart_config_get (uart_dev , &cfg);
144
+ config_err = uart_config_get (sensor-> dev , &cfg);
136
145
printf (" current baudrate after config change = %d\n " , cfg.baudrate );
137
146
printf (" config_err = %d\n " , config_err);
138
- baudrate_configured = true ;
147
+ sensor-> baudrate_configured = true ;
139
148
140
149
// Change to the desired mode.
141
- set_sensor_mode (mode);
150
+ set_sensor_mode (sensor, sensor-> mode );
142
151
}
143
152
144
- if (baudrate_configured) {
145
- uart_poll_out (uart_dev, 0b00000010 );
146
- }
153
+ uart_poll_out (sensor->dev , 0b00000010 );
147
154
}
148
155
149
- bool sensor_ready () {
150
- return device_is_ready (uart_dev );
156
+ bool sensor_ready (UartSensor *sensor ) {
157
+ return device_is_ready (sensor-> dev );
151
158
}
152
159
153
- int get_sensor_value () {
154
- if (!baudrate_configured || sensor_value < 0 ) {
160
+ int get_sensor_value (UartSensor *sensor ) {
161
+ if (!sensor-> baudrate_configured || sensor-> sensor_value < 0 ) {
155
162
return 0 ;
156
163
}
157
- return sensor_value;
158
- }
159
-
160
- bool configure_uart_sensor (uint8_t new_mode) {
161
- if (!sensor_ready ()) {
162
- printf (" Input port is not ready!\n " );
163
- return false ;
164
- }
165
-
166
- printf (" Setting up uart\n " );
167
- int ret = uart_irq_callback_user_data_set (uart_dev, serial_cb, nullptr );
168
- if (ret < 0 ) {
169
- if (ret == -ENOTSUP) {
170
- printf (" Interrupt-driven UART API support not enabled\n " );
171
- } else if (ret == -ENOSYS) {
172
- printf (" UART device does not support interrupt-driven API\n " );
173
- } else {
174
- printf (" Error setting UART callback: %d\n " , ret);
175
- }
176
- return false ;
177
- }
178
- uart_irq_rx_enable (uart_dev);
179
- if (receive_state == ReceiveState::data && mode != new_mode) {
180
- set_sensor_mode (new_mode);
181
- }
182
- mode = new_mode;
183
- return true ;
164
+ return sensor->sensor_value ;
184
165
}
0 commit comments