Checking to test compilation
This commit is contained in:
@@ -78,7 +78,7 @@ uint8_t dcBL_getResult(void);
|
||||
|
||||
|
||||
#define RAW_BL_DATALEN 150
|
||||
void gpi_storeRawReceivedData(uint8_t RdDlen, uint8_t *receivedData);
|
||||
void gpi_storeRawReceivedData(uint8_t RdDlen, uint8_t const *receivedData);
|
||||
|
||||
uint8_t epi_getRawReceivedData(uint8_t *receivedData);
|
||||
// retval=length, will be zeroed after first reading
|
||||
|
@@ -148,21 +148,23 @@
|
||||
|
||||
|
||||
// highest priority
|
||||
#define CMDSTACKDEPTH 16
|
||||
// #define CMDSTACKDEPTH 16
|
||||
// means: up to 16 cmd can be stored. They are issued one by one every 100ms
|
||||
void sendWRcmd_clrCmdStack(void);
|
||||
bool sendWRcmd_setSendCommand0(uint16_t nextCmd);
|
||||
bool sendWRcmd_setSendCommand0(uint16_t nextCmd, uint8_t dat1=0, uint8_t dat2=0,
|
||||
uint8_t dat3=0, uint8_t dat4=0);
|
||||
// GUI or app sends a command to DC transfered by serial
|
||||
|
||||
uint16_t sendWRcmd_getSendCommand0(void);
|
||||
uint16_t sendWRcmd_getSendCommand0(uint8_t *dat1=0, uint8_t *dat2=0,
|
||||
uint8_t *dat3=0, uint8_t *dat4=0);
|
||||
|
||||
// lower priority
|
||||
#define CMD4STACKDEPTH 8
|
||||
// #define CMD4STACKDEPTH 8
|
||||
void sendWRcmd_clrCmd4Stack(void);
|
||||
bool sendWRcmd_setSendCommand4(uint16_t nextCmd, uint8_t dat1, uint8_t dat2, uint8_t dat3, uint8_t dat4);
|
||||
uint16_t sendWRcmd_getSendCommand4(uint8_t *dat1, uint8_t *dat2, uint8_t *dat3, uint8_t *dat4);
|
||||
|
||||
#define CMD8STACKDEPTH 4
|
||||
// #define CMD8STACKDEPTH 4
|
||||
void sendWRcmd_clrCmd8Stack(void);
|
||||
bool sendWRcmd_setSendCommand8(uint16_t nextCmd, uint8_t dat1, uint8_t dat2, uint16_t dat3, uint32_t dat4);
|
||||
uint16_t sendWRcmd_getSendCommand8(uint8_t *dat1, uint8_t *dat2, uint16_t *dat3, uint32_t *dat4);
|
||||
@@ -171,7 +173,7 @@ uint16_t sendWRcmd_getSendCommand8(uint8_t *dat1, uint8_t *dat2, uint16_t *dat3,
|
||||
|
||||
// lowest priority
|
||||
// wait for resonse before send next!
|
||||
bool sendWRcmd_setSendBlock160(uint8_t leng, uint8_t *buf);
|
||||
bool sendWRcmd_setSendBlock160(uint8_t leng, uint8_t const *buf);
|
||||
uint8_t sendWRcmd_getSendBlock160(uint8_t *leng, uint8_t *buf);
|
||||
// retval = *leng
|
||||
|
||||
@@ -179,7 +181,7 @@ void sendWRcmd_INI(void);
|
||||
|
||||
|
||||
|
||||
uint8_t epi_store64ByteSendData(uint8_t length, uint8_t *buf);
|
||||
uint8_t epi_store64ByteSendData(uint8_t length, uint8_t const *buf);
|
||||
// HWapi writes data to be forwarded to DC and further to mdb-device
|
||||
// not batched! don't use twice within 100ms
|
||||
|
||||
@@ -211,7 +213,7 @@ uint8_t gpi_getUserOfSendingTextBuffer(uint8_t *para1, uint8_t *para2, uint8_t *
|
||||
// user=1: Text-Print is using this buffer
|
||||
// 2: QR-code-Printer is using this buffer
|
||||
|
||||
#define FDCMD_STACKDEPTH 16
|
||||
//#define FDCMD_STACKDEPTH 16
|
||||
void sendFDcmd_clrStack(void);
|
||||
bool sendFDcmd_set(uint8_t nextWrCmd, uint8_t nextRdCmd, uint8_t blockNum, uint8_t dat1, uint8_t dat2, uint8_t dat3, uint8_t dat4);
|
||||
// write Command to memory, wait for transport
|
||||
@@ -223,9 +225,9 @@ uint8_t check4FDshortCmd(void);
|
||||
uint8_t check4freeFDshortCmd(void);
|
||||
// returns number of free places in short-command stack
|
||||
|
||||
#define FDLONG_STACKDEPTH 16
|
||||
//#define FDLONG_STACKDEPTH 16
|
||||
void longFDcmd_clrStack(void);
|
||||
bool longFDcmd_set(uint8_t nextWrCmd, uint8_t nextRdCmd, uint8_t blockNum, uint8_t length, uint8_t *data);
|
||||
bool longFDcmd_set(uint8_t nextWrCmd, uint8_t nextRdCmd, uint8_t blockNum, uint8_t length, uint8_t const *data);
|
||||
// write Command to memory, wait for transport
|
||||
// data buffer size always 64! data[64], padded with 0
|
||||
bool longFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, uint8_t *length, uint8_t *data);
|
||||
|
22
include/serial_port_thread.h
Normal file
22
include/serial_port_thread.h
Normal file
@@ -0,0 +1,22 @@
|
||||
#ifndef SERIAL_PORT_THREAD_H_INCLUDED
|
||||
#define SERIAL_PORT_THREAD_H_INCLUDED
|
||||
|
||||
#include <QThread>
|
||||
#include <QString>
|
||||
#include <QEventLoop>
|
||||
|
||||
class SerialPortThread : public QThread {
|
||||
Q_OBJECT
|
||||
|
||||
QEventLoop m_loop;
|
||||
public:
|
||||
SerialPortThread(QObject *parent = nullptr);
|
||||
virtual ~SerialPortThread();
|
||||
|
||||
virtual void run() override;
|
||||
|
||||
QEventLoop &getEventLoop() { return m_loop; }
|
||||
};
|
||||
|
||||
|
||||
#endif // SERIAL_PORT_THREAD_H_INCLUDED
|
121
include/serial_port_worker.h
Normal file
121
include/serial_port_worker.h
Normal file
@@ -0,0 +1,121 @@
|
||||
#ifndef SERIAL_PORT_WORKER_H_INCLUDED
|
||||
#define SERIAL_PORT_WORKER_H_INCLUDED
|
||||
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
#include <QTimer>
|
||||
#include <QSerialPort>
|
||||
#include <QSerialPortInfo>
|
||||
#include <QThread>
|
||||
|
||||
#include <assert.h>
|
||||
#include <condition_variable>
|
||||
#include <mutex>
|
||||
#include <queue>
|
||||
#include <deque>
|
||||
#include <iostream>
|
||||
#include <atomic>
|
||||
|
||||
|
||||
struct Command {
|
||||
enum : uint16_t {PRIORITY_1, PRIORITY_2, PRIORITY_3, PRIORITY_4, END_MARK};
|
||||
enum : uint16_t {QUIT_SENTINEL = 0x1000, SEND_BLOCK_SIZE = 160};
|
||||
uint32_t m_priority;
|
||||
uint16_t m_priorityClass;
|
||||
uint16_t m_cmdId;
|
||||
char *m_sendBuffer;
|
||||
char *m_recvBuffer;
|
||||
uint8_t m_sendBufferLength;
|
||||
uint8_t m_recvBufferLength; // expected result length
|
||||
|
||||
static std::atomic<uint8_t> m_nextSendBufferIndex;
|
||||
static std::atomic<uint8_t> m_nextRecvBufferIndex;
|
||||
static char m_sendBuffers[256][SEND_BLOCK_SIZE];
|
||||
static char m_recvBuffers[256][SEND_BLOCK_SIZE];
|
||||
|
||||
static uint32_t getNextCommandPriority(uint8_t cmdType);
|
||||
static char *getNextSendBuffer();
|
||||
static char *getNextRecvBuffer();
|
||||
|
||||
public:
|
||||
Command(uint16_t cmdId, uint8_t sendBufferLength, uint8_t recvBufferLength, uint8_t priorityClass);
|
||||
Command();
|
||||
|
||||
friend bool operator< (Command const& lhs, Command const& rhs) {
|
||||
return lhs.m_priority < rhs.m_priority;
|
||||
}
|
||||
|
||||
friend std::ostream& operator<< (std::ostream& os, Command const& cmd) {
|
||||
return os << "{ " << cmd.m_priority << ", '" << cmd.m_priority << "' } ";
|
||||
}
|
||||
};
|
||||
|
||||
/// \brief SerialPortWorker
|
||||
///
|
||||
/// SerialPortWorker sends and receives data from serial port
|
||||
///
|
||||
class SerialPortWorker : public QThread {
|
||||
Q_OBJECT
|
||||
|
||||
/// \brief Internal serial port.
|
||||
QSerialPort m_serialPort;
|
||||
|
||||
/// \brief Internal serial port info.
|
||||
QSerialPortInfo m_serialPortInfo;
|
||||
|
||||
/// \brief Flag indicating if serial port is opened.
|
||||
bool m_serialPortOpened;
|
||||
|
||||
/// \brief Port name of serial port.
|
||||
QString m_portName;
|
||||
|
||||
/// \brief Baudrate of internal serial port.
|
||||
enum QSerialPort::BaudRate m_baudRate;
|
||||
|
||||
std::priority_queue<Command, std::deque<Command>> m_sendQueue;
|
||||
std::deque<Command> m_recvQueue;
|
||||
std::mutex m_sendQueueMutex;
|
||||
std::mutex m_recvQueueMutex;
|
||||
std::condition_variable m_sendQueueCondVar;
|
||||
std::condition_variable m_recvQueueCondVar;
|
||||
|
||||
std::atomic<uint32_t> m_bytesWritten;
|
||||
std::atomic<uint32_t> m_bytesAvailable;
|
||||
|
||||
SerialPortWorker(QString portName, QSerialPort::BaudRate baudRate, QObject *parent = nullptr);
|
||||
|
||||
Command getNextCommand();
|
||||
void insertResult(Command const &result);
|
||||
|
||||
enum : uint16_t {TIMEOUT = 100, WAIT_TIME_MAX = 1000};
|
||||
|
||||
public:
|
||||
~SerialPortWorker();
|
||||
|
||||
SerialPortWorker(SerialPortWorker const &) = delete;
|
||||
void operator=(SerialPortWorker const &) = delete;
|
||||
|
||||
// serial port im plugin anlegen. erst dann kann getInstance() benutzt werden
|
||||
static SerialPortWorker &getInstance(QString portName, QSerialPort::BaudRate baudRate, QObject *parent = nullptr) {
|
||||
static SerialPortWorker serialPortWorker(portName, baudRate, parent);
|
||||
return serialPortWorker;
|
||||
}
|
||||
|
||||
bool openSerialPort();
|
||||
void closeSerialPort();
|
||||
|
||||
bool isPortOpen() const { return m_serialPortOpened; }
|
||||
|
||||
void insertCommand(Command const &cmd);
|
||||
bool getNextResult(Command &result, int timeout = 1000);
|
||||
|
||||
virtual void run() override;
|
||||
|
||||
void quit();
|
||||
|
||||
private slots:
|
||||
void getBytesAvailable();
|
||||
bool getNumberOfBytesWritten(qint64);
|
||||
};
|
||||
|
||||
#endif // SERIAL_PORT_WORKER_H_INCLUDED
|
@@ -6,7 +6,33 @@
|
||||
|
||||
#include <QSharedMemory>
|
||||
|
||||
// TODO: pid eintragen und convars/mutexe eintragen
|
||||
|
||||
#ifdef __linux__
|
||||
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
// PTHREAD_PROCESS_SHARED
|
||||
|
||||
#else
|
||||
// WIN32
|
||||
#endif
|
||||
|
||||
struct SharedMemBuffer {
|
||||
int init;
|
||||
char appName[32];
|
||||
pid_t pid;
|
||||
pthread_condattr_t sndCndA;
|
||||
pthread_cond_t sndCndV;
|
||||
pthread_mutexattr_t sndMtxA;
|
||||
pthread_mutex_t sndMtx;
|
||||
|
||||
pthread_condattr_t rcvCndA;
|
||||
pthread_cond_t rcvCndV;
|
||||
pthread_mutexattr_t rcvMtxA;
|
||||
pthread_mutex_t rcvMtx;
|
||||
|
||||
struct rs {
|
||||
char comportName[16]; // z.B. "COM48"
|
||||
char baudStr[16]; // z.B. "19200"
|
||||
@@ -18,109 +44,130 @@ struct SharedMemBuffer {
|
||||
char AutoEmissionOn; // 1: zyklisch Anfragen zum Slave senden
|
||||
|
||||
struct datif {
|
||||
#define DATIF_MAXCMDS 16
|
||||
uint16_t sendingPeriod;
|
||||
bool sendingPer_changed;
|
||||
uint8_t OutCmdpara1;
|
||||
uint8_t OutCmdpara2;
|
||||
uint8_t OutCmdpara3;
|
||||
uint8_t OutCmdpara4;
|
||||
uint16_t OutCmdpara5;
|
||||
uint32_t OutCmdpara6;
|
||||
uint8_t dataStep;
|
||||
uint8_t scanStep;
|
||||
uint8_t RDBLKNR;
|
||||
uint8_t cycl_running;
|
||||
} datif;
|
||||
|
||||
#if 0
|
||||
// controlBus.cpp
|
||||
char txt4comStateLine[32];
|
||||
char txt4HsStateLine[32];
|
||||
char txt4masterStateLine[32];
|
||||
char txt4resultStateLine[32];
|
||||
char txt4dataLine[32];
|
||||
char txt4datifReceive[32];
|
||||
char txt4diagWindow[32];
|
||||
char sndTxt4diagWindow[32];
|
||||
bool Sdata_serialTestResult[32];
|
||||
uint8_t Sdata_pProtResultOk[32];
|
||||
uint16_t Sdata_receivedDataLength[32];
|
||||
uint8_t Sdata_receivedDataBlock[64];
|
||||
struct txt4 {
|
||||
char comStateLine[32];
|
||||
char HsStateLine[32];
|
||||
char masterStateLine[32];
|
||||
char resultStateLine[32];
|
||||
char dataLine[32];
|
||||
char datifReceive[32];
|
||||
char diagWindow[32];
|
||||
char sndDiagWindow[32];
|
||||
} txt4;
|
||||
|
||||
// datif.cpp
|
||||
uint8_t dif_dataStep;
|
||||
uint8_t dif_scanStep;
|
||||
uint8_t RDBLKNR;
|
||||
uint8_t datif_OutCmdpara1;
|
||||
uint8_t datif_OutCmdpara2;
|
||||
uint8_t datif_OutCmdpara3;
|
||||
uint8_t datif_OutCmdpara4;
|
||||
struct dcBL {
|
||||
#define SIZEBLRESP 50
|
||||
#define RAW_BL_DATALEN 150
|
||||
uint8_t LastBLcmd; // stored the last sent cmd in order to analys response
|
||||
uint8_t AtbBinFile[300000];
|
||||
uint32_t fileSize;
|
||||
uint16_t nrOfBlocks;
|
||||
uint16_t fileCrc;
|
||||
uint8_t myBuf[300000]; // same content like "dcBL_AtbBinFile" but bytewise
|
||||
char Resp[SIZEBLRESP][32];
|
||||
int pResp;
|
||||
uint8_t step;
|
||||
uint8_t state;
|
||||
uint16_t BlkCtr;
|
||||
uint16_t cyclCtr;
|
||||
uint16_t repeatCtr;
|
||||
} dcBL;
|
||||
|
||||
uint16_t datif_OutCmdpara5;
|
||||
uint32_t datif_OutCmdpara6;
|
||||
uint8_t cycl_running;
|
||||
struct {
|
||||
uint16_t shutterTime;
|
||||
char ticketTemplate[1024];
|
||||
} hwapi;
|
||||
|
||||
// dcBL.cpp
|
||||
uint8_t dcBL_LastBLcmd; // stored the last sent cmd in order to analys response
|
||||
uint8_t dcBL_AtbBinFile[300000];
|
||||
uint32_t dcBL_fileSize;
|
||||
uint16_t dcBL_nrOfBlocks;
|
||||
uint16_t dcBL_fileCrc;
|
||||
uint8_t dcBL_myBuf[300000]; // same content like "dcBL_AtbBinFile" but bytewise
|
||||
struct {
|
||||
uint8_t sendAsynchDataBuf[160]; // no stack, only ONE buffer
|
||||
uint8_t sendAsyDatLen;
|
||||
} next;
|
||||
|
||||
char BlResp[50][32];
|
||||
uint8_t dcBL_step;
|
||||
uint8_t dcBL_state;
|
||||
uint16_t dcBL_BlkCtr;
|
||||
uint16_t dcBL_cyclCtr;
|
||||
uint16_t repeatCtr;
|
||||
uint8_t Sdata_rawData[150];
|
||||
uint8_t Sdata_LengthRawData;
|
||||
struct { // highest priority
|
||||
#define CMDSTACKDEPTH 16
|
||||
// up to 16 cmd can be stored. They are issued one by one every 100ms
|
||||
uint16_t AsynchSend[CMDSTACKDEPTH];
|
||||
uint8_t para1[CMDSTACKDEPTH]; /* used to streamline source */
|
||||
uint8_t para2[CMDSTACKDEPTH]; /* used to streamline source */
|
||||
uint8_t para3[CMDSTACKDEPTH]; /* used to streamline source */
|
||||
uint8_t para4[CMDSTACKDEPTH]; /* used to streamline source */
|
||||
uint8_t nrOfCmdsInQueue;
|
||||
} Cmd0;
|
||||
|
||||
// hwapi.cpp
|
||||
uint16_t hwapi_shutterTime;
|
||||
char ticketTemplate[1024];
|
||||
struct { // lower priority
|
||||
// Command Stack for commands with 4 parameters
|
||||
#define CMD4STACKDEPTH 8
|
||||
uint16_t AsynchSend[CMD4STACKDEPTH];
|
||||
uint8_t para1[CMD4STACKDEPTH];
|
||||
uint8_t para2[CMD4STACKDEPTH];
|
||||
uint8_t para3[CMD4STACKDEPTH];
|
||||
uint8_t para4[CMD4STACKDEPTH];
|
||||
uint8_t nrOfCmdsInQueue;
|
||||
} Cmd4;
|
||||
|
||||
// sendWRcmd.cpp
|
||||
uint16_t nextAsynchsendCmd0[16];
|
||||
uint8_t nrOfCmdsInQueue;
|
||||
uint16_t nextAsynchsendCmd4[8];
|
||||
uint8_t nextCmd4para1[8];
|
||||
uint8_t nextCmd4para2[8];
|
||||
uint8_t nextCmd4para3[8];
|
||||
uint8_t nextCmd4para4[8];
|
||||
uint8_t nrOfCmds4InQueue;
|
||||
uint16_t nextAsynchsendCmd8[4];
|
||||
uint8_t nextCmd8para1[4];
|
||||
uint8_t nextCmd8para2[4];
|
||||
uint16_t nextCmd8para3[4];
|
||||
uint32_t nextCmd8para4[4];
|
||||
uint8_t nrOfCmds8InQueue;
|
||||
uint8_t sendAsynchDataBuf[160]; // no stack, only ONE buffer
|
||||
uint8_t sendAsyDatLen;
|
||||
uint8_t Sdata_mdbSendBuffer[64];
|
||||
uint8_t Sdata_mdbSendLen;
|
||||
uint8_t prnDataParameters[4];
|
||||
uint8_t prnDataBufferUser;
|
||||
char Sdata_PRN_TEXT[20][64];
|
||||
uint8_t pPrnDataBuff; // points to next PRINTER_BLOCK
|
||||
uint8_t nextFDwrCmd[16];
|
||||
uint8_t nextFDrdCmd[16];
|
||||
uint8_t nextFDblkNr[16];
|
||||
struct {
|
||||
#define CMD8STACKDEPTH 4
|
||||
uint16_t AsynchSend[CMD8STACKDEPTH];
|
||||
uint8_t para1[CMD8STACKDEPTH];
|
||||
uint8_t para2[CMD8STACKDEPTH];
|
||||
uint16_t para3[CMD8STACKDEPTH];
|
||||
uint32_t para4[CMD8STACKDEPTH];
|
||||
uint8_t nrOfCmdsInQueue;
|
||||
} Cmd8;
|
||||
|
||||
uint8_t nextFDpara1[16];
|
||||
uint8_t nextFDpara2[16];
|
||||
uint8_t nextFDpara3[16];
|
||||
uint8_t nextFDpara4[16];
|
||||
uint8_t p_nextFDcmdsInQueue;
|
||||
uint8_t longFDwrCmd[16];
|
||||
uint8_t longFDrdCmd[16];
|
||||
uint8_t longFDblkNr[16];
|
||||
uint8_t longFDlength[16];
|
||||
struct { // short command, 4 data bytes
|
||||
#define FDCMD_STACKDEPTH 16
|
||||
uint8_t wrCmd[FDCMD_STACKDEPTH];
|
||||
uint8_t rdCmd[FDCMD_STACKDEPTH];
|
||||
uint8_t blkNr[FDCMD_STACKDEPTH];
|
||||
uint8_t para1[FDCMD_STACKDEPTH];
|
||||
uint8_t para2[FDCMD_STACKDEPTH];
|
||||
uint8_t para3[FDCMD_STACKDEPTH];
|
||||
uint8_t para4[FDCMD_STACKDEPTH];
|
||||
uint8_t cmdsInQueue;
|
||||
} FDShort;
|
||||
|
||||
uint8_t longFDpara[16][64];
|
||||
uint8_t p_longFDcmdsInQueue;
|
||||
struct { // long command, 64 data bytes
|
||||
#define FDLONG_STACKDEPTH 16
|
||||
uint8_t wrCmd[FDLONG_STACKDEPTH];
|
||||
uint8_t rdCmd[FDLONG_STACKDEPTH];
|
||||
uint8_t blkNr[FDLONG_STACKDEPTH];
|
||||
uint8_t length[FDLONG_STACKDEPTH];
|
||||
uint8_t para[FDLONG_STACKDEPTH][64];
|
||||
uint8_t cmdsInQueue;
|
||||
} FDLong;
|
||||
|
||||
// storeInData.cpp
|
||||
bool indat_savePrnPwr;
|
||||
bool indat_saveMifPwr;
|
||||
bool indat_MdbIsOn;
|
||||
#endif
|
||||
struct {
|
||||
uint8_t DataParameters[4];
|
||||
uint8_t DataBufferUser;
|
||||
uint8_t pDataBuff; // points to next PRINTER_BLOCK
|
||||
} prn;
|
||||
|
||||
uint8_t ndbs;
|
||||
uint8_t pari;
|
||||
uint8_t nsb;
|
||||
uint8_t br;
|
||||
struct {
|
||||
bool savePrnPwr;
|
||||
bool saveMifPwr;
|
||||
bool MdbIsOn;
|
||||
} indat;
|
||||
|
||||
uint8_t ndbs;
|
||||
uint8_t pari;
|
||||
uint8_t nsb;
|
||||
uint8_t br;
|
||||
|
||||
#define MAXNROF_GENSTR 16
|
||||
char genStrings[MAXNROF_GENSTR][64];
|
||||
@@ -170,10 +217,13 @@ struct SharedMemBuffer {
|
||||
#define NROFMIFSTATEBYTES 40
|
||||
#define PRN_STATE_ARRAY_SIZE 20
|
||||
#define PRN_STATE_FONT_SIZE 20
|
||||
#define MAXNROF_PRNBYTES 64
|
||||
#define MAXNROF_PRNBLOCKS 20
|
||||
uint8_t MIF_STATE[NROFMIFSTATEBYTES];
|
||||
uint8_t MIF_DATA[12][64];
|
||||
uint8_t PRN_STATE[PRN_STATE_ARRAY_SIZE];
|
||||
uint8_t PRN_FONTS[PRN_STATE_FONT_SIZE];
|
||||
char PRN_TEXT[MAXNROF_PRNBLOCKS][MAXNROF_PRNBYTES];
|
||||
bool mdb_busRdy;
|
||||
bool mdb_V12on;
|
||||
bool mdb_V5on;
|
||||
@@ -193,6 +243,10 @@ struct SharedMemBuffer {
|
||||
uint8_t pProtResultOk;
|
||||
uint16_t receivedDataLength;
|
||||
uint8_t receivedDataBlock[64];
|
||||
uint8_t rawData[150];
|
||||
uint8_t LengthRawData;
|
||||
uint8_t mdbSendBuffer[64];
|
||||
uint8_t mdbSendLen;
|
||||
} Sdata;
|
||||
|
||||
uint8_t mif_cardType;
|
||||
|
Reference in New Issue
Block a user