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{};
163 return (
data_mode == Mode::Cursor) ? cursor_x : 0xFFFF;
182class UnitPAJ7620U2 :
public Component,
public PeriodicMeasurementAdapter<UnitPAJ7620U2, paj7620u2::Data> {
212 : Component(addr), _data{new
m5::container::CircularBuffer<
paj7620u2::Data>(1)}
214 auto ccfg = component_config();
215 ccfg.clock = 400 * 1000U;
216 component_config(ccfg);
227 virtual bool begin()
override;
232 virtual void update(
const bool force =
false)
override;
256 return !empty() ? oldest().gesture() : paj7620u2::Gesture::None;
261 return !empty() ? oldest().brightness() : 0;
266 return !empty() ? oldest().approach() :
false;
275 return !empty() ? oldest().cursorX() : 0xFFFF;
284 return !empty() ? oldest().cursorY() : 0xFFFF;
297 return PeriodicMeasurementAdapter<UnitPAJ7620U2, paj7620u2::Data>::startPeriodicMeasurement(intervalMs);
307 const uint32_t intervalMs)
309 return PeriodicMeasurementAdapter<UnitPAJ7620U2, paj7620u2::Data>::startPeriodicMeasurement(
mode, freq,
318 return PeriodicMeasurementAdapter<UnitPAJ7620U2, paj7620u2::Data>::stopPeriodicMeasurement();
345 _rotation = rot & 0x03;
365 [[deprecated(
"Use readFrequency(uint16_t&) instead")]]
bool readFrequency(uint8_t& raw)
370 raw =
static_cast<uint8_t
>(v & 0xFF);
540 bool enable(
const bool flag);
558 bool start_periodic_measurement(
const uint32_t intervalMs = 0);
560 const uint32_t intervalMs);
561 bool stop_periodic_measurement();
565 bool select_bank(
const uint8_t bank,
const bool force =
false);
567 bool read_banked_register(
const uint16_t reg, uint8_t* buf,
const size_t len);
568 bool read_banked_register8(
const uint16_t reg, uint8_t& value);
569 bool write_banked_register(
const uint16_t reg,
const uint8_t* buf,
const size_t len);
570 bool write_banked_register8(
const uint16_t reg,
const uint8_t value);
584 bool read_chip_id(uint16_t&
id);
585 bool read_version(uint8_t& version);
588 uint8_t _current_bank{0xFF};
589 paj7620u2::Mode _mode{};
590 paj7620u2::Frequency _frequency{};
592 bool _hflip{}, _vflip{
true};
594 std::unique_ptr<m5::container::CircularBuffer<paj7620u2::Data>> _data{};
603constexpr uint8_t BANK_SEL{0xEF};
606constexpr uint16_t PART_ID_LOW{0x0000};
607constexpr uint16_t PART_ID_HIGH{0x0001};
608constexpr uint16_t VERSION_ID{0x0002};
609constexpr uint16_t SW_SUSPEND_ENL{0x0003};
611constexpr uint16_t CURSOR_CLAMP_CENTER_X_LOW{0x003B};
612constexpr uint16_t CURSOR_CLAMP_CENTER_X_HIGH{0x003C};
613constexpr uint16_t CURSOR_CLAMP_CENTER_Y_LOW{0x003D};
614constexpr uint16_t CURSOR_CLAMP_CENTER_Y_HIGH{0x003E};
616constexpr uint16_t INT_FLAG_1{0x0043};
617constexpr uint16_t INT_FLAG_2{0x0044};
619constexpr uint16_t R_POX_UB{0x0069};
620constexpr uint16_t R_POX_LB{0x006A};
621constexpr uint16_t S_STATE{0x006B};
622constexpr uint16_t S_AVGY{0x006C};
624constexpr uint16_t OBJECT_CENTER_X_LOW{0x00AC};
625constexpr uint16_t OBJECT_CENTER_X_HIGH{0x00AD};
626constexpr uint16_t OBJECT_CENTER_Y_LOW{0x00AE};
627constexpr uint16_t OBJECT_CENTER_Y_HIGH{0x00AF};
629constexpr uint16_t OBJECT_AVG_Y{0x00B0};
630constexpr uint16_t OBJECT_SIZE_LOW{0x00B1};
631constexpr uint16_t OBJECT_SIZE_HIGH{0x00B2};
632constexpr uint16_t WAVE_ABORT_COUNT{0x00B7};
633constexpr uint16_t NO_OBJECT_COUNT{0x00B8};
634constexpr uint16_t NO_MOTION_COUNT{0x00B9};
636constexpr uint16_t VEL_X_LOW{0x00C3};
637constexpr uint16_t VEL_X_HIGH{0x00C4};
638constexpr uint16_t VEL_Y_LOW{0x00C5};
639constexpr uint16_t VEL_Y_HIGH{0x00C6};
642constexpr uint16_t LS_COMP_DAVG_V{0x0104};
643constexpr uint16_t R_IDLE_TIME_LOW{0x0165};
644constexpr uint16_t R_IDLE_TIME_HIGH{0x0166};
645constexpr uint16_t R_TG_ENH{0x0172};
PAJ7620U2 unit.
Definition unit_PAJ7620U2.hpp:182
bool readProximity(uint8_t &brightness, uint8_t &approach)
Read proximity.
Definition unit_PAJ7620U2.cpp:547
bool readNoObjectCount(uint8_t &cnt)
State counter with no objects detected.
Definition unit_PAJ7620U2.cpp:524
virtual bool begin() override
Begin communication with the sensor.
Definition unit_PAJ7620U2.cpp:370
paj7620u2::Frequency frequency() const
Gets the inner frequency.
Definition unit_PAJ7620U2.hpp:349
bool startPeriodicMeasurement(const paj7620u2::Mode mode, const paj7620u2::Frequency freq, const uint32_t intervalMs)
Start periodic measurement.
Definition unit_PAJ7620U2.hpp:306
uint8_t brightness() const
Oldest brightness if Proximity mode.
Definition unit_PAJ7620U2.hpp:259
bool stopPeriodicMeasurement()
Stop periodic measurement.
Definition unit_PAJ7620U2.hpp:316
bool writeApproachThreshold(const uint8_t high, const uint8_t low)
Write the threshold for detect approach.
Definition unit_PAJ7620U2.cpp:711
void setRotate(const uint8_t rot)
Set the rotation.
Definition unit_PAJ7620U2.hpp:343
bool resume()
resume from suspended
Definition unit_PAJ7620U2.cpp:594
bool readGesture(paj7620u2::Gesture &gesture)
Read gesture.
Definition unit_PAJ7620U2.cpp:513
void config(const config_t &cfg)
Set the configuration.
Definition unit_PAJ7620U2.hpp:245
bool enable()
enable sensor
Definition unit_PAJ7620U2.hpp:542
bool writeVerticalFlip(const bool flip)
Write the vertical flipping.
Definition unit_PAJ7620U2.cpp:749
bool disable()
disable sensor
Definition unit_PAJ7620U2.hpp:547
bool readApproachThreshold(uint8_t &high, uint8_t &low)
Read the threshold for detect approach.
Definition unit_PAJ7620U2.cpp:706
bool readCursor(uint16_t &x, uint16_t &y)
Cursor position.
Definition unit_PAJ7620U2.cpp:572
bool readNoMotionCount(uint8_t &cnt)
State counter which a non-moving object is detected.
Definition unit_PAJ7620U2.cpp:530
bool readVerticalFlip(bool &flip)
Read the vertical flipping.
Definition unit_PAJ7620U2.cpp:727
bool suspend()
suspend
Definition unit_PAJ7620U2.cpp:589
bool writeHorizontalFlip(const bool flip)
Write the horizontal flipping.
Definition unit_PAJ7620U2.cpp:738
paj7620u2::Mode mode() const
Gets the detection mode.
Definition unit_PAJ7620U2.hpp:495
bool startPeriodicMeasurement(const uint32_t intervalMs=0)
Start periodic measurement in the current settings.
Definition unit_PAJ7620U2.hpp:295
bool writeFrequency(const paj7620u2::Frequency f)
Write the frequency.
Definition unit_PAJ7620U2.cpp:628
bool approach() const
Oldest approach status if Proximity mode.
Definition unit_PAJ7620U2.hpp:264
bool writeMode(const paj7620u2::Mode mode)
Write the detection mode.
Definition unit_PAJ7620U2.cpp:677
bool existsObject(bool &exists)
Is the object present within the detection range?
Definition unit_PAJ7620U2.hpp:425
bool readObjectCenter(uint16_t &x, uint16_t &y)
Object center position.
Definition unit_PAJ7620U2.cpp:559
bool readFrequency(uint8_t &raw)
Read the lower byte of R_IDLE_TIME.
Definition unit_PAJ7620U2.hpp:365
virtual void update(const bool force=false) override
Update periodic measurement data.
Definition unit_PAJ7620U2.cpp:420
virtual ~UnitPAJ7620U2()
Destructor.
Definition unit_PAJ7620U2.hpp:219
uint8_t rotation() const
Get the rotation.
Definition unit_PAJ7620U2.hpp:327
config_t config() const
Gets the configuration.
Definition unit_PAJ7620U2.hpp:237
bool readHorizontalFlip(bool &flip)
Read the horizontal flipping.
Definition unit_PAJ7620U2.cpp:716
bool readFrequency(uint16_t &raw)
Read the raw R_IDLE_TIME register value.
Definition unit_PAJ7620U2.cpp:599
uint16_t cursorY() const
Oldest cursor Y if Cursor mode.
Definition unit_PAJ7620U2.hpp:282
float readFrequencyHz()
Read the current frequency in Hz from hardware.
Definition unit_PAJ7620U2.cpp:642
bool readObjectSize(uint16_t &sz)
Read gesture object size.
Definition unit_PAJ7620U2.cpp:536
uint16_t cursorX() const
Oldest cursor X if Cursor mode.
Definition unit_PAJ7620U2.hpp:273
UnitPAJ7620U2(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_PAJ7620U2.hpp:211
bool writeFrequencyHz(const float hz)
Write the frequency in Hz.
Definition unit_PAJ7620U2.cpp:651
paj7620u2::Gesture gesture() const
Oldest gesture.
Definition unit_PAJ7620U2.hpp:254
Top level namespace of M5Stack.
Settings for begin.
Definition unit_PAJ7620U2.hpp:190
bool vflip
Flip vertical if start on begin.
Definition unit_PAJ7620U2.hpp:200
paj7620u2::Mode mode
Mode if start on begin.
Definition unit_PAJ7620U2.hpp:194
bool hflip
Flip horizontal if start on begin.
Definition unit_PAJ7620U2.hpp:198
bool start_periodic
Start periodic measurement on begin?
Definition unit_PAJ7620U2.hpp:192
uint8_t rotation
Rotation if start on begin.
Definition unit_PAJ7620U2.hpp:202
paj7620u2::Frequency frequency
Frequency if start on begin.
Definition unit_PAJ7620U2.hpp:196
bool store_on_change
Store only when the value changes.
Definition unit_PAJ7620U2.hpp:204
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
Gets the approach state (true: approach)
Definition unit_PAJ7620U2.hpp:150
uint16_t cursorX() const
Gets the cursor X of any object.
Definition unit_PAJ7620U2.hpp:161
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:169
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
Counterclockwise.
@ 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