Compare commits
	
		
			1 Commits
		
	
	
		
			master
			...
			changes-fo
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| fb75074955 | 
							
								
								
									
										42
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,41 +1 @@
 | 
			
		||||
# C++ objects and libs
 | 
			
		||||
 | 
			
		||||
*.slo
 | 
			
		||||
*.lo
 | 
			
		||||
*.o
 | 
			
		||||
*.a
 | 
			
		||||
*.la
 | 
			
		||||
*.lai
 | 
			
		||||
*.so
 | 
			
		||||
*.dll
 | 
			
		||||
*.dylib
 | 
			
		||||
 | 
			
		||||
# Qt-es
 | 
			
		||||
 | 
			
		||||
*.pro.user
 | 
			
		||||
*.pro.user.*
 | 
			
		||||
moc_*.cpp
 | 
			
		||||
qrc_*.cpp
 | 
			
		||||
Makefile
 | 
			
		||||
Makefile.*
 | 
			
		||||
*-build-*
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
*.autosave
 | 
			
		||||
ui_*.h
 | 
			
		||||
version.h
 | 
			
		||||
version.txt
 | 
			
		||||
 | 
			
		||||
packages/*
 | 
			
		||||
*.pro.orig
 | 
			
		||||
Output/setup.exe
 | 
			
		||||
.directory
 | 
			
		||||
 | 
			
		||||
*~
 | 
			
		||||
resources/icons/*.png
 | 
			
		||||
resources/icons/*.jpg
 | 
			
		||||
resources/icons/*.gif
 | 
			
		||||
resources/style/*.qss
 | 
			
		||||
text/*.html
 | 
			
		||||
!text/*_template.html
 | 
			
		||||
text/*.xml
 | 
			
		||||
*.user
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								DCPlugin.pri
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								DCPlugin.pri
									
									
									
									
									
								
							@@ -2,7 +2,6 @@ INCLUDEPATH += $${PWD}/include
 | 
			
		||||
DEPENDPATH += $${PWD}
 | 
			
		||||
 | 
			
		||||
HEADERS += $${PWD}/include/com.h \
 | 
			
		||||
    $$PWD/include/datei.h \
 | 
			
		||||
    $${PWD}/include/controlBus.h \
 | 
			
		||||
    $${PWD}/include/datIf.h \
 | 
			
		||||
    $${PWD}/include/dcBL.h \
 | 
			
		||||
@@ -12,11 +11,11 @@ HEADERS += $${PWD}/include/com.h \
 | 
			
		||||
    $${PWD}/include/sendWRcmd.h \
 | 
			
		||||
    $${PWD}/include/storeINdata.h \
 | 
			
		||||
    $${PWD}/include/tslib.h \
 | 
			
		||||
    $${PWD}/include/shared_mem_buffer.h
 | 
			
		||||
    $${PWD}/include/shared_mem_buffer.h \
 | 
			
		||||
    $${PWD}/include/serial_port_thread.h \
 | 
			
		||||
    $${PWD}/include/serial_port_worker.h
 | 
			
		||||
 | 
			
		||||
SOURCES += $${PWD}/src/com.cpp \
 | 
			
		||||
    $$PWD/src/datei.cpp \
 | 
			
		||||
    $$PWD/src/main.cpp \
 | 
			
		||||
    $${PWD}/src/controlBus.cpp \
 | 
			
		||||
    $${PWD}/src/datIf.cpp \
 | 
			
		||||
    $${PWD}/src/dcBL.cpp \
 | 
			
		||||
@@ -25,4 +24,6 @@ SOURCES += $${PWD}/src/com.cpp \
 | 
			
		||||
    $${PWD}/src/sendWRcmd.cpp \
 | 
			
		||||
    $${PWD}/src/storeINdata.cpp \
 | 
			
		||||
    $${PWD}/src/tslib.cpp \
 | 
			
		||||
    $${PWD}/src/shared_mem_buffer.cpp
 | 
			
		||||
    $${PWD}/src/shared_mem_buffer.cpp \
 | 
			
		||||
    $${PWD}/src/serial_port_thread.cpp \
 | 
			
		||||
    $${PWD}/src/serial_port_worker.cpp
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								DCPlugin.pro
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								DCPlugin.pro
									
									
									
									
									
								
							@@ -15,9 +15,9 @@ QMAKE_CXXFLAGS += -Wno-deprecated-copy
 | 
			
		||||
ARCH = PTU5
 | 
			
		||||
 | 
			
		||||
contains( CONFIG, DesktopLinux ) {
 | 
			
		||||
    # QMAKE_CC = ccache $$QMAKE_CC
 | 
			
		||||
    # QMAKE_CXX = ccache $$QMAKE_CXX
 | 
			
		||||
    QMAKE_CXXFLAGS += -std=c++17
 | 
			
		||||
    QMAKE_CC = ccache $$QMAKE_CC
 | 
			
		||||
    QMAKE_CXX = ccache $$QMAKE_CXX
 | 
			
		||||
    QMAKE_CXXFLAGS += -std=c++11
 | 
			
		||||
    # QMAKE_CXXFLAGS += -Wno-deprecated-ctor
 | 
			
		||||
    linux-clang {  QMAKE_CXXFLAGS += -Qunused-arguments   }
 | 
			
		||||
    ARCH = DesktopLinux
 | 
			
		||||
@@ -27,7 +27,7 @@ contains( CONFIG, DesktopLinux ) {
 | 
			
		||||
contains( CONFIG, PTU5 ) {
 | 
			
		||||
    # QMAKE_CC = ccache $$QMAKE_CC
 | 
			
		||||
    # QMAKE_CXX = ccache $$QMAKE_CXX
 | 
			
		||||
    QMAKE_CXXFLAGS += -std=c++17
 | 
			
		||||
    QMAKE_CXXFLAGS += -std=c++11
 | 
			
		||||
    linux-clang {  QMAKE_CXXFLAGS += -Qunused-arguments   }
 | 
			
		||||
    CONFIG += link_pkgconfig
 | 
			
		||||
    ARCH = PTU5
 | 
			
		||||
@@ -38,8 +38,6 @@ contains( CONFIG, PTU5 ) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
contains( CONFIG, PTU5_YOCTO ) {
 | 
			
		||||
    greaterThan(QT_MAJOR_VERSION, 4): QT += serialport
 | 
			
		||||
    PTU5BASEPATH = /opt/devel/ptu5
 | 
			
		||||
    ARCH = PTU5
 | 
			
		||||
 | 
			
		||||
    # add qmqtt lib
 | 
			
		||||
@@ -47,9 +45,7 @@ contains( CONFIG, PTU5_YOCTO ) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TARGET   = CashAgentLib
 | 
			
		||||
#DESTDIR  = ../plugins
 | 
			
		||||
INTERFACE = DeviceController
 | 
			
		||||
INTERFACE_DEFINITION = $${PWD}/include/ATBAPP/DeviceControllerInterface.h
 | 
			
		||||
DESTDIR  = ../plugins
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# The following define makes your compiler emit warnings if you use
 | 
			
		||||
@@ -70,21 +66,3 @@ DEFINES += QT_DEPRECATED_WARNINGS
 | 
			
		||||
#else: unix:!android: target.path = /opt/$${TARGET}/bin
 | 
			
		||||
#!isEmpty(target.path): INSTALLS += target
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DISTFILES += \
 | 
			
		||||
    generate-version.sh
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Define how to create version.h
 | 
			
		||||
VERSION_H = $$PWD/include/version.h
 | 
			
		||||
version.output = $$PWD/include/version.h
 | 
			
		||||
version.commands = $$PWD/generate-version.sh $${ARCH} $${TARGET} $${INTERFACE} $${INTERFACE_DEFINITION} $${VERSION_H}
 | 
			
		||||
version.depends = FORCE
 | 
			
		||||
version.input = VERSION_H
 | 
			
		||||
version.variable_out = HEADERS
 | 
			
		||||
QMAKE_EXTRA_COMPILERS += version
 | 
			
		||||
QMAKE_CLEAN += $${PWD}/include/version.h
 | 
			
		||||
 | 
			
		||||
HEADERS +=
 | 
			
		||||
 
 | 
			
		||||
@@ -1,155 +0,0 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
VERSION_STRING=""
 | 
			
		||||
 | 
			
		||||
#GIT='/cygdrive/c/Program Files \(x86\)/Git/bin/git'
 | 
			
		||||
GIT=git
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
parse_git_branch () {
 | 
			
		||||
    $GIT branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/\1/"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ARCH=$1
 | 
			
		||||
TARGET=$2
 | 
			
		||||
INTERFACE=$3
 | 
			
		||||
INTERFACE_DEFINITION=$4
 | 
			
		||||
VERSION_H=$5
 | 
			
		||||
 | 
			
		||||
SCRIPT=$(readlink -f $0)
 | 
			
		||||
SCRIPTPATH=`dirname $SCRIPT`
 | 
			
		||||
OUTPUTDIR=$(pwd)
 | 
			
		||||
echo " current dir is : " $(pwd)
 | 
			
		||||
echo $SCRIPT
 | 
			
		||||
echo $SCRIPTPATH
 | 
			
		||||
 | 
			
		||||
echo "changing dir to script path: " $SCRIPTPATH
 | 
			
		||||
cd $SCRIPTPATH
 | 
			
		||||
 | 
			
		||||
# set version string ##################################################################
 | 
			
		||||
if [ -z $VERSION_STRING ] ; then
 | 
			
		||||
  VERSION_STRING=$(date +%Y%m%d_%H%M)
 | 
			
		||||
fi
 | 
			
		||||
GIT_DESCRIBE=$($GIT describe)
 | 
			
		||||
GIT_BRANCH=$(parse_git_branch)
 | 
			
		||||
 | 
			
		||||
# extract path from branchname:
 | 
			
		||||
IFS='_' read -ra TMP_ARRAY <<< "${GIT_BRANCH}"
 | 
			
		||||
BRANCH_PATH=${TMP_ARRAY[0]}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# detect if we have a development version:
 | 
			
		||||
if [ ${#TMP_ARRAY[1]} -gt 0 ] ; then
 | 
			
		||||
  DEV_SUFFIX="_dev"
 | 
			
		||||
else
 | 
			
		||||
  DEV_SUFFIX=""
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# detect if git status is dirty
 | 
			
		||||
GIT_DESCRIBE_DIRTY=$($GIT describe --dirty)
 | 
			
		||||
if [ "${GIT_DESCRIBE_DIRTY:(-6)}" == "-dirty" ] ; then
 | 
			
		||||
  DIRTY_SUFFIX="_dirty"
 | 
			
		||||
else
 | 
			
		||||
  DIRTY_SUFFIX=""
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if [ -n "$DIRTY_SUFFIX" ] || [ -n "$DEV_SUFFIX" ] ; then
 | 
			
		||||
  DEVDIRTY=true
 | 
			
		||||
else
 | 
			
		||||
  DEVDIRTY=false
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# extract interface definition 
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
#Q_DECLARE_INTERFACE(CCInterface,
 | 
			
		||||
#         "eu.atb.ptu.plugin.CCInterface/2.9.0")
 | 
			
		||||
# -> extract whole string within quotation marks
 | 
			
		||||
INTERFACE_VERSION=$(grep 'eu.atb.ptu.plugin.' ${INTERFACE_DEFINITION})
 | 
			
		||||
# get string within quotes:
 | 
			
		||||
INTERFACE_VERSION=`echo ${INTERFACE_VERSION} | awk -F \" '{print $2}'`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# write version.h
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
echo "     TARGET is: $TARGET"
 | 
			
		||||
echo "     ARCH   is: $ARCH"
 | 
			
		||||
echo " "
 | 
			
		||||
echo "     PluginName: $TARGET"
 | 
			
		||||
echo "     Interface:  $INTERFACE"
 | 
			
		||||
echo "     InterfaceVersion: $INTERFACE_VERSION"
 | 
			
		||||
echo " "
 | 
			
		||||
echo "     new version is:  $VERSION_STRING"
 | 
			
		||||
echo "     git describe is: $GIT_DESCRIBE"
 | 
			
		||||
echo "     git branch is:   $GIT_BRANCH"
 | 
			
		||||
echo "     branch-path is:  $BRANCH_PATH"
 | 
			
		||||
echo "  "
 | 
			
		||||
 | 
			
		||||
echo "     dev suffix:     $DEV_SUFFIX"
 | 
			
		||||
echo "     dirty suffix:   $DIRTY_SUFFIX"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
PLUGIN_VERSION=${VERSION_STRING}
 | 
			
		||||
#ATB_QT_GIT_DESCRIBE=${GIT_DESCRIBE}_${GIT_BRANCH}
 | 
			
		||||
PLUGIN_GIT_DESCRIBE=${GIT_DESCRIBE}_${BRANCH_PATH}${DEV_SUFFIX}${DIRTY_SUFFIX}
 | 
			
		||||
 | 
			
		||||
#TARGET=IngenicoZVT_CCPlugin
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# build version.h #####################################################################
 | 
			
		||||
 | 
			
		||||
echo "     building new version info (version.h) ..."
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
echo "#ifndef VERSION_H"   >  ${VERSION_H}
 | 
			
		||||
echo "#define VERSION_H"   >> ${VERSION_H}
 | 
			
		||||
echo ""                    >> ${VERSION_H}
 | 
			
		||||
echo ""                    >> ${VERSION_H}
 | 
			
		||||
echo "#define INTERFACE_VERSION \"${INTERFACE_VERSION}\""      >> ${VERSION_H}
 | 
			
		||||
echo "#define PLUGIN_VERSION \"${PLUGIN_VERSION}\""           >> ${VERSION_H}
 | 
			
		||||
echo ""                                                       >> ${VERSION_H}
 | 
			
		||||
echo "#define PLUGIN_GIT_DESCRIBE \"${PLUGIN_GIT_DESCRIBE}\"" >> ${VERSION_H}
 | 
			
		||||
echo ""                                                       >> ${VERSION_H}
 | 
			
		||||
echo ""                                                       >> ${VERSION_H}
 | 
			
		||||
 | 
			
		||||
cat <<EOT >> ${VERSION_H}
 | 
			
		||||
 | 
			
		||||
const std::string pluginInfoString = R"(
 | 
			
		||||
{
 | 
			
		||||
    "Interface": "${INTERFACE}",
 | 
			
		||||
    "InterfaceVersion": "${INTERFACE_VERSION}",
 | 
			
		||||
    "PluginName": "${TARGET}",
 | 
			
		||||
    "Version": "${PLUGIN_VERSION}",
 | 
			
		||||
    "git-describe": "${PLUGIN_GIT_DESCRIBE}",
 | 
			
		||||
}
 | 
			
		||||
)";
 | 
			
		||||
 | 
			
		||||
EOT
 | 
			
		||||
 | 
			
		||||
echo ""                                              >> ${VERSION_H}
 | 
			
		||||
echo ""                                              >> ${VERSION_H}
 | 
			
		||||
if [ ${DEVDIRTY} == "true" ] ; then
 | 
			
		||||
echo "#define DEVDIRTY"                              >> ${VERSION_H}
 | 
			
		||||
echo ""                                              >> ${VERSION_H}
 | 
			
		||||
echo ""                                              >> ${VERSION_H}
 | 
			
		||||
fi
 | 
			
		||||
echo "#define SYSTEM_ARCH \"${ARCH}\""               >> ${VERSION_H}
 | 
			
		||||
echo "#define ARCH_${ARCH}"                          >> ${VERSION_H}
 | 
			
		||||
echo ""                                              >> ${VERSION_H}
 | 
			
		||||
echo "" 					     >> ${VERSION_H}
 | 
			
		||||
echo "#endif //VERSION_H"  >> ${VERSION_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 *receivedData);
 | 
			
		||||
void gpi_storeRecPayLoad(uint8_t RdDlen, uint8_t const *receivedData);
 | 
			
		||||
    // stored by Datif
 | 
			
		||||
 | 
			
		||||
uint16_t epi_getLastPayLoad(uint16_t plBufSiz, uint8_t *payLoad);
 | 
			
		||||
 
 | 
			
		||||
@@ -303,7 +303,6 @@ 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;
 | 
			
		||||
@@ -316,6 +315,9 @@ 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);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										202
									
								
								include/datei.h
									
									
									
									
									
								
							
							
						
						
									
										202
									
								
								include/datei.h
									
									
									
									
									
								
							@@ -1,202 +0,0 @@
 | 
			
		||||
#ifndef DATEI_H
 | 
			
		||||
#define DATEI_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <QFile>
 | 
			
		||||
#include <QFileInfo>
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
#include "tslib.h"
 | 
			
		||||
#include <QString>
 | 
			
		||||
#include <QJsonDocument>
 | 
			
		||||
#include <QJsonObject>
 | 
			
		||||
#include <QJsonArray>
 | 
			
		||||
#include <QJsonParseError>
 | 
			
		||||
 | 
			
		||||
    // 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
 | 
			
		||||
@@ -78,7 +78,7 @@ uint8_t dcBL_getResult(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define RAW_BL_DATALEN      150
 | 
			
		||||
void gpi_storeRawReceivedData(uint8_t  RdDlen, uint8_t *receivedData);
 | 
			
		||||
void gpi_storeRawReceivedData(uint8_t  RdDlen, uint8_t const *receivedData);
 | 
			
		||||
 | 
			
		||||
uint8_t epi_getRawReceivedData(uint8_t *receivedData);
 | 
			
		||||
    // retval=length, will be zeroed after first reading
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										212
									
								
								include/hwapi.h
									
									
									
									
									
								
							
							
						
						
									
										212
									
								
								include/hwapi.h
									
									
									
									
									
								
							@@ -17,8 +17,71 @@ 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
 | 
			
		||||
@@ -26,13 +89,11 @@ matching interfaces.h:
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <QTabWidget>
 | 
			
		||||
#include <QtPlugin>
 | 
			
		||||
#include <QTimer>
 | 
			
		||||
#include <QObject>
 | 
			
		||||
#include <../plugins/interfaces.h>
 | 
			
		||||
#include "interfaces.h"
 | 
			
		||||
#include "datIf.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class QSharedMemory;
 | 
			
		||||
class hwapi :   public QObject,
 | 
			
		||||
                public hwinf
 | 
			
		||||
{
 | 
			
		||||
@@ -41,16 +102,32 @@ 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(QWidget *parent = nullptr);
 | 
			
		||||
    virtual ~hwapi();
 | 
			
		||||
 | 
			
		||||
    T_datif *myDatif;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    virtual QStringList dc_getStatus() const;
 | 
			
		||||
 | 
			
		||||
    // ------------------------------------------------------------------------------
 | 
			
		||||
    // commands, interface
 | 
			
		||||
    // Level 0 commands, interface
 | 
			
		||||
    // open, close, change serial interface
 | 
			
		||||
    // actually not neccessary as it is opened automatically on program start
 | 
			
		||||
    // start automatic READ requests
 | 
			
		||||
@@ -62,7 +139,7 @@ public:
 | 
			
		||||
        // ComName: for example "COM48"
 | 
			
		||||
        // connect: 0, 1
 | 
			
		||||
 | 
			
		||||
    void dc_closeSerial(void) const override;
 | 
			
		||||
    bool dc_closeSerial(void) const override;
 | 
			
		||||
 | 
			
		||||
    bool dc_isPortOpen(void) const override ;
 | 
			
		||||
 | 
			
		||||
@@ -70,10 +147,21 @@ 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<int> templateIdx,
 | 
			
		||||
                                  QVector<QString> fnames,
 | 
			
		||||
                                  QString br,
 | 
			
		||||
                                  QString serial = QString()) const override;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    bool dc_printTemplate(enum FileTypeJson type,
 | 
			
		||||
                          QVector<int> templateIdx,
 | 
			
		||||
                          QString br,
 | 
			
		||||
                          QString serial = QString()) const override;
 | 
			
		||||
    // ------------------------------------------------------------------------------
 | 
			
		||||
    // control device-controller (functions of µC)
 | 
			
		||||
    // Level 1, control device-controller (functions of µC)
 | 
			
		||||
    // check serial connection to deviceController
 | 
			
		||||
    // read response from DC2 (input data)
 | 
			
		||||
    // some test function for serial communication
 | 
			
		||||
@@ -160,15 +248,8 @@ public:
 | 
			
		||||
    uint8_t bl_exitBL(uint8_t *sendData) const override;
 | 
			
		||||
        // minimum size of sendData-buffer: 5byte  retval: length
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // ------------------------------------------------------------------------------
 | 
			
		||||
    // DC2-onboard devices
 | 
			
		||||
    // Level 2  DC2-onboard devices
 | 
			
		||||
    //          WR: set time
 | 
			
		||||
    //          RD. get time, get measure, get test results
 | 
			
		||||
    // ------------------------------------------------------------------------------
 | 
			
		||||
@@ -242,7 +323,7 @@ public:
 | 
			
		||||
    bool dc_mainFuseIsOk(void) const override;
 | 
			
		||||
 | 
			
		||||
    // ------------------------------------------------------------------------------
 | 
			
		||||
    // igital outputs and simple switching of connected devices
 | 
			
		||||
    // Level 3: digital outputs and simple switching of connected devices
 | 
			
		||||
    //          simple processes like flashing a led or open flap for 1s
 | 
			
		||||
    // ------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@@ -298,7 +379,7 @@ public:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // ------------------------------------------------------------------------------
 | 
			
		||||
    //  digital inputs of connected devices
 | 
			
		||||
    // Level 3: digital inputs of connected devices
 | 
			
		||||
    // ------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    bool door_isContactPowerOn(void) const override;
 | 
			
		||||
@@ -660,29 +741,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
 | 
			
		||||
@@ -723,11 +804,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
 | 
			
		||||
@@ -739,7 +820,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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -843,7 +924,7 @@ public:
 | 
			
		||||
    void bl_rebootDC(void) const override;
 | 
			
		||||
 | 
			
		||||
    void bl_startBL(void) const override;
 | 
			
		||||
    void bl_checkBL(void) const override;
 | 
			
		||||
    bool bl_checkBL(void) const override;
 | 
			
		||||
    bool bl_isUp(void) const override;
 | 
			
		||||
        // return true is bl is up and running
 | 
			
		||||
        // also initializes "sendFile"
 | 
			
		||||
@@ -920,7 +1001,6 @@ 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;
 | 
			
		||||
@@ -967,23 +1047,9 @@ 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
 | 
			
		||||
 | 
			
		||||
@@ -1017,22 +1083,11 @@ 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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1051,58 +1106,17 @@ 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_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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    void hwapi_vendStopByMax(void) const override;
 | 
			
		||||
    void hwapi_vendStopByPushbutton(void) const override;
 | 
			
		||||
 | 
			
		||||
 private slots:
 | 
			
		||||
    void hwapi_slotPrintFinished_OK(void);
 | 
			
		||||
    void hwapi_slotPrintFinished_Err(void);
 | 
			
		||||
    void hwapi_slotGotCoin(void);
 | 
			
		||||
    void hwapi_slotPayProc(void);
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1616
									
								
								include/interfaces.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1616
									
								
								include/interfaces.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -93,6 +93,9 @@ 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);
 | 
			
		||||
 
 | 
			
		||||
@@ -148,21 +148,23 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// highest priority
 | 
			
		||||
#define CMDSTACKDEPTH   16
 | 
			
		||||
// #define CMDSTACKDEPTH   16
 | 
			
		||||
// means: up to 16 cmd can be stored. They are issued one by one every 100ms
 | 
			
		||||
void sendWRcmd_clrCmdStack(void);
 | 
			
		||||
bool sendWRcmd_setSendCommand0(uint16_t nextCmd);
 | 
			
		||||
bool sendWRcmd_setSendCommand0(uint16_t nextCmd, uint8_t dat1=0, uint8_t dat2=0,
 | 
			
		||||
                               uint8_t dat3=0, uint8_t dat4=0);
 | 
			
		||||
    // GUI or app sends a command to DC transfered by serial
 | 
			
		||||
 | 
			
		||||
uint16_t sendWRcmd_getSendCommand0(void);
 | 
			
		||||
uint16_t sendWRcmd_getSendCommand0(uint8_t *dat1=0, uint8_t *dat2=0,
 | 
			
		||||
                                   uint8_t *dat3=0, uint8_t *dat4=0);
 | 
			
		||||
 | 
			
		||||
// lower priority
 | 
			
		||||
#define CMD4STACKDEPTH   8
 | 
			
		||||
// #define CMD4STACKDEPTH   8
 | 
			
		||||
void sendWRcmd_clrCmd4Stack(void);
 | 
			
		||||
bool sendWRcmd_setSendCommand4(uint16_t nextCmd, uint8_t dat1, uint8_t dat2, uint8_t dat3, uint8_t dat4);
 | 
			
		||||
uint16_t sendWRcmd_getSendCommand4(uint8_t *dat1, uint8_t *dat2, uint8_t *dat3, uint8_t *dat4);
 | 
			
		||||
 | 
			
		||||
#define CMD8STACKDEPTH   4
 | 
			
		||||
// #define CMD8STACKDEPTH   4
 | 
			
		||||
void sendWRcmd_clrCmd8Stack(void);
 | 
			
		||||
bool sendWRcmd_setSendCommand8(uint16_t nextCmd, uint8_t dat1, uint8_t dat2, uint16_t dat3, uint32_t dat4);
 | 
			
		||||
uint16_t sendWRcmd_getSendCommand8(uint8_t *dat1, uint8_t *dat2, uint16_t *dat3, uint32_t *dat4);
 | 
			
		||||
@@ -171,7 +173,7 @@ uint16_t sendWRcmd_getSendCommand8(uint8_t *dat1, uint8_t *dat2, uint16_t *dat3,
 | 
			
		||||
 | 
			
		||||
// lowest priority
 | 
			
		||||
// wait for resonse before send next!
 | 
			
		||||
bool sendWRcmd_setSendBlock160(uint8_t leng, uint8_t *buf);
 | 
			
		||||
bool sendWRcmd_setSendBlock160(uint8_t leng, uint8_t const *buf);
 | 
			
		||||
uint8_t sendWRcmd_getSendBlock160(uint8_t *leng, uint8_t *buf);
 | 
			
		||||
    // retval = *leng
 | 
			
		||||
 | 
			
		||||
@@ -179,7 +181,7 @@ void sendWRcmd_INI(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint8_t epi_store64ByteSendData(uint8_t length, uint8_t *buf);
 | 
			
		||||
uint8_t epi_store64ByteSendData(uint8_t length, uint8_t const *buf);
 | 
			
		||||
    // HWapi writes data to be forwarded to DC and further to mdb-device
 | 
			
		||||
    // not batched! don't use twice within 100ms
 | 
			
		||||
 | 
			
		||||
@@ -211,15 +213,8 @@ uint8_t gpi_getUserOfSendingTextBuffer(uint8_t *para1, uint8_t *para2, uint8_t *
 | 
			
		||||
    // user=1: Text-Print is using this buffer
 | 
			
		||||
    //      2: QR-code-Printer is using this buffer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define     FDCMD_STACKDEPTH    16
 | 
			
		||||
//#define     FDCMD_STACKDEPTH    16
 | 
			
		||||
void sendFDcmd_clrStack(void);
 | 
			
		||||
 | 
			
		||||
bool sendFDcmd_set(uint8_t nextWrCmd, uint8_t nextRdCmd, uint8_t blockNum, uint8_t dat1, uint8_t dat2, uint8_t dat3, uint8_t dat4);
 | 
			
		||||
    // write Command to memory, wait for transport
 | 
			
		||||
bool sendFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, uint8_t *dat1, uint8_t *dat2, uint8_t *dat3, uint8_t *dat4);
 | 
			
		||||
@@ -227,35 +222,23 @@ 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);
 | 
			
		||||
bool longFDcmd_set(uint8_t nextWrCmd, uint8_t nextRdCmd, uint8_t blockNum, uint8_t length, uint8_t *data);
 | 
			
		||||
void longFDcmd_clrStack(void);
 | 
			
		||||
bool longFDcmd_set(uint8_t nextWrCmd, uint8_t nextRdCmd, uint8_t blockNum, uint8_t length, uint8_t const *data);
 | 
			
		||||
    // write Command to memory, wait for transport
 | 
			
		||||
    // data buffer size always 64! data[64], padded with 0
 | 
			
		||||
//bool longFDcmd_get(uint8_t *nextWrCmd, uint8_t *nextRdCmd, uint8_t *blockNum, uint8_t *length, uint8_t *data);
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								include/serial_port_thread.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								include/serial_port_thread.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
#ifndef SERIAL_PORT_THREAD_H_INCLUDED
 | 
			
		||||
#define SERIAL_PORT_THREAD_H_INCLUDED
 | 
			
		||||
 | 
			
		||||
#include <QThread>
 | 
			
		||||
#include <QString>
 | 
			
		||||
#include <QEventLoop>
 | 
			
		||||
 | 
			
		||||
class SerialPortThread : public QThread {
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
 | 
			
		||||
    QEventLoop m_loop;
 | 
			
		||||
public:
 | 
			
		||||
    SerialPortThread(QObject *parent = nullptr);
 | 
			
		||||
    virtual ~SerialPortThread();
 | 
			
		||||
 | 
			
		||||
    virtual void run() override;
 | 
			
		||||
 | 
			
		||||
    QEventLoop &getEventLoop() { return m_loop; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif // SERIAL_PORT_THREAD_H_INCLUDED
 | 
			
		||||
							
								
								
									
										121
									
								
								include/serial_port_worker.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								include/serial_port_worker.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,121 @@
 | 
			
		||||
#ifndef SERIAL_PORT_WORKER_H_INCLUDED
 | 
			
		||||
#define SERIAL_PORT_WORKER_H_INCLUDED
 | 
			
		||||
 | 
			
		||||
#include <QObject>
 | 
			
		||||
#include <QString>
 | 
			
		||||
#include <QTimer>
 | 
			
		||||
#include <QSerialPort>
 | 
			
		||||
#include <QSerialPortInfo>
 | 
			
		||||
#include <QThread>
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <condition_variable>
 | 
			
		||||
#include <mutex>
 | 
			
		||||
#include <queue>
 | 
			
		||||
#include <deque>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <atomic>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct Command {
 | 
			
		||||
    enum : uint16_t {PRIORITY_1, PRIORITY_2, PRIORITY_3, PRIORITY_4, END_MARK};
 | 
			
		||||
    enum : uint16_t {QUIT_SENTINEL = 0x1000, SEND_BLOCK_SIZE = 160};
 | 
			
		||||
    uint32_t m_priority;
 | 
			
		||||
    uint16_t m_priorityClass;
 | 
			
		||||
    uint16_t m_cmdId;
 | 
			
		||||
    char    *m_sendBuffer;
 | 
			
		||||
    char    *m_recvBuffer;
 | 
			
		||||
    uint8_t m_sendBufferLength;
 | 
			
		||||
    uint8_t m_recvBufferLength; // expected result length
 | 
			
		||||
 | 
			
		||||
    static std::atomic<uint8_t> m_nextSendBufferIndex;
 | 
			
		||||
    static std::atomic<uint8_t> m_nextRecvBufferIndex;
 | 
			
		||||
    static char m_sendBuffers[256][SEND_BLOCK_SIZE];
 | 
			
		||||
    static char m_recvBuffers[256][SEND_BLOCK_SIZE];
 | 
			
		||||
 | 
			
		||||
    static uint32_t getNextCommandPriority(uint8_t cmdType);
 | 
			
		||||
    static char *getNextSendBuffer();
 | 
			
		||||
    static char *getNextRecvBuffer();
 | 
			
		||||
 | 
			
		||||
 public:
 | 
			
		||||
    Command(uint16_t cmdId, uint8_t sendBufferLength, uint8_t recvBufferLength, uint8_t priorityClass);
 | 
			
		||||
    Command();
 | 
			
		||||
 | 
			
		||||
    friend bool operator< (Command const& lhs, Command const& rhs) {
 | 
			
		||||
        return lhs.m_priority < rhs.m_priority;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    friend std::ostream& operator<< (std::ostream& os, Command const& cmd) {
 | 
			
		||||
        return os << "{ " << cmd.m_priority << ", '" << cmd.m_priority << "' } ";
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// \brief SerialPortWorker
 | 
			
		||||
///
 | 
			
		||||
/// SerialPortWorker sends and receives data from serial port
 | 
			
		||||
///
 | 
			
		||||
class SerialPortWorker : public QThread {
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
 | 
			
		||||
    /// \brief Internal serial port.
 | 
			
		||||
    QSerialPort m_serialPort;
 | 
			
		||||
 | 
			
		||||
    /// \brief Internal serial port info.
 | 
			
		||||
    QSerialPortInfo m_serialPortInfo;
 | 
			
		||||
 | 
			
		||||
    /// \brief Flag indicating if serial port is opened.
 | 
			
		||||
    bool m_serialPortOpened;
 | 
			
		||||
 | 
			
		||||
    /// \brief Port name of serial port.
 | 
			
		||||
    QString     m_portName;
 | 
			
		||||
 | 
			
		||||
    /// \brief Baudrate of internal serial port.
 | 
			
		||||
    enum QSerialPort::BaudRate m_baudRate;
 | 
			
		||||
 | 
			
		||||
    std::priority_queue<Command, std::deque<Command>> m_sendQueue;
 | 
			
		||||
    std::deque<Command> m_recvQueue;
 | 
			
		||||
    std::mutex m_sendQueueMutex;
 | 
			
		||||
    std::mutex m_recvQueueMutex;
 | 
			
		||||
    std::condition_variable m_sendQueueCondVar;
 | 
			
		||||
    std::condition_variable m_recvQueueCondVar;
 | 
			
		||||
 | 
			
		||||
    std::atomic<uint32_t> m_bytesWritten;
 | 
			
		||||
    std::atomic<uint32_t> m_bytesAvailable;
 | 
			
		||||
 | 
			
		||||
    SerialPortWorker(QString portName, QSerialPort::BaudRate baudRate, QObject *parent = nullptr);
 | 
			
		||||
 | 
			
		||||
    Command getNextCommand();
 | 
			
		||||
    void insertResult(Command const &result);
 | 
			
		||||
 | 
			
		||||
    enum : uint16_t {TIMEOUT = 100, WAIT_TIME_MAX = 1000};
 | 
			
		||||
 | 
			
		||||
  public:
 | 
			
		||||
    ~SerialPortWorker();
 | 
			
		||||
 | 
			
		||||
    SerialPortWorker(SerialPortWorker const &) = delete;
 | 
			
		||||
    void operator=(SerialPortWorker const &) = delete;
 | 
			
		||||
 | 
			
		||||
    // serial port im plugin anlegen. erst dann kann getInstance() benutzt werden
 | 
			
		||||
    static SerialPortWorker &getInstance(QString portName, QSerialPort::BaudRate baudRate, QObject *parent = nullptr) {
 | 
			
		||||
        static SerialPortWorker serialPortWorker(portName, baudRate, parent);
 | 
			
		||||
        return serialPortWorker;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool openSerialPort();
 | 
			
		||||
    void closeSerialPort();
 | 
			
		||||
 | 
			
		||||
    bool isPortOpen() const { return m_serialPortOpened; }
 | 
			
		||||
 | 
			
		||||
    void insertCommand(Command const &cmd);
 | 
			
		||||
    bool getNextResult(Command &result, int timeout = 1000);
 | 
			
		||||
 | 
			
		||||
    virtual void run() override;
 | 
			
		||||
 | 
			
		||||
    void quit();
 | 
			
		||||
 | 
			
		||||
private slots:
 | 
			
		||||
    void getBytesAvailable();
 | 
			
		||||
    bool getNumberOfBytesWritten(qint64);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // SERIAL_PORT_WORKER_H_INCLUDED
 | 
			
		||||
@@ -6,12 +6,32 @@
 | 
			
		||||
 | 
			
		||||
#include <QSharedMemory>
 | 
			
		||||
 | 
			
		||||
// TODO: pid eintragen und convars/mutexe eintragen
 | 
			
		||||
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
// PTHREAD_PROCESS_SHARED
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
// WIN32
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct SharedMemBuffer {
 | 
			
		||||
    int init;
 | 
			
		||||
    char appName[32];
 | 
			
		||||
    pid_t pid;
 | 
			
		||||
    pthread_condattr_t sndCndA;
 | 
			
		||||
    pthread_cond_t sndCndV;
 | 
			
		||||
    pthread_mutexattr_t sndMtxA;
 | 
			
		||||
    pthread_mutex_t sndMtx;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    pthread_condattr_t rcvCndA;
 | 
			
		||||
    pthread_cond_t rcvCndV;
 | 
			
		||||
    pthread_mutexattr_t rcvMtxA;
 | 
			
		||||
    pthread_mutex_t rcvMtx;
 | 
			
		||||
 | 
			
		||||
    struct rs {
 | 
			
		||||
        char comportName[16]; // z.B. "COM48"
 | 
			
		||||
@@ -24,109 +44,130 @@ struct SharedMemBuffer {
 | 
			
		||||
    char AutoEmissionOn;     // 1: zyklisch Anfragen zum Slave senden
 | 
			
		||||
 | 
			
		||||
    struct datif {
 | 
			
		||||
#define DATIF_MAXCMDS 16
 | 
			
		||||
        uint16_t sendingPeriod;
 | 
			
		||||
        bool     sendingPer_changed;
 | 
			
		||||
        uint8_t  OutCmdpara1;
 | 
			
		||||
        uint8_t  OutCmdpara2;
 | 
			
		||||
        uint8_t  OutCmdpara3;
 | 
			
		||||
        uint8_t  OutCmdpara4;
 | 
			
		||||
        uint16_t OutCmdpara5;
 | 
			
		||||
        uint32_t OutCmdpara6;
 | 
			
		||||
        uint8_t  dataStep;
 | 
			
		||||
        uint8_t  scanStep;
 | 
			
		||||
        uint8_t  RDBLKNR;
 | 
			
		||||
        uint8_t  cycl_running;
 | 
			
		||||
    } datif;
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
    // controlBus.cpp
 | 
			
		||||
    char        txt4comStateLine[32];
 | 
			
		||||
    char        txt4HsStateLine[32];
 | 
			
		||||
    char        txt4masterStateLine[32];
 | 
			
		||||
    char        txt4resultStateLine[32];
 | 
			
		||||
    char        txt4dataLine[32];
 | 
			
		||||
    char        txt4datifReceive[32];
 | 
			
		||||
    char        txt4diagWindow[32];
 | 
			
		||||
    char        sndTxt4diagWindow[32];
 | 
			
		||||
    bool        Sdata_serialTestResult[32];
 | 
			
		||||
    uint8_t     Sdata_pProtResultOk[32];
 | 
			
		||||
    uint16_t    Sdata_receivedDataLength[32];
 | 
			
		||||
    uint8_t     Sdata_receivedDataBlock[64];
 | 
			
		||||
    struct txt4 {
 | 
			
		||||
        char comStateLine[32];
 | 
			
		||||
        char HsStateLine[32];
 | 
			
		||||
        char masterStateLine[32];
 | 
			
		||||
        char resultStateLine[32];
 | 
			
		||||
        char dataLine[32];
 | 
			
		||||
        char datifReceive[32];
 | 
			
		||||
        char diagWindow[32];
 | 
			
		||||
        char sndDiagWindow[32];
 | 
			
		||||
    } txt4;
 | 
			
		||||
 | 
			
		||||
    // datif.cpp
 | 
			
		||||
    uint8_t     dif_dataStep;
 | 
			
		||||
    uint8_t     dif_scanStep;
 | 
			
		||||
    uint8_t     RDBLKNR;
 | 
			
		||||
    uint8_t     datif_OutCmdpara1;
 | 
			
		||||
    uint8_t     datif_OutCmdpara2;
 | 
			
		||||
    uint8_t     datif_OutCmdpara3;
 | 
			
		||||
    uint8_t     datif_OutCmdpara4;
 | 
			
		||||
    struct dcBL {
 | 
			
		||||
#define SIZEBLRESP      50
 | 
			
		||||
#define RAW_BL_DATALEN 150
 | 
			
		||||
        uint8_t  LastBLcmd;   // stored the last sent cmd in order to analys response
 | 
			
		||||
        uint8_t  AtbBinFile[300000];
 | 
			
		||||
        uint32_t fileSize;
 | 
			
		||||
        uint16_t nrOfBlocks;
 | 
			
		||||
        uint16_t fileCrc;
 | 
			
		||||
        uint8_t  myBuf[300000]; // same content like "dcBL_AtbBinFile" but bytewise
 | 
			
		||||
        char     Resp[SIZEBLRESP][32];
 | 
			
		||||
        int      pResp;
 | 
			
		||||
        uint8_t  step;
 | 
			
		||||
        uint8_t  state;
 | 
			
		||||
        uint16_t BlkCtr;
 | 
			
		||||
        uint16_t cyclCtr;
 | 
			
		||||
        uint16_t repeatCtr;
 | 
			
		||||
    } dcBL;
 | 
			
		||||
 | 
			
		||||
    uint16_t    datif_OutCmdpara5;
 | 
			
		||||
    uint32_t    datif_OutCmdpara6;
 | 
			
		||||
    uint8_t     cycl_running;
 | 
			
		||||
    struct {
 | 
			
		||||
        uint16_t shutterTime;
 | 
			
		||||
        char ticketTemplate[1024];
 | 
			
		||||
    } hwapi;
 | 
			
		||||
 | 
			
		||||
    // dcBL.cpp
 | 
			
		||||
    uint8_t     dcBL_LastBLcmd;   // stored the last sent cmd in order to analys response
 | 
			
		||||
    uint8_t     dcBL_AtbBinFile[300000];
 | 
			
		||||
    uint32_t    dcBL_fileSize;
 | 
			
		||||
    uint16_t    dcBL_nrOfBlocks;
 | 
			
		||||
    uint16_t    dcBL_fileCrc;
 | 
			
		||||
    uint8_t     dcBL_myBuf[300000]; // same content like "dcBL_AtbBinFile" but bytewise
 | 
			
		||||
    struct {
 | 
			
		||||
        uint8_t  sendAsynchDataBuf[160]; // no stack, only ONE buffer
 | 
			
		||||
        uint8_t  sendAsyDatLen;
 | 
			
		||||
    } next;
 | 
			
		||||
 | 
			
		||||
    char        BlResp[50][32];
 | 
			
		||||
    uint8_t     dcBL_step;
 | 
			
		||||
    uint8_t     dcBL_state;
 | 
			
		||||
    uint16_t    dcBL_BlkCtr;
 | 
			
		||||
    uint16_t    dcBL_cyclCtr;
 | 
			
		||||
    uint16_t    repeatCtr;
 | 
			
		||||
    uint8_t     Sdata_rawData[150];
 | 
			
		||||
    uint8_t     Sdata_LengthRawData;
 | 
			
		||||
    struct { // highest priority
 | 
			
		||||
#define CMDSTACKDEPTH  16
 | 
			
		||||
        // up to 16 cmd can be stored. They are issued one by one every 100ms
 | 
			
		||||
        uint16_t AsynchSend[CMDSTACKDEPTH];
 | 
			
		||||
        uint8_t  para1[CMDSTACKDEPTH];  /* used to streamline source */
 | 
			
		||||
        uint8_t  para2[CMDSTACKDEPTH];  /* used to streamline source */
 | 
			
		||||
        uint8_t  para3[CMDSTACKDEPTH];  /* used to streamline source */
 | 
			
		||||
        uint8_t  para4[CMDSTACKDEPTH];  /* used to streamline source */
 | 
			
		||||
        uint8_t  nrOfCmdsInQueue;
 | 
			
		||||
    } Cmd0;
 | 
			
		||||
 | 
			
		||||
    // hwapi.cpp
 | 
			
		||||
    uint16_t    hwapi_shutterTime;
 | 
			
		||||
    char        ticketTemplate[1024];
 | 
			
		||||
    struct { // lower priority
 | 
			
		||||
             // Command Stack for commands with 4 parameters
 | 
			
		||||
#define CMD4STACKDEPTH   8
 | 
			
		||||
        uint16_t AsynchSend[CMD4STACKDEPTH];
 | 
			
		||||
        uint8_t  para1[CMD4STACKDEPTH];
 | 
			
		||||
        uint8_t  para2[CMD4STACKDEPTH];
 | 
			
		||||
        uint8_t  para3[CMD4STACKDEPTH];
 | 
			
		||||
        uint8_t  para4[CMD4STACKDEPTH];
 | 
			
		||||
        uint8_t  nrOfCmdsInQueue;
 | 
			
		||||
    } Cmd4;
 | 
			
		||||
 | 
			
		||||
    // sendWRcmd.cpp
 | 
			
		||||
    uint16_t    nextAsynchsendCmd0[16];
 | 
			
		||||
    uint8_t     nrOfCmdsInQueue;
 | 
			
		||||
    uint16_t    nextAsynchsendCmd4[8];
 | 
			
		||||
    uint8_t     nextCmd4para1[8];
 | 
			
		||||
    uint8_t     nextCmd4para2[8];
 | 
			
		||||
    uint8_t     nextCmd4para3[8];
 | 
			
		||||
    uint8_t     nextCmd4para4[8];
 | 
			
		||||
    uint8_t     nrOfCmds4InQueue;
 | 
			
		||||
    uint16_t    nextAsynchsendCmd8[4];
 | 
			
		||||
    uint8_t     nextCmd8para1[4];
 | 
			
		||||
    uint8_t     nextCmd8para2[4];
 | 
			
		||||
    uint16_t    nextCmd8para3[4];
 | 
			
		||||
    uint32_t    nextCmd8para4[4];
 | 
			
		||||
    uint8_t     nrOfCmds8InQueue;
 | 
			
		||||
    uint8_t     sendAsynchDataBuf[160]; // no stack, only ONE buffer
 | 
			
		||||
    uint8_t     sendAsyDatLen;
 | 
			
		||||
    uint8_t     Sdata_mdbSendBuffer[64];
 | 
			
		||||
    uint8_t     Sdata_mdbSendLen;
 | 
			
		||||
    uint8_t     prnDataParameters[4];
 | 
			
		||||
    uint8_t     prnDataBufferUser;
 | 
			
		||||
    char        Sdata_PRN_TEXT[20][64];
 | 
			
		||||
    uint8_t     pPrnDataBuff;        // points to next PRINTER_BLOCK
 | 
			
		||||
    uint8_t     nextFDwrCmd[16];
 | 
			
		||||
    uint8_t     nextFDrdCmd[16];
 | 
			
		||||
    uint8_t     nextFDblkNr[16];
 | 
			
		||||
    struct {
 | 
			
		||||
#define CMD8STACKDEPTH   4
 | 
			
		||||
        uint16_t AsynchSend[CMD8STACKDEPTH];
 | 
			
		||||
        uint8_t  para1[CMD8STACKDEPTH];
 | 
			
		||||
        uint8_t  para2[CMD8STACKDEPTH];
 | 
			
		||||
        uint16_t para3[CMD8STACKDEPTH];
 | 
			
		||||
        uint32_t para4[CMD8STACKDEPTH];
 | 
			
		||||
        uint8_t  nrOfCmdsInQueue;
 | 
			
		||||
    } Cmd8;
 | 
			
		||||
 | 
			
		||||
    uint8_t     nextFDpara1[16];
 | 
			
		||||
    uint8_t     nextFDpara2[16];
 | 
			
		||||
    uint8_t     nextFDpara3[16];
 | 
			
		||||
    uint8_t     nextFDpara4[16];
 | 
			
		||||
    uint8_t     p_nextFDcmdsInQueue;
 | 
			
		||||
    uint8_t     longFDwrCmd[16];
 | 
			
		||||
    uint8_t     longFDrdCmd[16];
 | 
			
		||||
    uint8_t     longFDblkNr[16];
 | 
			
		||||
    uint8_t     longFDlength[16];
 | 
			
		||||
    struct { // short command, 4 data bytes
 | 
			
		||||
#define FDCMD_STACKDEPTH 16
 | 
			
		||||
        uint8_t  wrCmd[FDCMD_STACKDEPTH];
 | 
			
		||||
        uint8_t  rdCmd[FDCMD_STACKDEPTH];
 | 
			
		||||
        uint8_t  blkNr[FDCMD_STACKDEPTH];
 | 
			
		||||
        uint8_t  para1[FDCMD_STACKDEPTH];
 | 
			
		||||
        uint8_t  para2[FDCMD_STACKDEPTH];
 | 
			
		||||
        uint8_t  para3[FDCMD_STACKDEPTH];
 | 
			
		||||
        uint8_t  para4[FDCMD_STACKDEPTH];
 | 
			
		||||
        uint8_t  cmdsInQueue;
 | 
			
		||||
    } FDShort;
 | 
			
		||||
 | 
			
		||||
    uint8_t     longFDpara[16][64];
 | 
			
		||||
    uint8_t     p_longFDcmdsInQueue;
 | 
			
		||||
    struct { // long command, 64 data bytes
 | 
			
		||||
#define FDLONG_STACKDEPTH 16
 | 
			
		||||
        uint8_t wrCmd[FDLONG_STACKDEPTH];
 | 
			
		||||
        uint8_t rdCmd[FDLONG_STACKDEPTH];
 | 
			
		||||
        uint8_t blkNr[FDLONG_STACKDEPTH];
 | 
			
		||||
        uint8_t length[FDLONG_STACKDEPTH];
 | 
			
		||||
        uint8_t para[FDLONG_STACKDEPTH][64];
 | 
			
		||||
        uint8_t cmdsInQueue;
 | 
			
		||||
    } FDLong;
 | 
			
		||||
 | 
			
		||||
    // storeInData.cpp
 | 
			
		||||
    bool        indat_savePrnPwr;
 | 
			
		||||
    bool        indat_saveMifPwr;
 | 
			
		||||
    bool        indat_MdbIsOn;
 | 
			
		||||
