11#include < Arduino.h>
22#include < stddef.h>
33
4- #include " domain/Clock.h"
5- #include " domain/DataStore.h"
6- #include " domain/Trip.h"
74#include " hardware/Gnss.h"
8- #include " hardware/OLED.h"
9- #include " hardware/VoltageSensor.h"
10- #include " ui/Input.h"
11- #include " ui/Mode.h"
12- #include " ui/Renderer.h"
13-
14- constexpr int BTN_A = PIN_D09;
15- constexpr int BTN_B = PIN_D04;
16- constexpr int WARN_LED = PIN_D00;
17- constexpr int VOLTAGE_PIN = PIN_A5;
18- constexpr float LOW_VOLTAGE_THRESHOLD = 4 .5f ;
19-
20- class VoltageMonitor {
21- private:
22- VoltageSensor voltageSensor;
23-
24- public:
25- VoltageMonitor () : voltageSensor(VOLTAGE_PIN) {}
26-
27- void begin () {
28- voltageSensor.begin ();
29- pinMode (WARN_LED, OUTPUT);
30- }
31-
32- float update () {
33- const float currentVoltage = voltageSensor.readVoltage ();
34- if (currentVoltage <= LOW_VOLTAGE_THRESHOLD) digitalWrite (WARN_LED, HIGH);
35- else digitalWrite (WARN_LED, LOW);
36- return currentVoltage;
37- }
38- };
5+ #include " logic/Clock.h"
6+ #include " logic/DataStore.h"
7+ #include " logic/Trip.h"
8+ #include " logic/VoltageMonitor.h"
9+ #include " ui/UI.h"
3910
4011class DataPersistence {
4112private:
@@ -56,97 +27,37 @@ class DataPersistence {
5627 void update (bool isGnssUpdated, float currentVoltage) {
5728 if ((millis () - lastSaveMillis > DataStore::SAVE_INTERVAL_MS) && !isGnssUpdated) {
5829 AppData currentData;
59- const Trip::State &state = trip.getState ();
60- currentData.totalDistance = state.totalKm ;
61- currentData.tripDistance = state.tripDistance ;
62- currentData.movingTimeMs = state.totalMovingMs ;
63- currentData.maxSpeed = state.maxSpeed ;
64- currentData.batteryVoltage = currentVoltage;
30+ const Trip::State &state = trip.getState ();
31+ currentData.totalDistance = state.totalKm ;
32+ currentData.tripDistance = state.tripDistance ;
33+ currentData.movingTimeMs = state.totalMovingMs ;
34+ currentData.maxSpeed = state.maxSpeed ;
35+ currentData.voltage = currentVoltage;
6536
6637 dataStore.save (currentData);
6738 lastSaveMillis = millis ();
6839 }
6940 }
7041};
7142
72- class UserInterface {
73- private:
74- OLED oled;
75- Input input;
76- Mode mode;
77- Renderer renderer;
78-
79- Frame createFrame (const SpNavData &navData, const Trip &trip, const Clock &clock) const {
80- Frame frame;
81-
82- switch (navData.posFixMode ) {
83- case Fix2D:
84- strcpy (frame.header .fixStatus , " 2D" );
85- break ;
86- case Fix3D:
87- strcpy (frame.header .fixStatus , " 3D" );
88- break ;
89- default :
90- strcpy (frame.header .fixStatus , " WAIT" );
91- break ;
92- }
93-
94- mode.fillFrame (frame, trip, clock);
95-
96- return frame;
97- }
98-
99- public:
100- UserInterface () : input(BTN_A, BTN_B) {}
101-
102- void begin () {
103- oled.begin ();
104- input.begin ();
105- }
106-
107- void update (Trip &trip, DataStore &dataStore, const Clock &clock, const SpNavData &navData) {
108- Input::Event id = input.update ();
109-
110- if (id == Input::Event::RESET_LONG) {
111- oled.clear ();
112- oled.setTextSize (1 );
113- oled.setTextColor (WHITE);
114- const char *msg = " RESETTING..." ;
115- OLED::Rect rect = oled.getTextBounds (msg);
116- oled.setCursor ((oled.getWidth () - rect.w ) / 2 , (oled.getHeight () - rect.h ) / 2 );
117- oled.print (msg);
118- oled.display ();
119- delay (500 ); // Visual feedback
120-
121- oled.restart ();
122- renderer.reset ();
123- }
124-
125- if (id != Input::Event::NONE) { mode.handleInput (id, trip, dataStore); }
126-
127- Frame frame = createFrame (navData, trip, clock);
128- renderer.render (oled, frame);
129- }
130- };
131-
13243class App {
13344private:
13445 Gnss gnss;
13546 Trip trip;
13647
13748 DataStore dataStore;
13849
139- VoltageMonitor batteryMonitor ;
50+ VoltageMonitor voltageMonitor ;
14051 DataPersistence dataPersistence;
141- UserInterface userInterface;
52+ UI userInterface;
14253
14354public:
14455 App () : dataPersistence(dataStore, trip) {}
14556
14657 void begin () {
14758 gnss.begin ();
14859 trip.begin ();
149- batteryMonitor .begin ();
60+ voltageMonitor .begin ();
15061 dataPersistence.load ();
15162 userInterface.begin ();
15263 }
@@ -158,7 +69,7 @@ class App {
15869 trip.update (navData, millis (), isGnssUpdated);
15970 Clock clock (navData);
16071
161- float currentVoltage = batteryMonitor .update ();
72+ float currentVoltage = voltageMonitor .update ();
16273 dataPersistence.update (isGnssUpdated, currentVoltage);
16374 userInterface.update (trip, dataStore, clock, navData);
16475 }
0 commit comments