GCC Code Coverage Report


Directory: ../../../../components/
File: power_button/src/power_button.c
Date: 2025-10-25 23:11:18
Coverage Exec Excl Total
Lines: 42.5% 17 0 40
Functions: 50.0% 1 0 2
Branches: 35.7% 5 0 14

Line Branch Exec Source
1 /**
2 * @file power_button.c
3 * @brief Module to interface with power button keyboard
4 */
5
6 #include "power_button.h"
7 #include "rte.h"
8
9 /**
10 * @enum KeyState
11 * @brief States for the debouncing state machine.
12 */
13 typedef enum
14 {
15 INIT, /**< Initial state, waiting for debounce timers. */
16 PRESSED, /**< Key has been debounced as pressed. */
17 RELEASED /**< Key has been debounced as released. */
18 } KeyState;
19
20 static KeyState currentState = INIT; /**< Current state of the debouncing state machine. */
21 static unsigned int pressCounter = 0; /**< Counter for key presses. */
22 static unsigned int releaseCounter = 0; /**< Counter for key releases. */
23
24 void powerButtonInit(void)
25 {
26 currentState = INIT;
27 pressCounter = 0;
28 releaseCounter = 0;
29 }
30
31 /**
32 * @brief Debounces key presses and releases.
33 *
34 * This function utilizes a state machine to debounce key presses and releases.
35 * It must be called periodically to process the debouncing. The behavior is controlled
36 * by two configuration parameters: POWER_BUTTON_PRESS_DEBOUNCE and POWER_BUTTON_RELEASE_DEBOUNCE which determine
37 * how many consecutive calls with the key pressed/released are required to acknowledge the
38 * state transition.
39 */
40 10 void powerButton(void)
41 {
42 10 boolean powerKeyPressed = FALSE;
43 10 boolean keyStatus = RteIsKeyPressed(POWER_BUTTON_KEY);
44
45 // Update the counters
46
1/2
✓ Branch 3 → 4 taken 10 times.
✗ Branch 3 → 5 not taken.
10 if (keyStatus)
47 {
48 10 pressCounter++;
49 10 releaseCounter = 0; // reset release counter if key is pressed
50 }
51 else
52 {
53 releaseCounter++;
54 pressCounter = 0; // reset press counter if key is released
55 }
56
57
1/4
✓ Branch 6 → 7 taken 10 times.
✗ Branch 6 → 12 not taken.
✗ Branch 6 → 15 not taken.
✗ Branch 6 → 18 not taken.
10 switch (currentState)
58 {
59 10 case INIT:
60
2/2
✓ Branch 7 → 8 taken 1 time.
✓ Branch 7 → 9 taken 9 times.
10 if (pressCounter >= POWER_BUTTON_PRESS_DEBOUNCE)
61 {
62 1 powerKeyPressed = TRUE;
63 1 currentState = PRESSED;
64 1 releaseCounter = 0; // reset the counter after transition
65 1 pressCounter = 0; // reset the counter after transition
66 }
67
1/2
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 9 times.
9 else if (releaseCounter >= POWER_BUTTON_RELEASE_DEBOUNCE)
68 {
69 currentState = RELEASED;
70 releaseCounter = 0; // reset the counter after transition
71 pressCounter = 0; // reset the counter after transition
72 }
73 10 break;
74
75 case PRESSED:
76 if (releaseCounter >= POWER_BUTTON_RELEASE_DEBOUNCE)
77 {
78 currentState = RELEASED;
79 releaseCounter = 0; // reset the counter after transition
80 }
81 pressCounter = 0; // reset the counter after transition
82 break;
83
84 case RELEASED:
85 if (pressCounter >= POWER_BUTTON_PRESS_DEBOUNCE)
86 {
87 powerKeyPressed = TRUE;
88 currentState = PRESSED;
89 pressCounter = 0; // reset the counter after transition
90 }
91 releaseCounter = 0; // reset the counter after transition
92 break;
93 }
94
95 10 RteSetPowerKeyPressedEvent(powerKeyPressed);
96 10 }
97