#endif
 | 
			
		||||
    struct {
 | 
			
		||||
        uint8_t DataParameters[4];
 | 
			
		||||
        uint8_t DataBufferUser;
 | 
			
		||||
        uint8_t pDataBuff;        // points to next PRINTER_BLOCK
 | 
			
		||||
    } prn;
 | 
			
		||||
 | 
			
		||||
    uint8_t     ndbs;
 | 
			
		||||
    uint8_t     pari;
 | 
			
		||||
    uint8_t     nsb;
 | 
			
		||||
    uint8_t     br;
 | 
			
		||||
    struct {
 | 
			
		||||
        bool savePrnPwr;
 | 
			
		||||
        bool saveMifPwr;
 | 
			
		||||
        bool MdbIsOn;
 | 
			
		||||
    } indat;
 | 
			
		||||
 | 
			
		||||
    uint8_t ndbs;
 | 
			
		||||
    uint8_t pari;
 | 
			
		||||
    uint8_t nsb;
 | 
			
		||||
    uint8_t br;
 | 
			
		||||
 | 
			
		||||
#define MAXNROF_GENSTR 16
 | 
			
		||||
    char        genStrings[MAXNROF_GENSTR][64];
 | 
			
		||||
@@ -176,10 +217,13 @@ struct SharedMemBuffer {
 | 
			
		||||
#define NROFMIFSTATEBYTES       40
 | 
			
		||||
#define PRN_STATE_ARRAY_SIZE    20
 | 
			
		||||
#define PRN_STATE_FONT_SIZE     20
 | 
			
		||||
#define MAXNROF_PRNBYTES   64
 | 
			
		||||
#define MAXNROF_PRNBLOCKS  20
 | 
			
		||||
        uint8_t MIF_STATE[NROFMIFSTATEBYTES];
 | 
			
		||||
        uint8_t MIF_DATA[12][64];
 | 
			
		||||
        uint8_t PRN_STATE[PRN_STATE_ARRAY_SIZE];
 | 
			
		||||
        uint8_t PRN_FONTS[PRN_STATE_FONT_SIZE];
 | 
			
		||||
        char PRN_TEXT[MAXNROF_PRNBLOCKS][MAXNROF_PRNBYTES];
 | 
			
		||||
        bool mdb_busRdy;
 | 
			
		||||
        bool mdb_V12on;
 | 
			
		||||
        bool mdb_V5on;
 | 
			
		||||
@@ -199,12 +243,15 @@ struct SharedMemBuffer {
 | 
			
		||||
        uint8_t pProtResultOk;
 | 
			
		||||
        uint16_t receivedDataLength;
 | 
			
		||||
        uint8_t receivedDataBlock[64];
 | 
			
		||||
        uint8_t rawData[150];
 | 
			
		||||
        uint8_t LengthRawData;
 | 
			
		||||
        uint8_t mdbSendBuffer[64];
 | 
			
		||||
        uint8_t mdbSendLen;
 | 
			
		||||
    } Sdata;
 | 
			
		||||
 | 
			
		||||
    uint8_t mif_cardType;
 | 
			
		||||
    uint8_t mif_cardHolder[8];
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
#define MEMDEPTH_GOTCOINS (16)
 | 
			
		||||
    struct T_coin {
 | 
			
		||||
        uint8_t valid;
 | 
			
		||||
@@ -214,7 +261,6 @@ struct SharedMemBuffer {
 | 
			
		||||
        uint16_t value;
 | 
			
		||||
    } gotCoin[MEMDEPTH_GOTCOINS];
 | 
			
		||||
    uint8_t ctr_gotCoin;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    struct store {
 | 
			
		||||
        uint32_t insertedAmount;
 | 
			
		||||
 
 | 
			
		||||
@@ -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,9 +32,6 @@ 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);
 | 
			
		||||
 | 
			
		||||
@@ -43,29 +40,16 @@ 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();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -95,7 +79,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
 | 
			
		||||
 | 
			
		||||
@@ -144,185 +128,119 @@ void gpi_storeDI_optos(uint8_t indatOpto);
 | 
			
		||||
uint8_t epi_getDI_optos(void);
 | 
			
		||||
    // bit0: opto in 1    1: opto in 2
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
uint8_t gpi_storeDI_auxIn(uint8_t indatAuxIn); // Aux0...5
 | 
			
		||||
uint8_t epi_getDI_auxIn(void);                 // bit0: auxin 1  ...  5: auxin 6
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_ptuWake(bool w);
 | 
			
		||||
bool epi_getDI_ptuWake(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_mbdWake(uint8_t indat);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_mbdWake(bool w);
 | 
			
		||||
bool epi_getDI_mdbWake(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_prnReady(uint8_t indat);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_prnReady(bool ready);
 | 
			
		||||
bool epi_getDI_prnReady(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_CoinAttach(uint8_t indat);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_CoinAttach(bool attach);
 | 
			
		||||
bool epi_getDI_CoinAttach(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_CoinEscrow(uint8_t indat);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_CoinEscrow(bool ce);
 | 
			
		||||
bool epi_getDI_CoinEscrow(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_mifareCardTapped(uint8_t indat);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_mifareCardTapped(bool tapped);
 | 
			
		||||
bool epi_getDI_mifareCardTapped(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_modemWake(uint8_t indat);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_modemWake(bool w);
 | 
			
		||||
bool epi_getDI_modemWake(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_contactPowerIsOn(bool di_contact_PwrOn);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_contactPowerIsOn(bool on);
 | 
			
		||||
bool epi_getDI_contactPwr(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_MifarePowerIsOn(bool di_mifare_PwrOn);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_MifarePowerIsOn(bool on);
 | 
			
		||||
bool epi_getDI_mifarePwr(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_readbackMdbTxD(bool di_rdbkMdbTxd);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_readbackMdbTxD(bool rdbkMdbTxd);
 | 
			
		||||
bool epi_getDI_mdbTxd(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_AuxPowerIsOn(bool di_Aux_PwrOn);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_AuxPowerIsOn(bool on);
 | 
			
		||||
bool epi_getDI_auxPwr(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_GsmPowerIsOn(bool di_gsm_PwrOn);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_GsmPowerIsOn(bool on);
 | 
			
		||||
bool epi_getDI_gsmPwr(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_CreditPowerIsOn(bool di_credit_PwrOn);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_CreditPowerIsOn(bool on);
 | 
			
		||||
bool epi_getDI_creditPwr(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_PrinterPowerIsOn(bool di_printer_PwrOn);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_PrinterPowerIsOn(bool on);
 | 
			
		||||
bool epi_getDI_printerPwr(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_MdbPowerIsOn(bool di_mdb_PwrOn);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_MdbPowerIsOn(bool on);
 | 
			
		||||
bool epi_getDI_mdbPwr(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_rejMot_home(bool di);
 | 
			
		||||
 | 
			
		||||
bool gpi_storeDI_rejMot_home(bool reject);
 | 
			
		||||
bool epi_getDI_rejectMotor_homepos(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDI_paperLow(uint8_t di);
 | 
			
		||||
 | 
			
		||||
uint8_t 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
 | 
			
		||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
void gpi_storeDO_mdbRxTst(uint8_t do_mbdRxTst);
 | 
			
		||||
 | 
			
		||||
uint8_t gpi_storeDO_mdbRxTst(uint8_t do_mbdRxTst);
 | 
			
		||||
bool epi_getDO_mdbRxTestOut(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeDO_motorOutputs(uint8_t Pwr);
 | 
			
		||||
 | 
			
		||||
uint8_t 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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeDO_serialSwitch(uint8_t state);
 | 
			
		||||
uint8_t 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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeDO_ledsAndFan(uint8_t ledState);
 | 
			
		||||
 | 
			
		||||
uint8_t 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);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDO_sirenAndRelay(uint8_t sirenRelay);
 | 
			
		||||
 | 
			
		||||
uint8_t gpi_storeDO_sirenAndRelay(uint8_t sirenRelay);
 | 
			
		||||
bool epi_getDO_sirene(void);
 | 
			
		||||
 | 
			
		||||
bool epi_getDO_relay(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDO_ptuWake(uint8_t state);
 | 
			
		||||
 | 
			
		||||
uint8_t gpi_storeDO_ptuWake(uint8_t state);
 | 
			
		||||
bool epi_getDO_ptuWake(void);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDO_auxPower(uint8_t pwr);
 | 
			
		||||
 | 
			
		||||
uint8_t gpi_storeDO_auxPower(uint8_t pwr);
 | 
			
		||||
bool epi_getDO_auxPower(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeDO_coinShutter(uint8_t state);
 | 
			
		||||
 | 
			
		||||
uint8_t gpi_storeDO_coinShutter(uint8_t state);
 | 
			
		||||
bool epi_getDO_coinShutterOpen(void);
 | 
			
		||||
 | 
			
		||||
bool epi_getDO_coinShutterTest(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeDO_coinEscrow(uint8_t state);
 | 
			
		||||
 | 
			
		||||
uint8_t 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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeDO_printerPwrOn(uint8_t state);
 | 
			
		||||
 | 
			
		||||
uint8_t gpi_storeDO_printerPwrOn(uint8_t state);
 | 
			
		||||
uint8_t epi_getDO_printerPwr(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// ---------------------------------------------------------------------------------------------
 | 
			
		||||
// counterchecks, make sure that DC-outputs are correct
 | 
			
		||||
 | 
			
		||||
@@ -369,21 +287,14 @@ 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 *buf);
 | 
			
		||||
uint8_t gpi_storeMifReaderStateAndCardType(uint8_t const *buf);
 | 
			
		||||
 | 
			
		||||
/* data description:
 | 
			
		||||
byte 0: current read state: 0=power off  1=reader-fault 2=ready
 | 
			
		||||
@@ -407,41 +318,24 @@ byte 32: result, always 0
 | 
			
		||||
 | 
			
		||||
uint8_t epi_restoreMifState(uint8_t *buf, uint8_t maxBufferSize);
 | 
			
		||||
    // retval 0=OK 1=error host buffer too small
 | 
			
		||||
 | 
			
		||||
void gpi_storeMifCardData(uint8_t blkNr, uint8_t *receivedData);
 | 
			
		||||
bool gpi_storeMifCardData(uint8_t blkNr, uint8_t const *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 *buf);
 | 
			
		||||
void gpi_storePrinterState(uint8_t const *buf);
 | 
			
		||||
 | 
			
		||||
void epi_restorePrinterFonts(uint8_t *buf);
 | 
			
		||||
void gpi_storePrinterFonts(uint8_t const *buf);
 | 
			
		||||
 | 
			
		||||
void gpi_storePrinterFonts(uint8_t *buf);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeMdbState(uint8_t busReady, uint8_t V12on, uint8_t V5on );
 | 
			
		||||
 | 
			
		||||
bool gpi_storeMdbState(bool busReady, bool V12on, bool V5on);
 | 
			
		||||
bool epi_restoreMdbBusReady(void);
 | 
			
		||||
 | 
			
		||||
bool epi_restoreMdbV12Ready(void);
 | 
			
		||||
 | 
			
		||||
bool epi_restoreMdbV5Ready(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeMdbResponse(uint8_t leng, uint8_t *data);
 | 
			
		||||
 | 
			
		||||
void gpi_storeMdbResponse(uint8_t leng, uint8_t const *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
 | 
			
		||||
@@ -450,12 +344,9 @@ 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 *data);
 | 
			
		||||
 | 
			
		||||
void gpi_storeEmpSettings(uint8_t leng, uint8_t const *data);
 | 
			
		||||
void epi_restoreEmpSettings(uint8_t *leng, uint8_t *data);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
void gpi_storeEmpCoinSignal(uint8_t leng, uint8_t *data);
 | 
			
		||||
 | 
			
		||||
@@ -469,108 +360,61 @@ void epi_restoreEmpCoinSignal(uint8_t *leng, uint8_t *data);
 | 
			
		||||
void epi_clearEmpCoinSignal();
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define     MEMDEPTH_GOTCOINS       16
 | 
			
		||||
 | 
			
		||||
void gpi_storeEmpCoinSignal(uint8_t leng, uint8_t *data);
 | 
			
		||||
void gpi_storeEmpCoinSignal(uint8_t leng, uint8_t const *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 *data);
 | 
			
		||||
 | 
			
		||||
void gpi_storeRbDeviceSettings(uint8_t leng, uint8_t const *data);
 | 
			
		||||
void epi_restoreRbDeviceSettings(uint8_t *leng, uint8_t *data);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeMachineIDsettings(uint8_t leng, uint8_t *data);
 | 
			
		||||
 | 
			
		||||
void gpi_storeMachineIDsettings(uint8_t leng, uint8_t const *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 *receivedData);
 | 
			
		||||
 | 
			
		||||
void gpi_storeWakeSources(uint8_t const *receivedData);
 | 
			
		||||
uint64_t epi_getWakeSources(void);
 | 
			
		||||
 | 
			
		||||
uint8_t epi_getWakeReason(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeExtendedTime(uint8_t leng, uint8_t *data);
 | 
			
		||||
 | 
			
		||||
void gpi_storeExtendedTime(uint8_t leng, uint8_t const *data);
 | 
			
		||||
void epi_restoreExtendedTime(uint8_t *leng, uint8_t *data);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeDeviceConditions(uint8_t leng, uint8_t *data);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDeviceConditions(uint8_t leng, uint8_t const *data);
 | 
			
		||||
void epi_restoreDeviceConditions(uint8_t *leng, uint8_t *data);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeDynMachineConditions(uint8_t leng, uint8_t *data);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDynMachineConditions(uint8_t leng, uint8_t const *data);
 | 
			
		||||
void epi_restoreDynMachineConditions(uint8_t *leng, uint8_t *data);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void gpi_storeDCbackupAccNr(uint8_t leng, uint8_t *data);
 | 
			
		||||
 | 
			
		||||
void gpi_storeDCbackupAccNr(uint8_t leng, uint8_t const *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 *data );
 | 
			
		||||
 | 
			
		||||
void gpi_storeVaultRecord(uint8_t blkNr, uint8_t const *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 *holder );
 | 
			
		||||
void gpi_storeNewMifareCard(uint8_t typ, uint8_t const *holder);
 | 
			
		||||
 | 
			
		||||
uint8_t epi_mifGetCardType(uint8_t *holder);
 | 
			
		||||
uint8_t epi_mifGetCardType(uint8_t const *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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,21 +24,13 @@ struct T_emp
 | 
			
		||||
 | 
			
		||||
   // dynamic:
 | 
			
		||||
   uint8_t state;      // step counter of EMP (electronic coin checker) FSM (finite state machine):
 | 
			
		||||
       // 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
 | 
			
		||||
 | 
			
		||||
                       // 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;
 | 
			
		||||
@@ -88,7 +80,6 @@ struct Tprn_hw_state
 | 
			
		||||
    bool    nowAligned;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// obsolete
 | 
			
		||||
 struct T_dynDat
 | 
			
		||||
{
 | 
			
		||||
    uint8_t licensePlate[8];
 | 
			
		||||
@@ -131,17 +122,17 @@ struct T_vaultRecord
 | 
			
		||||
//16
 | 
			
		||||
        char label3buffer[4];	// mw >
 | 
			
		||||
 | 
			
		||||
        // Verkauf, T<EFBFBD>r zu:
 | 
			
		||||
        uint32_t VKcoinsInserted[16];		// nur f<EFBFBD>r Wechsler, soviel wurde eingeworfen
 | 
			
		||||
        uint32_t VKcoinsReturned[6];		// nur f<EFBFBD>r Wechsler, Anzahl M<EFBFBD>nzen pro Typ, soviel wurde zur<EFBFBD>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<EFBFBD>r offen:
 | 
			
		||||
        uint16_t ServCoinsInserted[16];		// nur f<EFBFBD>r Wechsler, soviel wurde eingeworfen
 | 
			
		||||
        uint16_t ServCoinsReturned[6];		// nur f<EFBFBD>r Wechsler, Anzahl M<EFBFBD>nzen pro Typ, soviel wurde zur<EFBFBD>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<EFBFBD>r Wechsler, aktueller F<EFBFBD>llstand
 | 
			
		||||
        uint16_t currentTubeContent[6];		//  nur für Wechsler, aktueller Füllstand
 | 
			
		||||
        uint16_t resint5;
 | 
			
		||||
        uint16_t resint6;
 | 
			
		||||
// 56
 | 
			
		||||
@@ -176,29 +167,30 @@ struct T_moduleCondition
 | 
			
		||||
        // 100..150	= WARNING
 | 
			
		||||
        // 200..250	= ERROR
 | 
			
		||||
 | 
			
		||||
        uint8_t	ram;
 | 
			
		||||
        uint8_t	intEe;
 | 
			
		||||
        uint8_t	extEe;
 | 
			
		||||
        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;
 | 
			
		||||
        uint8_t	printer;
 | 
			
		||||
        uint8_t	modem;
 | 
			
		||||
        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;
 | 
			
		||||
        uint8_t	mifareReader;
 | 
			
		||||
        uint8_t	creditTerm;
 | 
			
		||||
        uint8_t	coinReject;
 | 
			
		||||
        uint8_t	coinEscrow;			// v
 | 
			
		||||
        uint8_t	mifareReader;		// v
 | 
			
		||||
        uint8_t	creditTerm;			// not available
 | 
			
		||||
        uint8_t	coinReject;			// v
 | 
			
		||||
 | 
			
		||||
        uint8_t	coinSafe;
 | 
			
		||||
        uint8_t   billSafe;
 | 
			
		||||
        uint8_t	voltage;			// 1:11..14V
 | 
			
		||||
        uint8_t   temper;
 | 
			
		||||
        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)
 | 
			
		||||
@@ -219,132 +211,62 @@ struct T_moduleCondition
 | 
			
		||||
 | 
			
		||||
struct T_dynamicCondition
 | 
			
		||||
{
 | 
			
		||||
        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;
 | 
			
		||||
        // 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;           // 0:alarm aus  1:alarm  2:alarm mit Sirene   3: Sirenentest
 | 
			
		||||
        char onAlarm;
 | 
			
		||||
        char nowCardTest;
 | 
			
		||||
        char nowPayment;        // not used, always 0
 | 
			
		||||
 | 
			
		||||
        char nowPayment;
 | 
			
		||||
        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;
 | 
			
		||||
 | 
			
		||||
        char        res1;
 | 
			
		||||
        uint16_t    U_Batt;
 | 
			
		||||
        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() {}
 | 
			
		||||
               
 | 
			
		||||
    
 | 
			
		||||
@@ -355,20 +277,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 void dc_closeSerial(void)  const =0;
 | 
			
		||||
    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;
 | 
			
		||||
    virtual bool dc_isPortOpen(void) const =0;
 | 
			
		||||
        // returns true if port open (don't send unless open. Sending to closed port will crash program)
 | 
			
		||||
                   
 | 
			
		||||
        
 | 
			
		||||
@@ -379,8 +301,22 @@ 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<int> templateIdx,
 | 
			
		||||
                                          QVector<QString> fnames,
 | 
			
		||||
                                          QString br,
 | 
			
		||||
                                          QString serial) const = 0;
 | 
			
		||||
 | 
			
		||||
    virtual bool dc_printTemplate(enum FileTypeJson type,
 | 
			
		||||
                                  QVector<int> 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
 | 
			
		||||
@@ -396,7 +332,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<EFBFBD>z=size of host buffer
 | 
			
		||||
        // plBufSizz=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
 | 
			
		||||
@@ -517,10 +453,10 @@ public:
 | 
			
		||||
 | 
			
		||||
    // Analog values:
 | 
			
		||||
    virtual uint32_t dc_getTemperature(void)  const =0;       
 | 
			
		||||
        // in Sax-Format 0...400 (0=-50,0<EFBFBD>C    100=0,0<EFBFBD>C    141=20,5<EFBFBD>C    400=150,0<EFBFBD>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<EFBFBD>C"
 | 
			
		||||
        // as string like "-12,5°C"
 | 
			
		||||
        
 | 
			
		||||
    virtual uint32_t dc_getVoltage(void)  const =0;           
 | 
			
		||||
        // as value in mV,  0...65,535V
 | 
			
		||||
@@ -675,7 +611,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<EFBFBD>_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)
 | 
			
		||||
@@ -781,7 +717,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;
 | 
			
		||||
@@ -839,36 +775,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!!)
 | 
			
		||||
 | 
			
		||||
    // obsolete
 | 
			
		||||
    //virtual void pri_startTicketDesign(void) const =0;
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
    // obsolete
 | 
			
		||||
    //virtual int pri_TD_getCurrentSize(void) const =0;
 | 
			
		||||
    virtual int pri_TD_getCurrentSize(void) const =0;
 | 
			
		||||
        // retval: 0...1278
 | 
			
		||||
 | 
			
		||||
    // obsolete
 | 
			
		||||
    //virtual bool pri_TD_addText(QByteArray text) const =0;
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
    // obsolete
 | 
			
		||||
    //virtual bool pri_TD_addValue(int val) const =0;
 | 
			
		||||
    virtual bool pri_TD_addValue(int val) const =0;
 | 
			
		||||
        // +/- 0...2^(31)
 | 
			
		||||
 | 
			
		||||
    // obsolete
 | 
			
		||||
    //virtual bool pri_TD_addNewLine(void) const =0;
 | 
			
		||||
    virtual bool pri_TD_addNewLine(void) const =0;
 | 
			
		||||
 | 
			
		||||
    // obsolete
 | 
			
		||||
    //virtual bool pri_TD_addSign(char sign) const =0;
 | 
			
		||||
    virtual bool pri_TD_addSign(char sign) const =0;
 | 
			
		||||
        // example: '.'   ' '   0x20 'W' '$'
 | 
			
		||||
 | 
			
		||||
    // obsolete
 | 
			
		||||
    //virtual bool pri_TD_addCommand(char group, char attribute, char p1, char p2, char p3, char p4, char p5) const =0;
 | 
			
		||||
    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
 | 
			
		||||
@@ -909,13 +838,11 @@ public:
 | 
			
		||||
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
    // obsolete
 | 
			
		||||
    //virtual char prn_clearDocument(uint8_t documentNumber) const =0;
 | 
			
		||||
    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"
 | 
			
		||||
 | 
			
		||||
    // obsolete
 | 
			
		||||
    //virtual bool prn_store_Document(uint8_t documentNumber ) const =0;
 | 
			
		||||
    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
 | 
			
		||||
@@ -926,8 +853,7 @@ public:
 | 
			
		||||
    // the place in the ticket layout is predefined (already in DC memory)
 | 
			
		||||
    // the dynamics are first calculated at printing time
 | 
			
		||||
 | 
			
		||||
// obsolete
 | 
			
		||||
    //virtual bool prn_printDocument(uint8_t documentNumber, struct T_dynDat *dynTicketData) const =0;
 | 
			
		||||
    virtual bool prn_printDocument(uint8_t documentNumber, struct T_dynDat *dynTicketData) const =0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// 36
 | 
			
		||||
@@ -1319,10 +1245,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 void bl_checkBL(void) const =0;
 | 
			
		||||
    virtual bool bl_checkBL(void) const = 0;
 | 
			
		||||
        // send command to verify if bl is up
 | 
			
		||||
 | 
			
		||||
    virtual bool bl_isUp(void) const =0;
 | 
			
		||||
@@ -1359,7 +1285,7 @@ public:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // Komplett-schreib Funktion, noch nicht getestet
 | 
			
		||||
    // Nachteil: keine R<EFBFBD>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;
 | 
			
		||||
@@ -1385,7 +1311,7 @@ public:
 | 
			
		||||
    buf[4]=GlobTime.Month;
 | 
			
		||||
    buf[5]=GlobTime.Day;
 | 
			
		||||
    buf[6]=GlobTime.DOW;
 | 
			
		||||
    buf[7]=' ';                   // immer auf 32bit auff<EFBFBD>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);
 | 
			
		||||
@@ -1445,8 +1371,6 @@ 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
 | 
			
		||||
@@ -1471,18 +1395,15 @@ public:
 | 
			
		||||
        // 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;
 | 
			
		||||
        virtual void log_getHoldAccountNumbers(uint32_t *accNr ) const=0;
 | 
			
		||||
        // returns all acc nrs of the backuped vault records
 | 
			
		||||
        // use: uint16_t backupedAccNumbers[8]
 | 
			
		||||
        // use: uint32_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;
 | 
			
		||||
//request, isAvailable
 | 
			
		||||
virtual void log_getVaultRecord(struct T_vaultRecord *retVR) const=0;
 | 
			
		||||
        // which was selected by: log_selectVaultRecord()
 | 
			
		||||
        // to be forwarded to Ismas
 | 
			
		||||
 | 
			
		||||
@@ -1492,19 +1413,7 @@ public:
 | 
			
		||||
    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 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 bool cash_startPayment(uint16_t amount) const=0;
 | 
			
		||||
 | 
			
		||||
    virtual uint32_t getInsertedAmount(void) const=0;
 | 
			
		||||
 | 
			
		||||
@@ -1528,23 +1437,18 @@ public:
 | 
			
		||||
        // 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 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(struct T_moduleCondition *devCond) const=0;
 | 
			
		||||
    virtual void sys_getDeviceConditions(uint8_t *leng, uint8_t *data) const=0;
 | 
			
		||||
    /*
 | 
			
		||||
 | 
			
		||||
@@ -1581,9 +1485,8 @@ public:
 | 
			
		||||
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
@@ -1649,70 +1552,6 @@ public:
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -1730,22 +1569,10 @@ signals:
 | 
			
		||||
// 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.4"
 | 
			
		||||
//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.5"
 | 
			
		||||
#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.6"
 | 
			
		||||
#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/3.3"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										34
									
								
								src/com.cpp
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								src/com.cpp
									
									
									
									
									
								
							@@ -93,29 +93,34 @@ 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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// -------------------------------------------------------------------------------------------------------------
 | 
			
		||||
@@ -124,17 +129,24 @@ 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())
 | 
			
		||||
    if (CatSerial->isOpen()) {
 | 
			
		||||
        qDebug() << "!!!IS OPEN!!!";
 | 
			
		||||
        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
 | 
			
		||||
@@ -167,6 +179,9 @@ char T_com::open_Serial_Port()
 | 
			
		||||
        myString.append(CatSerial->errorString());
 | 
			
		||||
        qDebug() << myString;
 | 
			
		||||
        gpi_setTxt4comStateLine(myString);
 | 
			
		||||
 | 
			
		||||
        //qDebug() << "LEAVE";
 | 
			
		||||
 | 
			
		||||
        return 0;
 | 
			
		||||
    } else
 | 
			
		||||
    {
 | 
			
		||||
@@ -182,11 +197,14 @@ char T_com::open_Serial_Port()
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
     return 0;
 | 
			
		||||
    //qDebug() << "LEAVE";
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void T_com::closeSerialPort()
 | 
			
		||||
{
 | 
			
		||||
    //qDebug() << "ENTER";
 | 
			
		||||
 | 
			
		||||
    if (CatSerial->isOpen())
 | 
			
		||||
    {
 | 
			
		||||
        qDebug() << "closing connection";
 | 
			
		||||
@@ -195,6 +213,8 @@ void T_com::closeSerialPort()
 | 
			
		||||
        gpi_setTxt4RsDiagWin("closed");
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //qDebug() << "LEAVE";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,499 +1,310 @@
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
 | 
			
		||||
#include <QString>
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
#include "tslib.h"
 | 
			
		||||
//#include "controlBus.h"
 | 
			
		||||
#include "shared_mem_buffer.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);
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
    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);
 | 
			
		||||
 | 
			
		||||
    SharedMemBuffer::getData()->rs.baudNr = BaudNr;
 | 
			
		||||
    SharedMemBuffer::getData()->rs.connect = connect;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void epi_closeSerial(void)
 | 
			
		||||
{
 | 
			
		||||
    rs_connect=0;
 | 
			
		||||
void epi_closeSerial(void) {
 | 
			
		||||
    SharedMemBuffer::getData()->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
 | 
			
		||||
    // rs_connect=2;   // Flanke, nur 1x öffnen/schließen
 | 
			
		||||
    SharedMemBuffer::getData()->rs.connect = 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t gpi_getSerialConn(void)
 | 
			
		||||
{
 | 
			
		||||
    return rs_connect;
 | 
			
		||||
uint8_t gpi_getSerialConn(void) {
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->rs.connect;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int gpi_getBaudNr(void)
 | 
			
		||||
{
 | 
			
		||||
    return rs_baudNr;
 | 
			
		||||
int gpi_getBaudNr(void) {
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->rs.baudNr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString gpi_getComPortName(void)
 | 
			
		||||
{
 | 
			
		||||
    return rs_comportName;
 | 
			
		||||
QString gpi_getComPortName(void) {
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->rs.comportName;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool rs_portIsOpen;
 | 
			
		||||
 | 
			
		||||
void gpi_serialIsOpen(bool offen)
 | 
			
		||||
{
 | 
			
		||||
    rs_portIsOpen=offen;
 | 
			
		||||
void gpi_serialIsOpen(bool offen) {
 | 
			
		||||
    SharedMemBuffer::getData()->rs.portIsOpen = offen;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool epi_isSerialPortOpen()
 | 
			
		||||
{
 | 
			
		||||
bool epi_isSerialPortOpen() {
 | 
			
		||||
    // true: port is open   false: port is closed
 | 
			
		||||
    return rs_portIsOpen;
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->rs.portIsOpen;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//          Control transfer   gui <--> serial
 | 
			
		||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static char       AutoEmissionOn;     // 1: zyklisch Anfragen zum Slave senden
 | 
			
		||||
 | 
			
		||||
void epi_startEmmision(char start)
 | 
			
		||||
{
 | 
			
		||||
    AutoEmissionOn=start;
 | 
			
		||||
void epi_startEmmision(char start) {
 | 
			
		||||
    SharedMemBuffer::getData()->AutoEmissionOn = start;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool gpi_isEmmisionOn(void)
 | 
			
		||||
{
 | 
			
		||||
    return AutoEmissionOn;
 | 
			
		||||
bool gpi_isEmmisionOn(void) {
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->AutoEmissionOn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
uint16_t gpi_getPeriodicSendTimeVal() {
 | 
			
		||||
    SharedMemBuffer::getData()->datif.sendingPer_changed = 0;
 | 
			
		||||
    if ((SharedMemBuffer::getDataConst()->datif.sendingPeriod < 3) ||
 | 
			
		||||
        (SharedMemBuffer::getDataConst()->datif.sendingPeriod > 10000)) {
 | 
			
		||||
        return 130;         // ms, default
 | 
			
		||||
    else
 | 
			
		||||
        return datif_sendingPeriod;
 | 
			
		||||
    }
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->datif.sendingPeriod;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void epi_setPeriodicSendTimeVal(uint16_t val)
 | 
			
		||||
{
 | 
			
		||||
    if (val>=3 && val<10000)
 | 
			
		||||
    {
 | 
			
		||||
        datif_sendingPer_changed=1;
 | 
			
		||||
        datif_sendingPeriod=val;
 | 
			
		||||
void epi_setPeriodicSendTimeVal(uint16_t val) {
 | 
			
		||||
    if (val>=3 && val<10000) {
 | 
			
		||||
        SharedMemBuffer::getData()->datif.sendingPer_changed = 1;
 | 
			
		||||
        SharedMemBuffer::getData()->datif.sendingPeriod = val;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool gpi_PeriodicSendTimeHasChanged()
 | 
			
		||||
{
 | 
			
		||||
    return datif_sendingPer_changed;
 | 
			
		||||
bool gpi_PeriodicSendTimeHasChanged() {
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->datif.sendingPer_changed;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//          Status Display    gui <--> serial
 | 
			
		||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//              linke Spalte, über Connect Button
 | 
			
		||||
static QString txt4comStateLine;
 | 
			
		||||
 | 
			
		||||
QString epi_getTxt4comStateLine(void)
 | 
			
		||||
{
 | 
			
		||||
// linke Spalte, über Connect Button
 | 
			
		||||
QString epi_getTxt4comStateLine(void) {
 | 
			
		||||
    // GUI: get Text for serial Comport-State Line
 | 
			
		||||
    return txt4comStateLine;
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->txt4.comStateLine;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void gpi_setTxt4comStateLine(QString txtline)     // gpi
 | 
			
		||||
{
 | 
			
		||||
void gpi_setTxt4comStateLine(QString txtline) {
 | 
			
		||||
    // serial: write Text to be displayed in serial Comport-State line (like "connected")
 | 
			
		||||
    txt4comStateLine.clear();
 | 
			
		||||
    if (txtline=="")
 | 
			
		||||
        txt4comStateLine.clear();
 | 
			
		||||
    else
 | 
			
		||||
        txt4comStateLine=txtline;
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.comStateLine,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.comStateLine));
 | 
			
		||||
    memcpy(SharedMemBuffer::getData()->txt4.comStateLine,
 | 
			
		||||
           txtline.toStdString().c_str(),
 | 
			
		||||
           sizeof(SharedMemBuffer::getData()->txt4.comStateLine)-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void epi_clrTxt4comStateLine()
 | 
			
		||||
{
 | 
			
		||||
    txt4comStateLine.clear();
 | 
			
		||||
void epi_clrTxt4comStateLine() {
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.comStateLine,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.comStateLine));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//---------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
{
 | 
			
		||||
    return txt4HsStateLine;
 | 
			
		||||
QString epi_getTxt4HsStateLine(void) {
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->txt4.HsStateLine;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void gpi_setTxt4HsStateLine(QString txtline)
 | 
			
		||||
{
 | 
			
		||||
    txt4HsStateLine.clear();
 | 
			
		||||
    if (txtline=="")
 | 
			
		||||
        txt4HsStateLine.clear();
 | 
			
		||||
    else
 | 
			
		||||
        txt4HsStateLine=txtline;
 | 
			
		||||
void gpi_setTxt4HsStateLine(QString txtline) {
 | 
			
		||||
    // serial: write Text to be displayed in serial Comport-State line (like "connected")
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.HsStateLine,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.HsStateLine));
 | 
			
		||||
    memcpy(SharedMemBuffer::getData()->txt4.HsStateLine,
 | 
			
		||||
           txtline.toStdString().c_str(),
 | 
			
		||||
           sizeof(SharedMemBuffer::getData()->txt4.HsStateLine)-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void epi_clrTxt4HsStateLine()
 | 
			
		||||
{
 | 
			
		||||
    txt4HsStateLine.clear();
 | 
			
		||||
void epi_clrTxt4HsStateLine() {
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.HsStateLine,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.HsStateLine));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//---------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
{
 | 
			
		||||
    return txt4masterStateLine;
 | 
			
		||||
QString epi_getTxt4masterStateLine(void) {
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->txt4.masterStateLine;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void gpi_setTxt4masterStateLine(QString txtline)
 | 
			
		||||
{
 | 
			
		||||
    txt4masterStateLine.clear();
 | 
			
		||||
    if (txtline=="")
 | 
			
		||||
        txt4masterStateLine.clear();
 | 
			
		||||
    else
 | 
			
		||||
        txt4masterStateLine=txtline;
 | 
			
		||||
void gpi_setTxt4masterStateLine(QString txtline) {
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.masterStateLine,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.masterStateLine));
 | 
			
		||||
    memcpy(SharedMemBuffer::getData()->txt4.masterStateLine,
 | 
			
		||||
           txtline.toStdString().c_str(),
 | 
			
		||||
           sizeof(SharedMemBuffer::getData()->txt4.masterStateLine)-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void epi_clrTxt4masterStateLine()
 | 
			
		||||
{
 | 
			
		||||
    txt4masterStateLine.clear();
 | 
			
		||||
void epi_clrTxt4masterStateLine() {
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.masterStateLine,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.masterStateLine));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//---------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// III   Slave receive (from Master) OK? if then show results, if not then show errors
 | 
			
		||||
// entweder Empfangsfehler anzeigen (crc? length?) oder result OUT-OK, OUT_ERR, IN_OK, IN_ERR
 | 
			
		||||
// Hintergrund: wenn der Slave Fehler im Master-Telegramm gefunden hat, dann kann er es auch
 | 
			
		||||
// nicht verwenden und nichts ausgeben oder einlesen
 | 
			
		||||
 | 
			
		||||
static QString txt4resultStateLine;
 | 
			
		||||
 | 
			
		||||
QString epi_getTxt4resultStateLine(void)
 | 
			
		||||
{
 | 
			
		||||
    return txt4resultStateLine;
 | 
			
		||||
QString epi_getTxt4resultStateLine(void) {
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->txt4.resultStateLine;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void gpi_setTxt4resultStateLine(QString txtline)
 | 
			
		||||
{
 | 
			
		||||
    txt4resultStateLine.clear();
 | 
			
		||||
    if (txtline=="")
 | 
			
		||||
        txt4resultStateLine.clear();
 | 
			
		||||
    else
 | 
			
		||||
        txt4resultStateLine=txtline;
 | 
			
		||||
void gpi_setTxt4resultStateLine(QString txtline) {
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.resultStateLine,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.resultStateLine));
 | 
			
		||||
    memcpy(SharedMemBuffer::getData()->txt4.resultStateLine,
 | 
			
		||||
           txtline.toStdString().c_str(),
 | 
			
		||||
           sizeof(SharedMemBuffer::getData()->txt4.resultStateLine)-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void epi_clrTxt4resultStateLine()
 | 
			
		||||
{
 | 
			
		||||
    txt4resultStateLine.clear();
 | 
			
		||||
void epi_clrTxt4resultStateLine() {
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.resultStateLine,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.resultStateLine));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//---------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// IV  Statuszeile Empfangsdaten
 | 
			
		||||
static QString txt4dataLine;
 | 
			
		||||
 | 
			
		||||
QString epi_getTxt4dataStateLine(void)
 | 
			
		||||
{
 | 
			
		||||
QString epi_getTxt4dataStateLine(void) {
 | 
			
		||||
    // GUI: get Text for serial Comport-State Line
 | 
			
		||||
    return txt4dataLine;
 | 
			
		||||
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->txt4.dataLine;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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=="")
 | 
			
		||||
        txt4dataLine.clear();
 | 
			
		||||
    else
 | 
			
		||||
        txt4dataLine=txtline;
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.dataLine,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.dataLine));
 | 
			
		||||
    memcpy(SharedMemBuffer::getData()->txt4.dataLine,
 | 
			
		||||
           txtline.toStdString().c_str(),
 | 
			
		||||
           sizeof(SharedMemBuffer::getData()->txt4.dataLine)-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void epi_clrTxt4dataStateLine()
 | 
			
		||||
{
 | 
			
		||||
    txt4dataLine.clear();
 | 
			
		||||
void epi_clrTxt4dataStateLine() {
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.dataLine,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.dataLine));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//---------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// 5. Zeile: Datif Ergebnis, Daten brauchbar?
 | 
			
		||||
 | 
			
		||||
static QString txt4datifReceive;
 | 
			
		||||
 | 
			
		||||
QString epi_getTxt4datifLine(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    return txt4datifReceive;
 | 
			
		||||
 | 
			
		||||
QString epi_getTxt4datifLine(void) {
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->txt4.datifReceive;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void gpi_setTxt4datifLine(QString txtline)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    txt4datifReceive.clear();
 | 
			
		||||
    if (txtline=="")
 | 
			
		||||
        txt4datifReceive.clear();
 | 
			
		||||
    else
 | 
			
		||||
        txt4datifReceive=txtline;
 | 
			
		||||
void gpi_setTxt4datifLine(QString txtline) {
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.datifReceive,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.datifReceive));
 | 
			
		||||
    memcpy(SharedMemBuffer::getData()->txt4.datifReceive,
 | 
			
		||||
           txtline.toStdString().c_str(),
 | 
			
		||||
           sizeof(SharedMemBuffer::getData()->txt4.datifReceive)-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void epi_clrTxt4datifLine()
 | 
			
		||||
{
 | 
			
		||||
    txt4datifReceive.clear();
 | 
			
		||||
void epi_clrTxt4datifLine() {
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.datifReceive,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.datifReceive));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//---------------------------------------------------------------------------------------------
 | 
			
		||||
//---------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
static QString txt4diagWindow;
 | 
			
		||||
 | 
			
		||||
QString epi_getTxt4RsDiagWin(void)
 | 
			
		||||
{
 | 
			
		||||
    return txt4diagWindow;
 | 
			
		||||
 | 
			
		||||
QString epi_getTxt4RsDiagWin(void) {
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->txt4.diagWindow;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void gpi_setTxt4RsDiagWin(QString txtline)
 | 
			
		||||
{
 | 
			
		||||
    txt4diagWindow.clear();
 | 
			
		||||
    if (txtline=="")
 | 
			
		||||
        txt4diagWindow.clear();
 | 
			
		||||
    else
 | 
			
		||||
        txt4diagWindow=txtline;
 | 
			
		||||
void gpi_setTxt4RsDiagWin(QString txtline) {
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.diagWindow,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.diagWindow));
 | 
			
		||||
    memcpy(SharedMemBuffer::getData()->txt4.diagWindow,
 | 
			
		||||
           txtline.toStdString().c_str(),
 | 
			
		||||
           sizeof(SharedMemBuffer::getData()->txt4.diagWindow)-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void epi_clrTxt4RsDiagWin()
 | 
			
		||||
{
 | 
			
		||||
    txt4diagWindow.clear();
 | 
			
		||||
void epi_clrTxt4RsDiagWin() {
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.diagWindow,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.diagWindow));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//---------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
static QString sndTxt4diagWindow;
 | 
			
		||||
 | 
			
		||||
QString epi_get2ndTxt4RsDiagWin(void)
 | 
			
		||||
{
 | 
			
		||||
    return sndTxt4diagWindow;
 | 
			
		||||
 | 
			
		||||
QString epi_get2ndTxt4RsDiagWin(void) {
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->txt4.sndDiagWindow;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void gpi_set2ndTxt4RsDiagWin(QString txtline)
 | 
			
		||||
{
 | 
			
		||||
    sndTxt4diagWindow.clear();
 | 
			
		||||
    if (txtline=="")
 | 
			
		||||
        sndTxt4diagWindow.clear();
 | 
			
		||||
    else
 | 
			
		||||
        sndTxt4diagWindow=txtline;
 | 
			
		||||
void gpi_set2ndTxt4RsDiagWin(QString txtline) {
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.sndDiagWindow,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.sndDiagWindow));
 | 
			
		||||
    memcpy(SharedMemBuffer::getData()->txt4.sndDiagWindow,
 | 
			
		||||
           txtline.toStdString().c_str(),
 | 
			
		||||
           sizeof(SharedMemBuffer::getData()->txt4.sndDiagWindow)-1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void epi_clr2ndTxt4RsDiagWin()
 | 
			
		||||
{
 | 
			
		||||
    sndTxt4diagWindow.clear();
 | 
			
		||||
void epi_clr2ndTxt4RsDiagWin() {
 | 
			
		||||
    memset(SharedMemBuffer::getData()->txt4.sndDiagWindow,
 | 
			
		||||
           0x00, sizeof(SharedMemBuffer::getData()->txt4.sndDiagWindow));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//          Memory for Slave responses, common data
 | 
			
		||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool Sdata_serialTestResult;
 | 
			
		||||
 | 
			
		||||
void gpi_storeResult_serialTestOK(bool wasOk)
 | 
			
		||||
{
 | 
			
		||||
    Sdata_serialTestResult=wasOk;
 | 
			
		||||
void gpi_storeResult_serialTestOK(bool wasOk) {
 | 
			
		||||
    SharedMemBuffer::getData()->Sdata.serialTestResult = wasOk;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool epi_getResult_serialTestOK()
 | 
			
		||||
{
 | 
			
		||||
bool epi_getResult_serialTestOK() {
 | 
			
		||||
    // retval: true: test was successful, got right response
 | 
			
		||||
    return Sdata_serialTestResult;
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->Sdata.serialTestResult;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
//          Store received data for hwapi
 | 
			
		||||
// ///////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static uint8_t Sdata_pProtResultOk;
 | 
			
		||||
 | 
			
		||||
void gpi_startNewRequest()
 | 
			
		||||
{
 | 
			
		||||
    Sdata_pProtResultOk=0;
 | 
			
		||||
void gpi_startNewRequest() {
 | 
			
		||||
    SharedMemBuffer::getData()->Sdata.pProtResultOk = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void gpi_storeResultOfLastRequest(bool answisok)
 | 
			
		||||
{
 | 
			
		||||
    if (answisok)
 | 
			
		||||
        Sdata_pProtResultOk=1;
 | 
			
		||||
    else
 | 
			
		||||
        Sdata_pProtResultOk=2;
 | 
			
		||||
void gpi_storeResultOfLastRequest(bool answisok) {
 | 
			
		||||
    SharedMemBuffer::getData()->Sdata.pProtResultOk = answisok ? 1 : 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t epi_getResultOfLastRequest()
 | 
			
		||||
{
 | 
			
		||||
uint8_t epi_getResultOfLastRequest() {
 | 
			
		||||
    // retval: 0: in progress  1: OK  2: error
 | 
			
		||||
    return Sdata_pProtResultOk;
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->Sdata.pProtResultOk;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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=plBufSiz;
 | 
			
		||||
    if (ml>64) ml=64;
 | 
			
		||||
    if (Sdata_receivedDataLength<ml)
 | 
			
		||||
        ml=Sdata_receivedDataLength;
 | 
			
		||||
    tslib_strcpy(Sdata_receivedDataBlock, payLoad, ml);
 | 
			
		||||
    return Sdata_receivedDataLength;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static uint8_t ndbs, pari, nsb, br;
 | 
			
		||||
 | 
			
		||||
void gpi_storeSlaveSerParams(uint8_t slaveBaudRate, uint8_t NrDataBits,
 | 
			
		||||
                             uint8_t parity, uint8_t NrStopBits)
 | 
			
		||||
{
 | 
			
		||||
    // store numbers
 | 
			
		||||
    ndbs=NrDataBits;
 | 
			
		||||
    pari=parity;
 | 
			
		||||
    nsb=NrStopBits;
 | 
			
		||||
    br=slaveBaudRate;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void epi_getSlaveSerParams(uint8_t *slaveBaudRate, uint8_t *NrDataBits,
 | 
			
		||||
                           uint8_t *parity, uint8_t *NrStopBits)
 | 
			
		||||
{
 | 
			
		||||
    *NrDataBits=ndbs;
 | 
			
		||||
    *parity=pari;
 | 
			
		||||
    *NrStopBits=nsb;
 | 
			
		||||
    *slaveBaudRate=br;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
void gpi_storeSlaveSerParams(uint8_t slaveBaudRate, uint8_t NrDataBits,
 | 
			
		||||
                             uint8_t parity, uint8_t NrStopBits) {
 | 
			
		||||
    // store numbers
 | 
			
		||||
    SharedMemBuffer::write()->ndbs = 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;
 | 
			
		||||
    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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    ctmp=ndbs;
 | 
			
		||||
    ctmp+=0x30;
 | 
			
		||||
    mySt.append(ctmp);
 | 
			
		||||
    ctmp=pari;
 | 
			
		||||
    mySt.append(ctmp);
 | 
			
		||||
    ctmp=nsb;
 | 
			
		||||
    ctmp+=0x30;
 | 
			
		||||
    mySt.append(ctmp);
 | 
			
		||||
    //mySt="Hallo";
 | 
			
		||||
    return mySt;
 | 
			
		||||
    return SharedMemBuffer::getDataConst()->Sdata.receivedDataLength;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										746
									
								
								src/datIf.cpp
									
									
									
									
									
								
							
							
						
						
									
										746
									
								
								src/datIf.cpp
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										943
									
								
								src/datei.cpp
									
									
									
									
									
								
							
							
						
						
									
										943
									
								
								src/datei.cpp
									
									
									
									
									
								
							@@ -1,943 +0,0 @@
 | 
			
		||||
// 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: "<<year;
 | 
			
		||||
    GetDateString(day, month, 0x20, uint8_t(year%100), 0, 0, ui8buf);
 | 
			
		||||
    for (uint8_t nn=0; nn<20; nn++)
 | 
			
		||||
        buf[nn]=char(ui8buf[nn]);
 | 
			
		||||
    datei_writeArray.append(buf, 10);            // date string
 | 
			
		||||
    datei_writeArray.append(NEWLINEINFILE);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void csv_addNewlineToFile(void)
 | 
			
		||||
{
 | 
			
		||||
    datei_writeArray.chop(1);      // Komma weg
 | 
			
		||||
    datei_writeArray.append(NEWLINEINFILE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QByteArray csv_readbackArray(void)
 | 
			
		||||
{
 | 
			
		||||
    return datei_writeArray;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
QByteArray csv_writeContent_testValues(void)
 | 
			
		||||
{
 | 
			
		||||
    QByteArray myBA, tmpBA;
 | 
			
		||||
    uint8_t modCount=5, modAddr=23;
 | 
			
		||||
    uint8_t hour, minute, sec, month, day, ui8buf[20];
 | 
			
		||||
    uint16_t year, modType=45678;
 | 
			
		||||
    char buf[20];
 | 
			
		||||
    uint32_t modNrDIs=1234567890;
 | 
			
		||||
    uint8_t  modNrAIs=4, modNrCtr=2, modNrDOs=8;
 | 
			
		||||
    int       modNrAOs=-2;
 | 
			
		||||
       
 | 
			
		||||
    myBA.clear();
 | 
			
		||||
    tmpBA.clear();
 | 
			
		||||
    myBA.append("scan time");
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    
 | 
			
		||||
    datei_getSysTime(&hour, &minute, &sec);
 | 
			
		||||
    GetTimeString(hour, minute, sec, 0, 1, ui8buf);        
 | 
			
		||||
    for (uint8_t nn=0; nn<20; nn++)
 | 
			
		||||
        buf[nn]=char(ui8buf[nn]);
 | 
			
		||||
    myBA.append(buf,8);             // time string
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    
 | 
			
		||||
    datei_getSystemDate(&year, &month, &day);
 | 
			
		||||
    //qDebug()<<"date year: "<<year;
 | 
			
		||||
    GetDateString(day, month, 0x20, uint8_t(year%100), 0, 0, ui8buf);        
 | 
			
		||||
    for (uint8_t nn=0; nn<20; nn++)
 | 
			
		||||
        buf[nn]=char(ui8buf[nn]);          
 | 
			
		||||
    myBA.append(buf, 10);            // date string
 | 
			
		||||
    myBA.append(NEWLINEINFILE);
 | 
			
		||||
    
 | 
			
		||||
    myBA.append("number of modules");
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    tmpBA.setNum(modCount,10);   //2nd para = number base 2, 8, 10 or 16 (bin, oct, dec, hex)
 | 
			
		||||
    myBA.append(tmpBA);
 | 
			
		||||
    myBA.append(NEWLINEINFILE);
 | 
			
		||||
 | 
			
		||||
    myBA.append("busaddr");
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    myBA.append("type");
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    myBA.append("NrOfDI");
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    myBA.append("NrOfAI");
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    myBA.append("NrOfCtrIn");
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    myBA.append("NrOfDO");
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    myBA.append("NrOfAO");
 | 
			
		||||
    myBA.append(NEWLINEINFILE);
 | 
			
		||||
 | 
			
		||||
    tmpBA.setNum(modAddr,10);
 | 
			
		||||
    myBA.append(tmpBA);
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    tmpBA.setNum(modType,10);
 | 
			
		||||
    myBA.append(tmpBA);
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    tmpBA.setNum(modNrDIs,10);
 | 
			
		||||
    myBA.append(tmpBA);
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    tmpBA.setNum(modNrAIs,10);
 | 
			
		||||
    myBA.append(tmpBA);
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    tmpBA.setNum(modNrCtr,10);
 | 
			
		||||
    myBA.append(tmpBA);
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    tmpBA.setNum(modNrDOs,10);
 | 
			
		||||
    myBA.append(tmpBA);
 | 
			
		||||
    myBA.append(FILESEPERATOR);
 | 
			
		||||
    tmpBA.setNum(modNrAOs,10);
 | 
			
		||||
    myBA.append(tmpBA);
 | 
			
		||||
    myBA.append(NEWLINEINFILE);
 | 
			
		||||
    return myBA;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// -------------------------------------------------------------------------------------------------
 | 
			
		||||
// ------------------------------------------------------ parse csv file -------------------------------
 | 
			
		||||
// -------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
// first: QByteArray datei_readFromFile(QString filename);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint32_t csv_nrOfEntriesInFile(QByteArray readFromFile)
 | 
			
		||||
{
 | 
			
		||||
    // count sequences between FILESEPERATOR and NEWLINEINFILE    
 | 
			
		||||
    uint32_t   filSize=0, pp=0;
 | 
			
		||||
    char       oneByt=0;
 | 
			
		||||
    
 | 
			
		||||
    int  filLen=readFromFile.size();
 | 
			
		||||
    if(filLen>1)
 | 
			
		||||
        filSize=uint32_t(filLen);
 | 
			
		||||
    else
 | 
			
		||||
        return 0;
 | 
			
		||||
        
 | 
			
		||||
    // 1) find position of seperators
 | 
			
		||||
    for (uint32_t ii=0; ii<filSize; ii++)
 | 
			
		||||
    {
 | 
			
		||||
        oneByt=readFromFile[ii];
 | 
			
		||||
        if (oneByt==FILESEP1 || oneByt==FILESEP2 || oneByt==NEWLINEINFILE)
 | 
			
		||||
            pp++;
 | 
			
		||||
    }
 | 
			
		||||
    // now: pp = number of seperators
 | 
			
		||||
    // oneByt = last byte in file. If it's not a seperator then 
 | 
			
		||||
    // there's one more entry (last entry without termination)
 | 
			
		||||
    if (oneByt !=FILESEP1 && oneByt !=FILESEP2 && oneByt !=NEWLINEINFILE)
 | 
			
		||||
        pp++;
 | 
			
		||||
    //qDebug()<<"csv: nr of sequences="<< pp;
 | 
			
		||||
    return pp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QByteArray csv_getOneFileSequence(QByteArray sourceFile, uint32_t sequNr)
 | 
			
		||||
{
 | 
			
		||||
    // seperate file content in single sequences between FILESEPERATOR and NEWLINEINFILE
 | 
			
		||||
    // and return "entryNr" - entry 
 | 
			
		||||
    // for this first step leave data type QByteArray
 | 
			
		||||
    // 2nd step can change in numbers and strings
 | 
			
		||||
    QByteArray sequence;
 | 
			
		||||
    uint32_t   sepPos[MAXNUMBEROFSEQUENCES];
 | 
			
		||||
    uint32_t   filSize=0, pp=0, ii, start=0, ende=0;
 | 
			
		||||
    char       oneByt;
 | 
			
		||||
    int        filLen, mm; 
 | 
			
		||||
    
 | 
			
		||||
    filLen=sourceFile.size();
 | 
			
		||||
    //qDebug()<<"fillen="<< filLen;
 | 
			
		||||
    if(filLen<10)
 | 
			
		||||
        return "";
 | 
			
		||||
    filSize=uint32_t(filLen);
 | 
			
		||||
 | 
			
		||||
    if (sequNr>MAXNUMBEROFSEQUENCES)
 | 
			
		||||
        return "";    
 | 
			
		||||
 | 
			
		||||
    // 1) find position of seperators
 | 
			
		||||
    for (ii=0; ii<filSize; ii++)
 | 
			
		||||
    {
 | 
			
		||||
        oneByt=sourceFile[ii];
 | 
			
		||||
        if (oneByt==FILESEP1 || oneByt==FILESEP2 || oneByt==NEWLINEINFILE)
 | 
			
		||||
        {
 | 
			
		||||
            sepPos[pp++]=ii;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    // now: pp = number of entries
 | 
			
		||||
    //qDebug()<<"nr of seperators="<< pp;
 | 
			
		||||
 | 
			
		||||
    if (sequNr>=pp)
 | 
			
		||||
        return "";
 | 
			
		||||
 | 
			
		||||
    // 2) get sequence
 | 
			
		||||
    if (sequNr==0)
 | 
			
		||||
    {
 | 
			
		||||
        start=0;
 | 
			
		||||
        ende=sepPos[sequNr];        
 | 
			
		||||
    } else
 | 
			
		||||
    if (sequNr>0)
 | 
			
		||||
    {
 | 
			
		||||
        start=sepPos[sequNr-1]+1;
 | 
			
		||||
        ende=sepPos[sequNr];    
 | 
			
		||||
    }    
 | 
			
		||||
 | 
			
		||||
    //qDebug()<<"datei getOneFileSequence start/ende: "<<start << " " << ende;
 | 
			
		||||
    if (start>=ende)
 | 
			
		||||
        return "";
 | 
			
		||||
        //return "-err3-";
 | 
			
		||||
    sequence.clear();
 | 
			
		||||
    //batmp.clear();
 | 
			
		||||
    pp=0;
 | 
			
		||||
    for (ii=start; ii<ende; ii++)
 | 
			
		||||
    {
 | 
			
		||||
        mm=int(ii);
 | 
			
		||||
        if (mm>=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; ul<nrofVals; ul++)
 | 
			
		||||
    {
 | 
			
		||||
        tmpStr.setNum(buf[ul]);
 | 
			
		||||
        myJsonCon.append(tmpStr);
 | 
			
		||||
        myJsonCon.append(',');
 | 
			
		||||
    }
 | 
			
		||||
    myJsonCon.chop(1);      // Komma weg
 | 
			
		||||
    myJsonCon.append(']');  // eckig!!!
 | 
			
		||||
    myJsonCon.append(',');
 | 
			
		||||
    myJsonCon.append(NEWLINEINFILE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void json_enterStructToRecord(QString attribute)
 | 
			
		||||
{
 | 
			
		||||
    // every call must be concluded with "json_finishFile()"
 | 
			
		||||
    myJsonCon.append('"');
 | 
			
		||||
    myJsonCon.append(attribute);
 | 
			
		||||
    myJsonCon.append('"');
 | 
			
		||||
    myJsonCon.append(':');
 | 
			
		||||
    myJsonCon.append('{');  // geschweift!!
 | 
			
		||||
    myJsonCon.append(NEWLINEINFILE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void json_finishStruct(void)
 | 
			
		||||
{
 | 
			
		||||
    myJsonCon.chop(2);  // remove , and \r from the end
 | 
			
		||||
    myJsonCon.append('}');
 | 
			
		||||
    myJsonCon.append(',');
 | 
			
		||||
    myJsonCon.append(NEWLINEINFILE);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void json_finishRecord(void)
 | 
			
		||||
{
 | 
			
		||||
    myJsonCon.chop(2);  // remove , and \r from the end
 | 
			
		||||
    myJsonCon.append(NEWLINEINFILE);
 | 
			
		||||
    myJsonCon.append('}');
 | 
			
		||||
    myJsonCon.append(NEWLINEINFILE);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
QString json_readbackRecordStr(void)
 | 
			
		||||
{
 | 
			
		||||
    return myJsonCon;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QByteArray json_readbackRecordBa(void)
 | 
			
		||||
{            
 | 
			
		||||
    return myJsonCon.toLatin1();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// -------------------------------------------------------------------------------------------------
 | 
			
		||||
// ------------------------------------------------------ parse Json file -------------------------------
 | 
			
		||||
// -------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
example Json File:
 | 
			
		||||
{"temperature":28,
 | 
			
		||||
"snow":"no",
 | 
			
		||||
"Zeit":"16_21_45",
 | 
			
		||||
"sunny":"12h",
 | 
			
		||||
"humidity":75,
 | 
			
		||||
"wann ":"24.01.2022",
 | 
			
		||||
"unterstruktur":{
 | 
			
		||||
"day of week":"tuesday",
 | 
			
		||||
"year":22,
 | 
			
		||||
"month":1,
 | 
			
		||||
"day":24},
 | 
			
		||||
"fast am":"Ende",
 | 
			
		||||
"Puffer":[8,3,9,2,10]
 | 
			
		||||
}
 | 
			
		||||
 */
 | 
			
		||||
// first: QByteArray datei_readFromFile(QString filename);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int json_nrOfPairsInFile(QByteArray filename)
 | 
			
		||||
{
 | 
			
		||||
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
 | 
			
		||||
    QJsonObject jobj = jdoc.object();
 | 
			
		||||
 | 
			
		||||
    // key value pair consisting of key (unique string) and value (QJsonValue)
 | 
			
		||||
    int nrOfPairs=jobj.size();
 | 
			
		||||
 | 
			
		||||
    qDebug() << "my Json file has got: " << nrOfPairs<< "pairs";
 | 
			
		||||
    return nrOfPairs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool json_exists(QByteArray filename, QString searchForKey)
 | 
			
		||||
{
 | 
			
		||||
    // look for "searchForKey" =name of the pair (left of : )
 | 
			
		||||
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
 | 
			
		||||
    QJsonObject jobj = jdoc.object();
 | 
			
		||||
 | 
			
		||||
    if (jobj.contains(searchForKey))
 | 
			
		||||
        return true;
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool json_remove(QByteArray filename, QString searchFor)
 | 
			
		||||
{
 | 
			
		||||
    // look for "searchFor" =name of the pair (left of : ) and remove the record from file
 | 
			
		||||
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
 | 
			
		||||
    QJsonObject jobj = jdoc.object();
 | 
			
		||||
 | 
			
		||||
    if (jobj.contains(searchFor))
 | 
			
		||||
    {
 | 
			
		||||
        jobj.remove(searchFor);
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
 | 
			
		||||
    QJsonObject jobj = jdoc.object();
 | 
			
		||||
 | 
			
		||||
    if (jobj.contains(searchFor))
 | 
			
		||||
    {
 | 
			
		||||
        return jobj[searchFor].toString();    // toObject(); toArray();
 | 
			
		||||
    } else
 | 
			
		||||
    {
 | 
			
		||||
        //qDebug() << "pairname not found in Json file";
 | 
			
		||||
        return "";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
 | 
			
		||||
    QJsonObject jobj = jdoc.object();
 | 
			
		||||
 | 
			
		||||
    if (jobj.contains(searchFor))
 | 
			
		||||
    {
 | 
			
		||||
        return jobj[searchFor].toInt();    // toObject(); toArray();
 | 
			
		||||
    } else
 | 
			
		||||
    {
 | 
			
		||||
        //qDebug() << "number not found in Json file";
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool json_searchForObjectInFile(QByteArray filename, QString searchFor, QJsonObject *oneObject)
 | 
			
		||||
{
 | 
			
		||||
    // return an object from the json file
 | 
			
		||||
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
 | 
			
		||||
    QJsonObject jobj = jdoc.object();
 | 
			
		||||
 | 
			
		||||
    if (jobj.contains(searchFor))
 | 
			
		||||
    {
 | 
			
		||||
        *oneObject = jobj[searchFor].toObject();
 | 
			
		||||
        return true;
 | 
			
		||||
    } else
 | 
			
		||||
    {
 | 
			
		||||
        //qDebug() << "Object not found in Json file";
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int json_nrOfPairsInObject(QJsonObject objname)
 | 
			
		||||
{
 | 
			
		||||
    int nrOfPairs=objname.size();
 | 
			
		||||
    qDebug() << "my Json Object has got: " << nrOfPairs<< "pairs";
 | 
			
		||||
    return nrOfPairs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
    if (objname.contains(searchFor))
 | 
			
		||||
    {
 | 
			
		||||
        return objname[searchFor].toString();
 | 
			
		||||
    } else
 | 
			
		||||
    {
 | 
			
		||||
        //qDebug() << "string not found in Json object";
 | 
			
		||||
        return "";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
    if (objname.contains(searchFor))
 | 
			
		||||
    {
 | 
			
		||||
        return objname[searchFor].toInt();
 | 
			
		||||
    } else
 | 
			
		||||
    {
 | 
			
		||||
        //qDebug() << "number not found in Json file";
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool json_searchForArrayInFile(QByteArray filename, QString searchFor, QJsonArray *oneArray)
 | 
			
		||||
{
 | 
			
		||||
    // look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String
 | 
			
		||||
    QJsonDocument jdoc = QJsonDocument::fromJson(filename);
 | 
			
		||||
    QJsonObject jobj = jdoc.object();
 | 
			
		||||
 | 
			
		||||
    if (jobj.contains(searchFor))
 | 
			
		||||
    {
 | 
			
		||||
        *oneArray = jobj[searchFor].toArray();
 | 
			
		||||
        return true;
 | 
			
		||||
    } else
 | 
			
		||||
    {
 | 
			
		||||
        //qDebug() << "Array not found in Json file";
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int json_nrOfValuesInArray(QJsonArray arrayname)
 | 
			
		||||
{
 | 
			
		||||
    int nrOfPairs=arrayname.size();
 | 
			
		||||
    qDebug() << "my Json Array has got: " << nrOfPairs<< "values";
 | 
			
		||||
    return nrOfPairs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool json_getValuesOfArray(QJsonArray arrayname, int *buf, int MaxBufferSize)
 | 
			
		||||
{
 | 
			
		||||
    // assuming that the array consists of integers
 | 
			
		||||
 | 
			
		||||
    /* copy to local buffer:
 | 
			
		||||
    #define MAXNROFARRAYVALUES      100
 | 
			
		||||
    int buf[MAXNROFARRAYVALUES], ii;
 | 
			
		||||
    int nrOfPairs=arrayname.size();
 | 
			
		||||
 | 
			
		||||
    if (nrOfPairs>MAXNROFARRAYVALUES)
 | 
			
		||||
        nrOfPairs=MAXNROFARRAYVALUES;
 | 
			
		||||
 | 
			
		||||
    for (ii=0; ii<nrOfPairs; ii++)
 | 
			
		||||
        buf[ii]=arrayname[ii].toInt();
 | 
			
		||||
    */
 | 
			
		||||
    // copy to host buffer:
 | 
			
		||||
    bool ok=true;
 | 
			
		||||
    int nrOfPairs=arrayname.size();
 | 
			
		||||
 | 
			
		||||
    if (nrOfPairs>MaxBufferSize)
 | 
			
		||||
    {
 | 
			
		||||
        ok=false;       // got not all
 | 
			
		||||
        nrOfPairs=MaxBufferSize;
 | 
			
		||||
    }
 | 
			
		||||
    for (int ii=0; ii<nrOfPairs; ii++)
 | 
			
		||||
        buf[ii]=arrayname[ii].toInt();
 | 
			
		||||
 | 
			
		||||
    return ok;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
void datei_json_readTestFile(QString filename)
 | 
			
		||||
{
 | 
			
		||||
    QByteArray my2Ba;
 | 
			
		||||
    QString    my2Str;
 | 
			
		||||
 | 
			
		||||
    my2Str.clear();
 | 
			
		||||
    my2Ba=datei_readFromFile(filename);
 | 
			
		||||
 | 
			
		||||
    QJsonDocument jdoc = QJsonDocument::fromJson(my2Ba);
 | 
			
		||||
    QJsonObject jobj = jdoc.object();
 | 
			
		||||
    //QJsonParseError jerror;
 | 
			
		||||
    QJsonObject myObj;
 | 
			
		||||
    QJsonArray myArray;
 | 
			
		||||
 | 
			
		||||
        // key value pair consisting of key (unique string) and value (QJsonValue)
 | 
			
		||||
    int nrOfPairs=jobj.size();
 | 
			
		||||
    qDebug() << "my Json file has got: " << nrOfPairs<< "pairs";
 | 
			
		||||
 | 
			
		||||
    if (jobj.contains("Zeit"))
 | 
			
		||||
        qDebug() << "my Json file: " << jobj["Zeit"].toString();    // toObject(); toArray();
 | 
			
		||||
    else
 | 
			
		||||
        qDebug() << "my Json file contains no Zeit";
 | 
			
		||||
 | 
			
		||||
    if (jobj.contains("Humidity"))
 | 
			
		||||
        qDebug() << "my Json file: " << jobj["humidity"].toInt();
 | 
			
		||||
    else
 | 
			
		||||
        qDebug() << "my Json file contains no Humidity";
 | 
			
		||||
 | 
			
		||||
    if (jobj.contains("month"))
 | 
			
		||||
        qDebug() << "my Json file: " << jobj["month"].toObject();   // anzeige QJsonObject()
 | 
			
		||||
    else
 | 
			
		||||
        qDebug() << "my Json file contains no month";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    myObj=jobj["unterstruktur"].toObject();
 | 
			
		||||
    qDebug() << "my unterstruktur: " << myObj["month"].toInt();
 | 
			
		||||
    qDebug() << "my unterstruktur: " << myObj["day of week"].toString();
 | 
			
		||||
    //if (jerror.error == QJsonParseError::NoError)
 | 
			
		||||
    //    qDebug() << "no error";
 | 
			
		||||
 | 
			
		||||
    qDebug() << "my Month: " << myObj["Month"].toInt();
 | 
			
		||||
    //if (myObj["Month"] == QJsonValue::Undefined)
 | 
			
		||||
    //    qDebug() << "no found";     geht nicht
 | 
			
		||||
 | 
			
		||||
    //if (jerror.error != QJsonParseError::NoError)
 | 
			
		||||
      //  qDebug() << "no found";
 | 
			
		||||
 | 
			
		||||
    myArray=jobj["Puffer"].toArray();
 | 
			
		||||
    qDebug() << "my array " <<myArray[2].toInt();
 | 
			
		||||
    //if (jerror.error != QJsonParseError::NoError)
 | 
			
		||||
     //   qDebug() << "no found";
 | 
			
		||||
 | 
			
		||||
    if ( !jobj.contains("Puffer"))
 | 
			
		||||
        qDebug() << "no Puffer found";
 | 
			
		||||
 | 
			
		||||
    if ( !myArray.contains(20))
 | 
			
		||||
        qDebug() << "no entry found";
 | 
			
		||||
} */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// -------------------------------------------------------------------------------------------------
 | 
			
		||||
// ------------------------------------------------------ read, write, copy files -------------------
 | 
			
		||||
// -------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
void datei_closeFile(QString filename)
 | 
			
		||||
{
 | 
			
		||||
    QFile file(filename);
 | 
			
		||||
    file.close();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QByteArray datei_readFromFile(QString filename)
 | 
			
		||||
{
 | 
			
		||||
    //QFile file("/own/H2B/dc2.hex");
 | 
			
		||||
    //QFile file(FILENAME_STRUCTURE);
 | 
			
		||||
    QFile file;
 | 
			
		||||
    file.setFileName(filename);
 | 
			
		||||
    QByteArray myBA;
 | 
			
		||||
 | 
			
		||||
    myBA.clear();
 | 
			
		||||
    if (!file.exists())
 | 
			
		||||
    {
 | 
			
		||||
        qDebug()<<"file not exists";
 | 
			
		||||
        return myBA;
 | 
			
		||||
    } else
 | 
			
		||||
    {
 | 
			
		||||
        if (!file.open(QIODevice::ReadOnly)  )
 | 
			
		||||
        {
 | 
			
		||||
            qDebug()<<"cannot open";
 | 
			
		||||
 | 
			
		||||
        } else
 | 
			
		||||
        {
 | 
			
		||||
            //qDebug()<<"loading file with " << file.size() <<"byte";
 | 
			
		||||
            myBA = file.readAll();
 | 
			
		||||
            //qDebug()<<"datei read: " << myBA;
 | 
			
		||||
            file.close();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return myBA;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool datei_ifFileExists(QString filename)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    QFile file;
 | 
			
		||||
    file.setFileName(filename);
 | 
			
		||||
 | 
			
		||||
    if (file.exists())
 | 
			
		||||
        return true;
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
    QFile file(filename);
 | 
			
		||||
    QFileInfo myFI(filename);
 | 
			
		||||
 | 
			
		||||
    //if (!myFI.isWritable())   //geht nur bei NTFS, weg.
 | 
			
		||||
    //{
 | 
			
		||||
        //file.setPermissions(filename, QFile::WriteOther); geht nicht :(
 | 
			
		||||
    //    qDebug()<<"datei_writeToFile: writing not allowed. set attributes first!";
 | 
			
		||||
    //    return 1;
 | 
			
		||||
    //}
 | 
			
		||||
 | 
			
		||||
    if (file.exists())
 | 
			
		||||
    {
 | 
			
		||||
        if (!file.open(QIODevice::Append))
 | 
			
		||||
        {
 | 
			
		||||
            qDebug()<<"datei_writeToFile cannot open to append";
 | 
			
		||||
            return 2;
 | 
			
		||||
        } else
 | 
			
		||||
        {
 | 
			
		||||
            // add new object to the end of the file
 | 
			
		||||
            file.write(content);
 | 
			
		||||
            file.close();
 | 
			
		||||
            return 0;   // OK
 | 
			
		||||
        }
 | 
			
		||||
    } else
 | 
			
		||||
    {
 | 
			
		||||
        if (!file.open(QIODevice::WriteOnly))
 | 
			
		||||
        {
 | 
			
		||||
            qDebug()<<"datei_writeToFile cannot open new";
 | 
			
		||||
            return 3;
 | 
			
		||||
        } else
 | 
			
		||||
        {
 | 
			
		||||
            qDebug()<<"create new file";
 | 
			
		||||
            // write first lines into file
 | 
			
		||||
            file.write(content);
 | 
			
		||||
            file.close();
 | 
			
		||||
            return 0;   // OK
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool datei_copyFile(QString currentFileName, QString newFileName)
 | 
			
		||||
{
 | 
			
		||||
    // retval=true if successful
 | 
			
		||||
    QFile file;
 | 
			
		||||
    file.setFileName(currentFileName);
 | 
			
		||||
    return file.copy(newFileName);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool datei_clearFile(QString filename)
 | 
			
		||||
{
 | 
			
		||||
    // retval=true if successful
 | 
			
		||||
    QFile file;
 | 
			
		||||
    file.setFileName(filename);
 | 
			
		||||
 | 
			
		||||
    file.remove();  // 3.2.22 erst ganz löschen wegen Schreibrechten
 | 
			
		||||
    if (!file.open(QIODevice::WriteOnly))
 | 
			
		||||
    {
 | 
			
		||||
        qDebug()<<"datei_clearFile  cannot open file to delete";
 | 
			
		||||
        return false;
 | 
			
		||||
    } else
 | 
			
		||||
    {
 | 
			
		||||
        file.write(0);
 | 
			
		||||
        file.close();
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										750
									
								
								src/dcBL.cpp
									
									
									
									
									
								
							
							
						
						
									
										750
									
								
								src/dcBL.cpp
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										994
									
								
								src/hwapi.cpp
									
									
									
									
									
								
							
							
						
						
									
										994
									
								
								src/hwapi.cpp
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										18
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								src/main.cpp
									
									
									
									
									
								
							@@ -1,9 +1,9 @@
 | 
			
		||||
#include <QCoreApplication>
 | 
			
		||||
#include "tslib.h"
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
    QCoreApplication a(argc, argv);
 | 
			
		||||
 | 
			
		||||
    return a.exec();
 | 
			
		||||
}
 | 
			
		||||
#include <QCoreApplication>
 | 
			
		||||
#include "tslib.h"
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
    QCoreApplication a(argc, argv);
 | 
			
		||||
 | 
			
		||||
    return a.exec();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1018
									
								
								src/sendWRcmd.cpp
									
									
									
									
									
								
							
							
						
						
									
										1018
									
								
								src/sendWRcmd.cpp
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										15
									
								
								src/serial_port_thread.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/serial_port_thread.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
#include "serial_port_thread.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
SerialPortThread::SerialPortThread(QObject *parent)
 | 
			
		||||
    : QThread(parent) {
 | 
			
		||||
    this->setObjectName("SerialPortThread");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SerialPortThread::~SerialPortThread() {
 | 
			
		||||
    m_loop.quit();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SerialPortThread::run() {
 | 
			
		||||
    m_loop.exec();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										244
									
								
								src/serial_port_worker.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								src/serial_port_worker.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,244 @@
 | 
			
		||||
#include "serial_port_worker.h"
 | 
			
		||||
#include "serial_port_thread.h"
 | 
			
		||||
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
#include <QCoreApplication>
 | 
			
		||||
 | 
			
		||||
std::atomic<uint8_t> Command::m_nextSendBufferIndex{0};
 | 
			
		||||
std::atomic<uint8_t> Command::m_nextRecvBufferIndex{0};
 | 
			
		||||
char Command::m_sendBuffers[256][SEND_BLOCK_SIZE]{{0}};
 | 
			
		||||
char Command::m_recvBuffers[256][SEND_BLOCK_SIZE]{{0}};
 | 
			
		||||
 | 
			
		||||
uint32_t Command::getNextCommandPriority(uint8_t priorityClass) {
 | 
			
		||||
    static std::atomic<std::uint32_t> priority_1{0};
 | 
			
		||||
    static std::atomic<std::uint32_t> priority_2{1000000000};
 | 
			
		||||
    static std::atomic<std::uint32_t> priority_3{2000000000};
 | 
			
		||||
    static std::atomic<std::uint32_t> priority_4{3000000000};
 | 
			
		||||
    switch (priorityClass) {
 | 
			
		||||
    case PRIORITY_1:
 | 
			
		||||
        return priority_1.fetch_add(1);
 | 
			
		||||
    case PRIORITY_2:
 | 
			
		||||
        return priority_2.fetch_add(1);
 | 
			
		||||
    case PRIORITY_3:
 | 
			
		||||
        return priority_3.fetch_add(1);
 | 
			
		||||
    case PRIORITY_4:
 | 
			
		||||
        return priority_4.fetch_add(1);
 | 
			
		||||
    }
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *Command::getNextSendBuffer() {
 | 
			
		||||
    uint8_t const nextIndex = m_nextSendBufferIndex.fetch_add(1);
 | 
			
		||||
    return &m_sendBuffers[nextIndex][0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *Command::getNextRecvBuffer() {
 | 
			
		||||
    uint8_t const nextIndex = m_nextRecvBufferIndex.fetch_add(1);
 | 
			
		||||
    return &m_recvBuffers[nextIndex][0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Command::Command(uint16_t cmdId, uint8_t sendBufferLength,
 | 
			
		||||
                 uint8_t recvBufferLength, uint8_t priorityClass)
 | 
			
		||||
    : m_priority(getNextCommandPriority(priorityClass))
 | 
			
		||||
    , m_priorityClass(priorityClass)
 | 
			
		||||
    , m_cmdId(cmdId)
 | 
			
		||||
    , m_sendBuffer(Command::getNextSendBuffer())
 | 
			
		||||
    , m_recvBuffer(Command::getNextRecvBuffer())
 | 
			
		||||
    , m_sendBufferLength(sendBufferLength)
 | 
			
		||||
    , m_recvBufferLength(recvBufferLength) {
 | 
			
		||||
    memset(m_sendBuffer, 0x00, sizeof(m_sendBuffers[0]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Command::Command()
 | 
			
		||||
    : m_priority(0)
 | 
			
		||||
    , m_priorityClass(0)
 | 
			
		||||
    , m_cmdId(0)
 | 
			
		||||
    , m_sendBuffer(0)
 | 
			
		||||
    , m_recvBuffer(0)
 | 
			
		||||
    , m_sendBufferLength(0)
 | 
			
		||||
    , m_recvBufferLength(0) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* \brief Constructor for SerialPort
 | 
			
		||||
*
 | 
			
		||||
* @date 08.11.2022 – first draft.
 | 
			
		||||
*
 | 
			
		||||
*/
 | 
			
		||||
SerialPortWorker::SerialPortWorker(QString portName, enum QSerialPort::BaudRate baudRate, QObject *parent)
 | 
			
		||||
    : QThread(parent)
 | 
			
		||||
    , m_serialPort()
 | 
			
		||||
    , m_serialPortOpened(false)
 | 
			
		||||
    , m_portName(portName)
 | 
			
		||||
    , m_baudRate(baudRate)
 | 
			
		||||
    , m_bytesWritten(0) {
 | 
			
		||||
    this->setObjectName("SerialPortWorker");
 | 
			
		||||
 | 
			
		||||
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
 | 
			
		||||
        if (!info.isNull()) {
 | 
			
		||||
            qDebug() << "Name .......... " << info.portName();
 | 
			
		||||
            qDebug() << "Description ... " << info.description();
 | 
			
		||||
            qDebug() << "Manufacturer .. " << info.manufacturer();
 | 
			
		||||
            qDebug() << "SerialNumber .. " << info.serialNumber();
 | 
			
		||||
            if (info.hasProductIdentifier()) {
 | 
			
		||||
                qDebug() << "Product-ID .... " << info.productIdentifier();
 | 
			
		||||
            }
 | 
			
		||||
            if (info.hasVendorIdentifier()) {
 | 
			
		||||
                qDebug() << "Vendor-ID ..... " << info.vendorIdentifier();
 | 
			
		||||
            }
 | 
			
		||||
            qDebug() << "Location ...... " << info.systemLocation();
 | 
			
		||||
 | 
			
		||||
            if (info.portName() == m_portName) {
 | 
			
		||||
                m_serialPortInfo = info;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (m_serialPortInfo.portName() == m_portName) {
 | 
			
		||||
        m_serialPort.setPort(m_serialPortInfo);
 | 
			
		||||
        m_serialPort.setPortName(m_portName);
 | 
			
		||||
        m_serialPort.setDataBits(QSerialPort::Data8);
 | 
			
		||||
        m_serialPort.setParity(QSerialPort::NoParity);
 | 
			
		||||
        m_serialPort.setStopBits(QSerialPort::OneStop);
 | 
			
		||||
        m_serialPort.setFlowControl(QSerialPort::NoFlowControl);
 | 
			
		||||
        m_serialPortOpened = m_serialPort.open(QIODevice::ReadWrite);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SerialPortWorker::~SerialPortWorker() {
 | 
			
		||||
    closeSerialPort();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SerialPortWorker::run() {
 | 
			
		||||
    SerialPortThread serialPortThread;
 | 
			
		||||
    this->moveToThread(&serialPortThread); // not really necessary
 | 
			
		||||
 | 
			
		||||
    // Note: because this thread is moved to serialPortThread, the event loop
 | 
			
		||||
    // used will be the one of serialPortThread (this-thread does not even have one).
 | 
			
		||||
    // This is the only purpose of serialPortThread.
 | 
			
		||||
    serialPortThread.start();
 | 
			
		||||
 | 
			
		||||
    connect(&m_serialPort, SIGNAL(readyRead()), this, SLOT(getBytesAvailable()));
 | 
			
		||||
    connect(&m_serialPort, SIGNAL(bytesWritten(qint64)), this, SLOT(getNumberOfBytesWritten(qint64)));
 | 
			
		||||
 | 
			
		||||
    while (m_serialPortOpened) {
 | 
			
		||||
        Command nextCmd = getNextCommand();
 | 
			
		||||
        if (nextCmd.m_cmdId == Command::QUIT_SENTINEL) {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        QByteArray data(nextCmd.getNextSendBuffer(), nextCmd.m_sendBufferLength);
 | 
			
		||||
        m_bytesWritten = 0;
 | 
			
		||||
        m_serialPort.write(data);
 | 
			
		||||
        // process events in event loop of associated thread
 | 
			
		||||
        serialPortThread.getEventLoop().processEvents(QEventLoop::ExcludeUserInputEvents, TIMEOUT);
 | 
			
		||||
        int maxWaitTime = WAIT_TIME_MAX;
 | 
			
		||||
 | 
			
		||||
        while (maxWaitTime > 0 && m_bytesWritten < (uint32_t)data.size()) {
 | 
			
		||||
            if (!m_serialPort.waitForBytesWritten(100)) { // wait timeout-ms for the bytes to be written
 | 
			
		||||
                // process events in event loop of associated thread
 | 
			
		||||
                serialPortThread.getEventLoop().processEvents(QEventLoop::ExcludeUserInputEvents, TIMEOUT);
 | 
			
		||||
                maxWaitTime -= TIMEOUT;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (m_bytesWritten == (uint32_t)data.size()) { // data written, wait for result
 | 
			
		||||
            if (nextCmd.m_recvBufferLength > 0) {
 | 
			
		||||
                // process events in event loop of associated thread
 | 
			
		||||
                serialPortThread.getEventLoop().processEvents(QEventLoop::ExcludeUserInputEvents, TIMEOUT);
 | 
			
		||||
                maxWaitTime = WAIT_TIME_MAX;
 | 
			
		||||
                while (maxWaitTime > 0 && m_bytesAvailable < nextCmd.m_recvBufferLength) {
 | 
			
		||||
                    if (!m_serialPort.waitForReadyRead(100)) {
 | 
			
		||||
                        // process events in event loop of associated thread
 | 
			
		||||
                        serialPortThread.getEventLoop().processEvents(QEventLoop::ExcludeUserInputEvents, TIMEOUT);
 | 
			
		||||
                        maxWaitTime -= TIMEOUT;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                uint32_t const bytesAvailable = m_bytesAvailable;
 | 
			
		||||
                if (bytesAvailable == nextCmd.m_recvBufferLength) {
 | 
			
		||||
                    QByteArray result = m_serialPort.read(bytesAvailable);
 | 
			
		||||
                    if (!result.isEmpty() && ((uint32_t)result.size() == bytesAvailable)) {
 | 
			
		||||
                        memcpy(nextCmd.m_recvBuffer, result.data(), bytesAvailable);
 | 
			
		||||
                        insertResult(nextCmd);
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
                    // error
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            // error
 | 
			
		||||
        }
 | 
			
		||||
    } // while (m_serialPortOpened)
 | 
			
		||||
 | 
			
		||||
    serialPortThread.quit();
 | 
			
		||||
    serialPortThread.wait();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool SerialPortWorker::openSerialPort() {
 | 
			
		||||
    if (!m_serialPortOpened) {
 | 
			
		||||
        return m_serialPort.open(QIODevice::ReadWrite);
 | 
			
		||||
    }
 | 
			
		||||
    return false; // opening twice is not allowed
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SerialPortWorker::closeSerialPort() {
 | 
			
		||||
    if (m_serialPortOpened) {
 | 
			
		||||
        m_serialPort.close();
 | 
			
		||||
        m_serialPortOpened = false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SerialPortWorker::quit() {
 | 
			
		||||
    Command cmd(Command::QUIT_SENTINEL, 0, 0, Command::PRIORITY_1);
 | 
			
		||||
    insertCommand(cmd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SerialPortWorker::insertCommand(Command const &cmd) {
 | 
			
		||||
    {   std::lock_guard<std::mutex> lock(m_sendQueueMutex);
 | 
			
		||||
        m_sendQueue.push(cmd);
 | 
			
		||||
    } // release lock
 | 
			
		||||
    m_sendQueueCondVar.notify_one();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Command SerialPortWorker::getNextCommand() {
 | 
			
		||||
    Command nextCmd;
 | 
			
		||||
    {   std::unique_lock<std::mutex> lock(m_sendQueueMutex);
 | 
			
		||||
        m_sendQueueCondVar.wait(lock, [this]{ return !this->m_sendQueue.empty(); });
 | 
			
		||||
        nextCmd = m_sendQueue.top();
 | 
			
		||||
        m_sendQueue.pop();
 | 
			
		||||
    } // release lock
 | 
			
		||||
    return nextCmd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SerialPortWorker::insertResult(Command const &result) {
 | 
			
		||||
    {   std::lock_guard<std::mutex> lock(m_recvQueueMutex);
 | 
			
		||||
        m_recvQueue.push_back(result);
 | 
			
		||||
    } // release lock
 | 
			
		||||
    m_recvQueueCondVar.notify_one();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool SerialPortWorker::getNextResult(Command &nextResult, int timeout) {
 | 
			
		||||
    bool timed_out = false;
 | 
			
		||||
    {   std::unique_lock<std::mutex> lock(m_recvQueueMutex);
 | 
			
		||||
        if (m_recvQueueCondVar.wait_for(lock, std::chrono::milliseconds(timeout),
 | 
			
		||||
                                    [this]{ return !this->m_recvQueue.empty(); })) {
 | 
			
		||||
            nextResult = m_recvQueue.front();
 | 
			
		||||
            m_recvQueue.pop_front();
 | 
			
		||||
            return true;
 | 
			
		||||
        } else {
 | 
			
		||||
            timed_out = true;
 | 
			
		||||
        }
 | 
			
		||||
    } // release lock
 | 
			
		||||
    return (timed_out == false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SerialPortWorker::getBytesAvailable() {
 | 
			
		||||
    m_bytesAvailable += m_serialPort.bytesAvailable();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool SerialPortWorker::getNumberOfBytesWritten(qint64 bytesWritten) {
 | 
			
		||||
    if (bytesWritten > 0) {
 | 
			
		||||
        m_bytesWritten += (uint32_t)bytesWritten;
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
#include "shared_mem_buffer.h"
 | 
			
		||||
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
#include <QCoreApplication>
 | 
			
		||||
#include <atomic>
 | 
			
		||||
 | 
			
		||||
#ifdef QT_POSIX_IPC
 | 
			
		||||
@@ -9,26 +10,102 @@
 | 
			
		||||
    // macro will be defined. -> we use SystemV shared memory
 | 
			
		||||
#error "QT_POSIX_IPC defined"
 | 
			
		||||
#else
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
#include <sys/ipc.h>    // ftok
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define PROCESS_SHARED (PTHREAD_PROCESS_SHARED)
 | 
			
		||||
 | 
			
		||||
// 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)) {
 | 
			
		||||
                // the creator is the owner of the shared-memory segment
 | 
			
		||||
                SharedMemBuffer *shm = (SharedMemBuffer *)(shMem.data());
 | 
			
		||||
                if (shm) {
 | 
			
		||||
                    shm->init = 0;
 | 
			
		||||
                    // mark the shm
 | 
			
		||||
                    memset(shm->appName, 0x00, sizeof(shm->appName));
 | 
			
		||||
                    strncpy(shm->appName,
 | 
			
		||||
                            QCoreApplication::applicationName().toLocal8Bit().constData(),
 | 
			
		||||
                            sizeof(shm->appName)-1);
 | 
			
		||||
                    shm->pid = getpid();
 | 
			
		||||
 | 
			
		||||
                    // create condition variables plus associated mutexes for
 | 
			
		||||
                    // sending/receiving commands to dc
 | 
			
		||||
                    int r = 0;
 | 
			
		||||
                    if ((r = pthread_mutexattr_init(&shm->sndMtxA)) != 0) {
 | 
			
		||||
                        qCritical() << "init mutex attribute"
 | 
			
		||||
                                    << strerror(errno) << r;
 | 
			
		||||
                    }
 | 
			
		||||
                    if ((r == 0) &&
 | 
			
		||||
                        (r = pthread_mutexattr_setpshared(
 | 
			
		||||
                                &shm->sndMtxA, PTHREAD_PROCESS_SHARED) != 0)) {
 | 
			
		||||
                        qCritical() << "set s-mutex attribute to process shared"
 | 
			
		||||
                                    << strerror(errno) << r;
 | 
			
		||||
                    }
 | 
			
		||||
                    if ((r == 0) &&
 | 
			
		||||
                        (r = pthread_mutex_init(&shm->sndMtx,
 | 
			
		||||
                                                &shm->sndMtxA) != 0)) {
 | 
			
		||||
                        qCritical() << "init s-mutex" << strerror(errno) << r;
 | 
			
		||||
                    }
 | 
			
		||||
                    if ((r == 0) &&
 | 
			
		||||
                        (r = pthread_condattr_init(&shm->sndCndA) != 0)) {
 | 
			
		||||
                        qCritical() << "init s-mutex" << strerror(errno) << r;
 | 
			
		||||
                    }
 | 
			
		||||
                    if ((r == 0) &&
 | 
			
		||||
                        (r = pthread_condattr_setpshared(
 | 
			
		||||
                                &shm->sndCndA, PTHREAD_PROCESS_SHARED) != 0)) {
 | 
			
		||||
                        qCritical() << "init s-cond attribute to process shared"
 | 
			
		||||
                                    << strerror(errno) << r;
 | 
			
		||||
                    }
 | 
			
		||||
                    if ((r == 0) &&
 | 
			
		||||
                        (r = pthread_cond_init(&shm->sndCndV,
 | 
			
		||||
                                               &shm->sndCndA) != 0)) {
 | 
			
		||||
                        qCritical() << "init s-condvar" << strerror(errno) << r;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if ((r = pthread_mutexattr_init(&shm->rcvMtxA)) != 0) {
 | 
			
		||||
                        qCritical() << "init r-mutex attribute"
 | 
			
		||||
                                    << strerror(errno) << r;
 | 
			
		||||
                    }
 | 
			
		||||
                    if ((r == 0) &&
 | 
			
		||||
                        (r = pthread_mutexattr_setpshared(
 | 
			
		||||
                                &shm->rcvMtxA, PTHREAD_PROCESS_SHARED) != 0)) {
 | 
			
		||||
                        qCritical() << "set r-mutex attribute to process shared"
 | 
			
		||||
                                    << strerror(errno) << r;
 | 
			
		||||
                    }
 | 
			
		||||
                    if ((r == 0) &&
 | 
			
		||||
                        (r = pthread_mutex_init(&shm->rcvMtx,
 | 
			
		||||
                                                &shm->rcvMtxA) != 0)) {
 | 
			
		||||
                        qCritical() << "init r-mutex" << strerror(errno) << r;
 | 
			
		||||
                    }
 | 
			
		||||
                    if ((r == 0) &&
 | 
			
		||||
                        (r = pthread_condattr_init(&shm->rcvCndA) != 0)) {
 | 
			
		||||
                        qCritical() << "init r-mutex" << strerror(errno) << r;
 | 
			
		||||
                    }
 | 
			
		||||
                    if ((r == 0) &&
 | 
			
		||||
                        (r = pthread_condattr_setpshared(
 | 
			
		||||
                                &shm->rcvCndA, PTHREAD_PROCESS_SHARED) != 0)) {
 | 
			
		||||
                        qCritical() << "init r-cond attribute to process shared"
 | 
			
		||||
                                    << strerror(errno) << r;
 | 
			
		||||
                    }
 | 
			
		||||
                    if ((r == 0) &&
 | 
			
		||||
                        (r = pthread_cond_init(&shm->rcvCndV,
 | 
			
		||||
                                               &shm->rcvCndA) != 0)) {
 | 
			
		||||
                        qCritical() << "init s-condvar" << strerror(errno) << r;
 | 
			
		||||
                    }
 | 
			
		||||
                    shm->init = 1;
 | 
			
		||||
                }
 | 
			
		||||
                return &shMem;
 | 
			
		||||
            } else {
 | 
			
		||||
                if (shMem.error() == QSharedMemory::AlreadyExists) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1780
									
								
								src/storeINdata.cpp
									
									
									
									
									
								
							
							
						
						
									
										1780
									
								
								src/storeINdata.cpp
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user