MeshX 0.4
This repository provides an implementation for Bluetooth Low Energy (BLE) Mesh network nodes. The project allows you to create BLE mesh nodes that can communicate with each other, enabling the development of smart home solutions or other IoT-based applications.
Loading...
Searching...
No Matches
gpio_property_test.c File Reference

Property-based tests for MeshX GPIO interface validation. More...

Data Structures

struct  gpio_test_config_t
 Test configuration for GPIO property tests. More...
struct  gpio_test_state_t
 Test state for tracking GPIO operations. More...

Functions

void meshx_gpio_test_set_pin_count (uint8_t count)
void meshx_gpio_test_set_pin_mode (uint8_t pin, meshx_gpio_mode_t mode)
static void init_test_state (void)
 Initialize test state.
static meshx_err_t test_property_mode_specific_operations (void)
 Property 2.1: Mode-specific operation validity.
static meshx_err_t test_property_error_codes (void)
 Property 2.2: Appropriate error codes for invalid operations.
static meshx_err_t test_property_operation_isolation (void)
 Property 2.3: Operation isolation (no effect on other pins).
static meshx_err_t test_property_state_tracking (void)
 Property 2.4: Consistent pin state tracking.
static meshx_err_t test_property_init_deinit (void)
 Property 2.5: Initialization and deinitialization.
static meshx_err_t run_gpio_property_tests (void)
 Comprehensive property test for GPIO interface validation.
static meshx_err_t gpio_property_test_handler (int cmd_id, int argc, char **argv)
 GPIO property test command handler.
meshx_err_t register_gpio_property_tests (void)
 Register GPIO property tests with unit test framework.

Variables

static gpio_test_state_t test_state

Detailed Description

Property-based tests for MeshX GPIO interface validation.

This file implements property-based tests for the MeshX GPIO subsystem, specifically validating Property 2: Mode-Aware GPIO Operation Validity.

Validates: Requirements 2.1-2.5, 2.8-2.10, 8.1-8.3, 8.9-8.10

Property 2: Mode-Aware GPIO Operation Validity For any GPIO pin configured in a specific mode (input, output, open-drain, input/output, PWM output), operations attempted on that pin SHALL:

  1. Succeed only if valid for the pin's configured mode
  2. Return appropriate standardized error codes for invalid operations
  3. Not affect the state of other GPIO pins
  4. Maintain consistent pin state tracking for runtime validation
  5. Initialize and deinitialize pins correctly during system startup/shutdown
Author
MeshX Team
Date
2024

Function Documentation

◆ gpio_property_test_handler()

meshx_err_t gpio_property_test_handler ( int cmd_id,
int argc,
char ** argv )
static

GPIO property test command handler.

This function is called by the unit test framework when GPIO tests are requested.

488{
489 (void)argc;
490 (void)argv;
491
492 switch (cmd_id) {
493 case 0:
494 // Run all property tests
496
497 case 1:
498 // Property 2.1: Mode-specific operation validity
501
502 case 2:
503 // Property 2.2: Appropriate error codes
506
507 case 3:
508 // Property 2.3: Operation isolation
511
512 case 4:
513 // Property 2.4: State tracking
516
517 case 5:
518 // Property 2.5: Initialization/deinitialization
521
522 default:
523 MESHX_LOGE(MODULE_ID_COMMON, "Unknown GPIO test command ID: %d", cmd_id);
524 return MESHX_INVALID_ARG;
525 }
526}
static meshx_err_t test_property_operation_isolation(void)
Property 2.3: Operation isolation (no effect on other pins).
Definition gpio_property_test.c:233
static meshx_err_t test_property_init_deinit(void)
Property 2.5: Initialization and deinitialization.
Definition gpio_property_test.c:373
static meshx_err_t run_gpio_property_tests(void)
Comprehensive property test for GPIO interface validation.
Definition gpio_property_test.c:437
static meshx_err_t test_property_state_tracking(void)
Property 2.4: Consistent pin state tracking.
Definition gpio_property_test.c:284
static meshx_err_t test_property_mode_specific_operations(void)
Property 2.1: Mode-specific operation validity.
Definition gpio_property_test.c:78
static meshx_err_t test_property_error_codes(void)
Property 2.2: Appropriate error codes for invalid operations.
Definition gpio_property_test.c:174
static void init_test_state(void)
Initialize test state.
Definition gpio_property_test.c:62
@ MESHX_INVALID_ARG
Definition meshx_err.h:46
#define MESHX_LOGE(module_id, format,...)
Definition meshx_log.h:114
@ MODULE_ID_COMMON
Definition module_id.h:36

