Add collected changes from T.Sax

This commit is contained in:
2024-07-04 14:01:43 +02:00
parent ab5a343ab2
commit b0e55d8ea4
16 changed files with 2623 additions and 338 deletions

92
include/dump.txt Executable file
View File

@@ -0,0 +1,92 @@
/*
void incTextBuffer(void)
{
runProc_prnSeqNr++;
runProc_pointPrnTxt=0;
if (runProc_prnSeqNr>127)
runProc_prnSeqNr=127;
runProc_prnCmdSeq[runProc_pointPrnCmd]=1;
runProc_prnCmdPara[runProc_pointPrnCmd++]=runProc_prnSeqNr;
}*/
/*
void T_runProc::subAppendNxtTxt(char *textLine)
{
// append given text to current sequence, respect max. sequ.length
// also send a command "print text buffer nn" ==1 once for each buffer
//static uint8_t runProc_prnCmdSeq[512];
//static uint8_t runProc_prnCmdPara[512];
//static uint16_t runProc_pointPrnCmd;
int sl=strlen(textLine);
if (sl>1024) sl=1024;
textLine[sl]=0;
if (runProc_prnSeqNr==0 && runProc_pointPrnTxt<3)
{
// then this is the very first text entry
// store command to print this buffer
runProc_prnCmdSeq[runProc_pointPrnCmd]=1;
runProc_prnCmdPara[runProc_pointPrnCmd++]=runProc_prnSeqNr;
}
if ( (runProc_pointPrnTxt + sl) > 1023)
{
incTextBuffer();
}
runProc_prnTextSeq[runProc_prnSeqNr].append(textLine);
//for (nn=0; nn<sl; nn++)
//{
//runProc_prnTextSeq[runProc_prnSeqNr][runProc_pointPrnTxt+nn]=textLine[nn];
//}
}*/
// qCritical() << "emitting signal payCancelled";
// emit runProc_payCancelled();
/*
// gabs bei Szeged, jetzt nicht mehr:
if (payInProg==8)
{
// coin checker faulty, cannot start
if (hwapi_paymentStarted==1)
{
hwapi_paymentStarted=90; // stop due to error
qCritical() << "emitting signal coinCollectionAborted 1";
emit runProc_coinCollectionAborted();
//sendFDcmd_set(156, 0,0, 2,0,0,0); // cancel payment
}
return 10; // error cannot start
}*/
/*
static uint8_t Sdata_DeviceParameter[64];
static uint8_t Sdata_DevParaLen;
uint8_t T_runProc::epi_store64BdevParameter(uint8_t length, uint8_t *buf)
{
// HWapi writes data to be stored
uint8_t nn;
for (nn=0; nn<length; nn++)
Sdata_DeviceParameter[nn]=buf[nn];
for (nn=length; nn<64; nn++)
Sdata_DeviceParameter[nn]=0;
Sdata_DevParaLen=length;
return 0;
}
uint8_t T_runProc::epi_restore64BdevParameter(uint8_t *length, uint8_t *buf)
{
for (uint8_t nn=0; nn<Sdata_DevParaLen; nn++)
buf[nn]=Sdata_DeviceParameter[nn];
*length=Sdata_DevParaLen;
return 0;
}
*/

View File

