GCC Code Coverage Report


Directory: ./
File: components/parking_system/include/gates/EntryGateController.h
Date: 2025-12-16 19:41:02
Exec Total Coverage
Lines: 4 4 100.0%
Functions: 2 2 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 #pragma once
2
3 #include "IEventBus.h"
4 #include "IGpioInput.h"
5 #include "IGate.h"
6 #include "ITicketService.h"
7 #include "freertos/FreeRTOS.h"
8 #include "freertos/timers.h"
9 #include <memory>
10
11 /**
12 * @brief Entry gate state machine states
13 */
14 enum class EntryGateState {
15 Idle,
16 CheckingCapacity,
17 IssuingTicket,
18 OpeningBarrier,
19 WaitingForCar,
20 CarPassing,
21 WaitingBeforeClose,
22 ClosingBarrier
23 };
24
25 /**
26 * @brief Entry gate controller with state machine
27 *
28 * Handles entry sequence:
29 * 1. Button press triggers capacity check
30 * 2. Issue ticket if capacity available
31 * 3. Open barrier via IGate interface
32 * 4. Wait for car to pass through
33 * 5. Close barrier via IGate interface
34 *
35 * Uses pure Dependency Injection - all dependencies are injected via constructor.
36 */
37 class EntryGateController {
38 public:
39 /**
40 * @brief Construct entry gate controller with injected dependencies
41 * @param eventBus Event bus for publishing/subscribing
42 * @param button Entry button input
43 * @param gate Gate abstraction (barrier + light barrier)
44 * @param ticketService Ticket service
45 * @param barrierTimeoutMs Barrier open/close timeout in ms
46 */
47 EntryGateController(
48 IEventBus& eventBus,
49 IGpioInput& button,
50 IGate& gate,
51 ITicketService& ticketService,
52 uint32_t barrierTimeoutMs = 2000);
53
54 ~EntryGateController();
55
56 // Prevent copying
57 EntryGateController(const EntryGateController&) = delete;
58 EntryGateController& operator=(const EntryGateController&) = delete;
59
60 /**
61 * @brief Get current state
62 */
63 17 [[nodiscard]] EntryGateState getState() const { return m_state; }
64
65 /**
66 * @brief Get state as string
67 */
68 [[nodiscard]] const char* getStateString() const;
69
70 /**
71 * @brief Get gate reference (for debugging/console commands)
72 */
73 [[nodiscard]] IGate& getGate() { return *m_gate; }
74
75 /**
76 * @brief Get button reference (for debugging/console commands)
77 */
78 [[nodiscard]] IGpioInput& getButton() { return *m_button; }
79
80 /**
81 * @brief Setup GPIO interrupts
82 * Call this after construction to enable hardware interrupts
83 */
84 void setupGpioInterrupts();
85
86 /**
87 * @brief Reset controller to initial state
88 * Stops timers, resets state to Idle, clears current ticket, closes barrier
89 */
90 void reset();
91
92 #ifdef UNIT_TEST
93 // Test helpers to simulate timer expirations without FreeRTOS timers
94 5 void TEST_forceBarrierTimeout() {
95 5 onBarrierTimeout();
96 5 }
97 #endif
98
99 private:
100 void onButtonPressed(const Event& event);
101 void onLightBarrierBlocked(const Event& event);
102 void onLightBarrierCleared(const Event& event);
103 void onBarrierTimeout();
104
105 void setState(EntryGateState newState);
106 void startBarrierTimer();
107 void stopBarrierTimer();
108
109 static void barrierTimerCallback(TimerHandle_t xTimer);
110
111 IEventBus& m_eventBus;
112 IGpioInput* m_button;
113 IGate* m_gate;
114 ITicketService& m_ticketService;
115
116 EntryGateState m_state;
117 uint32_t m_barrierTimeoutMs;
118 uint32_t m_currentTicketId;
119 TimerHandle_t m_barrierTimer;
120 };
121