#pragma once #include #include #include #include #include class TpagerKeyboard final : public tt::hal::keyboard::KeyboardDevice { lv_indev_t* _Nullable kbHandle = nullptr; gpio_num_t backlightPin = GPIO_NUM_NC; ledc_timer_t backlightTimer; ledc_channel_t backlightChannel; bool backlightOkay = false; int backlightImpulseDuty = 0; QueueHandle_t queue; std::shared_ptr keypad; std::unique_ptr inputTimer; std::unique_ptr backlightImpulseTimer; bool initBacklight(gpio_num_t pin, uint32_t frequencyHz, ledc_timer_t timer, ledc_channel_t channel); void processKeyboard(); void processBacklightImpulse(); static void readCallback(lv_indev_t* indev, lv_indev_data_t* data); public: TpagerKeyboard(const std::shared_ptr& tca) : keypad(tca) { queue = xQueueCreate(20, sizeof(char)); } ~TpagerKeyboard() { vQueueDelete(queue); } std::string getName() const override { return "T-Lora Pager Keyboard"; } std::string getDescription() const override { return "T-Lora Pager I2C keyboard with encoder"; } bool startLvgl(lv_display_t* display) override; bool stopLvgl() override; bool isAttached() const override; lv_indev_t* _Nullable getLvglIndev() override { return kbHandle; } bool setBacklightDuty(uint8_t duty); void makeBacklightImpulse(); };