@@ -2,6 +2,7 @@
matching interfaces.h:
// 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()
@@ -14,12 +15,32 @@ matching interfaces.h:
// V3.2 Bootloader improvement
// 12.04.2023: V3.3 new features extended: loading and using Json-files, cash-collection, cash-data-logging
14.7.23TS: patch for correct printer state in line 3364 in sys_getDeviceConditions(struct T_moduleCondition *devCond) const
8.9.2023 two new functions (end of file) for mifare test. Interface version 4.4 DC4.40...4.43
14.09.2023: Verriegelung eingebaut, nur noch gültige Abr.Daten zurückgeben, Suchbegriff: <epi_restoreVaultRecord>
alle Mifare-Funktionen ueberprueft und ggf verbessert
18.09.2023: Signal "Kasse entnommen" und Signale "Tuer auf/zu" ueberprueft
20.9.2023: in datif die Abfrage der DynMachineData massiv beschleunigt
und hier in hwapi die entprellten Werte fuer Tueren und Kasse verwenden.
Problem war: Signal "Kasse entnommen" war zu langsam -> manchmal abr nicht gesendet
14.3.24 new function bool hwapi::cash_isCollectionStarted(void) const
padding three struct to 64 byte to avoid stack overflow when using
//#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"
V4.0 6.9.2023: activating DC-Bootloader in slve-lib (SM)
23.5.2024: prn_getHwState() fixed and moved down to runProc with a wrapper in hwapi, current version: 5.5
several new functions for "direct ticket print", without the dueway loading jsons to DC and cmd DC to print
The same rules as before apply to the json, but it can have any arbitrary length
*/
@@ -569,12 +590,10 @@ public:
// read printer condition and settings
uint8_t prn_getHwState(struct Tprn_hw_state *prn_hw_state) const override;
// 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"
// return value: =prn_hw_state[0]
// 0:unknown 1: printer OK 100: printer OK but paper near end
// 200: not connected 201: printer on error 202: no paper
bool prn_isUpAndReady(void) const override;
// true: printer is powered, serial is ok, no error, printer is connected and resonding
@@ -603,7 +622,7 @@ public:
void prn_movePaper(uint8_t wayInMm, uint8_t direction) const override;
//direction: 1=forward 2=backward
//
void prn_setFonts(uint8_t font, uint8_t size, uint8_t width, uint8_t height) const override;
// font = kind of font 5...11 (0..22)
// size = 6...20, 9..9: too tiny 10: small ...12 = normal size ...20=huge
@@ -1037,7 +1056,6 @@ public:
void sys_getDynMachineConditions(struct T_dynamicCondition *dynMachCond) const override;
uint32_t cash_getAmountInVault(void) const override;
uint16_t cash_getNrCoinsInVault(void) const override;
@@ -1358,6 +1376,30 @@ public:
virtual QObject const *getAPI() override;
void mod_switchResetline(void) override;
// 22.5.2024 direct ticket printing
void prn_translateLocalPrinterJson(QByteArray jsonFile2print) const override;
// load, parse, translate and save the file
void prnStoreDynamics(char *bufferDynPrintVars[], uint8_t nrOfDyns) const override;
// store nrOfDyns (up to 16) dynamics before printing
// max length = 16 byte per dynamic
// 16 strings with up to 16bytes each
void prn_printTranslatedTicket(void) const override;
uint8_t prn_waitForDirectTicket(void) const override;
signals:
void hwapi_reportDCDownloadStatus(QString const&) const override;
void hwapi_reportDCDownloadSuccess(QString const&) const override;
@@ -1389,6 +1431,8 @@ signals:
void hwapi_coinAttached() const override;
private slots:
//void hwapi_slotPrintFinished_OK(void);
//void hwapi_slotPrintFinished_Err(void);

View File

