train_controller/lib/ui/TrainUi.hpp

75 lines
1.8 KiB
C++

/** \File TrainUi.hpp
* \copyright (c) 2025 len0rd
* \date 2025-02-09
*
* Menu and LCD UI/rotary encoder for train controller
*/
#ifndef __TRAINUI_H__
#define __TRAINUI_H__
#include <Arduino.h>
#include <SimpleRotary.h>
#include "AdafruitVfdDisplay.hpp"
#include "LcdMenu.h"
#include "Serial.h"
#include "input/SimpleRotaryAdapter.h"
#include "renderer/CharacterDisplayRenderer.h"
MENU_SCREEN(mainScreen,
mainItems,
ITEM_BASIC("Item Eins"),
ITEM_BASIC("Item Zwei"),
ITEM_BASIC("Item Drei"));
#define ROT_ENC_A_PIN PIN_D6
#define ROT_ENC_B_PIN PIN_D7
#define ROT_ENC_BUTTON_PIN PIN_D8
#define DISP_NUM_ROWS 2
#define DISP_NUM_COLS 16
class TrainUi {
public:
TrainUi()
: m_lcdUart{_UART2_},
m_disp(m_lcdUart),
m_renderer(&m_disp, DISP_NUM_COLS, DISP_NUM_ROWS),
m_menu(m_renderer),
m_rotEnc(ROT_ENC_A_PIN, ROT_ENC_B_PIN, ROT_ENC_BUTTON_PIN),
m_rotaryInput(&m_menu, &m_rotEnc) {}
inline void setup() {
m_lcdUart.begin(57600);
while (!m_lcdUart)
;
// m_disp.show();
// m_disp.clear();
// m_disp.drawBlinker();
m_renderer.begin();
m_menu.setScreen(mainScreen);
}
inline void loop() {
// m_disp.clear();
// // uint8_t clearCmd[] = {0xfe, 0x58, 0xfe, 0x48};
// // m_lcdUart.write_raw(clearCmd, sizeof(clearCmd));
// char toPrint[16] = {};
// snprintf(toPrint, 16, "enc: %d %d", m_rotEnc.rotate(), m_rotEnc.push());
// m_disp.draw(toPrint);
// m_lcdUart.print("howdy do");
m_rotaryInput.observe();
}
private:
UART& m_lcdUart;
AdafruitVfdDisplay m_disp;
CharacterDisplayRenderer m_renderer;
LcdMenu m_menu;
SimpleRotary m_rotEnc;
SimpleRotaryAdapter m_rotaryInput;
};
#endif /* __TRAINUI_H__ */