Compare commits

...

1 Commits

Author SHA1 Message Date
luocai
40c60193d1 精简代码,便于同步客户对接。
Some checks failed
Build Applications / PullDocker (push) Failing after 7s
Build Applications / Build (push) Failing after 4s
Windows CI / build (push) Successful in 3m16s
2024-10-14 14:20:45 +08:00
6 changed files with 29 additions and 207 deletions

View File

@ -58,13 +58,12 @@ void Application::onNewEnrollResult(uint16_t userid) {
}); });
} }
void Application::onNewVerifyResult(uint16_t userid, const QString &username, uint16_t elapsed) { void Application::onNewVerifyResult(uint16_t userid, const QString &username) {
m_palmUsername = username; m_palmUsername = username;
m_palmId = userid; m_palmId = userid;
QTimer::singleShot(0, this, [this, userid, username, elapsed]() { QTimer::singleShot(0, this, [this, userid, username]() {
emit newStatusTip(Info, QString("%1,识别耗时: %2ms") emit newStatusTip(Info,
.arg(userid == ModuleCommunication::InvalidUserId ? "未录入用户" : username) QString("%1").arg(userid == ModuleCommunication::InvalidUserId ? "未录入用户" : username));
.arg(elapsed));
}); });
} }
@ -192,24 +191,19 @@ void Application::closeUVC() {
emit uvcOpenedChanged(); emit uvcOpenedChanged();
} }
void Application::verify(bool captureImage, uint8_t timeout) { void Application::verify(uint8_t timeout) {
if (m_communication->currentMessageId() != ModuleCommunication::Idle) { if (m_communication->currentMessageId() != ModuleCommunication::Idle) {
m_communication->reset(); m_communication->reset();
} }
if (captureImage) {
m_communication->verifyExtended(captureImage, timeout);
} else {
m_communication->verify(timeout); m_communication->verify(timeout);
}
m_verifyExtendedMode = captureImage;
} }
void Application::enroll(const QString &username, bool strictMode, uint8_t excludeMode, bool persistence, void Application::enroll(const QString &username, uint8_t timeout) {
uint8_t timeout) {
if (m_communication->currentMessageId() != ModuleCommunication::Idle) { if (m_communication->currentMessageId() != ModuleCommunication::Idle) {
m_communication->reset(); m_communication->reset();
} }
m_communication->enroll(username.toStdString(), strictMode, excludeMode, persistence, timeout); m_communication->enroll(username.toStdString(), timeout);
m_palmUsername = username; m_palmUsername = username;
} }
@ -227,15 +221,6 @@ void Application::deleteAll() {
m_communication->deleteAll(); m_communication->deleteAll();
} }
void Application::enrollExtended(const QString &username, bool strictMode, uint8_t excludeMode, bool persistence,
uint8_t timeout) {
if (m_communication->currentMessageId() != ModuleCommunication::Idle) {
m_communication->reset();
}
m_communication->enrollExtended(username.toStdString(), strictMode, excludeMode, persistence, timeout);
m_palmUsername = username;
}
void Application::uploadImage(const QString &path, const QString &username, int operation) { void Application::uploadImage(const QString &path, const QString &username, int operation) {
m_uploadImageSendedSize = 0; m_uploadImageSendedSize = 0;
ModuleCommunication::UploadImageInformation request; ModuleCommunication::UploadImageInformation request;
@ -453,11 +438,7 @@ void Application::onCommandFinished(ModuleCommunication::MessageId messageId,
} }
void Application::onVerifyTimeout() { void Application::onVerifyTimeout() {
if (m_verifyExtendedMode) {
m_communication->verifyExtended(m_verifyExtendedMode, 120);
} else {
m_communication->verify(120); m_communication->verify(120);
}
} }
bool Application::startOta(const QString &path) { bool Application::startOta(const QString &path) {

View File

@ -51,11 +51,8 @@ public:
Q_INVOKABLE void close(); Q_INVOKABLE void close();
Q_INVOKABLE void closeUVC(); Q_INVOKABLE void closeUVC();
Q_INVOKABLE bool startOta(const QString &path); Q_INVOKABLE bool startOta(const QString &path);
Q_INVOKABLE void verify(bool captureImage, uint8_t timeout); Q_INVOKABLE void verify(uint8_t timeout);
Q_INVOKABLE void enroll(const QString &username, bool strictMode, uint8_t excludeMode, bool persistence, Q_INVOKABLE void enroll(const QString &username, uint8_t timeout);
uint8_t timeout);
Q_INVOKABLE void enrollExtended(const QString &username, bool strictMode, uint8_t excludeMode, bool persistence,
uint8_t timeout);
Q_INVOKABLE void deleteUser(uint16_t userid); Q_INVOKABLE void deleteUser(uint16_t userid);
Q_INVOKABLE void deleteAll(); Q_INVOKABLE void deleteAll();
Q_INVOKABLE void uploadImage(const QString &path, const QString &username, int operation); Q_INVOKABLE void uploadImage(const QString &path, const QString &username, int operation);
@ -88,7 +85,7 @@ signals:
protected: protected:
Application(int &argc, char **argv); Application(int &argc, char **argv);
void onNewEnrollResult(uint16_t userid); void onNewEnrollResult(uint16_t userid);
void onNewVerifyResult(uint16_t userid, const QString &username, uint16_t elapsed); void onNewVerifyResult(uint16_t userid, const QString &username);
void onNewPalmFeature(const PalmFeature &feature); void onNewPalmFeature(const PalmFeature &feature);
void onErrorOccurred(ModuleCommunication::NoteId note, const QString &error, const QString &detailMessage); void onErrorOccurred(ModuleCommunication::NoteId note, const QString &error, const QString &detailMessage);
void onNewImageInfo(ModuleCommunication::MessageId messageId, uint32_t size, const uint8_t *md5); void onNewImageInfo(ModuleCommunication::MessageId messageId, uint32_t size, const uint8_t *md5);
@ -106,7 +103,6 @@ private:
std::shared_ptr<Database> m_database; std::shared_ptr<Database> m_database;
bool m_persistenceMode = true; // 模组持续识别 bool m_persistenceMode = true; // 模组持续识别
bool m_verifyExtendedMode = false;
bool m_persistenceModeStarted = false; bool m_persistenceModeStarted = false;
int m_persistenceVerifyInterval = 1; int m_persistenceVerifyInterval = 1;
QTimer *m_verifyTimer = nullptr; QTimer *m_verifyTimer = nullptr;

View File

@ -52,18 +52,6 @@ void ModuleCommunication::verify(uint8_t timeout) {
LOG_CAT(info, GUI) << Separator; LOG_CAT(info, GUI) << Separator;
} }
void ModuleCommunication::verifyExtended(bool captureImage, uint8_t timeout) {
VerifyRequest data = {0};
data.timeout = timeout;
data.save_image = captureImage ? 0x01 : 0x00;
auto [frameData, frameSize] = generateFrame(VerifyExtended, reinterpret_cast<const uint8_t *>(&data), sizeof(data));
m_serialPort->write(reinterpret_cast<const char *>(frameData), frameSize);
setCurrentMessageIdStatus(VerifyExtended);
LOG_CAT(info, GUI) << "发送扩展识别指令: " << protocolDataFormatString(frameData, frameSize);
LOG_CAT(info, GUI) << Separator;
}
void ModuleCommunication::reset() { void ModuleCommunication::reset() {
auto [frameData, frameSize] = generateFrame(Reset); auto [frameData, frameSize] = generateFrame(Reset);
m_serialPort->write(reinterpret_cast<const char *>(frameData), frameSize); m_serialPort->write(reinterpret_cast<const char *>(frameData), frameSize);
@ -72,13 +60,9 @@ void ModuleCommunication::reset() {
LOG_CAT(info, GUI) << Separator; LOG_CAT(info, GUI) << Separator;
} }
void ModuleCommunication::enroll(const std::string &username, bool strictMode, uint8_t excludeMode, bool persistence, void ModuleCommunication::enroll(const std::string &username, uint8_t timeout) {
uint8_t timeout) {
EnrollRequest data = {0}; EnrollRequest data = {0};
data.strictMode = strictMode ? 1 : 0;
data.excludeMode = excludeMode;
data.timeout = timeout; data.timeout = timeout;
data.skipSave = persistence ? 0 : 1;
strncpy(reinterpret_cast<char *>(data.username), username.c_str(), sizeof(data.username)); strncpy(reinterpret_cast<char *>(data.username), username.c_str(), sizeof(data.username));
auto [frameData, frameSize] = generateFrame(EnrollSingle, reinterpret_cast<const uint8_t *>(&data), sizeof(data)); auto [frameData, frameSize] = generateFrame(EnrollSingle, reinterpret_cast<const uint8_t *>(&data), sizeof(data));
m_serialPort->write(reinterpret_cast<const char *>(frameData), frameSize); m_serialPort->write(reinterpret_cast<const char *>(frameData), frameSize);
@ -89,22 +73,6 @@ void ModuleCommunication::enroll(const std::string &username, bool strictMode, u
LOG_CAT(info, GUI) << Separator; LOG_CAT(info, GUI) << Separator;
} }
void ModuleCommunication::enrollExtended(const std::string &username, bool strictMode, uint8_t excludeMode,
bool persistence, uint8_t timeout) {
EnrollRequest data = {};
data.strictMode = strictMode ? 1 : 0;
data.excludeMode = excludeMode;
data.timeout = timeout;
data.skipSave = persistence ? 0 : 1;
strncpy(reinterpret_cast<char *>(data.username), username.c_str(), sizeof(data.username));
auto [frameData, frameSize] = generateFrame(EnrollExtended, reinterpret_cast<const uint8_t *>(&data), sizeof(data));
m_serialPort->write(reinterpret_cast<const char *>(frameData), frameSize);
setCurrentMessageIdStatus(EnrollExtended);
LOG_CAT(info, GUI) << "发送获取注册照片指令: " << protocolDataFormatString(frameData, frameSize);
LOG_CAT(info, GUI) << "用户名: " << username << ", 超时时间: " << static_cast<int>(timeout) << "s";
LOG_CAT(info, GUI) << Separator;
}
void ModuleCommunication::deleteUser(uint16_t userid) { void ModuleCommunication::deleteUser(uint16_t userid) {
uint16_t n = htons(userid); uint16_t n = htons(userid);
auto [frameData, frameSize] = generateFrame(DeleteUser, reinterpret_cast<const uint8_t *>(&n), sizeof(n)); auto [frameData, frameSize] = generateFrame(DeleteUser, reinterpret_cast<const uint8_t *>(&n), sizeof(n));
@ -216,25 +184,21 @@ void ModuleCommunication::processPackage(const uint8_t *data, uint16_t size) {
if (result == Success) { if (result == Success) {
auto info = reinterpret_cast<const VerifyReply *>(data + 7); auto info = reinterpret_cast<const VerifyReply *>(data + 7);
uint16_t userid = ntohs(info->userid); uint16_t userid = ntohs(info->userid);
uint16_t elapsed = ntohs(info->elapsed);
LOG_CAT(info, GUI) << "用户ID: " << userid LOG_CAT(info, GUI) << "用户ID: " << userid
<< ", 用户名: " << std::string_view(reinterpret_cast<const char *>(info->username)) << ", 用户名: " << std::string_view(reinterpret_cast<const char *>(info->username));
<< ", 耗时: " << elapsed << "ms"; emit newVerifyResult(userid, reinterpret_cast<const char *>(info->username));
emit newVerifyResult(userid, reinterpret_cast<const char *>(info->username), elapsed);
} else if (result == Failed4Timeout) { } else if (result == Failed4Timeout) {
LOG_CAT(info, GUI) << "识别超时。"; LOG_CAT(info, GUI) << "识别超时。";
} else if (result == Rejected) { } else if (result == Rejected) {
LOG_CAT(info, GUI) << "模组拒绝该命令。"; LOG_CAT(info, GUI) << "模组拒绝该命令。";
} else if (result == Failed4UnknownUser) { } else if (result == Failed4UnknownUser) {
auto info = reinterpret_cast<const VerifyReply *>(data + 7); auto info = reinterpret_cast<const VerifyReply *>(data + 7);
uint16_t elapsed = ntohs(info->elapsed); emit newVerifyResult(InvalidUserId, "");
emit newVerifyResult(InvalidUserId, "", elapsed); LOG_CAT(info, GUI) << "未录入用户";
LOG_CAT(info, GUI) << "未录入用户, 耗时: " << elapsed << "ms";
} else if (result == Failed4UnknownReason) { } else if (result == Failed4UnknownReason) {
auto info = reinterpret_cast<const VerifyReply *>(data + 7); auto info = reinterpret_cast<const VerifyReply *>(data + 7);
uint16_t elapsed = ntohs(info->elapsed); emit newVerifyResult(InvalidUserId, "");
emit newVerifyResult(InvalidUserId, "", elapsed); LOG_CAT(info, GUI) << "未知错误";
LOG_CAT(info, GUI) << "未知错误, 耗时: " << elapsed << "ms";
} else { } else {
LOG_CAT(info, GUI) << "未知错误(" << static_cast<int>(result) << ")。"; LOG_CAT(info, GUI) << "未知错误(" << static_cast<int>(result) << ")。";
} }
@ -324,27 +288,6 @@ void ModuleCommunication::processPackage(const uint8_t *data, uint16_t size) {
case UploadImageInfo: { case UploadImageInfo: {
break; break;
} }
case UploadImageData: {
auto info = reinterpret_cast<const UploadImageReply *>(data + 7);
if (result == Success) {
if (info->operation == 0) {
LOG_CAT(info, GUI) << "图片下发注册成功,用户ID: " << ntohs(info->userid);
} else if (info->operation == 1) {
auto result = reinterpret_cast<const UploadImageVerifyReply *>(info);
LOG_CAT(info, GUI) << "图片下发识别成功,用户ID: " << ntohs(result->userid) << ", 用户名: "
<< std::string_view(reinterpret_cast<const char *>(result->result.username))
<< ", 耗时: " << ntohs(result->result.elapsed) << "ms";
} else {
LOG(warning) << "unknown upload image operation: " << info->operation;
}
LOG_CAT(info, GUI) << Separator;
} else if (result == Needmore) {
} else {
LOG(info) << "upload image failed, operation: " << static_cast<uint16_t>(info->operation)
<< ", status: " << static_cast<uint16_t>(result);
}
break;
}
case GetCurrentStatus: { case GetCurrentStatus: {
LOG_CAT(info, GUI) << "模组: " << protocolDataFormatString(data, size); LOG_CAT(info, GUI) << "模组: " << protocolDataFormatString(data, size);
LOG_CAT(info, GUI) << "模组当前状态: " << static_cast<int>(data[7]); LOG_CAT(info, GUI) << "模组当前状态: " << static_cast<int>(data[7]);

View File

@ -87,8 +87,8 @@ public:
#pragma pack(1) #pragma pack(1)
struct VerifyRequest { struct VerifyRequest {
uint8_t save_image; uint8_t reserved;
uint8_t timeout; // timeout, unit second, default 10s uint8_t timeout;
}; };
struct PalmStateNote { struct PalmStateNote {
@ -102,16 +102,14 @@ public:
struct EnrollRequest { struct EnrollRequest {
uint8_t username[32]; uint8_t username[32];
uint8_t strictMode = 0; uint8_t reserved1[3];
uint8_t excludeMode = 0; // 掌静脉库里面是否已经存在 0:不进行验证 1:只进行比对 2:如果存在,则现在不予录入
uint8_t skipSave = 0;
uint8_t timeout; uint8_t timeout;
uint8_t reserved[4]; uint8_t reserved2[4];
}; };
struct EnrollReply { struct EnrollReply {
uint16_t userid; uint16_t userid;
uint8_t operation; uint8_t reserved;
}; };
struct PalmVeinInformation { struct PalmVeinInformation {
@ -148,7 +146,7 @@ public:
struct VerifyReply { struct VerifyReply {
uint16_t userid; uint16_t userid;
uint8_t username[UsernameSize]; // 32Bytes uint8_t username[UsernameSize]; // 32Bytes
uint16_t elapsed; // 此时识别耗时时间 uint8_t reserved[2];
}; };
struct VerifyExtendReply : public VerifyReply { struct VerifyExtendReply : public VerifyReply {
@ -195,12 +193,9 @@ public:
explicit ModuleCommunication(QObject *parent = nullptr); explicit ModuleCommunication(QObject *parent = nullptr);
bool open(const QString &portName, int baudRate); bool open(const QString &portName, int baudRate);
void verify(uint8_t timeout); void verify(uint8_t timeout);
void verifyExtended(bool captureImage, uint8_t timeout);
Q_INVOKABLE void reset(); Q_INVOKABLE void reset();
void enroll(const std::string &username, bool strictMode, uint8_t excludeMode, bool persistence, uint8_t timeout); void enroll(const std::string &username, uint8_t timeout);
void enrollExtended(const std::string &username, bool strictMode, uint8_t excludeMode, bool persistence,
uint8_t timeout);
Q_INVOKABLE void deleteUser(uint16_t userid); Q_INVOKABLE void deleteUser(uint16_t userid);
Q_INVOKABLE void deleteAll(); Q_INVOKABLE void deleteAll();
Q_INVOKABLE void requestUniqueId(); Q_INVOKABLE void requestUniqueId();
@ -222,7 +217,7 @@ signals:
* @param username * @param username
* @param elapsed ms毫秒 * @param elapsed ms毫秒
*/ */
void newVerifyResult(uint16_t userid, const QString &username, uint16_t elapsed); void newVerifyResult(uint16_t userid, const QString &username);
void newEnrollResult(uint16_t userid); void newEnrollResult(uint16_t userid);
void newPalmFeature(const PalmFeature &feature); void newPalmFeature(const PalmFeature &feature);
void newImageInfo(MessageId id, uint32_t size, const uint8_t *md5); void newImageInfo(MessageId id, uint32_t size, const uint8_t *md5);

View File

@ -16,19 +16,6 @@ RowLayout {
id: enrollName id: enrollName
implicitWidth: 100 implicitWidth: 100
} }
Label {
text: qsTr("严格模式")
}
Switch {
id: strictMode
}
Label {
text: qsTr("互斥模式")
}
ComboBox {
id: excludeMode
model: ["无", "仅比对", "互斥"]
}
Label { Label {
text: qsTr("超时时间") text: qsTr("超时时间")
} }
@ -38,21 +25,6 @@ RowLayout {
text: "30" text: "30"
} }
Label {
text: qsTr("持久化")
}
Switch {
id: persistence
checked: true
}
Label {
text: qsTr("保存图片")
}
Switch {
id: extendedMode
}
Button { Button {
property bool enrolling: App.module ? (App.module.currentMessageId property bool enrolling: App.module ? (App.module.currentMessageId
=== ModuleCommunication.EnrollSingle) === ModuleCommunication.EnrollSingle)
@ -61,16 +33,8 @@ RowLayout {
onClicked: { onClicked: {
if (enrolling) { if (enrolling) {
App.module.reset() App.module.reset()
} else if (extendedMode.checked) {
App.enrollExtended(enrollName.text, strictMode.checked,
excludeMode.currentIndex,
persistence.checked,
parseInt(enrollTimeout.text))
} else { } else {
App.enroll(enrollName.text, strictMode.checked, App.enroll(enrollName.text, parseInt(enrollTimeout.text))
excludeMode.currentIndex,
persistence.checked,
parseInt(enrollTimeout.text))
} }
} }
} }
@ -96,12 +60,6 @@ RowLayout {
checked: App.persistenceMode checked: App.persistenceMode
onToggled: App.persistenceMode = !App.persistenceMode onToggled: App.persistenceMode = !App.persistenceMode
} }
Label {
text: qsTr("保存图片")
}
Switch {
id: extendedVerifyMode
}
Label { Label {
text: qsTr("识别间隔(s)") text: qsTr("识别间隔(s)")
} }
@ -118,7 +76,7 @@ RowLayout {
App.module.reset() App.module.reset()
} else { } else {
App.persistenceVerifyInterval = parseInt(verifyIntetval.text) App.persistenceVerifyInterval = parseInt(verifyIntetval.text)
App.verify(extendedVerifyMode.checked, parseInt(verifyTimeout.text)) App.verify(parseInt(verifyTimeout.text))
} }
} }
} }

View File

@ -52,57 +52,6 @@ Item {
text: "OTA升级" text: "OTA升级"
onClicked: loader.active = true onClicked: loader.active = true
} }
Row {
Label {
text: qsTr("日志")
}
Switch {
id: debugMode
onToggled: App.module.setDebugEnabled(debugMode.checked)
}
}
}
}
}
GroupBox {
title: "图片注册"
visible: true
GridLayout {
columns: 2
TextField {
id: imagePath
Layout.columnSpan: 2
implicitWidth: 200
placeholderText: "请选择图片"
onPressed: {
fileDialog.open()
}
}
Label {
text: qsTr("用户姓名")
}
TextField {
id: imageEnrollName
implicitWidth: 100
text: "测试下发"
}
Label {
text: qsTr("循环")
}
Switch {
checked: App.imageUploadPersistenceMode
onToggled: {
App.imageUploadPersistenceMode = checked
}
}
Button {
text: "注册"
onClicked: App.uploadImage(imagePath.text, imageEnrollName.text, 0)
}
Button {
text: "识别"
onClicked: App.uploadImage(imagePath.text, imageEnrollName.text, 1)
} }
} }
} }