diff --git a/variants/simpson/SimpsonKeypad.cpp b/variants/simpson/SimpsonKeypad.cpp index f1486ea3..470be7a9 100644 --- a/variants/simpson/SimpsonKeypad.cpp +++ b/variants/simpson/SimpsonKeypad.cpp @@ -1,70 +1,92 @@ -#include "SimpsonKeypad.h" - -#include - -namespace { -char control_keymap[19] = { - SIMPSON_KEY_CANCEL, SIMPSON_KEY_UP, 0, SIMPSON_KEY_BLUETOOTH, - SIMPSON_KEY_LEFT, SIMPSON_KEY_ENTER, SIMPSON_KEY_RIGHT, SIMPSON_KEY_BRIGHTNESS_UP, - SIMPSON_KEY_SYMBOLS, SIMPSON_KEY_DOWN, 0, SIMPSON_KEY_BRIGHTNESS_DOWN, - SIMPSON_KEY_MESSAGES, 0, SIMPSON_KEY_FN, SIMPSON_KEY_GPS, 0, 0, 0 -}; - -char alphabet_keymap[19] = { - ',', 'A', 'D', SIMPSON_KEY_BLUETOOTH, - 'G', 'J', 'M', SIMPSON_KEY_BRIGHTNESS_UP, - 'P', 'T', 'W', SIMPSON_KEY_BRIGHTNESS_DOWN, - SIMPSON_KEY_BACKSPACE, ' ', SIMPSON_KEY_FN, SIMPSON_KEY_GPS, 0, 0, 0 -}; - -char numeric_keymap[19] = { - '1', '2', '3', SIMPSON_KEY_BLUETOOTH, - '4', '5', '6', SIMPSON_KEY_BRIGHTNESS_UP, - '7', '8', '9', SIMPSON_KEY_BRIGHTNESS_DOWN, - SIMPSON_KEY_BACKSPACE, '0', SIMPSON_KEY_FN, SIMPSON_KEY_GPS, 0, 0, 0 -}; -} - -bool SimpsonKeypad::begin() { - if (!_keypad.begin()) return false; - _keypad.setKeyPadMode(I2C_KEYPAD_4x4); - _keypad.setDebounceThreshold(50); - loadModeMap(); - _ready = true; - return true; -} - -void SimpsonKeypad::loadModeMap() { - switch (_mode) { - case SIMPSON_KEYPAD_CONTROL: - _keypad.loadKeyMap(control_keymap); - break; - case SIMPSON_KEYPAD_ABC: - case SIMPSON_KEYPAD_ABC_UPPER: - _keypad.loadKeyMap(alphabet_keymap); - break; - case SIMPSON_KEYPAD_NUMERIC: - _keypad.loadKeyMap(numeric_keymap); - break; - } -} - -uint8_t SimpsonKeypad::poll() { - if (!_ready) return SIMPSON_KEY_NONE; - - uint8_t key = _keypad.getChar(); - if (key == I2C_KEYPAD_THRESHOLD) return SIMPSON_KEY_NONE; - if (key == SIMPSON_KEY_NONE) { - _last_key = SIMPSON_KEY_NONE; - return SIMPSON_KEY_NONE; - } - if (key == _last_key) return SIMPSON_KEY_NONE; - _last_key = key; - - if (key == SIMPSON_KEY_FN) { - _mode = static_cast((_mode + 1) % 4); - loadModeMap(); - return SIMPSON_KEY_MODE_CHANGED; - } - return key; -} +#include "SimpsonKeypad.h" + +static const uint32_t SIMPSON_LONG_PRESS_MS = 1200; + +#include + +namespace { +char control_keymap[19] = { + SIMPSON_KEY_CANCEL, SIMPSON_KEY_UP, 0, SIMPSON_KEY_BLUETOOTH, + SIMPSON_KEY_LEFT, SIMPSON_KEY_ENTER, SIMPSON_KEY_RIGHT, SIMPSON_KEY_BRIGHTNESS_UP, + SIMPSON_KEY_SYMBOLS, SIMPSON_KEY_DOWN, 0, SIMPSON_KEY_BRIGHTNESS_DOWN, + SIMPSON_KEY_MESSAGES, 0, SIMPSON_KEY_FN, SIMPSON_KEY_GPS, 0, 0, 0 +}; + +char alphabet_keymap[19] = { + ',', 'A', 'D', SIMPSON_KEY_BLUETOOTH, + 'G', 'J', 'M', SIMPSON_KEY_BRIGHTNESS_UP, + 'P', 'T', 'W', SIMPSON_KEY_BRIGHTNESS_DOWN, + SIMPSON_KEY_BACKSPACE, ' ', SIMPSON_KEY_FN, SIMPSON_KEY_GPS, 0, 0, 0 +}; + +char numeric_keymap[19] = { + '1', '2', '3', SIMPSON_KEY_BLUETOOTH, + '4', '5', '6', SIMPSON_KEY_BRIGHTNESS_UP, + '7', '8', '9', SIMPSON_KEY_BRIGHTNESS_DOWN, + SIMPSON_KEY_BACKSPACE, '0', SIMPSON_KEY_FN, SIMPSON_KEY_GPS, 0, 0, 0 +}; +} + +bool SimpsonKeypad::begin() { + if (!_keypad.begin()) return false; + _keypad.setKeyPadMode(I2C_KEYPAD_4x4); + _keypad.setDebounceThreshold(50); + loadModeMap(); + _ready = true; + return true; +} + +void SimpsonKeypad::loadModeMap() { + switch (_mode) { + case SIMPSON_KEYPAD_CONTROL: + _keypad.loadKeyMap(control_keymap); + break; + case SIMPSON_KEYPAD_ABC: + case SIMPSON_KEYPAD_ABC_UPPER: + _keypad.loadKeyMap(alphabet_keymap); + break; + case SIMPSON_KEYPAD_NUMERIC: + _keypad.loadKeyMap(numeric_keymap); + break; + } +} + +uint8_t SimpsonKeypad::poll() { + if (!_ready) return SIMPSON_KEY_NONE; + + uint8_t key = _keypad.getChar(); + if (key == I2C_KEYPAD_THRESHOLD) return SIMPSON_KEY_NONE; + if (key == SIMPSON_KEY_NONE) { + if (_last_key == SIMPSON_KEY_ENTER && !_enter_long_sent) { + _last_key = SIMPSON_KEY_NONE; + _enter_pressed_at = 0; + return SIMPSON_KEY_ENTER; + } + _last_key = SIMPSON_KEY_NONE; + _enter_pressed_at = 0; + _enter_long_sent = false; + return SIMPSON_KEY_NONE; + } + if (key == SIMPSON_KEY_ENTER && _last_key == SIMPSON_KEY_ENTER) { + if (!_enter_long_sent && millis() - _enter_pressed_at >= SIMPSON_LONG_PRESS_MS) { + _enter_long_sent = true; + return SIMPSON_KEY_ENTER_LONG; + } + return SIMPSON_KEY_NONE; + } + if (key == _last_key) return SIMPSON_KEY_NONE; + _last_key = key; + + if (key == SIMPSON_KEY_ENTER) { + _enter_pressed_at = millis(); + _enter_long_sent = false; + return SIMPSON_KEY_NONE; + } + + if (key == SIMPSON_KEY_FN) { + _mode = static_cast((_mode + 1) % 4); + loadModeMap(); + return SIMPSON_KEY_MODE_CHANGED; + } + return key; +} diff --git a/variants/simpson/SimpsonKeypad.h b/variants/simpson/SimpsonKeypad.h index 5fb5e2d5..63a4c52b 100644 --- a/variants/simpson/SimpsonKeypad.h +++ b/variants/simpson/SimpsonKeypad.h @@ -1,49 +1,52 @@ -#pragma once - -#include -#include - -#ifndef SIMPSON_KEYPAD_ADDR - #define SIMPSON_KEYPAD_ADDR 0x20 -#endif - -enum SimpsonKeypadMode : uint8_t { - SIMPSON_KEYPAD_CONTROL, - SIMPSON_KEYPAD_ABC, - SIMPSON_KEYPAD_ABC_UPPER, - SIMPSON_KEYPAD_NUMERIC -}; - -enum SimpsonKeypadKey : uint8_t { - SIMPSON_KEY_NONE = 0, - SIMPSON_KEY_CANCEL = 1, - SIMPSON_KEY_UP, - SIMPSON_KEY_BLUETOOTH, - SIMPSON_KEY_LEFT, - SIMPSON_KEY_ENTER, - SIMPSON_KEY_RIGHT, - SIMPSON_KEY_BRIGHTNESS_UP, - SIMPSON_KEY_SYMBOLS, - SIMPSON_KEY_DOWN, - SIMPSON_KEY_BRIGHTNESS_DOWN, - SIMPSON_KEY_MESSAGES, - SIMPSON_KEY_FN, - SIMPSON_KEY_GPS, - SIMPSON_KEY_BACKSPACE, - SIMPSON_KEY_MODE_CHANGED -}; - -class SimpsonKeypad { - I2CKeyPad _keypad; - SimpsonKeypadMode _mode = SIMPSON_KEYPAD_CONTROL; - uint8_t _last_key = SIMPSON_KEY_NONE; - bool _ready = false; - - void loadModeMap(); - -public: - SimpsonKeypad() : _keypad(SIMPSON_KEYPAD_ADDR, &Wire) {} - bool begin(); - uint8_t poll(); - SimpsonKeypadMode mode() const { return _mode; } -}; +#pragma once + +#include +#include + +#ifndef SIMPSON_KEYPAD_ADDR + #define SIMPSON_KEYPAD_ADDR 0x20 +#endif + +enum SimpsonKeypadMode : uint8_t { + SIMPSON_KEYPAD_CONTROL, + SIMPSON_KEYPAD_ABC, + SIMPSON_KEYPAD_ABC_UPPER, + SIMPSON_KEYPAD_NUMERIC +}; + +enum SimpsonKeypadKey : uint8_t { + SIMPSON_KEY_NONE = 0, + SIMPSON_KEY_CANCEL = 1, + SIMPSON_KEY_UP, + SIMPSON_KEY_BLUETOOTH, + SIMPSON_KEY_LEFT, + SIMPSON_KEY_ENTER, + SIMPSON_KEY_RIGHT, + SIMPSON_KEY_BRIGHTNESS_UP, + SIMPSON_KEY_SYMBOLS, + SIMPSON_KEY_DOWN, + SIMPSON_KEY_BRIGHTNESS_DOWN, + SIMPSON_KEY_MESSAGES, + SIMPSON_KEY_FN, + SIMPSON_KEY_GPS, + SIMPSON_KEY_BACKSPACE, + SIMPSON_KEY_MODE_CHANGED, + SIMPSON_KEY_ENTER_LONG +}; + +class SimpsonKeypad { + I2CKeyPad _keypad; + SimpsonKeypadMode _mode = SIMPSON_KEYPAD_CONTROL; + uint8_t _last_key = SIMPSON_KEY_NONE; + uint32_t _enter_pressed_at = 0; + bool _enter_long_sent = false; + bool _ready = false; + + void loadModeMap(); + +public: + SimpsonKeypad() : _keypad(SIMPSON_KEYPAD_ADDR, &Wire) {} + bool begin(); + uint8_t poll(); + SimpsonKeypadMode mode() const { return _mode; } +}; diff --git a/variants/simpson/platformio.ini b/variants/simpson/platformio.ini index 8ecd4ea1..1d1fbc9d 100644 --- a/variants/simpson/platformio.ini +++ b/variants/simpson/platformio.ini @@ -1,22 +1,23 @@ -[Simpson] -extends = Promicro -build_unflags = -D PIN_GPS_RX=3 -D PIN_GPS_TX=4 -D ENV_INCLUDE_AHTX0=1 -D ENV_INCLUDE_BME280=1 -D ENV_INCLUDE_BMP280=1 -D ENV_INCLUDE_INA3221=1 -D ENV_INCLUDE_INA219=1 -D ENV_INCLUDE_INA226=1 -build_flags = ${Promicro.build_flags} - -I variants/simpson - -D SIMPSON - -D PIN_BUZZER=0 - -D PIN_GPS_TX=3 - -D PIN_GPS_RX=4 - -D PIN_VIBRATION=1 - -D ADC_MULTIPLIER=1.71 - -D SIMPSON_KEYPAD_ADDR=0x20 - -D DISPLAY_ROTATION=2 - -D ENV_SKIP_GPS_DETECT -build_src_filter = ${nrf52_base.build_src_filter} - + - +<../variants/simpson> - +<../variants/promicro/target.cpp> - +<../variants/promicro/PromicroBoard.cpp> -lib_deps = ${Promicro.lib_deps} - adafruit/Adafruit SH110X @ ^2.1.13 - RobTillaart/I2CKeyPad @ ^0.5.2 +[Simpson] +extends = Promicro +build_unflags = -D PIN_GPS_RX=3 -D PIN_GPS_TX=4 -D ENV_INCLUDE_AHTX0=1 -D ENV_INCLUDE_BME280=1 -D ENV_INCLUDE_BMP280=1 -D ENV_INCLUDE_INA3221=1 -D ENV_INCLUDE_INA219=1 -D ENV_INCLUDE_INA226=1 +build_flags = ${Promicro.build_flags} + -I variants/simpson + -D SIMPSON + -D PIN_BUZZER=0 + -D PIN_GPS_TX=3 + -D PIN_GPS_RX=4 + -D PIN_VIBRATION=1 + -D ADC_MULTIPLIER=1.71 + -D SIMPSON_KEYPAD_ADDR=0x20 + -D DISPLAY_ROTATION=2 + -D ENV_INCLUDE_GPS=1 + -D ENV_SKIP_GPS_DETECT +build_src_filter = ${nrf52_base.build_src_filter} + + + +<../variants/simpson> + +<../variants/promicro/target.cpp> + +<../variants/promicro/PromicroBoard.cpp> +lib_deps = ${Promicro.lib_deps} + adafruit/Adafruit SH110X @ ^2.1.13 + RobTillaart/I2CKeyPad @ ^0.5.2