◆ init_test_state()

void init_test_state ( void )
static

Initialize test state.

63{
67 memset(&test_state, 0, sizeof(test_state));
68 for (int i = 0; i < 256; i++) {
69 test_state.pin_modes[i] = MESHX_GPIO_MODE_MAX; // Invalid mode by default
70 }
71}
void meshx_gpio_test_set_pin_count(uint8_t count)
Definition meshx_gpio.c:72
static gpio_test_state_t test_state
Definition gpio_property_test.c:57
meshx_err_t meshx_gpio_init(void)
Initialize GPIO subsystem.
Definition meshx_gpio.c:95
meshx_err_t meshx_gpio_deinit(void)
Deinitialize GPIO subsystem.
Definition meshx_gpio.c:189
@ MESHX_GPIO_MODE_MAX
Definition meshx_gpio.h:35

◆ meshx_gpio_test_set_pin_count()

void meshx_gpio_test_set_pin_count ( uint8_t count)
extern
73{
74 if (count <= 128) {
75 gpio_runtime.pin_count = count;
76 return MESHX_SUCCESS;
77 }
78 return MESHX_FAIL;
79}
@ MESHX_FAIL
Definition meshx_err.h:45
static meshx_gpio_runtime_t gpio_runtime
Definition meshx_gpio.c:38
**This function is called by the parent element when a state change request *is received It validates the request and returns a result to the element not the model layer **return * MESHX_SUCCESS
Definition meshx_model_level.cpp:385

◆ meshx_gpio_test_set_pin_mode()

void meshx_gpio_test_set_pin_mode ( uint8_t pin,
meshx_gpio_mode_t mode )
extern

◆ register_gpio_property_tests()

meshx_err_t register_gpio_property_tests ( void )

Register GPIO property tests with unit test framework.

Returns
meshx_err_t Registration result
532{
533 MESHX_LOGD(MODULE_ID_GPIO_PROPERTY_TEST, "Registering GPIO property tests");
535}
static meshx_err_t gpio_property_test_handler(int cmd_id, int argc, char **argv)
GPIO property test command handler.
Definition gpio_property_test.c:487
#define MESHX_LOGD(module_id, format,...)
Definition meshx_log.h:132
@ MODULE_ID_GPIO_PROPERTY_TEST
Definition module_id.h:46
meshx_err_t register_unit_test(module_id_t module_id, module_callback_t callback)
Register a unit test for a specific module.
Definition unit_test.c:137

◆ run_gpio_property_tests()

meshx_err_t run_gpio_property_tests ( void )
static

Comprehensive property test for GPIO interface validation.

Runs all property tests for Property 2: Mode-Aware GPIO Operation Validity.

438{
439 MESHX_LOGD(MODULE_ID_COMMON, "Starting GPIO Property Tests");
440 MESHX_LOGD(MODULE_ID_COMMON, "Property 2: Mode-Aware GPIO Operation Validity");
441 MESHX_LOGD(MODULE_ID_COMMON, "Validates: Requirements 2.1-2.5, 2.8-2.10, 8.1-8.3, 8.9-8.10");
442
444
445 // Run all property tests
446 meshx_err_t result;
447
449 if (result != MESHX_SUCCESS) {
450 MESHX_LOGE(MODULE_ID_COMMON, "Property 2.1 FAILED");
451 return result;
452 }
453
454 result = test_property_error_codes();
455 if (result != MESHX_SUCCESS) {
456 MESHX_LOGE(MODULE_ID_COMMON, "Property 2.2 FAILED");
457 return result;
458 }
459
461 if (result != MESHX_SUCCESS) {
462 MESHX_LOGE(MODULE_ID_COMMON, "Property 2.3 FAILED");
463 return result;
464 }
465
467 if (result != MESHX_SUCCESS) {
468 MESHX_LOGE(MODULE_ID_COMMON, "Property 2.4 FAILED");
469 return result;
470 }
471
472 result = test_property_init_deinit();
473 if (result != MESHX_SUCCESS) {
474 MESHX_LOGE(MODULE_ID_COMMON, "Property 2.5 FAILED");
475 return result;
476 }
477
478 MESHX_LOGI(MODULE_ID_COMMON, "All GPIO Property Tests PASSED");
479 return MESHX_SUCCESS;
480}
meshx_err_t
MeshX Error Codes.
Definition meshx_err.h:43
#define MESHX_LOGI(module_id, format,...)
Definition meshx_log.h:126