@@ -179,57 +179,64 @@ struct T_moduleCondition
// 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;
// 10
uint8_t coinChecker; // EMP, OMP or mei-cashflow
uint8_t coinEscrow;
uint8_t mifareReader; // 0: unknown 1=OK 200=no response 201=wrong response 202: Reader reports HW-error
uint8_t creditTerm;
uint8_t coinReject;
uint8_t coinSafe;
uint8_t billSafe;
uint8_t voltage; // 1:11..14V
uint8_t temper;
uint8_t poweronTest;
// 20
uint8_t doorState; // 1: alles zu 200: tuer 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 doorWasOpened; // 1: all doors are closed 200: any door was just opened
uint8_t changer;
uint8_t coinBlocker;
uint8_t billReader;
uint8_t ResetReason;
uint8_t allModulesChecked;
uint8_t alarmState;
uint8_t fuses;
uint8_t res11;
uint8_t res12;
// 30
uint8_t res13;
// 32
uint8_t padd00;
uint8_t padd01;
uint8_t padd02;
uint8_t padd03;
//36
uint32_t padd04;
uint32_t padd05;
uint32_t padd06;
uint32_t padd07;
// 50
// 52
uint32_t padd08;
uint32_t padd09;
uint32_t padd10;
uint16_t padd11;
// 64
};
// ATTENTION: struct length must be 64 exactly!!!
struct T_dynamicCondition
{
char allDoorsDebounced;
@@ -248,7 +255,7 @@ struct T_dynamicCondition
char lastMifCardType;
uint8_t lastSDoorState;
uint8_t lastVDoorState;
uint8_t lastCBstate;
uint8_t lastCBstate; // =0, not used
char paymentInProgress;
// Version Szeged: aug2023
// 0: stopped by timeout
@@ -291,7 +298,10 @@ struct T_dynamicCondition
char jsonValid_serial;
char jsonValid_time;
char lastFileType;
uint8_t MifCardHolder[8];
// 51
uint8_t resultOfLastTemplPrint;
// 0: unknown or printing in progress
// 1: OK, doc was printed 2: error, doc was not printed
@@ -302,17 +312,36 @@ struct T_dynamicCondition
// bit4: paper jam in cutter
// bit6: no response bit7: serial rec. error
// bit5: printer not ready
uint8_t startupTestIsRunning;
uint8_t startupTestIsRunning; // =0, not used
uint16_t empty; // neu 3.7.24, dieser Platz wird vom Compiler im Ram
// freigehalten weil naechster Wert ein Long ist
// 56
// new since 7.5.24
uint32_t totalNrOfCuts;
uint16_t nextAccountNumber;
uint16_t nrOfBillsInBox;
//uint16_t padd07; // raus am 3.7.24
// 64
// rest comes with new cmd:
uint32_t amountInBillbox;
uint16_t UbatAtLastPrint;
uint16_t pad01;
uint32_t reserve01;
uint32_t reserve02;
uint32_t reserve03;
uint32_t reserve04;
uint32_t reserve05;
uint32_t reserve06;
uint32_t reserve07;
uint32_t reserve08;
uint32_t reserve09;
uint32_t reserve10;
uint32_t reserve11;
uint32_t reserve12;
uint32_t reserve13;
uint32_t reserve14;
uint8_t padd01;
uint8_t padd02;
uint8_t padd03;
//50
uint32_t padd04;
uint32_t padd05;
uint32_t padd06;
uint16_t padd07;
// 64
};
struct T_extTime
@@ -358,24 +387,37 @@ struct T_devices
UCHAR kindOfCoinChecker; // 0: without 1=EMP820 2=EMP900 3=currenza Csquare (MW)
UCHAR kindOfMifareReader; // by now only stronglink SL025 =1
UCHAR solarPower; // 1:sleep allowed 0: no sleep
UCHAR kindOfModem; // 0:off 1:Sunlink
UCHAR kindOfCreditcard; // 0:off 1:Feig NFC
UCHAR CoinEscrow;
UCHAR CoinRejectUnit;
UCHAR CoinShutter;
UCHAR BillAcceptor;
// 10
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;
// 30
// 20
UINT BattEmptyWarnLevel;
UINT BattEmptyErrorLevel;
UCHAR useForeignCharacters;
UCHAR printRefundReceipt;
UINT BillFullWarnLevel;
UINT BillFullErrorLevel;
UCHAR housing;
UCHAR resUc1;
// 32
uint32_t padd01;
uint32_t padd02;
uint32_t padd03;
@@ -383,7 +425,7 @@ struct T_devices
uint32_t padd05;
uint32_t padd06;
uint32_t padd07;
uint16_t padd08;
uint32_t padd08;
// 64
};
@@ -417,6 +459,8 @@ struct T_changer
uint8_t paymentRunning; // 1: coins are accepted
uint16_t denomination[16];
uint16_t availableTubes; //bitwise 0,1 1=av. bit0 = lowest coin value
uint16_t pad;
// 64byte
};
struct T_bna
@@ -425,19 +469,29 @@ struct T_bna
uint8_t setup; // 0: not 1: got valid parameters from device
uint8_t FeatureLevel;
uint16_t countryCode; // programmed in EMP
uint16_t scalingFactor; // z.B. 5
uint8_t decimalPlace;
uint8_t pad1;
uint16_t stackerCap;
uint16_t billSecureLevel;
// 12
uint8_t hasEscrow;
uint8_t accBillTypes[16]; // programmed in EMP z.B. (bit 0..7): 1 2 4 10 20 40 0 0
uint16_t currentStackerLevel; // requested number of notes in billbox
// 31
// settings from Master
uint16_t intendedAccept; // bit 0 =5€
uint16_t pad2;
uint16_t billDenomination[16];
// 35
uint16_t billDenomination[8];
// 51
uint8_t pad3;
uint32_t pad4;
uint32_t pad5;
uint32_t pad6;
// 8.5.24 reduced, 3 bytes too much.
};
@@ -1279,16 +1333,17 @@ public:
// read printer condition and settings
virtual uint8_t prn_getHwState(struct Tprn_hw_state *prn_hw_state) const {
virtual uint8_t prn_getHwState(struct Tprn_hw_state *prn_hw_state) const
{
Q_UNUSED(prn_hw_state);
return 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"
// return value: =prn_hw_state[0]
// 0:unknown 1: printer OK 100: printer OK but paper near end
// 200: not connected 201: printer on error 202: no paper
virtual bool prn_isUpAndReady(void) const {
return false;
@@ -2380,6 +2435,40 @@ public:
virtual QObject const *getAPI() { return nullptr; }
virtual void mod_switchResetline() { }
// direct ticket printing
// new from 22.5.2024, print Json-Printer-Template which
// is stored locally here in PTU memory,
// rather then loading several jsons to DC and tell it to print (until now)
// the local printer-json can have any length using predefined commands
// printing a local printer-json happens like this:
// 1) select a file to be printed from memory
// 2) load, parse, translate and save the file with following function
// 3) set dynamics (values from current transaction)
// 4) send saved file to printer one or several times
// hint: dynamics can be changed at any time without reloading the ticket, just repeat 3) and 4)
virtual void prn_translateLocalPrinterJson(QByteArray jsonFile2print) const
{ Q_UNUSED(jsonFile2print) }
// load, parse, translate and save the file
virtual void prnStoreDynamics(char *bufferDynPrintVars[], uint8_t nrOfDyns) const
{ Q_UNUSED(bufferDynPrintVars); Q_UNUSED(nrOfDyns) }
// store nrOfDyns (up to 16) dynamics before printing
// max length = 16 byte per dynamic
// 16 strings with up to 16bytes each
virtual void prn_printTranslatedTicket(void) const { }
virtual uint8_t prn_waitForDirectTicket(void) const { return 0; }
// return: 0: just printing, wait
// 1: OK - last print was succesful
// 2: error - not printed
// 2: printer error 3: no connection to DC
signals:
/*
@@ -2422,31 +2511,7 @@ signals:
virtual void hwapi_coinAttached() const = 0;
// NOTE: declaring a "pure virtual" "signal" should be an error and thus not valid.
/* GH Version, bringt Fehler
void hwapi_templatePrintFinished_OK() const;
void hwapi_templatePrintFinished_Err() const;
void hwapi_coinCollectionJustStarted() const;
void hwapi_coinCollectionAborted() const;
void hwapi_gotNewCoin() const;
void hwapi_payStopByMax() const;
void hwapi_payStopByPushbutton() const;
void hwapi_payStopByEscrow() const;
void hwapi_payStopByError() const;
void hwapi_payStopByTimeout() const;
void hwapi_payCancelled() const;
void hwapi_coinProcessJustStopped() const;
void hwapi_doorServiceDoorOpened() const;
void hwapi_doorVaultDoorOpened() const;
void hwapi_doorCoinBoxRemoved() const;
void hwapi_doorCoinBoxInserted() const;
void hwapi_doorCBinAndAllDoorsClosed() const;
void hwapi_doorAllDoorsClosed() const;
*/
};
@@ -2511,11 +2576,21 @@ signals:
// hier von =0 auf {} durch Gerhard
//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/5.2"
// 7.11.2023: bna functions activated
#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/5.3"
//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/5.3"
// 14.3.24:new function bool hwapi::cash_isCollectionStarted(void) const
// padding three struct to 64 byte to avoid stack overflow when using
// signal coin attached is much faster now
//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/5.4"
// 7.may.2024, matches to DC V6, some structs extended
// new function: modem reset, dyn. data come with two commands now
// released 17.may.2024
#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/5.5"
// started at 21.5.24, integration of ticket interpreter
// see change log in hwapi.h
Q_DECLARE_INTERFACE(hwinf, HWINF_iid)

View File

@@ -23,7 +23,6 @@
#include "shared_mem_buffer.h"
class T_runProc : public QObject
{
Q_OBJECT
@@ -36,6 +35,16 @@ class T_runProc : public QObject
void restoreDeviceParameter(struct T_devices *deviceSettings);
void clearPrnFile(void);
char subFeedPaper(char *valueStr);
bool subGetVariStr(char *valueStr, char *returnStr);
//void subAppendNxtTxt(char *textLine);
void sub_changeStyle(char *valueStr);
void subPrintGrafics(char *valueStr);
char prn_directTicket_cycle(void);
void runProc_subPerformPrintCmds(uint8_t nextCmd, uint8_t nextPara);
uint16_t subStoreTicketText(char *textLine);
#ifndef THIS_IS_CA_MASTER
std::atomic_bool m_coinAttached{false};
#endif
@@ -53,6 +62,9 @@ public:
uint8_t epi_restore64BdevParameter(uint8_t *length, uint8_t *buf);
bool doors_supervise(void);
uint8_t prn_getHwState(struct Tprn_hw_state *prn_hw_state);
// byte 0: 0:unknown 1: printer OK 100: printer OK but paper near end
// 200: not connected 201: printer on error 202: no paper
void bl_completeStart(void);
void dc_autoRequest(bool on);
void bl_rebootDC(void);
@@ -60,6 +72,48 @@ public:
void bl_checkBL(void);
bool bl_isUp(void);
// new from 21.5.24 ..................................................................
uint16_t sys_getCustomerNumber(void);
uint16_t sys_getMachineNumber(void);
uint16_t sys_getBoroughNumber(void);
uint16_t sys_getZoneNumber(void);
uint16_t sys_getMachineAlias(void);
void sys_getLocation(char *locStr);
void prn_sendText(QByteArray *buf);
void prn_sendPrnSysCmd(uint8_t para1, uint8_t para2, uint32_t para3);
void prn_printBarcode(uint8_t kindOf, uint8_t withText, uint8_t offset, uint8_t rotation, uint8_t dataLeng, uint8_t *data);
bool sys_parseFile(QByteArray jsonFile2print);
// and copy all keys and values to arrays
bool sys_translateKeys(void);
bool sys_interpretPrnCmds(void);
void prn_sendPrnSetup(uint16_t paperSpeed, uint8_t density, uint8_t alignment, uint8_t orientation);
// 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!)
void prnStoreDynamics(char *bufferDynPrintVars[], uint8_t nrOfDyns);
// store nrOfDyns (up to 16) dynamics before printing
// max length = 16 byte per dynamic
bool prnRestoreDynamic(uint8_t nrOfDyn, char *bufferOneDyn);
// nrOfDyn = 0...15
// buffer bufferOneDyn[16] needs length of at least 16 byte
bool prn_isUpAndReady(void);
void prnStartDirectPrinting(void);
uint8_t prn_getDirectPrintResult(void);
// return: 0: just printing, wait
// 1: OK - last print was succesful
// 2: error - not printed
// 2: printer error 3: no connection to DC
signals:
//void runProc_templatePrintFinished_OK(void) const override;

2
include/sendWRcmd.h Normal file → Executable file
View File

@@ -14,6 +14,8 @@ uint8_t sendWRcmd_getSendBlock160(uint8_t *leng, uint8_t *buf);
void sendWRcmd_INI(void);
uint8_t sendWRcmd_getStackSize(void);
// #define FDCMD_STACKDEPTH 16 / 32
// short and long commands are queued into the same stack to guaranty right order
void sendFDcmd_clrStack(void);

5
include/shared_mem_buffer.h Normal file → Executable file
View File

@@ -230,6 +230,9 @@ struct SharedMem
uint8_t store_bnaCollect[8];
uint8_t store_bnaContent[64];
// new, 8.5.24
uint8_t store_machCon2len;
uint8_t store_machCon2[66];
@@ -242,7 +245,7 @@ struct SharedMem
// ------------------ Data OUTPUT --------------------------------
// sendWRcmd.cpp
#define CMDSTACKDEPTH 16
#define CMDSTACKDEPTH 32
uint16_t nextAsynchsendCmd0[CMDSTACKDEPTH];
uint8_t nrOfCmdsInQueue;

8
include/storeINdata.h Normal file → Executable file
View File

@@ -529,7 +529,7 @@ bool epi_areDcDataValid();
void epi_setDcDataValid(void);
void epi_resetDcDataValid(void);
void epi_resetDcDataValid(char reason);
void epi_clearDynData(void);
@@ -626,6 +626,12 @@ void epi_restoreBnaContent(uint8_t *data);
void epi_clearDynMachCond2(void);
void gpi_storeDynMachCond2(uint8_t leng, uint8_t *data);
void epi_restoreDynMachCond2(uint8_t *leng, uint8_t *data);

33
include/tslib.h Normal file → Executable file
View File

@@ -1,7 +1,7 @@
#ifndef TSLIB_H
#define TSLIB_H
#include <QByteArray>
#include "stdint.h"
#define LOWBYTE false
#define HIGHBYTE true
@@ -87,6 +87,37 @@ void biox_CopyBlock(uint8_t *src, uint16_t srcPos, uint8_t *dest, uint16_t destP
bool tslib_strComp(uint8_t *buf, char *compStr);
uint16_t tslib_StrLen(char *str);
void tslib_itoa(int n, char *str);
// -23456 -> str[0]='-' str[1]='2' ...[5]='6' str[6]=0
// 5 -> str[0]='5' str[1..6]=0
void tslib_uitoa(unsigned int n, char *str);
void tslib_ltoa(long n, char *str);
// -2147483647 -> str[0]='-' str[1]='2' ...[10]='6' str[11]=0
void tslib_ultoa( long n, char *str);
// 0... ->4294967296 str[0]='4' str[1]='2' ...[9]='6' str[10]=0 str[11]=0
void tslib_uitobin( int decval, char *str);
long tslib_atol( char *AscString);
// change ascii string ( of ascii numbers '0'..'9') to number
// AscString must be 0-terminated!
// a leading '-' is ignored, a'.' or a ',' stops calculation
#endif // TSLIB_H