10#ifndef M5_UNIT_KEYBOARD_UNIT_KEYBOARD_HPP
11#define M5_UNIT_KEYBOARD_UNIT_KEYBOARD_HPP
13#include <M5UnitComponent.hpp>
70class UnitKeyboard :
public Component {
71 M5_UNIT_COMPONENT_HPP_BUILDER(UnitKeyboard, 0x00);
75 explicit UnitKeyboard(
const uint8_t addr = DEFAULT_ADDRESS) : Component(addr)
77 auto ccfg = component_config();
78 ccfg.clock = 100 * 1000U;
79 component_config(ccfg);
81 virtual ~UnitKeyboard()
86 virtual bool begin()
override;
88 virtual void update(
const bool force =
false)
override;
108 return updated() ? _released_key : 0;
112 uint8_t _released_key{};
120class UnitKeyboardBitwise :
public UnitKeyboard,
public PeriodicMeasurementAdapter<UnitKeyboardBitwise, uint8_t> {
121 M5_UNIT_COMPONENT_HPP_BUILDER(UnitKeyboardBitwise, 0x00);
124 explicit UnitKeyboardBitwise(
const uint8_t addr = DEFAULT_ADDRESS)
125 : UnitKeyboard(addr), _data{new
m5::container::CircularBuffer<uint8_t>(1)}
128 virtual ~UnitKeyboardBitwise()
133 virtual void update(
const bool force =
false)
override;
144 return (_mode == keyboard::Mode::M5UnitUnified) ?
pressed() :
released();
152 return !empty() ? oldest() : 0x00;
174 return PeriodicMeasurementAdapter<UnitKeyboardBitwise, uint8_t>::startPeriodicMeasurement(interval);
179 return PeriodicMeasurementAdapter<UnitKeyboardBitwise, uint8_t>::startPeriodicMeasurement();
187 return PeriodicMeasurementAdapter<UnitKeyboardBitwise, uint8_t>::stopPeriodicMeasurement();
233 return modifier_bits();
244 return modifier_bits() != 0;
249 return modifier_bits() & keyboard::MODIFIER_SHIFT_BIT;
254 return modifier_bits() & keyboard::MODIFIER_SYMBOL_BIT;
259 return modifier_bits() & keyboard::MODIFIER_FUNCTION_BIT;
264 return modifier_bits() & keyboard::MODIFIER_ALT_BIT;
269 return modifier_bits() & keyboard::MODIFIER_CONTROL_BIT;
274 return modifier_bits() & keyboard::MODIFIER_OPTION_BIT;
280 return modifier_bits() == keyboard::MODIFIER_SHIFT_BIT;
285 return modifier_bits() == keyboard::MODIFIER_SYMBOL_BIT;
290 return modifier_bits() == keyboard::MODIFIER_FUNCTION_BIT;
295 return modifier_bits() == keyboard::MODIFIER_ALT_BIT;
300 return modifier_bits() == keyboard::MODIFIER_CONTROL_BIT;
305 return modifier_bits() == keyboard::MODIFIER_OPTION_BIT;
360 return _now & (1ULL << kidx);
378 return _wasPressed & (1ULL << kidx);
387 return _wasReleased & (1ULL << kidx);
396 return _holding & (1ULL << kidx);
405 return _wasHold & (1ULL << kidx);
414 return _repeating & (1ULL << kidx);
443 return kidx != 0xFF &&
isPressed(kidx) && permitted_mode(to_mode_bits(ch));
462 return kidx != 0xFF &&
wasPressed(kidx) && permitted_mode(to_mode_bits(ch));
472 return kidx != 0xFF &&
wasReleased(kidx) && permitted_mode(to_mode_bits(ch));
482 return kidx != 0xFF &&
isHolding(kidx) && permitted_mode(to_mode_bits(ch));
492 return kidx != 0xFF &&
wasHold(kidx) && permitted_mode(to_mode_bits(ch));
502 return kidx != 0xFF &&
isRepeating(kidx) && permitted_mode(to_mode_bits(ch));
517 return _firmware_version;
533 return _holding_threshold;
538 return _repeating_threshold;
544 _holding_threshold = ms;
550 _repeating_threshold = ms;
573 bool start_periodic_measurement();
574 bool start_periodic_measurement(
const uint32_t interval);
575 bool stop_periodic_measurement();
577 bool update_new_firmware(
const types::elapsed_time_t at);
578 void push_back(m5::container::CircularBuffer<uint8_t>* container,
const uint8_t kidx,
const uint8_t alt);
582 return keyboard::modifier_bits(_now);
585 inline virtual uint8_t to_mode_bits(
const char)
const
590 inline virtual uint8_t scan_reg_addr()
const
594 inline virtual uint8_t mode_reg_addr()
const
598 inline virtual uint8_t firmware_version_reg_addr()
const
603 bool permitted_mode(
const uint8_t mbits)
const
605 uint8_t mod8 = _now >> 56;
607 return mbits & (mod8 ? (mod8 << 1) : 0x01);
610 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitKeyboardBitwise, uint8_t);
613 std::unique_ptr<m5::container::CircularBuffer<uint8_t>> _data{};
614 keyboard::key_status_bits_t _now{}, _prev{}, _wasPressed{}, _wasReleased{}, _wasHold{}, _holding{},
616 std::vector<types::elapsed_time_t> _repeat_start_at{}, _hold_start_at{};
617 uint32_t _repeating_threshold{400}, _holding_threshold{800};
618 uint8_t _firmware_version{};
619 keyboard::Mode _mode{keyboard::Mode::Conventional};
624constexpr uint8_t CMD_SCAN_REG{0x10};
625constexpr uint8_t CMD_MODE_REG{0x20};
626constexpr uint8_t CMD_FIRMWARE_VERSION_REG{0xFE};
bool isFunction() const
Is the function key pressed?
Definition unit_Keyboard.hpp:257
bool wasHold(const char ch) const
Was the specified character hold?
Definition unit_Keyboard.hpp:489
bool isOption() const
Is the option key pressed?
Definition unit_Keyboard.hpp:272
bool isControlEqual() const
Is only control pressed among the modifier keys?
Definition unit_Keyboard.hpp:298
keyboard::key_status_bits_t modifierBits() const
Get the bits of the modifier key being pressed.
Definition unit_Keyboard.hpp:231
keyboard::key_status_bits_t nowBits() const
Get the bits of the key being pressed.
Definition unit_Keyboard.hpp:196
bool isModifier() const
Is any modifier keys pressed?
Definition unit_Keyboard.hpp:242
uint32_t repeatingThreshold() const
Gets the repeating threshold (ms)
Definition unit_Keyboard.hpp:536
virtual void update(const bool force=false) override
Definition unit_Keyboard.cpp:63
bool isAlt() const
Is the alt key pressed?
Definition unit_Keyboard.hpp:262
bool startPeriodicMeasurement(const uint32_t interval)
Start periodic measurement.
Definition unit_Keyboard.hpp:172
bool isOptionEqual() const
Is only option pressed among the modifier keys?
Definition unit_Keyboard.hpp:303
bool isSymbol() const
Is the symbol key pressed?
Definition unit_Keyboard.hpp:252
bool wasReleased(const keyboard::key_index_t kidx) const
Was the specified key released?
Definition unit_Keyboard.hpp:385
bool isRepeating(const char ch) const
Is the specified character repeating?
Definition unit_Keyboard.hpp:499
bool isReleased(const keyboard::key_index_t kidx) const
Is the specified key released?
Definition unit_Keyboard.hpp:367
bool wasHold() const
Was any key hold?
Definition unit_Keyboard.hpp:338
bool isHolding() const
Is any key holding?
Definition unit_Keyboard.hpp:333
void setRepeatingThreshold(const uint32_t ms)
Sets the repeating threshold.
Definition unit_Keyboard.hpp:548
bool isReleased(const char ch) const
Is the specified character released?
Definition unit_Keyboard.hpp:450
bool isPressed(const keyboard::key_index_t kidx) const
Is the specified key pressed?
Definition unit_Keyboard.hpp:358
bool wasReleased() const
Was any key released?
Definition unit_Keyboard.hpp:328
bool isRepeating(const keyboard::key_index_t kidx) const
Is the specified key repeating?
Definition unit_Keyboard.hpp:412
bool isHolding(const keyboard::key_index_t kidx) const
Is the specified key holding?
Definition unit_Keyboard.hpp:394
bool isSymbolEqual() const
Is only symbol pressed among the modifier keys?
Definition unit_Keyboard.hpp:283
uint32_t holdingThreshold() const
Gets the holding threshold (ms)
Definition unit_Keyboard.hpp:531
keyboard::key_status_bits_t wasHoldBits() const
Get the bits of the key at the moment of hold.
Definition unit_Keyboard.hpp:221
bool wasReleased(const char ch) const
Was the specified character released?
Definition unit_Keyboard.hpp:469
bool isRepeating() const
Is any key repeating?
Definition unit_Keyboard.hpp:343
keyboard::key_status_bits_t repeatingBits() const
Get the bits of the key that the software is repeatedly pressing.
Definition unit_Keyboard.hpp:226
bool isFunctionEqual() const
Is only function pressed among the modifier keys?
Definition unit_Keyboard.hpp:288
keyboard::key_status_bits_t releasedBits() const
Get the key bits at the moment they are released.
Definition unit_Keyboard.hpp:211
bool isHolding(const char ch) const
Is the specified character holding?
Definition unit_Keyboard.hpp:479
bool wasPressed(const char ch) const
Was the specified character pressed?
Definition unit_Keyboard.hpp:459
bool isShiftEqual() const
Is only shift pressed among the modifier keys?
Definition unit_Keyboard.hpp:278
keyboard::key_status_bits_t holdingBits() const
Get the bits of the held key.
Definition unit_Keyboard.hpp:216
bool isPressed() const
Is any key press?
Definition unit_Keyboard.hpp:313
keyboard::key_status_bits_t pressedBits() const
Get the key bits at the moment they are pressed.
Definition unit_Keyboard.hpp:206
keyboard::key_status_bits_t previousBits() const
Get the bits of the previous key pressed.
Definition unit_Keyboard.hpp:201
void setHoldingThreshold(const uint32_t ms)
Sets the holding threshold.
Definition unit_Keyboard.hpp:542
bool startPeriodicMeasurement()
Start periodic measurement using current settings.
Definition unit_Keyboard.hpp:177
bool isShift() const
Is the shift key pressed?
Definition unit_Keyboard.hpp:247
virtual uint8_t released() const override
Get the oldest released key.
Definition unit_Keyboard.hpp:158
virtual keyboard::key_index_t toKeyIndex(const char) const
Obtains the key index corresponding to the specified character.
Definition unit_Keyboard.hpp:431
virtual bool readMode(keyboard::Mode &mode)
Read the mode.
Definition unit_Keyboard.cpp:102
virtual bool readFirmwareVersion(uint8_t &ver)
Read the firmware version.
Definition unit_Keyboard.cpp:96
bool isReleased() const
Is all key release?
Definition unit_Keyboard.hpp:318
uint8_t pressed() const
Get the oldest pressed key.
Definition unit_Keyboard.hpp:150
bool wasPressed(const keyboard::key_index_t kidx) const
Was the specified key pressed?
Definition unit_Keyboard.hpp:376
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_Keyboard.hpp:185
virtual bool writeMode(const keyboard::Mode mode)
Write the mode.
Definition unit_Keyboard.cpp:113
uint8_t firmwareVersion() const
Gets the firmware version.
Definition unit_Keyboard.hpp:515
bool wasPressed() const
Was any key pressed?
Definition unit_Keyboard.hpp:323
bool isAltEqual() const
Is only alt pressed among the modifier keys?
Definition unit_Keyboard.hpp:293
bool isPressed(const char ch) const
Is the specified character pressed?
Definition unit_Keyboard.hpp:440
bool wasHold(const keyboard::key_index_t kidx) const
Was the specified key hold?
Definition unit_Keyboard.hpp:403
virtual char getchar() const override
Gets the input character.
Definition unit_Keyboard.hpp:142
bool isControl() const
Is the control key pressed?
Definition unit_Keyboard.hpp:267
virtual char getchar() const
Gets the input character.
Definition unit_Keyboard.hpp:96
virtual uint8_t released() const
Gets the released key character code if updated.
Definition unit_Keyboard.hpp:106
virtual bool begin() override
Definition unit_Keyboard.cpp:26
virtual void update(const bool force=false) override
Definition unit_Keyboard.cpp:44
Top level namespace of M5stack.
uint8_t key_index_t
Key index (Not character)
Definition unit_Keyboard.hpp:24
Mode
Operation mode for M5Unit-KEYBOARD firmware.
Definition unit_Keyboard.hpp:50
constexpr key_status_bits_t MODIFIER_ALT_BIT
Alt.
Definition unit_Keyboard.hpp:33
constexpr key_status_bits_t MODIFIER_SYMBOL_BIT
Symbol.
Definition unit_Keyboard.hpp:31
uint64_t key_status_bits_t
key state bits [56...63]:modifier, bits [0...55]:key bits
Definition unit_Keyboard.hpp:26
constexpr key_status_bits_t MODIFIER_CONTROL_BIT
Control.
Definition unit_Keyboard.hpp:34
constexpr key_status_bits_t MODIFIER_FUNCTION_BIT
Function.
Definition unit_Keyboard.hpp:32
constexpr key_status_bits_t modifier_bits(const key_status_bits_t kbs)
Gets the modifier bits from key_status_bits_t.
Definition unit_Keyboard.hpp:40
constexpr key_status_bits_t MODIFIER_SHIFT_BIT
Shift.
Definition unit_Keyboard.hpp:30
constexpr key_status_bits_t MODIFIER_OPTION_BIT
Option.
Definition unit_Keyboard.hpp:35