@@ -161,6 +161,7 @@ class Kts1622 : public BasePeripheral<> {
161
161
* output pins on the ports.
162
162
*/
163
163
void output (uint8_t p0, uint8_t p1, std::error_code &ec) {
164
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
164
165
output (Port::PORT0, p0, ec);
165
166
if (ec)
166
167
return ;
@@ -175,6 +176,7 @@ class Kts1622 : public BasePeripheral<> {
175
176
* output pins on the ports.
176
177
*/
177
178
void output (uint16_t value, std::error_code &ec) {
179
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
178
180
output (Port::PORT0, value & 0xFF , ec);
179
181
if (ec)
180
182
return ;
@@ -189,6 +191,7 @@ class Kts1622 : public BasePeripheral<> {
189
191
* @param ec Error code to set if an error occurs.
190
192
*/
191
193
void clear_pins (Port port, uint8_t mask, std::error_code &ec) {
194
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
192
195
auto addr = port == Port::PORT0 ? Registers::OUTPORT0 : Registers::OUTPORT1;
193
196
auto data = read_u8_from_register ((uint8_t )addr, ec);
194
197
if (ec)
@@ -205,6 +208,7 @@ class Kts1622 : public BasePeripheral<> {
205
208
* @param ec Error code to set if an error occurs.
206
209
*/
207
210
void clear_pins (uint8_t p0, uint8_t p1, std::error_code &ec) {
211
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
208
212
clear_pins (Port::PORT0, p0, ec);
209
213
if (ec)
210
214
return ;
@@ -218,6 +222,7 @@ class Kts1622 : public BasePeripheral<> {
218
222
* @param ec Error code to set if an error occurs.
219
223
*/
220
224
void clear_pins (uint16_t mask, std::error_code &ec) {
225
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
221
226
clear_pins (Port::PORT0, mask & 0xFF , ec);
222
227
if (ec)
223
228
return ;
@@ -233,6 +238,7 @@ class Kts1622 : public BasePeripheral<> {
233
238
*/
234
239
void set_pins (Port port, uint8_t mask, std::error_code &ec) {
235
240
auto addr = port == Port::PORT0 ? Registers::OUTPORT0 : Registers::OUTPORT1;
241
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
236
242
auto data = read_u8_from_register ((uint8_t )addr, ec);
237
243
if (ec)
238
244
return ;
@@ -248,6 +254,7 @@ class Kts1622 : public BasePeripheral<> {
248
254
* @param ec Error code to set if an error occurs.
249
255
*/
250
256
void set_pins (uint8_t p0, uint8_t p1, std::error_code &ec) {
257
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
251
258
set_pins (Port::PORT0, p0, ec);
252
259
if (ec)
253
260
return ;
@@ -261,6 +268,7 @@ class Kts1622 : public BasePeripheral<> {
261
268
* @param ec Error code to set if an error occurs.
262
269
*/
263
270
void set_pins (uint16_t mask, std::error_code &ec) {
271
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
264
272
set_pins (Port::PORT0, mask & 0xFF , ec);
265
273
if (ec)
266
274
return ;
@@ -284,6 +292,7 @@ class Kts1622 : public BasePeripheral<> {
284
292
* @return The pin values as a 16 bit mask (P0_0 lsb, P1_7 msb).
285
293
*/
286
294
uint16_t get_output (std::error_code &ec) {
295
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
287
296
uint16_t p0 = read_u8_from_register ((uint8_t )Registers::OUTPORT0, ec);
288
297
if (ec)
289
298
return 0 ;
@@ -300,6 +309,7 @@ class Kts1622 : public BasePeripheral<> {
300
309
* @param ec Error code to set if an error occurs.
301
310
*/
302
311
void set_port_output_drive_mode (Port port, OutputDriveMode mode, std::error_code &ec) {
312
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
303
313
// get the current value from the register
304
314
uint8_t data = read_u8_from_register ((uint8_t )Registers::OUT_CFG, ec);
305
315
if (ec)
@@ -397,6 +407,7 @@ class Kts1622 : public BasePeripheral<> {
397
407
*/
398
408
void configure_interrupt (uint8_t p0, uint8_t p1, InterruptType type, std::error_code &ec) {
399
409
logger_.info (" Configuring interrupt p0:{:#08b}, p1:{:#08b} to {}" , p0, p1, type);
410
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
400
411
configure_interrupt (Port::PORT0, p0, type, ec);
401
412
if (ec)
402
413
return ;
@@ -442,6 +453,7 @@ class Kts1622 : public BasePeripheral<> {
442
453
* @param ec Error code to set if an error occurs.
443
454
*/
444
455
void clear_interrupts (std::error_code &ec) {
456
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
445
457
write_u8_to_register ((uint8_t )Registers::INT_CLEAR0, 0xFF , ec);
446
458
if (ec)
447
459
return ;
@@ -489,6 +501,7 @@ class Kts1622 : public BasePeripheral<> {
489
501
* @param ec Error code to set if an error occurs.
490
502
*/
491
503
void set_direction (uint16_t mask, bool direction, std::error_code &ec) {
504
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
492
505
auto addr = Registers::CONFIG0;
493
506
uint8_t data[] = {0 , 0 };
494
507
read_many_from_register ((uint8_t )addr, data, 2 , ec);
@@ -615,6 +628,7 @@ class Kts1622 : public BasePeripheral<> {
615
628
// if pull == PullResistor::NO_PULL, then clear the bits in the appropriate
616
629
// PULL_UP_DOWN_EN register
617
630
auto addr = port == Port::PORT0 ? Registers::PULL_UP_DOWN_EN0 : Registers::PULL_UP_DOWN_EN1;
631
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
618
632
auto data = read_u8_from_register ((uint8_t )addr, ec);
619
633
if (ec)
620
634
return ;
@@ -705,6 +719,7 @@ class Kts1622 : public BasePeripheral<> {
705
719
};
706
720
707
721
void init (const Config &config, std::error_code &ec) {
722
+ std::lock_guard<std::recursive_mutex> lock (base_mutex_);
708
723
set_direction (Port::PORT0, config.port_0_direction_mask , ec);
709
724
if (ec)
710
725
return ;
0 commit comments