10#ifndef M5_UNIT_GESTURE_UNIT_PAJ7620U2_HPP
11#define M5_UNIT_GESTURE_UNIT_PAJ7620U2_HPP
13#include <M5UnitComponent.hpp>
14#include <m5_utility/container/circular_buffer.hpp>
81 return 31250.0f / (77 + idle_time);
95 float v = 31250.0f / hz - 77.0f;
102 return static_cast<uint16_t
>(v + 0.5f);
119 std::array<uint8_t, 2 + 4>
raw{};
160 return (
data_mode == Mode::Cursor) ? cursor_x : 0xFFFF;
176class UnitPAJ7620U2 :
public Component,
public PeriodicMeasurementAdapter<UnitPAJ7620U2, paj7620u2::Data> {
206 : Component(addr), _data{new
m5::container::CircularBuffer<
paj7620u2::Data>(1)}
208 auto ccfg = component_config();
209 ccfg.clock = 400 * 1000U;
210 component_config(ccfg);
221 virtual bool begin()
override;
226 virtual void update(
const bool force =
false)
override;
247 return !empty() ? oldest().gesture() : paj7620u2::Gesture::None;
252 return !empty() ? oldest().brightness() : 0;
257 return !empty() ? oldest().approach() :
false;
262 return !empty() ? oldest().cursorX() : 0xFFFF;
267 return !empty() ? oldest().cursorY() : 0xFFFF;
280 return PeriodicMeasurementAdapter<UnitPAJ7620U2, paj7620u2::Data>::startPeriodicMeasurement(intervalMs);
290 const uint32_t intervalMs)
292 return PeriodicMeasurementAdapter<UnitPAJ7620U2, paj7620u2::Data>::startPeriodicMeasurement(
mode, freq,
301 return PeriodicMeasurementAdapter<UnitPAJ7620U2, paj7620u2::Data>::stopPeriodicMeasurement();
328 _rotation = rot & 0x03;
506 bool enable(
const bool flag);
524 bool start_periodic_measurement(
const uint32_t intervalMs = 0);
526 const uint32_t intervalMs);
527 bool stop_periodic_measurement();
531 bool select_bank(
const uint8_t bank,
const bool force =
false);
533 bool read_banked_register(
const uint16_t reg, uint8_t* buf,
const size_t len);
534 bool read_banked_register8(
const uint16_t reg, uint8_t& value);
535 bool write_banked_register(
const uint16_t reg,
const uint8_t* buf,
const size_t len);
536 bool write_banked_register8(
const uint16_t reg,
const uint8_t value);
548 bool read_chip_id(uint16_t&
id);
549 bool read_version(uint8_t& version);
552 uint8_t _current_bank{0xFF};
553 paj7620u2::Mode _mode{};
554 paj7620u2::Frequency _frequency{};
557 std::unique_ptr<m5::container::CircularBuffer<paj7620u2::Data>> _data{};
566constexpr uint8_t BANK_SEL{0xEF};
569constexpr uint16_t PART_ID_LOW{0x0000};
570constexpr uint16_t PART_ID_HIGH{0x0001};
571constexpr uint16_t VERSION_ID{0x0002};
572constexpr uint16_t SW_SUSPEND_ENL{0x0003};
574constexpr uint16_t CURSOR_CLAMP_CENTER_X_LOW{0x003B};
575constexpr uint16_t CURSOR_CLAMP_CENTER_X_HIGH{0x003C};
576constexpr uint16_t CURSOR_CLAMP_CENTER_Y_LOW{0x003D};
577constexpr uint16_t CURSOR_CLAMP_CENTER_Y_HIGH{0x003E};
579constexpr uint16_t INT_FLAG_1{0x0043};
580constexpr uint16_t INT_FLAG_2{0x0044};
582constexpr uint16_t R_POX_UB{0x0069};
583constexpr uint16_t R_POX_LB{0x006A};
584constexpr uint16_t S_STATE{0x006B};
585constexpr uint16_t S_AVGY{0x006C};
587constexpr uint16_t OBJECT_CENTER_X_LOW{0x00AC};
588constexpr uint16_t OBJECT_CENTER_X_HIGH{0x00AD};
589constexpr uint16_t OBJECT_CENTER_Y_LOW{0x00AE};
590constexpr uint16_t OBJECT_CENTER_Y_HIGH{0x00AF};
592constexpr uint16_t OBJECT_AVG_Y{0x00B0};
593constexpr uint16_t OBJECT_SIZE_LOW{0x00B1};
594constexpr uint16_t OBJECT_SIZE_HIGH{0x00B2};
595constexpr uint16_t WAVE_ABORT_COUNT{0x00B7};
596constexpr uint16_t NO_OBJECT_COUNT{0x00B8};
597constexpr uint16_t NO_MOTION_COUNT{0x00B9};
599constexpr uint16_t VEL_X_LOW{0x00C3};
600constexpr uint16_t VEL_X_HIGH{0x00C4};
601constexpr uint16_t VEL_Y_LOW{0x00C5};
602constexpr uint16_t VEL_Y_HIGH{0x00C6};
605constexpr uint16_t LS_COMP_DAVG_V{0x0104};
606constexpr uint16_t R_IDLE_TIME_LOW{0x0165};
607constexpr uint16_t R_IDLE_TIME_HIGH{0x0166};
608constexpr uint16_t R_TG_ENH{0x0172};
PAJ7620U2 unit.
Definition unit_PAJ7620U2.hpp:176
bool readProximity(uint8_t &brightness, uint8_t &approach)
Read proximity.
Definition unit_PAJ7620U2.cpp:558
bool readNoObjectCount(uint8_t &cnt)
State counter with no objects detected.
Definition unit_PAJ7620U2.cpp:535
virtual bool begin() override
Begin communication with the sensor.
Definition unit_PAJ7620U2.cpp:381
paj7620u2::Frequency frequency() const
Gets the inner frequency.
Definition unit_PAJ7620U2.hpp:332
bool startPeriodicMeasurement(const paj7620u2::Mode mode, const paj7620u2::Frequency freq, const uint32_t intervalMs)
Start periodic measurement.
Definition unit_PAJ7620U2.hpp:289
uint8_t brightness() const
Oldest brightness if Proximity mode.
Definition unit_PAJ7620U2.hpp:250
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_PAJ7620U2.hpp:299
bool writeApproachThreshold(const uint8_t high, const uint8_t low)
Write the threshold for detect approach.
Definition unit_PAJ7620U2.cpp:720
void setRotate(const uint8_t rot)
Set the rotation.
Definition unit_PAJ7620U2.hpp:326
bool resume()
resume from suspended
Definition unit_PAJ7620U2.cpp:605
bool readGesture(paj7620u2::Gesture &gesture)
Read gesture.
Definition unit_PAJ7620U2.cpp:524
config_t config()
Gets the configuration.
Definition unit_PAJ7620U2.hpp:231
void config(const config_t &cfg)
Set the configuration.
Definition unit_PAJ7620U2.hpp:236
bool enable()
enable sensor
Definition unit_PAJ7620U2.hpp:508
bool writeVerticalFlip(const bool flip)
Write the vertical flipping.
Definition unit_PAJ7620U2.cpp:757
bool disable()
disable sensor
Definition unit_PAJ7620U2.hpp:513
bool readApproachThreshold(uint8_t &high, uint8_t &low)
Read the threshold for detect approach.
Definition unit_PAJ7620U2.cpp:715
bool readCursor(uint16_t &x, uint16_t &y)
Cursor position.
Definition unit_PAJ7620U2.cpp:583
bool readNoMotionCount(uint8_t &cnt)
State counter which a non-moving object is detected.
Definition unit_PAJ7620U2.cpp:541
bool readVerticalFlip(bool &flip)
Read the vertical flipping.
Definition unit_PAJ7620U2.cpp:736
bool suspend()
suspend
Definition unit_PAJ7620U2.cpp:600
bool writeHorizontalFlip(const bool flip)
Write the horizontal flipping.
Definition unit_PAJ7620U2.cpp:747
paj7620u2::Mode mode() const
Gets the detection mode.
Definition unit_PAJ7620U2.hpp:462
bool startPeriodicMeasurement(const uint32_t intervalMs=0)
Start periodic measurement in the current settings.
Definition unit_PAJ7620U2.hpp:278
bool writeFrequency(const paj7620u2::Frequency f)
Write the frequency.
Definition unit_PAJ7620U2.cpp:639
bool approach() const
Oldest approach status if Proximity mode.
Definition unit_PAJ7620U2.hpp:255
bool writeMode(const paj7620u2::Mode mode)
Write the detection mode.
Definition unit_PAJ7620U2.cpp:685
bool existsObject(bool &exists)
Is the object present within the detection range?
Definition unit_PAJ7620U2.hpp:392
bool readObjectCenter(uint16_t &x, uint16_t &y)
Object center position.
Definition unit_PAJ7620U2.cpp:570
virtual void update(const bool force=false) override
Update periodic measurement data.
Definition unit_PAJ7620U2.cpp:429
virtual ~UnitPAJ7620U2()
Destructor.
Definition unit_PAJ7620U2.hpp:213
uint8_t rotation() const
Get the rotation.
Definition unit_PAJ7620U2.hpp:310
bool readHorizontalFlip(bool &flip)
Read the horizontal flipping.
Definition unit_PAJ7620U2.cpp:725
bool readFrequency(uint16_t &raw)
Read the raw R_IDLE_TIME register value.
Definition unit_PAJ7620U2.cpp:610
uint16_t cursorY() const
Oldest cursor Y if Cursor mode.
Definition unit_PAJ7620U2.hpp:265
float readFrequencyHz()
Read the current frequency in Hz from hardware.
Definition unit_PAJ7620U2.cpp:653
bool readObjectSize(uint16_t &sz)
Read gesture object size.
Definition unit_PAJ7620U2.cpp:547
uint16_t cursorX() const
Oldest cursor X if Cursor mode.
Definition unit_PAJ7620U2.hpp:260
UnitPAJ7620U2(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_PAJ7620U2.hpp:205
bool writeFrequencyHz(const float hz)
Write the frequency in Hz.
Definition unit_PAJ7620U2.cpp:662
paj7620u2::Gesture gesture() const
Oldest gesture.
Definition unit_PAJ7620U2.hpp:245
Top level namespace of M5stack.
Settings for begin.
Definition unit_PAJ7620U2.hpp:184
bool vflip
Flip vertical if start on begin.
Definition unit_PAJ7620U2.hpp:194
paj7620u2::Mode mode
Mode if start on begin.
Definition unit_PAJ7620U2.hpp:188
bool hflip
Flip horizontal if start on begin.
Definition unit_PAJ7620U2.hpp:192
bool start_periodic
Start periodic measurement on begin?
Definition unit_PAJ7620U2.hpp:186
uint8_t rotation
Rotation if start on begin.
Definition unit_PAJ7620U2.hpp:196
paj7620u2::Frequency frequency
Frequency if start on begin.
Definition unit_PAJ7620U2.hpp:190
bool store_on_change
Store only when value is a change.
Definition unit_PAJ7620U2.hpp:198
Measurement data group.
Definition unit_PAJ7620U2.hpp:109
std::array< uint8_t, 2+4 > raw
Raw register data.
Definition unit_PAJ7620U2.hpp:119
uint8_t proximity_brightness
Proximity brightness (PS data)
Definition unit_PAJ7620U2.hpp:124
Mode mode() const
Gets the operation mode.
Definition unit_PAJ7620U2.hpp:133
Gesture data_gesture
Detected gesture.
Definition unit_PAJ7620U2.hpp:120
bool proximity_approach
Proximity approach state.
Definition unit_PAJ7620U2.hpp:125
bool approach() const
Detect the approach?
Definition unit_PAJ7620U2.hpp:150
uint16_t cursorX() const
Gets the cursor X of any object.
Definition unit_PAJ7620U2.hpp:158
Mode data_mode
Current operating mode.
Definition unit_PAJ7620U2.hpp:121
uint8_t brightness() const
Gets the brightness.
Definition unit_PAJ7620U2.hpp:145
Gesture gesture() const
Gets the gesture (Common)
Definition unit_PAJ7620U2.hpp:138
uint16_t cursorY() const
Gets the cursor Y of any object.
Definition unit_PAJ7620U2.hpp:163
uint16_t cursor_y
Cursor XY coordinates.
Definition unit_PAJ7620U2.hpp:128
uint16_t hz_to_idle_time(const float hz)
Convert frequency in Hz to R_IDLE_TIME register value.
Definition unit_PAJ7620U2.hpp:90
Frequency
Frequency Operating frequency.
Definition unit_PAJ7620U2.hpp:67
Gesture
Gesture type.
Definition unit_PAJ7620U2.hpp:32
@ NoObject
No object (cursor mode)
@ Approach
Approach (proximity mode)
@ HasObject
Has object (cursor mode)
@ Forward
Closer to the sensor.
@ Confirm
Confirm (confirm mode)
@ Abort
Abort (confirm mode)
@ CounterClockwise
Counter clock wise.
@ WakeupTrigger
Wakeup (trigger mode)
@ Backward
Away from the sensor.
Mode
Operation Mode.
Definition unit_PAJ7620U2.hpp:56
@ Cursor
Detect XY coordinate.
@ Proximity
Detect proximity.
float idle_time_to_hz(const uint16_t idle_time)
Convert R_IDLE_TIME register value to frequency in Hz.
Definition unit_PAJ7620U2.hpp:79