M5Unit-FINGER 0.2.0 git rev:ee2afce
Loading...
Searching...
No Matches
unit_FPC1xxx.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_FINGER_UNIT_FPC1XXX_HPP
11#define M5_UNIT_FINGER_UNIT_FPC1XXX_HPP
12
13#include <M5UnitComponent.hpp>
14#include <array>
15#include <vector>
16
17namespace m5 {
18namespace unit {
19namespace fpc1xxx {
20
25enum class ACK : uint8_t {
26 Success,
27 Fail,
28 Full = 0x04,
29 NoUser,
30 Occupied,
31 ExistUser = 0x07,
32 Timeout,
33};
34
39enum class BaudRate : uint8_t {
40 Baud9600 = 1,
41 Baud19200,
42 Baud38400,
43 Baud57600,
45};
46
52enum class Mode : uint8_t {
55};
56
61struct User {
62 User(const uint16_t i, const uint8_t p) : id{i}, permission{p}
63 {
64 }
65 uint16_t id{};
66 uint8_t permission{};
67};
68
69} // namespace fpc1xxx
70
86class UnitFPC1XXX : public Component {
87 M5_UNIT_COMPONENT_HPP_BUILDER(UnitFPC1XXX, 0x00);
88
89public:
90 // The following variables must be defined in the derived class
91 static constexpr uint16_t RESOLUTION_WIDTH{0};
92 static constexpr uint16_t RESOLUTION_HEIGHT{0};
93 static constexpr uint16_t MINIMUM_USER_ID{0};
94 static constexpr uint16_t MAXIMUM_USER_ID{0};
95
96protected:
97 UnitFPC1XXX() : Component(DEFAULT_ADDRESS)
98 {
99 }
100
101public:
102 using Frame = std::array<uint8_t, 8>; // 0xF5 CMD P1 P2 P3 0 CHK 0xF5
103 using VariableFrame = std::vector<uint8_t>; // 0xF5 CMD LEN(MSB) LEN(LSB) 0 0 CHK 0xF5,...
104
105 virtual ~UnitFPC1XXX() = default;
106
111 virtual bool begin() override;
112
117 struct config_t {
118 uint32_t timeout_ms{1000 * 4};
119 };
120
123
127 inline config_t config() const
128 {
129 return _cfg;
130 }
135 inline void config(const config_t& cfg)
136 {
137 _cfg = cfg;
138 }
140
143
147 inline virtual uint16_t resolutionWidth() const
148 {
149 return 0;
150 }
155 inline virtual uint16_t resolutionHeight() const
156 {
157 return 0;
158 }
164 inline uint16_t imageWidth(const bool raw) const
165 {
166 return resolutionWidth() >> (raw ? 0 : 1);
167 }
173 inline uint16_t imageHeight(const bool raw) const
174 {
175 return resolutionHeight() >> (raw ? 0 : 1);
176 }
181 inline virtual uint16_t minimumUserID() const
182 {
183 return MINIMUM_USER_ID;
184 }
189 inline virtual uint16_t maximumUserID() const
190 {
191 return MAXIMUM_USER_ID;
192 }
194
197
209 bool writeRegistrationMode(const fpc1xxx::Mode mode);
216 bool readComparisonLevel(uint8_t& lv);
224 bool writeComparisonLevel(const uint8_t lv);
232 bool writeBaudRate(const fpc1xxx::BaudRate baud);
238 bool readTimeout(uint8_t& timeout);
244 bool writeTimeout(const uint8_t timeout);
246
249
254 bool readRegisteredUserCount(uint16_t& count);
261 bool readUser(uint8_t& permission, const uint16_t user_id);
267 bool readAllUser(std::vector<fpc1xxx::User>& v);
274 bool readUserCharacteristic(uint8_t characteristic[193], const uint16_t user_id);
282 bool findAvailableUserID(uint16_t& user_id, const uint16_t low = 0, const uint16_t high = 0);
288 bool deleteUser(const uint16_t user_id);
293 bool deleteAllUsers();
295
298
306 bool registerFinger(const uint16_t user_id, const uint8_t permission, const uint8_t step = 4);
313 bool verifyFinger(bool& match, const uint16_t user_id);
320 bool identifyFinger(uint16_t& user_id, uint8_t& permission);
326 bool scanCharacteristic(uint8_t characteristic[193]);
336 inline virtual bool captureImage(std::vector<uint8_t>& img, const bool raw = false)
337 {
338 return capture_image(img, raw);
339 }
347 bool registerCharacteristic(const uint16_t user_id, const uint8_t permission, const uint8_t characteristic[193]);
355 bool verifyCharacteristic(bool& match, const uint16_t user_id, const uint8_t characteristic[193]);
362 bool identifyCharacteristic(uint16_t& user_id, const uint8_t characteristic[193]);
369 bool compareCharacteristic(bool& match, const uint8_t characteristic[193]);
371
377 bool readSerialNumber(uint32_t& no);
383 bool readVersion(char str[9]);
384
390 bool sleep(void);
391
392protected:
393 inline bool is_valid_user_id(const uint16_t user_id) const
394 {
395 return user_id >= minimumUserID() && user_id <= maximumUserID();
396 }
397 bool transceive_command(Frame& res, const uint8_t cmd, const uint8_t p1 = 0, const uint8_t p2 = 0,
398 const uint8_t p3 = 0);
399 bool capture_image(std::vector<uint8_t>& img, const bool full = false);
400
401private:
402 config_t _cfg{};
403};
404
413class UnitFPC1020A : public UnitFPC1XXX {
414 M5_UNIT_COMPONENT_HPP_BUILDER(UnitFPC1020A, 0x00);
415
416public:
417 static constexpr uint16_t RESOLUTION_WIDTH{160};
418 static constexpr uint16_t RESOLUTION_HEIGHT{160};
419 static constexpr uint16_t MINIMUM_USER_ID{1};
420 static constexpr uint16_t MAXIMUM_USER_ID{150};
421
423 {
424 }
425 virtual ~UnitFPC1020A() = default;
426
431 virtual bool begin() override;
432
433 inline virtual uint16_t resolutionWidth() const override
434 {
435 return this->RESOLUTION_WIDTH;
436 }
437 inline virtual uint16_t resolutionHeight() const override
438 {
439 return this->RESOLUTION_HEIGHT;
440 }
441 inline virtual uint16_t minimumUserID() const override
442 {
443 return MINIMUM_USER_ID;
444 }
445 inline virtual uint16_t maximumUserID() const override
446 {
447 return MAXIMUM_USER_ID;
448 }
449};
450
451namespace fpc1xxx {
453namespace command {
454
455constexpr uint8_t CMD_REGISTER_FINGER_FIRST{0x01};
456constexpr uint8_t CMD_REGISTER_FINGER_STEP{0x02};
457constexpr uint8_t CMD_REGISTER_FINGER_LAST{0x03};
458constexpr uint8_t CMD_VERIFY_FINGER{0x0B};
459constexpr uint8_t CMD_IDENTIFY_FINGER{0x0C};
460
461constexpr uint8_t CMD_DELETE_USER{0x04};
462constexpr uint8_t CMD_DELETE_ALL_USERS{0x05};
463constexpr uint8_t CMD_READ_REGISTERED_USER_COUNT{0x09};
464constexpr uint8_t CMD_READ_USER_PERMISSION{0x0A};
465constexpr uint8_t CMD_READ_ALL_USER_DATA{0x2B};
466constexpr uint8_t CMD_FIND_UNREGISTERED_USER_ID{0x47};
467
468constexpr uint8_t CMD_BAUD_RATE{0x21};
469constexpr uint8_t CMD_READ_VERSION{0x26};
470constexpr uint8_t CMD_COMPARISON_LEVEL{0x28};
471constexpr uint8_t CMD_REGISTRATION_MODE{0x2D};
472constexpr uint8_t CMD_TIMEOUT{0x2E};
473constexpr uint8_t CMD_READ_SERIAL_NO{0x2A};
474
475constexpr uint8_t CMD_SLEEP{0x2C};
476
477constexpr uint8_t CMD_CAPTURE_IMAGE{0x24};
478
479constexpr uint8_t CMD_SCAN_CHARACTERISTIC{0x23};
480constexpr uint8_t CMD_READ_USER_CHARACTERISTIC{0x31};
481constexpr uint8_t CMD_REGISTER_CHARACTERISTIC{0x41};
482constexpr uint8_t CMD_VERIFY_CHARACTERISTIC{0x42};
483constexpr uint8_t CMD_IDENTIFY_CHARACTERISTIC{0x43};
484constexpr uint8_t CMD_COMPARE_CHARACTERISTIC{0x44};
485
486} // namespace command
488
490namespace detail {
491using Frame = UnitFPC1XXX::Frame;
492
493constexpr uint8_t MARKER{0xF5};
494
496uint8_t xorSum(const uint8_t* data, const uint16_t len);
498bool is_valid_sum(const Frame& response, const bool check_marker = true);
500bool is_valid_payload(const uint8_t* data, const uint16_t len);
501} // namespace detail
503
504} // namespace fpc1xxx
505
506} // namespace unit
507} // namespace m5
508
509#endif
For FPC1020A.
Definition unit_FPC1xxx.hpp:413
virtual uint16_t maximumUserID() const override
Get the maximum user ID.
Definition unit_FPC1xxx.hpp:445
virtual bool begin() override
Begin communication with the unit.
Definition unit_FPC1xxx.cpp:707
virtual uint16_t minimumUserID() const override
Get the minimum user ID.
Definition unit_FPC1xxx.hpp:441
virtual uint16_t resolutionWidth() const override
Gets the width of resolution.
Definition unit_FPC1xxx.hpp:433
virtual uint16_t resolutionHeight() const override
Gets the height of resolution.
Definition unit_FPC1xxx.hpp:437
Base class for FPC1xxx family.
Definition unit_FPC1xxx.hpp:86
bool readVersion(char str[9])
Read the version string.
Definition unit_FPC1xxx.cpp:658
bool readRegisteredUserCount(uint16_t &count)
Read the number of registered users.
Definition unit_FPC1xxx.cpp:266
bool identifyFinger(uint16_t &user_id, uint8_t &permission)
Identify finger (1:N)
Definition unit_FPC1xxx.cpp:465
bool deleteUser(const uint16_t user_id)
Delete user data.
Definition unit_FPC1xxx.cpp:388
bool verifyCharacteristic(bool &match, const uint16_t user_id, const uint8_t characteristic[193])
Verify specific user characteristic (1:1)
Definition unit_FPC1xxx.cpp:567
virtual uint16_t minimumUserID() const
Get the minimum user ID.
Definition unit_FPC1xxx.hpp:181
virtual uint16_t resolutionHeight() const
Gets the height of resolution.
Definition unit_FPC1xxx.hpp:155
bool compareCharacteristic(bool &match, const uint8_t characteristic[193])
Compare characteristic.
Definition unit_FPC1xxx.cpp:620
uint16_t imageWidth(const bool raw) const
Get the image width.
Definition unit_FPC1xxx.hpp:164
bool readUserCharacteristic(uint8_t characteristic[193], const uint16_t user_id)
Read the user characteristic data.
Definition unit_FPC1xxx.cpp:328
config_t config() const
Gets the configuration.
Definition unit_FPC1xxx.hpp:127
uint16_t imageHeight(const bool raw) const
Get the image height.
Definition unit_FPC1xxx.hpp:173
bool deleteAllUsers()
Delete all user data.
Definition unit_FPC1xxx.cpp:399
virtual bool captureImage(std::vector< uint8_t > &img, const bool raw=false)
Capture finger image.
Definition unit_FPC1xxx.hpp:336
virtual bool begin() override
Begin communication with the unit.
Definition unit_FPC1xxx.cpp:146
bool writeRegistrationMode(const fpc1xxx::Mode mode)
Write the registration mode.
Definition unit_FPC1xxx.cpp:208
bool findAvailableUserID(uint16_t &user_id, const uint16_t low=0, const uint16_t high=0)
Find the unregistered user id in specific range.
Definition unit_FPC1xxx.cpp:364
bool readSerialNumber(uint32_t &no)
Read the serial number (24 bits)
Definition unit_FPC1xxx.cpp:643
bool identifyCharacteristic(uint16_t &user_id, const uint8_t characteristic[193])
Identify characteristic (1:N)
Definition unit_FPC1xxx.cpp:597
bool writeBaudRate(const fpc1xxx::BaudRate baud)
Write the baud rate.
Definition unit_FPC1xxx.cpp:237
bool verifyFinger(bool &match, const uint16_t user_id)
Verify specific user finger (1:1)
Definition unit_FPC1xxx.cpp:448
bool sleep(void)
Go to deep sleep.
Definition unit_FPC1xxx.cpp:682
bool readUser(uint8_t &permission, const uint16_t user_id)
Read the user permission.
Definition unit_FPC1xxx.cpp:279
bool registerFinger(const uint16_t user_id, const uint8_t permission, const uint8_t step=4)
Register finger.
Definition unit_FPC1xxx.cpp:405
bool registerCharacteristic(const uint16_t user_id, const uint8_t permission, const uint8_t characteristic[193])
Register characteristic.
Definition unit_FPC1xxx.cpp:533
virtual uint16_t maximumUserID() const
Get the maximum user ID.
Definition unit_FPC1xxx.hpp:189
bool writeComparisonLevel(const uint8_t lv)
Write the comparison level.
Definition unit_FPC1xxx.cpp:227
bool readTimeout(uint8_t &timeout)
Read the timeout.
Definition unit_FPC1xxx.cpp:248
void config(const config_t &cfg)
Set the configuration.
Definition unit_FPC1xxx.hpp:135
bool scanCharacteristic(uint8_t characteristic[193])
Scan characteristic.
Definition unit_FPC1xxx.cpp:480
bool readAllUser(std::vector< fpc1xxx::User > &v)
Get the all user data.
Definition unit_FPC1xxx.cpp:297
virtual uint16_t resolutionWidth() const
Gets the width of resolution.
Definition unit_FPC1xxx.hpp:147
bool writeTimeout(const uint8_t timeout)
Write the timeout.
Definition unit_FPC1xxx.cpp:260
bool readRegistrationMode(fpc1xxx::Mode &mode)
Read the registration mode.
Definition unit_FPC1xxx.cpp:191
bool readComparisonLevel(uint8_t &lv)
Read the comparison level.
Definition unit_FPC1xxx.cpp:215
Top level namespace of M5Stack.
Unit-related namespace.
Settings for begin.
Definition unit_FPC1xxx.hpp:117
uint32_t timeout_ms
Serial I/O timeout (ms)
Definition unit_FPC1xxx.hpp:118
User data.
Definition unit_FPC1xxx.hpp:61
uint8_t permission
permission (Value can be 1, 2, or 3)
Definition unit_FPC1xxx.hpp:66
Mode
Registration mode.
Definition unit_FPC1xxx.hpp:52
@ ProhibitDuplicate
Characteristic duplication prohibited.
@ AllowDuplicate
Allow duplicate registrations.
ACK
ACK code.
Definition unit_FPC1xxx.hpp:25
@ Full
Capacity full.
@ Occupied
ID occupied.
@ ExistUser
User exists.
BaudRate
Connection baud rate.
Definition unit_FPC1xxx.hpp:39
@ Baud19200
19200 baud (as default)