◆ test_property_error_codes()

meshx_err_t test_property_error_codes ( void )
static

Property 2.2: Appropriate error codes for invalid operations.

Tests that invalid operations return appropriate standardized error codes.

175{
176 MESHX_LOGD(MODULE_ID_COMMON, "Testing Property 2.2: Appropriate error codes");
177
178 // Test invalid pin number (out of range)
179 meshx_err_t result = meshx_gpio_set_level(255, 1); // 255 is valid (0-255)
180 // Actually 255 is valid since range is 0-255, so let's test with 256
181 // But our API uses uint8_t, so 256 would wrap to 0
182
183 // Instead test with uninitialized pin
184 uint8_t uninitialized_pin = 200;
185 test_state.pin_initialized[uninitialized_pin] = false;
186 test_state.pin_modes[uninitialized_pin] = MESHX_GPIO_MODE_MAX;
187
188 result = meshx_gpio_set_level(uninitialized_pin, 1);
191 "FAIL: Operation on uninitialized pin should return appropriate error code, got: %d",
192 result);
193 return MESHX_FAIL;
194 }
195
196 // Test mode mismatch - try output operation on input pin
197 uint8_t input_pin = 10;
198 test_state.pin_modes[input_pin] = MESHX_GPIO_MODE_INPUT;
199 test_state.pin_initialized[input_pin] = true;
201
202 result = meshx_gpio_set_level(input_pin, 1);
203 if (result != MESHX_ERR_GPIO_INVALID_MODE) {
205 "FAIL: set_level on input pin should return MESHX_ERR_GPIO_INVALID_MODE, got: %d",
206 result);
207 return MESHX_FAIL;
208 }
209
210 // Test invalid level value
211 uint8_t output_pin = 11;
212 test_state.pin_modes[output_pin] = MESHX_GPIO_MODE_OUTPUT;
213 test_state.pin_initialized[output_pin] = true;
215
216 result = meshx_gpio_set_level(output_pin, 2); // Invalid level (only 0 or 1)
217 if (result != MESHX_ERR_GPIO_INVALID_LEVEL) {
219 "FAIL: set_level with invalid level should return MESHX_ERR_GPIO_INVALID_LEVEL, got: %d",
220 result);
221 return MESHX_FAIL;
222 }
223
224 MESHX_LOGD(MODULE_ID_COMMON, "PASS: Property 2.2 - Appropriate error codes");
225 return MESHX_SUCCESS;
226}
void meshx_gpio_test_set_pin_mode(uint8_t pin, meshx_gpio_mode_t mode)
@ MESHX_ERR_GPIO_INVALID_PIN
Definition meshx_err.h:63
@ MESHX_ERR_GPIO_INVALID_LEVEL
Definition meshx_err.h:65
@ MESHX_ERR_GPIO_INVALID_MODE
Definition meshx_err.h:64
@ MESHX_ERR_GPIO_NOT_INITIALIZED
Definition meshx_err.h:70
meshx_err_t meshx_gpio_set_level(uint8_t logical_pin, uint8_t level)
Set GPIO pin level.
Definition meshx_gpio.c:322
@ MESHX_GPIO_MODE_INPUT
Definition meshx_gpio.h:29
@ MESHX_GPIO_MODE_OUTPUT
Definition meshx_gpio.h:30

◆ test_property_init_deinit()

meshx_err_t test_property_init_deinit ( void )
static

Property 2.5: Initialization and deinitialization.

Tests that pins initialize and deinitialize correctly during system startup/shutdown.

