M5Unit-KEYBOARD 0.0.1 git rev:a483db1
Loading...
Searching...
No Matches
unit_Keyboard.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_KEYBOARD_UNIT_KEYBOARD_HPP
11#define M5_UNIT_KEYBOARD_UNIT_KEYBOARD_HPP
12
13#include <M5UnitComponent.hpp>
14#include <vector>
15
16namespace m5 {
17namespace unit {
18
23namespace keyboard {
24using key_index_t = uint8_t;
25
26using key_status_bits_t = uint64_t;
27// clang-format off
30constexpr key_status_bits_t MODIFIER_SHIFT_BIT {0x0100000000000000};
31constexpr key_status_bits_t MODIFIER_SYMBOL_BIT {0x0200000000000000};
32constexpr key_status_bits_t MODIFIER_FUNCTION_BIT{0x0400000000000000};
33constexpr key_status_bits_t MODIFIER_ALT_BIT {0x0800000000000000};
34constexpr key_status_bits_t MODIFIER_CONTROL_BIT {0x1000000000000000};
35constexpr key_status_bits_t MODIFIER_OPTION_BIT {0x2000000000000000};
37// clang-format on
38
45
50enum class Mode : uint8_t {
62};
63
64} // namespace keyboard
65
70class UnitKeyboard : public Component {
71 M5_UNIT_COMPONENT_HPP_BUILDER(UnitKeyboard, 0x00);
72
73public:
74 // 0x5F:CardKB 0x08:FacesQWERTY
75 explicit UnitKeyboard(const uint8_t addr = DEFAULT_ADDRESS) : Component(addr)
76 {
77 auto ccfg = component_config();
78 ccfg.clock = 100 * 1000U;
79 component_config(ccfg);
80 }
81 virtual ~UnitKeyboard()
82 {
83 }
84
86 virtual bool begin() override;
88 virtual void update(const bool force = false) override;
89
96 inline virtual char getchar() const
97 {
98 return released();
99 }
100
106 inline virtual uint8_t released() const
107 {
108 return updated() ? _released_key : 0;
109 }
110
111private:
112 uint8_t _released_key{}; // for old firmware
113};
114
120class UnitKeyboardBitwise : public UnitKeyboard, public PeriodicMeasurementAdapter<UnitKeyboardBitwise, uint8_t> {
121 M5_UNIT_COMPONENT_HPP_BUILDER(UnitKeyboardBitwise, 0x00);
122
123public:
124 explicit UnitKeyboardBitwise(const uint8_t addr = DEFAULT_ADDRESS)
125 : UnitKeyboard(addr), _data{new m5::container::CircularBuffer<uint8_t>(1)}
126 {
127 }
128 virtual ~UnitKeyboardBitwise()
129 {
130 }
131
133 virtual void update(const bool force = false) override;
134
137
142 inline virtual char getchar() const override
143 {
144 return (_mode == keyboard::Mode::M5UnitUnified) ? pressed() : released();
145 }
150 inline uint8_t pressed() const
151 {
152 return !empty() ? oldest() : 0x00;
153 }
158 inline virtual uint8_t released() const override
159 {
160 return (_mode == keyboard::Mode::Conventional) ? UnitKeyboard::released() : 0x00;
161 }
163
166
172 inline bool startPeriodicMeasurement(const uint32_t interval)
173 {
174 return PeriodicMeasurementAdapter<UnitKeyboardBitwise, uint8_t>::startPeriodicMeasurement(interval);
175 }
178 {
179 return PeriodicMeasurementAdapter<UnitKeyboardBitwise, uint8_t>::startPeriodicMeasurement();
180 }
186 {
187 return PeriodicMeasurementAdapter<UnitKeyboardBitwise, uint8_t>::stopPeriodicMeasurement();
188 }
190
197 {
198 return _now;
199 }
202 {
203 return _prev;
204 }
207 {
208 return _wasPressed;
209 }
212 {
213 return _wasReleased;
214 }
217 {
218 return _holding;
219 }
222 {
223 return _wasHold;
224 }
227 {
228 return _repeating;
229 }
232 {
233 return modifier_bits();
234 }
236
242 inline bool isModifier() const
243 {
244 return modifier_bits() != 0;
245 }
247 inline bool isShift() const
248 {
249 return modifier_bits() & keyboard::MODIFIER_SHIFT_BIT;
250 }
252 inline bool isSymbol() const
253 {
254 return modifier_bits() & keyboard::MODIFIER_SYMBOL_BIT;
255 }
257 inline bool isFunction() const
258 {
259 return modifier_bits() & keyboard::MODIFIER_FUNCTION_BIT;
260 }
262 inline bool isAlt() const
263 {
264 return modifier_bits() & keyboard::MODIFIER_ALT_BIT;
265 }
267 inline bool isControl() const
268 {
269 return modifier_bits() & keyboard::MODIFIER_CONTROL_BIT;
270 }
272 inline bool isOption() const
273 {
274 return modifier_bits() & keyboard::MODIFIER_OPTION_BIT;
275 }
276
278 inline bool isShiftEqual() const
279 {
280 return modifier_bits() == keyboard::MODIFIER_SHIFT_BIT;
281 }
283 inline bool isSymbolEqual() const
284 {
285 return modifier_bits() == keyboard::MODIFIER_SYMBOL_BIT;
286 }
288 inline bool isFunctionEqual() const
289 {
290 return modifier_bits() == keyboard::MODIFIER_FUNCTION_BIT;
291 }
293 inline bool isAltEqual() const
294 {
295 return modifier_bits() == keyboard::MODIFIER_ALT_BIT;
296 }
298 inline bool isControlEqual() const
299 {
300 return modifier_bits() == keyboard::MODIFIER_CONTROL_BIT;
301 }
303 inline bool isOptionEqual() const
304 {
305 return modifier_bits() == keyboard::MODIFIER_OPTION_BIT;
306 }
308
313 inline bool isPressed() const
314 {
315 return _now != 0;
316 }
318 inline bool isReleased() const
319 {
320 return !isPressed();
321 }
323 inline bool wasPressed() const
324 {
325 return _wasPressed;
326 }
328 inline bool wasReleased() const
329 {
330 return _wasReleased;
331 }
333 inline bool isHolding() const
334 {
335 return _holding;
336 }
338 inline bool wasHold() const
339 {
340 return _wasHold;
341 }
343 inline bool isRepeating() const
344 {
345 return _repeating;
346 }
348
352
357 // inline
358 bool isPressed(const keyboard::key_index_t kidx) const
359 {
360 return _now & (1ULL << kidx);
361 }
367 inline bool isReleased(const keyboard::key_index_t kidx) const
368 {
369 return !isPressed(kidx);
370 }
376 inline bool wasPressed(const keyboard::key_index_t kidx) const
377 {
378 return _wasPressed & (1ULL << kidx);
379 }
385 inline bool wasReleased(const keyboard::key_index_t kidx) const
386 {
387 return _wasReleased & (1ULL << kidx);
388 }
394 inline bool isHolding(const keyboard::key_index_t kidx) const
395 {
396 return _holding & (1ULL << kidx);
397 }
403 inline bool wasHold(const keyboard::key_index_t kidx) const
404 {
405 return _wasHold & (1ULL << kidx);
406 }
412 inline bool isRepeating(const keyboard::key_index_t kidx) const
413 {
414 return _repeating & (1ULL << kidx);
415 }
417
426
431 inline virtual keyboard::key_index_t toKeyIndex(const char) const
432 {
433 return 0xFF;
434 }
440 inline bool isPressed(const char ch) const
441 {
442 auto kidx = toKeyIndex(ch);
443 return kidx != 0xFF && isPressed(kidx) && permitted_mode(to_mode_bits(ch));
444 }
450 inline bool isReleased(const char ch) const
451 {
452 return !isPressed(ch);
453 }
459 inline bool wasPressed(const char ch) const
460 {
461 auto kidx = toKeyIndex(ch);
462 return kidx != 0xFF && wasPressed(kidx) && permitted_mode(to_mode_bits(ch));
463 }
469 inline bool wasReleased(const char ch) const
470 {
471 auto kidx = toKeyIndex(ch);
472 return kidx != 0xFF && wasReleased(kidx) && permitted_mode(to_mode_bits(ch));
473 }
479 inline bool isHolding(const char ch) const
480 {
481 auto kidx = toKeyIndex(ch);
482 return kidx != 0xFF && isHolding(kidx) && permitted_mode(to_mode_bits(ch));
483 }
489 inline bool wasHold(const char ch) const
490 {
491 auto kidx = toKeyIndex(ch);
492 return kidx != 0xFF && wasHold(kidx) && permitted_mode(to_mode_bits(ch));
493 }
499 inline bool isRepeating(const char ch) const
500 {
501 auto kidx = toKeyIndex(ch);
502 return kidx != 0xFF && isRepeating(kidx) && permitted_mode(to_mode_bits(ch));
503 }
505
509
515 inline uint8_t firmwareVersion() const
516 {
517 return _firmware_version;
518 }
524 virtual bool readFirmwareVersion(uint8_t& ver);
526
531 inline uint32_t holdingThreshold() const
532 {
533 return _holding_threshold;
534 }
536 inline uint32_t repeatingThreshold() const
537 {
538 return _repeating_threshold;
539 }
542 inline void setHoldingThreshold(const uint32_t ms)
543 {
544 _holding_threshold = ms;
545 }
548 inline void setRepeatingThreshold(const uint32_t ms)
549 {
550 _repeating_threshold = ms;
551 }
553
558
563 virtual bool readMode(keyboard::Mode& mode);
569 virtual bool writeMode(const keyboard::Mode mode);
571
572protected:
573 bool start_periodic_measurement();
574 bool start_periodic_measurement(const uint32_t interval);
575 bool stop_periodic_measurement();
576
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);
579
580 inline keyboard::key_status_bits_t modifier_bits() const
581 {
582 return keyboard::modifier_bits(_now);
583 }
584
585 inline virtual uint8_t to_mode_bits(const char) const
586 {
587 return 0x00;
588 }
589
590 inline virtual uint8_t scan_reg_addr() const
591 {
592 return 0x10;
593 }
594 inline virtual uint8_t mode_reg_addr() const
595 {
596 return 0x20;
597 }
598 inline virtual uint8_t firmware_version_reg_addr() const
599 {
600 return 0xFE;
601 }
602
603 bool permitted_mode(const uint8_t mbits) const
604 {
605 uint8_t mod8 = _now >> 56;
606 // mod8 bit0=Shift→mbits bit1, bit1=Sym→bit2, bit2=Fn→bit3
607 return mbits & (mod8 ? (mod8 << 1) : 0x01);
608 }
609
610 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitKeyboardBitwise, uint8_t);
611
612protected:
613 std::unique_ptr<m5::container::CircularBuffer<uint8_t>> _data{}; // was Pressed keys
614 keyboard::key_status_bits_t _now{}, _prev{}, _wasPressed{}, _wasReleased{}, _wasHold{}, _holding{},
615 _repeating{}; // key bits
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};
620};
621
622namespace keyboard {
623namespace command {
624constexpr uint8_t CMD_SCAN_REG{0x10};
625constexpr uint8_t CMD_MODE_REG{0x20};
626constexpr uint8_t CMD_FIRMWARE_VERSION_REG{0xFE};
627} // namespace command
628
629} // namespace keyboard
630
631} // namespace unit
632} // namespace m5
633#endif
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
For keyboard.
Top level namespace of M5stack.
Unit-related namespace.
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