Skip to content

Commit 342df7e

Browse files
committed
Fixes to align with the latest firmware specifications
1 parent 63c21dd commit 342df7e

4 files changed

Lines changed: 132 additions & 66 deletions

File tree

examples/UnitUnified/UnitFinger2/Automatic/AutoMatic.ino renamed to examples/UnitUnified/UnitFinger2/Automatic/Automatic.ino

File renamed without changes.

src/unit/unit_Finger2.cpp

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,13 @@ bool UnitFinger2::begin()
137137
M5_LIB_LOGE("Failed to ReadSysPara");
138138
return false;
139139
}
140-
_pageCapacity = params.capacity;
140+
_pageCapacity = params.database_capacity;
141141
M5_LIB_LOGD("Capacity:%u", _pageCapacity);
142142

143143
M5_LIB_LOGD("---SystemBasicParams %zu---", sizeof(params));
144144
M5_LIB_LOGD("Status: %04X", params.status);
145-
M5_LIB_LOGD("TmpSize: %04X", params.template_size);
146-
M5_LIB_LOGD("Capacity:%04X", params.capacity);
145+
M5_LIB_LOGD("Type: %04X", params.sensor_type);
146+
M5_LIB_LOGD("DBCap: %04X", params.database_capacity);
147147
M5_LIB_LOGD("ScoreLv: %04X", params.score_level);
148148
M5_LIB_LOGD("Address: %08X", params.address);
149149
M5_LIB_LOGD("PktSz: %04X", params.packet_size);
@@ -194,10 +194,10 @@ bool UnitFinger2::readSystemParams(finger2::SystemBasicParams& params)
194194