374{
375 MESHX_LOGD(MODULE_ID_COMMON, "Testing Property 2.5: Initialization and deinitialization");
376
377 // Test initialization
378 meshx_err_t result = meshx_gpio_init();
379 if (result != MESHX_SUCCESS) {
380 MESHX_LOGE(MODULE_ID_COMMON, "FAIL: GPIO initialization failed: %d", result);
381 return MESHX_FAIL;
382 }
383
384 // Verify pins can be used after initialization
385 uint8_t test_pin = 40;
386 test_state.pin_modes[test_pin] = MESHX_GPIO_MODE_OUTPUT;
387 test_state.pin_initialized[test_pin] = true;
388
389 result = meshx_gpio_set_level(test_pin, 1);
390 if (result != MESHX_SUCCESS) {
392 "FAIL: Cannot use GPIO after initialization: %d", result);
393 return MESHX_FAIL;
394 }
395
396 // Test deinitialization
397 result = meshx_gpio_deinit();
398 if (result != MESHX_SUCCESS) {
399 MESHX_LOGE(MODULE_ID_COMMON, "FAIL: GPIO deinitialization failed: %d", result);
400 return MESHX_FAIL;
401 }
402
403 // Verify pins cannot be used after deinitialization
404 // (This depends on implementation - may return MESHX_ERR_GPIO_NOT_INITIALIZED
405 // or may re-initialize automatically)
406 result = meshx_gpio_set_level(test_pin, 0);
407 if (result != MESHX_SUCCESS && result != MESHX_ERR_GPIO_NOT_INITIALIZED) {
409 "FAIL: Unexpected error after deinitialization: %d", result);
410 return MESHX_FAIL;
411 }
412
413 // Test re-initialization
414 result = meshx_gpio_init();
415 if (result != MESHX_SUCCESS) {
416 MESHX_LOGE(MODULE_ID_COMMON, "FAIL: GPIO re-initialization failed: %d", result);
417 return MESHX_FAIL;
418 }
419
420 // Verify pins can be used again after re-initialization
421 result = meshx_gpio_set_level(test_pin, 1);
422 if (result != MESHX_SUCCESS) {
424 "FAIL: Cannot use GPIO after re-initialization: %d", result);
425 return MESHX_FAIL;
426 }
427
428 MESHX_LOGD(MODULE_ID_COMMON, "PASS: Property 2.5 - Initialization and deinitialization");
429 return MESHX_SUCCESS;
430}

◆ test_property_mode_specific_operations()

meshx_err_t test_property_mode_specific_operations ( void )
static

Property 2.1: Mode-specific operation validity.

Tests that operations succeed only if valid for the pin's configured mode.

