OpenSourceSimWheelESP32
Open-source wireless steering wheel/button box for ESP32 boards
Loading...
Searching...
No Matches
SimWheelUI.hpp
Go to the documentation of this file.
1
12#pragma once
13
14//-------------------------------------------------------------------
15// Imports
16//-------------------------------------------------------------------
17
18#include "OutputHardware.hpp"
19#include <memory> // For std::unique_ptr
20
21//-------------------------------------------------------------------
22// Auxiliary types
23//-------------------------------------------------------------------
24
29enum class RevLightsMode : uint8_t
30{
36 IN_OUT,
38 OUT_IN
39};
40
41//-----------------------------------------------------------------------------
42// Single Color-Single LED user interface
43//-----------------------------------------------------------------------------
44
50{
51public:
59
60 virtual void onStart() override;
61 virtual void onConnected() override;
62 virtual void onTelemetryData(const TelemetryData *pTelemetryData) override;
63 virtual void serveSingleFrame(uint32_t elapsedMs) override;
64 virtual void shutdown() override;
65 virtual uint8_t getMaxFPS() override { return 60; }
66 virtual uint16_t getStackSize() override { return 1024; }
67
68private:
69 SingleLED *led;
70 uint8_t ledMode;
71 uint32_t blinkTimer;
72 void setMode(uint8_t newMode);
73};
74
75//-----------------------------------------------------------------------------
76// PCF8574-driven rev lights
77//-----------------------------------------------------------------------------
78
84{
85public:
97 uint8_t hardwareAddress,
98 I2CBus bus = I2CBus::SECONDARY,
99 uint8_t factoryAddress = 0b0100000,
102
103 virtual void onStart() override;
104 virtual void onConnected() override;
105 virtual void onTelemetryData(const TelemetryData *pTelemetryData) override;
106 virtual void serveSingleFrame(uint32_t elapsedMs) override;
107 virtual void onBitePoint(uint8_t bitePoint) override;
108 virtual void onLowBattery() override;
109 virtual void onSaveSettings() override;
110 virtual void shutdown() override;
111 virtual uint8_t getMaxFPS() override { return 40; }
112 virtual uint16_t getStackSize() override { return 2048; }
113
114private:
115 PCF8574LedDriver *driver;
116 uint8_t litCount, lastBitePoint;
117 uint32_t timer;
118 bool displayBitePoint;
119 bool blink;
120 bool blinkState;
121 RevLightsMode displayMode;
122}; // class PCF8574RevLights
123
124//-----------------------------------------------------------------------------
125// OLED UI 128x64
126//-----------------------------------------------------------------------------
127
132enum class OledDashboard : uint8_t
133{
135 STANDARD = 0,
137 ALTERNATE,
140 BATTERY,
142 TIRE_TEMP,
147};
148
154{
155private:
157 struct Implementation; // https://cpppatterns.com/patterns/pimpl.html
159 ::std::unique_ptr<Implementation> _impl;
161 OLED _display;
163 bool _enableFlashing{true};
164
169 void init(InputNumber nextDash, OledDashboard initialDashboard);
170
173 inline void draw_battery_level();
174
177 inline void draw_main_dashboard(const TelemetryData *pTelemetryData);
178
181 void draw_alt_dashboard(const TelemetryData *pTelemetryData);
182
185 void draw_tire_temp_dashboard(const TelemetryData *pTelemetryData);
186
189 void draw_tire_pressure_dashboard(const TelemetryData *pTelemetryData);
190
192 void stopFlashing();
193
195 void clearFrameBuffer();
196
197public:
211 const OLEDParameters &params,
212 I2CBus bus = I2CBus::SECONDARY,
213 bool enableFlashing = true,
214 OledDashboard initialDashboard = OledDashboard::_DEFAULT,
216
231 const OLEDParameters &params,
232 uint8_t address7bits,
233 I2CBus bus = I2CBus::SECONDARY,
234 bool enableFlashing = true,
235 OledDashboard initialDashboard = OledDashboard::_DEFAULT,
237
238 virtual void onStart() override;
239 virtual void onConnected() override;
240 virtual void onBLEdiscovering() override;
241 virtual void onTelemetryData(const TelemetryData *pTelemetryData) override;
242 virtual void serveSingleFrame(uint32_t elapsedMs) override;
243 virtual void onBitePoint(uint8_t bitePoint) override;
244 virtual void onLowBattery() override;
245 virtual void onSaveSettings() override;
246 virtual void onUserInput(uint8_t inputNumber) override;
247 virtual void shutdown() override;
248 virtual uint8_t getMaxFPS() override { return 30; }
249 virtual uint16_t getStackSize() override { return 2560; }
250}; // class OledTelemetry128x64
Output hardware classes.
@ VALUE
Unspecified value.
I2CBus
I2C bus controller.
RevLightsMode
Display modes for "rev lights".
@ RIGHT_TO_LEFT
Moving from right to left.
@ IN_OUT
Moving from center to edges.
@ LEFT_TO_RIGHT
Moving from left to right.
@ OUT_IN
Moving from edges to center.
OledDashboard
Available dashboards for monochrome OLED displays.
@ ALTERNATE
RPM, speed, gear, ABS, TC, brake balance, fuel, pit limiter.
@ BATTERY
Current battery level (available only in battery-operated firmwares)
@ STANDARD
RPM bar, gear, TC, ABS, Low fuel, Pit limiter.
@ _DEFAULT
Default dashboard.
@ TIRE_PRESSURE
Tire pressure/wear dashboard.
@ TIRE_TEMP
Tire/brake temperature dashboard.
Abstract interface for notifications and telemetry display.
Telemetry display via 128x64 monochrome OLED.
virtual void shutdown() override
Cut power to the UI hardware.
virtual void onBitePoint(uint8_t bitePoint) override
Notify a change in the current bite point.
virtual void onConnected() override
Notify device is connected.
virtual void onSaveSettings() override
Notify that user settings have been saved to flash memory.
virtual uint16_t getStackSize() override
Get the stack size required by this user interface.
virtual void onUserInput(uint8_t inputNumber) override
Notify user input.
OledTelemetry128x64(const OLEDParameters &params, uint8_t address7bits, I2CBus bus=I2CBus::SECONDARY, bool enableFlashing=true, OledDashboard initialDashboard=OledDashboard::_DEFAULT, InputNumber nextDash=UNSPECIFIED::VALUE)
Create an Oled Telemetry display (128x64)
virtual void onStart() override
Called just once after initialization.
virtual uint8_t getMaxFPS() override
Get the maximum FPS supported by the underlying hardware.
OledTelemetry128x64(const OLEDParameters &params, I2CBus bus=I2CBus::SECONDARY, bool enableFlashing=true, OledDashboard initialDashboard=OledDashboard::_DEFAULT, InputNumber nextDash=UNSPECIFIED::VALUE)
Create an Oled Telemetry display (128x64)
virtual void onTelemetryData(const TelemetryData *pTelemetryData) override
Notify new telemetry data.
virtual void onBLEdiscovering() override
Notify device is in discovery mode.
virtual void serveSingleFrame(uint32_t elapsedMs) override
Draw a single frame.
virtual void onLowBattery() override
Notify low battery.
8-LED driver based on the PCF8574 GPIO expander
Use eight single-color LEDS as "rev lights".
virtual uint16_t getStackSize() override
Get the stack size required by this user interface.
virtual void onBitePoint(uint8_t bitePoint) override
Notify a change in the current bite point.
virtual void shutdown() override
Cut power to the UI hardware.
virtual void onSaveSettings() override
Notify that user settings have been saved to flash memory.
virtual uint8_t getMaxFPS() override
Get the maximum FPS supported by the underlying hardware.
virtual void onStart() override
Called just once after initialization.
virtual void onTelemetryData(const TelemetryData *pTelemetryData) override
Notify new telemetry data.
virtual void onLowBattery() override
Notify low battery.
virtual void serveSingleFrame(uint32_t elapsedMs) override
Draw a single frame.
PCF8574RevLights(uint8_t hardwareAddress, I2CBus bus=I2CBus::SECONDARY, uint8_t factoryAddress=0b0100000, RevLightsMode displayMode=RevLightsMode::LEFT_TO_RIGHT)
Create "rev lights" using PCF8574 and single-color LEDs.
virtual void onConnected() override
Notify device is connected.
Use a single-color LED as a shift light indicator.
virtual uint8_t getMaxFPS() override
Get the maximum FPS supported by the underlying hardware.
virtual void shutdown() override
Cut power to the UI hardware.
SimpleShiftLight(OutputGPIO ledPin)
Create a simple "shift" light.
virtual uint16_t getStackSize() override
Get the stack size required by this user interface.
virtual void onConnected() override
Notify device is connected.
virtual void onTelemetryData(const TelemetryData *pTelemetryData) override
Notify new telemetry data.
virtual void onStart() override
Called just once after initialization.
virtual void serveSingleFrame(uint32_t elapsedMs) override
Draw a single frame.
A simple LED driver for a single LED.
Firmware-defined input numbers in the range [0,127] or unspecified.
Monochrome OLED working parameters.
Monochrome OLED.
Output-capable GPIO pin number.
Telemetry data.