diff --git a/plugins/interfaces.h b/plugins/interfaces.h index b5329d2..f555636 100755 --- a/plugins/interfaces.h +++ b/plugins/interfaces.h @@ -93,14 +93,183 @@ struct Tprn_hw_state }; +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 structStart; // always first!!! + uint8_t ram; // v + uint8_t intEe; // v + uint8_t extEe; // v + + 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 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 coinSafe; // v + uint8_t billSafe; // v + uint8_t voltage; // v // 1:11..14V + uint8_t temper; // v + + 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 +{ + // 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 billBox; + char modeAbrech; + char onAlarm; + char nowCardTest; + + char nowPayment; + char lastMifCardType; + char openedAuthorized; + char allDoorsDebounced; + + uint8_t lastSDoorState; + uint8_t lastVDoorState; + uint8_t CBinDebounced; + uint8_t lastCBstate; + + char paymentInProgress; + char res1; + char res2; + char res3; + + 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; + +}; + class hwinf { public: enum class DownloadResult {OK, ERROR, TIMEOUT, NOP}; + enum class FileTypeJson {CONFIG=1, DEVICE, CASH, SERIAL, TIME, PRINTER}; virtual ~hwinf() {} + + // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // Use serial interface and protocol stack in Cashagent-Library @@ -123,6 +292,8 @@ public: 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 @@ -439,11 +610,31 @@ public: virtual void request_ReadbackDeviceSettings() const =0; virtual void readback_DeviceSettings(uint8_t *length, uint8_t *data) const =0; - // refer to DC2 manual for exact content - // state 5.5.21: byte[0]=kindOfPrinter byte[1]=kindOfCoinChecker - // byte[2]=kindOfMifarereadr byte[3]=suppress sleep mode - // byte[4]=kindOfModem byte[5]=kind of cc terminal - +/* + 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, @@ -455,8 +646,8 @@ public: // 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 -// 9 // $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // Printer @@ -1053,7 +1244,7 @@ public: // return true is bl is up and running // also initializes "sendFile" - virtual void bl_sendAddress(u_int16_t blockNumber) const=0; + 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 @@ -1065,7 +1256,7 @@ public: virtual void bl_openBinary(void) const=0; // to be used within CashAgent, momentary not processed - virtual void bl_sendDataBlock(uint8_t length, u_int8_t *buffer) const=0; + 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; @@ -1091,6 +1282,266 @@ public: + +// ------------------------------------------------------------------------------------ +// 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 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(uint32_t *accNr ) const=0; + // returns all acc nrs of the backuped vault records + // use: uint32_t backupedAccNumbers[8] + + virtual bool log_selectVaultRecord(uint16_t accountNr ) const=0; + // return true if sending, false if cmd-stack is full + +//request, isAvailable +virtual void 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(uint16_t amount) const=0; + + 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(struct T_moduleCondition *devCond) const=0; + 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_getDynMachineConditions(struct T_dynamicCondition *dynMachCond) 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; + +*/ + + }; @@ -1104,8 +1555,15 @@ public: // 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 + +//#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.Psa2020.software.HWapi/3.1" Q_DECLARE_INTERFACE(hwinf, HWINF_iid)