Files

226 lines
5.8 KiB
C++

#ifndef RFIDMANAGER_H
#define RFIDMANAGER_H
#include "myinclude.h"
#include <QSerialPort>
#include <QObject>
#include <QTimer>
#include <QMutex>
#include <functional>
class SysPara;
class QMessageBox;
enum CARD_TYPE{
INK = 1,
SOLVENT = 2,
MAINTENANCE = 3,
};
struct StatuStruct
{
bool addedInk;
bool addedSolvent;
bool cardInk;
bool cardSolvent;
// 首次提示刷墨水卡
bool firstPromptInkCard = false;
// 首次提示刷溶剂卡
bool firstPromptSolventCard = false;
StatuStruct() {
addedInk = false;
addedSolvent = false;
cardInk = false;
cardSolvent = false;
}
};
typedef unsigned char UCHAR;
class RFIDManager : public QObject
{
Q_OBJECT
public:
static RFIDManager* instance();
public:
/**
* @brief 向卡片写入当前日期时间,标识该卡片已被使用
*/
int RFIDmarkCardUsedAsync(int type, const QString& cardData = QString());
// InkJetPrinter定时器timerHandler触发,检查刷卡状态
// 初始化刷卡模块
void initRFIDMoudle(unsigned int addr, SysPara *sysPara);
// 300ms检查处理
void handleCheck(unsigned int addr);
void setInkCardFirstPrompt(bool firstPrompt);
void setSolventCardFirstPrompt(bool firstPrompt);
/**
* @brief 异步查询IC卡钱包余额(钱包存放在块4)。
* @return >=0 查询成功,返回余额;<0 失败。
*/
int RFIDQueryWalletAsync();
/**
* @brief 要求刷墨水卡
* @param required 默认请求刷卡,如果置 false,则取消请求刷卡
*/
void requireInkCard(bool required = true);
/**
* @brief 要求刷溶剂卡
* @param required 默认请求刷卡,如果置 false,则取消请求刷卡
*/
void requireSolventCard(bool required = true);
/**
* @brief 要求刷保养卡
*/
void requireMaintenanceCard(bool required = true);
/**
* @brief 检查是否已经请求刷墨水卡
* @return true 已经请求刷墨水卡,false 未请求刷墨水
*/
bool hasRequiredInkCard() const {
return m_needInkCard;
}
/**
* @brief 检查是否已经请求刷溶剂卡
* @return true 已经请求刷溶剂卡,false 未请求刷溶剂
*/
bool hasRequiredSolventCard() const {
return m_needSolventCard;
}
/**
* @brief 检查是否已经请求刷保养卡
* @return true 已经请求刷保养卡,false 未请求刷保养
*/
bool hasRequiredMaintenanceCard() const {
return m_needMaintenanceCard;
}
/**
* @brief 检查是否已经刷过墨水卡
* @return true 已经刷过墨水卡,false 未刷过墨水
*/
bool hasInkCardBeenSwiped() const {
return m_hasInkCardBeenSwiped;
}
/**
* @brief 检查是否已经刷过溶剂卡
* @return true 已经刷过溶剂卡,false 未刷过溶剂
*/
bool hasSolventCardBeenSwiped() const {
return m_hasSolventCardBeenSwiped;
}
/**
* @brief 检查是否已经刷过保养卡
* @return true 已经刷过保养卡,false 未刷过保养
*/
bool hasMaintenanceCardBeenSwiped() const {
return m_hasMaintenanceCardBeenSwiped;
}
private:
RFIDManager();
// 工具类函数
void CheckSumOut(UCHAR *buf, UCHAR len);
bool CheckSumIn(UCHAR *buf, UCHAR len);
void MySleep(unsigned int msec, int expSize = 8);
void Hex2Str(const UCHAR *sSrc, UCHAR *sDest, int nSrcLen);
void HexStrToByte(const UCHAR* source, UCHAR* dest, int sourceLen);
// 串口
QSerialPort *comForRFID = nullptr;
void comForRFID_init();
int comReadRFID_data();
QByteArray buildMarkCardCommand(int block, int cardType, const QString& originalCardData);
bool verifyWriteResponse(const QByteArray& response, QString notice);
int setRFIDCarKey(void);
int setRFIDReaderKey(int,int);
int setRFIDReaderOriginalKey(void);
int setRFIDReaderWorkMode(void);
int receiveReadRFID_data(void);
int queryReadRFID_address(void);
int superCardDeduct();
bool m_needInkCard = false;
bool m_needSolventCard = false;
bool m_needMaintenanceCard = false;
bool m_hasInkCardBeenSwiped = false;
bool m_hasSolventCardBeenSwiped = false;
bool m_hasMaintenanceCardBeenSwiped = false;
QMutex m_rfidMutex;
QByteArray RFIDReadData;
QString strRevdata;
bool setICReaderModeFlag;
uint checkCardIntervalTime;
SysPara* sysPara = nullptr;
QTimer* RFIDTimer = nullptr;
void initTimer();
bool cardTouchConfirm(QString msgTxt, QString variableMsgTxt);
void cardTouchConfirmAsync(QString msgTxt, QString variableMsgTxt, std::function<void()> callback);
void markInkCard(const QString &strRevdata = QString());
void markSolventCard(const QString &strRevdata = QString());
void markMaintenanceCard(const QString &strRevdata = QString());
//刷卡新需求,刷卡和倒溶剂/墨水不分先后,都可以去除报警提示。
StatuStruct status;
void updateStatus();
QTimer* warningTimer = nullptr;
QMessageBox* m_confirmBox = nullptr;
QTimer* m_confirmTimer = nullptr;
QString m_confirmBoxTxt;
std::function<void()> m_confirmCallback;
int waitStatus();
bool waitCard();
signals:
void sig_showMsg(QString msg);
void sig_maintenanceShow();
// 墨水流程已完成,(墨水、刷卡均已完成)
void sig_inkCardProgressFinished();
// 溶剂流程已完成
void sig_solventProgressFinished();
// 告警累计 3 小时,请求关喷嘴
void sig_warnTimeout(QString);
private slots:
//接收刷卡数据槽函数
void slt_readRFIDData();
//超时处理槽函数
void slt_timerHandle();
//处理刷卡与溶剂/墨水报警标志
// void slt_intervalTimerHandle();
};
#endif // RFIDMANAGER_H