From 60726093df809ff532c9e1ebcba48cafe24d995b Mon Sep 17 00:00:00 2001 From: Thomas Sax Date: Thu, 1 Jun 2023 16:38:12 +0200 Subject: [PATCH] Merged new function to DCPlugin (01.06.2023). --- include/controlBus.h | 2 +- include/datIf.h | 4 +- include/datei.h | 202 ++++ include/hwapi.h | 216 ++--- include/interfaces.h | 1616 -------------------------------- include/prot.h | 3 - include/sendWRcmd.h | 27 +- include/shared_mem_buffer.h | 8 + include/storeINdata.h | 258 +++++- plugins/interfaces.h | 403 +++++--- src/com.cpp | 34 +- src/controlBus.cpp | 377 ++++++-- src/datIf.cpp | 142 ++- src/datei.cpp | 943 +++++++++++++++++++ src/hwapi.cpp | 960 ++++++++++--------- src/main.cpp | 9 + src/sendWRcmd.cpp | 254 ++++- src/shared_mem_buffer.cpp | 7 + src/storeINdata.cpp | 1744 ++++++++++++++++++++++++----------- 19 files changed, 4055 insertions(+), 3154 deletions(-) create mode 100644 include/datei.h delete mode 100644 include/interfaces.h create mode 100644 src/datei.cpp create mode 100644 src/main.cpp diff --git a/include/controlBus.h b/include/controlBus.h index 3dc8b11..6619e6e 100644 --- a/include/controlBus.h +++ b/include/controlBus.h @@ -170,7 +170,7 @@ uint8_t epi_getResultOfLastRequest(); // retval: 0: in progress 1: OK 2: error -void gpi_storeRecPayLoad(uint8_t RdDlen, uint8_t const *receivedData); +void gpi_storeRecPayLoad(uint8_t RdDlen, uint8_t *receivedData); // stored by Datif uint16_t epi_getLastPayLoad(uint16_t plBufSiz, uint8_t *payLoad); diff --git a/include/datIf.h b/include/datIf.h index f858aec..7c7631a 100644 --- a/include/datIf.h +++ b/include/datIf.h @@ -303,6 +303,7 @@ class T_datif : public QMainWindow // docNr =transmitted in WRITEADDRESS high byte // blockNr=transmitted in WRITEADDRESS low byte + int datif_noResponseCtr; T_prot *myDCIF; QTimer *datif_trigger; @@ -315,9 +316,6 @@ private slots: public: T_datif(QWidget *parent = nullptr); - T_prot *getProt() { return myDCIF; } - T_prot const *getProt() const { return myDCIF; } - void resetChain(void); char isPortOpen(void); void sendWRcommand(uint16_t nxtAsCmd); diff --git a/include/datei.h b/include/datei.h new file mode 100644 index 0000000..874235e --- /dev/null +++ b/include/datei.h @@ -0,0 +1,202 @@ +#ifndef DATEI_H +#define DATEI_H + +#include +#include +#include +#include +#include "tslib.h" +#include +#include +#include +#include +#include + + // create csv file with: +#define FILESEPERATOR ',' + + // pasre csv with: +#define FILESEP1 ',' +#define FILESEP2 ';' + +#define NEWLINEINFILE '\n' +#define MAXNUMBEROFSEQUENCES 200 + // only for csv files + + +// all generated files located in sudirectory "dynamic machine data - dmd" + +#define FILENAME_SHAREDDATA "../dmd/DCshare.csv" +#define FILENAME_SHARED_UID "../dmd/DC_UID.csv" + +// ------------------------------------------------------------------------------------------------- +// ------------------------------------------------------ create csv file ------------------------------- +// ------------------------------------------------------------------------------------------------- + + +// create array with strings and values (to be written to file) +void csv_startCreatingFile(void); +void csv_addTextToFile(QString myText); +void csv_addIntToFile(int myValue); +void csv_addUintToFile(uint myValue); +void csv_addLongvalToFile(qlonglong myValue); +void csv_addUlongvalToFile(qulonglong myValue); +//void csv_addCurrentTimeToFile(void); +//void csv_addCurrentDateToFile(void); +void csv_addNewlineToFile(void); +QByteArray csv_readbackArray(void); + + +// ------------------------------------------------------------------------------------------------- +// ------------------------------------------------------ parse csv file ------------------------------- +// ------------------------------------------------------------------------------------------------- + + +// return number of entries in the just read file (entries are seperated by +// comma or line-feed) +uint32_t csv_nrOfEntriesInFile(QByteArray readFromFile); + +// before: QByteArray sourceFile=datei_readFromFile(filename); + +QByteArray csv_getOneFileSequence(QByteArray sourceFile, uint32_t sequNr); +// not needed, just for test // sequNr: 0....(size-1) + +// get single entries of of the just read file: +int csv_getEntryAsInt(QByteArray sourceFile, uint32_t sequNr); + // sequNr: 0....(size-1) + +int32_t csv_getEntryAsLong(QByteArray sourceFile, uint32_t sequNr); + // sequNr: 0....(size-1) + +uint8_t csv_getEntryAsUshort(QByteArray sourceFile, uint32_t sequNr); + // sequNr: 0....(size-1) + +uint16_t csv_getEntryAsUint(QByteArray sourceFile, uint32_t sequNr); + // sequNr: 0....(size-1) + +uint32_t csv_getEntryAsUlong(QByteArray sourceFile, uint32_t sequNr); + // sequNr: 0....(size-1) + +uint64_t csv_getEntryAs2Ulong(QByteArray sourceFile, uint32_t sequNr); + // sequNr: 0....(size-1) + +QString csv_getEntryAsString(QByteArray sourceFile, uint32_t sequNr); + // sequNr: 0....(size-1) + + +// ------------------------------------------------------------------------------------------------- +// ------------------------------------------------------ create Json Record ------------------------------- +// ------------------------------------------------------------------------------------------------- + +void json_startRecord(void); + // clear buffer and write opening curly bracket { + +void json_enterIntToRecord(QString attribute, ulong i_value); + // example: "parameter":1234567890 + +void json_enterTextToRecord(QString attribute, QString txt_value); + // example: "parameter":"slow" + +//void json_addCurrentTimeToRecord(QString attribute); + // example: if attribute=myTime: "myTime":"hh_mm_ss" + +//void json_addCurrentDateToRecord(QString attribute); + // example: if attribute=myDate: "myDate":"dd.mm.yyyy" + // also / possible as seperator + // further possible forms: + // format= 0: dd.mm.yyyy (deutsch) + // 1: mm.dd.yyyy (amerika) + // 2: yyyy.mm.dd (Iran, Dubai) + // 3: dd.yyyy.mm + // 4: mm.yyyy.dd + // 5: yyyy.dd.mm + +void json_enterArrayToRecord(QString attribute, uint8_t *buf, ulong nrofVals); + // add array of numbers with "nrofVals" elements + +void json_enterStructToRecord(QString attribute); + // every call must be concluded with an extra "json_finishFile()" + // example: "sname":{ + +void json_finishStruct(void); + +void json_finishRecord(void); + // close curly bracket + + +QString json_readbackRecordStr(void); + +QByteArray json_readbackRecordBa(void); + + +// ------------------------------------------------------------------------------------------------- +// ------------------------------------------------------ parse Json file ------------------------------- +// ------------------------------------------------------------------------------------------------- + +// first: QByteArray datei_readFromFile(QString filename); + +//void datei_json_readTestFile(QString filename); + +int json_nrOfPairsInFile(QByteArray filename); + +bool json_exists(QByteArray filename, QString searchForKey); + // look for "searchForKey" =name of the pair (left of : ) + // retval true if exists + +bool json_remove(QByteArray filename, QString searchFor); + // look for "searchFor" =name of the pair (left of : ) and remove the record from file + // retval true if removed + +QString json_searchForStringInFile(QByteArray filename, QString searchFor); + // look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String + +int json_searchForIntInFile(QByteArray filename, QString searchFor); + // look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String + +//....................... + +QJsonObject json_searchForObjectInFile(QByteArray filename, QString searchFor); + // return an object from the json file + +int json_nrOfPairsInObject(QJsonObject objname); + +QString json_searchForStringInObject(QJsonObject objname, QString searchFor); + // look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String + +int json_searchForIntInObject(QJsonObject objname, QString searchFor); + // look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String + +//....................... + +QJsonArray json_searchForArrayInFile(QByteArray filename, QString searchFor); + // look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String + +int json_nrOfValuesInArray(QJsonArray arrayname); + +bool json_getValuesOfArray(QJsonArray arrayname, int *buf, int MaxBufferSize); + // assuming that the array consists of integers + + + +// ------------------------------------------------------------------------------------------------- +// ------------------------------------------------------ read, write, copy files ------------------- +// ------------------------------------------------------------------------------------------------- + +void datei_closeFile(QString filename); + +// read content of an exiting file: +QByteArray datei_readFromFile(QString filename); + +bool datei_ifFileExists(QString filename); + +char datei_writeToFile(QString filename, QByteArray content); + // retval=0 if successful 1: no write access allowed + // 2:cannot open to append 3:cannot create new file + +bool datei_copyFile(QString currentFileName, QString newFileName); + // retval=true if successful + +bool datei_clearFile(QString filename); + // retval=true if successful + +#endif // DATEI_H diff --git a/include/hwapi.h b/include/hwapi.h index a2c1410..15b5a92 100644 --- a/include/hwapi.h +++ b/include/hwapi.h @@ -17,81 +17,22 @@ matching interfaces.h: //#define HWINF_iid "Atb.Psa2020.software.HWapi/3.1" //#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.1" #define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.3" - - -PSA1259 hardware control using the DeviceController DC2 - -covering enclosure (switches and doors) and money devices, -controls mifare card to access or program -optional it can control printer, modem, bar code reader and credit card - - * API to the PSA1259 Hardware - * All data come in from device controller via serial interface and will be stored - * in "PI" = peripheral image - * PI is updated every 100ms (up to 30ms possible) - * This api uses stored pi data and returns them in the following functions - * created: Q1/2020 TS - * - -The devices, connected to device controller2 (DC2) can be controlled in different access levels. -Level 1: - direct connection to DC2, check versions, state and parameters - control serial interfaces - digital/analog IO's - read and write to connected devices on lowest level, this is a kind of fall-back-level - in case higher levels fail or do not support the needed (new) function - Example: send a specific printer command, several bytes that need to be conform to - printer manual. This command is routed to the printer through the DC2 without - any action of the DC. You can write your own device driver that way. - Level 1 is flexible but complicated - -Level 2: - The DC controls the connected devices containing a device driver. The DC offers - usage of the device by simple commands, - Example: "Printer on", "set Font size 3" "print "hello world"", "cut" - In opposite to level 1 where you had to send a set of numbers and letters. - In other words: you "talk" to the device controller, not to the device itself. - -Level 3: - start/stop complete processes. - Example: 1) print (predefined) document nr 3 with Text, letter size, font set, cut. - Also power up/down the printer, check if paper ok and so on. */ -/* -Another access example: control the coin unit - -Level 1): read digital inputs to detect coin, - switch digital output which opens coin slot - communicate with coin checker by certain mdb-commands (manual conform) - poll coin checker for inserted coins - close coin slot after 3seconds by setting DO to 0.... - -Level 2): get message of attached coin from DC - send command "initialize coin checker" to DC - send command "open slot for 3s" - poll DC for inserted coins, DC polls coin checker in right way, no need - to know the data sheet of the coin checker or mdb-bus - command to DC "open coin escrow's return flap for 1s" - -Level 3): send command: "start payment process" - all coin devices are started up - coin blocker opens for 3s if a coin is attached - coin checker summarizes inserted value and reports sum - later send command "stop payment process" (puts coins to vault) or - send command "cancel payment process" (returns coins to user) - -*/ #ifndef hwapi_H #define hwapi_H #include +#include +#include +#include #include -#include "interfaces.h" +#include <../plugins/interfaces.h> #include "datIf.h" -class QSharedMemory; + + class hwapi : public QObject, public hwinf { @@ -100,32 +41,16 @@ class hwapi : public QObject, Q_INTERFACES(hwinf) private: void sub_storeSendingText(QByteArray *buf) const; + QTimer *hwapi_TimerPayment; - DownloadResult sendNextAddress(int bNum) const; - DownloadResult sendNextDataBlock(QByteArray const &b, int bNum) const; - DownloadResult sendStatus(int ret) const; - DownloadResult dc_downloadBinary(QByteArray const &binary) const; - - bool startBootloader() const; - bool stopBootloader() const; - bool openSerial(int br, QString baudrate, QString comPort) const; - bool closeSerial(QString comport) const; - bool resetDeviceController() const; - QByteArray loadBinaryDCFile(QString filename) const; - bool downloadBinaryToDC(QString const &bFile) const; - - QSharedMemory *m_sharedMem; public: - explicit hwapi(QObject *parent = nullptr); - virtual ~hwapi(); + explicit hwapi(QWidget *parent = nullptr); T_datif *myDatif; - virtual QStringList dc_getStatus() const; - // ------------------------------------------------------------------------------ - // Level 0 commands, interface + // commands, interface // open, close, change serial interface // actually not neccessary as it is opened automatically on program start // start automatic READ requests @@ -137,7 +62,7 @@ public: // ComName: for example "COM48" // connect: 0, 1 - bool dc_closeSerial(void) const override; + void dc_closeSerial(void) const override; bool dc_isPortOpen(void) const override ; @@ -145,21 +70,10 @@ public: // select if READ-Requests are sent manually one by one or automatically // automatically request ALL digital and analog sensors, get time/date, get status information - bool dc_updateDC(QString binFileName, QString baudrate, - QString comPort) const override; - - bool dc_updatePrinterTemplate(enum FileTypeJson type, - QVector templateIdx, - QVector fnames, - QString br, - QString serial = QString()) const override; - bool dc_printTemplate(enum FileTypeJson type, - QVector templateIdx, - QString br, - QString serial = QString()) const override; + // ------------------------------------------------------------------------------ - // Level 1, control device-controller (functions of µC) + // control device-controller (functions of µC) // check serial connection to deviceController // read response from DC2 (input data) // some test function for serial communication @@ -246,8 +160,15 @@ public: uint8_t bl_exitBL(uint8_t *sendData) const override; // minimum size of sendData-buffer: 5byte retval: length + + + + + + + // ------------------------------------------------------------------------------ - // Level 2 DC2-onboard devices + // DC2-onboard devices // WR: set time // RD. get time, get measure, get test results // ------------------------------------------------------------------------------ @@ -321,7 +242,7 @@ public: bool dc_mainFuseIsOk(void) const override; // ------------------------------------------------------------------------------ - // Level 3: digital outputs and simple switching of connected devices + // igital outputs and simple switching of connected devices // simple processes like flashing a led or open flap for 1s // ------------------------------------------------------------------------------ @@ -377,7 +298,7 @@ public: // ------------------------------------------------------------------------------ - // Level 3: digital inputs of connected devices + // digital inputs of connected devices // ------------------------------------------------------------------------------ bool door_isContactPowerOn(void) const override; @@ -739,29 +660,29 @@ public: // up to 8 dynamic values can be defined in the template ("print val3 here") and will be sent with printing command // example: print current time at this point (the time of printing not the storage time!!) - void pri_startTicketDesign(void) const override; + //void pri_startTicketDesign(void) const override; // start for every new printer document, reseting collecting buffer // all further functions write/append text, numbers and command to the ticket-buffer, up to 1278 bytes allowed // return val of the appending functions: true=ok false=too long, buffer full - int pri_TD_getCurrentSize(void) const override; + //int pri_TD_getCurrentSize(void) const override; // retval: 0...1278 - bool pri_TD_addText(QByteArray text) const override; + //bool pri_TD_addText(QByteArray text) const override; // example: pri_TD_addText("Hello") const override; // example: pri_TD_addText(tempStr) const override; // retval: true=ok false=too long, buffer full - bool pri_TD_addValue(int val) const override; + //bool pri_TD_addValue(int val) const override; // +/- 0...2^(31) - bool pri_TD_addNewLine(void) const override; + //bool pri_TD_addNewLine(void) const override; - bool pri_TD_addSign(char sign) const override; + //bool pri_TD_addSign(char sign) const override; // example: '.' ' ' 0x20 'W' '$' - bool pri_TD_addCommand(char group, char attribute, char p1, char p2, char p3, char p4, char p5) const override; + //bool pri_TD_addCommand(char group, char attribute, char p1, char p2, char p3, char p4, char p5) const override; // always add 8 byte to the ticket layout: ESC & group & attribute & parameter1...5 /* complete list of possible commands: group 50 : paper @@ -802,11 +723,11 @@ public: */ - char prn_clearDocument(uint8_t documentNumber) const override; + //char prn_clearDocument(uint8_t documentNumber) const override; // clear memory buffer for ONE document // function takes a second! don't send right before "store doc" - bool prn_store_Document(uint8_t documentNumber ) const override; + //bool prn_store_Document(uint8_t documentNumber ) const override; // send the predefined Layout (generated with above TD functions) to DeviceController to save // documentNumber=0...15 @@ -818,7 +739,7 @@ public: // the place in the ticket layout is predefined (already in DC memory) // the dynamics are first calculated at printing time - bool prn_printDocument(uint8_t documentNumber, struct T_dynDat *dynTicketData) const override; + //bool prn_printDocument(uint8_t documentNumber, struct T_dynDat *dynTicketData) const override; @@ -922,7 +843,7 @@ public: void bl_rebootDC(void) const override; void bl_startBL(void) const override; - bool bl_checkBL(void) const override; + void bl_checkBL(void) const override; bool bl_isUp(void) const override; // return true is bl is up and running // also initializes "sendFile" @@ -999,6 +920,7 @@ public: // return true if successful. could fail if more the 8 commands are waiting bool rtc_getExtendedTime(uint8_t *leng, uint8_t *data) const override; + bool rtc_getExtendedTime(struct T_extTime *exTime) const override; bool sys_runCompleteTest(void) const override; @@ -1045,9 +967,23 @@ public: bool prn_printTestTicket(void) const override; // return true if sending to DC OK, false if cmd-stack is full + + + bool cash_startPayment(uint32_t amount) const override; // 17.4.23TS: extended to 32bit + uint8_t cash_paymentProcessing(void) const override; + // run this function periodically while coin payment process to generate necessary signals + // return value: + // 0: stopped 1: starting up 2: coin collection + // 3: finished by User (Push button) 4: finished, Max-Value collected + // 5: finished by escrow + // 10,11: error cannot start + // 12: timeout while payment, coins returned + // 13: stopped by unexpected error + + bool cash_cancelPayment(void) const override; // and return coins @@ -1081,11 +1017,22 @@ public: uint64_t sys_getWakeSource(void) const override; // retval: 6 bytes, bit coded, 1=event keeps DC awake + uint8_t sys_getWakeReason(void) const override; + // Master was woken by following reason: + // 1: MDB Event + // 2: Coin Event + // ( 3: Master Event) - will not set the wake line + // ( 4: 32s pulse) - will not set the wake line + // 5: Door Event + // ( 6: Diag Event) - will not set the wake line + // 7: 30min-Pulse for HB + void sys_getDeviceConditions(uint8_t *leng, uint8_t *data) const override; void sys_getDeviceConditions(struct T_moduleCondition *devCond) const override; void sys_getDynMachineConditions(uint8_t *leng, uint8_t *data) const override; + void sys_getDynMachineConditions(struct T_dynamicCondition *dynMachCond) const override; @@ -1104,17 +1051,58 @@ public: // bit5: printer not ready + void sys_sendDeviceParameter(struct T_devices *deviceSettings) const override; + + void sys_restoreDeviceParameter(struct T_devices *deviceSettings) const override; + + bool sys_areDCdataValid(void) const override; + + bool sys_sendingTest(void) const override; + + void prn_requestCurrentDynData(void) const override; + + bool prn_getCurrentDynamicPrnValuesFromDC(uint8_t *dynPrnVal ) const override; + // which was sent with: bool prn_sendDynamicPrnValues(uint8_t *dynPrnVal ) const override; + + bool prn_dynDataAreEqual(uint8_t *buf) const override; + + bool prn_printKombiticket(uint8_t nrOfKombi) const override; + // print four of the templates loaded by Json prior + // nr = 1..8 + + void lock_triggerUpperSolenoid(void) const override; + + void lock_triggerLowerSolenoid(void) const override; + + signals: void hwapi_templatePrintFinished_OK(void) const override; void hwapi_templatePrintFinished_Err(void) const override; + + void hwapi_coinCollectionJustStarted(void) const override; + void hwapi_coinCollectionAborted(void) const override; + void hwapi_gotNewCoin(void) const override; - void hwapi_vendStopByMax(void) const override; - void hwapi_vendStopByPushbutton(void) const override; + void hwapi_payStopByMax(void) const override; + void hwapi_payStopByPushbutton(void) const override; + + void hwapi_payStopByEscrow(void) const override; + void hwapi_payStopByError(void) const override; + void hwapi_payStopByTimeout(void) const override; + void hwapi_payCancelled(void) const override; + + void hwapi_coinProcessJustStopped(void) const override; + + + + + private slots: void hwapi_slotPrintFinished_OK(void); void hwapi_slotPrintFinished_Err(void); void hwapi_slotGotCoin(void); + void hwapi_slotPayProc(void); }; diff --git a/include/interfaces.h b/include/interfaces.h deleted file mode 100644 index a676355..0000000 --- a/include/interfaces.h +++ /dev/null @@ -1,1616 +0,0 @@ -#ifndef INTERFACE_H -#define INTERFACE_H - -#include -#include - -struct T_emp { - // Fixdata from EMP: - uint8_t shaft; // = changer level - uint16_t countryCode; - uint8_t scale; - uint8_t decimals; - uint8_t coinValues[16]; - uint16_t routing; - - // Master specs: - uint8_t gotSetup; // 1: got specifications from master 0: no specs - uint16_t coinAccept; // bit 0 = coin1 bit H=accept - uint8_t tokenChannel; - uint16_t denomination[16]; - - // dynamic: - uint8_t state; // step counter of EMP (electronic coin checker) FSM (finite state machine): - // 0=Emp & Bus power off, 1=powered, poll off 2=polling on - // 3=device responded, requesting status - // 4=waiting for status 5=have status, - // 6: IDLE, have paramters from master, polling running, ready for payment - // Master can stop/start polling and acceptance - // 7: end of transaction, polling on, accept off, reporting coins, (wait for last coin) - // 8: transaction running, polling on, acceptance on, reporting coins, - - uint8_t pollingRunning; - uint8_t paymentRunning; -}; - -struct Trtc_DateTime { - uint8_t rtc_hour; - uint8_t rtc_min; - uint8_t rtc_sec; - uint8_t rtc_dayOfMonth; - uint8_t rtc_month; - uint8_t rtc_year; - uint8_t rtc_dayOfWeek; -}; - -struct Tprn_hw_state { - // hardware (IO's) - bool powerRdBk; // prn pwr is on - bool rsSwOk; // serial switch (printer or modem) is set to printer - bool rsDrvOk; // RS232 converter for PTU, Printer and Modem in on - - bool ReadyLine; // HW signal from printer showing ready - bool inIdle; // powered and free from errors - bool paperNearEnd; // paper roll runs out - bool noPaper; - bool ErrorTemp; - bool HeadOpen; - bool cutterJam; - bool noResponse; // printer is not connected, cable broken, wrong baudrate - bool badResponse; -}; - -struct Tprn_currentSettings { - uint8_t currFont; - uint8_t currSize; - uint8_t currHeigth; - uint8_t currWidth; - bool nowBold; - bool nowInvers; - bool nowUnderlined; - uint8_t currDensity; - uint8_t currSpeed; - bool nowAligned; -}; - -struct T_dynDat { - uint8_t licensePlate[8]; - uint8_t vendingPrice[8]; - uint8_t parkingEnd[8]; - uint8_t currentTime[8]; - uint8_t currentDate[8]; - uint8_t dynDat5[8]; - uint8_t dynDat6[8]; - uint8_t dynDat7[8]; -}; - -struct T_vaultRecord { - // Kassenbeleg (Abrechnungsdatensatz = Kassenwechsel-Datensatz) - char startbuffer[4]; // Psa> // never move or change this 1st entry - uint16_t AccountingNumber; - uint16_t CUNU; - uint16_t MANU; - uint16_t resint1; - //uint16_t resint2; - - char label1buffer[4]; // tim> - uint8_t year; - uint8_t month; - uint8_t dom; - uint8_t hour; - uint8_t min; - uint8_t sec; - uint8_t DoW; - uint8_t reschar3; - - char label2buffer[4]; // abs> - uint32_t AbsIncome1; - uint32_t AbsReserve; - uint32_t AbsNrOfCuts; - -//16 - char label3buffer[4]; // mw > - - // Verkauf, Tür zu: - uint32_t VKcoinsInserted[16]; // nur für Wechsler, soviel wurde eingeworfen - uint32_t VKcoinsReturned[6]; // nur für Wechsler, Anzahl Münzen pro Typ, soviel wurde zurückgegeben -//88 - // Service, Tür offen: - uint16_t ServCoinsInserted[16]; // nur für Wechsler, soviel wurde eingeworfen - uint16_t ServCoinsReturned[6]; // nur für Wechsler, Anzahl Münzen pro Typ, soviel wurde zurückgegeben - uint16_t resint3; - uint16_t resint4; - uint16_t currentTubeContent[6]; // nur für Wechsler, aktueller Füllstand - uint16_t resint5; - uint16_t resint6; -// 56 - char label4buffer[4]; // box> - uint16_t coinsInVault[16]; - uint16_t billsInStacker[8]; -// 48 - char label5buffer[4]; // val> - // actually constant unless exchange rate is changed - uint16_t coinDenomination[16]; // 5..50000 (z.B. 2? sind in Ungarn 760Ft) - uint16_t billDenom[8]; - uint16_t tubeDenom[6]; - uint16_t exchangeRate; - uint16_t resint9; -// 64 - char endofblock[4]; // end> -// 316 byte Block im Speicher -}; - -struct T_moduleCondition { - // store conditon of all system components, hold in RAM - // 0 means unknown, not yet tested/used - // 1 means OK - // 50..99 = HINT / Notification - // 100..150 = WARNING - // 200..250 = ERROR - - uint8_t ram; - uint8_t intEe; - uint8_t extEe; - - uint8_t rtc; // 1: time/date OK 100: time not plausible 200: hardware error - uint8_t boardHw; - uint8_t printer; - uint8_t modem; - - uint8_t signal; // 1...99 - uint8_t regist; // 100:not 1:reg 2:ping OK 3:gotTime - uint8_t mdbBus; - uint8_t coinChecker; // EMP, OMP or mei-cashflow - - uint8_t coinEscrow; - uint8_t mifareReader; - uint8_t creditTerm; - uint8_t coinReject; - - uint8_t coinSafe; - uint8_t billSafe; - uint8_t voltage; // 1:11..14V - uint8_t temper; - - uint8_t poweronTest; - uint8_t doorState; // 1: alles zu 200: t?r offen + bit1(S) +bit2(CB) + bit3(CB) - uint8_t doorWasOpened; // 1: all doors are closed 200: any door was just opened - uint8_t changer; // can only be tested by usage - - uint8_t coinBlocker; // can only be tested by usage - uint8_t billReader; // can only be tested by usage - uint8_t ResetReason; - uint8_t allModulesChecked; - - uint8_t alarmState; - uint8_t res11; - uint8_t res12; - uint8_t res13; -}; - -struct T_dynamicCondition { - char allDoorsDebounced; - char openedAuthorized; - uint8_t CBinDebounced; - char upperDoor; // 0:fehlt 1:drin - char middleDoor; - char lowerDoor; - char coinBox; - char billBox; - char modeAbrech; - char onAlarm; - char nowCardTest; - char nowPayment; - char lastMifCardType; - uint8_t lastSDoorState; - uint8_t lastVDoorState; - uint8_t lastCBstate; - char paymentInProgress; - char res1; - uint16_t U_Batt; - uint16_t Temperatur; - uint16_t nrCoinsInBox; - uint32_t amountInBox; - uint32_t totalTransVolume; - uint32_t totalNrOfVends; - char jsonValid_config; - char jsonValid_device; - char jsonValid_cash; - char jsonValid_print; - char jsonValid_serial; - char jsonValid_time; - char lastFileType; -// 44 - uint8_t MifCardHolder[8]; - uint8_t resultOfLastTemplPrint; - // 0: unknown or printing in progress - // 1: OK, doc was printed 2: error, doc was not printed - uint8_t lastPrinterStatus; - // 0: printer OK - // bit0: near paper end bit1: no paper - // bit2: temperature error bit3: error head open - // bit4: paper jam in cutter - // bit6: no response bit7: serial rec. error - // bit5: printer not ready -//54 -}; - -struct T_extTime { - uint8_t Hours; - uint8_t Min; - uint8_t Sec; - uint8_t Year; - uint8_t Month; - uint8_t Day; - uint8_t DOW; - uint8_t res1; - uint16_t MinOfDay; - uint16_t res2; - uint32_t SecOfDay; - uint8_t isLeapYear; - uint8_t nxtLeapYear; - uint8_t lastLeapYear; - uint8_t hoursOfThisWeek; - uint16_t minutesOfThisWeek; - uint16_t hoursOfThisMonth; - uint16_t daysOfThisYear; - uint16_t GetHoursOfYear; - uint16_t res3; - uint32_t GetMinutesOfYear; - uint8_t getWakeIntvSec; - uint8_t res4; - uint16_t res5; - uint32_t MinutesOfMillenium; -}; - -class hwinf { -public: - enum class DownloadResult {OK, ERROR, TIMEOUT, NOP}; - enum class FileTypeJson {CONFIG=1, DEVICE, CASH, SERIAL, TIME, PRINTER}; - - virtual ~hwinf() {} - - virtual QStringList dc_getStatus() const = 0; - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // Use serial interface and protocol stack in Cashagent-Library - // Sending Output data to DeviceController DC2b - // Sending input requests to DC2 (single or auto-batch) - // Getting input data as receiver payload - // Furthermore the Cashagent-Library answers with status strings about sending and reading result - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - virtual bool dc_openSerial(int BaudNr, QString BaudStr, QString ComName, uint8_t connect) const = 0; - // Command: open serial interface - // BaudNr: 0:1200 1:9600 2:19200 3:38400 4:57600 5:115200 - // BaudStr: for exapmle "19200" - // ComName: for example "COM48" - // connect: 0, 1 - - virtual bool dc_closeSerial(void) const = 0; - // Command: close serial interface in order to save power while power down - // or if another port must be used - - virtual bool dc_isPortOpen(void) const =0; - // returns true if port open (don't send unless open. Sending to closed port will crash program) - - - - virtual uint8_t test_serialState(void) const =0; - // test on-board signals for the serials - // serial drv on/off, Serial mux1, Serial mux2 - - virtual bool test_serialIsOn(void) const =0; - - virtual bool dc_updateDC(QString binFileName, - QString baudrate, - QString comPort) const = 0; - // download binary file down into device controller - - virtual bool dc_updatePrinterTemplate(enum FileTypeJson type, - QVector templateIdx, - QVector fnames, - QString br, - QString serial = QString()) const = 0; - - virtual bool dc_printTemplate(enum FileTypeJson type, - QVector templateIdx, - QString br, - QString serial = QString()) const = 0; - - virtual void dc_autoRequest(bool on) const =0; - // on = true: select that all READ-Requests are sent automatically - // on = false: select that all READ-Requests are sent manually one by one - // Every input information from DC2 must be requested - // ( digital and analog sensors, get time/date, get status information ) - - virtual uint8_t dc_isRequestDone(void) const =0; - // retval: 0: request is still in progress - // 1: answer from DC2 was OK - // 2: wrong answer from DC2 - - virtual uint16_t dc_getCompletePayLoad(uint16_t plBufSiz, uint8_t *payLoad) const =0; - // get data back in "payLoad", max 64 byte, can be used for diagnosis - // retval = nr of bytes received. If host buffer too small then - // only plBufSiz bytes are copied to "payLoad" - // plBufSiz­z=size of host buffer - - virtual void dc_requTestResponse() const =0; - // tell DC2 to send a test-string, useful to see if cable and baudrate is OK - - virtual bool dc_readAnswTestResponse() const =0; - // retval: true: test was successful, got right response - - virtual uint8_t getRawRecLength(void) const =0; - // only needed if protocol stack in Cashagent-Library is bypassed - - virtual uint8_t getRawReceivedData(uint8_t *receivedData) const =0; - // only needed if protocol stack in Cashagent-Library is bypassed - - virtual QString dc_getSerialState(void) const =0; - // get result of opening-command like "ttyS0 opened with 115200 8N1! - // or error messages like "comport not available..." - // was saved by last opening event, can be passed for 100ms - - virtual void dc_clrSerialStateText(void) const =0; - // clear above text to avoid multiple repetive displaying - - - virtual QString dc_getTxt4HsStateLine(void) const =0; - // return string with status of handshakes - - virtual void dc_clrTxt4HsStateLine(void) const =0; - // clear above text to avoid multiple repetive displaying - - - virtual QString dc_getTxt4masterStateLine(void) const =0; - // returns string telling if the received packet is valid and complies protocol - // if OK: "slave response OK" in case of error: "wrong length received", "wrong start sign received", - // "received datalen to big", "wrong data len received", "wrong crc received" - - virtual void dc_clrTxt4masterStateLine(void) const =0; - // clear above text to avoid multiple repetive displaying - - - virtual QString dc_getTxt4resultStateLine(void) const =0; - // returns string telling response of DC. First question: did DC get a correct request telegram? - // and if: 2nd question did DC perform the contained output and input commands - // if OK: "Slave OUT and IN Result: 0 0" - // in case of error: "slave got wrong start sign" ..length" ...crc" ... address" - // slave does not perform and command! - // 2nd) received telegram was OK, DC tried to perform the master commands. result - // result of writing data (e.g switching leds and motors, sending stuff to printer...) - // OUT = 0: OK 1: unknown command 2: operation not possible - // result of reading data (e.g. switches, voltages, accepted coins, printer status....) - // IN = 0: OK 1: unknown command 2: could not read due to hardware error 3: could not read because device is off - - virtual void dc_clrTxt4resultStateLine(void) const =0; - // clear above text to avoid multiple repetive displaying - - - virtual QString dc_getdataStateLine(void) const =0; - // check if recveied input data are ok/valid - // OK-string : "valid INdata...." with protocol details - // not OK: string empty - - virtual void dc_clrTxt4dataStateLine(void) const =0; - // clear above text to avoid multiple repetive displaying - - - virtual QString dc_getdatifLine(void) const =0; - // returns string with result of function dc_requTestResponse() - // "correct" or "false" - - virtual void dc_clrTxt4datifLine(void) const =0; - // clear above text to avoid multiple repetive displaying - - - virtual QString dc_getTxt4RsDiagWin(void) const =0; - // returns string to be displayed in "serial traffic" window - // details about sent and received protocol - - virtual void dc_clrTxt4RsDiagWin(void) const =0; - // clear above text to avoid multiple repetive displaying - - virtual QString dc_get2ndTxt4RsDiagWin(void) const =0; - // returns string to be displayed in "serial traffic" window - // details about sent and received protocol - - virtual void dc_clr2ndTxt4RsDiagWin(void) const =0; - // clear above text to avoid multiple repetive displaying - - -// 28 functions - - - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // DC2b internal data - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - - virtual QString dc_getSerialParams(void) const =0; - // get DC2 serial settings (not very meaningful as they will not come if different from master settings) - - virtual QString dc_getHWversion(void) const =0; - // get DC2 hardware version - - virtual QString dc_getSWversion(void) const =0; - // get DC2 software version - - virtual QString dc_getState(void) const =0; - // get DC2 status (every OK or any error/warning? ) - - - // UID - unique number, different in every DC - virtual void dc_getUID8byte(uint8_t *buf8byteUid) const =0; - // get 8 single bytes in buffer - - virtual QString dc_getUIDstr() const =0; - // get as string - - virtual uint64_t dc_getUIDnumber(void) const =0; - // get UID as one long number - - // Analog values: - virtual uint32_t dc_getTemperature(void) const =0; - // in Sax-Format 0...400 (0=-50,0°C 100=0,0°C 141=20,5°C 400=150,0°C) - - virtual QString dc_getTemperaturStr(void) const =0; - // as string like "-12,5°C" - - virtual uint32_t dc_getVoltage(void) const =0; - // as value in mV, 0...65,535V - - virtual QString dc_getVoltagStr(void) const =0; - // as string in mV - - virtual bool dc_mainFuseIsOk(void) const=0; - // true if 12V fuse is OK - // false: fuse blown, DC will continue working but no 12V device can be used! - - virtual void dc_setWakeFrequency(uint8_t period) const =0; - // RTC wakes DC2 (and PTU) by hardware signal every 32seconds - // change wake signal period to 1...64s - - virtual void dc_OrderToReset(void) const =0; - // want DC2 to reset (in order to start Bootloader) - - - - // all read-requests can be sent manually by the following functions - // or automatically in background by: void hwapi::dc_autoRequest(bool on) - // in other words: - // if automatic-reading is on, then there's no need to send any of these commands, - // but it's allowed to send them in order to speed up the refreshing of the inputs - - virtual void request_DC2serialConfig() const =0; - // read-request can be sent manually by this function, not needed if auto-request is on - - virtual void request_DC2_HWversion() const =0; - // read-request can be sent manually by this function, not needed if auto-request is on - virtual void request_DC2_SWversion() const =0; - // read-request can be sent manually by this function, not needed if auto-request is on - virtual void request_DC2_condition() const =0; - // read-request can be sent manually by this function, not needed if auto-request is on - virtual void request_DC2_UID() const =0; - // read-request can be sent manually by this function, not needed if auto-request is on - - - virtual void request_DC2_analogues() const =0; - // read-request can be sent manually by this function, not needed if auto-request is on - virtual void request_DC2_digitalInputs() const =0; - // read-request can be sent manually by this function, not needed if auto-request is on - virtual void request_DC2_digitalOutputs() const =0; - // read-request can be sent manually by this function, not needed if auto-request is on - -// 22 - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // using DC2 Bootloader - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - virtual void bl_sendDataDirectly(uint8_t length, uint8_t *buf) const =0; - // send without protocol frame, needed for the DC bootloader - - virtual void bl_iniChain(void) const =0; - - virtual bool bl_importBinFile(QByteArray readBinFile, uint32_t fileSize, char withDispl) const =0; - - virtual uint8_t bl_activatBootloader(uint8_t *sendData) const =0; - - virtual uint8_t bl_startChain(void) const =0; - - virtual uint8_t bl_readBLversion(uint8_t *sendData) const =0; - // minimum size of sendData-buffer: 5byte retval: length - - virtual uint8_t bl_readFWversion(uint8_t *sendData) const =0; - // minimum size of sendData-buffer: 5byte retval: length - - virtual uint8_t bl_prepareDC_BLcmd(uint8_t Cmd, uint8_t SendDataLength, uint8_t *sendData, uint8_t *outBuf) const =0; - // make BL protocol, retval = outbuf length (5...133) - // bring data in correct form: start always with 0x02 finish with 0x03 and append checksum - // 0x02 Cmd < ...sendData ..> CRC CRC 0x03 - // Data length = 0...64 - // special conversion: if data contain 2 or 3 (STX, ETX) then write two bytes: 0x1B (=ESC) and data|0x80 - // so maxlength = 5 + 2 x 64 (if all data are 2 or 3) without 2,3: maxlength = 5 + 64 - - virtual uint8_t bl_exitBL(uint8_t *sendData) const =0; - // minimum size of sendData-buffer: 5byte retval: length - - - - -// 9 - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // get Time and Date from DC2b (contains a buffered real time clock) valid for about three days without power - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - virtual uint8_t rtc_getDateTime(struct Trtc_DateTime *rtc_DateTime) const =0; - - virtual uint8_t rtc_setDateTime(void) const =0; - // synch DC2 with PC or PTU system time and date - - virtual void rtc_getTime(uint8_t *hh, uint8_t *mm, uint8_t *ss) const =0; - // get time directly - - virtual void rtc_getDate(uint8_t *yy, uint8_t *mm, uint8_t *dd) const =0; - // get date directly - - virtual uint8_t rtc_getToday(uint8_t *dow, uint16_t *minOfToday, uint32_t *secOfToday) const =0; - // dow=day of week, 1=monday...7 - // minOfToday: 0=midnight...1439= 23:59 - // secOfToday: 0=midnight...86399= 23:59:59 - - virtual bool rtc_isLeapYear(uint8_t *lastLeapYear, uint8_t *NextLeapYear) const =0; - // retval true: this year is leap year - - virtual bool rtc_isLeapYear() const =0; - - virtual void rtc_getWeek(uint8_t *DayOfWeek, uint8_t *HoursOfWeek, uint16_t *MinutesOfWeek) const =0; - // DayOfWeek: 1=monday...7 - // HoursOfWeek: 0=Monday 0:00 o'clock...167=Sunday 23:00 - // MinutesOfWeek: 0=Monday 0:00 o'clock...10079=Sunday 23:59 - - virtual void rtc_getMonth(uint8_t *DayOfMonth, uint16_t *HoursOfMonth, uint16_t *MinutesOfMonth) const =0; - // DayOfMonth: 1...31 - // HoursOfMonth: 0 = 0:00o'clock of 1.day in month up to 743 - // MinutesOfMonth:0 = 0:00o'clock of 1.day in month up to 44639 - - virtual void rtc_getYear(uint16_t *DayOfYear, uint16_t *HoursOfYear, uint32_t *MinutesOfYear) const =0; - // DayOfYear: 1...366 1= 1.Jan of this current year - // HoursOfYear: 0=1.Jan 0:00o'clock ...8783=31.12 23 o'clock - // MinutesOfYear: 0=1.Jan 0:00o'clock ...527039=31.12 23:59 o'clock - - virtual QString rtc_getTimStr(void) const =0; - virtual QString rtc_getDatStr(void) const =0; - virtual QString rtc_getTimDatStr(void) const =0; - - - - - virtual void request_DC2_TimeAndDate() const =0; - // read-request can be sent manually by this function, not needed if auto-request is on - - - -// 14 - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // PTU, Master - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - virtual void ptu_switchWake(bool WAKEACTIVE) const =0; - - virtual bool ptu_WakeINisActive(void) const =0; - - virtual bool ptu_WakeOutIsOn(void) const =0; - - virtual void sendDeviceSettings(uint8_t kindOfPrinter, uint8_t kindOfCoinChecker, - uint8_t kindOfMifareReader, uint8_t suppressSleep, - uint8_t kindOfModem, uint8_t kindOfCredit ) const =0; - // enable hardware in device controller: - // kindOfPrinter: 0:off 1: GPT4672 (only this one implemented) - // kindOfCoinChecker: 0:off 1:EMP820 2:EMP900 3: C²_changer - // kindOfMifareReader: 0:off 1: SL025 (only this one implemented) - // suppressSleep: 0:sleep allowed 1: sleep surpressed for special reason - // kindOfModem: 0:off 1: ATB_Sunlink_LTE (not yet implemented) - // kindOfCredit: 0:off 1: cVendTopp 2:cVendPin (not yet implemented) - - - virtual void request_ReadbackDeviceSettings() const =0; - - virtual void readback_DeviceSettings(uint8_t *length, uint8_t *data) const =0; -/* - buf66[0]=devPara.kindOfPrinter; - buf66[1]=devPara.kindOfCoinChecker; - buf66[2]=devPara.kindOfMifareReader; - buf66[3]=devPara.suppressSleepMode; - buf66[4]=devPara.kindOfModem; - buf66[5]=devPara.kindOfCreditcard; - buf66[6]=devPara.CoinEscrow; - buf66[7]=devPara.CoinRejectUnit; - buf66[8]=devPara.CoinShutter; - buf66[9]=devPara.BillAcceptor; - buf66[10]=devPara.usevaultLock; - buf66[11]=devPara.autoAlarm; - buf66[12]=devPara.autoOpen; - buf66[13]=devPara.printAccReceipt; - buf66[14]=devPara.printDoorReceipt; - buf66[15]=devPara.printTokenTicket; - uitmp=devPara.VaultFullWarnLevel; - buf66[16]=swl_getOneByteFromUint(uitmp, GETLOWBYT); - buf66[17]=swl_getOneByteFromUint(uitmp, GETHIGHBYT); - uitmp=devPara.VaultFullErrorLevel; - buf66[18]=swl_getOneByteFromUint(uitmp, GETLOWBYT); - buf66[19]=swl_getOneByteFromUint(uitmp, GETHIGHBYT); - -*/ - - virtual void sendMachineID(uint16_t customerNr, uint16_t machineNr, - uint16_t borough, uint16_t zone, - uint16_t alias, char *location) const =0; - - virtual void request_ReadbackMachineID() const =0; - - virtual void readback_machineIDdata(uint8_t *length, uint8_t *data) const =0; - // state 5.5.21: byte[0,1]=customer number byte[2,3]=machine number - // byte[4,5]=borough byte[6,7]=zone byte[8,9]=alias name - // byte[10...41]=location - // 12.4.23TS still the same - - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // Printer - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - - - virtual void prn_switchPower(bool on) const =0; - - virtual bool prn_isPrinterPowerOn(void) const =0; - - virtual uint8_t prn_PrnFuseIsOk(void) const=0; - //retval: 0: fuse blown 1: fuse OK 2:unknown as printer power is off - - virtual bool prn_readyINisActive(void) const =0; - - virtual uint8_t cash_getLowPaperSensor(void) const=0; - // 0: Sensor sees paper 1: no paper 99: off - - // the following device state requests are deployed only if device is powered up: - virtual void request_PrinterHwState() const =0; - virtual void request_PrinterCurrentFonts() const =0; - virtual void request_PrinterStateComplete() const =0; - - virtual bool test_serialMux1isSetToPrinter(void) const =0; - - // read printer condition and settings - - virtual uint8_t prn_getHwState(struct Tprn_hw_state *prn_hw_state) const =0; - // retval: status byte - // byte 0 = 0: prnter OK, >0: error - // bit0: paper low 1: no paper 2: temperature error - // 3: head open 4: paper jam in cutter - // 6: no response 7: bad response from printer - // and return struct "Tprn_hw_state" - - virtual bool prn_isUpAndReady(void) const =0; - // true: printer is powered, serial is ok, no error, printer is connected and resonding - - virtual void prn_getCurrentFontSetting(struct Tprn_currentSettings *prn_fonts) const =0; - - - // send Commands to printer: - - virtual void prn_sendText(QByteArray *buf) const =0; - // up to 1280 bytes - - virtual void prn_sendPrnSysCmd(uint8_t para1, uint8_t para2, uint32_t para3) const =0; - // send three byte through to printer, see printers manual - - virtual void prn_sendPrnEscCmd(uint8_t para1, uint8_t para2, uint8_t para3, uint8_t para4) const =0; - // send four byte through to printer, see printers manual - - - virtual void prn_sendPrnSetup(uint16_t paperSpeed, uint8_t density, uint8_t alignment, uint8_t orientation) const =0; - // send 5 byte: byte 0,1: speed 5...250 mm/s - // byte2: density 0....(25)....50 - // byte3: alignment 'l', 'c', 'r' = left, center, right - // byte4: orientation 0, 90, 180 = 0°, 90°, 180° rotation (by now not supported!) - // not batched! don't use twice within 100ms - - virtual void prn_movePaper(uint8_t wayInMm, uint8_t direction) const =0; - //direction: 1=forward 2=backward - // - virtual void prn_setFonts(uint8_t font, uint8_t size, uint8_t width, uint8_t height) const =0; - // font = kind of font 5...11 (0..22) - // size = 6...20, 9..9: too tiny 10: small ...12 = normal size ...20=huge - // width: 0...4 0=1x 1=2x 2=4x (huge!) 3=8x 4=16x (3,4 make no sense) - // heigth: 0...7 = 1x...8x only 0,1,2,(3) make sense - - virtual void prn_setLetters(uint8_t bold, uint8_t invers, uint8_t underlined) const =0; - // bold: 0/1 - // invers: 0/1 - // underlined: 0/1 - - virtual void prn_cut(uint8_t kindof) const =0; - // kindof: 1=full cut 2=partial cut 3=eject (5xLF + full cut) - - virtual void prn_newLine(uint8_t nrOfLines) const =0; - - virtual void prn_printCompleteFontTable(void) const =0; - - virtual void prn_printBarcode(uint8_t kindOf, uint8_t withText, uint8_t offset, uint8_t rotation, uint8_t dataLeng, uint8_t *data) const =0; - // kind of barcode: 0=Code39 1=Code128 2=EAN13 3= 2/5interleaved 4=UPC-A 5=EAN8 - // withText: print readable text below - // offset: move by pixel from left border - // rotation - // dataLeng in byte - - virtual void prn_sendQRdata(QByteArray *buf) const =0; - // maximal 150 alphanummeric bytes - - virtual void prn_printQRcode(void) const =0; - // QRcode may have 1...150 alphanummeric data, must be transfered in advance - - - virtual void prn_printLogo(uint8_t nrOfLogo, uint8_t offset ) const =0; - // nrOfLogo: 1..4 in flash 5...8 in Ram - // offset: in mm form left border - - - - // ......................................................... - // Parking Ticket (print-out document) designer TD - // ......................................................... - - // Predefine document Layout (e.g. parking ticket) in advance and stroe it for quick and easy use - // in opposite to the above "single" commands you need only one or a few commands at vending time. - // Stored text is just send to printer once the printing command is issued - // stored commands within the text are interpreted and executed right at the place (in ticket) they are - // example: start bold, , stop bold - // Predefinition of up to 16 ticket Layouts is possible, 0...1280 byte each - // Number 0..15, al keept non-volatile - // up to 8 dynamic values can be defined in the template ("print val3 here") and will be sent with printing command - // example: print current time at this point (the time of printing not the storage time!!) - - virtual void pri_startTicketDesign(void) const =0; - // start for every new printer document, reseting collecting buffer - - // all further functions write/append text, numbers and command to the ticket-buffer, up to 1278 bytes allowed - // return val of the appending functions: true=ok false=too long, buffer full - - virtual int pri_TD_getCurrentSize(void) const =0; - // retval: 0...1278 - - virtual bool pri_TD_addText(QByteArray text) const =0; - // example: pri_TD_addText("Hello") const =0; - // example: pri_TD_addText(tempStr) const =0; - // retval: true=ok false=too long, buffer full - - virtual bool pri_TD_addValue(int val) const =0; - // +/- 0...2^(31) - - virtual bool pri_TD_addNewLine(void) const =0; - - virtual bool pri_TD_addSign(char sign) const =0; - // example: '.' ' ' 0x20 'W' '$' - - virtual bool pri_TD_addCommand(char group, char attribute, char p1, char p2, char p3, char p4, char p5) const =0; - // always add 8 byte to the ticket layout: ESC & group & attribute & parameter1...5 - /* complete list of possible commands: - group 50 : paper - attribute 10 : move forward - p1: wayInMm p2: direction - attribute 11 : cut - p1: kind of, 1=full 2=partial, 3=eject - attribute 12 : new line(s) - p1: nr of lines 1...100 - - group 51 : fonts - attribute 10 : kind of font see description above - p1: 0...8 - attribute 11 : font size - p1: 6...20 - attribute 12 : font width - p1: 0...4 - attribute 13 : font heigth - p1: 0...7 - attribute 14 : switch bold print on/off - p1: 0=off 1=on - attribute 15 : switch invers print on/off - p1: 0=off 1=on - attribute 16 : switch underlined print on/off - p1: 0=off 1=on - - group 52 : print graphics - attribute 10 : print barcode with dynamic data 6 and 7 - p1...p5 = kindOf, withText, offset, rotation, dataLeng, see description above - attribute 11 : print QRcode with preset data - - attribute 12 : print Logo - p1=nrOfLogo, p2=offset - - group 53 : print dynamics - attribute 10 : - p1: 1...8 = print dynData 0..7 at this place - - */ - - virtual char prn_clearDocument(uint8_t documentNumber) const =0; - // clear memory buffer for ONE document - // function takes a second! don't send right before "store doc" - - virtual bool prn_store_Document(uint8_t documentNumber ) const =0; - // send the predefined Layout (generated with above TD functions) to DeviceController to save - // documentNumber=0...15 - // maximal 1280 bytes each - // allowed: 0x20...0xFF, 0x0A, 0x0C, 0x1B (LF, CR, Esc) - // 0x1B=start of embedded command (next 7bytes = command) - - // with a print command a set of 8 dynamic strings can be sent - // the place in the ticket layout is predefined (already in DC memory) - // the dynamics are first calculated at printing time - - virtual bool prn_printDocument(uint8_t documentNumber, struct T_dynDat *dynTicketData) const =0; - - -// 36 - - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // Mifare Card Reader - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - virtual void mif_readerOn(bool on) const =0; - - virtual bool mif_cardIsAttached(void) const =0; - virtual bool mif_isMifarePowerOn(void) const =0; - - virtual void request_MifareReaderState() const =0; - virtual void request_MifareCardType() const =0; - virtual void request_MifareAtbType() const =0; - virtual void request_MifareID() const =0; - virtual void request_MifareData(uint8_t dataBlockNumber) const =0; - //virtual void request_MifareData() const =0; - - // dataBlockNumber must be 0....11, returns 64byte of data - - - virtual bool test_serialMux2isSetToMifare(void) const =0; - - virtual void mif_creatAtbCard(uint8_t cardType) const =0; - - /* data description: - byte 0: current read state: 0=power off 1=reader-fault 2=ready - 3=just reading 4=read complete - 5=read partial, removed too early - 6=state unknown - byte 1,2: read data length from card - 3: 1=reader is OK (reported serial nr is OK) 0=wrong or no reader - 4...15: reader version, expected "ATB25-1.8" - byte16: 1=card is present 0:not - 17: 0 - 18: card type reported from reader - 19: 1=allowed card type 0=not - 20: card size: 1 or 4 (dec) = card size - 21: LengthOfUID: 4 or 7 (dec) (byte) - 22: UID 8 byte in hex - byte 30: sector logged: 0 - byte 31: current sector: 0 - byte 32: result, always 0 - */ - virtual uint8_t mif_returnReaderStateAndCardType(uint8_t *buf, uint8_t maxBufferSize) const =0; - // retval 0=OK 1=error host buffer too small - - virtual bool mif_readerIsOK(void) const =0; - - virtual bool mif_cardAttached(void) const =0; - - virtual uint8_t mif_readResult(void) const =0; - // result: 0: unknown or still in progress - // 1: card read successful - // 2: reading error - - //virtual void mif_clearDataBuffer(void) const =0; - - virtual QString mif_cardUID(void) const =0; - // returns string with 8 byte - - //virtual bool mif_isBlockAvailable(uint8_t blkNr) const =0; - //blkNr=0...11 - - //virtual uint32_t mif_getAvailableDataBlocks(void) const =0; - // bit0=1 if block 0 = valid ...up to ... bit 11=1 if block 11=read - - virtual uint8_t mif_getCardDataDec(uint8_t blkNr, uint8_t *buf, uint8_t maxBufferSize) const =0; - - virtual QString mif_getCardDataStr(uint8_t blockNumber) const =0; - // with blockNumber=0...11 - - // read mifare data independant from blocks - //virtual uint16_t mif_getNrOfAvailableDataBytes(void) const =0; - - //virtual bool mif_getCardData768byteDec(uint8_t *buf, uint16_t bufferSize) const =0; - - //virtual bool mif_getCardDataDec(uint16_t fromAddr, uint16_t toAddr, uint8_t *buf, uint16_t bufferSize) const =0; - - //virtual QString mif_getCardDataStr(bool useHexFormat, char seperator) const =0; - -// 16 - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // Credit Card Terminal - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - virtual void credit_switchPower(bool on) const =0; - // the same as modem power - - virtual bool cred_isCreditPowerOn(void) const =0; - - virtual bool test_serialMux2isSetToCredit(void) const =0; - - virtual void credit_switchWake(bool WAKEACTIVE) const =0; - -// 4 - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // Modem - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - virtual void mod_switchPower(bool on) const=0; - - virtual bool mod_isGsmPowerOn(void) const =0; - - virtual bool test_serialMux1isSetToModem(void) const =0; - - virtual void mod_switchWake(bool WAKEACTIVE) const=0; - -// 2 - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // MDB Bus - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - virtual void mdb_switchPower(bool on) const =0; - virtual void mdb_switchWake(bool WAKEACTIVE) const =0; - - virtual bool mdb_WakeINisActive(void) const =0; - virtual bool mdb_testIsmdbTxDon(void) const =0; - virtual bool mdb_isMdbPowerOn(void) const =0; - - virtual void request_MDB_Status() const =0; - virtual void request_MDB_lastResponse() const =0; - - virtual bool test_getDO_mdbRXtst(void) const =0; - // readback digital outputs of connected devices - // these functions are not needed for normal operation - // but can be used to test and verify conditions - - virtual void mdb_sendBusReset(void) const =0; - - virtual void mdb_sendCommand(uint8_t toMdbDevice, uint8_t mdbCommand) const =0; - // send one bus command directly over mdb bus, refer to mdb manual for commands - // this command is not needed in normal operation, just for new or special things - - virtual void mdb_sendMessage(uint8_t toMdbDevice, uint8_t mdbCommand, uint8_t nrOfData, uint8_t *dataBuffer) const =0; - // nrOfData = sizeOf(dataBuffer) maximal 34 byte according mdb specs - // same as mdb_sendCommand, just with data - - virtual bool mdb_busIsReadyToWork() const =0; - - virtual bool mdb_deviceVoltageOK() const =0; - - virtual bool mdb_busVoltageOk() const =0; - - virtual uint8_t mdb_getLastDeviceResponse(uint8_t *fromDevice, uint8_t *lastRequest, - uint8_t *responseLength, uint8_t *responseBuffer) const =0; - // fromDevice: device nr from which data was requested 0,1,2,3 - // lastRequest: sent mdb command - // responseLength: nr of payload data (after mdb-ack) 0...34 - // responseBuffer holds payload data (answer from mdb device) - // return val: mdb result of this request: 1=got ACK 2=got 3xNAK 3=no or bad response 4:got Data (after ACK) - - -// 15 - - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // Coin Changer, Checker (EMP) - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - virtual void request_EMP_allParameters() const =0; - - virtual void request_EMP_lastCoin() const =0; - - virtual uint8_t emp_returnLastCoin(uint16_t *value, uint8_t *signal) const =0; - // use for changer - - - // ---------------------------------- Electronic Coin Validator EMP ----------------------------------------- - - virtual void emp_sendSettings(uint16_t coinAcceptance, uint8_t tokenChannel, uint16_t *coinDenomination ) const =0; - // coinAcceptance: bit0=coin1 (lowest donomination) bit15=coin16 bitH=accept bit L = deny coin (no validation) - // tokenChannel 0...31: if this signal comes from emp then a token was inserted - // coinDenomination = array of 16 coin values (e.g. 5, 10, 20...) - - virtual void emp_pollingOnOff(uint8_t on) const =0; - - virtual void emp_startCoinAcceptance(void) const =0; - - virtual void emp_stopCoinAcceptance(void) const =0; - - virtual void emp_getAllParameters(struct T_emp *emp) const =0; - // see struct in hwapi.h - // usage example: - // hwapi *HWaccess const =0; - // HWaccess = new hwapi() const =0; - // struct T_emp myEmp const =0; - // HWaccess->emp_getAllParameters(&myEmp) const =0; - // readval=myEmp.pollingRunning const =0; - - virtual uint8_t emp_chkIfCoinInserted(void) const =0; - // retval: 0...16 coins left in FIFO - - virtual void emp_getNewCoinRecord(uint8_t *valid, uint8_t *signal, uint8_t *error, uint16_t *value) const =0; - // with every call ONE coin is taken out of FIFO and pointer decremented - // valid: should be 1 - // signal: comes right from coin checker, 0...15 (0=first programmed coin type) 0xFF=no signal - // error: was reported from EMP as dynamic signal right after coin insertion (instead of - // coin signal), example: 3=unknown coin 4=coin is blocked by host. 0xFF=no error - // value: of the coin. Depends on parameter "coinDenomination" in function "emp_sendSettings" - // if coinDenomination[coin 0..15] = 0 then the value programmed in coin checker is taken - // if coinDenomination > 0 then this value is taken. - // Useful in case of two currencies (adapt to local currency) or for token. - - // function gives more details as "emp getLastCoin()" but "emp getLastCoin()" is easier to use - - // alternativ to emp_getNewCoinRecord( ): - virtual uint8_t emp_giveLastCoin(uint16_t *value, uint8_t *signal) const =0; - // retval: 0: NO coin stored 1: valid coin 2: got wrong coin or coin denied - // value: if retval1: value of the coin if reval=2: error number - // 0xFF means NO error or NO signal (as 0 is a valid error/signal) - // signal: channel nr reported from checker 0...15 - -// 11 - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // Coin blocker, Coin Escrow, Coin reject - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - virtual void shut_move(bool open) const =0; - virtual void esc_moveFlaps(uint8_t flap ) const =0; - // 0: close both 1: open take-flap 2: open return - - virtual void coin_switchRejectMotor(uint8_t dir) const =0; - virtual bool coid_isAttached(void) const =0; - virtual bool coin_escrowIsOpen(void) const =0; - virtual bool cash_getRejectMotorHomePos(void) const=0; - - - virtual bool coin_shutterIsOpen(void) const =0; - virtual bool coin_shutterTestOutput(void) const =0; - - virtual uint8_t coin_escrowFlapOpened(void) const =0; - // retval: 1:return flap is open 2:take flap is open 0:closed - - virtual void shut_openOnce(void) const =0; - // and close automatic after shutter time - - virtual void shut_openForCoin(bool start) const =0; - // open flap if coin is attached - // once process is started it runs until stop command - - virtual void shut_sendOpeningTime(uint16_t timeIn_ms ) const =0; - // after this time without retrigger the flap is closed - - virtual void esc_takeMoney(void) const =0; - // and close automatically after escrow time (1s) - - virtual void esc_returnMoney(void) const =0; - // and close automatically after escrow time (1s) - - virtual void coin_rejectCoins(void) const =0; - -// 15 - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // MDB Bill evaluator - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - - - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // doors, locks, cashboxes - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - virtual void lock_switchContactPower(bool on) const =0; - - virtual bool door_isContactPowerOn(void) const =0; - - virtual uint8_t door_getLocks(void) const =0; - // retval bit0: upper lever is up (=open) - // bit1: upper lever is down (=locked) - // bit2: lower lever is up - // bit3: lower lever is down (=locked) - - virtual bool door_upperDoorIsLocked(void) const =0; - - virtual bool door_upperDoorIsUnlocked(void) const =0; - - virtual uint8_t lock_switchUpperLock(uint8_t dir) const =0; - // dir 0=off 1=up 2=down - // move lock until stop cmd (0) - - virtual uint8_t lock_openUpperDoor(void) const =0; - // Locks stops automatically at end switch or by timeout - - virtual uint8_t lock_closeUpperDoor(void) const =0; - // Locks stops automatically at end switch or by timeout - - virtual uint8_t door_getSwitches(void) const =0; - // retval: bit0: upper door 1: low door 2:vault door - - virtual bool door_isUpperDoorOpen(void) const =0; - - - virtual bool door_lowerDoorIsLocked(void) const =0; - - virtual bool door_lowerDoorIsUnlocked(void) const =0; - - virtual uint8_t lock_switchLowerLock(uint8_t dir) const =0; - // dir 0=off 1=up 2=down - // move lock until stop cmd (0) - - virtual uint8_t lock_getDO_motors(void) const =0; - // bit0: upper lock forward bit 1 backward - // bit2: lower lock forward bit 3 backward - - virtual uint8_t lock_openLowerDoor(void) const =0; - // there's no closing function as Lock always makes one complete cycle and can be locked again immed. - - virtual uint8_t lock_closeLowerDoor(void) const =0; - - virtual bool door_isLowerDoorOpen(void) const =0; - - virtual uint8_t vault_getSwitches(void) const =0; - // retval bit0: cash box, bit 1: bill box - - virtual bool vault_isVaultDoorOpen(void) const =0; - - virtual void lock_switchVaultDoor(void) const =0; - - virtual bool vault_isCoinVaultIn(void) const =0; - - virtual bool vault_isBillVaultIn(void) const =0; - -// 21 - - - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - // LEDs, Barrier, Alarm, Relais, Aux - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - - virtual void led_switchLedIllumination(uint8_t on) const = 0; - - virtual void led_switchLedCoinbassin(uint8_t on, uint8_t ton, uint8_t tof) const =0; - - virtual bool led_coinIsOn(void) const =0; - // read back digital output from DC-uC-Port - virtual bool led_frontIsOn(void) const =0; - - virtual void led_switchLedService(uint8_t on) const =0; - // on=1 off=0 - virtual bool led_insideIsOn(void) const =0; - - virtual void led_switchLedPaper(uint8_t on, uint8_t ton, uint8_t tof) const =0; - virtual bool led_ticketIsOn(void) const =0; - - virtual void led_switchLedStart(uint8_t on, uint8_t ton, uint8_t tof) const =0; - virtual bool led_StartIsOn(void) const =0; - - virtual void led_switchLedPinPad(uint8_t on, uint8_t ton, uint8_t tof) const =0; - virtual bool led_pinIsOn(void) const =0; - - - virtual void fan_switchFan(bool on) const =0; - virtual void alarm_switchSiren(bool on) const =0; - virtual bool fan_isOn(void) const =0; - - virtual bool siren_isOn(void) const =0; - - virtual void bar_OpenBarrier(bool open) const =0; - virtual bool bar_relayIsOn(void) const =0; - - virtual bool bar_optoIn1isOn(void) const =0; - - virtual bool bar_optoIn2isOn(void) const =0; - - virtual void aux_power(bool on) const =0; - virtual bool aux_powerIsOn(void) const =0; - - virtual void aux_setUsage(uint8_t PinDirection) const =0; - virtual void aux_setOutputs(uint8_t PinIsHigh) const =0; - - virtual bool aux_isAuxPowerOn(void) const =0; - - virtual uint8_t aux_getAuxInputs(void) const =0; - - - -// ------------------------------------------------------------------------------------ -// 27.3.2023: Use Device-Controller's Bootloader to send hex-file -// ------------------------------------------------------------------------------------ - - virtual void bl_rebootDC(void) const =0; - - virtual void bl_startBL(void) const = 0; - // send command within 4s after DC power-on, otherwise bl is left - - virtual bool bl_checkBL(void) const = 0; - // send command to verify if bl is up - - virtual bool bl_isUp(void) const =0; - // return true is bl is up and running - // also initializes "sendFile" - - virtual void bl_sendAddress(uint16_t blockNumber) const=0; - // send start address, nr of 64byte-block, start with 0 - // will be sent only for following block-numbers: - // 0, 1024, 2048, 3072 and 4096, so basically every 64kByte - // for other addresses nothing happens - - virtual uint8_t bl_wasSendingAddOK(void) const=0; - // return val: 0: no response by now 1:error 10: OK - - virtual void bl_openBinary(void) const=0; - // to be used within CashAgent, momentary not processed - - virtual void bl_sendDataBlock(uint8_t length, uint8_t *buffer) const=0; - // send 64 byte from bin file - - virtual void bl_sendLastBlock(void) const=0; - // send this command after all data are transfered - - virtual uint8_t bl_wasSendingDataOK(void) const=0; - // return val: 0: no response by now 1:error 10: OK - - virtual void bl_stopBL(void) const=0; - // leave BL and start (the new) application - - //virtual bool bl_isDiagAvailable(void) const=0; - - //virtual QString dc_getDiagText(void) const=0; - - - // Komplett-schreib Funktion, noch nicht getestet - // Nachteil: keine Rückmeldung wie lang's noch dauert - //virtual void bl_startSending(void) const=0; - // call once after BL is working and file is loaded - //virtual void bl_sendFile(void) const=0; - // call cyclic while loading bin-file to bootloader - - - - -// ------------------------------------------------------------------------------------ -// 6.4.2023: new functions for coin collection and printing -// some new system functions -// ------------------------------------------------------------------------------------ - - virtual bool rtc_setTimeDateDirect(struct Trtc_DateTime *DateTime) const=0; - // return true if sending, false if cmd-stack is full - - virtual bool rtc_getExtendedTime(uint8_t *leng, uint8_t *data) const=0; -/* - buf[0]=GlobTime.Hours; - buf[1]=GlobTime.Min; - buf[2]=GlobTime.Sec; - buf[3]=GlobTime.Year; - buf[4]=GlobTime.Month; - buf[5]=GlobTime.Day; - buf[6]=GlobTime.DOW; - buf[7]=' '; // immer auf 32bit auffüllen sonst Speicherproblem beim Master! - uitmp=GlobTime.MinOfDay; - buf[8]=swl_getOneByteFromUint(uitmp, 0); - buf[9]=swl_getOneByteFromUint(uitmp, 1); - buf[10]=' '; - buf[11]=' '; - ultmp=GlobTime.SecOfDay; - buf[12]=swl_getOneByteFromUlong(ultmp, 0); - buf[13]=swl_getOneByteFromUlong(ultmp, 1); - buf[14]=swl_getOneByteFromUlong(ultmp, 2); - buf[15]=swl_getOneByteFromUlong(ultmp, 3); - - buf[16]=swl_isLeap(GlobTime.Year); - buf[17]=swl_getNextLeapYear(GlobTime.Year); - buf[18]=swl_getLastLeapYear(GlobTime.Year); - buf[19]=swl_hoursOfThisWeek(GlobTime.DOW, GlobTime.Hours); - - uitmp=swl_minutesOfThisWeek(GlobTime.DOW, GlobTime.Hours, GlobTime.Min); - buf[20]=swl_getOneByteFromUint(uitmp, 0); // 0=low byte 1=high byte - buf[21]=swl_getOneByteFromUint(uitmp, 1); - - uitmp=swl_hoursOfThisMonth(GlobTime.Day, GlobTime.Hours); - buf[22]=swl_getOneByteFromUint(uitmp, 0); - buf[23]=swl_getOneByteFromUint(uitmp, 1); - - uitmp=swl_minutesOfThisMonth(GlobTime.Day, GlobTime.Hours, GlobTime.Min); - buf[24]=swl_getOneByteFromUint(uitmp, 0); - buf[25]=swl_getOneByteFromUint(uitmp, 1); - - uitmp=swl_GetDaysOfYear(GlobTime.Year, GlobTime.Month, GlobTime.Day); - buf[26]=swl_getOneByteFromUint(uitmp, 0); - buf[27]=swl_getOneByteFromUint(uitmp, 1); - - uitmp=swl_GetHoursOfYear(GlobTime.Year, GlobTime.Month, GlobTime.Day, GlobTime.Hours); - buf[28]=swl_getOneByteFromUint(uitmp, 0); - buf[29]=swl_getOneByteFromUint(uitmp, 1); - buf[30]=0; - buf[31]=0; - ultmp= swl_GetMinutesOfYear(GlobTime.Year, GlobTime.Month, GlobTime.Day, - GlobTime.Hours, GlobTime.Min); - buf[32]=swl_getOneByteFromUlong(ultmp, 0); - buf[33]=swl_getOneByteFromUlong(ultmp, 1); - buf[34]=swl_getOneByteFromUlong(ultmp, 2); - buf[35]=swl_getOneByteFromUlong(ultmp, 3); - - buf[36]=rtc_getSqwaveSettings(); - buf[37]=0; - buf[38]=0; - buf[39]=0; - - ultmp= 0; // Minutes of the Millenium - buf[40]=swl_getOneByteFromUlong(ultmp, 0); - buf[41]=swl_getOneByteFromUlong(ultmp, 1); - buf[42]=swl_getOneByteFromUlong(ultmp, 2); - buf[43]=swl_getOneByteFromUlong(ultmp, 3); - - dc2prot_setReadData(44, buf); - - */ - - virtual bool rtc_getExtendedTime(struct T_extTime *exTime) const=0; - - virtual bool sys_runCompleteTest(void) const=0; - // warning: lasts 20s in one pace - // return true if sending, false if cmd-stack is full - - virtual bool sys_ready4sending(void) const=0; - // return true if a Json-file can be sent - - virtual bool sys_sendJsonFileToDc(uint8_t kindOfFile, uint8_t nrOfTemplate, uint8_t *content ) const=0; - // kindOfFile: 1=config, 2=device, 3=cash, 4=serial, 5=time, 6=printer - // nrOfTemplate=1...32 if kindOfFile==6 - // content = content of the Json file, max 800byte ascii signs - // file is 0-terminated - // return true if sending, false if cmd-stack is full - - virtual bool prn_sendDynamicPrnValues(uint8_t *dynPrnVal ) const=0; - // dynPrnVal = array of 8 Variables with 8 byte each, come as ascii string - // like: char prn_dynPrnVal[8][8]; - // return true if sending, false if cmd-stack is full - - virtual bool prn_printTemplate(uint8_t nrOftemplate) const=0; - // print one of the templates loaded by Json prior - // nr = 1..32 - // return true if sending, false if cmd-stack is full - - virtual void log_getHoldAccountNumbers(uint8_t *nrOfVals, uint16_t *accNr ) const=0; - // returns all acc nrs of the backuped vault records - // use: uint16_t backupedAccNumbers[8] - - virtual bool log_selectVaultRecord(uint16_t accountNr ) const=0; - // return true if sending, false if cmd-stack is full - // and trigger transfer - - virtual bool log_chkIfVaultRecordAvailable(void) const=0; - // return true if completly received - - virtual bool log_getVaultRecord(struct T_vaultRecord *retVR) const=0; - // which was selected by: log_selectVaultRecord() - // to be forwarded to Ismas - - virtual bool prn_printAccountReceipt(void) const=0; - // return true if sending to DC OK, false if cmd-stack is full - - virtual bool prn_printTestTicket(void) const=0; - // return true if sending to DC OK, false if cmd-stack is full - - virtual bool cash_startPayment(uint32_t amount) const=0; - // 17.4.23TS: extended to 32bit - - virtual uint32_t getInsertedAmount(void) const=0; - - virtual uint16_t getLastInsertedCoin(void) const=0; - - virtual bool getAllInsertedCoins(uint16_t *types, uint16_t *values) const=0; - // all inserted coins (max 64) since "cash_startPayment" - - virtual bool cash_cancelPayment(void) const=0; - // and return coins - - virtual bool cash_stopPayment(void) const=0; - // and keep coins in escrow - - // after ticket/goods issue: - virtual bool vend_success(void) const=0; - // conclude payment process, encash all inserted coins to vault. Printing was successful - // if possible return change - - virtual bool vend_failed(void) const=0; - // conclude payment process and return all inserted coins - - - virtual uint8_t mif_getCardType(QString *cardholder) const=0; - // return 1,2,3,4 = upper, lower access card, printer test, coin test - // cardholder: 7byte Name-String - - virtual uint64_t sys_getWakeSource(void) const =0; - // retval: 6 bytes, bit coded, 1=event keeps DC awake - - virtual void sys_getDeviceConditions(uint8_t *leng, uint8_t *data) const=0; - /* - - outBuf[0]=modCond.ram; - outBuf[1]=modCond.intEe; - outBuf[2]=modCond.extEe; - outBuf[3]=modCond.rtc; - outBuf[4]=modCond.boardHw; - outBuf[5]=modCond.printer; - outBuf[6]=modCond.modem; - outBuf[7]=modCond.signal; - outBuf[8]=modCond.regist; - outBuf[9]=modCond.mdbBus; - outBuf[10]=modCond.coinChecker; - outBuf[11]=modCond.coinEscrow; - outBuf[12]=modCond.mifareReader; - outBuf[13]=modCond.creditTerm; - outBuf[14]=modCond.coinReject; - outBuf[15]=modCond.coinSafe; - outBuf[16]=modCond.billSafe; - outBuf[17]=modCond.voltage; - outBuf[18]=modCond.temper; - outBuf[19]=modCond.poweronTest; - outBuf[20]=modCond.doorState; - outBuf[21]=modCond.doorWasOpened; - outBuf[22]=modCond.changer; - outBuf[23]=modCond.coinBlocker; - outBuf[24]=modCond.billReader; - outBuf[25]=modCond.ResetReason; - outBuf[26]=modCond.allModulesChecked; - outBuf[27]=modCond.alarmState; - outBuf[28]=0; - outBuf[29]=0; - - */ - - virtual void sys_getDeviceConditions(struct T_moduleCondition *devCond) const=0; - virtual void sys_getDynMachineConditions(uint8_t *leng, uint8_t *data) const=0; -/* - - outBuf[pBuf++]=dynCond.allDoorsDebounced; - outBuf[pBuf++]=dynCond.openedAuthorized; - outBuf[pBuf++]=dynCond.CBinDebounced; - outBuf[pBuf++]=dynCond.upperDoor; - - outBuf[pBuf++]=dynCond.middleDoor; - outBuf[pBuf++]=dynCond.lowerDoor; - outBuf[pBuf++]=dynCond.coinBox; - outBuf[pBuf++]=dynCond.billBox; - - outBuf[pBuf++]=dynCond.modeAbrech; - outBuf[pBuf++]=dynCond.onAlarm; - outBuf[pBuf++]=dynCond.nowCardTest; - outBuf[pBuf++]=dynCond.nowPayment; - - outBuf[pBuf++]=dynCond.lastMifCardType; - outBuf[pBuf++]=dynCond.lastSDoorState; - outBuf[pBuf++]=dynCond.lastVDoorState; - outBuf[pBuf++]=dynCond.lastCBstate; - - outBuf[pBuf++]=dynCond.paymentInProgress; - outBuf[pBuf++]=0; - uitmp=dynCond.U_Batt; - outBuf[pBuf++]=swl_getOneByteFromUint(uitmp, GETLOWBYT); - outBuf[pBuf++]=swl_getOneByteFromUint(uitmp, GETHIGHBYT); - uitmp=dynCond.Temperatur; - outBuf[pBuf++]=swl_getOneByteFromUint(uitmp, GETLOWBYT); - outBuf[pBuf++]=swl_getOneByteFromUint(uitmp, GETHIGHBYT); - - uitmp=dynCond.nrCoinsInBox; // send seperate also - outBuf[pBuf++]=swl_getOneByteFromUint(uitmp, GETLOWBYT); - outBuf[pBuf++]=swl_getOneByteFromUint(uitmp, GETHIGHBYT); - - ultmp=dynCond.amountInBox; // send seperate also - outBuf[pBuf++]=swl_getOneByteFromUlong(ultmp, GETLOWESTBYT); - outBuf[pBuf++]=swl_getOneByteFromUlong(ultmp, GETLOWMID); - outBuf[pBuf++]=swl_getOneByteFromUlong(ultmp, GETHIGHMID); - outBuf[pBuf++]=swl_getOneByteFromUlong(ultmp, GETHIGHESTBYT); - - ultmp=dynCond.totalTransVolume; - outBuf[pBuf++]=swl_getOneByteFromUlong(ultmp, GETLOWESTBYT); - outBuf[pBuf++]=swl_getOneByteFromUlong(ultmp, GETLOWMID); - outBuf[pBuf++]=swl_getOneByteFromUlong(ultmp, GETHIGHMID); - outBuf[pBuf++]=swl_getOneByteFromUlong(ultmp, GETHIGHESTBYT); - - ultmp=dynCond.totalNrOfVends; - outBuf[pBuf++]=swl_getOneByteFromUlong(ultmp, GETLOWESTBYT); - outBuf[pBuf++]=swl_getOneByteFromUlong(ultmp, GETLOWMID); - outBuf[pBuf++]=swl_getOneByteFromUlong(ultmp, GETHIGHMID); - outBuf[pBuf++]=swl_getOneByteFromUlong(ultmp, GETHIGHESTBYT); -// 36 - outBuf[pBuf++]=dynCond.jsonValid_config; - outBuf[pBuf++]=dynCond.jsonValid_device; - outBuf[pBuf++]=dynCond.jsonValid_cash; - outBuf[pBuf++]=dynCond.jsonValid_print; - outBuf[pBuf++]=dynCond.jsonValid_serial; - outBuf[pBuf++]=dynCond.jsonValid_time; - outBuf[pBuf++]=dynCond.lastFileType; - outBuf[pBuf++]=0; - -*/ - - virtual void sys_getDynMachineConditions(struct T_dynamicCondition *dynMachCond) const=0; - - // content of Cashbox - virtual uint32_t cash_getAmountInVault(void) const=0; - - virtual uint16_t cash_getNrCoinsInVault(void) const=0; - - - virtual uint8_t prn_getPrintResult() const=0; - - // in case of print-error get detailed error: - virtual uint8_t prn_getCurrentPrinterState() const=0; - // 0: printer OK - // bit0: near paper end bit1: no paper - // bit2: temperature error bit3: error head open - // bit4: paper jam in cutter - // bit6: no response bit7: serial rec. error - // bit5: printer not ready - -signals: - virtual void hwapi_templatePrintFinished_OK(void) const=0; - virtual void hwapi_templatePrintFinished_Err(void) const=0; - virtual void hwapi_gotNewCoin(void) const=0; - virtual void hwapi_vendStopByMax(void) const=0; - virtual void hwapi_vendStopByPushbutton(void) const=0; - -}; - - -// History -// 11.10.2021: V1.0 222 functions -// 23.12.2021: V1.1 added block-parameter to function "read mifare data" -// 30.12.2021: V1.2 added function: mif_clearDataBuffer(), mif_isBlockAvailable(uint8_t blkNr) and mif_getAvailableDataBlocks() -// 1.1.2022: V1.3 Mifare extended. ( background: read 16 x 48byte from card to DC, read 12 x 64byte from DC to CA) -// new: read full card with 768bytes from HWapi without block borders -// added: mif_getNrOfAvailableDataBytes mif_getCardData768byteDec(uint8_t *buf, uint16_t bufferSize) -// mif_getCardDataDec(uint16_t fromAddr, uint16_t toAddr, uint8_t *buf, uint16_t bufferSize) -// mif_getCardDataStr(bool useHexFormat, char seperator) - -// 29.03.2023: V3.1 some extensions for PSA1256_ptu5, -// V3.2 Bootloader improvement -// 12.04.2023: V3.3 new features extended: loading and using Json-files, cash-collection, cash-data-logging -// 14.04.2023: V3.4 new features extended: sys_getDynMachineConditions, sys_getDeviceConditions and -// rtc_getExtendedTime return struct in addition. New function to select and get VaultRecord -// - -//#define HWINF_iid "Atb.Psa2020.software.HWapi/3.1" -//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.1" -//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.3" -//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.4" -#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.5" - - - -Q_DECLARE_INTERFACE(hwinf, HWINF_iid) - - -#endif - - - diff --git a/include/prot.h b/include/prot.h index 93304c0..aefc25e 100644 --- a/include/prot.h +++ b/include/prot.h @@ -93,9 +93,6 @@ private slots: void analyseRecData(void); public: - T_com *getSerialPort() { return mySerialPort; } - T_com const *getSerialPort() const { return mySerialPort; } - T_prot(); bool isPortOpen(void); bool isSerialFree(void); diff --git a/include/sendWRcmd.h b/include/sendWRcmd.h index dd37064..9384d91 100644 --- a/include/sendWRcmd.h +++ b/include/sendWRcmd.h @@ -211,8 +211,15 @@ 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 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 bool sendFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, uint8_t *dat1, uint8_t *dat2, uint8_t *dat3, uint8_t *dat4); @@ -220,23 +227,35 @@ bool sendFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, ui uint8_t check4FDshortCmd(void); // returns number of waiting command, maxFDCMD_STACKDEPTH +uint8_t checkNextFDcmd(void); + // return 0: no command waiting +// 1: short cmd +// 2: long cmd + uint8_t check4freeFDshortCmd(void); // returns number of free places in short-command stack -#define FDLONG_STACKDEPTH 16 -void longFDcmd_clrStack(void); +//#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); // 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); bool longFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, uint8_t *length, uint8_t *data); -uint8_t check4FDlongCmd(void); +//uint8_t check4FDlongCmd(void); // returns number of waiting command -uint8_t check4freeFDlongCmd(void); +//uint8_t check4freeFDlongCmd(void); // returns number of free places in long-command stack +uint8_t epi_store64BdevParameter(uint8_t length, uint8_t *buf); + // HWapi writes data to be stored + +uint8_t epi_restore64BdevParameter(uint8_t *length, uint8_t *buf); + + #endif diff --git a/include/shared_mem_buffer.h b/include/shared_mem_buffer.h index 59410dc..bf0b403 100644 --- a/include/shared_mem_buffer.h +++ b/include/shared_mem_buffer.h @@ -7,6 +7,12 @@ #include struct SharedMemBuffer { + + + + + + struct rs { char comportName[16]; // z.B. "COM48" char baudStr[16]; // z.B. "19200" @@ -198,6 +204,7 @@ struct SharedMemBuffer { uint8_t mif_cardType; uint8_t mif_cardHolder[8]; +#if 0 #define MEMDEPTH_GOTCOINS (16) struct T_coin { uint8_t valid; @@ -207,6 +214,7 @@ struct SharedMemBuffer { uint16_t value; } gotCoin[MEMDEPTH_GOTCOINS]; uint8_t ctr_gotCoin; +#endif struct store { uint32_t insertedAmount; diff --git a/include/storeINdata.h b/include/storeINdata.h index ac7bad3..583a2d2 100644 --- a/include/storeINdata.h +++ b/include/storeINdata.h @@ -8,7 +8,7 @@ #define MAXNROF_AO 3 -//#define MAXNROF_GENSTR 16 +#define MAXNROF_GENSTR 16 #define MAXNROF_CONTR_PORTS 11 #define MAXNROF_DIports 2 #define MAXNROF_DOports 2 @@ -32,6 +32,9 @@ bool indat_isMifareOn(); void indat_storeMDBisOn(bool isOn); bool indat_isMdbOn(); + + + void gpi_storeSlaveSerParams(uint8_t slaveBaudRate, uint8_t NrDataBits, uint8_t parity, uint8_t NrStopBits); @@ -40,16 +43,29 @@ void epi_getSlaveSerParams(uint8_t *slaveBaudRate, uint8_t *NrDataBits, QString epi_getSlaveParamSTR(); + + + + void gpi_storeGenerals(uint8_t genNr, QString text); // 0=HW 1=SW 2=State + QString epi_loadGenerals(uint8_t genNr); // genNr=0=HW 1=SW 2=State + + + + + void gpi_storeUID(uint8_t const *buf8byteUid); +//void gpi_storeUID(uint8_t *buf8byteUid); // buffer size: 8 byte + void epi_getUIDdec(uint8_t *buf8byteUid); // buffer size: 8 byte + QString epi_getUIDstr(); @@ -79,7 +95,7 @@ void epi_getSpecialYearTimeDate(uint16_t *DayOfYear, uint16_t *HoursOfYear, uint // /////////////////////////////////////////////////////////////////////////////////// -// #define MAXNROF_AI 4 +#define MAXNROF_AI 4 void gpi_storeAIs(uint8_t aiNr, uint16_t val); // rs -> Sdata @@ -128,119 +144,185 @@ void gpi_storeDI_optos(uint8_t indatOpto); uint8_t epi_getDI_optos(void); // bit0: opto in 1 1: opto in 2 -uint8_t gpi_storeDI_auxIn(uint8_t indatAuxIn); // Aux0...5 -uint8_t epi_getDI_auxIn(void); // bit0: auxin 1 ... 5: auxin 6 +void gpi_storeDI_auxIn(uint8_t indatAuxIn); + // Aux0...5 + +uint8_t epi_getDI_auxIn(void); + // bit0: auxin 1 ... 5: auxin 6 + +void gpi_storeDI_ptuWake(uint8_t indat); -bool gpi_storeDI_ptuWake(bool w); bool epi_getDI_ptuWake(void); -bool gpi_storeDI_mbdWake(bool w); +void gpi_storeDI_mbdWake(uint8_t indat); + bool epi_getDI_mdbWake(void); -bool gpi_storeDI_prnReady(bool ready); +void gpi_storeDI_prnReady(uint8_t indat); + bool epi_getDI_prnReady(void); -bool gpi_storeDI_CoinAttach(bool attach); +void gpi_storeDI_CoinAttach(uint8_t indat); + bool epi_getDI_CoinAttach(void); -bool gpi_storeDI_CoinEscrow(bool ce); +void gpi_storeDI_CoinEscrow(uint8_t indat); + bool epi_getDI_CoinEscrow(void); -bool gpi_storeDI_mifareCardTapped(bool tapped); +void gpi_storeDI_mifareCardTapped(uint8_t indat); + bool epi_getDI_mifareCardTapped(void); -bool gpi_storeDI_modemWake(bool w); +void gpi_storeDI_modemWake(uint8_t indat); + bool epi_getDI_modemWake(void); -bool gpi_storeDI_contactPowerIsOn(bool on); + +void gpi_storeDI_contactPowerIsOn(bool di_contact_PwrOn); + bool epi_getDI_contactPwr(void); -bool gpi_storeDI_MifarePowerIsOn(bool on); +void gpi_storeDI_MifarePowerIsOn(bool di_mifare_PwrOn); + bool epi_getDI_mifarePwr(void); -bool gpi_storeDI_readbackMdbTxD(bool rdbkMdbTxd); +void gpi_storeDI_readbackMdbTxD(bool di_rdbkMdbTxd); + bool epi_getDI_mdbTxd(void); -bool gpi_storeDI_AuxPowerIsOn(bool on); +void gpi_storeDI_AuxPowerIsOn(bool di_Aux_PwrOn); + bool epi_getDI_auxPwr(void); -bool gpi_storeDI_GsmPowerIsOn(bool on); +void gpi_storeDI_GsmPowerIsOn(bool di_gsm_PwrOn); + bool epi_getDI_gsmPwr(void); -bool gpi_storeDI_CreditPowerIsOn(bool on); +void gpi_storeDI_CreditPowerIsOn(bool di_credit_PwrOn); + bool epi_getDI_creditPwr(void); -bool gpi_storeDI_PrinterPowerIsOn(bool on); +void gpi_storeDI_PrinterPowerIsOn(bool di_printer_PwrOn); + bool epi_getDI_printerPwr(void); -bool gpi_storeDI_MdbPowerIsOn(bool on); +void gpi_storeDI_MdbPowerIsOn(bool di_mdb_PwrOn); + bool epi_getDI_mdbPwr(void); -bool gpi_storeDI_rejMot_home(bool reject); + +void gpi_storeDI_rejMot_home(bool di); + bool epi_getDI_rejectMotor_homepos(void); -uint8_t gpi_storeDI_paperLow(uint8_t di); +void gpi_storeDI_paperLow(uint8_t di); + uint8_t epi_getDI_npe_sensor(void); // 0: Sensor sees paper 1: no paper 99: off + + + + + + + + + + + + + + + // /////////////////////////////////////////////////////////////////////////////////// // readback digital outputs // /////////////////////////////////////////////////////////////////////////////////// -uint8_t gpi_storeDO_mdbRxTst(uint8_t do_mbdRxTst); +void gpi_storeDO_mdbRxTst(uint8_t do_mbdRxTst); + bool epi_getDO_mdbRxTestOut(void); -uint8_t gpi_storeDO_motorOutputs(uint8_t Pwr); + +void gpi_storeDO_motorOutputs(uint8_t Pwr); + uint8_t epi_getDO_motorOuts(void); // bit0: upper lock forward bit 1 backward // bit2: lower lock forward bit 3 backward -uint8_t gpi_storeDO_serialSwitch(uint8_t state); + +void gpi_storeDO_serialSwitch(uint8_t state); // serial drv on/off, Serial mux1, Serial mux2 + uint8_t epi_getDO_serialSwitch(void); // serial drv on/off, Serial mux1, Serial mux2 bool epi_getDO_serialDriverIsOn(void); + bool epi_getDO_serialMux1isSetToPrinter(void); // mux1 off: serial is switched to printer bool epi_getDO_serialMux1isSetToModem(void); // mux1 on: serial is switched to modem + bool epi_getDO_serialMux2isSetToCredit(void); // mux2 off: serial is switched to credit card terminal + bool epi_getDO_serialMux2isSetToMifare(void); // mux2 on: serial is switched to mifare reader -uint8_t gpi_storeDO_ledsAndFan(uint8_t ledState); + +void gpi_storeDO_ledsAndFan(uint8_t ledState); + bool epi_getDO_led_coin(void); + bool epi_getDO_led_front(void); + bool epi_getDO_led_ticket(void); + bool epi_getDO_led_pin(void); + bool epi_getDO_led_start(void); + bool epi_getDO_led_inside(void); + bool epi_getDO_fan(void); -uint8_t gpi_storeDO_sirenAndRelay(uint8_t sirenRelay); +void gpi_storeDO_sirenAndRelay(uint8_t sirenRelay); + bool epi_getDO_sirene(void); + bool epi_getDO_relay(void); -uint8_t gpi_storeDO_ptuWake(uint8_t state); +void gpi_storeDO_ptuWake(uint8_t state); + bool epi_getDO_ptuWake(void); -uint8_t gpi_storeDO_auxPower(uint8_t pwr); +void gpi_storeDO_auxPower(uint8_t pwr); + bool epi_getDO_auxPower(void); -uint8_t gpi_storeDO_coinShutter(uint8_t state); + +void gpi_storeDO_coinShutter(uint8_t state); + bool epi_getDO_coinShutterOpen(void); + bool epi_getDO_coinShutterTest(void); -uint8_t gpi_storeDO_coinEscrow(uint8_t state); + +void gpi_storeDO_coinEscrow(uint8_t state); + uint8_t epi_getDO_coinEscrow(void); // retval: 1:return flap is open 2:take flap is open 0:closed -uint8_t gpi_storeDO_printerPwrOn(uint8_t state); + +void gpi_storeDO_printerPwrOn(uint8_t state); + uint8_t epi_getDO_printerPwr(void); + + // --------------------------------------------------------------------------------------------- // counterchecks, make sure that DC-outputs are correct @@ -287,14 +369,21 @@ bool epi_cntchk_Mot2Fon(void); uint8_t gpi_storeMdbRecData(uint8_t length, uint8_t *buf); // datif store received mdb data + uint8_t epi_getMdbResponse(void); // 0=no response 1=ACK 2=NAK 3=ACK with data + uint8_t epi_getMdbRecLength(void); // 0...31 + uint8_t epi_restoreMdbRecData(uint8_t *buf); // hwapi reads received mdb data from PI -uint8_t gpi_storeMifReaderStateAndCardType(uint8_t const *buf); + + + + +uint8_t gpi_storeMifReaderStateAndCardType(uint8_t *buf); /* data description: byte 0: current read state: 0=power off 1=reader-fault 2=ready @@ -318,24 +407,41 @@ byte 32: result, always 0 uint8_t epi_restoreMifState(uint8_t *buf, uint8_t maxBufferSize); // retval 0=OK 1=error host buffer too small -bool gpi_storeMifCardData(uint8_t blkNr, uint8_t const *receivedData); + +void gpi_storeMifCardData(uint8_t blkNr, uint8_t *receivedData); // blkNr=0...11 receivedData[64] + uint8_t epi_restoreMifData(uint8_t blkNr, uint8_t *buf, uint8_t maxBufferSize); // blkNr=0...11 return buf[64] // retval: 1=error 0=OK + + +#define pi_prnStateArraySize 20 +#define pi_prnFontArraySize 20 + void epi_restorePrinterState(uint8_t *buf); -void gpi_storePrinterState(uint8_t const *buf); + +void gpi_storePrinterState(uint8_t *buf); void epi_restorePrinterFonts(uint8_t *buf); -void gpi_storePrinterFonts(uint8_t const *buf); -bool gpi_storeMdbState(bool busReady, bool V12on, bool V5on); +void gpi_storePrinterFonts(uint8_t *buf); + + + + +void gpi_storeMdbState(uint8_t busReady, uint8_t V12on, uint8_t V5on ); + bool epi_restoreMdbBusReady(void); + bool epi_restoreMdbV12Ready(void); + bool epi_restoreMdbV5Ready(void); -void gpi_storeMdbResponse(uint8_t leng, uint8_t const *data); + +void gpi_storeMdbResponse(uint8_t leng, uint8_t *data); + void epi_restoreMdbResponse(uint8_t *leng, uint8_t *data); // last received mdb answer (from mdb device) // only needed if a special command was sent directly @@ -344,9 +450,12 @@ void epi_restoreMdbResponse(uint8_t *leng, uint8_t *data); // DB2: nr of received (payload) data bytes (apart from ACK, can be 0....34) // DB3...DB38: rec.data (payload) -void gpi_storeEmpSettings(uint8_t leng, uint8_t const *data); + +void gpi_storeEmpSettings(uint8_t leng, uint8_t *data); + void epi_restoreEmpSettings(uint8_t *leng, uint8_t *data); + /* void gpi_storeEmpCoinSignal(uint8_t leng, uint8_t *data); @@ -360,61 +469,108 @@ void epi_restoreEmpCoinSignal(uint8_t *leng, uint8_t *data); void epi_clearEmpCoinSignal(); */ +#define MEMDEPTH_GOTCOINS 16 -void gpi_storeEmpCoinSignal(uint8_t leng, uint8_t const *data); +void gpi_storeEmpCoinSignal(uint8_t leng, uint8_t *data); uint8_t epi_isNewCoinLeft(void); // retval: 0...16 coins left in FIFO + void epi_restoreEmpCoinSignal(uint8_t *valid, uint8_t *signal, uint8_t *error, uint16_t *value); -void gpi_storeRbDeviceSettings(uint8_t leng, uint8_t const *data); + + +void gpi_storeRbDeviceSettings(uint8_t leng, uint8_t *data); + void epi_restoreRbDeviceSettings(uint8_t *leng, uint8_t *data); -void gpi_storeMachineIDsettings(uint8_t leng, uint8_t const *data); + +void gpi_storeMachineIDsettings(uint8_t leng, uint8_t *data); + void epi_restoreMachineIDsettings(uint8_t *leng, uint8_t *data); + + + void epi_clearCurrentPayment(void); + void gpi_storeCurrentPayment(uint32_t insertedAmount, uint16_t lastCoinType, uint16_t lastCoinValue); uint32_t epi_CurrentPaymentGetAmount(void); + uint16_t epi_CurrentPaymentGetLastCoin(void); bool epi_CurrentPaymentGetAllCoins(uint16_t *types, uint16_t *values); // alle bei diesem Verkauf eingeworfenen Münzen sind gespeichert falls die jmd. braucht -void gpi_storeWakeSources(uint8_t const *receivedData); + +void gpi_storeWakeSources(uint8_t *receivedData); + uint64_t epi_getWakeSources(void); -void gpi_storeExtendedTime(uint8_t leng, uint8_t const *data); +uint8_t epi_getWakeReason(void); + + + +void gpi_storeExtendedTime(uint8_t leng, uint8_t *data); + void epi_restoreExtendedTime(uint8_t *leng, uint8_t *data); -void gpi_storeDeviceConditions(uint8_t leng, uint8_t const *data); + + +void gpi_storeDeviceConditions(uint8_t leng, uint8_t *data); + void epi_restoreDeviceConditions(uint8_t *leng, uint8_t *data); -void gpi_storeDynMachineConditions(uint8_t leng, uint8_t const *data); + +void gpi_storeDynMachineConditions(uint8_t leng, uint8_t *data); + void epi_restoreDynMachineConditions(uint8_t *leng, uint8_t *data); -void gpi_storeDCbackupAccNr(uint8_t leng, uint8_t const *data); + +void gpi_storeDCbackupAccNr(uint8_t leng, uint8_t *data); + void epi_restoreDCbackupAccNr(uint8_t *leng, uint16_t *accNrs); // return accNrs[0..7] + void epi_iniVRstorage(void); -void gpi_storeVaultRecord(uint8_t blkNr, uint8_t const *data); + +void gpi_storeVaultRecord(uint8_t blkNr, uint8_t *data ); + bool epi_checkIfVaultRecordAvailable(void); -bool epi_restoreVaultRecord(uint16_t *length, uint8_t *buf); + +bool epi_restoreVaultRecord(uint16_t *length, uint8_t *buf ); // true if completly received -void gpi_storeCBlevel(uint32_t amount, uint16_t nrOfCoins); +void gpi_storeCBlevel(uint32_t amount, uint16_t nrOfCoins ); uint32_t epi_getCashBoxContent(void); + uint16_t epi_getNrOfCoinsInCashBox(void); -void gpi_storeNewMifareCard(uint8_t typ, uint8_t const *holder); +void gpi_storeNewMifareCard(uint8_t typ, uint8_t *holder ); -uint8_t epi_mifGetCardType(uint8_t const *holder); +uint8_t epi_mifGetCardType(uint8_t *holder); //holder[8] = name of card holder // retval Type of MifareCard, 1=upper door, 2=lower door 3=test printer 4=test coins +void gpi_storeDcDataValid(bool isVal); + +bool epi_areDcDataValid(); + + + +void epi_clearDynData(void); + +void gpi_storeDynData(uint8_t *DCdynDat); + // buffer size: 64 byte + +bool epi_getDynPrnData(uint8_t *DCdynDat); + // buffer size: 64 byte + // return true if data are new and valid + + #endif diff --git a/plugins/interfaces.h b/plugins/interfaces.h index 3aac4f0..913a23d 100644 --- a/plugins/interfaces.h +++ b/plugins/interfaces.h @@ -24,13 +24,21 @@ struct T_emp // dynamic: uint8_t state; // step counter of EMP (electronic coin checker) FSM (finite state machine): - // 0=Emp & Bus power off, 1=powered, poll off 2=polling on - // 3=device responded, requesting status - // 4=waiting for status 5=have status, - // 6: IDLE, have paramters from master, polling running, ready for payment - // Master can stop/start polling and acceptance - // 7: end of transaction, polling on, accept off, reporting coins, (wait for last coin) - // 8: transaction running, polling on, acceptance on, reporting coins, + // 0=start command + // 1=powered, do emp ini, send reset + // 2=delay + // 3=wait for response, requesting status after response + // 4,5 through, startup + // 6: wait for status + // 7: through, startup + // 8: IDLE state. EMP is up and ready, polling is running + // 9: polling on, payment not yet on + // 10: payment, check coins + // 11: through + // 12: wait 1s for last coin + // 90: stop all, 1s delay + // 99: off, all stopped + uint8_t pollingRunning; uint8_t paymentRunning; @@ -80,6 +88,7 @@ struct Tprn_hw_state bool nowAligned; }; +// obsolete struct T_dynDat { uint8_t licensePlate[8]; @@ -122,17 +131,17 @@ struct T_vaultRecord //16 char label3buffer[4]; // mw > - // Verkauf, Tür zu: - uint32_t VKcoinsInserted[16]; // nur für Wechsler, soviel wurde eingeworfen - uint32_t VKcoinsReturned[6]; // nur für Wechsler, Anzahl Münzen pro Typ, soviel wurde zurückgegeben + // Verkauf, Tür zu: + uint32_t VKcoinsInserted[16]; // nur für Wechsler, soviel wurde eingeworfen + uint32_t VKcoinsReturned[6]; // nur für Wechsler, Anzahl Münzen pro Typ, soviel wurde zurückgegeben //88 - // Service, Tür offen: - uint16_t ServCoinsInserted[16]; // nur für Wechsler, soviel wurde eingeworfen - uint16_t ServCoinsReturned[6]; // nur für Wechsler, Anzahl Münzen pro Typ, soviel wurde zurückgegeben + // Service, Tür offen: + uint16_t ServCoinsInserted[16]; // nur für Wechsler, soviel wurde eingeworfen + uint16_t ServCoinsReturned[6]; // nur für Wechsler, Anzahl Münzen pro Typ, soviel wurde zurückgegeben uint16_t resint3; uint16_t resint4; - uint16_t currentTubeContent[6]; // nur für Wechsler, aktueller Füllstand + uint16_t currentTubeContent[6]; // nur für Wechsler, aktueller Füllstand uint16_t resint5; uint16_t resint6; // 56 @@ -167,30 +176,29 @@ struct T_moduleCondition // 100..150 = WARNING // 200..250 = ERROR - uint8_t structStart; // always first!!! - uint8_t ram; // v - uint8_t intEe; // v - uint8_t extEe; // v + uint8_t ram; + uint8_t intEe; + uint8_t extEe; uint8_t rtc; // 1: time/date OK 100: time not plausible 200: hardware error - uint8_t boardHw; // v - uint8_t printer; // v - uint8_t modem; // v + uint8_t boardHw; + uint8_t printer; + uint8_t modem; uint8_t signal; // 1...99 uint8_t regist; // 100:not 1:reg 2:ping OK 3:gotTime uint8_t mdbBus; uint8_t coinChecker; // EMP, OMP or mei-cashflow - uint8_t coinEscrow; // v - uint8_t mifareReader; // v - uint8_t creditTerm; // not available - uint8_t coinReject; // v + uint8_t coinEscrow; + uint8_t mifareReader; + uint8_t creditTerm; + uint8_t coinReject; - uint8_t coinSafe; // v - uint8_t billSafe; // v - uint8_t voltage; // v // 1:11..14V - uint8_t temper; // v + uint8_t coinSafe; + uint8_t billSafe; + uint8_t voltage; // 1:11..14V + uint8_t temper; uint8_t poweronTest; uint8_t doorState; // 1: alles zu 200: t?r offen + bit1(S) +bit2(CB) + bit3(CB) @@ -211,62 +219,132 @@ struct T_moduleCondition struct T_dynamicCondition { - // dynamic conditions, change rapidly and frequently - // these are values for the Heartbeat - - // T?rschalter entprellt: - char upperDoor; // 0:fehlt 1:drin - char middleDoor; - char lowerDoor; - char coinBox; - + char allDoorsDebounced; + char openedAuthorized; + uint8_t CBinDebounced; // 0:fehlt 1:drin + char upperDoor; // 99: undefined 0:closed 1:open + char middleDoor; // 99: undefined 0:closed 1:open + char lowerDoor; // 99: undefined 0:closed 1:open + char reserve; char billBox; char modeAbrech; - char onAlarm; + char onAlarm; // 0:alarm aus 1:alarm 2:alarm mit Sirene 3: Sirenentest char nowCardTest; - - char nowPayment; + char nowPayment; // not used, always 0 char lastMifCardType; - char openedAuthorized; - char allDoorsDebounced; - uint8_t lastSDoorState; uint8_t lastVDoorState; - uint8_t CBinDebounced; uint8_t lastCBstate; + char paymentInProgress; + // 0: stopped by timeout + // 1: running 2: wait4lastCoin + // 3: payment stopped manually, coins in Escrow + // 4: payment stopped autom, amount collected, coins in Escrow + // 5: payment stopped, escrow full, coins in Escrow + // 6: coins encashed 7:coins returned + // 8: CoinChecker or MDB on Error - char paymentInProgress; - char res1; - char res2; - char res3; - uint16_t U_Batt; + char res1; + uint16_t U_Batt; uint16_t Temperatur; - - uint16_t cash_storedaccNumbers[8]; // List all stored accounting numbers in ext. eeprom - uint16_t nrCoinsInBox; - uint16_t resui1; - uint32_t amountInBox; - uint32_t amountJustPaid; - - uint16_t lastInsCoinType; // wahrscheinlich uchar - uint16_t resui2; - uint32_t totalTransVolume; uint32_t totalNrOfVends; + char jsonValid_config; + char jsonValid_device; + char jsonValid_cash; + char jsonValid_print; + char jsonValid_serial; + char jsonValid_time; + char lastFileType; +// 44 + uint8_t MifCardHolder[8]; + uint8_t resultOfLastTemplPrint; + // 0: unknown or printing in progress + // 1: OK, doc was printed 2: error, doc was not printed + uint8_t lastPrinterStatus; + // 0: printer OK + // bit0: near paper end bit1: no paper + // bit2: temperature error bit3: error head open + // bit4: paper jam in cutter + // bit6: no response bit7: serial rec. error + // bit5: printer not ready + uint8_t startupTestIsRunning; + + //54 +}; + +struct T_extTime +{ + uint8_t Hours; + uint8_t Min; + uint8_t Sec; + uint8_t Year; + uint8_t Month; + uint8_t Day; + uint8_t DOW; + uint8_t res1; + uint16_t MinOfDay; + uint16_t res2; + uint32_t SecOfDay; + uint8_t isLeapYear; + uint8_t nxtLeapYear; + uint8_t lastLeapYear; + uint8_t hoursOfThisWeek; + uint16_t minutesOfThisWeek; + uint16_t hoursOfThisMonth; + uint16_t daysOfThisYear; + uint16_t GetHoursOfYear; + uint16_t res3; + uint32_t GetMinutesOfYear; + uint8_t getWakeIntvSec; + uint8_t res4; + uint16_t res5; + uint32_t MinutesOfMillenium; }; +typedef uint8_t UCHAR; +typedef uint16_t UINT; + +struct T_devices +{ + // set by master, used(1) or notused (0) or type 2....20 + + UCHAR kindOfPrinter; // 0:off 1:Gebe + UCHAR kindOfCoinChecker; // 0: without 1=EMP820 2=EMP900 3=currenza c² (MW) + UCHAR kindOfMifareReader; // by now only stronglink SL025 =1 + UCHAR suppressSleepMode; // 0:sleep allowed 1: no sleep + + UCHAR kindOfModem; // 0:off 1:Sunlink + UCHAR kindOfCreditcard; // 0:off 1:Feig NFC + UCHAR CoinEscrow; + UCHAR CoinRejectUnit; + + UCHAR CoinShutter; + UCHAR BillAcceptor; + UCHAR usevaultLock; + UCHAR autoAlarm; // 1: switch on siren for 1min in doors opened unauthorized + + UCHAR autoOpen; // 1: open door covers after valid ATBcard + UCHAR printAccReceipt; // 0/1 + UCHAR printDoorReceipt; + UCHAR printTokenTicket; + + UINT VaultFullWarnLevel; + UINT VaultFullErrorLevel; + +}; + + + class hwinf { public: - enum class DownloadResult {OK, ERROR, TIMEOUT, NOP}; - enum class FileTypeJson {CONFIG=1, DEVICE, CASH, SERIAL, TIME, PRINTER}; - virtual ~hwinf() {} @@ -277,20 +355,20 @@ public: // Sending input requests to DC2 (single or auto-batch) // Getting input data as receiver payload // Furthermore the Cashagent-Library answers with status strings about sending and reading result - // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ - virtual bool dc_openSerial(int BaudNr, QString BaudStr, QString ComName, uint8_t connect) const = 0; + virtual bool dc_openSerial(int BaudNr, QString BaudStr, QString ComName, uint8_t connect) const =0; // Command: open serial interface // BaudNr: 0:1200 1:9600 2:19200 3:38400 4:57600 5:115200 // BaudStr: for exapmle "19200" // ComName: for example "COM48" // connect: 0, 1 - virtual bool dc_closeSerial(void) const = 0; + virtual void dc_closeSerial(void) const =0; // Command: close serial interface in order to save power while power down // or if another port must be used - virtual bool dc_isPortOpen(void) const =0; + virtual bool dc_isPortOpen(void) const =0; // returns true if port open (don't send unless open. Sending to closed port will crash program) @@ -301,22 +379,8 @@ public: virtual bool test_serialIsOn(void) const =0; - virtual bool dc_updateDC(QString binFileName, - QString baudrate, - QString comPort) const = 0; - // download binary file down into device controller - - virtual bool dc_updatePrinterTemplate(enum FileTypeJson type, - QVector templateIdx, - QVector fnames, - QString br, - QString serial) const = 0; - - virtual bool dc_printTemplate(enum FileTypeJson type, - QVector templateIdx, - QString br, - QString serial) const = 0; - + + virtual void dc_autoRequest(bool on) const =0; // on = true: select that all READ-Requests are sent automatically // on = false: select that all READ-Requests are sent manually one by one @@ -332,7 +396,7 @@ public: // get data back in "payLoad", max 64 byte, can be used for diagnosis // retval = nr of bytes received. If host buffer too small then // only plBufSiz bytes are copied to "payLoad" - // plBufSiz­z=size of host buffer + // plBufSiz­z=size of host buffer virtual void dc_requTestResponse() const =0; // tell DC2 to send a test-string, useful to see if cable and baudrate is OK @@ -453,10 +517,10 @@ public: // Analog values: virtual uint32_t dc_getTemperature(void) const =0; - // in Sax-Format 0...400 (0=-50,0°C 100=0,0°C 141=20,5°C 400=150,0°C) + // in Sax-Format 0...400 (0=-50,0°C 100=0,0°C 141=20,5°C 400=150,0°C) virtual QString dc_getTemperaturStr(void) const =0; - // as string like "-12,5°C" + // as string like "-12,5°C" virtual uint32_t dc_getVoltage(void) const =0; // as value in mV, 0...65,535V @@ -611,7 +675,7 @@ public: uint8_t kindOfModem, uint8_t kindOfCredit ) const =0; // enable hardware in device controller: // kindOfPrinter: 0:off 1: GPT4672 (only this one implemented) - // kindOfCoinChecker: 0:off 1:EMP820 2:EMP900 3: C²_changer + // kindOfCoinChecker: 0:off 1:EMP820 2:EMP900 3: C²_changer // kindOfMifareReader: 0:off 1: SL025 (only this one implemented) // suppressSleep: 0:sleep allowed 1: sleep surpressed for special reason // kindOfModem: 0:off 1: ATB_Sunlink_LTE (not yet implemented) @@ -717,7 +781,7 @@ public: // send 5 byte: byte 0,1: speed 5...250 mm/s // byte2: density 0....(25)....50 // byte3: alignment 'l', 'c', 'r' = left, center, right - // byte4: orientation 0, 90, 180 = 0°, 90°, 180° rotation (by now not supported!) + // byte4: orientation 0, 90, 180 = 0°, 90°, 180° rotation (by now not supported!) // not batched! don't use twice within 100ms virtual void prn_movePaper(uint8_t wayInMm, uint8_t direction) const =0; @@ -775,29 +839,36 @@ public: // up to 8 dynamic values can be defined in the template ("print val3 here") and will be sent with printing command // example: print current time at this point (the time of printing not the storage time!!) - virtual void pri_startTicketDesign(void) const =0; + // obsolete + //virtual void pri_startTicketDesign(void) const =0; // start for every new printer document, reseting collecting buffer // all further functions write/append text, numbers and command to the ticket-buffer, up to 1278 bytes allowed // return val of the appending functions: true=ok false=too long, buffer full - virtual int pri_TD_getCurrentSize(void) const =0; + // obsolete + //virtual int pri_TD_getCurrentSize(void) const =0; // retval: 0...1278 - virtual bool pri_TD_addText(QByteArray text) const =0; + // obsolete + //virtual bool pri_TD_addText(QByteArray text) const =0; // example: pri_TD_addText("Hello") const =0; // example: pri_TD_addText(tempStr) const =0; // retval: true=ok false=too long, buffer full - virtual bool pri_TD_addValue(int val) const =0; + // obsolete + //virtual bool pri_TD_addValue(int val) const =0; // +/- 0...2^(31) - virtual bool pri_TD_addNewLine(void) const =0; + // obsolete + //virtual bool pri_TD_addNewLine(void) const =0; - virtual bool pri_TD_addSign(char sign) const =0; + // obsolete + //virtual bool pri_TD_addSign(char sign) const =0; // example: '.' ' ' 0x20 'W' '$' - virtual bool pri_TD_addCommand(char group, char attribute, char p1, char p2, char p3, char p4, char p5) const =0; + // obsolete + //virtual bool pri_TD_addCommand(char group, char attribute, char p1, char p2, char p3, char p4, char p5) const =0; // always add 8 byte to the ticket layout: ESC & group & attribute & parameter1...5 /* complete list of possible commands: group 50 : paper @@ -838,11 +909,13 @@ public: */ - virtual char prn_clearDocument(uint8_t documentNumber) const =0; + // obsolete + //virtual char prn_clearDocument(uint8_t documentNumber) const =0; // clear memory buffer for ONE document // function takes a second! don't send right before "store doc" - virtual bool prn_store_Document(uint8_t documentNumber ) const =0; + // obsolete + //virtual bool prn_store_Document(uint8_t documentNumber ) const =0; // send the predefined Layout (generated with above TD functions) to DeviceController to save // documentNumber=0...15 // maximal 1280 bytes each @@ -853,7 +926,8 @@ public: // the place in the ticket layout is predefined (already in DC memory) // the dynamics are first calculated at printing time - virtual bool prn_printDocument(uint8_t documentNumber, struct T_dynDat *dynTicketData) const =0; +// obsolete + //virtual bool prn_printDocument(uint8_t documentNumber, struct T_dynDat *dynTicketData) const =0; // 36 @@ -1245,10 +1319,10 @@ public: virtual void bl_rebootDC(void) const =0; - virtual void bl_startBL(void) const = 0; + virtual void bl_startBL(void) const =0; // send command within 4s after DC power-on, otherwise bl is left - virtual bool bl_checkBL(void) const = 0; + virtual void bl_checkBL(void) const =0; // send command to verify if bl is up virtual bool bl_isUp(void) const =0; @@ -1285,7 +1359,7 @@ public: // Komplett-schreib Funktion, noch nicht getestet - // Nachteil: keine Rückmeldung wie lang's noch dauert + // Nachteil: keine Rückmeldung wie lang's noch dauert //virtual void bl_startSending(void) const=0; // call once after BL is working and file is loaded //virtual void bl_sendFile(void) const=0; @@ -1311,7 +1385,7 @@ public: buf[4]=GlobTime.Month; buf[5]=GlobTime.Day; buf[6]=GlobTime.DOW; - buf[7]=' '; // immer auf 32bit auffüllen sonst Speicherproblem beim Master! + buf[7]=' '; // immer auf 32bit auffüllen sonst Speicherproblem beim Master! uitmp=GlobTime.MinOfDay; buf[8]=swl_getOneByteFromUint(uitmp, 0); buf[9]=swl_getOneByteFromUint(uitmp, 1); @@ -1371,6 +1445,8 @@ public: */ + virtual bool rtc_getExtendedTime(struct T_extTime *exTime) const=0; + virtual bool sys_runCompleteTest(void) const=0; // warning: lasts 20s in one pace // return true if sending, false if cmd-stack is full @@ -1395,15 +1471,18 @@ public: // nr = 1..32 // return true if sending, false if cmd-stack is full - virtual void log_getHoldAccountNumbers(uint32_t *accNr ) const=0; + virtual void log_getHoldAccountNumbers(uint8_t *nrOfVals, uint16_t *accNr ) const=0; // returns all acc nrs of the backuped vault records - // use: uint32_t backupedAccNumbers[8] + // use: uint16_t backupedAccNumbers[8] virtual bool log_selectVaultRecord(uint16_t accountNr ) const=0; // return true if sending, false if cmd-stack is full + // and trigger transfer -//request, isAvailable -virtual void log_getVaultRecord(struct T_vaultRecord *retVR) const=0; + virtual bool log_chkIfVaultRecordAvailable(void) const=0; + // return true if completly received + + virtual bool log_getVaultRecord(struct T_vaultRecord *retVR) const=0; // which was selected by: log_selectVaultRecord() // to be forwarded to Ismas @@ -1413,7 +1492,19 @@ virtual void log_getVaultRecord(struct T_vaultRecord *retVR) const=0; virtual bool prn_printTestTicket(void) const=0; // return true if sending to DC OK, false if cmd-stack is full - virtual bool cash_startPayment(uint16_t amount) const=0; + virtual bool cash_startPayment(uint32_t amount) const=0; + // 17.4.23TS: extended to 32bit + + virtual uint8_t cash_paymentProcessing(void) const=0; + // run this function periodically while coin payment process to generate necessary signals + // return value: + // 0: stopped 1: starting up 2: coin collection + // 3: finished by User (Push button) 4: finished, Max-Value collected + // 5: finished by escrow + // 10,11: error cannot start + // 12: timeout while payment, coins returned + // 13: stopped by unexpected error + virtual uint32_t getInsertedAmount(void) const=0; @@ -1437,18 +1528,23 @@ virtual void log_getVaultRecord(struct T_vaultRecord *retVR) const=0; // conclude payment process and return all inserted coins - - - - - virtual uint8_t mif_getCardType(QString cardholder) const=0; + virtual uint8_t mif_getCardType(QString *cardholder) const=0; // return 1,2,3,4 = upper, lower access card, printer test, coin test // cardholder: 7byte Name-String virtual uint64_t sys_getWakeSource(void) const =0; // retval: 6 bytes, bit coded, 1=event keeps DC awake - //virtual void sys_getDeviceConditions(struct T_moduleCondition *devCond) const=0; + virtual uint8_t sys_getWakeReason(void) const=0; + // Master was woken by following reason: + // 1: MDB Event + // 2: Coin Event + // ( 3: Master Event) - will not set the wake line + // ( 4: 32s pulse) - will not set the wake line + // 5: Door Event + // ( 6: Diag Event) - will not set the wake line + // 7: 30min-Pulse for HB + virtual void sys_getDeviceConditions(uint8_t *leng, uint8_t *data) const=0; /* @@ -1485,8 +1581,9 @@ virtual void log_getVaultRecord(struct T_vaultRecord *retVR) const=0; */ + virtual void sys_getDeviceConditions(struct T_moduleCondition *devCond) const=0; + - //virtual void sys_getDynMachineConditions(struct T_dynamicCondition *dynMachCond) const=0; virtual void sys_getDynMachineConditions(uint8_t *leng, uint8_t *data) const=0; /* @@ -1552,6 +1649,70 @@ virtual void log_getVaultRecord(struct T_vaultRecord *retVR) const=0; */ + virtual void sys_getDynMachineConditions(struct T_dynamicCondition *dynMachCond) const=0; + + // content of Cashbox + virtual uint32_t cash_getAmountInVault(void) const=0; + + virtual uint16_t cash_getNrCoinsInVault(void) const=0; + + virtual uint8_t prn_getPrintResult() const=0; + // return: 0: unknown + // 1: OK - last template was printed succesful + // 2: error - last template was not printed + + // in case of print-error get detailed error: + virtual uint8_t prn_getCurrentPrinterState() const=0; + // 0: printer OK + // bit0: near paper end bit1: no paper + // bit2: temperature error bit3: error head open + // bit4: paper jam in cutter + // bit6: no response bit7: serial rec. error + // bit5: printer not ready + + + virtual void sys_sendDeviceParameter(struct T_devices *deviceSettings) const=0; + + virtual void sys_restoreDeviceParameter(struct T_devices *deviceSettings) const=0; + + virtual bool sys_areDCdataValid(void) const=0; + + virtual bool sys_sendingTest(void) const =0; + + virtual void prn_requestCurrentDynData(void) const =0; + + virtual bool prn_getCurrentDynamicPrnValuesFromDC(uint8_t *dynPrnVal ) const =0; + // which was sent with: bool prn_sendDynamicPrnValues(uint8_t *dynPrnVal ) const override; + + virtual bool prn_dynDataAreEqual(uint8_t *buf) const =0; + + virtual bool prn_printKombiticket(uint8_t nrOfKombi) const=0; + // print four of the templates loaded by Json prior + // nr = 1..8 + + + virtual void lock_triggerUpperSolenoid(void) const =0; + + virtual void lock_triggerLowerSolenoid(void) const =0; + + +signals: + virtual void hwapi_templatePrintFinished_OK(void) const=0; + virtual void hwapi_templatePrintFinished_Err(void) const=0; + + virtual void hwapi_coinCollectionJustStarted(void) const=0; + virtual void hwapi_coinCollectionAborted(void) const=0; + + virtual void hwapi_gotNewCoin(void) const=0; + virtual void hwapi_payStopByMax(void) const=0; + virtual void hwapi_payStopByPushbutton(void) const=0; + + virtual void hwapi_payStopByEscrow(void) const=0; + virtual void hwapi_payStopByError(void) const=0; + virtual void hwapi_payStopByTimeout(void) const=0; + virtual void hwapi_payCancelled(void) const=0; + + virtual void hwapi_coinProcessJustStopped(void) const=0; }; @@ -1569,10 +1730,22 @@ virtual void log_getVaultRecord(struct T_vaultRecord *retVR) const=0; // 29.03.2023: V3.1 some extensions for PSA1256_ptu5, // V3.2 Bootloader improvement // 12.04.2023: V3.3 new features extended: loading and using Json-files, cash-collection, cash-data-logging +// 14.04.2023: V3.4 new features extended: sys_getDynMachineConditions, sys_getDeviceConditions and +// rtc_getExtendedTime return struct in addition. New function to select and get VaultRecord +// +// 19.04.2023: V3.5 new function: sys_getWakeReason(); +// 17.05.2023: V3.6 new function: cash_isCollectionActive(), cash_isPayProcessActive() +// new signals: hwapi_coinCollectionJustStopped, hwapi_coinCollectionJustStarted +// getAllInsertedCoins() fixed, also in datif and storeINdata + + //#define HWINF_iid "Atb.Psa2020.software.HWapi/3.1" //#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.1" -#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.3" +//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.3" +//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.4" +//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.5" +#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.6" diff --git a/src/com.cpp b/src/com.cpp index 01f9292..b9151fd 100644 --- a/src/com.cpp +++ b/src/com.cpp @@ -93,34 +93,29 @@ T_com::~T_com() void T_com::ser_ISR100ms() { - //qDebug() << "~~>LIB" << "ENTER..."; // call every 100ms to check if user(HMI) wants to connect or disconnect + + //qDebug() << "~~>LIB" << "checking connect button... " ; + uint8_t chkConn = gpi_getSerialConn(); // from global GUI buffer (Sdata) - - //qDebug() << "~~>LIB" << "checking connect button... " << chkConn; - switch (chkConn) { case 0: // 0 button "connect" was just released - //qDebug() << "close serial port" << chkConn; closeSerialPort(); gpi_serialChanged(); // set chkConn to 2, thus getting edge break; case 1: // 1 button "connect" was just pressed - //qDebug() << "open serial port" << chkConn; open_Serial_Port(); gpi_serialChanged(); // set chkConn to 2, thus getting edge break; } - if (CatSerial->isOpen()) { + if (CatSerial->isOpen()) gpi_serialIsOpen(true); - } else { + else gpi_serialIsOpen(false); - } - //qDebug() << "LEAVE " << chkConn; } // ------------------------------------------------------------------------------------------------------------- @@ -129,24 +124,17 @@ void T_com::ser_ISR100ms() char T_com::open_Serial_Port() { - //qDebug() << "ENTER"; - bool ret; QString myString=nullptr, myPortName=nullptr, myBaudStr=nullptr; int myBaudNr; - if (CatSerial->isOpen()) { - qDebug() << "!!!IS OPEN!!!"; + if (CatSerial->isOpen()) return 0; // opening twice is not allowed - } //qDebug() << "connecting..." << myPortName; myPortName=gpi_getComPortName(); // was selected and stored from GUI CatSerial->setPortName(myPortName); myBaudNr=gpi_getBaudNr(); // was selected and stored from GUI - - //qDebug() << "myPortName" << myPortName << ", myBaudNr" << myBaudNr; - switch (myBaudNr) { // 0:1200 1:9600 2:19200 3:38400 4:57600 5:115200 @@ -179,9 +167,6 @@ char T_com::open_Serial_Port() myString.append(CatSerial->errorString()); qDebug() << myString; gpi_setTxt4comStateLine(myString); - - //qDebug() << "LEAVE"; - return 0; } else { @@ -197,14 +182,11 @@ char T_com::open_Serial_Port() } - //qDebug() << "LEAVE"; - return 0; + return 0; } void T_com::closeSerialPort() { - //qDebug() << "ENTER"; - if (CatSerial->isOpen()) { qDebug() << "closing connection"; @@ -213,8 +195,6 @@ void T_com::closeSerialPort() gpi_setTxt4RsDiagWin("closed"); } - - //qDebug() << "LEAVE"; } diff --git a/src/controlBus.cpp b/src/controlBus.cpp index b017aaf..62e57a6 100644 --- a/src/controlBus.cpp +++ b/src/controlBus.cpp @@ -1,110 +1,134 @@ #include -#include - #include #include #include "tslib.h" -#include "shared_mem_buffer.h" +//#include "controlBus.h" // /////////////////////////////////////////////////////////////////////////////////// // control serial interface gui <--> serial // /////////////////////////////////////////////////////////////////////////////////// -void epi_setSerial(int BaudNr, - QString BaudStr, - QString ComName, - uint8_t connect) { - memset(&SharedMemBuffer::getData()->rs.comportName[0], 0x00, - sizeof(SharedMemBuffer::getData()->rs.comportName)); - strncpy(SharedMemBuffer::getData()->rs.comportName, - ComName.toStdString().c_str(), - sizeof(SharedMemBuffer::getData()->rs.comportName)-1); - memset(&SharedMemBuffer::getData()->rs.baudStr[0], 0x00, - sizeof(SharedMemBuffer::getData()->rs.baudStr)); - strncpy(SharedMemBuffer::getData()->rs.baudStr, - BaudStr.toStdString().c_str(), - sizeof(SharedMemBuffer::getData()->rs.baudStr)-1); +static QString rs_comportName; // z.B. "COM48" +static QString rs_baudStr; // z.B. "19200" +static int rs_baudNr; //0...5 oder -1 +static uint8_t rs_connect; // 0,1 + +void epi_setSerial(int BaudNr, QString BaudStr, QString ComName, uint8_t connect) +{ + rs_comportName = ComName; + rs_baudStr = BaudStr; + rs_baudNr = BaudNr; // 0=1200 1=9600 2=19200 3=38400 4=57600 5=115200 oder -1 + rs_connect = connect; // 0/1 - SharedMemBuffer::getData()->rs.baudNr = BaudNr; - SharedMemBuffer::getData()->rs.connect = connect; } -void epi_closeSerial(void) { - SharedMemBuffer::getData()->rs.connect = 0; +void epi_closeSerial(void) +{ + rs_connect=0; } -void gpi_serialChanged(void) { + +void gpi_serialChanged(void) +{ // serial confirms that port was closed or opened - // rs_connect=2; // Flanke, nur 1x öffnen/schließen - SharedMemBuffer::getData()->rs.connect = 2; + rs_connect=2; // Flanke, nur 1x öffnen/schließen } -uint8_t gpi_getSerialConn(void) { - return SharedMemBuffer::getDataConst()->rs.connect; +uint8_t gpi_getSerialConn(void) +{ + return rs_connect; } -int gpi_getBaudNr(void) { - return SharedMemBuffer::getDataConst()->rs.baudNr; + +int gpi_getBaudNr(void) +{ + return rs_baudNr; } -QString gpi_getComPortName(void) { - return SharedMemBuffer::getDataConst()->rs.comportName; +QString gpi_getComPortName(void) +{ + return rs_comportName; } -void gpi_serialIsOpen(bool offen) { - SharedMemBuffer::getData()->rs.portIsOpen = offen; +static bool rs_portIsOpen; + +void gpi_serialIsOpen(bool offen) +{ + rs_portIsOpen=offen; } -bool epi_isSerialPortOpen() { +bool epi_isSerialPortOpen() +{ // true: port is open false: port is closed - return SharedMemBuffer::getDataConst()->rs.portIsOpen; + return rs_portIsOpen; } // /////////////////////////////////////////////////////////////////////////////////// // Control transfer gui <--> serial // /////////////////////////////////////////////////////////////////////////////////// -void epi_startEmmision(char start) { - SharedMemBuffer::getData()->AutoEmissionOn = start; + +static char AutoEmissionOn; // 1: zyklisch Anfragen zum Slave senden + +void epi_startEmmision(char start) +{ + AutoEmissionOn=start; } -bool gpi_isEmmisionOn(void) { - return SharedMemBuffer::getDataConst()->AutoEmissionOn; +bool gpi_isEmmisionOn(void) +{ + return AutoEmissionOn; } -uint16_t gpi_getPeriodicSendTimeVal() { - SharedMemBuffer::getData()->datif.sendingPer_changed = 0; - if ((SharedMemBuffer::getDataConst()->datif.sendingPeriod < 3) || - (SharedMemBuffer::getDataConst()->datif.sendingPeriod > 10000)) { +//----------------------------------------------------- + +static uint16_t datif_sendingPeriod; +static bool datif_sendingPer_changed; + +uint16_t gpi_getPeriodicSendTimeVal() +{ + datif_sendingPer_changed=0; + if (datif_sendingPeriod<3 || datif_sendingPeriod>10000) return 130; // ms, default - } - return SharedMemBuffer::getDataConst()->datif.sendingPeriod; + else + return datif_sendingPeriod; } -void epi_setPeriodicSendTimeVal(uint16_t val) { - if (val>=3 && val<10000) { - SharedMemBuffer::getData()->datif.sendingPer_changed = 1; - SharedMemBuffer::getData()->datif.sendingPeriod = val; +void epi_setPeriodicSendTimeVal(uint16_t val) +{ + if (val>=3 && val<10000) + { + datif_sendingPer_changed=1; + datif_sendingPeriod=val; } } -bool gpi_PeriodicSendTimeHasChanged() { - return SharedMemBuffer::getDataConst()->datif.sendingPer_changed; +bool gpi_PeriodicSendTimeHasChanged() +{ + return datif_sendingPer_changed; } +//----------------------------------------------------- + + +//----------------------------------------------------- + // /////////////////////////////////////////////////////////////////////////////////// // Status Display gui <--> serial // /////////////////////////////////////////////////////////////////////////////////// + // linke Spalte, über Connect Button static QString txt4comStateLine; -QString epi_getTxt4comStateLine(void) { +QString epi_getTxt4comStateLine(void) +{ // GUI: get Text for serial Comport-State Line return txt4comStateLine; } -void gpi_setTxt4comStateLine(QString txtline) { +void gpi_setTxt4comStateLine(QString txtline) // gpi +{ // serial: write Text to be displayed in serial Comport-State line (like "connected") txt4comStateLine.clear(); if (txtline=="") @@ -113,20 +137,26 @@ void gpi_setTxt4comStateLine(QString txtline) { txt4comStateLine=txtline; } -void epi_clrTxt4comStateLine() { +void epi_clrTxt4comStateLine() +{ txt4comStateLine.clear(); } + +//--------------------------------------------------------------------------------------------- + // rechte Spalte, oberste Statuszeile // I) "Handshakes" (serial Control) flow.cpp // geht überhaupt was raus? kommt überhaupt was zurück? static QString txt4HsStateLine; -QString epi_getTxt4HsStateLine(void) { +QString epi_getTxt4HsStateLine(void) +{ return txt4HsStateLine; } -void gpi_setTxt4HsStateLine(QString txtline) { +void gpi_setTxt4HsStateLine(QString txtline) +{ txt4HsStateLine.clear(); if (txtline=="") txt4HsStateLine.clear(); @@ -134,19 +164,26 @@ void gpi_setTxt4HsStateLine(QString txtline) { txt4HsStateLine=txtline; } -void epi_clrTxt4HsStateLine() { +void epi_clrTxt4HsStateLine() +{ txt4HsStateLine.clear(); } + + +//--------------------------------------------------------------------------------------------- + // II) Master receive state (empfangenes Telgramm OK? crc? length? ) // Statuszeile Auswertung der SlaveResponse (serial Frame, CRC usw) (prot.cpp) static QString txt4masterStateLine; -QString epi_getTxt4masterStateLine(void) { +QString epi_getTxt4masterStateLine(void) +{ return txt4masterStateLine; } -void gpi_setTxt4masterStateLine(QString txtline) { +void gpi_setTxt4masterStateLine(QString txtline) +{ txt4masterStateLine.clear(); if (txtline=="") txt4masterStateLine.clear(); @@ -154,10 +191,13 @@ void gpi_setTxt4masterStateLine(QString txtline) { txt4masterStateLine=txtline; } -void epi_clrTxt4masterStateLine() { +void epi_clrTxt4masterStateLine() +{ txt4masterStateLine.clear(); } + + //--------------------------------------------------------------------------------------------- // III Slave receive (from Master) OK? if then show results, if not then show errors @@ -167,11 +207,13 @@ void epi_clrTxt4masterStateLine() { static QString txt4resultStateLine; -QString epi_getTxt4resultStateLine(void) { +QString epi_getTxt4resultStateLine(void) +{ return txt4resultStateLine; } -void gpi_setTxt4resultStateLine(QString txtline) { +void gpi_setTxt4resultStateLine(QString txtline) +{ txt4resultStateLine.clear(); if (txtline=="") txt4resultStateLine.clear(); @@ -179,22 +221,26 @@ void gpi_setTxt4resultStateLine(QString txtline) { txt4resultStateLine=txtline; } -void epi_clrTxt4resultStateLine() { +void epi_clrTxt4resultStateLine() +{ txt4resultStateLine.clear(); } + //--------------------------------------------------------------------------------------------- // IV Statuszeile Empfangsdaten static QString txt4dataLine; -QString epi_getTxt4dataStateLine(void) { +QString epi_getTxt4dataStateLine(void) +{ // GUI: get Text for serial Comport-State Line return txt4dataLine; } -void gpi_setTxt4dataStateLine(QString txtline) { +void gpi_setTxt4dataStateLine(QString txtline) +{ // serial: write Text to be displayed in serial Comport-State line (like "connected") txt4dataLine.clear(); if (txtline=="") @@ -203,7 +249,8 @@ void gpi_setTxt4dataStateLine(QString txtline) { txt4dataLine=txtline; } -void epi_clrTxt4dataStateLine() { +void epi_clrTxt4dataStateLine() +{ txt4dataLine.clear(); } @@ -213,11 +260,16 @@ void epi_clrTxt4dataStateLine() { static QString txt4datifReceive; -QString epi_getTxt4datifLine(void) { +QString epi_getTxt4datifLine(void) +{ + return txt4datifReceive; + } -void gpi_setTxt4datifLine(QString txtline) { +void gpi_setTxt4datifLine(QString txtline) +{ + txt4datifReceive.clear(); if (txtline=="") txt4datifReceive.clear(); @@ -225,7 +277,8 @@ void gpi_setTxt4datifLine(QString txtline) { txt4datifReceive=txtline; } -void epi_clrTxt4datifLine() { +void epi_clrTxt4datifLine() +{ txt4datifReceive.clear(); } @@ -234,11 +287,14 @@ void epi_clrTxt4datifLine() { static QString txt4diagWindow; -QString epi_getTxt4RsDiagWin(void) { +QString epi_getTxt4RsDiagWin(void) +{ return txt4diagWindow; + } -void gpi_setTxt4RsDiagWin(QString txtline) { +void gpi_setTxt4RsDiagWin(QString txtline) +{ txt4diagWindow.clear(); if (txtline=="") txt4diagWindow.clear(); @@ -246,7 +302,8 @@ void gpi_setTxt4RsDiagWin(QString txtline) { txt4diagWindow=txtline; } -void epi_clrTxt4RsDiagWin() { +void epi_clrTxt4RsDiagWin() +{ txt4diagWindow.clear(); } @@ -254,11 +311,14 @@ void epi_clrTxt4RsDiagWin() { static QString sndTxt4diagWindow; -QString epi_get2ndTxt4RsDiagWin(void) { +QString epi_get2ndTxt4RsDiagWin(void) +{ return sndTxt4diagWindow; + } -void gpi_set2ndTxt4RsDiagWin(QString txtline) { +void gpi_set2ndTxt4RsDiagWin(QString txtline) +{ sndTxt4diagWindow.clear(); if (txtline=="") sndTxt4diagWindow.clear(); @@ -266,61 +326,174 @@ void gpi_set2ndTxt4RsDiagWin(QString txtline) { sndTxt4diagWindow=txtline; } -void epi_clr2ndTxt4RsDiagWin() { +void epi_clr2ndTxt4RsDiagWin() +{ sndTxt4diagWindow.clear(); } // /////////////////////////////////////////////////////////////////////////////////// // Memory for Slave responses, common data // /////////////////////////////////////////////////////////////////////////////////// -void gpi_storeResult_serialTestOK(bool wasOk) { - SharedMemBuffer::getData()->Sdata.serialTestResult = wasOk; + + +static bool Sdata_serialTestResult; + +void gpi_storeResult_serialTestOK(bool wasOk) +{ + Sdata_serialTestResult=wasOk; } -bool epi_getResult_serialTestOK() { +bool epi_getResult_serialTestOK() +{ // retval: true: test was successful, got right response - return SharedMemBuffer::getDataConst()->Sdata.serialTestResult; + return Sdata_serialTestResult; } + + // /////////////////////////////////////////////////////////////////////////////////// // Store received data for hwapi // /////////////////////////////////////////////////////////////////////////////////// -void gpi_startNewRequest() { - SharedMemBuffer::getData()->Sdata.pProtResultOk = 0; + + + +static uint8_t Sdata_pProtResultOk; + +void gpi_startNewRequest() +{ + Sdata_pProtResultOk=0; } -void gpi_storeResultOfLastRequest(bool answisok) { - SharedMemBuffer::getData()->Sdata.pProtResultOk = answisok ? 1 : 2; +void gpi_storeResultOfLastRequest(bool answisok) +{ + if (answisok) + Sdata_pProtResultOk=1; + else + Sdata_pProtResultOk=2; } -uint8_t epi_getResultOfLastRequest() { +uint8_t epi_getResultOfLastRequest() +{ // retval: 0: in progress 1: OK 2: error - return SharedMemBuffer::getDataConst()->Sdata.pProtResultOk; + return Sdata_pProtResultOk; } -void gpi_storeRecPayLoad(uint8_t RdDlen, uint8_t const *receivedData) { - SharedMemBuffer::getData()->Sdata.receivedDataLength - = std::min(RdDlen, (uint8_t)(64)); - memset((char *)(&SharedMemBuffer::getData()->Sdata.receivedDataBlock[0]), - 0x00, sizeof(SharedMemBuffer::getData()->Sdata.receivedDataBlock)); - strncpy((char *)(&SharedMemBuffer::getData()->Sdata.receivedDataBlock[0]), - (char const *)receivedData, - sizeof(SharedMemBuffer::getData()->Sdata.receivedDataBlock)-1); + + + +static uint16_t Sdata_receivedDataLength; +static uint8_t Sdata_receivedDataBlock[64]; + +void gpi_storeRecPayLoad(uint8_t RdDlen, uint8_t *receivedData) +{ + Sdata_receivedDataLength=uint16_t(RdDlen); + if (Sdata_receivedDataLength>64) + Sdata_receivedDataLength=64; + tslib_strclr(Sdata_receivedDataBlock,0,64); + tslib_strcpy(receivedData, Sdata_receivedDataBlock, Sdata_receivedDataLength); + } -uint16_t epi_getLastPayLoad(uint16_t plBufSiz, uint8_t *payLoad) { +uint16_t epi_getLastPayLoad(uint16_t plBufSiz, uint8_t *payLoad) +{ // get data back in *pl, max 64 byte // retval = nr of bytes received. If host buffer too small then // only plBufSíz bytes are copied to pl // plBufSíz=size of host buffer - uint16_t ml = std::min(plBufSiz, (uint16_t)(64)); - if (SharedMemBuffer::getDataConst()->Sdata.receivedDataLength < ml) { - ml = SharedMemBuffer::getDataConst()->Sdata.receivedDataLength; - } - strncpy((char *)payLoad, - (char const *)(&SharedMemBuffer::getData()->Sdata.receivedDataBlock[0]), - ml); - - return SharedMemBuffer::getDataConst()->Sdata.receivedDataLength; + uint16_t ml=plBufSiz; + if (ml>64) ml=64; + if (Sdata_receivedDataLengthndbs = NrDataBits; + SharedMemBuffer::write()->pari = parity; + SharedMemBuffer::write()->nsb = NrStopBits; + SharedMemBuffer::write()->br = slaveBaudRate; +} + +void epi_getSlaveSerParams(uint8_t *slaveBaudRate, uint8_t *NrDataBits, + uint8_t *parity, uint8_t *NrStopBits) { + + *NrDataBits = SharedMemBuffer::read()->ndbs; + *parity = SharedMemBuffer::read()->pari; + *NrStopBits = SharedMemBuffer::read()->nsb; + *slaveBaudRate = SharedMemBuffer::read()->br; +} +*/ + +QString epi_getSlaveParamSTR() +{ + QString mySt; + char ctmp; +// uint8_t ndbs; +// uint8_t pari; +// uint8_t nsb; +// uint8_t br; + + mySt.clear(); +// br=SharedMemBuffer::read()->br; +// ndbs=SharedMemBuffer::read()->ndbs; +// pari =SharedMemBuffer::read()->pari; +// nsb=SharedMemBuffer::read()->nsb; + + switch (br) + { + case 1: mySt="1200 ";break; + case 2: mySt="9600 ";break; + case 3: mySt="19200 ";break; + case 4: mySt="38400 ";break; + case 5: mySt="57600 ";break; + case 6: mySt="115200 ";break; + } + + + ctmp=ndbs; + ctmp+=0x30; + mySt.append(ctmp); + ctmp=pari; + mySt.append(ctmp); + ctmp=nsb; + ctmp+=0x30; + mySt.append(ctmp); + //mySt="Hallo"; + return mySt; +} + + + + + + diff --git a/src/datIf.cpp b/src/datIf.cpp index 60e76d3..dfb87f7 100644 --- a/src/datIf.cpp +++ b/src/datIf.cpp @@ -3,13 +3,16 @@ #include "controlBus.h" #include "storeINdata.h" #include +#include +#include + // called from MainWindow() #define DATIF_MAXCMDS 16 static uint8_t dif_dataStep; -static uint8_t dif_scanStep, RDBLKNR; +static uint8_t dif_scanStep; //, RDBLKNR; static uint8_t datif_OutCmdpara1, datif_OutCmdpara2, datif_OutCmdpara3, datif_OutCmdpara4; @@ -19,6 +22,11 @@ static uint8_t cycl_running; T_datif::T_datif(QWidget *parent) : QMainWindow(parent) { + QByteArray myBA; + QDir myDir("../dmd"); + + if (!myDir.exists()) + myDir.mkdir("../dmd"); myDCIF = new T_prot(); @@ -32,7 +40,7 @@ T_datif::T_datif(QWidget *parent) : QMainWindow(parent) datif_trigger = new QTimer(); connect(datif_trigger, SIGNAL(timeout()), this, SLOT(datif_cycleSend())); datif_trigger->setSingleShot(false); - datif_trigger->start(10); // in ms, 80 gut, default 100 50....200 + datif_trigger->start(10); // in ms, // passing Signal through //connect(myDCIF, SIGNAL(framerecieved()), this, SLOT( ResponseRecieved() )); @@ -46,6 +54,30 @@ T_datif::T_datif(QWidget *parent) : QMainWindow(parent) dif_scanStep=0; selectedSlaveAddr=FIX_SLAVE_ADDR; cycl_running=0; + gpi_storeDcDataValid(0); + datif_noResponseCtr=0; + + + // neu, 24.5.23: Alle Daten zusätzlich in Datei speichern +// if (datei_ifFileExists(FILENAME_SHAREDDATA)) +// { +// myBA.clear(); +// myBA=datei_readFromFile(FILENAME_SHAREDDATA); +// } + + // Testfile ereugen: + csv_startCreatingFile(); + csv_addUintToFile(0); + csv_addUintToFile(1); + csv_addUintToFile(2); + csv_addUintToFile(3); + csv_addUintToFile(4); + csv_addUintToFile(5); + myBA=csv_readbackArray(); + datei_clearFile(FILENAME_SHAREDDATA); + datei_writeToFile(FILENAME_SHAREDDATA, myBA); + + } void T_datif::resetChain(void) @@ -65,6 +97,11 @@ char T_datif::datif_cycleSend() uint8_t length, data[66]; bool b_ret; + datif_noResponseCtr++; // inc every 10ms fehlt noch in SysCont + if (datif_noResponseCtr>500) // seit 5s kein Lebenszeichen von DC2 + gpi_storeDcDataValid(0); + + if (cycl_running) { // request is still running, wait for response before next sending @@ -95,7 +132,23 @@ char T_datif::datif_cycleSend() //void myDCIF->sendUserData(uint16_t slaveAdr); - if (check4FDshortCmd()) + if (checkNextFDcmd()==2) + { + b_ret=longFDcmd_get(&nextWrCmd, &nextRdCmd, &blockNum, &length, data); + if (b_ret) + { + myDCIF->setUserWriteData(nextWrCmd, blockNum, length, data); + myDCIF->setUserReadData(nextRdCmd); + myDCIF->sendUserData(selectedSlaveAddr); + //qDebug()<<"Datif send long cmd "<setUserWriteData(nextWrCmd, blockNum, 4, data); myDCIF->setUserReadData(nextRdCmd); myDCIF->sendUserData(selectedSlaveAddr); + //qDebug()<<"Datif send short cmd "<setUserWriteData(nextWrCmd, blockNum, length, data); - myDCIF->setUserReadData(nextRdCmd); - myDCIF->sendUserData(selectedSlaveAddr); - } - } + + + + + + // direct commands have highest prio (setting OUTPUTS) nxtAsCmd=sendWRcmd_getSendCommand0(); // command was stored by Gui @@ -210,7 +262,10 @@ char T_datif::datif_cycleSend() sendINrequestsAutomatic(); // sendCyclicCmd(); // request all cyclic data sequential } else + { dif_scanStep=0; // always start from beginning + gpi_storeDcDataValid(0); // fehlt in SysCont + } } #ifdef USEHANDSHAKES else @@ -221,6 +276,7 @@ char T_datif::datif_cycleSend() } else { //qDebug() << "com port not available"; // wird ununterbrochen ausgegeben + gpi_storeDcDataValid(0); // fehlt in SysCont } return 0; @@ -306,6 +362,7 @@ void T_datif::sendWRcommand(uint16_t nextWrCmd) datif_sendIOrequest(CMD2DC_FAN, CMD2DC_RdBkAllOutputs, 1); break; case SENDDIRCMD_LAERM: +//qDebug()<<"datif switch siren"; datif_sendIOrequest(CMD2DC_SIREN, CMD2DC_RdBkAllOutputs, 1); break; case SENDDIRCMD_REL1: @@ -728,7 +785,7 @@ char T_datif::sendINrequestsAutomatic(void) break; case 12: - if (indat_isPrinterOn()) + //if (indat_isPrinterOn()) datif_sendIOrequest(0, CMD2DC_RdBk_AllPrnData, 0); // 27 // datif_sendIOrequest(0, CMD2DC_RdBk_PrnState, 0); break; @@ -738,7 +795,7 @@ char T_datif::sendINrequestsAutomatic(void) break; case 14: - if (indat_isMifareOn()) + //if (indat_isMifareOn()) { datif_sendIOrequest(0, CMD2DC_RdBk_MifState, 0); // 109 //qDebug()<<"requesting MIF reader state"; @@ -751,6 +808,7 @@ char T_datif::sendINrequestsAutomatic(void) break; case 16: + /* if (indat_isMifareOn()) { datif_OutCmdpara1=0; // data block number 0 contains the Mifare-ID @@ -760,7 +818,8 @@ char T_datif::sendINrequestsAutomatic(void) RDBLKNR=0; datif_OutCmdpara1=RDBLKNR; - } break; + }*/ + break; case 17: //datif_sendIOrequest(0, CMD2DC_GetAllInputs, 0); @@ -768,7 +827,7 @@ char T_datif::sendINrequestsAutomatic(void) break; case 18: - if (indat_isMdbOn()) + //if (indat_isMdbOn()) datif_sendIOrequest(0, CMD2DC_MDB_GET_STATE, 0); // 107 //else // dif_scanStep=24; unsinn @@ -815,7 +874,7 @@ char T_datif::sendINrequestsAutomatic(void) dif_scanStep++; if (dif_scanStep>26) - dif_scanStep=5; + dif_scanStep=0; // dif_scanStep=5; return 0; @@ -838,6 +897,7 @@ char T_datif::isPortOpen(void) void T_datif::StoredRecData() { + datif_noResponseCtr=0; //qDebug() << "StoreRecData called"; // call automatically by T_prot //if (myDCIF->ifDataReceived()) @@ -847,7 +907,10 @@ void T_datif::StoredRecData() // "neu" is the same as "INdataValid" loadRecDataFromFrame(); } - cycl_running=0; + //cycl_running=0; // send next cmd immediately + cycl_running=9; // send next cmd after 10ms + // wichtig! bei 0 werden Telegramme verschluckt! 24.5.2023 + // 9 ergibt 16ms Formel: gap = 110ms (Zeile 80) - cycl_running*10ms } char T_datif::loadRecDataFromFrame() @@ -1021,7 +1084,7 @@ char T_datif::loadRecDataFromFrame() //<< receivedData[3] << " " << receivedData[4] << " " << receivedData[5]; uctmp=receivedData[0]; - // qDebug()<<"datif single bits: "<< (uctmp&1) << (uctmp&2) << (uctmp&4); + //qDebug()<<"datif DOOR bits: "<< (uctmp&1) << (uctmp&2) << (uctmp&4); gpi_storeDI_doorSwitches(uctmp&1, uctmp&2, uctmp&4); gpi_storeDI_vaultSwitches(uctmp&8, uctmp&16); @@ -1050,8 +1113,6 @@ char T_datif::loadRecDataFromFrame() gpi_storeDI_GsmPowerIsOn(uctmp&16); gpi_storeDI_CreditPowerIsOn(uctmp&32); gpi_storeDI_PrinterPowerIsOn(uctmp&64); - - //gpi_storeMdbState(uctmp&4, uctmp&128, uctmp&4); // hat ein eigenes Cmd weiter unten! gpi_storeDI_MdbPowerIsOn(uctmp&128); gpi_storeDI_paperLow(receivedData[5]); @@ -1179,10 +1240,11 @@ char T_datif::loadRecDataFromFrame() case CMD2DC_MDB_GET_STATE: //107 // DB0: mdb_bus_ready (switched on) // DB1: rdBackV12devicePower - // DB2: rdBackV5busPwr + // DB2: rdBackV5busPwr kommt immer mit 1 //qDebug() << "got MDB state " << receivedData[0] << " " << receivedData[1] << " " << receivedData[2]; gpi_storeMdbState(receivedData[0],receivedData[1],receivedData[2]); + break; case CMD2DC_MDB_GETRESP: //22 @@ -1206,6 +1268,15 @@ char T_datif::loadRecDataFromFrame() // DB1: last coin signal (value / scale) // DB2,3: last coin value // DB4: lastError from Emp + + // 0: nr of stored coins + // 1: got 2:type 3:err 4=valL 5=valH + +// qDebug() << "got emp coin "<< " " << receivedData[0] <<" " << receivedData[1] +// << " " << receivedData[2]<< " " << receivedData[3] +// << " " << receivedData[4]<< " " << receivedData[5] +// << " " << receivedData[6]<< " " << receivedData[7]; + gpi_storeEmpCoinSignal(receivedData[0], &receivedData[1]); break; @@ -1361,13 +1432,19 @@ char T_datif::loadRecDataFromFrame() newInsertedAmount=uchar2ulong(receivedData[3],receivedData[2],receivedData[1],receivedData[0]); uitmp=uchar2uint(receivedData[5],receivedData[4]); uit2=uchar2uint(receivedData[7],receivedData[6]); - gpi_storeCurrentPayment(newInsertedAmount, uitmp, uit2); - if (newInsertedAmount != lastInsertedAmount) + if (uitmp>0) // nur 1x bei neuer Münze { - emit datif_gotNewCoin(); - lastInsertedAmount=newInsertedAmount; - } + gpi_storeCurrentPayment(newInsertedAmount, uitmp, uit2); + //void gpi_storeCurrentPayment(uint32_t insertedAmount, uint16_t lastCoinType, uint16_t lastCoinValue) + if (newInsertedAmount != lastInsertedAmount) + { + emit datif_gotNewCoin(); +//qDebug()<<"emit new coin"; + lastInsertedAmount=newInsertedAmount; + } +qDebug()<<" store new coin"<40) + //datif_DCdataValid=1; // das hier sind die wichtigsten Daten, deshalb hierrein! + gpi_storeDcDataValid(1); gpi_storeDynMachineConditions(RdDleng, receivedData); @@ -1577,7 +1657,13 @@ struct T_vaultRecord gpi_storeVaultRecord(readAddress, receivedData ); // always 64byte break; + case 39: + gpi_storeDynData(receivedData); + break; + + } + readSource=0; // 17.05.2023: to avoid multiple recording return 0; } diff --git a/src/datei.cpp b/src/datei.cpp new file mode 100644 index 0000000..1c2e123 --- /dev/null +++ b/src/datei.cpp @@ -0,0 +1,943 @@ +// written by Thomas Sax, Jan.2022 +#include "datei.h" + + +// ------------------------------------------------------------------------------------------------- +// ------------------------------------------------------ create csv file ------------------------------- +// ------------------------------------------------------------------------------------------------- + +QByteArray datei_writeArray, datei_tempArray; + +void csv_startCreatingFile(void) +{ + datei_writeArray.clear(); + datei_tempArray.clear(); +} + +void csv_addTextToFile(QString myText) +{ + datei_writeArray.append(myText.toLatin1()); + datei_writeArray.append(FILESEPERATOR); +} + +void csv_addIntToFile(int myValue) +{ + //qulonglong ullt=12345678901234567890; // max 1,844 x10^19 + datei_tempArray.setNum(myValue,10); // accepted types: short, ushort, int, uint, + // qlonglong, qulonglong, float, double + // numerbase can be 2...36(!),10=dec + + datei_writeArray.append(datei_tempArray); + datei_writeArray.append(FILESEPERATOR); +} + +void csv_addUintToFile(uint myValue) +{ + datei_tempArray.setNum(myValue,10); + datei_writeArray.append(datei_tempArray); + datei_writeArray.append(FILESEPERATOR); +} + + +void csv_addLongvalToFile(qlonglong myValue) +{ + datei_tempArray.setNum(myValue,10); + datei_writeArray.append(datei_tempArray); + datei_writeArray.append(FILESEPERATOR); +} + +void csv_addUlongvalToFile(qulonglong myValue) +{ + datei_tempArray.setNum(myValue,10); + datei_writeArray.append(datei_tempArray); + datei_writeArray.append(FILESEPERATOR); +} + +/* +void csv_addCurrentTimeToFile(void) +{ + uint8_t hour, minute, sec, ui8buf[20]; + char buf[20]; + + config_getSysTime(&hour, &minute, &sec); + GetTimeString(hour, minute, sec, 0, 1, ui8buf); + for (uint8_t nn=0; nn<20; nn++) + buf[nn]=char(ui8buf[nn]); + datei_writeArray.append(buf,8); // time string + datei_writeArray.append(FILESEPERATOR); + +} + +void csv_addCurrentDateToFile(void) +{ + uint16_t year; + uint8_t month, day, ui8buf[20]; + char buf[20]; + + config_getSystemDate(&year, &month, &day); + //qDebug()<<"date year: "<1) + filSize=uint32_t(filLen); + else + return 0; + + // 1) find position of seperators + for (uint32_t ii=0; iiMAXNUMBEROFSEQUENCES) + return ""; + + // 1) find position of seperators + for (ii=0; ii0) + { + start=sepPos[sequNr-1]+1; + ende=sepPos[sequNr]; + } + + //qDebug()<<"datei getOneFileSequence start/ende: "<=ende) + return ""; + //return "-err3-"; + sequence.clear(); + //batmp.clear(); + pp=0; + for (ii=start; ii=int(filSize)) + mm=0; + oneByt=sourceFile.at(mm); + sequence.append(oneByt); + } + return sequence; +} + +int csv_getEntryAsInt(QByteArray sourceFile, uint32_t sequNr) +{ + QByteArray myBA, myVA; + int entry=0; + bool ok; + + myVA.clear(); + myBA = csv_getOneFileSequence(sourceFile, sequNr); + //qDebug()<<"datei getEntryAsInt, sequence: " << myBA; + + entry=myBA.toInt(&ok,16); + if (ok) + { + //qDebug()<<"datei getEntryAsInt, number: " << entry; + return entry; + } + //qDebug()<<"datei getEntryAsInt, error " << myBA; + return 0; +} + +int32_t csv_getEntryAsLong(QByteArray sourceFile, uint32_t sequNr) +{ + QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr); + long entry=0; + bool ok; + + entry=myBA.toLong(&ok,10); + if (ok) + return entry; + return 0; +} + +uint8_t csv_getEntryAsUshort(QByteArray sourceFile, uint32_t sequNr) +{ + QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr); + uint8_t entry=0; + bool ok; + + entry=uint8_t(myBA.toUShort(&ok,10)); + if (ok) + return entry; + return 0; +} + +uint16_t csv_getEntryAsUint(QByteArray sourceFile, uint32_t sequNr) +{ + QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr); + uint16_t entry=0; + bool ok; + + entry=uint16_t(myBA.toUInt(&ok,10)); + if (ok) + return entry; + return 0; +} + +uint32_t csv_getEntryAsUlong(QByteArray sourceFile, uint32_t sequNr) +{ + QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr); + uint32_t entry=0; + bool ok; + + entry=myBA.toULong(&ok,10); + if (ok) + return entry; + return 0; +} + +uint64_t csv_getEntryAs2Ulong(QByteArray sourceFile, uint32_t sequNr) +{ + QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr); + uint64_t entry=0; + bool ok; + + entry=myBA.toULongLong(&ok,10); + if (ok) + return entry; + return 0; +} + + + +QString csv_getEntryAsString(QByteArray sourceFile, uint32_t sequNr) +{ + QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr); + QString entry; + + //qDebug()<<"datei getEntryAsString, sequence: " << myBA; + entry=myBA.toStdString().c_str(); + return entry; +} + +// ------------------------------------------------------------------------------------------------- +// ------------------------------------------------------ create Json file ------------------------------- +// ------------------------------------------------------------------------------------------------- + +/* + example +QString str = "{" + " \"Herausgeber\": \"Xema\"," + " \"Nummer\": \"1234-5678-9012-3456\"," + " \"Deckung\": 2e+6," + " \"Währung\": \"EURO\"," + " \"Inhaber\": {" + " \"Name\": \"Mustermann\"," + " \"Vorname\": \"Max\"," + " \"männlich\": true," + " \"Hobbys\": [ \"Reiten\", \"Golfen\", \"Lesen\" ]," + " \"Alter\": 42," + " \"Kinder\": []," + " \"Partner\": null" + " }" + "}"; + +*/ + +QString myJsonCon; +QString tmpStr; + +void json_startRecord(void) +{ + myJsonCon.clear(); + tmpStr.clear(); + myJsonCon.append('{'); +} + +void json_enterIntToRecord(QString attribute, ulong i_value) +{ + tmpStr.clear(); + myJsonCon.append('"'); + myJsonCon.append(attribute); + myJsonCon.append('"'); + myJsonCon.append(':'); + tmpStr.setNum(i_value); + myJsonCon.append(tmpStr); + myJsonCon.append(','); + myJsonCon.append(NEWLINEINFILE); +} + +void json_enterTextToRecord(QString attribute, QString txt_value) +{ + myJsonCon.append('"'); + myJsonCon.append(attribute); + myJsonCon.append('"'); + myJsonCon.append(':'); + myJsonCon.append('"'); + myJsonCon.append(txt_value); + myJsonCon.append('"'); + myJsonCon.append(','); + myJsonCon.append(NEWLINEINFILE); +} +/* +void json_addCurrentTimeToRecord(QString attribute) +{ + uint8_t hour, minute, sec, ui8buf[20]; + //char buf[20]; + + myJsonCon.append('"'); + myJsonCon.append(attribute); + myJsonCon.append('"'); + myJsonCon.append(':'); + myJsonCon.append('"'); + + datei_getSysTime(&hour, &minute, &sec); + GetTimeString(hour, minute, sec, 0, 1, ui8buf); + for (uint8_t nn=0; nn<8; nn++) + myJsonCon.append(ui8buf[nn]); + + myJsonCon.append('"'); + myJsonCon.append(','); + myJsonCon.append(NEWLINEINFILE); + +} + +void json_addCurrentDateToRecord(QString attribute) +{ + uint16_t year; + uint8_t month, day, ui8buf[20]; + //char buf[20]; + + myJsonCon.append('"'); + myJsonCon.append(attribute); + myJsonCon.append('"'); + myJsonCon.append(':'); + myJsonCon.append('"'); + + datei_getSystemDate(&year, &month, &day); + GetDateString(day, month, 0x20, uint8_t(year%100), 0, 0, ui8buf); + for (uint8_t nn=0; nn<10; nn++) + myJsonCon.append(ui8buf[nn]); + + myJsonCon.append('"'); + myJsonCon.append(','); + myJsonCon.append(NEWLINEINFILE); + +} +*/ + +void json_enterArrayToRecord(QString attribute, uint8_t *buf, ulong nrofVals) +{ + // add array of numbers with "nrofVals" elements + + myJsonCon.append('"'); + myJsonCon.append(attribute); + myJsonCon.append('"'); + myJsonCon.append(':'); + myJsonCon.append('['); // eckig!!! + for (ulong ul=0; ulMAXNROFARRAYVALUES) + nrOfPairs=MAXNROFARRAYVALUES; + + for (ii=0; iiMaxBufferSize) + { + ok=false; // got not all + nrOfPairs=MaxBufferSize; + } + for (int ii=0; ii -#include -#include -#include - -#include #include "tslib.h" #include "hwapi.h" @@ -21,65 +16,71 @@ #include "controlBus.h" #include "storeINdata.h" #include "dcBL.h" -#include "shared_mem_buffer.h" #include -#include - -#include "interfaces.h" +#include <../plugins/interfaces.h> static uint32_t hwapi_lastStartAmount; +static uint8_t hwapi_cash_lastCollectionState; +static uint8_t hwapi_paymentStarted; -static const QMap baudrateMap = { - {"1200" , 0}, {"9600" , 1}, {"19200" , 2}, {"38400" , 3}, - {"57600" , 4}, {"115200" , 5} -}; - -hwapi::hwapi(QObject *parent) : QObject(parent) { - // create or attach shared memory segment - // !!! The compoment creating the shared memory MUST be ATBQT !!! - m_sharedMem = SharedMemBuffer::getShm(sizeof(SharedMemBuffer)); - if (m_sharedMem) { - if (m_sharedMem->isAttached()) { - qInfo() << "Shared memory (" - << sizeof(SharedMemBuffer) << "bytes) created and attached"; - } - } else { - qCritical() << "Creating/attaching shared memory failed"; - } +hwapi::hwapi(QWidget *parent) : QObject(parent) +{ + // constructor + //epi_resetAllDOs(); + //PI_INI(); sendWRcmd_INI(); + myDatif = new T_datif(); connect(myDatif, SIGNAL(datif_templatePrintFinished_OK()), this, SLOT(hwapi_slotPrintFinished_OK())); connect(myDatif, SIGNAL(datif_templatePrintFinished_Err()), this, SLOT(hwapi_slotPrintFinished_Err())); connect(myDatif, SIGNAL(datif_gotNewCoin()), this, SLOT(hwapi_slotGotCoin())); + + hwapi_TimerPayment = new QTimer(); + hwapi_TimerPayment->setSingleShot(true); + + QTimer *hwapi_callPayProc = new QTimer(); + connect(hwapi_callPayProc, SIGNAL(timeout()), this, SLOT(hwapi_slotPayProc())); + hwapi_callPayProc->setSingleShot(false); + hwapi_callPayProc->start(100); // in ms + + hwapi_lastStartAmount=0; + hwapi_cash_lastCollectionState=0; + hwapi_paymentStarted=0; + + //csv_startCreatingFile(FILENAME_SHAREDDATA); + } -hwapi::~hwapi() { - if (m_sharedMem && m_sharedMem->isAttached()) { - m_sharedMem->detach(); - } +void hwapi::hwapi_slotPayProc(void) +{ + cash_paymentProcessing(); } -void hwapi::hwapi_slotPrintFinished_OK(void) { +void hwapi::hwapi_slotPrintFinished_OK(void) +{ emit hwapi_templatePrintFinished_OK(); } -void hwapi::hwapi_slotPrintFinished_Err(void) { +void hwapi::hwapi_slotPrintFinished_Err(void) +{ emit hwapi_templatePrintFinished_Err(); } -void hwapi::hwapi_slotGotCoin(void) { +void hwapi::hwapi_slotGotCoin(void) +{ // new coin was inserted while transaction and new amount reported: emit hwapi_gotNewCoin(); uint32_t newSum=epi_CurrentPaymentGetAmount(); if (newSum>=hwapi_lastStartAmount) - emit hwapi_vendStopByMax(); + emit hwapi_payStopByMax(); } -void hwapi::sub_storeSendingText(QByteArray *buf) const { +void hwapi::sub_storeSendingText(QByteArray *buf) const +{ char local[70], copie[1350]; // 64byte more then max buffer size! int LL, nn, len, maxruns=20; @@ -149,65 +150,26 @@ void hwapi::sub_storeSendingText(QByteArray *buf) const { // start automatic READ requests // ------------------------------------------------------------------------------ -bool hwapi::dc_openSerial(int BaudNr, QString BaudStr, - QString ComName, uint8_t connect) const { +bool hwapi::dc_openSerial(int BaudNr, QString BaudStr, QString ComName, uint8_t connect) const +{ // BaudNr: 0:1200 1:9600 2:19200 3:38400 4:57600 5:115200 // BaudStr: for exapmle "19200" // ComName: for example "COM48" // connect: 0, 1 - //qDebug() << "~~>LIB" << "dc_openSerial called... " ; - +//qDebug() << "~~>LIB" << "dc_openSerial called... " ; epi_setSerial(BaudNr, BaudStr, ComName, connect); - // Actions: open serial port with parameters - for (int i = 0; i < 10; ++i) { - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - if (dc_isPortOpen()) { - return true; - } - } - return false; + return true; } -QStringList hwapi::dc_getStatus() const { - QStringList status; - - if (m_sharedMem) { - SharedMemBuffer const *shMem = SharedMemBuffer::getDataConst(); - status += QString("comport : %1").arg(shMem->rs.comportName); - status += QString("baudrate : %1").arg(shMem->rs.baudNr); - status += QString("baudNr : %1").arg(shMem->rs.baudStr); - status += QString("connect : %1").arg(shMem->rs.connect); - status += QString("port open: %1").arg(shMem->rs.portIsOpen); - // to be continued - } - - return status; -} - -bool hwapi::dc_closeSerial(void) const { +void hwapi::dc_closeSerial(void) const +{ epi_closeSerial(); - for (int i = 0; i < 10; ++i) { - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - if (!dc_isPortOpen()) { - return true; - } - } - return false; } -bool hwapi::dc_isPortOpen(void) const { - if (myDatif) { - T_prot* prot = myDatif->getProt(); - if (prot) { - T_com *com = prot->getSerialPort(); - if (com) { - return com->isPortOpen(); - } - } - } - return false; - //return epi_isSerialPortOpen(); +bool hwapi::dc_isPortOpen(void) const +{ + return epi_isSerialPortOpen(); } void hwapi::dc_autoRequest(bool on) const @@ -219,376 +181,6 @@ void hwapi::dc_autoRequest(bool on) const epi_startEmmision(0); } -/******************************************************************************/ -// -// LEVEL 2: Help-functions for hwapi::dc_updateDC. -// -/******************************************************************************/ -hwapi::DownloadResult hwapi::sendStatus(int ret) const { - switch (ret) { // return values of dc are: - case 0: // 0: no answer by now - return DownloadResult::NOP; // 1: error - case 10: // 10: success - return DownloadResult::OK; - default:; - } - return DownloadResult::ERROR; -} - -hwapi::DownloadResult hwapi::sendNextAddress(int bNum) const { - // sends address only if blockNumber is one of 0, 1024, 2048, 3072, 4096 - int noAnswerCount = 0; - int errorCount = 0; - if ( bNum==0 || bNum==1024 || bNum==2048 || bNum==3072 || bNum==4096 ) { - qDebug() << "addr-block" << bNum << "..."; - while (noAnswerCount <= 250) { - bl_sendAddress(bNum); - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - DownloadResult const res = sendStatus(bl_wasSendingAddOK()); - if (res != DownloadResult::NOP) { - if (res == DownloadResult::ERROR) { - if (++errorCount >= 10) { - qCritical() << "addr-block" << bNum << "...FAILED"; - return res; - } - } else { // res == DownloadResult::OK - qInfo() << "addr-block" << bNum << "...OK"; - return res; - } - } else { - noAnswerCount += 1; // no answer by now - } - } - // wait max. about 3 seconds - return DownloadResult::TIMEOUT; - } - // blockNumber is not one of 0, 1024, 2048, 3072, 4096 -> do nothing - return DownloadResult::NOP; -} - -hwinf::DownloadResult hwapi::sendNextDataBlock(QByteArray const &binary, - int bNum) const { - uint8_t local[66]; - int const bAddr = bNum * 64; - int noAnswerCount = 0; - int errorCount = 0; - - memcpy(local, binary.constData() + bAddr, 64); - local[64] = local[65] = 0x00; - - qDebug() << "data for addr" << bAddr << "..."; - - while (noAnswerCount <= 250) { - bl_sendDataBlock(64, local); - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - DownloadResult const res = sendStatus(bl_wasSendingDataOK()); - if (res != DownloadResult::NOP) { - if (res == DownloadResult::ERROR) { - if (++errorCount >= 10) { - qCritical() << "data for addr" << bAddr << "...FAILED"; - return res; - } - } else { - qInfo() << "data for addr" << bAddr << "...OK"; - return res; - } - } else { - noAnswerCount += 1; // no answer by now - } - } - // wait max. about 3 seconds - return DownloadResult::TIMEOUT; -} - -hwinf::DownloadResult hwapi::dc_downloadBinary(QByteArray const &b) const { - int const nBlocks = (((b.size())%64)==0) ? (b.size()/64) : (b.size()/64)+1; - - qInfo() << "total number of bytes to send to dc" << b.size(); - qInfo() << "total number of blocks to send to dc" << nBlocks; - - int bNum = 0; - DownloadResult res = DownloadResult::OK; - while (res != DownloadResult::ERROR && bNum < nBlocks) { - if ((res = sendNextAddress(bNum)) != DownloadResult::ERROR) { - if ((res = sendNextDataBlock(b, bNum)) != DownloadResult::ERROR) { - bNum += 1; - } - } - } - if (res != DownloadResult::ERROR) { - bl_sendLastBlock(); - } - return res; -} - -bool hwapi::startBootloader() const { - qDebug() << "starting bootloader..."; - int nTry = 5; - while (--nTry >= 0) { - bl_startBL(); - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - if (bl_isUp()) { - qInfo() << "starting bootloader...OK"; - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - return true; - } - } - qCritical() << "starting bootloader...FAILED"; - return false; -} - -bool hwapi::stopBootloader() const { - qDebug() << "stopping bootloader..."; - int nTry = 5; - while (--nTry >= 0) { - bl_stopBL(); - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - if (!bl_isUp()) { - qInfo() << "stopping bootloader...OK"; - return true; - } - } - qCritical() << "stopping bootloader...FAILED"; - return false; -} - -// br is a index into a table, used for historical reasons. -bool hwapi::openSerial(int br, QString baudrate, QString comPort) const { - qDebug() << "opening serial" << br << baudrate << comPort << "..."; - if (dc_openSerial(br, baudrate, comPort, 1)) { // 1 for connect - qInfo() << "opening serial" << br << baudrate << comPort << "...OK"; - return true; - } - qCritical() << "opening serial" << br << baudrate << comPort << "...FAILED"; - return false; -} - -bool hwapi::closeSerial(QString comPort) const { - qDebug() << "closing serial" << comPort << "..."; - if (dc_closeSerial()) { - qInfo() << "closing serial" << comPort << "...OK"; - return true; - } else { - qCritical() << "closing serial" << comPort << "...FAILED"; - } - return false; -} - -bool hwapi::resetDeviceController() const { - qDebug() << "resetting device controller..."; - if (stopBootloader()) { // first stop a (maybe) running bootloader - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - dc_OrderToReset(); - // wait maximally 3 seconds, before starting bootloader - std::this_thread::sleep_for(std::chrono::milliseconds(1500)); - qInfo() << "resetting device controller...OK"; - return true; - } - return false; -} - -QByteArray hwapi::loadBinaryDCFile(QString filename) const { - qDebug() << "loading dc binary" << filename << "..."; - - QFile file(filename); // closed in destructor call - if (!file.exists()) { - qCritical() << file.fileName() << "does not exist"; - return QByteArray(); - } - if (!file.open(QIODevice::ReadOnly)) { - qCritical() << "cannot open file" << file.fileName(); - return QByteArray(); - } - qInfo() << "loading dc binary" << filename << "...OK"; - return file.readAll(); -} - -bool hwapi::downloadBinaryToDC(QString const &bFile) const { - qDebug() << "sending" << bFile << "to dc..."; - QByteArray const dcBinary = loadBinaryDCFile(bFile); - if (dcBinary.size() > 0) { - if (dc_downloadBinary(dcBinary) != DownloadResult::OK) { - qCritical() << "sending" << bFile << "to dc...FAILED"; - return false; - } else { - qInfo() << "sending" << bFile << "to dc...OK"; - } - } else { - qCritical() << "sending" << bFile << "to dc...FAILED"; - qCritical() << "loading binary" << bFile << "FAILED"; - return false; - } - return true; -} - -/******************************************************************************/ -// -// LEVEL 3: hwapi::dc_updateDC. -// -/******************************************************************************/ -bool hwapi::dc_updateDC(QString bFile, QString br, QString serial) const { - if (!baudrateMap.contains(br)) { // sanity check - qCritical() << "passed wrong baudrate" << br; - return false; - } - - qDebug() << "updating dc: " << bFile << br << serial << "..."; - - if (!openSerial(baudrateMap.value(br), br, serial)) { - return false; - } - if (!resetDeviceController()) { - closeSerial(serial); - return false; - } - if (!startBootloader()) { - closeSerial(serial); - return false; - } - if (!downloadBinaryToDC(bFile)) { - stopBootloader(); - closeSerial(serial); - qCritical() << "updating dc: " << bFile << br << serial << "...FAILED"; - return false; - } - - qInfo() << "updating dc: " << bFile << br << serial << "...OK"; - - stopBootloader(); - closeSerial(serial); - return true; -} - -/******************************************************************************/ -// -// LEVEL 3: hwapi::dc_updatePrinterTemplate -// -/******************************************************************************/ -bool hwapi::dc_updatePrinterTemplate(enum FileTypeJson type, - QVector templatesIdx, - QVector fnames, - QString br, - QString serial) const { - // sanity checks - if (!baudrateMap.contains(br)) { - qCritical() << "passed wrong baudrate" << br; - return false; - } - if (templatesIdx.size() != fnames.size()) { - qCritical() << "list sizes must be equal" << br; - return false; - } - if (!std::all_of(templatesIdx.cbegin(), templatesIdx.cend(), - [](int i) { return i >= 1 && i <= 32; })) { - qCritical() << "wrong template indices"; - return false; - } - if (type != FileTypeJson::PRINTER) { - qCritical() << "wrong file type" << (uint8_t)type; - return false; - } - - qDebug() << "updating: " << fnames << br << serial << "..."; - - if (!serial.isNull()) { - if (!openSerial(baudrateMap.value(br), br, serial)) { - return false; - } - } - - int nTry = 50; - while (!sys_ready4sending()) { // wait max. 5 seconds - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - if (--nTry <= 0) { - qCritical() << "sys not ready for sending"; - if (!serial.isNull()) { - closeSerial(serial); - } - return false; - } - } - - bool ret = true; - for (int i = 0; i < fnames.size(); ++i) { - QFile file(fnames[i]); - if (file.exists() && file.open(QIODevice::ReadOnly)) { - QByteArray ba = file.readAll(); - if (ba.size() <= 800) { // max. size is 800 bytes - if (sys_sendJsonFileToDc((uint8_t)(type), - templatesIdx[i], - (uint8_t *)ba.data())) { - std::this_thread::sleep_for(std::chrono::seconds(1)); - qInfo() << "sent file" << fnames[i] << "to dc"; - } - } - } else { - qCritical() << fnames[i] << "!!! does not exist!!!"; - ret = false; - continue; - } - } - if (!serial.isNull()) { - closeSerial(serial); - } - return ret; -} - -bool hwapi::dc_printTemplate(enum FileTypeJson type, - QVector templateIdx, - QString br, - QString serial) const { - // sanity checks - if (!baudrateMap.contains(br)) { - qCritical() << "passed wrong baudrate" << br; - return false; - } - if (!std::all_of(templateIdx.cbegin(), templateIdx.cend(), - [](int i) { return i >= 1 && i <= 32; })) { - qCritical() << "wrong template indices"; - return false; - } - if (type != FileTypeJson::PRINTER) { - qCritical() << "wrong file type" << (uint8_t)type; - return false; - } - - qDebug() << "printing: " << templateIdx << br << serial << "..."; - - if (!serial.isNull()) { - if (!openSerial(baudrateMap.value(br), br, serial)) { - return false; - } - } - - int nTry = 50; - while (!sys_ready4sending()) { // wait max. 5 seconds - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - if (--nTry <= 0) { - qCritical() << "sys not ready for sending"; - if (!serial.isNull()) { - closeSerial(serial); - } - return false; - } - } - - bool ret = true; - for (int i = 0; i < templateIdx.size(); ++i) { - if (prn_printTemplate(templateIdx[i])) { - qDebug() << "printing template" << templateIdx[i]; - std::this_thread::sleep_for(std::chrono::seconds(3)); - } else { - ret = false; - continue; - } - } - if (!serial.isNull()) { - closeSerial(serial); - } - return ret; - -} - // ------------------------------------------------------------------------------ // Level 1, control device-controller (functions of µC) // check serial connection to deviceController @@ -970,6 +562,8 @@ void hwapi::alarm_switchSiren(bool on) const { //return epi_storeDOsToSend(DOBYTE4, LAERM, on); sendWRcmd_setSendCommand4(SENDDIRCMD_LAERM, on, 0, 0, 0); +//qDebug()<<"hwapi switch siren"; + } void hwapi::bar_OpenBarrier(bool open) const @@ -1309,6 +903,7 @@ bool hwapi::mif_isMifarePowerOn(void) const bool hwapi::mdb_testIsmdbTxDon(void) const { return epi_getDI_mdbTxd(); + //return mdb_busVoltageOk(); gleich? } bool hwapi::aux_isAuxPowerOn(void) const @@ -1343,13 +938,17 @@ uint8_t hwapi::prn_PrnFuseIsOk(void) const bool hwapi::mdb_isMdbPowerOn(void) const { - return epi_getDI_mdbPwr(); + //return epi_getDI_mdbPwr(); // all DIs byte 4 bit 7 da ist was verschoben + return mdb_deviceVoltageOK(); // gleich? aus MDB_GET_STATE=107 Byte[1] } bool hwapi::cash_getRejectMotorHomePos(void) const { - return epi_getDI_rejectMotor_homepos(); + // DI=low in Homepos + if (epi_getDI_rejectMotor_homepos()) + return 0; + return 1; } uint8_t hwapi::cash_getLowPaperSensor(void) const @@ -2100,6 +1699,7 @@ uint8_t hwapi::prn_getHwState(struct Tprn_hw_state *prn_hw_state) const bool hwapi::prn_isUpAndReady(void) const { + // 25.5.2023: geht nicht richtig :( bringt immer false obwohl Drucker OK struct Tprn_hw_state prnHwNow; prn_getHwState(&prnHwNow); @@ -2247,14 +1847,14 @@ void hwapi::prn_printQRcode(void) const void hwapi::prn_printLogo(uint8_t nrOfLogo, uint8_t offset ) const { sendWRcmd_setSendCommand4(SENDDIRCMD_PRN_LOGO_FL, nrOfLogo, offset, 0, 0); - pri_TD_addText("Hallo"); + //pri_TD_addText("Hallo"); } // ......................................................... // Parking Ticket (print out) designer // ......................................................... - +/* static QByteArray ticketTemplate; void hwapi::pri_startTicketDesign(void) const @@ -2287,9 +1887,10 @@ bool hwapi::pri_TD_addValue(int val) const ticketTemplate.append(tmpStr); return true; } +*/ -bool hwapi::pri_TD_addCommand(char group, char attribute, char p1, char p2, char p3, char p4, char p5) const -{ +//bool hwapi::pri_TD_addCommand(char group, char attribute, char p1, char p2, char p3, char p4, char p5) const +//{ // always add 8 byte to the ticket layout: ESC & group & attribute & parameter1...5 /* complete list of possible commands: group 50 : paper @@ -2329,7 +1930,7 @@ bool hwapi::pri_TD_addCommand(char group, char attribute, char p1, char p2, char */ - +/* char tmpStr[10]; // command has always fixed length of 8 byte @@ -2408,7 +2009,7 @@ bool hwapi::prn_printDocument(uint8_t documentNumber, struct T_dynDat *dynTicket return true; } - +*/ @@ -2658,8 +2259,10 @@ void hwapi::emp_getNewCoinRecord(uint8_t *valid, uint8_t *signal, uint8_t *error { epi_restoreEmpCoinSignal(valid, signal, error, value); + } + uint8_t hwapi::emp_giveLastCoin(uint16_t *value, uint8_t *signal) const { // retval: 0: NO coin stored 1: valid coin 2: got wrong coin or coin denied @@ -2687,6 +2290,7 @@ uint8_t hwapi::emp_giveLastCoin(uint16_t *value, uint8_t *signal) const return 0; } + uint8_t hwapi::emp_returnLastCoin(uint16_t *value, uint8_t *signal) const { // use this for coin changer @@ -3074,32 +2678,29 @@ void hwapi::bl_rebootDC(void) const sendWRcmd_setSendBlock160(len, buf); } -void hwapi::bl_startBL(void) const { +void hwapi::bl_startBL(void) const +{ uint8_t len, buf[20]; - memset(buf, 0x00, sizeof(buf)); len=dcBL_activatBootloader(buf); sendWRcmd_setSendBlock160(len, buf); } -bool hwapi::bl_checkBL(void) const +void hwapi::bl_checkBL(void) const { uint8_t len, buf[20]; //len=dcBL_readBLversion(buf); len=dcBL_readFWversion(buf); sendWRcmd_setSendBlock160(len, buf); - - return (len > 0); } bool hwapi::bl_isUp(void) const { uint8_t receivedData[160]; - uint8_t LL; - - memset(receivedData, 0x00, sizeof(receivedData)); + uint8_t LL, nn; + for (nn=0; nn<160; nn++) receivedData[nn]=0; LL=epi_getRawRecLength(); if (LL>0) { @@ -3434,7 +3035,7 @@ bool hwapi::sys_ready4sending(void) const // return true if a Json-file can be sent // check free memory - uint8_t frei=check4freeFDlongCmd(); + uint8_t frei=check4freeFDshortCmd(); // Command-Stack sollte 16 Commands fassen, je 64byte Nutzdaten = 1024byte // frei gibt also die Anzahl freier 64byte Bloecke zurueck // das Json-File hat max 800 byte = 13 bloecke @@ -3470,7 +3071,7 @@ bool hwapi::sys_sendJsonFileToDc(uint8_t kindOfFile, uint8_t nrOfTemplate, uint8 dateiLang<<=6; // auf volle 64byte aufgerundet // check free memory - frei=check4freeFDlongCmd(); + frei=check4freeFDshortCmd(); // Command-Stack sollte 16 Commands fassen, je 64byte Nutzdaten = 1024byte // frei gibt also die Anzahl freier 64byte Bloecke zurueck // das Json-File hat max 800 byte = 13 bloecke @@ -3501,18 +3102,19 @@ bool hwapi::sys_sendJsonFileToDc(uint8_t kindOfFile, uint8_t nrOfTemplate, uint8 return true; } +static uint8_t lastSentDynData[64]; + //char prn_dynPrnVal[8][8]; bool hwapi::prn_sendDynamicPrnValues(uint8_t *dynPrnVal ) const -// dynPrnVal = array of 8 Variables with 8 byte each, come as ascii string -// like: char prn_dynPrnVal[8][8]; -// return true if sending, false if cmd-stack is full { + // dynPrnVal = array of 8 Variables with 8 byte each, come as ascii string + // like: char prn_dynPrnVal[8][8]; + // return true if sending, false if cmd-stack is full - uint8_t temp[66]; - - - tslib_strcpy(dynPrnVal, temp, 64); // Vorsicht, kann \0en enthalten - return longFDcmd_set(33,0,0, 64, temp); + //uint8_t temp[66]; + //tslib_strcpy(dynPrnVal, temp, 64); // Vorsicht, kann \0en enthalten + memcpy(lastSentDynData, dynPrnVal, 64); + return longFDcmd_set(33,39,0, 64, lastSentDynData); } @@ -3556,7 +3158,7 @@ bool hwapi::log_selectVaultRecord(uint16_t accountNr ) const sendFDcmd_set(0,38,2, 0,0,0,0); // return VaultRecord block-Nr.2 sendFDcmd_set(0,38,3, 0,0,0,0); // return VaultRecord block-Nr.3 sendFDcmd_set(0,38,4, 0,0,0,0); // return VaultRecord block-Nr.4 - sendFDcmd_set(0,38,5, 0,0,0,0); // return VaultRecord block-Nr.4 + sendFDcmd_set(0,38,5, 0,0,0,0); // return VaultRecord block-Nr.5 // 38: <100 to get long 64byte response return ret; @@ -3618,11 +3220,190 @@ bool hwapi::cash_startPayment(uint32_t amount) const dat2=ulong2uchar(amount, 1); dat3=ulong2uchar(amount, 2); dat4=ulong2uchar(amount, 3); + hwapi_cash_lastCollectionState=0; + sendFDcmd_set(155, 0,0, dat1,dat2,dat3,dat4); - return sendFDcmd_set(155, 0,0, dat1,dat2,dat3,dat4); + hwapi_paymentStarted=1; + hwapi_TimerPayment->start(5000); // in ms + + return true; } + +uint8_t hwapi::cash_paymentProcessing(void) const +{ + // run this function periodically while coin payment process to generate necessary signals: + // virtual void hwapi_coinCollectionJustStarted(void) const=0; + // virtual void hwapi_coinCollectionAborted(void) const=0; + // virtual void hwapi_gotNewCoin(void) const=0; // comes from: hwapi_slotGotCoin() + // virtual void hwapi_payStopByMax(void) const=0; // comes from: hwapi_slotGotCoin() + // virtual void hwapi_payStopByPushbutton(void) const=0; // comes from cash_stopPayment() + // virtual void hwapi_payStopByEscrow(void) const=0; + // virtual void hwapi_payStopByError(void) const=0; + // virtual void hwapi_payStopByTimeout(void) const=0; + // virtual void hwapi_payCancelled(void) const=0; + + // virtual void hwapi_coinProcessJustStopped(void) const=0; + + // return value: + // 0: stopped 1: starting up 2: coin collection + // 3: finished by User (Push button) 4: finished, Max-Value collected + // 5: finished by escrow + // 6: money encashed + // 7: cancelled + // 10,11: error cannot start + // 12: timeout while payment, coins returned + // 13: stopped by unexpected error + + + + struct T_emp empStat; + struct T_dynamicCondition myDynMachCond; + uint8_t collActiv=0, payInProg, empState; + + if (hwapi_paymentStarted<1) + return 0; // off + + collActiv=1; // starting up payment + emp_getAllParameters(&empStat); + //collActiv=empStat.paymentRunning; + + empState=empStat.state; + // 0=start command + // 1=powered, do emp ini, send reset + // 2=delay + // 3=wait for response, requesting status after response + // 4,5 through, startup + // 6: wait for status + // 7: through, startup + // 8: IDLE state. EMP is up and ready, polling is running + // 9: polling on, payment not yet on + // 10: payment, check coins + // 11: through + // 12: wait 1s for last coin + // 90: stop all, 1s delay + // 99: off, all stopped + + sys_getDynMachineConditions(&myDynMachCond); + payInProg= myDynMachCond.paymentInProgress; + // 0: stopped by timeout + // 1: running 2: wait4lastCoin + // 3: payment stopped manually, coins in Escrow + // 4: payment stopped autom, amount collected, coins in Escrow + // 5: payment stopped, escrow full, coins in Escrow + // 6: coins encashed 7:coins returned + // 8: CoinChecker or MDB on Error + + + if (payInProg==8) + { + // coin checker faulty, cannot start + if (hwapi_paymentStarted==1) + { + hwapi_paymentStarted=90; // stop due to error + emit hwapi_coinCollectionAborted(); + //sendFDcmd_set(156, 0,0, 2,0,0,0); // cancel payment + collActiv=10; // error cannot start + } + } else + + if (empState>=10 && empState<=12) + { + // coin acceptance is active now: + hwapi_TimerPayment->stop(); // to avoid error signal + if (hwapi_paymentStarted==1) // 1=wait for coin checker being ready + { + hwapi_paymentStarted=2; // coins can be inserted no + emit hwapi_coinCollectionJustStarted(); + } + } else + { + // EMP not (yet) ready + + if (!hwapi_TimerPayment->isActive()) + { + // 5s after start-payment the coin-checker is still not ready + hwapi_TimerPayment->stop(); + if (hwapi_paymentStarted==1) + { + hwapi_paymentStarted=90; // stop due to error + emit hwapi_coinCollectionAborted(); // error cannot start + //sendFDcmd_set(156, 0,0, 2,0,0,0); // cancel payment + collActiv=11; // error cannot start + } + } + } + + if (hwapi_paymentStarted==2) + { + collActiv=2; // coin collection active + + // coins can be inserted now, wait for end + if (payInProg==0) // timeout + { + hwapi_paymentStarted++; + collActiv=12; // stop by timeout + emit hwapi_payStopByTimeout(); + } else + if (payInProg==3) // user pressed "Next/Continue" + { + hwapi_paymentStarted++; + collActiv=3; + emit hwapi_payStopByPushbutton(); + } else + if (payInProg==4) // max achieved + { + hwapi_paymentStarted++; + collActiv=4; + emit hwapi_payStopByMax(); + } else + if (payInProg==5) // escrow full + { + hwapi_paymentStarted++; + collActiv=5; + emit hwapi_payStopByEscrow(); + } else + if (payInProg==6) // encashed + { + hwapi_paymentStarted++; + collActiv=6; + + } else + if (payInProg==7) // returned, user pressed Cancel button + { + hwapi_paymentStarted++; + collActiv=7; + emit hwapi_payCancelled(); + } else + + if (empState<9 || payInProg==8) + { + hwapi_paymentStarted++; + collActiv=13; // stopped by unexpected error + emit hwapi_payStopByError(); + } + } + + if (empState<8 || empState>12) + epi_clearCurrentPayment(); // to avoid wrong "got-coin" messages + + + if (hwapi_paymentStarted==90 || hwapi_paymentStarted==3 ) + { + // EMP error, wait till process finished + if (empState==99 && (payInProg==0 || payInProg>5) ) + { + // everything stopped, no more coins in escrow + hwapi_paymentStarted=0; + emit hwapi_coinProcessJustStopped(); + } + } + + return collActiv; +} + + uint32_t hwapi::getInsertedAmount(void) const { return epi_CurrentPaymentGetAmount(); @@ -3653,7 +3434,7 @@ bool hwapi::cash_stopPayment(void) const { // DB1: 1=encash 2=cancel & return coins // 3=stop and keep coins in escrow - emit hwapi_vendStopByPushbutton(); + emit hwapi_payStopByPushbutton(); return sendFDcmd_set(156, 0,0, 3,0,0,0); } @@ -3667,6 +3448,7 @@ bool hwapi::vend_success(void) const return sendFDcmd_set(156, 0,0, 1,0,0,0); } + bool hwapi::vend_failed(void) const // conclude payment process and return all inserted coins { @@ -3676,6 +3458,11 @@ bool hwapi::vend_failed(void) const } + + + + + uint8_t hwapi::mif_getCardType(QString *cardholder) const // return 1,2,3,4 = upper, lower access card, printer test, coin test // cardholder: 7byte Name-String @@ -3683,17 +3470,16 @@ uint8_t hwapi::mif_getCardType(QString *cardholder) const uint8_t type, buf[8], nn; char ctmp; - memset(buf, 0x00, sizeof(buf)); - type=epi_mifGetCardType(&buf[0]); //holder[8] = name of card holder // retval Type of MifareCard, 1=upper door, 2=lower door 3=test printer 4=test coins - for (nn=0;nn<8; nn++) { + for (nn=0;nn<8; nn++) + { ctmp=buf[nn]; cardholder[nn]=ctmp; } - return type; + return type; } uint64_t hwapi::sys_getWakeSource(void) const @@ -3702,6 +3488,19 @@ uint64_t hwapi::sys_getWakeSource(void) const return epi_getWakeSources(); } +uint8_t hwapi::sys_getWakeReason(void) const +{ + // Master was woken by following reason: + // 1: MDB Event + // 2: Coin Event + // ( 3: Master Event) - will not set the wake line + // ( 4: 32s pulse) - will not set the wake line + // 5: Door Event + // ( 6: Diag Event) - will not set the wake line + // 7: 30min-Pulse for HB + + return epi_getWakeReason(); +} void hwapi::sys_getDeviceConditions(uint8_t *leng, uint8_t *data) const { @@ -3831,9 +3630,196 @@ uint8_t hwapi::prn_getCurrentPrinterState() const // 2nd way to get dyn.conditions: epi_restoreDynMachineConditions(&leng, buf); - lastPrinterStatus=buf[53]; + lastPrinterStatus=buf[52]; return lastPrinterStatus; } +// 21.4.23TS: change function "sendDeviceSettings()" to use this struct: "struct T_devices" +void hwapi::sys_sendDeviceParameter(struct T_devices *deviceSettings) const +{ + // same as "sendDeviceSettings()" but with much more data + uint8_t buf[64]; + uint16_t LL, nn; + tslib_strclr(buf,0,64); + uint8_t *start; + + // den gesamten struct in einen Puffer kopieren + LL=sizeof(struct T_devices); + start = &deviceSettings->kindOfPrinter; + nn=0; + do + { + buf[nn] = *start; + start++; + } while(++nnkindOfPrinter; + nn=0; + do + { + *start = buf[nn]; + start++; + } while(++nn8) + return false; + return sendFDcmd_set(158, 0,0, nrOfKombi,0,0,0); + +} + +void hwapi::lock_triggerUpperSolenoid(void) const +{ + sendFDcmd_set(159, 0,0, 0,0,0,0); +} + +void hwapi::lock_triggerLowerSolenoid(void) const +{ + sendFDcmd_set(160, 0,0, 0,0,0,0); +} + + + + + + + + + + + + + + diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..4304db1 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,9 @@ +#include +#include "tslib.h" + +int main(int argc, char *argv[]) +{ + QCoreApplication a(argc, argv); + + return a.exec(); +} diff --git a/src/sendWRcmd.cpp b/src/sendWRcmd.cpp index afca5a6..efcf229 100644 --- a/src/sendWRcmd.cpp +++ b/src/sendWRcmd.cpp @@ -14,7 +14,7 @@ void sendWRcmd_INI(void) sendWRcmd_clrCmdStack(); sendWRcmd_clrCmd4Stack(); sendFDcmd_clrStack(); - longFDcmd_clrStack(); + } // Command Stack for commands without parameters @@ -456,18 +456,23 @@ uint8_t gpi_chk4remainingText(void) // --------------------------------------------------------------------------------- // 11.4.23 neu, Kommando direkt an "FastDevice"-protokoll senden, nicht mehr umsetzen // --------------------------------------------------------------------------------- - - -// short command, 4 data bytes +// header static uint8_t nextFDwrCmd[FDCMD_STACKDEPTH]; static uint8_t nextFDrdCmd[FDCMD_STACKDEPTH]; static uint8_t nextFDblkNr[FDCMD_STACKDEPTH]; +static uint8_t nextFDshort[FDCMD_STACKDEPTH]; +// short data static uint8_t nextFDpara1[FDCMD_STACKDEPTH]; static uint8_t nextFDpara2[FDCMD_STACKDEPTH]; static uint8_t nextFDpara3[FDCMD_STACKDEPTH]; static uint8_t nextFDpara4[FDCMD_STACKDEPTH]; +// lon data: +static uint8_t longFDlength[FDCMD_STACKDEPTH]; +static uint8_t longFDpara[FDCMD_STACKDEPTH][64]; + static uint8_t p_nextFDcmdsInQueue; + /* convention: use simple (not rotating) FIFO Stack: Example: nrOfCmdsInQueue=4 then nextAsynchsendCmd0[0]=cmd1 // was stored as first @@ -492,16 +497,21 @@ void sendFDcmd_clrStack(void) nextFDwrCmd[nn]=0; nextFDrdCmd[nn]=0; nextFDblkNr[nn]=0; + nextFDshort[nn]=0; nextFDpara1[nn]=0; nextFDpara2[nn]=0; nextFDpara3[nn]=0; nextFDpara4[nn]=0; + longFDlength[nn]=0; + memset(&longFDpara[nn][0],0,64); } + p_nextFDcmdsInQueue=0; } 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 if (p_nextFDcmdsInQueue>=FDCMD_STACKDEPTH) { @@ -518,13 +528,68 @@ bool sendFDcmd_set(uint8_t nextWrCmd, uint8_t nextRdCmd, uint8_t blockNum, uint8 //qDebug() << "data with 4 data byte saved, pp=" << nrOfCmds4InQueue; //qDebug() << " dat1=" << nextCmd4para1[nrOfCmds4InQueue] << " dat2=" << nextCmd4para2[nrOfCmds4InQueue] // << " dat3=" << nextCmd4para3[nrOfCmds4InQueue] << " dat4=" << nextCmd4para4[nrOfCmds4InQueue]; + nextFDshort[p_nextFDcmdsInQueue]=1; // 1=short + p_nextFDcmdsInQueue++; +/* + int nn; + if (p_nextFDcmdsInQueue==2) + { + qDebug() << "sendFDcmd_set, stack has 2 elements: " << p_nextFDcmdsInQueue; + for (nn=0; nn<16; nn++) + { + qDebug() << "header: " << nextFDwrCmd[nn] << " / " << nextFDrdCmd[nn] << " / "<< nextFDblkNr[nn] << " / " << nextFDshort[nn]; + } + } +*/ +/* + if (p_nextFDcmdsInQueue>15) + { + qDebug() << "sendFDcmd_set, stack is full now: " << p_nextFDcmdsInQueue; + for (nn=0; nn<16; nn++) + { + qDebug() << "header: " << nextFDwrCmd[nn] << " / " << nextFDrdCmd[nn] << " / "<< nextFDblkNr[nn] << " / " << nextFDpara1[nn] << " / " << nextFDpara2[nn] << " / " << nextFDpara3[nn] << " / " << nextFDpara4[nn]; + + qDebug() << " long data: " << nextFDshort[nn] << " / "<< longFDlength[nn] << " / "<< longFDpara[nn][0] << " / "<< longFDpara[nn][1] + << " / "<< longFDpara[nn][2] << " / "<< longFDpara[nn][3] << " / "<< longFDpara[nn][4]; + + } + + } +*/ + + return true; // ok, will be sent +} + + +bool longFDcmd_set(uint8_t nextWrCmd, uint8_t nextRdCmd, uint8_t blockNum, uint8_t length, uint8_t *data) +{ + // write Command to memory, wait for transport + // data buffer size always 64! data[64], padded with 0 + uint8_t nn; + if (p_nextFDcmdsInQueue>=FDCMD_STACKDEPTH) + { + qDebug() << "cannot save cmd because stack is full"; + return false; // not possible + } + nextFDwrCmd[p_nextFDcmdsInQueue]=nextWrCmd; + nextFDrdCmd[p_nextFDcmdsInQueue]=nextRdCmd; + nextFDblkNr[p_nextFDcmdsInQueue]=blockNum; + + longFDlength[p_nextFDcmdsInQueue]=length; + + for (nn=0; nn<64; nn++) + longFDpara[p_nextFDcmdsInQueue][nn]=data[nn]; + + nextFDshort[p_nextFDcmdsInQueue]=2; + p_nextFDcmdsInQueue++; return true; // ok, will be sent } + bool sendFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, uint8_t *dat1, uint8_t *dat2, uint8_t *dat3, uint8_t *dat4) { - uint8_t nn, ll; + uint8_t nn, ll, mm; if (p_nextFDcmdsInQueue==0 || p_nextFDcmdsInQueue>FDCMD_STACKDEPTH) return false; // not possible @@ -536,7 +601,7 @@ bool sendFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, ui *dat2=nextFDpara2[0]; *dat3=nextFDpara3[0]; *dat4=nextFDpara4[0]; - //qDebug() << "cmd4 restored to send from [0]; pp=" << nrOfCmds4InQueue; + //qDebug() << "sendFDcmd_get [0]; pp=" << p_nextFDcmdsInQueue; //qDebug() << " data1: " << nextCmd4para1[0] << " data2: " << nextCmd4para2[0] << // " data3: " << nextCmd4para3[0] << " data4: " << nextCmd4para4[0]; @@ -550,17 +615,74 @@ bool sendFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, ui nextFDwrCmd[nn]=nextFDwrCmd[nn+1]; nextFDrdCmd[nn]=nextFDrdCmd[nn+1]; nextFDblkNr[nn]=nextFDblkNr[nn+1]; + nextFDpara1[nn]=nextFDpara1[nn+1]; nextFDpara2[nn]=nextFDpara2[nn+1]; nextFDpara3[nn]=nextFDpara3[nn+1]; nextFDpara4[nn]=nextFDpara4[nn+1]; + + nextFDshort[nn] = nextFDshort[nn+1]; + + longFDlength[nn] = longFDlength[nn+1]; + + for (mm=0; mm<64; mm++) + longFDpara[nn][mm] = longFDpara[nn+1][mm]; } + if (p_nextFDcmdsInQueue>0) p_nextFDcmdsInQueue--; //qDebug() << "cmd4 after push down: pp=" << nrOfCmds4InQueue; + + // clear released buffer: + for (nn=p_nextFDcmdsInQueue; nn=FDLONG_STACKDEPTH) - { - qDebug() << "cannot save cmd because stack is full"; - return false; // not possible - } - longFDwrCmd[p_longFDcmdsInQueue]=nextWrCmd; - longFDrdCmd[p_longFDcmdsInQueue]=nextRdCmd; - longFDblkNr[p_longFDcmdsInQueue]=blockNum; - longFDlength[p_longFDcmdsInQueue]=length; - for (nn=0; nn<64; nn++) - longFDpara[p_longFDcmdsInQueue][nn]=data[nn]; - - p_longFDcmdsInQueue++; - return true; // ok, will be sent -} - bool longFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, uint8_t *length, uint8_t *data) { uint8_t nn, mm, ll; - - if (p_longFDcmdsInQueue==0 || p_longFDcmdsInQueue>FDLONG_STACKDEPTH) +//p_nextFDcmdsInQueue; nnFDCMD_STACKDEPTH) return false; // not possible - *nextWrCmd= longFDwrCmd[0]; - *nextRdCmd= longFDrdCmd[0]; - *blockNum = longFDblkNr[0]; + *nextWrCmd=nextFDwrCmd[0]; + *nextRdCmd=nextFDrdCmd[0]; + *blockNum=nextFDblkNr[0]; + *length = longFDlength[0]; for (mm=0; mm<64; mm++) data[mm] = longFDpara[0][mm]; // move Puffer down by one element - if (FDLONG_STACKDEPTH>0) - ll=FDLONG_STACKDEPTH-1; + if (FDCMD_STACKDEPTH>0) + ll=FDCMD_STACKDEPTH-1; else ll=0; for (nn=0; nn0) - p_longFDcmdsInQueue--; + if (p_nextFDcmdsInQueue>0) + p_nextFDcmdsInQueue--; + + // clear released buffer: + for (nn=p_nextFDcmdsInQueue; nn we use SystemV shared memory #error "QT_POSIX_IPC defined" #else +#ifdef __linux__ #include // ftok #endif +#endif // std::atomic_bool SharedMemBuffer::__sharedMemLocked{false}; QSharedMemory *SharedMemBuffer::getShm(std::size_t size) { static QSharedMemory shMem; if (size > 0) { +#ifdef __linux__ static const long nativeKey = ftok("/etc/os-release", 'H'); static const QString fkey = std::to_string(nativeKey).c_str(); +#else + static const QString fkey = "0123456?000=9"; +#endif + shMem.setKey(fkey); if (!shMem.isAttached()) { if (shMem.create(size)) { diff --git a/src/storeINdata.cpp b/src/storeINdata.cpp index 63b8a17..19433dc 100644 --- a/src/storeINdata.cpp +++ b/src/storeINdata.cpp @@ -1,115 +1,211 @@ #include -#include - #include #include #include "storeINdata.h" #include "tslib.h" #include "shared_mem_buffer.h" - +#include "datei.h" // gpi: grafical access to PI: access from external devices over device controller FOR GUI // epi: external access from GUI to PI: FOR external devices (DC) + + // store power on/off condition of the devices to control the data request static bool indat_savePrnPwr; -void indat_storePrinterPower(bool isOn) { +void indat_storePrinterPower(bool isOn) +{ indat_savePrnPwr=isOn; + + + } -bool indat_isPrinterOn() { +bool indat_isPrinterOn() +{ return indat_savePrnPwr; } + static bool indat_saveMifPwr; -void indat_storeMifarePower(bool isOn) { +void indat_storeMifarePower(bool isOn) +{ indat_saveMifPwr=isOn; } -bool indat_isMifareOn() { +bool indat_isMifareOn() +{ return indat_saveMifPwr; } + static bool indat_MdbIsOn; -void indat_storeMDBisOn(bool isOn) { +void indat_storeMDBisOn(bool isOn) +{ indat_MdbIsOn=isOn; } -bool indat_isMdbOn() { +bool indat_isMdbOn() +{ return indat_MdbIsOn; } -void gpi_storeSlaveSerParams(uint8_t slaveBaudRate, uint8_t NrDataBits, - uint8_t parity, uint8_t NrStopBits) { - // store numbers - SharedMemBuffer::getData()->ndbs = NrDataBits; - SharedMemBuffer::getData()->pari = parity; - SharedMemBuffer::getData()->nsb = NrStopBits; - SharedMemBuffer::getData()->br = slaveBaudRate; -} -void epi_getSlaveSerParams(uint8_t *slaveBaudRate, uint8_t *NrDataBits, - uint8_t *parity, uint8_t *NrStopBits) { - *NrDataBits = SharedMemBuffer::getDataConst()->ndbs; - *parity = SharedMemBuffer::getDataConst()->pari; - *NrStopBits = SharedMemBuffer::getDataConst()->nsb; - *slaveBaudRate = SharedMemBuffer::getDataConst()->br; -} - -QString epi_getSlaveParamSTR() { - QString mySt; - - switch (SharedMemBuffer::getDataConst()->br) { - case 1: mySt="1200 ";break; - case 2: mySt="9600 ";break; - case 3: mySt="19200 ";break; - case 4: mySt="38400 ";break; - case 5: mySt="57600 ";break; - case 6: mySt="115200 ";break; - } - - char ctmp = SharedMemBuffer::getDataConst()->ndbs; - ctmp += 0x30; - mySt.append(ctmp); - ctmp = SharedMemBuffer::getDataConst()->pari; - mySt.append(ctmp); - ctmp = SharedMemBuffer::getDataConst()->nsb; - ctmp += 0x30; - mySt.append(ctmp); - return mySt; -} - -// static QString genStrings[MAXNROF_GENSTR]; +static QString genStrings[MAXNROF_GENSTR]; // 0=HW 1=SW 2=State -void gpi_storeGenerals(uint8_t genNr, QString text) { +void gpi_storeGenerals(uint8_t genNr, QString text) +{ // 0=HW 1=SW 2=State - if (genNr < MAXNROF_GENSTR) { - strncpy(&SharedMemBuffer::getData()->genStrings[genNr][0], - text.toStdString().c_str(), - sizeof(SharedMemBuffer::getDataConst()->genStrings[0])); + if (genNrgenStrings[2][8] = '\0'; - } - return QString(SharedMemBuffer::getDataConst()->genStrings[genNr]); + genStrings[2].chop(8); + + return genStrings[genNr]; } return " "; } + + + // ------------------------------- +/* +static uint64_t Sdata_slaveUID; +static uint8_t Sdata_UIDstr[8]; +static QString Sdata_DcUidStr; + + +void write2file_UID(void) +{ + QByteArray myBA; + csv_startCreatingFile(); + csv_addUintToFile(Sdata_UIDstr[0]); + csv_addUintToFile(Sdata_UIDstr[1]); + csv_addUintToFile(Sdata_UIDstr[2]); + csv_addUintToFile(Sdata_UIDstr[3]); + csv_addUintToFile(Sdata_UIDstr[4]); + csv_addUintToFile(Sdata_UIDstr[5]); + csv_addUintToFile(Sdata_UIDstr[6]); + csv_addUintToFile(Sdata_UIDstr[7]); + csv_addNewlineToFile(); + csv_addUlongvalToFile(Sdata_slaveUID); + csv_addNewlineToFile(); + csv_addTextToFile(Sdata_DcUidStr); + csv_addNewlineToFile(); + myBA=csv_readbackArray(); + datei_clearFile(FILENAME_SHARED_UID); + datei_writeToFile(FILENAME_SHARED_UID, myBA); + +} + +void gpi_storeUID(uint8_t *buf8byteUid) +{ + uint64_t udltmp=0; + QString myStr; + + //qDebug()<< "store UID "; + + for (int ii=0; ii<8; ii++) + { + //qDebug()<< buf8byteUid[ii] << " "; + + Sdata_UIDstr[ii]=buf8byteUid[ii]; + udltmp|=buf8byteUid[ii]; + udltmp<<=8; + } + Sdata_slaveUID=udltmp; + + Sdata_DcUidStr.clear(); + for (int ii=0;ii<8; ii++) + { + + Sdata_DcUidStr+=QString::number(Sdata_UIDstr[ii],16); + Sdata_DcUidStr+=" "; + } + + write2file_UID(); +} + +void epi_getUIDdec(uint8_t *buf8byteUid) +{ +//qDebug()<< "get UID "; + for (int ii=0; ii<8; ii++) + { + //qDebug()< umformen in hexstring + + QString myStr; + for (int ii=0;ii<8; ii++) + { + + myStr+=QString::number(Sdata_UIDstr[ii],16); + myStr+=" "; + } + return myStr; +} +*/ + +/* read from file: +void epi_getUIDfromFile(uint8_t *buf8byteUid) +{ + QByteArray myBA; + int nn; + + myBA=datei_readFromFile(FILENAME_SHARED_UID); + for (nn=0; nn<8; nn++) + buf8byteUid[nn]=csv_getEntryAsUshort(myBA, nn); + +} + +uint64_t epi_getUIDnumberFromFile(void) +{ + QByteArray myBA; + + myBA=datei_readFromFile(FILENAME_SHARED_UID); + return csv_getEntryAs2Ulong(myBA, 8); + +} + +QString epi_getUIDstrFromFile(void) +{ + QByteArray myBA; + + myBA=datei_readFromFile(FILENAME_SHARED_UID); + return csv_getEntryAsString(myBA, 9); + +} +*/ + +// the same with shared memory : + + void gpi_storeUID(uint8_t const *buf8byteUid) { uint64_t udltmp=0; @@ -139,15 +235,70 @@ QString epi_getUIDstr() { return myStr; } -void gpi_backupSquareMode(uint8_t squMode) { - SharedMemBuffer::getData()->getGlobalTime.squareOutMode = squMode; + + + +// /////////////////////////////////////////////////////////////////////////////////// +// Time and Date +// /////////////////////////////////////////////////////////////////////////////////// + +struct T_globTime +{ + // Reihenfolge nicht vertauschen!!!!! + uint8_t hour; + uint8_t minute; + uint8_t second; + uint8_t Year; + uint8_t Month; + uint8_t DayOfMonth; + uint8_t DayOfWeek; // 1=monday...7 + uint8_t reserve1; + + uint16_t MinutesOfToday; + uint16_t reserve2; + + uint32_t SecondsOfToday; + + uint8_t IsLeapyear; + uint8_t nextLeap; + uint8_t lastLeap; + uint8_t hoursOfWeek; + + uint16_t minOfWeek; + uint16_t hoursOfMonth; + uint16_t minOfMonth; + uint16_t dayOfYear; + uint16_t hoursOfYear; + uint16_t reserve3; + + uint32_t minOfYear; + + uint8_t squareOutMode; + uint8_t free1; + uint16_t reserve4; + uint32_t minOfMillenium; + // bis hierher 44byts + uint32_t free2; + uint32_t free3; + uint32_t free4; + +}; +static T_globTime getGlobalTime; + + +void gpi_backupSquareMode(uint8_t squMode) +{ + getGlobalTime.squareOutMode=squMode; } -uint8_t epi_getSquareMode() { - return SharedMemBuffer::getDataConst()->getGlobalTime.squareOutMode; +uint8_t epi_getSquareMode() +{ + return getGlobalTime.squareOutMode; } -void gpi_backupTime(uint8_t *timeBuffer, uint8_t Leng) { + +void gpi_backupTime(uint8_t *timeBuffer, uint8_t Leng) +{ /* // Daten kommen in gleicher Reihenfolge vom Slave uint8_t *pTime; @@ -159,77 +310,87 @@ void gpi_backupTime(uint8_t *timeBuffer, uint8_t Leng) { }*/ // new, FastProt: 0=dayOfWeek 1=min 2=sec 3=hours 4=year 5=month 6=dayOfMonth - SharedMemBuffer::getData()->getGlobalTime.second = Leng; // nur damit CompilerWarnung weg ist + getGlobalTime.second=Leng; // nur damit CompilerWarnung weg ist + + getGlobalTime.DayOfWeek=timeBuffer[0]; + getGlobalTime.minute=timeBuffer[1]; + getGlobalTime.second=timeBuffer[2]; + getGlobalTime.hour=timeBuffer[3]; + getGlobalTime.Year=timeBuffer[4]; + getGlobalTime.Month=timeBuffer[5]; + getGlobalTime.DayOfMonth=timeBuffer[6]; + - SharedMemBuffer::getData()->getGlobalTime.DayOfWeek = timeBuffer[0]; - SharedMemBuffer::getData()->getGlobalTime.minute = timeBuffer[1]; - SharedMemBuffer::getData()->getGlobalTime.second = timeBuffer[2]; - SharedMemBuffer::getData()->getGlobalTime.hour = timeBuffer[3]; - SharedMemBuffer::getData()->getGlobalTime.Year = timeBuffer[4]; - SharedMemBuffer::getData()->getGlobalTime.Month = timeBuffer[5]; - SharedMemBuffer::getData()->getGlobalTime.DayOfMonth = timeBuffer[6]; } -void epi_getTime(uint8_t *hh, uint8_t *mm, uint8_t *ss) { - *hh = SharedMemBuffer::getDataConst()->getGlobalTime.hour; - *mm = SharedMemBuffer::getDataConst()->getGlobalTime.minute; - *ss = SharedMemBuffer::getDataConst()->getGlobalTime.second; +void epi_getTime(uint8_t *hh, uint8_t *mm, uint8_t *ss) +{ + *hh=getGlobalTime.hour; + *mm=getGlobalTime.minute; + *ss=getGlobalTime.second; } -void epi_getDate(uint8_t *yy, uint8_t *mm, uint8_t *dd) { - *yy = SharedMemBuffer::getDataConst()->getGlobalTime.Year; - *mm = SharedMemBuffer::getDataConst()->getGlobalTime.Month; - *dd = SharedMemBuffer::getDataConst()->getGlobalTime.DayOfMonth; +void epi_getDate(uint8_t *yy, uint8_t *mm, uint8_t *dd) +{ + *yy=getGlobalTime.Year; + *mm=getGlobalTime.Month; + *dd=getGlobalTime.DayOfMonth; } -void epi_getToday(uint8_t *dow, uint16_t *minOfToday, uint32_t *secOfToday) { - *dow = SharedMemBuffer::getDataConst()->getGlobalTime.DayOfWeek; - *minOfToday = SharedMemBuffer::getDataConst()->getGlobalTime.MinutesOfToday; - *secOfToday = SharedMemBuffer::getDataConst()->getGlobalTime.SecondsOfToday; +void epi_getToday(uint8_t *dow, uint16_t *minOfToday, uint32_t *secOfToday) +{ + *dow=getGlobalTime.DayOfWeek; + *minOfToday=getGlobalTime.MinutesOfToday; + *secOfToday=getGlobalTime.SecondsOfToday; } -bool epi_isLeapYear(uint8_t *lastLeapYear, uint8_t *NextLeapYear) { - *lastLeapYear = SharedMemBuffer::getDataConst()->getGlobalTime.lastLeap; - *NextLeapYear = SharedMemBuffer::getDataConst()->getGlobalTime.nextLeap; - return SharedMemBuffer::getDataConst()->getGlobalTime.IsLeapyear; +bool epi_isLeapYear(uint8_t *lastLeapYear, uint8_t *NextLeapYear) +{ + *lastLeapYear=getGlobalTime.lastLeap; + *NextLeapYear=getGlobalTime.nextLeap; + if (getGlobalTime.IsLeapyear) + return true; + return false; } -bool epi_isLeapYear() { - return SharedMemBuffer::getDataConst()->getGlobalTime.IsLeapyear; +bool epi_isLeapYear() +{ + if (getGlobalTime.IsLeapyear) + return true; + return false; } -void epi_getSpecialWeekTimeDate(uint8_t *DayOfWeek, - uint8_t *HoursOfWeek, - uint16_t *MinutesOfWeek) { - *DayOfWeek = SharedMemBuffer::getDataConst()->getGlobalTime.DayOfWeek; - *HoursOfWeek = SharedMemBuffer::getDataConst()->getGlobalTime.hoursOfWeek; - *MinutesOfWeek = SharedMemBuffer::getDataConst()->getGlobalTime.minOfWeek; +void epi_getSpecialWeekTimeDate(uint8_t *DayOfWeek, uint8_t *HoursOfWeek, uint16_t *MinutesOfWeek) +{ + *DayOfWeek=getGlobalTime.DayOfWeek; + *HoursOfWeek=getGlobalTime.hoursOfWeek; + *MinutesOfWeek=getGlobalTime.minOfWeek; } -void epi_getSpecialMonthTimeDate(uint8_t *DayOfMonth, - uint16_t *HoursOfMonth, - uint16_t *MinutesOfMonth) { - *DayOfMonth = SharedMemBuffer::getDataConst()->getGlobalTime.DayOfMonth; - *HoursOfMonth = SharedMemBuffer::getDataConst()->getGlobalTime.hoursOfMonth; - *MinutesOfMonth = SharedMemBuffer::getDataConst()->getGlobalTime.minOfMonth; +void epi_getSpecialMonthTimeDate(uint8_t *DayOfMonth, uint16_t *HoursOfMonth, uint16_t *MinutesOfMonth) +{ + *DayOfMonth=getGlobalTime.DayOfMonth; + *HoursOfMonth=getGlobalTime.hoursOfMonth; + *MinutesOfMonth=getGlobalTime.minOfMonth; } -void epi_getSpecialYearTimeDate(uint16_t *DayOfYear, - uint16_t *HoursOfYear, - uint32_t *MinutesOfYear) { - *DayOfYear = SharedMemBuffer::getDataConst()->getGlobalTime.dayOfYear; - *HoursOfYear = SharedMemBuffer::getDataConst()->getGlobalTime.hoursOfYear; - *MinutesOfYear = SharedMemBuffer::getDataConst()->getGlobalTime.minOfYear; +void epi_getSpecialYearTimeDate(uint16_t *DayOfYear, uint16_t *HoursOfYear, uint32_t *MinutesOfYear) +{ + *DayOfYear=getGlobalTime.dayOfYear; + *HoursOfYear=getGlobalTime.hoursOfYear; + *MinutesOfYear=getGlobalTime.minOfYear; } -QString epi_getRtcTimeStr(uint8_t timeStyle) { +QString epi_getRtcTimeStr(uint8_t timeStyle) +{ // style: 0: hh:mm 1: hh:mm:ss QString mystr=nullptr, tempStr=nullptr; - tempStr.setNum(SharedMemBuffer::getDataConst()->getGlobalTime.hour, 10); + tempStr.setNum(getGlobalTime.hour,10); mystr=tempStr.rightJustified(2,'0',false); // macht feste Länge, 5->05 mystr.append(':'); - tempStr.setNum(SharedMemBuffer::getDataConst()->getGlobalTime.minute, 10); + //tempStr.clear(); + tempStr.setNum(getGlobalTime.minute,10); // mit 16 statt 10 wirds in HEX angezeigt //mystr.append(tempStr); mystr+=tempStr.rightJustified(2,'0',false); //mystr.append(':'); // so @@ -238,25 +399,27 @@ QString epi_getRtcTimeStr(uint8_t timeStyle) { if (timeStyle==1) // hh:mm:ss { mystr.append(':'); - tempStr.setNum(SharedMemBuffer::getDataConst()->getGlobalTime.second, 10); + tempStr.setNum(getGlobalTime.second,10); mystr.append(tempStr.rightJustified(2,'0',false)); // wie += } return mystr; } -QString epi_getRtcDateStr(uint8_t dateStyle) { + +QString epi_getRtcDateStr(uint8_t dateStyle) +{ // 1=german dd.mm.yy 2=american yy/mm/dd 3=mm.dd.yy QString tmpStr=nullptr, YYstr=nullptr, MMstr=nullptr, DDstr=nullptr, mystr=nullptr; mystr.clear(); - tmpStr.setNum(SharedMemBuffer::getDataConst()->getGlobalTime.Year, 10); + tmpStr.setNum(getGlobalTime.Year,10); // itoa decimal YYstr=tmpStr.rightJustified(4,'0',false); // immer vierstellig YYstr[0]='2'; // 2000 dazu - tmpStr.setNum(SharedMemBuffer::getDataConst()->getGlobalTime.Month, 10); + tmpStr.setNum(getGlobalTime.Month,10); MMstr=tmpStr.rightJustified(2,'0',false); - tmpStr.setNum(SharedMemBuffer::getDataConst()->getGlobalTime.DayOfMonth, 10); + tmpStr.setNum(getGlobalTime.DayOfMonth,10); DDstr=tmpStr.rightJustified(2,'0',false); if (dateStyle==1) // Germany dd.mm.yy @@ -275,32 +438,37 @@ QString epi_getRtcDateStr(uint8_t dateStyle) { } -QString epi_getSlaveTimeDateStr() { +QString epi_getSlaveTimeDateStr() +{ QString myStr; myStr=epi_getRtcTimeStr(1) + " " + epi_getRtcDateStr(1); return myStr; } + // /////////////////////////////////////////////////////////////////////////////////// // analog values // /////////////////////////////////////////////////////////////////////////////////// -uint8_t gpi_getMaxNrAIs() { +static uint16_t AI_val[MAXNROF_AI]; + +uint8_t gpi_getMaxNrAIs() +{ return MAXNROF_AI; } -void gpi_storeAIs(uint8_t aiNr, uint16_t val) { - if (aiNr < MAXNROF_AI) { - SharedMemBuffer::getData()->AI_val[aiNr] = val; - } +void gpi_storeAIs(uint8_t aiNr, uint16_t val) +{ + if (aiNrAI_val[aiNr]; - } +uint16_t epi_loadAIs(uint8_t aiNr) +{ + if (aiNrSdata.measurement[ValueNr]; - } + if (ValueNrSdata.measurement[ValueNr] = val; - } + if (ValueNrdin.doorSwitch = 0; - if (upperDoor) SharedMemBuffer::getData()->din.doorSwitch |= 1; - if (lowerDoor) SharedMemBuffer::getData()->din.doorSwitch |= 2; - if (vaultDoor) SharedMemBuffer::getData()->din.doorSwitch |= 4; +static uint8_t di_doorSwitch; +void gpi_storeDI_doorSwitches(uint8_t upperDoor, uint8_t lowerDoor, uint8_t vaultDoor) +{ + + di_doorSwitch=0; + if (upperDoor) di_doorSwitch |=1; + if (lowerDoor) di_doorSwitch |=2; + if (vaultDoor) di_doorSwitch |=4; + +// qDebug()<<"storeINdata: "<din.doorSwitch; + return di_doorSwitch; } -void gpi_storeDI_vaultSwitches(uint8_t CashBoxIn, uint8_t BillBoxIn) { - SharedMemBuffer::getData()->din.vaultSwitch = 0; - if (CashBoxIn) SharedMemBuffer::getData()->din.vaultSwitch |= 1; - if (BillBoxIn) SharedMemBuffer::getData()->din.vaultSwitch |= 2; +static uint8_t di_vaultSwitch; +void gpi_storeDI_vaultSwitches(uint8_t CashBoxIn, uint8_t BillBoxIn) +{ + di_vaultSwitch=0; + if (CashBoxIn) di_vaultSwitch |=1; + if (BillBoxIn) di_vaultSwitch |=2; } -uint8_t epi_getDI_vaultSwitches(void) { +uint8_t epi_getDI_vaultSwitches(void) +{ // bit0: cash box 1: bill box in - return SharedMemBuffer::getData()->din.vaultSwitch; + return di_vaultSwitch; } -void gpi_storeDI_lockSwitches(uint8_t indatUL, uint8_t indatLL) { +static uint8_t di_lockSwitch; +void gpi_storeDI_lockSwitches(uint8_t indatUL, uint8_t indatLL) +{ // D5: bit 0: upper lockbar up bit1:down // D6: bit 0: lower lockbar up bit1:down - SharedMemBuffer::getData()->din.lockSwitch = 0; - if (indatUL & 1) SharedMemBuffer::getData()->din.lockSwitch |= 1; - if (indatUL & 2) SharedMemBuffer::getData()->din.lockSwitch |= 2; - if (indatLL & 1) SharedMemBuffer::getData()->din.lockSwitch |= 4; - if (indatLL & 2) SharedMemBuffer::getData()->din.lockSwitch |= 8; + di_lockSwitch=0; + if (indatUL & 1) di_lockSwitch |=1; + if (indatUL & 2) di_lockSwitch |=2; + if (indatLL & 1) di_lockSwitch |=4; + if (indatLL & 2) di_lockSwitch |=8; } -uint8_t epi_getDI_lockSwitches(void) { +uint8_t epi_getDI_lockSwitches(void) +{ // retval: bit 0: upper lockbar up bit1: upper lockbar is down // bit 2: lower lockbar up bit1: lower lockbar is down - return SharedMemBuffer::getData()->din.lockSwitch; + + return di_lockSwitch; } -void gpi_storeDI_optos(uint8_t indatOpto) { +static uint8_t di_opto; +void gpi_storeDI_optos(uint8_t indatOpto) +{ // OptoIn bit 0,1: optoin 1,2 - SharedMemBuffer::getData()->din.opto = 0; - if (indatOpto & 1) SharedMemBuffer::getData()->din.opto |= 1; - if (indatOpto & 2) SharedMemBuffer::getData()->din.opto |= 2; + di_opto=0; + if (indatOpto & 1) di_opto |=1; + if (indatOpto & 2) di_opto |=2; + } -uint8_t epi_getDI_optos(void) { +uint8_t epi_getDI_optos(void) +{ // bit0: opto in 1 1: opto in 2 - return SharedMemBuffer::getDataConst()->din.opto; + return di_opto; } -uint8_t gpi_storeDI_auxIn(uint8_t aux) { // Aux0...5 - return SharedMemBuffer::getData()->din.aux = aux; + +static uint8_t di_aux; +void gpi_storeDI_auxIn(uint8_t indatAuxIn) +{ + // Aux0...5 + di_aux=indatAuxIn; } -uint8_t epi_getDI_auxIn(void) { // bit0: auxin 1 ... 5: auxin 6 - return SharedMemBuffer::getDataConst()->din.aux; +uint8_t epi_getDI_auxIn(void) +{ + // bit0: auxin 1 ... 5: auxin 6 + return di_aux; } -bool gpi_storeDI_ptuWake(bool w) { - return SharedMemBuffer::getData()->din.wakeFromPtu = w; + +static bool di_wakeFromPtu; +void gpi_storeDI_ptuWake(uint8_t indat) +{ + if (indat) + di_wakeFromPtu=true; + else + di_wakeFromPtu=false; } -bool epi_getDI_ptuWake(void) { - return SharedMemBuffer::getDataConst()->din.wakeFromPtu; +bool epi_getDI_ptuWake(void) +{ + return di_wakeFromPtu; } -bool gpi_storeDI_mbdWake(bool w) { - return SharedMemBuffer::getData()->din.wakeFromMdb = w; + +static bool di_wakeFromMdb; +void gpi_storeDI_mbdWake(uint8_t indat) +{ + if (indat) + di_wakeFromMdb=true; + else + di_wakeFromMdb=false; } -bool epi_getDI_mdbWake(void) { - return SharedMemBuffer::getDataConst()->din.wakeFromMdb; +bool epi_getDI_mdbWake(void) +{ + return di_wakeFromMdb; } -bool gpi_storeDI_prnReady(bool ready) { - return SharedMemBuffer::getData()->din.PrnReady = ready; + +static bool di_PrnReady; +void gpi_storeDI_prnReady(uint8_t indat) +{ + if (indat) + di_PrnReady=true; + else + di_PrnReady=false; } -bool epi_getDI_prnReady(void) { - return SharedMemBuffer::getDataConst()->din.PrnReady; +bool epi_getDI_prnReady(void) +{ + return di_PrnReady; } -bool gpi_storeDI_CoinAttach(bool attach) { - return SharedMemBuffer::getData()->din.CoinAttach = attach; + +static bool di_CoinAttach; +void gpi_storeDI_CoinAttach(uint8_t indat) +{ + if (indat) + di_CoinAttach=true; + else + di_CoinAttach=false; } -bool epi_getDI_CoinAttach(void) { - return SharedMemBuffer::getDataConst()->din.CoinAttach; +bool epi_getDI_CoinAttach(void) +{ + return di_CoinAttach; } -bool gpi_storeDI_CoinEscrow(bool ce) { - return SharedMemBuffer::getData()->din.CoinEscrowOpen = ce; +static bool di_CoinEscrowOpen; +void gpi_storeDI_CoinEscrow(uint8_t indat) +{ + if (indat) + di_CoinEscrowOpen=true; + else + di_CoinEscrowOpen=false; } -bool epi_getDI_CoinEscrow(void) { - return SharedMemBuffer::getDataConst()->din.CoinEscrowOpen; +bool epi_getDI_CoinEscrow(void) +{ + return di_CoinEscrowOpen; } -bool gpi_storeDI_mifareCardTapped(bool tapped) { - return SharedMemBuffer::getData()->din.mifCardTap = tapped; + +static bool di_mifCardTap; +void gpi_storeDI_mifareCardTapped(uint8_t indat) +{ + if (indat) + di_mifCardTap=true; + else + di_mifCardTap=false; } -bool epi_getDI_mifareCardTapped(void) { - return SharedMemBuffer::getDataConst()->din.mifCardTap; +bool epi_getDI_mifareCardTapped(void) +{ + return di_mifCardTap; } -bool gpi_storeDI_modemWake(bool w) { - return SharedMemBuffer::getData()->din.wakeFromModem = w; + +static bool di_wakeFromModem; +void gpi_storeDI_modemWake(uint8_t indat) +{ + if (indat) + di_wakeFromModem=true; + else + di_wakeFromModem=false; } -bool epi_getDI_modemWake(void) { - return SharedMemBuffer::getDataConst()->din.mifCardTap; +bool epi_getDI_modemWake(void) +{ + return di_wakeFromModem; } -bool gpi_storeDI_contactPowerIsOn(bool on) { - return SharedMemBuffer::getData()->din.contactPwrOn = on; + + +static bool di_contactPwrOn; + +void gpi_storeDI_contactPowerIsOn(bool di_contact_PwrOn) +{ + di_contactPwrOn=di_contact_PwrOn; } -bool epi_getDI_contactPwr(void) { // invertiert! - return !SharedMemBuffer::getDataConst()->din.contactPwrOn; +bool epi_getDI_contactPwr(void) +{ + // invertiert! + if (di_contactPwrOn) + return false; + return true; } -bool gpi_storeDI_MifarePowerIsOn(bool on) { - return SharedMemBuffer::getData()->din.mifarePwrOn = on; +static bool di_mifarePwrOn; + +void gpi_storeDI_MifarePowerIsOn(bool di_mifare_PwrOn) +{ + di_mifarePwrOn=di_mifare_PwrOn; } -bool epi_getDI_mifarePwr(void) { - return SharedMemBuffer::getDataConst()->din.mifarePwrOn; +bool epi_getDI_mifarePwr(void) +{ + return di_mifarePwrOn; } -bool gpi_storeDI_readbackMdbTxD(bool rdbkMdbTxd) { - return SharedMemBuffer::getData()->din.rdbk_mdbTxd = rdbkMdbTxd; +static bool di_rdbk_mdbTxd; + +void gpi_storeDI_readbackMdbTxD(bool di_rdbkMdbTxd) +{ + di_rdbk_mdbTxd=di_rdbkMdbTxd; } -bool epi_getDI_mdbTxd(void) { - return SharedMemBuffer::getDataConst()->din.rdbk_mdbTxd; +bool epi_getDI_mdbTxd(void) +{ + return di_rdbk_mdbTxd; } -bool gpi_storeDI_AuxPowerIsOn(bool on) { - return SharedMemBuffer::getData()->din.AuxPwrOn = on; +static bool di_AuxPwrOn; + +void gpi_storeDI_AuxPowerIsOn(bool di_Aux_PwrOn) +{ + di_AuxPwrOn=di_Aux_PwrOn; } -bool epi_getDI_auxPwr(void) { - return SharedMemBuffer::getDataConst()->din.AuxPwrOn; +bool epi_getDI_auxPwr(void) +{ + return di_AuxPwrOn; } -bool gpi_storeDI_GsmPowerIsOn(bool on) { - return SharedMemBuffer::getData()->din.gsmPwrOn = on; +static bool di_gsmPwrOn; + +void gpi_storeDI_GsmPowerIsOn(bool di_gsm_PwrOn) +{ + di_gsmPwrOn=di_gsm_PwrOn; } -bool epi_getDI_gsmPwr(void) { - return SharedMemBuffer::getDataConst()->din.gsmPwrOn; +bool epi_getDI_gsmPwr(void) +{ + return di_gsmPwrOn; } -bool gpi_storeDI_CreditPowerIsOn(bool on) { +static bool di_creditPwrOn; + +void gpi_storeDI_CreditPowerIsOn(bool di_credit_PwrOn) +{ // invertieren!!! - return SharedMemBuffer::getData()->din.creditPwrOn = !on; + if (di_credit_PwrOn) + di_creditPwrOn=0; + else + di_creditPwrOn=1; } -bool epi_getDI_creditPwr(void) { - return SharedMemBuffer::getDataConst()->din.creditPwrOn; +bool epi_getDI_creditPwr(void) +{ + return di_creditPwrOn; } -bool gpi_storeDI_PrinterPowerIsOn(bool on) { - return SharedMemBuffer::getData()->din.printerPwrOn = on; +static bool di_printerPwrOn; + +void gpi_storeDI_PrinterPowerIsOn(bool di_printer_PwrOn) +{ + di_printerPwrOn=di_printer_PwrOn; } -bool epi_getDI_printerPwr(void) { - return SharedMemBuffer::getDataConst()->din.printerPwrOn; +bool epi_getDI_printerPwr(void) +{ + return di_printerPwrOn; } -bool gpi_storeDI_MdbPowerIsOn(bool on) { - return SharedMemBuffer::getData()->din.mdbPwrOn = on; +static bool di_mdbPwrOn; + +void gpi_storeDI_MdbPowerIsOn(bool di_mdb_PwrOn) +{ + di_mdbPwrOn=di_mdb_PwrOn; } -bool epi_getDI_mdbPwr(void) { - return SharedMemBuffer::getDataConst()->din.mdbPwrOn; +bool epi_getDI_mdbPwr(void) +{ + return di_mdbPwrOn; } -bool gpi_storeDI_rejMot_home(bool reject) { - return SharedMemBuffer::getData()->din.rejMot_home = reject; +static bool di_rejMot_home; + +void gpi_storeDI_rejMot_home(bool di) +{ + di_rejMot_home=di; } -bool epi_getDI_rejectMotor_homepos(void) { - return SharedMemBuffer::getDataConst()->din.rejMot_home; +bool epi_getDI_rejectMotor_homepos(void) +{ + return di_rejMot_home; } -uint8_t gpi_storeDI_paperLow(uint8_t sensor) { +static uint8_t di_npe_sensor; + +void gpi_storeDI_paperLow(uint8_t di) +{ // 0: Sensor sees paper 1: no paper 99: off - return SharedMemBuffer::getData()->din.npe_sensor = sensor; + di_npe_sensor=di; } -uint8_t epi_getDI_npe_sensor(void) { - return SharedMemBuffer::getDataConst()->din.npe_sensor; +uint8_t epi_getDI_npe_sensor(void) +{ + return di_npe_sensor; } @@ -728,166 +1021,265 @@ D12: Coin shutter output D13: CoinEscrow Outputs */ -uint8_t gpi_storeDO_mdbRxTst(uint8_t mdbRxTst) { - return SharedMemBuffer::getData()->dout.mbdRxTst = mdbRxTst; +static uint8_t do_mbdRxTst; +void gpi_storeDO_mdbRxTst(uint8_t mdbRxTst) +{ + do_mbdRxTst=mdbRxTst; } -bool epi_getDO_mdbRxTestOut(void) { - return SharedMemBuffer::getData()->dout.mbdRxTst & 1; +bool epi_getDO_mdbRxTestOut(void) +{ + if (do_mbdRxTst & 1) + return true; + return false; } -uint8_t gpi_storeDO_motorOutputs(uint8_t motorBits) { +static uint8_t do_motorBits; +void gpi_storeDO_motorOutputs(uint8_t Pwr) +{ //D1: motor outputs bit0: upper lock forw bit 1 backw // Bit2: lowLock forw bit3: LL backw - return SharedMemBuffer::getData()->dout.motorBits = motorBits; + do_motorBits=Pwr; } -uint8_t epi_getDO_motorOuts(void) { +uint8_t epi_getDO_motorOuts(void) +{ // bit0: upper lock forward bit 1 backward // bit2: lower lock forward bit 3 backward - return SharedMemBuffer::getDataConst()->dout.motorBits; + return do_motorBits; } -uint8_t gpi_storeDO_serialSwitch(uint8_t serialSwitch) { // serial drv on/off, Serial mux1, Serial mux2 - return SharedMemBuffer::getData()->dout.serialSwitch = serialSwitch; + + +static uint8_t do_serialSwitch; // serial drv on/off, Serial mux1, Serial mux2 +void gpi_storeDO_serialSwitch(uint8_t state) // serial drv on/off, Serial mux1, Serial mux2 +{ + do_serialSwitch=state; } -uint8_t epi_getDO_serialSwitch(void) { +uint8_t epi_getDO_serialSwitch(void) +{ // serial drv on/off, Serial mux1, Serial mux2 - return SharedMemBuffer::getDataConst()->dout.serialSwitch; + return do_serialSwitch; } -bool epi_getDO_serialDriverIsOn(void) { - return SharedMemBuffer::getDataConst()->dout.serialSwitch & 1; +bool epi_getDO_serialDriverIsOn(void) +{ + + if ( do_serialSwitch & 1) + return true; + return false; } -bool epi_getDO_serialMux1isSetToPrinter(void) { +bool epi_getDO_serialMux1isSetToPrinter(void) +{ // mux1 off: serial is switched to printer - return (SharedMemBuffer::getDataConst()->dout.serialSwitch & 2) == 0; + if ((do_serialSwitch & 2)==0) + return true; + return false; } -bool epi_getDO_serialMux1isSetToModem(void) { +bool epi_getDO_serialMux1isSetToModem(void) +{ // mux1 on: serial is switched to modem - return (SharedMemBuffer::getDataConst()->dout.serialSwitch & 2) > 0; + if ((do_serialSwitch & 2)>0) + return true; + return false; } -bool epi_getDO_serialMux2isSetToCredit(void) { +bool epi_getDO_serialMux2isSetToCredit(void) +{ // mux2 off: serial is switched to credit card terminal - return (SharedMemBuffer::getDataConst()->dout.serialSwitch & 4) == 0; + if ((do_serialSwitch & 4)==0) + return true; + return false; } -bool epi_getDO_serialMux2isSetToMifare(void) { +bool epi_getDO_serialMux2isSetToMifare(void) +{ // mux2 on: serial is switched to mifare reader - return (SharedMemBuffer::getDataConst()->dout.serialSwitch & 4) > 0; + if ((do_serialSwitch & 4)>0) + return true; + return false; } -uint8_t gpi_storeDO_ledsAndFan(uint8_t ledState) { + + + + + +static uint8_t do_ledsAndFan; +void gpi_storeDO_ledsAndFan(uint8_t ledState) +{ // bit0: coinled 1:front_illu 2: paper-led 3:pinpad-led 4:start-led 5:service-led 6:fan - return SharedMemBuffer::getData()->dout.ledsAndFan = ledState; + do_ledsAndFan=ledState; } -bool epi_getDO_led_coin(void) { - return (SharedMemBuffer::getDataConst()->dout.ledsAndFan & 1); +bool epi_getDO_led_coin(void) +{ + if (do_ledsAndFan & 1) + return true; + return false; } -bool epi_getDO_led_front(void) { - return (SharedMemBuffer::getDataConst()->dout.ledsAndFan & 2); +bool epi_getDO_led_front(void) +{ + if (do_ledsAndFan & 2) + return true; + return false; } -bool epi_getDO_led_ticket(void) { - return (SharedMemBuffer::getDataConst()->dout.ledsAndFan & 4); +bool epi_getDO_led_ticket(void) +{ + if (do_ledsAndFan & 4) + return true; + return false; } -bool epi_getDO_led_pin(void) { - return (SharedMemBuffer::getDataConst()->dout.ledsAndFan & 8); +bool epi_getDO_led_pin(void) +{ + if (do_ledsAndFan & 8) + return true; + return false; } -bool epi_getDO_led_start(void) { - return (SharedMemBuffer::getDataConst()->dout.ledsAndFan & 16); +bool epi_getDO_led_start(void) +{ + if (do_ledsAndFan & 16) + return true; + return false; } -bool epi_getDO_led_inside(void) { - return (SharedMemBuffer::getDataConst()->dout.ledsAndFan & 32); +bool epi_getDO_led_inside(void) +{ + if (do_ledsAndFan & 32) + return true; + return false; } -bool epi_getDO_fan(void) { - return (SharedMemBuffer::getDataConst()->dout.ledsAndFan & 64); +bool epi_getDO_fan(void) +{ + if (do_ledsAndFan & 64) + return true; + return false; } -uint8_t gpi_storeDO_sirenAndRelay(uint8_t sirenRelay) { + + +static uint8_t do_laermUndRelay; +void gpi_storeDO_sirenAndRelay(uint8_t sirenRelay) +{ // bit0: siren 1:relay - return SharedMemBuffer::getData()->dout.laermUndRelay = sirenRelay; + do_laermUndRelay=sirenRelay; } -bool epi_getDO_sirene(void) { - return SharedMemBuffer::getDataConst()->dout.laermUndRelay & 1; +bool epi_getDO_sirene(void) +{ + if (do_laermUndRelay & 1) + return true; + return false; } -bool epi_getDO_relay(void) { - return SharedMemBuffer::getDataConst()->dout.laermUndRelay & 2; +bool epi_getDO_relay(void) +{ + if (do_laermUndRelay & 2) + return true; + return false; } -uint8_t gpi_storeDO_ptuWake(uint8_t state) { - return SharedMemBuffer::getData()->dout.ptuWake = state; +static uint8_t do_ptuWake; +void gpi_storeDO_ptuWake(uint8_t state) +{ + do_ptuWake=state; } -bool epi_getDO_ptuWake(void) { - return SharedMemBuffer::getDataConst()->dout.ptuWake > 0; +bool epi_getDO_ptuWake(void) +{ + if (do_ptuWake>0) + return true; + return false; } -uint8_t gpi_storeDO_auxPower(uint8_t pwr) { - return SharedMemBuffer::getData()->dout.auxPower = pwr; +static uint8_t do_auxPower; +void gpi_storeDO_auxPower(uint8_t pwr) +{ + do_auxPower=pwr; } -bool epi_getDO_auxPower(void) { - return SharedMemBuffer::getDataConst()->dout.auxPower > 0; +bool epi_getDO_auxPower(void) +{ + if (do_auxPower>0) + return true; + return false; } -uint8_t gpi_storeDO_coinShutter(uint8_t state) { - return SharedMemBuffer::getData()->dout.coinShutter = state; + + +static uint8_t do_coinShutter; +void gpi_storeDO_coinShutter(uint8_t state) +{ + do_coinShutter=state; } -bool epi_getDO_coinShutterOpen(void) { +bool epi_getDO_coinShutterOpen(void) +{ // bit0: Coin shutter output, bit1: input-test-output - return SharedMemBuffer::getDataConst()->dout.coinShutter & 1; + if (do_coinShutter & 1) + return true; + return false; } -bool epi_getDO_coinShutterTest(void) { +bool epi_getDO_coinShutterTest(void) +{ // bit0: Coin shutter output, bit1: input-test-output - return SharedMemBuffer::getDataConst()->dout.coinShutter & 2; + if (do_coinShutter & 2) + return true; + return false; } -uint8_t gpi_storeDO_coinEscrow(uint8_t state) { - return SharedMemBuffer::getData()->dout.coinEscrow = state; +static uint8_t do_coinEscrow; + +void gpi_storeDO_coinEscrow(uint8_t state) +{ + do_coinEscrow=state; } -uint8_t epi_getDO_coinEscrow(void) { +uint8_t epi_getDO_coinEscrow(void) +{ // retval: 1:return flap is open 2:take flap is open 0:closed - if (SharedMemBuffer::getData()->dout.coinEscrow & 1) { - return 1; // return flap is open - } - if (SharedMemBuffer::getData()->dout.coinEscrow & 2) { + if (do_coinEscrow &1) + return 1; // return flap is open + if (do_coinEscrow &2) return 2; // take flap is open - } return 0; } -uint8_t gpi_storeDO_printerPwrOn(uint8_t state) { - return SharedMemBuffer::getData()->dout.printerPower = state; +static uint8_t do_printerPower; + +void gpi_storeDO_printerPwrOn(uint8_t state) +{ + do_printerPower=state; } -uint8_t epi_getDO_printerPwr(void) { - return SharedMemBuffer::getDataConst()->dout.printerPower; +uint8_t epi_getDO_printerPwr(void) +{ + return do_printerPower; } //------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------ //----------------------------- Mifare Card Reader ----------------------------------- -uint8_t gpi_storeMifReaderStateAndCardType(uint8_t const *buf) { + +#define NROFMIFSTATEBYTES 40 +static uint8_t Sdata_MIF_STATE[NROFMIFSTATEBYTES]; + +uint8_t gpi_storeMifReaderStateAndCardType(uint8_t *buf) +{ // retval 0=OK 1=error host buffer too small - memset(SharedMemBuffer::getData()->Sdata.MIF_STATE, 0x00, - sizeof(SharedMemBuffer::getData()->Sdata.MIF_STATE)); - memcpy(SharedMemBuffer::getData()->Sdata.MIF_STATE, buf, 8); + for (uint8_t nn=0; nnSdata.MIF_STATE, 8); + + for (uint8_t nn=0; nn<8; nn++) + buf[nn]=Sdata_MIF_STATE[nn]; return 0; // OK + } + + +static uint8_t Sdata_MIF_DATA[12][64]; // data come in blockwise, so safe them blockwise as well -bool gpi_storeMifCardData(uint8_t blkNr, uint8_t const *receivedData) { - if (blkNr<12) { - memcpy(&SharedMemBuffer::getData()->Sdata.MIF_DATA[blkNr][0], receivedData, 64); - return true; +void gpi_storeMifCardData(uint8_t blkNr, uint8_t *receivedData) +{ + if (blkNr<12) + { + for (uint8_t nn=0; nn<64; nn++) + Sdata_MIF_DATA[blkNr][nn]=receivedData[nn]; } - return false; + } -uint8_t epi_restoreMifData(uint8_t blkNr, uint8_t *buf, uint8_t maxBufferSize) { - if (blkNr>11 || maxBufferSize<64) { +uint8_t epi_restoreMifData(uint8_t blkNr, uint8_t *buf, uint8_t maxBufferSize) +{ + if (blkNr>11 || maxBufferSize<64) return 1; // error - } - memcpy(buf, &SharedMemBuffer::getDataConst()->Sdata.MIF_DATA[blkNr][0], 64); + for (uint8_t nn=0; nn<64; nn++) + buf[nn]=Sdata_MIF_DATA[blkNr][nn]; + return 0; // ois OK } -void gpi_storeNewMifareCard(uint8_t typ, uint8_t const *holder) { - SharedMemBuffer::getData()->mif_cardType = typ; - strncpy((char *)holder, (char *)SharedMemBuffer::getData()->mif_cardHolder, 7); - SharedMemBuffer::getData()->mif_cardHolder[7] = '\0'; +static uint8_t mif_cardType; +static uint8_t mif_cardHolder[8]; + +void gpi_storeNewMifareCard(uint8_t typ, uint8_t *holder ) +{ + mif_cardType=typ; + tslib_strcpy(holder, mif_cardHolder, 7); + mif_cardHolder[7]=0; } -uint8_t epi_mifGetCardType(uint8_t const *holder) { +uint8_t epi_mifGetCardType(uint8_t *holder) +{ //holder[8] = name of card holder // retval Type of MifareCard, 1=upper door, 2=lower door 3=test printer 4=test coins - strncpy((char *)SharedMemBuffer::getData()->mif_cardHolder, (char *)holder, 7); - return SharedMemBuffer::getData()->mif_cardType; + + tslib_strcpy(mif_cardHolder, holder, 7); + holder[7]=0; + return mif_cardType; } -void epi_restorePrinterState(uint8_t *buf) { - memcpy((char *)buf, (char *)SharedMemBuffer::getData()->Sdata.PRN_STATE, - sizeof(SharedMemBuffer::getData()->Sdata.PRN_STATE)); + +//------------------------------------------------------------------------------------ +//------------------------------------------------------------------------------------ + + +static uint8_t Sdata_PRN_STATE[pi_prnStateArraySize]; + +void epi_restorePrinterState(uint8_t *buf) +{ + uint8_t nn; + + for (nn=0; nnSdata.PRN_STATE, (char *)buf, - sizeof(SharedMemBuffer::getData()->Sdata.PRN_STATE)); +void gpi_storePrinterState(uint8_t *buf) +{ + uint8_t nn; + + for (nn=0; nnSdata.PRN_FONTS, - sizeof(SharedMemBuffer::getData()->Sdata.PRN_FONTS)); +static uint8_t Sdata_PRN_FONTS[pi_prnFontArraySize]; + +void epi_restorePrinterFonts(uint8_t *buf) +{ + uint8_t nn; + + for (nn=0; nnSdata.PRN_FONTS, (char *)buf, - sizeof(SharedMemBuffer::getData()->Sdata.PRN_FONTS)); +void gpi_storePrinterFonts(uint8_t *buf) +{ + uint8_t nn; + + for (nn=0; nnSdata.mdb_busRdy = busReady; - SharedMemBuffer::getData()->Sdata.mdb_V12on = V12on; - SharedMemBuffer::getData()->Sdata.mdb_V5on = V5on; - return true; +void gpi_storeMdbState(uint8_t busReady, uint8_t V12on, uint8_t V5on ) +{ + Sdata_mdb_busRdy=bool(busReady); + Sdata_mdb_V12on=bool(V12on); + Sdata_mdb_V5on=bool(V5on); } -bool epi_restoreMdbBusReady(void) { - return SharedMemBuffer::getDataConst()->Sdata.mdb_busRdy; +bool epi_restoreMdbBusReady(void) +{ + return Sdata_mdb_busRdy; } -bool epi_restoreMdbV12Ready(void) { - return SharedMemBuffer::getDataConst()->Sdata.mdb_V12on; +bool epi_restoreMdbV12Ready(void) +{ + return Sdata_mdb_V12on; } -bool epi_restoreMdbV5Ready(void) { - return SharedMemBuffer::getDataConst()->Sdata.mdb_V5on; +bool epi_restoreMdbV5Ready(void) +{ + return Sdata_mdb_V5on; } + + +static uint8_t Sdata_mdbNrOfRecData; +static uint8_t Sdata_RecBuff[40]; + // last received mdb answer (from mdb device) // only needed if a special command was sent directly // DB0: mdb Device-Nr // DB1: last sent mdb command // DB2: nr of received (payload) data bytes (apart from ACK, can be 0....34) // DB3...DB38: rec.data (payload) -void gpi_storeMdbResponse(uint8_t leng, uint8_t const *data) { - memset(&SharedMemBuffer::getData()->Sdata.RecBuff[0], 0x00, - sizeof(SharedMemBuffer::getData()->Sdata.RecBuff)); - SharedMemBuffer::getData()->Sdata.mdbNrOfRecData = leng; - memcpy((char *)&SharedMemBuffer::getData()->Sdata.RecBuff[0], - (char const *)data, leng); +void gpi_storeMdbResponse(uint8_t leng, uint8_t *data) +{ + + tslib_strclr(Sdata_RecBuff,0,40); + Sdata_mdbNrOfRecData=leng; + tslib_strcpy(data, Sdata_RecBuff, uint16_t(Sdata_mdbNrOfRecData)); } -void epi_restoreMdbResponse(uint8_t *leng, uint8_t *data) { - *leng = SharedMemBuffer::getDataConst()->Sdata.mdbNrOfRecData; - memcpy((char *)data, - (char *)&SharedMemBuffer::getDataConst()->Sdata.RecBuff[0], *leng); +void epi_restoreMdbResponse(uint8_t *leng, uint8_t *data) +{ + *leng=Sdata_mdbNrOfRecData; + tslib_strcpy(Sdata_RecBuff, data, Sdata_mdbNrOfRecData); + *leng = Sdata_mdbNrOfRecData; + } -void gpi_storeEmpSettings(uint8_t leng, uint8_t const *data) { - leng = std::min(leng, (uint8_t)(64)); - memset(&SharedMemBuffer::getData()->Sdata.emp_settingsBuff[0], 0x00, - sizeof(SharedMemBuffer::getData()->Sdata.emp_settingsBuff)); - SharedMemBuffer::getData()->Sdata.empNrOfsettings = leng; - memcpy((char *)&SharedMemBuffer::getData()->Sdata.emp_settingsBuff[0], - (char const *)data, leng); + + + + + + + + +static uint8_t Sdata_empNrOfsettings; +static uint8_t Sdata_emp_settingsBuff[66]; + +void gpi_storeEmpSettings(uint8_t leng, uint8_t *data) +{ + if (leng>64) leng=64; + Sdata_empNrOfsettings=leng; + tslib_strcpy(data, Sdata_emp_settingsBuff, leng); } -void epi_restoreEmpSettings(uint8_t *leng, uint8_t *data) { - *leng = SharedMemBuffer::getDataConst()->Sdata.empNrOfsettings; - memcpy((char *)data, - (char *)&SharedMemBuffer::getData()->Sdata.emp_settingsBuff[0], - *leng); +void epi_restoreEmpSettings(uint8_t *leng, uint8_t *data) +{ + + *leng=Sdata_empNrOfsettings; + tslib_strcpy(Sdata_emp_settingsBuff, data, Sdata_empNrOfsettings); } + // ...................................................................... // Münzbuffer[10]: Münze für Münze auslesen (LIFO) // 4.5.21 -static void sub_enterData(uint8_t valid, uint8_t signal, - uint8_t error, uint16_t value) { - if (SharedMemBuffer::getDataConst()->ctr_gotCoin < MEMDEPTH_GOTCOINS) { - uint8_t const gc = SharedMemBuffer::getDataConst()->ctr_gotCoin; - SharedMemBuffer::getData()->gotCoin[gc].valid = valid; - SharedMemBuffer::getData()->gotCoin[gc].signal = signal; - SharedMemBuffer::getData()->gotCoin[gc].error = error; - SharedMemBuffer::getData()->gotCoin[gc].value = value; + + +struct T_coin +{ + uint8_t valid; + uint8_t signal; + uint8_t error; + uint8_t pad; + uint16_t value; +}; + +static struct T_coin gotCoin[MEMDEPTH_GOTCOINS]; +static uint8_t ctr_gotCoin; + + +void sub_enterData(uint8_t valid, uint8_t signal, uint8_t error, uint16_t value ) +{ + if (ctr_gotCoinctr_gotCoin += 1; + ctr_gotCoin++; + } -void gpi_storeEmpCoinSignal(uint8_t leng, uint8_t const *data) { +void gpi_storeEmpCoinSignal(uint8_t leng, uint8_t *data) +{ // leng is number of coin record with 5 bytes each - uint8_t LL = leng; // nr of coin records - uint16_t vv, pp = 0; + uint8_t LL=leng; // nr of coin records + uint16_t vv, pp=0; + +//qDebug()<<"store emp data, len: "<0) // with FastProtocol only one coin { vv=uchar2uint(data[pp+4], data[pp+3]); sub_enterData(data[pp], data[pp+1], data[pp+2], vv ); + +//qDebug()<< "emp IN data: " << data[pp] << " " << data[pp+1] +// << " " <ctr_gotCoin; + return ctr_gotCoin; } -void epi_restoreEmpCoinSignal(uint8_t *valid, uint8_t *signal, - uint8_t *error, uint16_t *value) { - SharedMemBuffer::getData()->ctr_gotCoin -= 1; - if (SharedMemBuffer::getDataConst()->ctr_gotCoin < MEMDEPTH_GOTCOINS) { - uint8_t const gc = SharedMemBuffer::getDataConst()->ctr_gotCoin; - *valid = SharedMemBuffer::getDataConst()->gotCoin[gc].valid; - *signal = SharedMemBuffer::getDataConst()->gotCoin[gc].signal; - *error = SharedMemBuffer::getDataConst()->gotCoin[gc].error; - *value = SharedMemBuffer::getDataConst()->gotCoin[gc].value; +void epi_restoreEmpCoinSignal(uint8_t *valid, uint8_t *signal, uint8_t *error, uint16_t *value) +{ + ctr_gotCoin--; + if (ctr_gotCoinSdata.NrOfDeviceSetting = leng; - memset((char *)&SharedMemBuffer::getData()->Sdata.DeviceSettingBuff[0], - 0x00, sizeof(SharedMemBuffer::getData()->Sdata.DeviceSettingBuff)); - memcpy((char *)&SharedMemBuffer::getData()->Sdata.DeviceSettingBuff[0], - (char const *)data, leng); -} - -void epi_restoreRbDeviceSettings(uint8_t *leng, uint8_t *data) { // getestet am 12.4.23TS - *leng = SharedMemBuffer::getDataConst()->Sdata.NrOfDeviceSetting; - memcpy((char *)data, - (char const *)&SharedMemBuffer::getDataConst()->Sdata.DeviceSettingBuff[0], - *leng); -} - -void gpi_storeMachineIDsettings(uint8_t leng, uint8_t const *data) { - leng = std::min(leng, (uint8_t)(64)); - SharedMemBuffer::getData()->Sdata.NrOfMachineIDSetting = leng; - memset((char *)&SharedMemBuffer::getData()->Sdata.NrOfMachineIDBuff[0], - 0x00, sizeof(SharedMemBuffer::getData()->Sdata.NrOfMachineIDBuff)); - memcpy((char *)&SharedMemBuffer::getData()->Sdata.NrOfMachineIDBuff[0], - (char const *)data, leng); -} - -void epi_restoreMachineIDsettings(uint8_t *leng, uint8_t *data) { - *leng = SharedMemBuffer::getDataConst()->Sdata.NrOfMachineIDSetting; - memcpy((char *)data, - (char const *)&SharedMemBuffer::getDataConst()->Sdata.NrOfMachineIDBuff[0], - *leng); +/* +qDebug()<<"read emp data, nr "<64) leng=64; + Sdata_NrOfDeviceSetting=leng; + tslib_strcpy(data, Sdata_DeviceSettingBuff, leng); // getestet am 12.4.23TS +} + +void epi_restoreRbDeviceSettings(uint8_t *leng, uint8_t *data) // getestet am 12.4.23TS +{ + + *leng=Sdata_NrOfDeviceSetting; + tslib_strcpy(Sdata_DeviceSettingBuff, data, Sdata_NrOfDeviceSetting); +} + + + + +static uint8_t Sdata_NrOfMachineIDSetting; +static uint8_t Sdata_NrOfMachineIDBuff[66]; + +void gpi_storeMachineIDsettings(uint8_t leng, uint8_t *data) +{ + if (leng>64) leng=64; + Sdata_NrOfMachineIDSetting=leng; + tslib_strcpy(data, Sdata_NrOfMachineIDBuff, leng); +} + +void epi_restoreMachineIDsettings(uint8_t *leng, uint8_t *data) +{ + + *leng=Sdata_NrOfMachineIDSetting; + tslib_strcpy(Sdata_NrOfMachineIDBuff, data, Sdata_NrOfMachineIDSetting); +} + + +static uint32_t store_insertedAmount; +static uint16_t store_lastCoinType[64]; +static uint16_t store_lastCoinValue[64]; static uint8_t p_lastCoin; +static char store_curPayNewCoin; -void epi_clearCurrentPayment(void) { +void epi_clearCurrentPayment(void) +{ // call at beginning of coin collection - SharedMemBuffer::getData()->store.insertedAmount = 0; - p_lastCoin = 0; + int nn; + + store_insertedAmount=0; + p_lastCoin=0; + + // 17.5.23TS: ergänzt: + for (nn=0; nn<64; nn++) + { + store_lastCoinType[nn]=0; + store_lastCoinValue[nn]=0; + } + store_curPayNewCoin=0; } -void gpi_storeCurrentPayment(uint32_t insertedAmount, - uint16_t lastCoinType, uint16_t lastCoinValue) { - SharedMemBuffer::getData()->store.insertedAmount = insertedAmount; - SharedMemBuffer::getData()->store.lastCoinType[p_lastCoin] = lastCoinType; - SharedMemBuffer::getData()->store.lastCoinValue[p_lastCoin] = lastCoinValue; +void gpi_storeCurrentPayment(uint32_t insertedAmount, uint16_t lastCoinType, uint16_t lastCoinValue) +{ + store_insertedAmount=insertedAmount; + store_lastCoinType[p_lastCoin]=lastCoinType; + store_lastCoinValue[p_lastCoin]=lastCoinValue; p_lastCoin++; + store_curPayNewCoin++; } -uint32_t epi_CurrentPaymentGetAmount(void) { - return SharedMemBuffer::getDataConst()->store.insertedAmount; +uint32_t epi_CurrentPaymentGetAmount(void) +{ + return store_insertedAmount; } -uint16_t epi_CurrentPaymentGetLastCoin(void) { - uint8_t pp = p_lastCoin; - if (pp==0) { - return 0; // noch keine Münze erhalten - } - if (pp>0) { - pp--; - } - return SharedMemBuffer::getDataConst()->store.lastCoinValue[pp]; +uint16_t epi_CurrentPaymentGetLastCoin(void) +{ + uint8_t pp; + + //if (store_curPayNewCoin) + //{ + pp=p_lastCoin; + if (pp==0) + return 0; // noch keine Münze erhalten + if (pp>0) pp--; + //store_curPayNewCoin=0; // nur 1x melden + return store_lastCoinValue[pp]; + //} else + // return 0; } -bool epi_CurrentPaymentGetAllCoins(uint16_t *types, uint16_t *values) { +bool epi_CurrentPaymentGetAllCoins(uint16_t *types, uint16_t *values) +{ // alle bei diesem Verkauf eingeworfenen Münzen sind gespeichert falls die jmd. braucht - if (p_lastCoin==0) { + uint8_t nn; + if (p_lastCoin==0) return false; + for (nn=0; nn<64; nn++) + { + types[nn]=store_lastCoinType[nn]; + values[nn]=store_lastCoinValue[nn]; } - for (int nn=0; nn<64; nn++) { - types[nn] = SharedMemBuffer::getDataConst()->store.lastCoinType[nn]; - values[nn] = SharedMemBuffer::getDataConst()->store.lastCoinValue[nn]; - } + return true; } -void gpi_storeWakeSources(uint8_t const *receivedData) { - SharedMemBuffer::getData()->store.wakeSrc = 0; - for (int nn=7; nn>=0; nn--) { - uint8_t const uctmp = receivedData[nn]; - SharedMemBuffer::getData()->store.wakeSrc |= uctmp; - SharedMemBuffer::getData()->store.wakeSrc <<= 8; + +uint64_t stor_wakSrc; +uint8_t stor_reason; + + +void gpi_storeWakeSources(uint8_t *receivedData) +{ + uint8_t uctmp; + int nn; + stor_wakSrc=0; + for (nn=5; nn>=0; nn--) + { + uctmp=receivedData[nn]; + stor_wakSrc |=uctmp; + stor_wakSrc<<=8; } + stor_reason=receivedData[6]; } -uint64_t epi_getWakeSources(void) { - return SharedMemBuffer::getDataConst()->store.wakeSrc; +uint64_t epi_getWakeSources(void) +{ + return stor_wakSrc; } -void gpi_storeExtendedTime(uint8_t leng, uint8_t const *data) { - leng = std::min(leng, (uint8_t)(64)); - SharedMemBuffer::getData()->store.rbDevParamLen = leng; - memset((char *)(&SharedMemBuffer::getData()->store.rbDevParams[0]), 0x00, - sizeof(SharedMemBuffer::getData()->store.rbDevParams)); - memcpy((char *)(&SharedMemBuffer::getData()->store.rbDevParams[0]), - (char const *)data, leng); +uint8_t epi_getWakeReason(void) +{ + return stor_reason; } -void epi_restoreExtendedTime(uint8_t *leng, uint8_t *data) { - *leng = SharedMemBuffer::getDataConst()->store.rbDevParamLen; - memcpy((char *)data, - (char const *)(&SharedMemBuffer::getData()->store.rbDevParams[0]), - *leng); + + +static uint8_t store_rbDevParamLen; +static uint8_t store_rbDevParams[66]; + +void gpi_storeExtendedTime(uint8_t leng, uint8_t *data) +{ + if (leng>64) leng=64; + store_rbDevParamLen=leng; + tslib_strcpy(data, store_rbDevParams, leng); } +void epi_restoreExtendedTime(uint8_t *leng, uint8_t *data) +{ + + *leng=store_rbDevParamLen; + tslib_strcpy(store_rbDevParams, data, store_rbDevParamLen); +} + + + // store device conditions -void gpi_storeDeviceConditions(uint8_t leng, uint8_t const *data) { - leng = std::min(leng, (uint8_t)(64)); - SharedMemBuffer::getData()->store.deviceCondLen = leng; - memset((char *)(&SharedMemBuffer::getData()->store.deviceCond[0]), 0x00, - sizeof(SharedMemBuffer::getData()->store.deviceCond)); - memcpy((char *)(&SharedMemBuffer::getData()->store.deviceCond[0]), - (char const *)data, leng); +static uint8_t store_deviceCondLen; +static uint8_t store_deviceCond[66]; + +void gpi_storeDeviceConditions(uint8_t leng, uint8_t *data) +{ + if (leng>64) leng=64; + store_deviceCondLen=leng; + tslib_strcpy(data, store_deviceCond, leng); } -void epi_restoreDeviceConditions(uint8_t *leng, uint8_t *data) { - *leng = SharedMemBuffer::getDataConst()->store.deviceCondLen; - memcpy((char *)data, - (char const *)(&SharedMemBuffer::getData()->store.deviceCond[0]), - *leng); +void epi_restoreDeviceConditions(uint8_t *leng, uint8_t *data) +{ + + *leng=store_deviceCondLen; + tslib_strcpy(store_deviceCond, data, store_deviceCondLen); } + + // store dynamic machine conditions -void gpi_storeDynMachineConditions(uint8_t leng, uint8_t const *data) { - SharedMemBuffer::getData()->store.machCondLen = leng; - memset((char *)(&SharedMemBuffer::getData()->store.machCond[0]), 0x00, - sizeof(SharedMemBuffer::getData()->store.machCond)); - memcpy((char *)(&SharedMemBuffer::getData()->store.machCond[0]), - (char const *)data, leng); +static uint8_t store_machCondLen; +static uint8_t store_machCond[66]; + +void gpi_storeDynMachineConditions(uint8_t leng, uint8_t *data) +{ + if (leng>64) leng=64; + store_machCondLen=leng; + tslib_strcpy(data, store_machCond, leng); + + } + +void epi_restoreDynMachineConditions(uint8_t *leng, uint8_t *data) +{ + + *leng=store_machCondLen; + tslib_strcpy(store_machCond, data, store_machCondLen); } -void epi_restoreDynMachineConditions(uint8_t *leng, uint8_t *data) { - *leng = SharedMemBuffer::getDataConst()->store.machCondLen; - memcpy((char *)data, - (char const *)(&SharedMemBuffer::getData()->store.machCond[0]), - *leng); + + + +static uint8_t store_DcBackupNrOfAccNr; +static uint16_t store_DcBackupAccNr[16]; // z.Z. nur 8 + +void gpi_storeDCbackupAccNr(uint8_t leng, uint8_t *data) +{ + if (leng>32) leng=32; + store_DcBackupAccNr[0]=uchar2uint(data[1], data[0]); + store_DcBackupAccNr[1]=uchar2uint(data[3], data[2]); + store_DcBackupAccNr[2]=uchar2uint(data[5], data[4]); + store_DcBackupAccNr[3]=uchar2uint(data[7], data[6]); + store_DcBackupAccNr[4]=uchar2uint(data[9], data[8]); + store_DcBackupAccNr[5]=uchar2uint(data[11], data[10]); + store_DcBackupAccNr[6]=uchar2uint(data[13], data[12]); + store_DcBackupAccNr[7]=uchar2uint(data[15], data[14]); + store_DcBackupNrOfAccNr=8; } -void gpi_storeDCbackupAccNr(uint8_t /*leng*/, uint8_t const *data) { - // if (leng > 32) { - // leng = 32; - // } - SharedMemBuffer::getData()->store.DcBackupAccNr[0] = uchar2uint(data[1], data[0]); - SharedMemBuffer::getData()->store.DcBackupAccNr[1] = uchar2uint(data[3], data[2]); - SharedMemBuffer::getData()->store.DcBackupAccNr[2] = uchar2uint(data[5], data[4]); - SharedMemBuffer::getData()->store.DcBackupAccNr[3] = uchar2uint(data[7], data[6]); - SharedMemBuffer::getData()->store.DcBackupAccNr[4] = uchar2uint(data[9], data[8]); - SharedMemBuffer::getData()->store.DcBackupAccNr[5] = uchar2uint(data[11], data[10]); - SharedMemBuffer::getData()->store.DcBackupAccNr[6] = uchar2uint(data[13], data[12]); - SharedMemBuffer::getData()->store.DcBackupAccNr[7] = uchar2uint(data[15], data[14]); - SharedMemBuffer::getData()->store.DcBackupNrOfAccNr = 8; -} - -void epi_restoreDCbackupAccNr(uint8_t *leng, uint16_t *accNrs) { +void epi_restoreDCbackupAccNr(uint8_t *leng, uint16_t *accNrs) +{ // return accNrs[0..7] - *leng = SharedMemBuffer::getDataConst()->store.DcBackupNrOfAccNr; - for (int nn=0; nn<8; nn++) { - accNrs[nn] = SharedMemBuffer::getDataConst()->store.DcBackupAccNr[nn]; - } + uint8_t nn; + + *leng=store_DcBackupNrOfAccNr; + for (nn=0; nn<8; nn++) + accNrs[nn]=store_DcBackupAccNr[nn]; + } -void epi_iniVRstorage(void) { - memset((char *)(&SharedMemBuffer::getData()->store.vaultrecord[0]), 0x00, - sizeof(SharedMemBuffer::getData()->store.vaultrecord)); - SharedMemBuffer::getData()->store.gotNrBlocksOfVaultRec = 0; + +static uint8_t store_gotNrBlocksOfVaultRec; +static uint8_t store_vaultrecord[360]; + +void epi_iniVRstorage(void) +{ + tslib_strclr(store_vaultrecord, 0, 360); + store_gotNrBlocksOfVaultRec=0; } -void gpi_storeVaultRecord(uint8_t blkNr, uint8_t const *data) { - uint16_t start = blkNr; +void gpi_storeVaultRecord(uint8_t blkNr, uint8_t *data ) +{ + uint16_t start=blkNr, ii; - // setze pro Block ein bit, wir brauchen block 0...4 - // also muss store_gotNrBlocksOfVaultRec auf 0x1F stehen - SharedMemBuffer::getData()->store.gotNrBlocksOfVaultRec |= (1<store.vaultrecord[start+ii] = data[ii]; - } } -bool epi_checkIfVaultRecordAvailable(void) { - return SharedMemBuffer::getDataConst()->store.gotNrBlocksOfVaultRec == 0x1F; -} - -bool epi_restoreVaultRecord(uint16_t *length, uint8_t *buf) { - *length = 0; - if (SharedMemBuffer::getDataConst()->store.gotNrBlocksOfVaultRec == 0x1F) { - *length = 320; - memcpy((char *)buf, - (char const *)SharedMemBuffer::getDataConst()->store.vaultrecord, - *length); +bool epi_checkIfVaultRecordAvailable(void) +{ + if (store_gotNrBlocksOfVaultRec==0x1F) return true; + else + return false; +} + + +bool epi_restoreVaultRecord(uint16_t *length, uint8_t *buf ) +{ + *length=0; + if (store_gotNrBlocksOfVaultRec==0x1F) + { + *length=320; + tslib_strcpy(store_vaultrecord, buf, 320); + } else + return false; + + return true; +} + + + +static uint32_t store_amount; +static uint16_t store_nrOfCoins; + +void gpi_storeCBlevel(uint32_t amount, uint16_t nrOfCoins ) +{ + store_amount=amount; + store_nrOfCoins=nrOfCoins; +} + +uint32_t epi_getCashBoxContent(void) +{ + return store_amount; +} + +uint16_t epi_getNrOfCoinsInCashBox(void) +{ + return store_nrOfCoins; +} + +static bool store_DcDataAreValid; + +void gpi_storeDcDataValid(bool isVal) +{ + store_DcDataAreValid = isVal; +} + + +bool epi_areDcDataValid() +{ + return store_DcDataAreValid; +} + +// .................................................................................... +// 24.5.2023 + +static uint8_t storeDCdynPrinterData[64]; +static uint8_t DCdynPrinterDataActual; + +void epi_clearDynData(void) +{ + DCdynPrinterDataActual=0; + memset(storeDCdynPrinterData,0, sizeof(storeDCdynPrinterData)); +} + +void gpi_storeDynData(uint8_t *DCdynDat) +{ + // buffer size: 64 byte + memcpy(storeDCdynPrinterData, DCdynDat, 64); + DCdynPrinterDataActual=1; +} + +bool epi_getDynPrnData(uint8_t *DCdynDat) +{ + // buffer size: 64 byte + // return true if data are new and valid + + if (DCdynPrinterDataActual) + { + memcpy(DCdynDat, storeDCdynPrinterData, 64); + return true; + } else + { + return false; } - return false; } -void gpi_storeCBlevel(uint32_t amount, uint16_t nrOfCoins) { - SharedMemBuffer::getData()->store.amount = amount; - SharedMemBuffer::getData()->store.nrOfCoins = nrOfCoins; -} -uint32_t epi_getCashBoxContent(void) { - return SharedMemBuffer::getDataConst()->store.amount; -} -uint16_t epi_getNrOfCoinsInCashBox(void) { - return SharedMemBuffer::getDataConst()->store.nrOfCoins; -} + + +