79{
80 MESHX_LOGD(MODULE_ID_COMMON, "Testing Property 2.1: Mode-specific operation validity");
81
82 // Test cases for different modes and operations
83 const struct {
85 const char* mode_name;
86 bool should_set_succeed;
87 bool should_get_succeed;
88 bool should_toggle_succeed;
89 } test_cases[] = {
90 {MESHX_GPIO_MODE_INPUT, "INPUT", false, true, false},
91 {MESHX_GPIO_MODE_OUTPUT, "OUTPUT", true, true, true},
92 {MESHX_GPIO_MODE_INPUT_OUTPUT, "INPUT_OUTPUT", true, true, true},
93 {MESHX_GPIO_MODE_OPEN_DRAIN, "OPEN_DRAIN", true, true, true},
94 {MESHX_GPIO_MODE_OPEN_DRAIN_INPUT_OUTPUT, "OPEN_DRAIN_INPUT_OUTPUT", true, true, true},
95 {MESHX_GPIO_MODE_PWM_OUTPUT, "PWM_OUTPUT", true, true, false}, // Toggle may not be valid for PWM
96 };
97
98 for (size_t i = 0; i < sizeof(test_cases) / sizeof(test_cases[0]); i++) {
99 uint8_t test_pin = i; // Use different pin for each test case
100
101 // Configure pin with test mode
102 test_state.pin_modes[test_pin] = test_cases[i].mode;
103 test_state.pin_initialized[test_pin] = true;
104 meshx_gpio_test_set_pin_mode(test_pin, test_cases[i].mode);
105
106 MESHX_LOGD(MODULE_ID_COMMON, "Testing mode %s on pin %u",
107 test_cases[i].mode_name, test_pin);
108
109 // Test set_level operation
110 meshx_err_t set_result = meshx_gpio_set_level(test_pin, 1);
111 if (test_cases[i].should_set_succeed) {
112 if (set_result != MESHX_SUCCESS) {
114 "FAIL: set_level should succeed for %s mode, got error: %d",
115 test_cases[i].mode_name, set_result);
116 return MESHX_FAIL;
117 }
118 } else {
119 if (set_result != MESHX_ERR_GPIO_INVALID_MODE) {
121 "FAIL: set_level should fail with MESHX_ERR_GPIO_INVALID_MODE for %s mode, got: %d",
122 test_cases[i].mode_name, set_result);
123 return MESHX_FAIL;
124 }
125 }
126
127 // Test get_level operation
128 uint8_t level;
129 meshx_err_t get_result = meshx_gpio_get_level(test_pin, &level);
130 if (test_cases[i].should_get_succeed) {
131 if (get_result != MESHX_SUCCESS) {
133 "FAIL: get_level should succeed for %s mode, got error: %d",
134 test_cases[i].mode_name, get_result);
135 return MESHX_FAIL;
136 }
137 } else {
138 if (get_result != MESHX_ERR_GPIO_INVALID_MODE) {
140 "FAIL: get_level should fail with MESHX_ERR_GPIO_INVALID_MODE for %s mode, got: %d",
141 test_cases[i].mode_name, get_result);
142 return MESHX_FAIL;
143 }
144 }
145
146 // Test toggle operation
147 meshx_err_t toggle_result = meshx_gpio_toggle(test_pin);
148 if (test_cases[i].should_toggle_succeed) {
149 if (toggle_result != MESHX_SUCCESS) {
151 "FAIL: toggle should succeed for %s mode, got error: %d",
152 test_cases[i].mode_name, toggle_result);
153 return MESHX_FAIL;
154 }
155 } else {
156 if (toggle_result != MESHX_ERR_GPIO_INVALID_MODE) {
158 "FAIL: toggle should fail with MESHX_ERR_GPIO_INVALID_MODE for %s mode, got: %d",
159 test_cases[i].mode_name, toggle_result);
160 return MESHX_FAIL;
161 }
162 }
163 }
164
165 MESHX_LOGD(MODULE_ID_COMMON, "PASS: Property 2.1 - Mode-specific operation validity");
166 return MESHX_SUCCESS;
167}
meshx_err_t meshx_gpio_get_level(uint8_t logical_pin, uint8_t *level)
Get GPIO pin level.
Definition meshx_gpio.c:392
meshx_err_t meshx_gpio_toggle(uint8_t logical_pin)
Toggle GPIO pin level.
Definition meshx_gpio.c:453
meshx_gpio_mode_t
GPIO Pin Modes.
Definition meshx_gpio.h:28
@ MESHX_GPIO_MODE_INPUT_OUTPUT
Definition meshx_gpio.h:31
@ MESHX_GPIO_MODE_OPEN_DRAIN_INPUT_OUTPUT
Definition meshx_gpio.h:33
@ MESHX_GPIO_MODE_PWM_OUTPUT
Definition meshx_gpio.h:34
@ MESHX_GPIO_MODE_OPEN_DRAIN
Definition meshx_gpio.h:32

◆ test_property_operation_isolation()

meshx_err_t test_property_operation_isolation ( void )
static

Property 2.3: Operation isolation (no effect on other pins).

Tests that operations on one pin do not affect the state of other GPIO pins.

234{
235 MESHX_LOGD(MODULE_ID_COMMON, "Testing Property 2.3: Operation isolation");
236
237 // Configure multiple pins with different initial states
238 const uint8_t pins[] = {20, 21, 22, 23};
239 const uint8_t initial_levels[] = {0, 1, 0, 1};
240
241 for (size_t i = 0; i < sizeof(pins) / sizeof(pins[0]); i++) {
242 test_state.pin_modes[pins[i]] = MESHX_GPIO_MODE_OUTPUT;
243 test_state.pin_initialized[pins[i]] = true;
244 test_state.pin_levels[pins[i]] = initial_levels[i];
246 }
247
248 // Record initial states
249 uint8_t initial_states[sizeof(pins) / sizeof(pins[0])];
250 memcpy(initial_states, test_state.pin_levels + pins[0], sizeof(initial_states));
251
252 // Perform operation on first pin
253 uint8_t target_pin = pins[0];
254 uint8_t new_level = !test_state.pin_levels[target_pin]; // Toggle level
255
256 meshx_err_t result = meshx_gpio_set_level(target_pin, new_level);
257 if (result != MESHX_SUCCESS) {
258 MESHX_LOGE(MODULE_ID_COMMON, "FAIL: Failed to set level on pin %u: %d", target_pin, result);
259 return MESHX_FAIL;
260 }
261
262 // Update test state
263 test_state.pin_levels[target_pin] = new_level;
264
265 // Verify other pins remain unchanged
266 for (size_t i = 1; i < sizeof(pins) / sizeof(pins[0]); i++) {
267 if (test_state.pin_levels[pins[i]] != initial_states[i]) {
269 "FAIL: Operation on pin %u affected pin %u (changed from %u to %u)",
270 target_pin, pins[i], initial_states[i], test_state.pin_levels[pins[i]]);
271 return MESHX_FAIL;
272 }
273 }
274
275 MESHX_LOGD(MODULE_ID_COMMON, "PASS: Property 2.3 - Operation isolation");
276 return MESHX_SUCCESS;
277}

