M5Unit-FINGER 0.0.2 git rev:9f22200
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
108 virtual bool begin() override;
109
114 struct config_t {
115 uint32_t timeout_ms{1000 * 4};
116 };
117
120
122 {
123 return _cfg;
124 }
126 inline void config(const config_t& cfg)
127 {
128 _cfg = cfg;
129 }
131
135 inline virtual uint16_t resolutionWidth() const
136 {
137 return 0;
138 }
140 inline virtual uint16_t resolutionHeight() const
141 {
142 return 0;
143 }
145 inline uint16_t imageWidth(const bool raw) const
146 {
147 return resolutionWidth() >> (raw ? 0 : 1);
148 }
150 inline uint16_t imageHeight(const bool raw) const
151 {
152 return resolutionHeight() >> (raw ? 0 : 1);
153 }
155 inline virtual uint16_t minimumUserID() const
156 {
157 return MINIMUM_USER_ID;
158 }
160 inline virtual uint16_t maximumUserID() const
161 {
162 return MAXIMUM_USER_ID;
163 }
165
168
180 bool writeRegistrationMode(const fpc1xxx::Mode mode);
187 bool readComparisonLevel(uint8_t& lv);
195 bool writeComparisonLevel(const uint8_t lv);
203 bool writeBaudRate(const fpc1xxx::BaudRate baud);
209 bool readTimeout(uint8_t& timeout);
215 bool writeTimeout(const uint8_t timeout);
217
220
225 bool readRegisteredUserCount(uint16_t& count);
232 bool readUser(uint8_t& permission, const uint16_t user_id);
238 bool readAllUser(std::vector<fpc1xxx::User>& v);
245 bool readUserCharacteristic(uint8_t characteristic[193], const uint16_t user_id);
253 bool findAvailableUserID(uint16_t& user_id, const uint16_t low = 0, const uint16_t high = 0);
259 bool deleteUser(const uint16_t user_id);
264 bool deleteAllUsers();
266
269
277 bool registerFinger(const uint16_t user_id, const uint8_t permission, const uint8_t step = 4);
284 bool verifyFinger(bool& match, const uint16_t user_id);
291 bool identifyFinger(uint16_t& user_id, uint8_t& permission);
296 bool scanCharacteristic(uint8_t characteristic[193]);
306 inline virtual bool captureImage(std::vector<uint8_t>& img, const bool raw = false)
307 {
308 return capture_image(img, raw);
309 }
317 bool registerCharacteristic(const uint16_t user_id, const uint8_t permission, const uint8_t characteristic[193]);
325 bool verifyCharacteristic(bool& match, const uint16_t user_id, const uint8_t characteristic[193]);
332 bool identifyCharacteristic(uint16_t& user_id, const uint8_t characteristic[193]);
339 bool compareCharacteristic(bool& match, const uint8_t characteristic[193]);
341
347 bool readSerialNumber(uint32_t& no);
353 bool readVersion(char str[9]);
354
360 bool sleep(void);
361
362protected:
363 inline bool is_valid_user_id(const uint16_t user_id) const
364 {
365 return user_id >= minimumUserID() && user_id <= maximumUserID();
366 }
367 bool transceive_command(Frame& res, const uint8_t cmd, const uint8_t p1 = 0, const uint8_t p2 = 0,
368 const uint8_t p3 = 0);
369 bool capture_image(std::vector<uint8_t>& img, const bool full = false);
370
371private:
372 config_t _cfg{};
373};
374
383class UnitFPC1020A : public UnitFPC1XXX {
384 M5_UNIT_COMPONENT_HPP_BUILDER(UnitFPC1020A, 0x00);
385
386public:
387 static constexpr uint16_t RESOLUTION_WIDTH{160};
388 static constexpr uint16_t RESOLUTION_HEIGHT{160};
389 static constexpr uint16_t MINIMUM_USER_ID{1};
390 static constexpr uint16_t MAXIMUM_USER_ID{150};
391
393 {
394 }
395 virtual ~UnitFPC1020A() = default;
396
398 virtual bool begin() override;
399
400 inline virtual uint16_t resolutionWidth() const override
401 {
402 return this->RESOLUTION_WIDTH;
403 }
404 inline virtual uint16_t resolutionHeight() const override
405 {
406 return this->RESOLUTION_HEIGHT;
407 }
408 inline virtual uint16_t minimumUserID() const override
409 {
410 return MINIMUM_USER_ID;
411 }
412 inline virtual uint16_t maximumUserID() const override
413 {
414 return MAXIMUM_USER_ID;
415 }
416};
417
418namespace fpc1xxx {
420namespace command {
421
422constexpr uint8_t CMD_REGISTER_FINGER_FIRST{0x01};
423constexpr uint8_t CMD_REGISTER_FINGER_STEP{0x02};
424constexpr uint8_t CMD_REGISTER_FINGER_LAST{0x03};
425constexpr uint8_t CMD_VERIFY_FINGER{0x0B};
426constexpr uint8_t CMD_IDENTIFY_FINGER{0x0C};
427
428constexpr uint8_t CMD_DELETE_USER{0x04};
429constexpr uint8_t CMD_DELETE_ALL_USERS{0x05};
430constexpr uint8_t CMD_READ_REGISTERED_USER_COUNT{0x09};
431constexpr uint8_t CMD_READ_USER_PERMISSION{0x0A};
432constexpr uint8_t CMD_READ_ALL_USER_DATA{0x2B};
433constexpr uint8_t CMD_FIND_UNREGISTERD_USER_ID{0x47};
434
435constexpr uint8_t CMD_BAUD_RATE{0x21};
436constexpr uint8_t CMD_READ_VERSION{0x26};
437constexpr uint8_t CMD_COMPARISON_LEVEL{0x28};
438constexpr uint8_t CMD_REGISTRATION_MODE{0x2D};
439constexpr uint8_t CMD_TIMEOUT{0x2E};
440constexpr uint8_t CMD_READ_SERIAL_NO{0x2A};
441
442constexpr uint8_t CMD_SLEEP{0x2C};
443
444constexpr uint8_t CMD_CAPTURE_IMAGE{0x24};
445
446constexpr uint8_t CMD_SCAN_CHARACTERISTIC{0x23};
447constexpr uint8_t CMD_READ_USER_CHARACTERISTIC{0x31};
448constexpr uint8_t CMD_REGISTER_CHARACTERISTIC{0x41};
449constexpr uint8_t CMD_VERIFY_CHARACTERISTIC{0x42};
450constexpr uint8_t CMD_IDENTIFY_CHARACTERISTIC{0x43};
451constexpr uint8_t CMD_COMPARE_CHARACTERISTIC{0x44};
452
453} // namespace command
456namespace detail {
457using Frame = UnitFPC1XXX::Frame;
458
459constexpr uint8_t MARKER{0xF5};
460
462uint8_t xorSum(const uint8_t* data, const uint16_t len);
464bool is_valid_sum(const Frame response, const bool check_marker = true);
466bool is_valid_payload(const uint8_t* data, const uint16_t len);
467} // namespace detail
469
470} // namespace fpc1xxx
471
472} // namespace unit
473} // namespace m5
474
475#endif
For FPC1020A.
Definition unit_FPC1xxx.hpp:383
virtual uint16_t maximumUserID() const override
Get the maximum user ID.
Definition unit_FPC1xxx.hpp:412
virtual bool begin() override
Begin communication with the unit.
Definition unit_FPC1xxx.cpp:662
virtual uint16_t minimumUserID() const override
Get the minimum user ID.
Definition unit_FPC1xxx.hpp:408
virtual uint16_t resolutionWidth() const override
Gets the width of resolution.
Definition unit_FPC1xxx.hpp:400
virtual uint16_t resolutionHeight() const override
Gets the height of resolution.
Definition unit_FPC1xxx.hpp:404
Base class for FPC1xxx family.
Definition unit_FPC1xxx.hpp:86
bool readVersion(char str[9])
Read the version string.
Definition unit_FPC1xxx.cpp:610
bool readRegisteredUserCount(uint16_t &count)
Read the number of registered users.
Definition unit_FPC1xxx.cpp:244
bool identifyFinger(uint16_t &user_id, uint8_t &permission)
Identify finger (1:N)
Definition unit_FPC1xxx.cpp:435
bool deleteUser(const uint16_t user_id)
Delete user data.
Definition unit_FPC1xxx.cpp:358
bool verifyCharacteristic(bool &match, const uint16_t user_id, const uint8_t characteristic[193])
Verify specific user characteristic (1:1)
Definition unit_FPC1xxx.cpp:533
virtual uint16_t minimumUserID() const
Get the minimum user ID.
Definition unit_FPC1xxx.hpp:155
virtual uint16_t resolutionHeight() const
Gets the height of resolution.
Definition unit_FPC1xxx.hpp:140
bool compareCharacteristic(bool &match, const uint8_t characteristic[193])
Compare characteristic.
Definition unit_FPC1xxx.cpp:577
uint16_t imageWidth(const bool raw) const
Get the image width.
Definition unit_FPC1xxx.hpp:145
bool readUserCharacteristic(uint8_t characteristic[193], const uint16_t user_id)
Read the user characteristic data.
Definition unit_FPC1xxx.cpp:302
uint16_t imageHeight(const bool raw) const
Get the resolution height.
Definition unit_FPC1xxx.hpp:150
bool deleteAllUsers()
Delete all user data.
Definition unit_FPC1xxx.cpp:369
virtual bool captureImage(std::vector< uint8_t > &img, const bool raw=false)
Capture finger image.
Definition unit_FPC1xxx.hpp:306
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:186
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:334
bool readSerialNumber(uint32_t &no)
Read the serial number (24 bits)
Definition unit_FPC1xxx.cpp:595
bool identifyCharacteristic(uint16_t &user_id, const uint8_t characteristic[193])
Identify characteristic (1:N)
Definition unit_FPC1xxx.cpp:559
bool writeBaudRate(const fpc1xxx::BaudRate baud)
Write the baud rate.
Definition unit_FPC1xxx.cpp:215
bool verifyFinger(bool &match, const uint16_t user_id)
Verify specific user finger (1:1)
Definition unit_FPC1xxx.cpp:418
bool sleep(void)
Go to deep sleep.
Definition unit_FPC1xxx.cpp:633
bool readUser(uint8_t &permission, const uint16_t user_id)
Read the user permission.
Definition unit_FPC1xxx.cpp:257
bool registerFinger(const uint16_t user_id, const uint8_t permission, const uint8_t step=4)
Register finger.
Definition unit_FPC1xxx.cpp:375
bool registerCharacteristic(const uint16_t user_id, const uint8_t permission, const uint8_t characteristic[193])
Register characteristic.
Definition unit_FPC1xxx.cpp:503
config_t config()
Gets the configuration.
Definition unit_FPC1xxx.hpp:121
virtual uint16_t maximumUserID() const
Get the maximum user ID.
Definition unit_FPC1xxx.hpp:160
bool writeComparisonLevel(const uint8_t lv)
Write the comparison level.
Definition unit_FPC1xxx.cpp:205
bool readTimeout(uint8_t &timeout)
Read the timeout.
Definition unit_FPC1xxx.cpp:226
void config(const config_t &cfg)
Set the configuration.
Definition unit_FPC1xxx.hpp:126
bool scanCharacteristic(uint8_t characteristic[193])
Scan characteristic.
Definition unit_FPC1xxx.cpp:450
bool readAllUser(std::vector< fpc1xxx::User > &v)
Get the all user data.
Definition unit_FPC1xxx.cpp:275
virtual uint16_t resolutionWidth() const
Gets the width of resolution.
Definition unit_FPC1xxx.hpp:135
bool writeTimeout(const uint8_t timeout)
Write the timeout.
Definition unit_FPC1xxx.cpp:238
bool readRegistrationMode(fpc1xxx::Mode &mode)
Read the registration mode.
Definition unit_FPC1xxx.cpp:174
bool readComparisonLevel(uint8_t &lv)
Read the comparison level.
Definition unit_FPC1xxx.cpp:193
Top level namespace of M5stack.
Unit-related namespace.
Settings for begin.
Definition unit_FPC1xxx.hpp:114
uint32_t timeout_ms
Serial I/O timeout (ms)
Definition unit_FPC1xxx.hpp:115
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)