M5Unit-COLOR 0.2.0 git rev:d6fe6e1
Loading...
Searching...
No Matches
unit_TCS3472x.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_COLOR_UNIT_TCS3472X_HPP
11#define M5_UNIT_COLOR_UNIT_TCS3472X_HPP
12
14#include <M5UnitComponent.hpp>
15#include <m5_utility/container/circular_buffer.hpp>
16#include <array>
17
18namespace m5 {
19namespace unit {
20
26class UnitTCS3472x : public Component, public PeriodicMeasurementAdapter<UnitTCS3472x, tcs3472x::Data> {
27 M5_UNIT_COMPONENT_HPP_BUILDER(UnitTCS3472x, 0x00);
28
29public:
34 struct config_t {
36 bool start_periodic{true};
38 float atime{614.4f};
40 float wtime{2.4f};
42 tcs3472x::Gain gain{tcs3472x::Gain::Controlx4};
43 };
44
49 explicit UnitTCS3472x(const uint8_t addr = DEFAULT_ADDRESS)
50 : Component(addr), _data{new m5::container::CircularBuffer<tcs3472x::Data>(1)}
51 {
52 auto ccfg = component_config();
53 ccfg.clock = 400 * 1000U;
54 component_config(ccfg);
55 }
57 virtual ~UnitTCS3472x()
58 {
59 }
60
63 virtual bool begin() override;
66 virtual void update(const bool force = false) override;
67
71 inline config_t config() const
72 {
73 return _cfg;
74 }
76 inline void config(const config_t& cfg)
77 {
78 _cfg = cfg;
79 }
81
85 inline uint8_t R8() const
86 {
87 return !empty() ? oldest().R8() : 0U;
88 }
90 inline uint8_t G8() const
91 {
92 return !empty() ? oldest().G8() : 0U;
93 }
95 inline uint8_t B8() const
96 {
97 return !empty() ? oldest().B8() : 0U;
98 }
100 inline uint16_t RGB565() const
101 {
102 return !empty() ? oldest().RGB565() : 0U;
103 }
105
108
125 bool readGain(tcs3472x::Gain& gc);
131 bool writeGain(const tcs3472x::Gain gc);
137 bool readAtime(uint8_t& raw);
143 bool readAtime(float& ms);
149 template <typename T, typename std::enable_if<std::is_integral<T>::value, std::nullptr_t>::type = nullptr>
150 inline bool writeAtime(const T raw)
151 {
152 return write_atime(static_cast<uint8_t>(raw));
153 }
161 bool writeAtime(const float ms);
168 bool readWtime(uint8_t& raw, bool& wlong);
174 bool readWtime(float& ms);
181 bool writeWtime(const uint8_t raw, const bool wlong);
189 bool writeWtime(const float ms);
191
194
201 inline bool startPeriodicMeasurement(const tcs3472x::Gain gc, const float atime, const float wtime)
202 {
203 return PeriodicMeasurementAdapter<UnitTCS3472x, tcs3472x::Data>::startPeriodicMeasurement(gc, atime, wtime);
204 }
210 {
211 return PeriodicMeasurementAdapter<UnitTCS3472x, tcs3472x::Data>::startPeriodicMeasurement();
212 }
218 inline bool stopPeriodicMeasurement(const bool power_off = true)
219 {
220 return PeriodicMeasurementAdapter<UnitTCS3472x, tcs3472x::Data>::stopPeriodicMeasurement(power_off);
221 }
223
226
235 bool measureSingleshot(tcs3472x::Data& d, const tcs3472x::Gain gc, const float atime);
244
247
252 bool readInterrupt(bool& enable);
258 bool writeInterrupt(const bool enable);
265 bool readInterruptThreshold(uint16_t& low, uint16_t& high);
272 bool writeInterruptThreshold(const uint16_t low, const uint16_t high);
273
278 bool clearInterrupt();
280
286 bool readStatus(uint8_t& status);
287
288protected:
289 inline virtual bool is_valid_id(const uint8_t /*id*/) const
290 {
291 return false;
292 }
293
294 bool read_register8(const uint8_t reg, uint8_t& val);
295 bool write_register8(const uint8_t reg, const uint8_t val);
296 bool read_register(const uint8_t reg, uint8_t* buf, const uint32_t len);
297 bool write_register(const uint8_t reg, const uint8_t* buf, const uint32_t len);
298
299 bool start_periodic_measurement(const tcs3472x::Gain gc, const float atime, const float wtime);
300 bool start_periodic_measurement();
301 bool stop_periodic_measurement(const bool power_off);
302
303 bool is_data_ready();
304 bool read_measurement(tcs3472x::Data& d);
305
306 bool write_atime(const uint8_t raw);
307
308 M5_UNIT_COMPONENT_PERIODIC_MEASUREMENT_ADAPTER_HPP_BUILDER(UnitTCS3472x, tcs3472x::Data);
309
310private:
311 std::unique_ptr<m5::container::CircularBuffer<tcs3472x::Data>> _data{};
312 config_t _cfg{};
313};
314
320 M5_UNIT_COMPONENT_HPP_BUILDER(UnitTCS34725, 0x29);
321
322public:
325 explicit UnitTCS34725(const uint8_t addr = DEFAULT_ADDRESS) : UnitTCS3472x(addr)
326 {
327 }
330 {
331 }
333 static constexpr uint8_t UNIT_ID{0x44};
334
335protected:
336 inline virtual bool is_valid_id(const uint8_t id) const override
337 {
338 return id == UNIT_ID;
339 }
340};
341
347 M5_UNIT_COMPONENT_HPP_BUILDER(UnitTCS34727, 0x29);
348
349public:
352 explicit UnitTCS34727(const uint8_t addr = DEFAULT_ADDRESS) : UnitTCS3472x(addr)
353 {
354 }
357 {
358 }
360 static constexpr uint8_t UNIT_ID{0x4D};
361
362protected:
363 inline virtual bool is_valid_id(const uint8_t id) const override
364 {
365 return id == UNIT_ID;
366 }
367};
368
370namespace tcs3472x {
371namespace command {
372// R/W
373constexpr uint8_t ENABLE_REG{0x00};
374constexpr uint8_t ATIME_REG{0x01};
375constexpr uint8_t WTIME_REG{0x03};
376constexpr uint8_t AILTL_REG{0x04};
377constexpr uint8_t AILTH_REG{0x05};
378constexpr uint8_t AIHTL_REG{0x06};
379constexpr uint8_t AIHTH_REG{0x07};
380constexpr uint8_t PERS_REG{0x0C};
381constexpr uint8_t CONFIG_REG{0x0D};
382constexpr uint8_t CONTROL_REG{0x0F};
383// R
384constexpr uint8_t ID_REG{0x12};
385constexpr uint8_t STATUS_REG{0x13};
386constexpr uint8_t CDATAL_REG{0x14};
387constexpr uint8_t CDATAH_REG{0x15};
388constexpr uint8_t RDATAL_REG{0x16};
389constexpr uint8_t RDATAH_REG{0x17};
390constexpr uint8_t GDATAL_REG{0x18};
391constexpr uint8_t GDATAH_REG{0x19};
392constexpr uint8_t BDATAL_REG{0x1A};
393constexpr uint8_t BDATAH_REG{0x1B};
394
395} // namespace command
396} // namespace tcs3472x
398
399} // namespace unit
400} // namespace m5
401#endif
Color recognition unit.
Definition unit_TCS3472x.hpp:319
virtual ~UnitTCS34725()
Destructor.
Definition unit_TCS3472x.hpp:329
static constexpr uint8_t UNIT_ID
Device ID for TCS34725.
Definition unit_TCS3472x.hpp:333
UnitTCS34725(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_TCS3472x.hpp:325
Color recognition unit.
Definition unit_TCS3472x.hpp:346
virtual ~UnitTCS34727()
Destructor.
Definition unit_TCS3472x.hpp:356
static constexpr uint8_t UNIT_ID
Device ID for TCS34727.
Definition unit_TCS3472x.hpp:360
UnitTCS34727(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_TCS3472x.hpp:352
Color recognition unit.
Definition unit_TCS3472x.hpp:26
bool readAtime(uint8_t &raw)
Read the RGBC integration time (ATIME)
Definition unit_TCS3472x.cpp:282
bool writeInterruptThreshold(const uint16_t low, const uint16_t high)
Write the interrupt thresholds for clear channel.
Definition unit_TCS3472x.cpp:396
uint8_t R8() const
Oldest measured Red.
Definition unit_TCS3472x.hpp:85
bool readWtime(uint8_t &raw, bool &wlong)
Read the wait time (WTIME)
Definition unit_TCS3472x.cpp:319
uint8_t B8() const
Oldest measured Blue.
Definition unit_TCS3472x.hpp:95
uint8_t G8() const
Oldest measured Green.
Definition unit_TCS3472x.hpp:90
bool readStatus(uint8_t &status)
Read the status register.
Definition unit_TCS3472x.cpp:407
bool stopPeriodicMeasurement(const bool power_off=true)
Stop periodic measurement.
Definition unit_TCS3472x.hpp:218
bool clearInterrupt()
Clear interrupt.
Definition unit_TCS3472x.cpp:402
virtual bool begin() override
Begin communication with the sensor.
Definition unit_TCS3472x.cpp:110
bool writeAtime(const T raw)
Write the RGBC integration time (ATIME)
Definition unit_TCS3472x.hpp:150
uint16_t RGB565() const
Oldest measured RGB565.
Definition unit_TCS3472x.hpp:100
virtual ~UnitTCS3472x()
Destructor.
Definition unit_TCS3472x.hpp:57
bool writeWtime(const uint8_t raw, const bool wlong)
Write the wait time (WTIME)
Definition unit_TCS3472x.cpp:340
bool startPeriodicMeasurement()
Start periodic measurement using current settings.
Definition unit_TCS3472x.hpp:209
bool writeGain(const tcs3472x::Gain gc)
Write the gain control.
Definition unit_TCS3472x.cpp:273
config_t config() const
Gets the configuration.
Definition unit_TCS3472x.hpp:71
UnitTCS3472x(const uint8_t addr=DEFAULT_ADDRESS)
Constructor.
Definition unit_TCS3472x.hpp:49
bool writeInterrupt(const bool enable)
Write the interrupt status.
Definition unit_TCS3472x.cpp:375
bool readInterrupt(bool &enable)
Read the interrupt status.
Definition unit_TCS3472x.cpp:365
void config(const config_t &cfg)
Set the configuration.
Definition unit_TCS3472x.hpp:76
bool readInterruptThreshold(uint16_t &low, uint16_t &high)
Read the interrupt thresholds for clear channel.
Definition unit_TCS3472x.cpp:385
bool writePersistence(const tcs3472x::Persistence pers)
Write the persistence.
Definition unit_TCS3472x.cpp:252
bool readGain(tcs3472x::Gain &gc)
Read the gain control.
Definition unit_TCS3472x.cpp:263
virtual void update(const bool force=false) override
Update periodic measurement data.
Definition unit_TCS3472x.cpp:130
bool measureSingleshot(tcs3472x::Data &d, const tcs3472x::Gain gc, const float atime)
Measurement single shot.
Definition unit_TCS3472x.cpp:197
bool readPersistence(tcs3472x::Persistence &pers)
Read the persistence.
Definition unit_TCS3472x.cpp:242
bool startPeriodicMeasurement(const tcs3472x::Gain gc, const float atime, const float wtime)
Start periodic measurement.
Definition unit_TCS3472x.hpp:201
Top level namespace of M5Stack.
For TCS3472x.
Unit-related namespace.
Settings for begin.
Definition unit_TCS3472x.hpp:34
float wtime
Wait time(ms) if start on begin.
Definition unit_TCS3472x.hpp:40
float atime
RGBC integration time(ms) if start on begin.
Definition unit_TCS3472x.hpp:38
bool start_periodic
Start periodic measurement on begin?
Definition unit_TCS3472x.hpp:36
tcs3472x::Gain gain
Gain if start on begin.
Definition unit_TCS3472x.hpp:42
Measurement data group.
Definition unit_TCS3472x_data.hpp:66
Data types for TCS3472x.
Gain
RGBC Gain Control.
Definition unit_TCS3472x_data.hpp:55
Persistence
Interrupt persistence.
Definition unit_TCS3472x_data.hpp:32