195195
Packet pkt{};
196196
if (transceive_command(pkt, CMD_READ_SYSTEM_PARAMETER, _address) && pkt.size() == 28) {
197-
params.status = ((uint16_t)pkt[10] << 8) | pkt[11];
198-
params.template_size = ((uint16_t)pkt[12] << 8) | pkt[13];
199-
params.capacity = ((uint16_t)pkt[14] << 8) | pkt[15];
200-
params.score_level = ((uint16_t)pkt[16] << 8) | pkt[17];
197+
params.status = ((uint16_t)pkt[10] << 8) | pkt[11];
198+
params.sensor_type = ((uint16_t)pkt[12] << 8) | pkt[13];
199+
params.database_capacity = ((uint16_t)pkt[14] << 8) | pkt[15];
200+
params.score_level = ((uint16_t)pkt[16] << 8) | pkt[17];
201201
params.address = ((uint16_t)pkt[18] << 24) | ((uint16_t)pkt[19] << 16) | ((uint16_t)pkt[20] << 8) | pkt[21];
202202
params.packet_size = ((uint16_t)pkt[22] << 8) | pkt[23];
203203
params.baud_rate = ((uint16_t)pkt[24] << 8) | pkt[25];
@@ -563,13 +563,7 @@ bool UnitFinger2::clear()
563563

564564
bool UnitFinger2::writeSystemRegister(const finger2::RegisterID reg_id, const uint8_t value)
565565
{
566-
auto reg = m5::stl::to_underlying(reg_id);
567-
if (reg == 4 /* internal baud rate */ || reg > 11) {
568-
M5_LIB_LOGE("Invalid reg_id %u", reg_id);
569-
return false;
570-
}
571-
572-
// parameter check
566+
// Check args
573567
switch (reg_id) {
574568
case RegisterID::ScoreLevel:
575569
if (value < 1 || value > 5) {
@@ -583,20 +577,19 @@ bool UnitFinger2::writeSystemRegister(const finger2::RegisterID reg_id, const ui
583577
return false;
584578
}
585579
break;
586-
case RegisterID::SecurityLevel:
587-
if (value > 3) {
588-
M5_LIB_LOGE("SecurityLevel must be 0 - 3 (%u)", value);
589-
return false;
590-
}
591580
default:
592-
break;
581+
M5_LIB_LOGE("Invalid reg_id %u", reg_id);
582+
return false;
593583
}
594584

585+
#if 0
595586
if (reg >= 10) {
596587
reg = 0x10 + (reg - 10); // DEC 10,11... => HEX 0x10, 0x11,...
597588
}
589+
#endif
590+
598591
Packet pkt{};
599-
uint8_t params[2]{reg, value};
592+
uint8_t params[2]{m5::stl::to_underlying(reg_id), value};
600593
return transceive_command(pkt, CMD_WRITE_REGISTER, _address, params, sizeof(params));
601594
}
602595

src/unit/unit_Finger2.hpp

Lines changed: 12 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -64,51 +64,26 @@ enum class LEDColor : uint8_t {
6464

6565
/*!
6666
@enum RegisterID
67-
@brief writeReg() target
67+
@brief PS_WriteReg target register
6868
*/
6969
enum class RegisterID : uint8_t {
70-
DelayTime, //!< 0x00:The time delay for sending data packets
71-
EnrollTimes, //!< 0x01:Enroll times
72-
ImageFormat, //!< 0x02:Image format (only 0)
73-
EnrollLogic, /*!< 0x03:The logic for capturing fingerprints during registration (0 as default)
74-
|Logic|Description|
75-
|---|---|
76-
| 0 | No logical relationship |
77-
| 1 | Requires no relationship between enrolled fingers|
78-
| 2 | Requires a relationship between enrolled fingers|
79-
*/
80-
ScoreLevel = 5, //!< 0x05:Match threshold (Lenient:1 - Strict:5) (3 as default)
81-
PacketSize, //!< 0x06:Data packet size (0:32,1:64,2:128,3:256) (2 as default)
82-
SecurityLevel, /*!< 0x07:Encryption level (0 as default)
83-
<ul>
84-
<li>0: Supports all instructions except the security instruction set</li>
85-
<li>1: No security algorithms <br>
86-
Does not support the security instruction set, template upload, template download, or image
87-
download </li>
88-
<li>2: Reserved</li>
89-
<li>3: Supports AES (128-bit, ECB) <br>
90-
Does not support template upload, template download, image download, exact match, or
91-
search</li>
92-
</ol>
93-
@warning Once set, changes are not permitted
94-
*/
95-
ProductSerial = 10, //!< 0x0A:Product model number
96-
LEDControl, //!< 0x0B:Turn on or off the auto-light feature
70+
ScoreLevel = 5, //!< 0x05:Match threshold (Lenient:1 - Strict:5) (3 as default)
71+
PacketSize, //!< 0x06:Data packet size (0:32,1:64,2:128,3:256) (1 as default)
9772
};
9873

9974
/*!
10075
@struct SystemBasicParams
10176
@brief The module’s basic parametrs
10277
*/
10378
struct SystemBasicParams {
104-
uint16_t status{}; //!< System operational status
105-
uint16_t template_size{}; //!< Fingerprint template capacity (Not the actual template size)
106-
uint16_t capacity{}; //!< Fingerprint library capacity
107-
uint16_t score_level{}; //!< Match threshold (See also RegisterID::ScoreLevel)
108-
uint32_t address{}; //!< Device address
109-
uint16_t packet_size{}; //!< Packet size (See also RegisterID::PacketSize)
110-
uint16_t baud_rate{}; //!< Baud rate between STM32 and device
111-
//!< (The value multiplied by 9600 is the actual)
79+
uint16_t status{}; //!< System operational status
80+
uint16_t sensor_type{}; //!< Sensor type
81+
uint16_t database_capacity{}; //!< Fingerprint database capacity
82+
uint16_t score_level{}; //!< Match threshold (See also RegisterID::ScoreLevel)
83+
uint32_t address{}; //!< Device address
84+
uint16_t packet_size{}; //!< Packet size (See also RegisterID::PacketSize)
85+
uint16_t baud_rate{}; //!< Baud rate between STM32 and device
86+
//!< (The value multiplied by 9600 is the actual)
11287
} __attribute__((packed));
11388

11489
using auto_enroll_flag_t = uint16_t; //!< Flags for autoEnroll
@@ -273,7 +248,7 @@ class UnitFinger2 : public Component {
273248
M5_UNIT_COMPONENT_HPP_BUILDER(UnitFinger2, 0x00);
274249

275250
public:
276-
static constexpr uint32_t DEFAULT_MODULE_ADDRESS{0xFFFFFFFF}; //!< DEFAULT_ADDRESS
251+
static constexpr uint32_t DEFAULT_MODULE_ADDRESS{0xFFFFFFFF}; //!< Default device address
277252
using Packet = std::vector<uint8_t>;
278253

279254
static constexpr uint16_t IMAGE_WIDTH{80}; //!< Capture image width

test/embedded/test_finger2/finger2_test.cpp

Lines changed: 106 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,24 @@ class TestFinger2 : public UARTComponentTestBase<UnitFinger2, bool> {
7070
s.begin(115200, SERIAL_8N1, pin_num_in, pin_num_out);
7171
return &s;
7272
}
73+
74+
void reset_serial(const uint32_t baud = 19200)
75+
{
76+
auto pin_num_in = M5.getPin(m5::pin_name_t::port_c_rxd);
77+
auto pin_num_out = M5.getPin(m5::pin_name_t::port_c_txd);
78+
if (pin_num_in < 0 || pin_num_out < 0) {
79+
// M5_LOGW("PortC is not available");
80+
Wire.end();
81+
pin_num_in = M5.getPin(m5::pin_name_t::port_a_pin1);
82+
pin_num_out = M5.getPin(m5::pin_name_t::port_a_pin2);
83+
}
84+
// M5_LOGI("%u getPin: %d,%d", baud, pin_num_in, pin_num_out);
85+
serial->end();
86+
serial->begin(baud, SERIAL_8N1, pin_num_in, pin_num_out);
87+
while (serial->available()) {
88+
serial->read();
89+
}
90+
}
7391
};
7492

7593
// INSTANTIATE_TEST_SUITE_P(ParamValues, TestFinger2, ::testing::Values(false, true));
@@ -85,7 +103,34 @@ constexpr WorkMode workmode_table[] = {
85103

86104
constexpr LEDMode led_table[] = {
87105
LEDMode::Bleath, LEDMode::Blink, LEDMode::On, LEDMode::Off, LEDMode::Fadein, LEDMode::Fadeout,
106+
};
107+
constexpr auto_enroll_flag_t enroll_flags_table[] = {
108+
0,
109+
auto_enroll_flag::DONT_RETURN_INTERMEDIATE_RESULTS,
110+
auto_enroll_flag::ALLOW_OVERWRITE_PAGE,
111+
auto_enroll_flag::DONT_RETURN_INTERMEDIATE_RESULTS | auto_enroll_flag::ALLOW_OVERWRITE_PAGE,
112+
auto_enroll_flag::PROHIBIT_DUPLICATE_TEMPLATE,
113+
auto_enroll_flag::PROHIBIT_DUPLICATE_TEMPLATE | auto_enroll_flag::DONT_RETURN_INTERMEDIATE_RESULTS,
114+
auto_enroll_flag::PROHIBIT_DUPLICATE_TEMPLATE | auto_enroll_flag::PROHIBIT_DUPLICATE_TEMPLATE,
115+
auto_enroll_flag::PROHIBIT_DUPLICATE_TEMPLATE | auto_enroll_flag::DONT_RETURN_INTERMEDIATE_RESULTS |
116+
auto_enroll_flag::ALLOW_OVERWRITE_PAGE,
117+
auto_enroll_flag::NO_NEED_RELAESE_FINGER,
118+
auto_enroll_flag::NO_NEED_RELAESE_FINGER | auto_enroll_flag::DONT_RETURN_INTERMEDIATE_RESULTS,
119+
auto_enroll_flag::NO_NEED_RELAESE_FINGER | auto_enroll_flag::ALLOW_OVERWRITE_PAGE,
120+
auto_enroll_flag::NO_NEED_RELAESE_FINGER | auto_enroll_flag::DONT_RETURN_INTERMEDIATE_RESULTS |
121+
auto_enroll_flag::ALLOW_OVERWRITE_PAGE,
122+
auto_enroll_flag::NO_NEED_RELAESE_FINGER | auto_enroll_flag::PROHIBIT_DUPLICATE_TEMPLATE,
123+
auto_enroll_flag::NO_NEED_RELAESE_FINGER | auto_enroll_flag::PROHIBIT_DUPLICATE_TEMPLATE |
124+
auto_enroll_flag::DONT_RETURN_INTERMEDIATE_RESULTS,
125+
auto_enroll_flag::NO_NEED_RELAESE_FINGER | auto_enroll_flag::PROHIBIT_DUPLICATE_TEMPLATE |
126+
auto_enroll_flag::PROHIBIT_DUPLICATE_TEMPLATE,
127+
auto_enroll_flag::NO_NEED_RELAESE_FINGER | auto_enroll_flag::PROHIBIT_DUPLICATE_TEMPLATE |
128+
auto_enroll_flag::DONT_RETURN_INTERMEDIATE_RESULTS | auto_enroll_flag::ALLOW_OVERWRITE_PAGE,
129+
};
88130

131+
constexpr auto_identify_flag_t identify_flags_table[] = {
132+
0,
133+
auto_identify_flag::DONT_RETURN_INTERMEDIATE_RESULTS,
89134
};
90135

91136
auto rng = std::default_random_engine{};
@@ -111,7 +156,7 @@ TEST_P(TestFinger2, Basic)
111156
SCOPED_TRACE(ustr);
112157

113158
/////
114-
// return;
159+
return;
115160

116161
auto cfg = unit->config();
117162

@@ -166,8 +211,9 @@ TEST_P(TestFinger2, Basic)
166211
SystemBasicParams params{};
167212
EXPECT_TRUE(unit->readSystemParams(params));
168213
EXPECT_NE(params.status, 0U);
169-
EXPECT_EQ(params.template_size, 0x2EC8u);
170-
EXPECT_EQ(params.capacity, 100u);
214+
// EXPECT_EQ(params.template_size, 0x2EC8u);
215+
// EXPECT_EQ(params.sensor_type,0x????);
216+
EXPECT_EQ(params.database_capacity, 100u);
171217
EXPECT_EQ(params.score_level, cfg.score_level);
172218
EXPECT_EQ(params.address, 0xFFFFFFFFu);
173219
EXPECT_GE(params.packet_size, 0u);
@@ -196,9 +242,9 @@ TEST_P(TestFinger2, Basic)
196242
EXPECT_FALSE(unit->writeSystemRegister(RegisterID::PacketSize, 4));
197243
EXPECT_FALSE(unit->writeSystemRegister(RegisterID::PacketSize, 255));
198244

199-
EXPECT_TRUE(unit->writeSystemRegister(RegisterID::PacketSize, 2));
245+
EXPECT_TRUE(unit->writeSystemRegister(RegisterID::PacketSize, 1));
200246
EXPECT_TRUE(unit->readSystemParams(params));
201-
EXPECT_EQ(params.packet_size, 2);
247+
EXPECT_EQ(params.packet_size, 1);
202248

203249
uint8_t info[512]{};
204250
uint8_t info_empty[512]{};
@@ -236,7 +282,7 @@ TEST_P(TestFinger2, LED)
236282
SCOPED_TRACE(ustr);
237283

238284
/////
239-
// return;
285+
return;
240286

241287
EXPECT_TRUE(unit->writeSleepTime(10));
242288

@@ -292,7 +338,7 @@ TEST_P(TestFinger2, Notepad)
292338
SCOPED_TRACE(ustr);
293339

294340
/////
295-
// return;
341+
return;
296342

297343
uint8_t buf[32]{};
298344
constexpr uint8_t empty[32]{};
@@ -371,7 +417,7 @@ TEST_P(TestFinger2, Template)
371417
SCOPED_TRACE(ustr);
372418

373419
/////
374-
// return;
420+
return;
375421

376422
std::vector<uint8_t> tbuf{};
377423
tbuf.resize(UnitFinger2::TEMPLATE_SIZE);
@@ -546,6 +592,9 @@ TEST_P(TestFinger2, Finger)
546592
{
547593
SCOPED_TRACE(ustr);
548594

595+
/////
596+
return;
597+
549598
for (auto&& wm : workmode_table) {
550599
auto s = m5::utility::formatString("WorkMode:%u", wm);
551600
SCOPED_TRACE(s.c_str());
@@ -655,6 +704,55 @@ TEST_P(TestFinger2, Finger)
655704
}
656705
}
657706

707+
TEST_P(TestFinger2, Automatic)
708+
{
709+
SCOPED_TRACE(ustr);
710+
for (auto&& wm : workmode_table) {
711+
auto s = m5::utility::formatString("WorkMode:%u", wm);
712+
SCOPED_TRACE(s.c_str());
713+
EXPECT_TRUE(unit->writeWorkMode(wm));
714+
715+
// In sleep
716+
if (wm == WorkMode::ScheduledSleep) {
717+
wait_sleep(unit.get());
718+
719+
ConfirmCode confirm{};
720+
EXPECT_FALSE(unit->autoEnroll(confirm, 0));
721+
722+
bool matched{};
723+
uint16_t page{}, score{};
724+
EXPECT_FALSE(unit->autoIdentify(matched, page, score));
725+
continue;
726+
}
727+
728+
ConfirmCode confirm{};
729+
EXPECT_FALSE(unit->autoEnroll(confirm, 0));
730+
bool matched{};
731+
uint16_t page{}, score{};
732+
EXPECT_FALSE(unit->autoIdentify(matched, page, score));
733+
734+
EXPECT_FALSE(unit->autoEnroll(confirm, 100));
735+
EXPECT_FALSE(unit->autoEnroll(confirm, 65535));
736+
737+
EXPECT_FALSE(unit->autoEnroll(confirm, 0, 0));
738+
EXPECT_FALSE(unit->autoEnroll(confirm, 0, 6));
739+
EXPECT_FALSE(unit->autoEnroll(confirm, 0, 255));
740+
741+
for (auto&& eflags : enroll_flags_table) {
742+
EXPECT_FALSE(unit->autoEnroll(confirm, 0, 5, eflags));
743+
}
744+
745+
EXPECT_FALSE(unit->autoIdentify(matched, page, score, 100));
746+
EXPECT_FALSE(unit->autoIdentify(matched, page, score, 0xFFFE));
747+
EXPECT_FALSE(unit->autoIdentify(matched, page, score, 0xFFFF, 2));
748+
EXPECT_FALSE(unit->autoIdentify(matched, page, score, 0xFFFF, 255));
749+
750+
for (auto&& iflags : identify_flags_table) {
751+
EXPECT_FALSE(unit->autoIdentify(matched, page, score, 0xFFFF, 0, iflags));
752+
}
753+
}
754+
}
755+
658756
#if 0
659757
// page:0
660758
0x3ffb202c| 00 03 06 09 0C 0F 12 15 18 1B 1E 21 24 27 2A 2D |

0 commit comments

Comments
 (0)