◆ test_property_state_tracking()

meshx_err_t test_property_state_tracking ( void )
static

Property 2.4: Consistent pin state tracking.

Tests that pin state is tracked consistently for runtime validation.

285{
286 MESHX_LOGD(MODULE_ID_COMMON, "Testing Property 2.4: Consistent pin state tracking");
287
288 uint8_t test_pin = 30;
289 test_state.pin_modes[test_pin] = MESHX_GPIO_MODE_OUTPUT;
290 test_state.pin_initialized[test_pin] = true;
291 test_state.pin_levels[test_pin] = 0;
293
294 // Perform series of operations and verify state consistency
295 const struct {
296 uint8_t set_level;
297 uint8_t expected_level;
298 const char* description;
299 } operations[] = {
300 {1, 1, "Set to high"},
301 {0, 0, "Set to low"},
302 {1, 1, "Set to high again"},
303 {0, 0, "Set to low again"},
304 };
305
306 for (size_t i = 0; i < sizeof(operations) / sizeof(operations[0]); i++) {
307 // Set level
308 meshx_err_t result = meshx_gpio_set_level(test_pin, operations[i].set_level);
309 if (result != MESHX_SUCCESS) {
310 MESHX_LOGE(MODULE_ID_COMMON, "FAIL: Failed to %s: %d",
311 operations[i].description, result);
312 return MESHX_FAIL;
313 }
314
315 // Update test state
316 test_state.pin_levels[test_pin] = operations[i].set_level;
317
318 // Get level and verify
319 uint8_t read_level;
320 result = meshx_gpio_get_level(test_pin, &read_level);
321 if (result != MESHX_SUCCESS) {
322 MESHX_LOGE(MODULE_ID_COMMON, "FAIL: Failed to get level after %s: %d",
323 operations[i].description, result);
324 return MESHX_FAIL;
325 }
326
327 if (read_level != operations[i].expected_level) {
329 "FAIL: State inconsistency after %s: expected %u, got %u",
330 operations[i].description, operations[i].expected_level, read_level);
331 return MESHX_FAIL;
332 }
333
334 // Verify test state matches
335 if (test_state.pin_levels[test_pin] != read_level) {
337 "FAIL: Test state mismatch after %s: test_state=%u, read_level=%u",
338 operations[i].description, test_state.pin_levels[test_pin], read_level);
339 return MESHX_FAIL;
340 }
341 }
342
343 // Test toggle operation state tracking
344 test_state.pin_levels[test_pin] = 0;
345 meshx_err_t result = meshx_gpio_set_level(test_pin, 0); // Ensure known state
346 if (result != MESHX_SUCCESS) return result;
347
348 result = meshx_gpio_toggle(test_pin);
349 if (result != MESHX_SUCCESS) {
350 MESHX_LOGE(MODULE_ID_COMMON, "FAIL: Toggle failed: %d", result);
351 return MESHX_FAIL;
352 }
353
354 uint8_t read_level;
355 result = meshx_gpio_get_level(test_pin, &read_level);
356 if (result != MESHX_SUCCESS) return result;
357
358 if (read_level != 1) {
360 "FAIL: Toggle state tracking failed: expected 1, got %u", read_level);
361 return MESHX_FAIL;
362 }
363
364 MESHX_LOGD(MODULE_ID_COMMON, "PASS: Property 2.4 - Consistent pin state tracking");
365 return MESHX_SUCCESS;
366}

Variable Documentation

◆ test_state

gpio_test_state_t test_state
static