diff --git a/HF15693.h b/HF15693.h index 64fe3c8..412f730 100644 --- a/HF15693.h +++ b/HF15693.h @@ -76,115 +76,115 @@ extern HF15693_API char t15UID[UID_LEN], t15FirstBN[3], t15NumBl[3], t15Data[DAT ////////////////////////////// //工具函数 -/********************************************* -/* 描述:打开串口 -/* 输入:串口号,如若打开com1,则参数为 1 -/* 输出:无 -/* 返回:true 打开成功;false 打开失败 -/* 其他: -/*********************************************/ +/* +* 描述:打开串口 +* 输入:串口号,如若打开com1,则参数为 1 +* 输出:无 +* 返回:true 打开成功;false 打开失败 +* 其他: +*/ HF15693_API bool t15portOpen(int comno); -/********************************************* -/* 描述:关闭串口 -/* 输入:无 -/* 输出:无 -/* 返回:true 关闭成功;false 关闭失败 -/* 其他: -/*********************************************/ +/* +* 描述:关闭串口 +* 输入:无 +* 输出:无 +* 返回:true 关闭成功;false 关闭失败 +* 其他: +*/ HF15693_API bool t15portClose(); -/********************************************* -/* 描述:设置协议 -/* 输入:无 -/* 输出:无 -/* 返回: 0 设置成功; ~0 设置失败 -/* 其他: -/*********************************************/ +/* +* 描述:设置协议 +* 输入:无 +* 输出:无 +* 返回: 0 设置成功; ~0 设置失败 +* 其他: +*/ HF15693_API int t15setProtocol(); -/********************************************* -/* 描述:执行命令 -/* 输入:cmdno - 命令字 -/* 输出:cmdstr - 向下发出的命令字段;reply - 对命令回复的字段 -/* 返回:(int) 命令回复字段中的有效字节数 -/* 其他: -/*********************************************/ +/* +* 描述:执行命令 +* 输入:cmdno - 命令字 +* 输出:cmdstr - 向下发出的命令字段;reply - 对命令回复的字段 +* 返回:(int) 命令回复字段中的有效字节数 +* 其他: +*/ HF15693_API int t15execute(int cmdno, char *cmdstr,char *reply); ///////////////////////////////////// -/********************************************* -/* 描述:从一个字串中提取一个表示十六进制数字的子串,子串间以',' '[' 分隔 -/* 输入: str - 原字串 -/* 输出: str - 指向原串中提取到的子串的下一下字符, word - 提取到的子串 -/* 返回: 0 - 成功 , 1 - 失败 -/* 其他: -/*********************************************/ +/* +* 描述:从一个字串中提取一个表示十六进制数字的子串,子串间以',' '[' 分隔 +* 输入: str - 原字串 +* 输出: str - 指向原串中提取到的子串的下一下字符, word - 提取到的子串 +* 返回: 0 - 成功 , 1 - 失败 +* 其他: +*/ HF15693_API int getXWord (char **str, char *word); -/********************************************* -/* 描述:从一个字串中提取一个表示十六进制数字的子串,子串间以',' '[' 分隔 -/* 输入: str - 原字串 -/* 输出: word - 提取到的子串 -/* 返回: -/* 其他: -/*********************************************/ +/* +* 描述:从一个字串中提取一个表示十六进制数字的子串,子串间以',' '[' 分隔 +* 输入: str - 原字串 +* 输出: word - 提取到的子串 +* 返回: +* 其他: +*/ HF15693_API int getXWord2 ( char *str, char *word); -/********************************************* -/* 描述:更改字节序 -/* 输入:pin - 原字串 , lenbytes - 字串数据长度 -/* 输出:pout - 更改字节序后的字串 -/* 返回:无 -/* 其他:此函数会在pout后补0,使用者须保证其长度。 -/* 如,字串"123456" 更改字节序后变为 "563412" -/*********************************************/ +/* +* 描述:更改字节序 +* 输入:pin - 原字串 , lenbytes - 字串数据长度 +* 输出:pout - 更改字节序后的字串 +* 返回:无 +* 其他:此函数会在pout后补0,使用者须保证其长度。 +* 如,字串"123456" 更改字节序后变为 "563412" +*/ HF15693_API void t15changeByteOrder(char *pout,const char *pin,int lenbytes); -/********************************************* -/* 描述:更改带块安全状态信息(block security status)的字串的字节序 -/* 输入:pin - 原字串 , lenbytes - 字串数据长度,不包含'块安全状态信息'的长度 -/* 输出:sbss - 原字串中的bss值 ,pout - 更改字节序后的字串 -/* 返回:无 -/* 其他:字串的存储空间由使用者保证,会在pout后补0;sbss是用字串表示的一个字节的十六进制数 -/*********************************************/ +/* +* 描述:更改带块安全状态信息(block security status)的字串的字节序 +* 输入:pin - 原字串 , lenbytes - 字串数据长度,不包含'块安全状态信息'的长度 +* 输出:sbss - 原字串中的bss值 ,pout - 更改字节序后的字串 +* 返回:无 +* 其他:字串的存储空间由使用者保证,会在pout后补0;sbss是用字串表示的一个字节的十六进制数 +*/ HF15693_API void t15changeByteOrder2(char *sbss,char *pout, char *pin,int lenbytes); -/********************************************* -/* 描述:更改字串的字节序,字串包含多个块的数据 -/* 输入:pin - 原字串 , numblocks - 原字串中包含的块数目 -/* 输出:pout - 更改字节序后的字串 -/* 返回:无 -/* 其他:每个块数据长度由pin长度和numblocks决定;会在pout后补0 -/*********************************************/ +/* +* 描述:更改字串的字节序,字串包含多个块的数据 +* 输入:pin - 原字串 , numblocks - 原字串中包含的块数目 +* 输出:pout - 更改字节序后的字串 +* 返回:无 +* 其他:每个块数据长度由pin长度和numblocks决定;会在pout后补0 +*/ HF15693_API void t15changeByteOrder_MB(char *pout, char *pin, int numblocks); -/********************************************* -/* 描述:更改带块安全状态信息(block security status)的字串的字节序,字串包含多个块的数据 -/* 输入:pin - 原字串;lenbytes - 字串数据长度,不包含'块安全状态信息'的长度; numblocks - 原字串中包含的块数目 -/* 输出:mbss - 原字串中的bss值 ,pout - 更改字节序后的字串 -/* 返回:无 -/* 其他:各个块的bss依次存放于mbss中,多个块的数据依次存放于pout中 -/*********************************************/ +/* +* 描述:更改带块安全状态信息(block security status)的字串的字节序,字串包含多个块的数据 +* 输入:pin - 原字串;lenbytes - 字串数据长度,不包含'块安全状态信息'的长度; numblocks - 原字串中包含的块数目 +* 输出:mbss - 原字串中的bss值 ,pout - 更改字节序后的字串 +* 返回:无 +* 其他:各个块的bss依次存放于mbss中,多个块的数据依次存放于pout中 +*/ HF15693_API void t15changeByteOrder_MB2(char *mbss,char *pout, char *pin,int lenbytes, int numblocks); -/********************************************* -/* 描述:解析返回的RSSI值 -/* 输入:字串表示的RSSI -/* 输出:无 -/* 返回:指向解析过的RSSI信息的内存块 -/* 其他:返回的指针指向的内存由函数分配管理 -/*********************************************/ +/* +* 描述:解析返回的RSSI值 +* 输入:字串表示的RSSI +* 输出:无 +* 返回:指向解析过的RSSI信息的内存块 +* 其他:返回的指针指向的内存由函数分配管理 +*/ HF15693_API char* t15hex2rssi (char *str); -/********************************************* -/* 描述:解析标签信息字串 -/* 输入:data - 原标签信息字串;flag - 标签信息标志 -/* 输出:(其他参数) -/* 返回:0 -/* 其他: -/*********************************************/ +/* +* 描述:解析标签信息字串 +* 输入:data - 原标签信息字串;flag - 标签信息标志 +* 输出:(其他参数) +* 返回:0 +* 其他: +*/ HF15693_API int t15getTagSysInfo (char *data, const unsigned char flag,char *uid, char *dsfid, char *afi, char *blSize, char *numBl, char *ic); diff --git a/databaseAPI.cpp b/databaseAPI.cpp index 372ed5b..44adf0c 100644 --- a/databaseAPI.cpp +++ b/databaseAPI.cpp @@ -1,5 +1,13 @@ #include "databaseAPI.h" + +/** + * @brief 使用QSqlDatabase类初始化对象 + * @param database 传入的QSqlDatabase对象 + * @return void + * @author 柯劲帆 + * @date 2024-07-28 + */ Database::Database(QSqlDatabase database) { db = database; @@ -7,6 +15,17 @@ Database::Database(QSqlDatabase database) db.setUserName(userName); } + +/** + * @brief 使用QSqlDatabase类、IP、端口、密码初始化对象 + * @param database 传入的QSqlDatabase对象 + * @param hostName 数据库IP + * @param port 数据库端口 + * @param password 数据库密码 + * @return void + * @author 柯劲帆 + * @date 2024-07-28 + */ Database::Database(QSqlDatabase database, QString hostName, int port, QString password) { db = database; @@ -17,47 +36,124 @@ Database::Database(QSqlDatabase database, QString hostName, int port, QString pa db.setPassword(password); } + +/** + * @brief 获取database属性 + * @param void + * @return 返回QSqlDatabase类database属性 + * @author 柯劲帆 + * @date 2024-07-28 + */ QSqlDatabase Database::getDatabase() { return db; } + +/** + * @brief 设置hostName属性 + * @param hostName 数据库IP + * @return void + * @author 柯劲帆 + * @date 2024-07-28 + */ void Database::setHostName(QString hostName) { db.setHostName(hostName); } + +/** + * @brief 获取hostName属性 + * @param void + * @return 返回QString类hostName属性 + * @author 柯劲帆 + * @date 2024-07-28 + */ QString Database::getHostName() { return db.hostName(); } + +/** + * @brief 设置port属性 + * @param port 数据库端口 + * @return void + * @author 柯劲帆 + * @date 2024-07-28 + */ void Database::setPort(int port) { db.setPort(port); } + +/** + * @brief 获取port属性 + * @param void + * @return 返回int类port属性 + * @author 柯劲帆 + * @date 2024-07-28 + */ int Database::getPort() { return db.port(); } + +/** + * @brief 设置password属性 + * @param password 数据库密码 + * @return void + * @author 柯劲帆 + * @date 2024-07-28 + */ void Database::setPassword(QString password) { db.setPassword(password); } + +/** + * @brief 数据库是否已经连接 + * @param void + * @return 数据库连接状态 + * - true 已连接 + * - false 未连接 + * @author 柯劲帆 + * @date 2024-07-28 + */ bool Database::is_connected() { return connected; } +/** + * @brief 连接数据库 + * 会将连接结果更新到connect属性上。 + * @param void + * @return 数据库连接状态 + * - true 已连接 + * - false 未连接 + * @author 柯劲帆 + * @date 2024-07-28 + */ bool Database::open() { connected = db.open(); return connected; } + +/** + * @brief 释放对象 + * 会将数据库连接关闭。 + * @param void + * @return void + * @author 柯劲帆 + * @date 2024-07-28 + */ Database::~Database() { db.close(); diff --git a/databaseAPI.h b/databaseAPI.h index 504ea63..36b59a9 100644 --- a/databaseAPI.h +++ b/databaseAPI.h @@ -1,11 +1,18 @@ #ifndef DATABASEAPI_H #define DATABASEAPI_H - #include #include +/** + * @class Database + * @brief 数据库操作相关接口类 + * 固定了databaseName为"cardManageSystem",userName为"cardManageSystem"。 + * 控制本应用中数据库相关变量。 + * @author 柯劲帆 + * @date 2024-07-28 + */ class Database { private: @@ -17,15 +24,19 @@ private: public: Database(QSqlDatabase database); Database(QSqlDatabase database, QString hostName, int port, QString password); - QSqlDatabase getDatabase(); - void setHostName(QString hostName); - QString getHostName(); - void setPort(int port); - int getPort(); - void setPassword(QString password); - bool is_connected(); - bool open(); ~Database(); + + void setHostName(QString hostName); + void setPort(int port); + void setPassword(QString password); + + QSqlDatabase getDatabase(); + int getPort(); + QString getHostName(); + + bool is_connected(); + + bool open(); }; diff --git a/deviceAPI.cpp b/deviceAPI.cpp index 6386828..6d8d00c 100644 --- a/deviceAPI.cpp +++ b/deviceAPI.cpp @@ -1,39 +1,78 @@ #include "deviceAPI.h" -bool Device::is_connected() + +/** + * @brief 设备是否已经认证 + * @param void + * @return 设备认证状态 + * - true 已认证 + * - false 未认证 + * @author 柯劲帆 + * @date 2024-07-28 + */ +bool Device::is_verified() { - return connected; + return verified; } +/** + * @brief 设备是否可充值 + * @param void + * @return 设备充值权限 + * - true 可充值 + * - false 不可充值(仅可消费) + * @author 柯劲帆 + * @date 2024-07-29 + */ bool Device::is_depositAllowed() { return depositAllowed; } -void Device::setDevice(QString name, Database *db) +/** + * @brief 设置并认证设备 + * 认证设备会更新设备名和充值权限。 + * @param name 设备名 + * @param db 数据库 + * @return void + * @author 柯劲帆 + * @date 2024-07-28 + */ +void Device::setDevice(QString name, Database* db) { QSqlQuery query(db->getDatabase()); QString sql = QString("select * from device where `name` = '%1';").arg(name); query.exec(sql); if (query.next()) { - connected = true; + verified = true; this->name = name; depositAllowed = query.value(2).toBool(); } else { - connected = false; + verified = false; depositAllowed = false; } } +/** + * @brief 获取设备名及其充值权限 + * @param void + * @return 返回QString类name属性 + * - 若设备未认证返回"未指定设备名" + * - 若设备已认证 + * - 若设备可充值,返回设备名加"(可充值)" + * - 若设备不可充值,返回设备名加"(仅可消费) + * @author 柯劲帆 + * @date 2024-07-28 + */ QString Device::getName() { - if (connected) { + if (verified) { if (depositAllowed) return name + QString("(可充值)"); else return name + QString("(仅可消费)"); } diff --git a/deviceAPI.h b/deviceAPI.h index 09d2c06..6f70f17 100644 --- a/deviceAPI.h +++ b/deviceAPI.h @@ -5,18 +5,28 @@ #include #include + +/** + * @class Device + * @brief 设备名相关接口类 + * 控制本应用中设备名相关变量。 + * @author 柯劲帆 + * @date 2024-07-28 + */ class Device { private: - bool connected = false; + bool verified = false; bool depositAllowed = false; QString name = QString("未指定设备名"); public: - bool is_connected(); - bool is_depositAllowed(); void setDevice(QString name, Database *db); + QString getName(); + + bool is_verified(); + bool is_depositAllowed(); }; #endif // DEVICEAPI_H diff --git a/mainwindow.cpp b/mainwindow.cpp index d5dba74..9e06ff0 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,9 +1,11 @@ #include "mainwindow.h" #include "ui_mainwindow.h" + #include "settingPage.cpp" #include "quitAppPage.cpp" #include "newCardPage.cpp" + MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) diff --git a/mainwindow.h b/mainwindow.h index 8dd82a9..95d923e 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -39,8 +39,6 @@ private slots: void on_connectDatabaseButton_clicked(); void on_inventoryButton_clicked(); - - private: Ui::MainWindow *ui; Reader reader; diff --git a/newCardPage.cpp b/newCardPage.cpp index 6e75697..622042d 100644 --- a/newCardPage.cpp +++ b/newCardPage.cpp @@ -2,10 +2,16 @@ #include "ui_mainwindow.h" -/* - * 功能:切换到开卡页面 - * 触发:点击工具栏的“开卡” -*/ +/** + * @brief 切换到开卡页面 + * 点击工具栏的“开卡”触发: + * - 如果读卡器或数据库未连接,显示警告信息并跳转到设置页面。 + * - 如果连接已准备好,则切换到开卡页面。 + * @param void + * @return void + * @author 柯劲帆 + * @date 2024-07-28 + */ void MainWindow::on_NewCardAction_triggered() { if (!ready()) @@ -22,13 +28,17 @@ void MainWindow::on_NewCardAction_triggered() } -/* - * 功能:读卡器扫描卡片 - * 触发:点击开卡页面的“查询” -*/ +/** + * @brief 读卡器扫描卡片 + * 点击开卡页面的“查询”触发。显示Inventory的查询结果,最多显示10张卡。 + * @param void + * @return void + * @author 柯劲帆 + * @date 2024-07-29 + */ void MainWindow::on_inventoryButton_clicked() { - QStringList cardIdList = reader.inventory(10); // 最多显示10张卡 + QStringList cardIdList = reader.inventory(10); // 最多显示10张卡 ui->cardIdBox->clear(); ui->cardIdBox->addItems(cardIdList); } diff --git a/quitAppPage.cpp b/quitAppPage.cpp index 7ade2e4..b561c16 100644 --- a/quitAppPage.cpp +++ b/quitAppPage.cpp @@ -2,20 +2,28 @@ #include "ui_mainwindow.h" -/* - * 功能:切换到退出页面 - * 触发:点击工具栏的“退出” -*/ +/** + * @brief 切换到退出页面 + * 点击工具栏的“退出”触发 + * @param void + * @return void + * @author 柯劲帆 + * @date 2024-07-27 + */ void MainWindow::on_quitAppAction_triggered() { ui->stackedWidget->setCurrentWidget(ui->quitAppPage); } -/* - * 功能:退出程序 - * 触发:在退出页面点击“确认”按钮 -*/ +/** + * @brief 退出程序 + * 在退出页面点击“确认”按钮触发 + * @param void + * @return void + * @author 柯劲帆 + * @date 2024-07-27 + */ void MainWindow::on_confirmQuitButton_clicked() { this->close(); diff --git a/readerAPI.cpp b/readerAPI.cpp index f6a9800..c9f797c 100644 --- a/readerAPI.cpp +++ b/readerAPI.cpp @@ -1,12 +1,32 @@ #include "readerAPI.h" +/** + * @brief 判断读卡器是否已连接 + * 通过comNumber是否大于0判断。 + * @param void + * @return 读卡器连接状态 + * - true 已连接 + * - false 未连接 + * @author 柯劲帆 + * @date 2024-07-27 + */ +/// \brief 判断读卡器是否已连接 +/// \return 如果comNumber大于0,表示已连接,返回true;否则返回false bool Reader::is_connected() { return comNumber > 0; } +/** + * @brief 连接读卡器 + * 尝试通过comNumber连接读卡器。如果连接成功,返回true;否则返回false并重置comNumber为-1。 + * @param void + * @return 连接成功返回true,失败返回false + * @author 柯劲帆 + * @date 2024-07-27 + */ bool Reader::connect() { if (CVCDOurs::connectReaderByCOM(comNumber)) @@ -20,27 +40,63 @@ bool Reader::connect() } } + +/** + * @brief 设置COM口号 + * @param comNumber 要设置的COM口号 + * @return void + * @author 柯劲帆 + * @date 2024-07-27 + */ void Reader::setComNumber(int comNumber) { this->comNumber = comNumber; } + +/** + * @brief 获取当前COM口号 + * @param void + * @return 当前的COM口号 + * - -1 未连接 + * - >0 已连接 + * @author 柯劲帆 + * @date 2024-07-27 + */ int Reader::getComNumber() { return comNumber; } + +/** + * @brief 获取读卡器中卡片的UID列表 + * 通过读卡器的inventory方法获取最大数量为maxViccNum的卡片UID,并将其转换为QStringList返回。 + * @param maxViccNum 最大卡片数量 + * @return 包含卡片UID的QStringList + * @author 柯劲帆 + * @date 2024-07-29 + */ QStringList Reader::inventory(int maxViccNum) { + // 分配内存用于存储卡片的UID uchar_t (*aucUID)[8] = (uchar_t (*)[8])malloc(maxViccNum * sizeof(*aucUID));; + + // 调用CVCDOurs::inventory方法获取卡片数量 int receivedViccNum = CVCDOurs::inventory(false, '\0', maxViccNum, nullptr, aucUID); + + // 用于存储UID的QStringList QStringList uidList; for (int i = 0; i < receivedViccNum; ++i) { char uidStr[8]; + // 将UID从十六进制转换为字符串 CVCDOurs::HexToString(aucUID[i], 8, uidStr); + // 将字符串转换为QString并添加到uidList中 uidList.push_back(QString::fromStdString(uidStr)); } + + // 释放分配的内存 free(aucUID); return uidList; } diff --git a/readerAPI.h b/readerAPI.h index 0270116..dac8431 100644 --- a/readerAPI.h +++ b/readerAPI.h @@ -2,24 +2,32 @@ #define READERAPI_H #include -#include -#include #include #include #include typedef unsigned char uchar_t; + +/** + * @class Reader + * @brief 读卡器管理类 + * 该类用于管理RFID读卡器的连接和操作,包括设置COM口号、连接读卡器、获取卡片UID列表等功能。 + * @author 柯劲帆 + * @date 2024-07-27 + */ class Reader : private CVCDOurs { private: - int comNumber = -1; // com口号,若未连接为-1 + int comNumber = -1; ///< 硬件连接com口号,若未连接为-1 public: - bool is_connected(); - bool connect(); void setComNumber(int comNumber); int getComNumber(); + + bool is_connected(); + + bool connect(); QStringList inventory(int maxViccNum); }; diff --git a/settingPage.cpp b/settingPage.cpp index 7989acc..7be6325 100644 --- a/settingPage.cpp +++ b/settingPage.cpp @@ -2,21 +2,27 @@ #include "ui_mainwindow.h" -/* - * 功能:切换到设置页面 - * 触发:点击工具栏的“设置” -*/ +/** + * @brief 切换到设置页面 + * 点击工具栏的“设置”触发。 + * @param void + * @return void + * @author 柯劲帆 + * @date 2024-07-27 + */ void MainWindow::on_settingAction_triggered() { ui->stackedWidget->setCurrentWidget(ui->settingPage); } -/* - * 功能:设置连接的读卡器的COM口号并更新状态栏的相应内容 - * 输入:要设置的COM口号 - * 返回:无 -*/ +/** + * @brief 更新状态栏的COM口号相关内容 + * @param void + * @return void + * @author 柯劲帆 + * @date 2024-07-27 + */ void MainWindow::updateStatusBarComNumber() { if (reader.is_connected()) @@ -34,10 +40,14 @@ void MainWindow::updateStatusBarComNumber() } -/* - * 功能:连接读卡器 - * 触发:在设置页面的连接读卡器部分点击“连接”按钮 -*/ +/** + * @brief 连接读卡器 + * 在连接读卡器部分点击“连接”按钮触发。 + * @param void + * @return void + * @author 柯劲帆 + * @date 2024-07-27 + */ void MainWindow::on_connectReaderButton_clicked() { int comNumber = ui->comNumberBox->value(); @@ -54,10 +64,14 @@ void MainWindow::on_connectReaderButton_clicked() } -/* - * 功能:连接数据库并检查设备名 - * 触发:在设置页面的连接数据库部分点击“连接”按钮 -*/ +/** + * @brief 连接数据库并检查设备名 + * 在连接数据库部分点击“连接”按钮触发。 + * @param void + * @return void + * @author 柯劲帆 + * @date 2024-07-27 + */ void MainWindow::on_connectDatabaseButton_clicked() { if (db == nullptr) @@ -82,7 +96,7 @@ void MainWindow::on_connectDatabaseButton_clicked() databaseLabel->setText(QString("数据库已连接:") + db->getHostName() + QString(":") + QString::number(db->getPort())); device.setDevice(ui->deviceEdit->text(), db); - if (!device.is_connected()) + if (!device.is_verified()) { QMessageBox::warning(this, QString("设备名提示"), QString("该设备名无效,请重试。")); } @@ -90,15 +104,19 @@ void MainWindow::on_connectDatabaseButton_clicked() } -/* - * 功能:检查读卡器和数据库是否准备好 - * 输入:无 - * 返回:true - 已准备好 | false - 未准备好 -*/ +/** + * @brief 检查读卡器和数据库是否准备好 + * @param void + * @return 读卡器和数据库状态 + * - true 已准备好 + * - false 未准备好 + * @author 柯劲帆 + * @date 2024-07-27 + */ bool MainWindow::ready() { if (!reader.is_connected()) return false; if (db == nullptr || !db->is_connected()) return false; - if (!device.is_connected()) return false; + if (!device.is_verified()) return false; return true; }