From 52e15607060cbc3a730f15b81f0dca3ac9052f7b Mon Sep 17 00:00:00 2001 From: Fanda Vacek Date: Fri, 24 May 2024 19:30:35 +0200 Subject: [PATCH] Move libsiut to submodule --- .gitmodules | 3 + 3rdparty/siutils | 1 + CMakeLists.txt | 2 +- .../libquickeventcore/CMakeLists.txt | 2 +- libsiut/CMakeLists.txt | 39 - libsiut/include/siut/commport.h | 1 - libsiut/include/siut/sicard.h | 1 - libsiut/include/siut/sidevicedriver.h | 1 - libsiut/include/siut/simessagedata.h | 1 - libsiut/include/siut/sipunch.h | 1 - libsiut/include/siut/sitask.h | 1 - libsiut/include/siut/siutglobal.h | 1 - libsiut/libsiut-cs_CZ.ts | 157 ---- libsiut/libsiut-fr_FR.ts | 147 ---- libsiut/libsiut-nb_NO.ts | 147 ---- libsiut/libsiut-nl_BE.ts | 147 ---- libsiut/libsiut-pl_PL.ts | 147 ---- libsiut/libsiut-ru_RU.ts | 147 ---- libsiut/libsiut-uk_UA.ts | 157 ---- libsiut/src/device/commport.cpp | 148 ---- libsiut/src/device/commport.h | 50 -- libsiut/src/device/crc529.c | 72 -- libsiut/src/device/crc529.h | 14 - libsiut/src/device/sidevicedriver.cpp | 219 ----- libsiut/src/device/sidevicedriver.h | 65 -- libsiut/src/device/sitask.cpp | 759 ------------------ libsiut/src/device/sitask.h | 194 ----- libsiut/src/message/simessage.cpp | 612 -------------- libsiut/src/message/simessage.h | 125 --- libsiut/src/message/simessagedata.cpp | 256 ------ libsiut/src/message/simessagedata.h | 66 -- libsiut/src/sicard.cpp | 93 --- libsiut/src/sicard.h | 50 -- libsiut/src/sipunch.cpp | 55 -- libsiut/src/sipunch.h | 41 - libsiut/src/siutglobal.h | 21 - 36 files changed, 6 insertions(+), 3937 deletions(-) create mode 160000 3rdparty/siutils delete mode 100644 libsiut/CMakeLists.txt delete mode 100644 libsiut/include/siut/commport.h delete mode 100644 libsiut/include/siut/sicard.h delete mode 100644 libsiut/include/siut/sidevicedriver.h delete mode 100644 libsiut/include/siut/simessagedata.h delete mode 100644 libsiut/include/siut/sipunch.h delete mode 100644 libsiut/include/siut/sitask.h delete mode 100644 libsiut/include/siut/siutglobal.h delete mode 100644 libsiut/libsiut-cs_CZ.ts delete mode 100644 libsiut/libsiut-fr_FR.ts delete mode 100644 libsiut/libsiut-nb_NO.ts delete mode 100644 libsiut/libsiut-nl_BE.ts delete mode 100644 libsiut/libsiut-pl_PL.ts delete mode 100644 libsiut/libsiut-ru_RU.ts delete mode 100644 libsiut/libsiut-uk_UA.ts delete mode 100644 libsiut/src/device/commport.cpp delete mode 100644 libsiut/src/device/commport.h delete mode 100644 libsiut/src/device/crc529.c delete mode 100644 libsiut/src/device/crc529.h delete mode 100644 libsiut/src/device/sidevicedriver.cpp delete mode 100644 libsiut/src/device/sidevicedriver.h delete mode 100644 libsiut/src/device/sitask.cpp delete mode 100644 libsiut/src/device/sitask.h delete mode 100644 libsiut/src/message/simessage.cpp delete mode 100644 libsiut/src/message/simessage.h delete mode 100644 libsiut/src/message/simessagedata.cpp delete mode 100644 libsiut/src/message/simessagedata.h delete mode 100644 libsiut/src/sicard.cpp delete mode 100644 libsiut/src/sicard.h delete mode 100644 libsiut/src/sipunch.cpp delete mode 100644 libsiut/src/sipunch.h delete mode 100644 libsiut/src/siutglobal.h diff --git a/.gitmodules b/.gitmodules index 5006631e0..4ed7080f6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "3rdparty/libshv"] path = 3rdparty/libshv url = https://github.com/silicon-heaven/libshv.git +[submodule "3rdparty/siutils"] + path = 3rdparty/siutils + url = git@github.com:Quick-Event/siutils.git diff --git a/3rdparty/siutils b/3rdparty/siutils new file mode 160000 index 000000000..a26dd9d08 --- /dev/null +++ b/3rdparty/siutils @@ -0,0 +1 @@ +Subproject commit a26dd9d08b57e5be70d5afdda2e84792ac307b26 diff --git a/CMakeLists.txt b/CMakeLists.txt index 16ae51fc7..609963e80 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,7 @@ if(Qt_FOUND) message(STATUS "Building libqf and qsqlmon only") add_subdirectory(tools/qsqlmon) else() - add_subdirectory(libsiut) + add_subdirectory(3rdparty/siutils/libsiut) add_subdirectory(libquickevent) add_subdirectory(quickevent) add_subdirectory(quickhttpd) diff --git a/libquickevent/libquickeventcore/CMakeLists.txt b/libquickevent/libquickeventcore/CMakeLists.txt index 72ef7961a..80ad5e63d 100644 --- a/libquickevent/libquickeventcore/CMakeLists.txt +++ b/libquickevent/libquickeventcore/CMakeLists.txt @@ -42,7 +42,7 @@ endif() target_sources(libquickeventcore PRIVATE ${QM_FILES}) target_compile_definitions(libquickeventcore PRIVATE QUICKEVENTCORE_BUILD_DLL) -target_link_libraries(libquickeventcore PUBLIC Qt::Core Qt::Sql libsiut) +target_link_libraries(libquickeventcore PUBLIC Qt::Core Qt::Sql libqfcore libsiut) target_include_directories(libquickeventcore PUBLIC include) install(TARGETS libquickeventcore) diff --git a/libsiut/CMakeLists.txt b/libsiut/CMakeLists.txt deleted file mode 100644 index 018d807ff..000000000 --- a/libsiut/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -add_library(libsiut SHARED - src/device/crc529.c - src/device/commport.cpp - src/device/sidevicedriver.cpp - src/device/sitask.cpp - src/message/simessagedata.cpp - src/sicard.cpp - src/sipunch.cpp - ) - -if(USE_QT6) - qt6_add_translation(QM_FILES - libsiut-cs_CZ.ts - libsiut-fr_FR.ts - libsiut-nb_NO.ts - libsiut-nl_BE.ts - libsiut-pl_PL.ts - libsiut-ru_RU.ts - libsiut-uk_UA.ts - ) -else() - qt5_add_translation(QM_FILES - libsiut-cs_CZ.ts - libsiut-fr_FR.ts - libsiut-nb_NO.ts - libsiut-nl_BE.ts - libsiut-pl_PL.ts - libsiut-ru_RU.ts - libsiut-uk_UA.ts - ) -endif() - -target_sources(libsiut PRIVATE ${QM_FILES}) -target_compile_definitions(libsiut PRIVATE SIUT_BUILD_DLL) -target_link_libraries(libsiut PUBLIC Qt::Core Qt::SerialPort libqfcore) -target_include_directories(libsiut PUBLIC include) - -install(TARGETS libsiut) -install(FILES ${QM_FILES} DESTINATION ${CMAKE_INSTALL_BINDIR}/translations) diff --git a/libsiut/include/siut/commport.h b/libsiut/include/siut/commport.h deleted file mode 100644 index 58c19a4cc..000000000 --- a/libsiut/include/siut/commport.h +++ /dev/null @@ -1 +0,0 @@ -#include "../../src/device/commport.h" diff --git a/libsiut/include/siut/sicard.h b/libsiut/include/siut/sicard.h deleted file mode 100644 index 62478a147..000000000 --- a/libsiut/include/siut/sicard.h +++ /dev/null @@ -1 +0,0 @@ -#include "../../src/sicard.h" diff --git a/libsiut/include/siut/sidevicedriver.h b/libsiut/include/siut/sidevicedriver.h deleted file mode 100644 index 45a73d418..000000000 --- a/libsiut/include/siut/sidevicedriver.h +++ /dev/null @@ -1 +0,0 @@ -#include "../../src/device/sidevicedriver.h" diff --git a/libsiut/include/siut/simessagedata.h b/libsiut/include/siut/simessagedata.h deleted file mode 100644 index 208aab03c..000000000 --- a/libsiut/include/siut/simessagedata.h +++ /dev/null @@ -1 +0,0 @@ -#include "../../src/message/simessagedata.h" diff --git a/libsiut/include/siut/sipunch.h b/libsiut/include/siut/sipunch.h deleted file mode 100644 index dce62525e..000000000 --- a/libsiut/include/siut/sipunch.h +++ /dev/null @@ -1 +0,0 @@ -#include "../../src/sipunch.h" diff --git a/libsiut/include/siut/sitask.h b/libsiut/include/siut/sitask.h deleted file mode 100644 index 56c73844b..000000000 --- a/libsiut/include/siut/sitask.h +++ /dev/null @@ -1 +0,0 @@ -#include "../../src/device/sitask.h" diff --git a/libsiut/include/siut/siutglobal.h b/libsiut/include/siut/siutglobal.h deleted file mode 100644 index d82409758..000000000 --- a/libsiut/include/siut/siutglobal.h +++ /dev/null @@ -1 +0,0 @@ -#include "../../src/siutglobal.h" diff --git a/libsiut/libsiut-cs_CZ.ts b/libsiut/libsiut-cs_CZ.ts deleted file mode 100644 index abc6fbd45..000000000 --- a/libsiut/libsiut-cs_CZ.ts +++ /dev/null @@ -1,157 +0,0 @@ - - - - - SICard - - - stationNumber: %1 - číslo kontroly: %1 - - - - cardNumber: %1 - číslo čipu: %1 - - - - check: %1 - kontrola čipu: %1 - - - - start: %1 - start: %1 - - - - finish: %1 - cíl: %1 - - - - SiStationConfig - - - Station number: {{StationNumber}} -Extended mode: {{ExtendedMode}} -Auto send: {{AutoSend}} -Handshake: {{HandShake}} -Password access: {{PasswordAccess}} -Read out after punch: {{ReadOutAfterPunch}} - - Jednotka číslo: {{StationNumber}} -Extended mód: {{ExtendedMode}} -Auto send: {{AutoSend}} -Handshake: {{HandShake}} -Password access: {{PasswordAccess}} -Vyčítat po oražení: {{ReadOutAfterPunch}} - - - - - - - - - True - Zapnuto - - - - - - - - False - Vypnuto - - - - siut::CommPort - - - Available ports: %1 - Dostupné porty: %1 - - - - Connecting to %1 - baudrate: %2, data bits: %3, parity: %4, stop bits: %5 - Připojování k %1 - baudrate: %2, datové bity: %3, parita: %4, stop bity: %5 - - - - %1 connected OK - %1 připojeno OK - - - - %1 connect ERROR: %2 - %1 chyba při připojování: %2 - - - - %1 closed - %1 odpojeno - - - - possible solution: -Wait at least 10 seconds and then try again. - možné řešení: -Počkejte alespoň 10 sekund a potom to zkuste znovu. - - - - There are no ports available. - Nejsou k dispozici žádné porty. - - - - Selected port %1 is not available. -List of accessible ports: - - - Vybraný port %1 není k dispozici. -Seznam dostupných portů: - - - - - - siut::DeviceDriver - - - Garbage received, stripping %1 characters from beginning of buffer - Přijata nevalidní data, odstraňuji %1 znaků ze začátku vyrovnávací paměti - - - - NAK received - Přijato NAK - - - - Legacy protocol is not supported, switch station to extended one. - Legacy protokol není podporován, přepněte jednotku na extended protokol. - - - - Valid message shall end with ETX or NAK, throwing data away - Validní zpráva musí končit s ETX nebo NAK, přeskakuji data - - - - SIDeviceDriver::sendCommand() - ERROR Sending of EXT commands only is supported for sending. - SIDeviceDriver::sendCommand() - CHYBA - je podporováno pouze odesílání EXT příkazů. - - - - siut::SiTask - - - SiCommand timeout after %1 sec. - SiCommand timeout po %1 sek. - - - diff --git a/libsiut/libsiut-fr_FR.ts b/libsiut/libsiut-fr_FR.ts deleted file mode 100644 index a1de101b6..000000000 --- a/libsiut/libsiut-fr_FR.ts +++ /dev/null @@ -1,147 +0,0 @@ - - - - - SICard - - - stationNumber: %1 - - - - - cardNumber: %1 - - - - - check: %1 - - - - - start: %1 - - - - - finish: %1 - - - - - SiStationConfig - - - Station number: {{StationNumber}} -Extended mode: {{ExtendedMode}} -Auto send: {{AutoSend}} -Handshake: {{HandShake}} -Password access: {{PasswordAccess}} -Read out after punch: {{ReadOutAfterPunch}} - - - - - - - - - - True - - - - - - - - - False - - - - - siut::CommPort - - - Available ports: %1 - - - - - Connecting to %1 - baudrate: %2, data bits: %3, parity: %4, stop bits: %5 - - - - - %1 connected OK - - - - - %1 connect ERROR: %2 - - - - - %1 closed - - - - - possible solution: -Wait at least 10 seconds and then try again. - - - - - There are no ports available. - - - - - Selected port %1 is not available. -List of accessible ports: - - - - - - - siut::DeviceDriver - - - Garbage received, stripping %1 characters from beginning of buffer - - - - - NAK received - - - - - Legacy protocol is not supported, switch station to extended one. - - - - - Valid message shall end with ETX or NAK, throwing data away - - - - - SIDeviceDriver::sendCommand() - ERROR Sending of EXT commands only is supported for sending. - - - - - siut::SiTask - - - SiCommand timeout after %1 sec. - - - - diff --git a/libsiut/libsiut-nb_NO.ts b/libsiut/libsiut-nb_NO.ts deleted file mode 100644 index 281947c2d..000000000 --- a/libsiut/libsiut-nb_NO.ts +++ /dev/null @@ -1,147 +0,0 @@ - - - - - SICard - - - stationNumber: %1 - - - - - cardNumber: %1 - - - - - check: %1 - - - - - start: %1 - - - - - finish: %1 - - - - - SiStationConfig - - - Station number: {{StationNumber}} -Extended mode: {{ExtendedMode}} -Auto send: {{AutoSend}} -Handshake: {{HandShake}} -Password access: {{PasswordAccess}} -Read out after punch: {{ReadOutAfterPunch}} - - - - - - - - - - True - - - - - - - - - False - - - - - siut::CommPort - - - Available ports: %1 - - - - - Connecting to %1 - baudrate: %2, data bits: %3, parity: %4, stop bits: %5 - - - - - %1 connected OK - - - - - %1 connect ERROR: %2 - - - - - %1 closed - - - - - possible solution: -Wait at least 10 seconds and then try again. - - - - - There are no ports available. - - - - - Selected port %1 is not available. -List of accessible ports: - - - - - - - siut::DeviceDriver - - - Garbage received, stripping %1 characters from beginning of buffer - - - - - NAK received - - - - - Legacy protocol is not supported, switch station to extended one. - - - - - Valid message shall end with ETX or NAK, throwing data away - - - - - SIDeviceDriver::sendCommand() - ERROR Sending of EXT commands only is supported for sending. - - - - - siut::SiTask - - - SiCommand timeout after %1 sec. - - - - diff --git a/libsiut/libsiut-nl_BE.ts b/libsiut/libsiut-nl_BE.ts deleted file mode 100644 index 7edd01335..000000000 --- a/libsiut/libsiut-nl_BE.ts +++ /dev/null @@ -1,147 +0,0 @@ - - - - - SICard - - - stationNumber: %1 - - - - - cardNumber: %1 - - - - - check: %1 - - - - - start: %1 - - - - - finish: %1 - - - - - SiStationConfig - - - Station number: {{StationNumber}} -Extended mode: {{ExtendedMode}} -Auto send: {{AutoSend}} -Handshake: {{HandShake}} -Password access: {{PasswordAccess}} -Read out after punch: {{ReadOutAfterPunch}} - - - - - - - - - - True - - - - - - - - - False - - - - - siut::CommPort - - - Available ports: %1 - - - - - Connecting to %1 - baudrate: %2, data bits: %3, parity: %4, stop bits: %5 - - - - - %1 connected OK - - - - - %1 connect ERROR: %2 - - - - - %1 closed - - - - - possible solution: -Wait at least 10 seconds and then try again. - - - - - There are no ports available. - - - - - Selected port %1 is not available. -List of accessible ports: - - - - - - - siut::DeviceDriver - - - Garbage received, stripping %1 characters from beginning of buffer - - - - - NAK received - - - - - Legacy protocol is not supported, switch station to extended one. - - - - - Valid message shall end with ETX or NAK, throwing data away - - - - - SIDeviceDriver::sendCommand() - ERROR Sending of EXT commands only is supported for sending. - - - - - siut::SiTask - - - SiCommand timeout after %1 sec. - - - - diff --git a/libsiut/libsiut-pl_PL.ts b/libsiut/libsiut-pl_PL.ts deleted file mode 100644 index 6ec31eca8..000000000 --- a/libsiut/libsiut-pl_PL.ts +++ /dev/null @@ -1,147 +0,0 @@ - - - - - SICard - - - stationNumber: %1 - - - - - cardNumber: %1 - - - - - check: %1 - - - - - start: %1 - - - - - finish: %1 - - - - - SiStationConfig - - - Station number: {{StationNumber}} -Extended mode: {{ExtendedMode}} -Auto send: {{AutoSend}} -Handshake: {{HandShake}} -Password access: {{PasswordAccess}} -Read out after punch: {{ReadOutAfterPunch}} - - - - - - - - - - True - - - - - - - - - False - - - - - siut::CommPort - - - Available ports: %1 - - - - - Connecting to %1 - baudrate: %2, data bits: %3, parity: %4, stop bits: %5 - - - - - %1 connected OK - - - - - %1 connect ERROR: %2 - - - - - %1 closed - - - - - possible solution: -Wait at least 10 seconds and then try again. - - - - - There are no ports available. - - - - - Selected port %1 is not available. -List of accessible ports: - - - - - - - siut::DeviceDriver - - - Garbage received, stripping %1 characters from beginning of buffer - - - - - NAK received - - - - - Legacy protocol is not supported, switch station to extended one. - - - - - Valid message shall end with ETX or NAK, throwing data away - - - - - SIDeviceDriver::sendCommand() - ERROR Sending of EXT commands only is supported for sending. - - - - - siut::SiTask - - - SiCommand timeout after %1 sec. - - - - diff --git a/libsiut/libsiut-ru_RU.ts b/libsiut/libsiut-ru_RU.ts deleted file mode 100644 index a1d138c20..000000000 --- a/libsiut/libsiut-ru_RU.ts +++ /dev/null @@ -1,147 +0,0 @@ - - - - - SICard - - - stationNumber: %1 - - - - - cardNumber: %1 - - - - - check: %1 - - - - - start: %1 - - - - - finish: %1 - - - - - SiStationConfig - - - Station number: {{StationNumber}} -Extended mode: {{ExtendedMode}} -Auto send: {{AutoSend}} -Handshake: {{HandShake}} -Password access: {{PasswordAccess}} -Read out after punch: {{ReadOutAfterPunch}} - - - - - - - - - - True - - - - - - - - - False - - - - - siut::CommPort - - - Available ports: %1 - - - - - Connecting to %1 - baudrate: %2, data bits: %3, parity: %4, stop bits: %5 - - - - - %1 connected OK - - - - - %1 connect ERROR: %2 - - - - - %1 closed - - - - - possible solution: -Wait at least 10 seconds and then try again. - - - - - There are no ports available. - - - - - Selected port %1 is not available. -List of accessible ports: - - - - - - - siut::DeviceDriver - - - Garbage received, stripping %1 characters from beginning of buffer - - - - - NAK received - - - - - Legacy protocol is not supported, switch station to extended one. - - - - - Valid message shall end with ETX or NAK, throwing data away - - - - - SIDeviceDriver::sendCommand() - ERROR Sending of EXT commands only is supported for sending. - - - - - siut::SiTask - - - SiCommand timeout after %1 sec. - - - - diff --git a/libsiut/libsiut-uk_UA.ts b/libsiut/libsiut-uk_UA.ts deleted file mode 100644 index 9ea42de2c..000000000 --- a/libsiut/libsiut-uk_UA.ts +++ /dev/null @@ -1,157 +0,0 @@ - - - - - SICard - - - stationNumber: %1 - номерСтанції: %1 - - - - cardNumber: %1 - номерКартки: %1 - - - - check: %1 - перевірка: %1 - - - - start: %1 - початок: %1 - - - - finish: %1 - закінчення: %1 - - - - SiStationConfig - - - Station number: {{StationNumber}} -Extended mode: {{ExtendedMode}} -Auto send: {{AutoSend}} -Handshake: {{HandShake}} -Password access: {{PasswordAccess}} -Read out after punch: {{ReadOutAfterPunch}} - - Номер станції: {{StationNumber}} -Розширений режим: {{ExtendedMode}} -Авто надсилання: {{AutoSend}} -Рукопотискання: {{HandShake}} -Доступ з паролем: {{PasswordAccess}} -Зчитати після проколу: {{ReadOutAfterPunch}} - - - - - - - - - True - Так - - - - - - - - False - Ні - - - - siut::CommPort - - - Available ports: %1 - Доступні порти: %1 - - - - Connecting to %1 - baudrate: %2, data bits: %3, parity: %4, stop bits: %5 - Під’єднання до %1 - швидкість передачі даних: %2, біти даних: %3, парність: %4, стоп-біти: %5 - - - - %1 connected OK - %1 під’єднано ВДАЛО - - - - %1 connect ERROR: %2 - %1 ПОМИЛКА під’єднання: %2 - - - - %1 closed - %1 закрито - - - - possible solution: -Wait at least 10 seconds and then try again. - можливе вирішення: -Зачекати щонайменше 10 секунд і тоді спробувате знову. - - - - There are no ports available. - Немає доступних портів. - - - - Selected port %1 is not available. -List of accessible ports: - - - Вибраний порт %1 не придатний. -Список доступних портів: - - - - - - siut::DeviceDriver - - - Garbage received, stripping %1 characters from beginning of buffer - Отримано Garbage, видалення %1 символів від початку буфера - - - - NAK received - отримано НАК - - - - Legacy protocol is not supported, switch station to extended one. - Старий протокол не підтримується, перемкніть станцію на розширений. - - - - Valid message shall end with ETX or NAK, throwing data away - Коректне повідомлення закінчується ETX або NAK, дані відкинуто - - - - SIDeviceDriver::sendCommand() - ERROR Sending of EXT commands only is supported for sending. - SIDeviceDriver::sendCommand() - ПОМИЛКА: надсилання EXT команд підтримується тільки для надсилань - - - - siut::SiTask - - - SiCommand timeout after %1 sec. - Не отримано SiCommand через %1 сек. - - - diff --git a/libsiut/src/device/commport.cpp b/libsiut/src/device/commport.cpp deleted file mode 100644 index 225d02617..000000000 --- a/libsiut/src/device/commport.cpp +++ /dev/null @@ -1,148 +0,0 @@ -// -// Author: Frantisek Vacek , (C) 2012 -// -// Copyright: See COPYING file that comes with this distribution -// - -#include "commport.h" - -#include - -#include - -using namespace siut; - -//================================================= -// CommPort -//================================================= -CommPort::CommPort(QObject *parent) -: Super(parent) -{ -} - -CommPort::~CommPort() -{ -} - -bool CommPort::openComm(const QString &_device, int _baudrate, int _data_bits, const QString &_parity_str, bool two_stop_bits) -{ - qfLogFuncFrame(); - close(); - QString device = _device; - { - qfDebug() << "Port enumeration"; - QList port_list = QSerialPortInfo::availablePorts(); - QStringList sl; - for(auto port : port_list) { - if(device.isEmpty()) - device = port.systemLocation(); - sl << port.systemLocation(); - qfDebug() << "\t" << port.portName(); - } - emitCommInfo(NecroLog::Level::Info, tr("Available ports: %1").arg(sl.join(QStringLiteral(", ")))); - } - setPortName(device); - setBaudRate(_baudrate); - setDataBitsAsInt(_data_bits); - setParityAsString(_parity_str); - setStopBits(two_stop_bits? QSerialPort::TwoStop: QSerialPort::OneStop); - //f_commPort->setFlowControl(p.flowControl); - emitCommInfo(NecroLog::Level::Debug, tr("Connecting to %1 - baudrate: %2, data bits: %3, parity: %4, stop bits: %5") - .arg(portName()) - .arg(baudRate()) - .arg(dataBits()) - .arg(parity()) - .arg(stopBits()) - ); - bool ret = Super::open(QIODevice::ReadWrite); - if(ret) { - emit openChanged(true); - emitCommInfo(NecroLog::Level::Info, tr("%1 connected OK").arg(device)); - } - else { - emit openChanged(false); - emitCommInfo(NecroLog::Level::Error, tr("%1 connect ERROR: %2").arg(device).arg(errorString())); - } - return ret; -} - -void CommPort::closeComm() -{ - if(isOpen()) { - Super::close(); - emit openChanged(false); - emitCommInfo(NecroLog::Level::Info, tr("%1 closed").arg(portName())); - } -} - -void CommPort::sendData(const QByteArray &data) -{ - qint64 n = write(data); - if(n != data.size()) - qfError() << "send data error!"; -} - -QString CommPort::errorToUserHint() const -{ - QSerialPort::SerialPortError error_type = error(); - QString error_msg = errorString(); - if(error_type == QSerialPort::PermissionError) { - error_msg.append("\n\n") - .append(tr("" - "possible solution:\n" - "Wait at least 10 seconds and then try again." - "")); - } - if(error_type == QSerialPort::DeviceNotFoundError) { - error_msg.append("\n\n"); - QList port_list = QSerialPortInfo::availablePorts(); - if(port_list.isEmpty()) { - error_msg.append(tr("There are no ports available.")); - } - else { - error_msg.append(tr("" - "Selected port %1 is not available.\n" - "List of accessible ports:\n\n" - "").arg(portName())); - for(auto port : port_list) { - error_msg.append(QChar(0x2022)).append(" ").append(port.systemLocation()).append("\n"); - } - } - } - return error_msg; -} - -void CommPort::emitCommInfo ( NecroLog::Level level, const QString& msg ) -{ - //qfLog(level) << msg; - switch (level) { - case NecroLog::Level::Debug: qfDebug() << msg; break; - case NecroLog::Level::Info: qfInfo() << msg; break; - case NecroLog::Level::Warning: qfWarning() << msg; break; - default: qfError() << msg; break; - } - emit commInfo(level, msg); -} - -void CommPort::setDataBitsAsInt(int data_bits) -{ - DataBits db; - switch(data_bits) { - case 5: db = Data5; break; - case 6: db = Data6; break; - case 7: db = Data7; break; - case 8: db = Data8; break; - default: throw std::runtime_error("Unknown data bits"); break; - } - setDataBits(db); -} - -void CommPort::setParityAsString(const QString &parity_str) -{ - Parity parity = NoParity; - if(parity_str.compare(QLatin1String("odd"), Qt::CaseInsensitive) == 0) parity = OddParity; - else if(parity_str.compare(QLatin1String("even"), Qt::CaseInsensitive) == 0) parity = EvenParity; - else if(parity_str.compare(QLatin1String("space"), Qt::CaseInsensitive) == 0) parity = SpaceParity; - else if(parity_str.compare(QLatin1String("mark"), Qt::CaseInsensitive) == 0) parity = MarkParity; - setParity(parity); -} diff --git a/libsiut/src/device/commport.h b/libsiut/src/device/commport.h deleted file mode 100644 index b9feb8071..000000000 --- a/libsiut/src/device/commport.h +++ /dev/null @@ -1,50 +0,0 @@ - -// -// Author: Frantisek Vacek , (C) 2012 -// -// Copyright: See COPYING file that comes with this distribution -// - -#ifndef SIUT_COMMPORT_H -#define SIUT_COMMPORT_H - -#include - -#include - -#include - -namespace siut { - -class SIUT_DECL_EXPORT CommPort : public QSerialPort -{ - Q_OBJECT -private: - typedef QSerialPort Super; -public: - CommPort(QObject *parent = nullptr); - virtual ~CommPort(); -public: - Q_SIGNAL void openChanged(bool is_open); - bool openComm(const QString &device, int baudrate, int data_bits, const QString& parity, bool two_stop_bits); - void closeComm(); - /* - QString errorString(); - QString portName(); - */ - void sendData(const QByteArray &data); - - Q_SIGNAL void commInfo(NecroLog::Level level, const QString &msg); - - QString errorToUserHint() const; -protected: - virtual void emitCommInfo(NecroLog::Level level, const QString &msg); - - void setDataBitsAsInt(int data_bits); - void setParityAsString(const QString &parity_str); -}; - -} - -#endif // SIUT_COMMPORT_H - diff --git a/libsiut/src/device/crc529.c b/libsiut/src/device/crc529.c deleted file mode 100644 index 593ee2757..000000000 --- a/libsiut/src/device/crc529.c +++ /dev/null @@ -1,72 +0,0 @@ -//*************************************************************************** -//** Autor: Jrgen Ehms -//** -//** Filename: crc529.c -//** -//** Description: Programm to generate 16 BIT CRC -//** -//** Return values: 16 BIT CRC -//** -//** Errormessages: none -//** -//** Version last change description -//** -//** 1.00 07.09.2004 -//*************************************************************************** - - -#define POLYNOM 0x8005 - - -unsigned int crc(unsigned int uiCount,unsigned char *pucDat) -{ -short int iTmp; -unsigned short int uiTmp,uiTmp1,uiVal; -unsigned char *pucTmpDat; - -if (uiCount < 2) return(0); // response value is "0" for none or one data byte -pucTmpDat = pucDat; - -uiTmp1 = *pucTmpDat++; -uiTmp1 = (uiTmp1<<8) + *pucTmpDat++; - -if (uiCount == 2) return(uiTmp1); // response value is CRC for two data bytes -for (iTmp=(int)(uiCount>>1);iTmp>0;iTmp--) -{ - -if (iTmp>1) -{ - uiVal = *pucTmpDat++; - uiVal= (uiVal<<8) + *pucTmpDat++; -} -else -{ - if (uiCount&1) // odd number of data bytes, complete with "0" - { - uiVal = *pucTmpDat; - uiVal= (uiVal<<8); - } - else - { - uiVal=0; //letzte Werte mit 0 - } -} - -for (uiTmp=0;uiTmp<16;uiTmp++) -{ - if (uiTmp1 & 0x8000) - { - uiTmp1 <<= 1; - if (uiVal & 0x8000)uiTmp1++; - uiTmp1 ^= POLYNOM; - } - else - { - uiTmp1 <<= 1; - if (uiVal & 0x8000)uiTmp1++; - } - uiVal <<= 1; - } -} -return(uiTmp1); -} \ No newline at end of file diff --git a/libsiut/src/device/crc529.h b/libsiut/src/device/crc529.h deleted file mode 100644 index 1e11d426c..000000000 --- a/libsiut/src/device/crc529.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef CRC_529_H -#define CRC_529_H - -#ifdef __cplusplus -extern "C" { -#endif - -unsigned int crc(unsigned int uiCount, unsigned char *pucDat); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libsiut/src/device/sidevicedriver.cpp b/libsiut/src/device/sidevicedriver.cpp deleted file mode 100644 index bc1675d4e..000000000 --- a/libsiut/src/device/sidevicedriver.cpp +++ /dev/null @@ -1,219 +0,0 @@ - -// -// Author: Frantisek Vacek , (C) 2011 -// -// Copyright: See COPYING file that comes with this distribution -// - -#include "sidevicedriver.h" -#include "crc529.h" - -//#include - -#include - -#include -#include -#include - -#define logCardRead() qfCInfo("CardRead") - -namespace siut { - -//================================================= -// DeviceDriver -//================================================= -DeviceDriver::DeviceDriver(QObject *parent) - : Super(parent) -{ - //NecroLog::checkLogLevelMetaTypeRegistered(); -} - -DeviceDriver::~DeviceDriver() -{ -} - -namespace { -/* - int byte_at(const QByteArray &ba, int ix) - { - int ret = -1; - if(ix < ba.count()) ret = (unsigned char)ba.at(ix); - return ret; - } -*/ - void set_byte_at(QByteArray &ba, int ix, char b) - { - if(ix == ba.length()) - ba.append(b); - else if(ix < ba.length()) - ba[ix] = b; - else - qfError() << "ByteArray index out of range:" << ix << "size:" << ba.length(); - } -} - -void DeviceDriver::processSIMessageData(const SIMessageData &data) -{ - qfLogFuncFrame(); - qfDebug() << data.toString(); - if(m_currentTask) { - m_currentTask->onSiMessageReceived(data); - return; - } - SIMessageData::Command cmd = data.command(); - switch(cmd) { - case SIMessageData::Command::SICardRemoved: { - logCardRead() << "SICardRemoved"; - break; - } - case SIMessageData::Command::SICard5Detected: { - logCardRead() << "SICard5Detected"; - setSiTask(new SiTaskReadCard5(false)); - break; - } - case SIMessageData::Command::GetSICard5: { - logCardRead() << "GetSICard5"; - setSiTask(new SiTaskReadCard5(true)); - processSIMessageData(data); - break; - } - case SIMessageData::Command::SICard6Detected: { - logCardRead() << "SICard6Detected"; - setSiTask(new SiTaskReadCard6(false)); - break; - } - case SIMessageData::Command::GetSICard6: { - logCardRead() << "GetSICard6"; - setSiTask(new SiTaskReadCard6(true)); - processSIMessageData(data); - break; - } - case SIMessageData::Command::SICard8Detected: { - logCardRead() << "SICard8AndHigherDetected"; - setSiTask(new SiTaskReadCard8(false)); - break; - } - case SIMessageData::Command::GetSICard8: { - logCardRead() << "GetSICard8AndHigher"; - setSiTask(new SiTaskReadCard8(true)); - processSIMessageData(data); - break; - } - default: - qfError() << "unsupported command" << QString::number((uint8_t)cmd, 16); - } -} - -namespace -{ -static const char STX = 0x02; -static const char ETX = 0x03; -static const char ACK = 0x06; -static const char NAK = 0x15; -//static const char DLE = 0x10; -} - -void DeviceDriver::processData(const QByteArray &data) -{ - qfLogFuncFrame() << "\n" << SIMessageData::dumpData(data, 16); - f_rxData.append(data); - while(f_rxData.size() > 3) { - int stx_pos = f_rxData.indexOf(STX); - if(stx_pos > 0) - qfWarning() << tr("Garbage received, stripping %1 characters from beginning of buffer").arg(stx_pos); - // remove multiple STX, this can happen - while(stx_pos < f_rxData.size()-1 && f_rxData[stx_pos+1] == STX) - stx_pos++; - if(stx_pos > 0) { - f_rxData = f_rxData.mid(stx_pos); - stx_pos = 0; - } - // STX,CMD,LEN, data, CRC1,CRC0,ETX/NAK - if(f_rxData.size() < 3) // STX,CMD,LEN - return; - int len = (uint8_t)f_rxData[2]; - len += 3 + 3; - if(f_rxData.size() < len) - return; - uint8_t etx = (uint8_t)f_rxData[len-1]; - if(etx == NAK) { - emitDriverInfo(NecroLog::Level::Error, tr("NAK received")); - } - else if(etx == ETX) { - QByteArray data = f_rxData.mid(0, len); - uint8_t cmd = (uint8_t)data[1]; - if(cmd < 0x80) { - emitDriverInfo(NecroLog::Level::Error, tr("Legacy protocol is not supported, switch station to extended one.")); - } - else { - processSIMessageData(data); - } - } - else { - qfWarning() << tr("Valid message shall end with ETX or NAK, throwing data away"); - } - f_rxData = f_rxData.mid(len); - } -} - -void DeviceDriver::emitDriverInfo( NecroLog::Level level, const QString& msg ) -{ - //qfLog(level) << msg; - emit driverInfo(level, msg); -} - -void DeviceDriver::sendCommand(int cmd, const QByteArray& data) -{ - qfLogFuncFrame(); - if(cmd < 0x80) { - emitDriverInfo(NecroLog::Level::Error, tr("SIDeviceDriver::sendCommand() - ERROR Sending of EXT commands only is supported for sending.")); - } - else { - QByteArray ba; - ba.resize(3); - int len = data.length(); - set_byte_at(ba, 0, STX); - set_byte_at(ba, 1, (char)cmd); - set_byte_at(ba, 2, (char)len); - - ba += data; - - int crc_sum = crc(len + 2, (unsigned char*)ba.constData() + 1); - set_byte_at(ba, ba.length(), (crc_sum >> 8) & 0xFF); - set_byte_at(ba, ba.length(), crc_sum & 0xFF); - set_byte_at(ba, ba.length(), ETX); - qfDebug() << "sending command:" << SIMessageData::dumpData(ba, 16); - //f_commPort->write(ba); - //f_rxTimer->start(); - emit dataToSend(ba); - } -} - -void DeviceDriver::setSiTask(SiTask *task) -{ - if(m_currentTask) { - qfError() << "There is other command in progress already. It will be aborted and deleted."; - m_currentTask->abort(); - } - m_currentTask = task; - SiTask::Type task_type = task->type(); - connect(task, &SiTask::sigSendCommand, this, &DeviceDriver::sendCommand); - connect(task, &SiTask::sigSendACK, this, &DeviceDriver::sendACK); - connect(task, &SiTask::aboutToFinish, this, [this]() { - this->m_currentTask = nullptr; - }); - connect(task, &SiTask::finished, this, [this, task_type](bool ok, QVariant result) { - if(ok) { - emit this->siTaskFinished(static_cast(task_type), result); - } - }); - m_currentTask->start(); -} - -void DeviceDriver::sendACK() -{ - emit dataToSend(QByteArray(1, ACK)); -} - -} diff --git a/libsiut/src/device/sidevicedriver.h b/libsiut/src/device/sidevicedriver.h deleted file mode 100644 index 49253bfc1..000000000 --- a/libsiut/src/device/sidevicedriver.h +++ /dev/null @@ -1,65 +0,0 @@ - -// -// Author: Frantisek Vacek , (C) 2011 -// -// Copyright: See COPYING file that comes with this distribution -// - -#ifndef SIUT_SIDEVICEDRIVER_H -#define SIUT_SIDEVICEDRIVER_H - -#include "sitask.h" - -#include - -#include - -#include - -#include - -class QTimer; - -namespace siut { - -class SIUT_DECL_EXPORT DeviceDriver : public QObject -{ - Q_OBJECT -private: - typedef QObject Super; - -public: - DeviceDriver(QObject *parent = nullptr); - virtual ~DeviceDriver(); - - /// public to allow injection SI data from different sources - /// like UDP socket - virtual void processData(const QByteArray &data); - - void sendCommand(int cmd, const QByteArray& data); - void setSiTask(SiTask *task); - - void sendACK(); - - Q_SIGNAL void driverInfo(NecroLog::Level level, const QString &msg); - //Q_SIGNAL void siMessageReceived(const SIMessageData &msg); - //Q_SIGNAL void siDatagramReceived(const QByteArray &data); - Q_SIGNAL void dataToSend(const QByteArray &data); - Q_SIGNAL void siTaskFinished(int task_type, QVariant result); -protected: - //virtual void onSiMessageReceived(const SIMessageData &msg); - void processSIMessageData(const SIMessageData &msg_data); - void emitDriverInfo(NecroLog::Level level, const QString &msg); -private: - //void sendAck(); - //void abortMessage(); -protected: - QByteArray f_rxData; - SIMessageData f_messageData; - SiTask *m_currentTask = nullptr; -}; - -} - -#endif // SIDEVICEDRIVER_H - diff --git a/libsiut/src/device/sitask.cpp b/libsiut/src/device/sitask.cpp deleted file mode 100644 index 1a83e323a..000000000 --- a/libsiut/src/device/sitask.cpp +++ /dev/null @@ -1,759 +0,0 @@ -#include "sitask.h" -#include "../message/simessagedata.h" - -#include - -#include -#include - -#define logCardRead() qfCInfo("CardRead") - -namespace siut { - -//================================================= -// SiTask -//================================================= -SiTask::SiTask(QObject *parent) - : Super(parent) -{ - m_rxTimer = new QTimer(this); - m_rxTimer->setSingleShot(true); - m_rxTimer->setInterval(5000); - connect(m_rxTimer, &QTimer::timeout, this, [this]() { - qfError() << this << "SiCommand timeout after" << (m_rxTimer->interval() / 1000.) << "sec."; - this->abortWithMessage(tr("SiCommand timeout after %1 sec.").arg(m_rxTimer->interval() / 1000.)); - }); - m_rxTimer->start(); -} - -SiTask::~SiTask() -{ - //qfInfo() << this << "destroyed"; -} - -void SiTask::finishAndDestroy(bool ok, QVariant result) -{ - //qfWarning() << __FUNCTION__ << this; - m_rxTimer->stop(); - emit aboutToFinish(); - emit finished(ok, result); - deleteLater(); -} - -void SiTask::sendACK() -{ - emit sigSendACK(); -} - -void SiTask::sendCommand(int cmd, const QByteArray &data) -{ - //qfInfo() << "restarting timer, active:" << m_rxTimer->isActive() << ", remaining" << m_rxTimer->remainingTime() << "msec"; - m_rxTimer->start(); - emit sigSendCommand(cmd, data); -} - -//=============================================================== -// CmdSetDirectRemoteMode -//=============================================================== -SiTaskSetDirectRemoteMode::SiTaskSetDirectRemoteMode(Mode mode, QObject *parent) - : Super(parent) - , m_mode(mode) -{ -} - -void SiTaskSetDirectRemoteMode::start() -{ - QByteArray ba(1, ' '); - ba[0] = (m_mode == Mode::Direct)? SIMessageData::MS_MODE_DIRECT: SIMessageData::MS_MODE_REMOTE; - sendCommand(static_cast(SIMessageData::Command::SetDirectRemoteMode), ba); -} - -void SiTaskSetDirectRemoteMode::onSiMessageReceived(const SIMessageData &msg) -{ - bool ok = false; - SIMessageData::Command cmd = msg.command(); - if(cmd == SIMessageData::Command::SetDirectRemoteMode) { - QByteArray hdr = msg.data(); - uint8_t ms_mode = (uint8_t)hdr[5]; - if(ms_mode == SIMessageData::MS_MODE_DIRECT) { - logCardRead() << "SI station in DIRECT mode."; - ok = (m_mode == Mode::Direct); - } - else if(ms_mode == SIMessageData::MS_MODE_REMOTE) { - logCardRead() << "SI station in REMOTE mode."; - ok = (m_mode == Mode::Remote); - } - } - else { - qfError() << "Invalid command:" << (int)cmd << "received"; - } - finishAndDestroy(ok, (int)m_mode); -} - -//=============================================================== -// CmdStationInfo -//=============================================================== -QString SiStationConfig::toString() const -{ - QString msg = tr("" - "Station number: {{StationNumber}}\n" - "Extended mode: {{ExtendedMode}}\n" - "Auto send: {{AutoSend}}\n" - "Handshake: {{HandShake}}\n" - "Password access: {{PasswordAccess}}\n" - "Read out after punch: {{ReadOutAfterPunch}}\n" - ""); - msg.replace("{{StationNumber}}", QString::number(stationNumber())); - msg.replace("{{ExtendedMode}}", (flags() & (unsigned)siut::SiStationConfig::Flag::ExtendedMode)? tr("True"): tr("False")); - msg.replace("{{AutoSend}}", (flags() & (unsigned)siut::SiStationConfig::Flag::AutoSend)? tr("True"): tr("False")); - msg.replace("{{HandShake}}", (flags() & (unsigned)siut::SiStationConfig::Flag::HandShake)? tr("True"): tr("False")); - msg.replace("{{PasswordAccess}}", (flags() & (unsigned)siut::SiStationConfig::Flag::PasswordAccess)? tr("True"): tr("False")); - msg.replace("{{ReadOutAfterPunch}}", (flags() & (unsigned)siut::SiStationConfig::Flag::ReadOutAfterPunch)? tr("True"): tr("False")); - return msg; -} - -void SiTaskStationConfig::start() -{ - QByteArray ba; - ba.append(0x74); - ba.append(0x01); - sendCommand(static_cast(SIMessageData::Command::GetSystemData), ba); -} - -void SiTaskStationConfig::onSiMessageReceived(const SIMessageData &msg) -{ - bool ok = false; - SiStationConfig ret; - SIMessageData::Command cmd = msg.command(); - if(cmd == SIMessageData::Command::GetSystemData) { - QByteArray hdr = msg.data(); - int n = hdr[2]; - n = (n << 8) + hdr[3]; - ret.setStationNumber(n); - unsigned flags = (uint8_t)hdr[5]; - ret.setFlags(flags); - ok = true; - } - else { - qfError() << "Invalid command:" << (int)cmd << "received"; - } - finishAndDestroy(ok, ret); -} - -//=============================================================== -// CmdSetDirectRemoteMode -//=============================================================== -SiTaskReadStationBackupMemory::SiTaskReadStationBackupMemory(QObject *parent) - : Super(parent) -{ -} - -void SiTaskReadStationBackupMemory::start() -{ - logCardRead() << "SwitchToRemote"; - m_state = State::SwitchToRemote; - SiTaskSetDirectRemoteMode *cmd = new SiTaskSetDirectRemoteMode(SiTaskSetDirectRemoteMode::Mode::Remote); - connect(cmd, &SiTaskSetDirectRemoteMode::sigSendCommand, this, &SiTaskReadStationBackupMemory::sigSendCommand); - connect(this, &SiTaskReadStationBackupMemory::siMessageForwarded, cmd, &SiTaskSetDirectRemoteMode::onSiMessageReceived); - connect(cmd, &SiTaskSetDirectRemoteMode::finished, this, [this](bool ok, QVariant ) { - if(ok) { - logCardRead() << "ReadPointer"; - m_state = State::ReadPointer; - QByteArray ba; - ba.append(0x1C); - ba.append(0x07); - sendCommand(static_cast(SIMessageData::Command::GetSystemData), ba); - } - else { - abort(); - } - }); - cmd->start(); -} - -void SiTaskReadStationBackupMemory::onSiMessageReceived(const SIMessageData &msg) -{ - if(m_state == State::SwitchToRemote) { - emit siMessageForwarded(msg); - } - else if(m_state == State::ReadPointer) { - SIMessageData::Command cmd = msg.command(); - if(cmd == SIMessageData::Command::GetSystemData) { - QByteArray hdr = msg.data(); - m_stationNumber = (int)SIPunch::getUnsigned(hdr, 3, 2); - int ix = 6; - /// the 4 byte backup memory address pointer is part of the data string: EP3, EP2, xx, xx, xx, EP1, EP0 - m_memoryDataPointer = (uint8_t)hdr[ix++]; - m_memoryDataPointer = (m_memoryDataPointer << 8) + (uint8_t)hdr[ix++]; - ix += 3; - m_memoryDataPointer = (m_memoryDataPointer << 8) + (uint8_t)hdr[ix++]; - m_memoryDataPointer = (m_memoryDataPointer << 8) + (uint8_t)hdr[ix++]; - logCardRead() << "backup memory pointer:" << "0x" + QString::number(m_memoryDataPointer, 16); - - m_state = State::CheckOverflow; - /// according to - /// https://github.com/gaudenz/sireader/blob/master/sireader.py - /// we should find ad addr 0x3D - logCardRead() << "CheckOverflow"; - QByteArray ba; - ba.append(0x3D); - ba.append(0x01); - sendCommand(static_cast(SIMessageData::Command::GetSystemData), ba); - } - else { - qfError() << "Invalid command:" << (int)cmd << "received"; - abort(); - return; - } - } - else if(m_state == State::CheckOverflow) { - SIMessageData::Command cmd = msg.command(); - if(cmd == SIMessageData::Command::GetSystemData) { - QByteArray hdr = msg.data(); - bool is_overflow = hdr[6]; - //qfInfo() << msg.dump(); - logCardRead() << "is memory overflow:" << is_overflow; - - //m_blockCount = m_isOverflow? MEMORY_SIZE: (m_memoryDataPointer - MEMORY_START) / m_blockSize + 1; - m_blockCount = (is_overflow? MEMORY_SIZE - MEMORY_START: m_memoryDataPointer - MEMORY_START) / m_blockSize + 1; - - if(m_blockCount == 0) { - finishAndDestroy(true, createResult()); - return; - } - if(m_blockCount > 255) { - qfError() << "Invalid block count:" << m_blockCount; - abort(); - return; - } - - logCardRead() << "ReadData"; - emit progress(m_progressPhase++, (int)m_blockCount); - m_state = State::ReadData; - QByteArray ba; - if(is_overflow) - m_readDataPointer = m_memoryDataPointer + 1; - else - m_readDataPointer = MEMORY_START; - ba.append((char)((m_readDataPointer >> (2*8)) & 0xFF)); - ba.append((char)((m_readDataPointer >> (1*8)) & 0xFF)); - ba.append((char)((m_readDataPointer >> (0*8)) & 0xFF)); - ba.append((char)m_blockSize); - sendCommand(0x81, ba); - } - else { - qfError() << "Invalid command:" << (int)cmd << "received"; - abort(); - } - } - else if(m_state == State::ReadData) { - int cmd = (int)msg.command(); - if(cmd == 0x81) { - logCardRead() << "block of" << msg.data().length() << "bytes received, " << m_blockCount << "blocks to receive"; - logCardRead() << "read data pointer:" << QString::number(m_readDataPointer, 16) << "memory data pointer:" << QString::number(m_memoryDataPointer, 16) << "bytes to load:" << QString::number(m_memoryDataPointer - m_readDataPointer, 16); - QByteArray ba = msg.data().mid(8, m_blockSize); - if(m_readDataPointer < m_memoryDataPointer) { - if(m_memoryDataPointer - m_readDataPointer < m_blockSize) { - logCardRead() << "stripping last packet to len:" << (m_memoryDataPointer - m_readDataPointer); - ba = ba.mid(0, m_memoryDataPointer - m_readDataPointer); - } - } - //qfInfo() << SIMessageData::dumpData(ba, 16); - m_data.append(ba); - emit progress(m_progressPhase++, (int)m_blockCount); - if(!--m_blockCount) { - logCardRead() << "SwitchToDirect"; - m_state = State::SwitchToDirect; - SiTaskSetDirectRemoteMode *cmd = new SiTaskSetDirectRemoteMode(SiTaskSetDirectRemoteMode::Mode::Direct); - connect(cmd, &SiTaskSetDirectRemoteMode::sigSendCommand, this, &SiTaskReadStationBackupMemory::sigSendCommand); - connect(this, &SiTaskReadStationBackupMemory::siMessageForwarded, cmd, &SiTaskSetDirectRemoteMode::onSiMessageReceived); - connect(cmd, &SiTaskSetDirectRemoteMode::finished, this, [this](bool ok, QVariant ) { - if(ok) { - finishAndDestroy(true, createResult()); - } - else { - abort(); - } - }); - cmd->start(); - return; - } - m_readDataPointer += m_blockSize; - if(m_readDataPointer - MEMORY_START > MEMORY_SIZE) - m_readDataPointer = MEMORY_START; - { - QByteArray ba; - ba.append((char)((m_readDataPointer >> (2*8)) & 0xFF)); - ba.append((char)((m_readDataPointer >> (1*8)) & 0xFF)); - ba.append((char)((m_readDataPointer >> (0*8)) & 0xFF)); - ba.append((char)m_blockSize); - sendCommand(0x81, ba); - } - } - else { - qfError() << "Invalid command:" << cmd << "received"; - abort(); - return; - } - } - else if(m_state == State::SwitchToDirect) { - emit siMessageForwarded(msg); - } -} - -QVariantMap SiTaskReadStationBackupMemory::createResult() -{ - QVariantMap ret; - ret["stationNumber"] = m_stationNumber; - QVariantList punches; - /* - storage order: SI2-SI1-SI0-DATE1-DATE0-TH-TL-MS - SI2, SI1, SI0 3 bytes SI card number - DATE1, DATE0 2 bytes date - DATE1 - bit 7-2 - 6 bit year - 0-64 part of year - bit 1-0 - bit 3-2 of 4bit-month 1-12 - DATE0 - bit 7-6 - bit 1-0 - part of 4bit month 1-12 - bit 5-1 - 5bit day of month 1-31 - bit 0 - am/pm halfday - TH, TL 2 bytes 12h binary punching time - MS 1 byte 8bit 1/256 of seconds - */ - int n = 0; - const uint8_t *cdata = (const uint8_t *)m_data.constData(); - for (int i = 0; i < m_data.size(); ) { - QVariantList row; - int si = cdata[i++]; - si = (si << 8) + cdata[i++]; - si = (si << 8) + cdata[i++]; - row << si; - - uint8_t b = cdata[i++]; - int year = (b & 0b11111100) >> 2; - year += 2000; - int month = (b & 0b11) << 2; - b = cdata[i++]; - month = month + ((b & 0b11000000) >> 6); - int day = (b & 0b00111110) >> 1; - bool is_pm = b & 1; - int sec = cdata[i++]; - sec = (sec << 8) + cdata[i++]; - int h = sec / 3600; - int ms = cdata[i++]; - char buff[64]; - bool card_error = h >= 12; - if(card_error) - h -= 12; - if(is_pm) - h += 12; - int m = (sec / 60) % 60; - int s = sec % 60; - ms = ms * 1000 / 256; - { - snprintf(buff, sizeof(buff) - , "%04d-%02d-%02d %02d:%02d:%02d.%03d" - , year, month, day, h, m, s, ms); - logCardRead() << ++n << "si:" << si << buff << (card_error? "CardErr": ""); - } - row << QDateTime{{year, month, day}, {h, m, s, ms}}; - row << card_error; - - punches.insert(punches.length(), row); - } - ret["punches"] = punches; - return ret; -} - -//=============================================================== -// SiTaskReadCard -//=============================================================== -SiTaskReadCard::~SiTaskReadCard() -{ -} - -void SiTaskReadCard::finishAndDestroy(bool ok, QVariant result) -{ - if(ok) { - logCardRead() << m_card.toString(); - if(!m_withAutosend) - sendACK(); - } - Super::finishAndDestroy(ok, result); -} - -//=============================================================== -// SiTaskReadCard5 -//=============================================================== -void SiTaskReadCard5::start() -{ - if(!m_withAutosend) { - sendCommand((int)SIMessageData::Command::GetSICard5, QByteArray(1, 0x00)); - } -} - -void SiTaskReadCard5::onSiMessageReceived(const SIMessageData &msg) -{ - SIMessageData::Command cmd = msg.command(); - if(cmd == SIMessageData::Command::GetSICard5) { - //qfInfo() << msg.toString(); - const QByteArray data = msg.data(); - int base = 5; - qfDebug() << "Card5 data"; - qfDebug() << SIMessageData::dumpData(data.mid(base), 16); - int station_number = (int)SIPunch::getUnsigned(data, base - 2); - int card_number = (int)SIPunch::getUnsigned(data, base + 4); - int cs = (uint8_t)data[base + 6]; - if(cs > 1) - card_number += 100000 * cs; - int check_time = (int)SIPunch::getUnsigned(data, base + 0x19); - int start_time = (int)SIPunch::getUnsigned(data, base + 0x13); - int finish_time = (int)SIPunch::getUnsigned(data, base + 0x15); - int punch_cnt = (uint8_t)data[base + 0x17]; - punch_cnt--; - - SICard::PunchList punches; - int base1 = base + 0x20; - // 5 x 6 records with times - for(int i=0; i<30 && i" << QString::number(offset, 16); - punches << SIPunch(code, time); - } - // 1 x 6 records without times - for(int i=30; i<36 && i(((uint8_t)data[base + 0x18]) & 15); - logCardRead() << "CS:" << m_cardSerie << cardSerieToString(m_cardSerie) << "SI:" << card_number; - m_card.setStationNumber(station_number); - m_card.setCardNumber(card_number); - if(m_cardSerie == Card6 || m_cardSerie == Card6Star) { - m_punchCnt = (int)SIPunch::getUnsigned(data, base + 18, 1); - logCardRead() << "Punch cnt:" << m_punchCnt; - int clear_time = SIPunch(data, base + 32).time(); - int check_time = SIPunch(data, base + 28).time(); - if(check_time == siut::SICard::INVALID_SI_TIME) - check_time = clear_time; - int start_time = SIPunch(data, base + 24).time(); - int finish_time = SIPunch(data, base + 20).time(); - m_card.setCardNumber(card_number); - m_card.setCheckTime(check_time); - m_card.setStartTime(start_time); - m_card.setFinishTime(finish_time); - - if(!m_withAutosend) { - sendCommand((int)SIMessageData::Command::GetSICard6, QByteArray(1, 0x06)); - } - } - else { - qfError() << "block:" << block_number << "unsupported card serie:" << m_cardSerie << cardSerieToString(m_cardSerie); - abort(); - } - } - else { - if(block_number >= 1 && block_number <= 7) { - if(m_card.cardNumber() > 0) { - QVariantList punches = m_card.punches(); - int pcnt = punches.count(); - for (int i = 0; pcnt + i < m_punchCnt && i < 32; ++i) { - SIPunch p(data, base + i*4); - //qfInfo() << "B1" << p.code(); - punches << p; - } - m_card.setPunches(punches); - logCardRead() << punches.count() << "of" << m_punchCnt << "punches read."; - if(m_withAutosend) { - // it seems that we have to always expect blocks 0,6,7 in autosend mode - if(m_card.punchCount() >= m_punchCnt) { - logCardRead() << "All the punches in auto-send received, DONE"; - finishAndDestroy(true, m_card); - } - } - else { - if(m_card.punchCount() < m_punchCnt) { - int bn = block_number + 1; - if(bn >= 8) - bn = 2; - logCardRead() << "Asking for next block:" << bn; - sendCommand((int)SIMessageData::Command::GetSICard6, QByteArray(1, (char)bn)); - } - else { - logCardRead() << "All the punches received, DONE"; - finishAndDestroy(true, m_card); - } - } - } - else { - qfError() << "Card6 unexpected block number:" << block_number - << ", block #0 must be read first. See https://github.com/Quick-Event/quickbox/issues/732"; - if(m_withAutosend) - qfError() << "Try to switch auto-send mode off."; - abort(); - } - } - else { - qfError() << "Card6 unexpected block number:" << block_number; - abort(); - } - } - } - else { - qfError() << "Invalid command:" << "0x" + QString::number((int)cmd, 16) << "received"; - abort(); - } -} - -const char *SiTaskReadCard6::cardSerieToString(SiTaskReadCard6::CardSerie cs) -{ - switch(cs) { - case Card6: return "Card6"; - case Card6Star: return "Card6Star"; - case Invalid: return "Invalid"; - } - return "Unknown"; -} - -//=============================================================== -// SiTaskReadCard8 -//=============================================================== -SiTaskReadCard8::~SiTaskReadCard8() -{ - //qfInfo() << this << "destroyed"; -} - -void SiTaskReadCard8::start() -{ - if(!m_withAutosend) - sendCommand((int)SIMessageData::Command::GetSICard8, QByteArray(1, 0x00)); -} - -void SiTaskReadCard8::onSiMessageReceived(const SIMessageData &msg) -{ - SIMessageData::Command cmd = msg.command(); - if(cmd == SIMessageData::Command::GetSICard8) { - int base = 6; - const QByteArray data = msg.data(); - int block_number = (uint8_t)data[base-1]; - logCardRead() << "Card8 data, block number:" << block_number; - qfDebug() << SIMessageData::dumpData(data.mid(base), 4); - if(block_number == 0) { - int station_number = (int)SIPunch::getUnsigned(data, base - 3); - int card_number = (int)SIPunch::getUnsigned(data, base + 0x19, 3); - m_cardSerie = static_cast(((uint8_t)data[base + 0x18]) & 15); - logCardRead() << "CS:" << m_cardSerie << cardSerieToString(m_cardSerie) << "SI:" << card_number; - m_card.setStationNumber(station_number); - m_card.setCardNumber(card_number); - if(m_cardSerie == Card8 || m_cardSerie == Card9 || m_cardSerie == pCard || m_cardSerie == Siac) { - m_punchCnt = (uint8_t)data[base + 0x16]; - logCardRead() << "Punch cnt:" << m_punchCnt; - int check_time = SIPunch(data, base + 0x08).time(); - int start_time = SIPunch(data, base + 0x0c).time(); - int finish_time = SIPunch(data, base + 0x10).time(); - m_card.setCardNumber(card_number); - m_card.setCheckTime(check_time); - m_card.setStartTime(start_time); - m_card.setFinishTime(finish_time); - - if(m_cardSerie == Card9) { - base += 14 * 4; - QVariantList punches = m_card.punches(); - for (int i = 0; i < m_punchCnt && i < 18; ++i) { - SIPunch p(data, base + i*4); - //qfInfo() << "B0" << p.code(); - punches << p; - } - m_card.setPunches(punches); - if((punches.count() == m_punchCnt) && !m_withAutosend) - finishAndDestroy(true, m_card); - } - if(!m_withAutosend) { - if(m_cardSerie == Card8) - sendCommand((int)SIMessageData::Command::GetSICard8, QByteArray(1, 0x01)); - else if(m_cardSerie == Card9 && m_card.punches().count() < m_punchCnt) - sendCommand((int)SIMessageData::Command::GetSICard8, QByteArray(1, 0x01)); - else if(m_cardSerie == pCard) - sendCommand((int)SIMessageData::Command::GetSICard8, QByteArray(1, 0x01)); - else if(m_cardSerie == Siac) - sendCommand((int)SIMessageData::Command::GetSICard8, QByteArray(1, 0x03)); - } - } - else { - qfError() << "block:" << block_number << "unsupported card serie:" << m_cardSerie << cardSerieToString(m_cardSerie); - abort(); - } - } - else { - if(m_cardSerie == Card8) { - if(block_number == 1) { - base += 8; - QVariantList punches = m_card.punches(); - int pcnt = punches.count(); - for (int i = 0; pcnt + i < m_punchCnt && i < 30; ++i) { - SIPunch p(data, base + i*4); - //qfInfo() << "B1" << p.code(); - punches << p; - } - m_card.setPunches(punches); - //qfInfo() << "\n" << m_card.toString(); - finishAndDestroy(true, m_card); - } - else { - qfError() << "Card8 unexpected block number:" << block_number; - abort(); - } - } - else if(m_cardSerie == Card9) { - if(block_number == 1) { - QVariantList punches = m_card.punches(); - int pcnt = punches.count(); - for (int i = 0; pcnt + i < m_punchCnt && i < 32; ++i) { - punches << SIPunch(data, base + i*4); - } - m_card.setPunches(punches); - //qfInfo() << "\n" << m_card.toString(); - finishAndDestroy(true, m_card); - } - else { - qfError() << "Card8 unexpected block number:" << block_number; - abort(); - } - } - else if(m_cardSerie == pCard) { - if(block_number == 1) { - base += 12*4; - QVariantList punches = m_card.punches(); - int pcnt = punches.count(); - for (int i = 0; pcnt + i < m_punchCnt && i < 20; ++i) { - punches << SIPunch(data, base + i*4); - } - m_card.setPunches(punches); - finishAndDestroy(true, m_card); - } - else { - qfError() << "Card8 unexpected block number:" << block_number; - abort(); - } - } - else if(m_cardSerie == Siac) { - if(block_number == 3) { - // read battery date - int yy = (uint8_t)data[base + 0xf*4 + 0]; - int mm = (uint8_t)data[base + 0xf*4 + 1]; - int dd = (uint8_t)data[base + 0xf*4 + 2]; - logCardRead().nospace() << "SIAC batery date: " << (2000 + yy) << '-' << mm << '-' << dd; - uint8_t hw_ver_1 = (uint8_t)data[base + 0x10*4 + 0]; - uint8_t hw_ver_0 = (uint8_t)data[base + 0x10*4 + 1]; - uint8_t sw_ver_1 = (uint8_t)data[base + 0x10*4 + 2]; - uint8_t sw_ver_0 = (uint8_t)data[base + 0x10*4 + 3]; - logCardRead().nospace() << "HW ver: " << hw_ver_1 << '.' << hw_ver_0; - logCardRead().nospace() << "SW ver: " << sw_ver_1 << '.' << sw_ver_0; - uint8_t mvbat = (uint8_t)data[base + 0x11*4 + 3]; - uint8_t rbat = (uint8_t)data[base + 0x15*4 + 0]; - uint8_t lbat = (uint8_t)data[base + 0x15*4 + 1]; - logCardRead().nospace() << "MVBAT: " << mvbat << " 0x" << QString::number(mvbat, 16); - logCardRead().nospace() << "RBAT : " << rbat << " 0x" << QString::number(rbat, 16); - logCardRead().nospace() << "LBAT : " << lbat << " 0x" << QString::number(lbat, 16) << " " << (lbat == 0xAA? "OK": "LOW"); - - // read battery status - sendCommand((int)SIMessageData::Command::GetSICard8, QByteArray(1, (char)(block_number + 1))); - } - else if(block_number >= 4 && block_number <= 7) { - QVariantList punches = m_card.punches(); - int pcnt = punches.count(); - for (int i = 0; pcnt + i < m_punchCnt && i < 128/4; ++i) - punches << SIPunch(data, base + i*4); - m_card.setPunches(punches); - if(m_withAutosend) { - if(block_number == 7) { - finishAndDestroy(true, m_card); - } - } - else { - if(m_card.punchCount() < m_punchCnt) { - sendCommand((int)SIMessageData::Command::GetSICard8, QByteArray(1, (char)(block_number + 1))); - } - else { - finishAndDestroy(true, m_card); - } - } - } - else { - qfError() << "Siac unexpected block number:" << block_number; - abort(); - } - } - else { - qfError() << "block:" << block_number << "unsupported card serie:" << m_cardSerie << cardSerieToString(m_cardSerie); - abort(); - } - } - } - else { - qfError() << "Invalid command:" << "0x" + QString::number((int)cmd, 16) << "received"; - if(cmd == SIMessageData::Command::SICardRemoved) - qfError() << "seems like SI card was removed in middle of read-out process"; - abort(); - } -} - -const char *SiTaskReadCard8::cardSerieToString(SiTaskReadCard8::CardSerie cs) -{ - switch(cs) { - case Card8: return "Card8"; - case Card9: return "Card9"; - case pCard: return "pCard"; - case tCard: return "tCard"; - case Siac: return "Siac"; - case Invalid: return "Invalid"; - } - return "Unknown"; -} - -} diff --git a/libsiut/src/device/sitask.h b/libsiut/src/device/sitask.h deleted file mode 100644 index b6b71ed1b..000000000 --- a/libsiut/src/device/sitask.h +++ /dev/null @@ -1,194 +0,0 @@ -#pragma once - -#include "../siutglobal.h" -#include "../sicard.h" - -#include - -#include - -class QTimer; - -namespace siut { - -class SIMessageData; - -class SIUT_DECL_EXPORT SiTask : public QObject -{ - Q_OBJECT -private: - typedef QObject Super; -public: - SiTask(QObject *parent = nullptr); - ~SiTask() override; - - enum class Type {Invalid=0, CardRead, Punch, Other}; - - Q_SIGNAL void sigSendCommand(int cmd, const QByteArray &data); - Q_SIGNAL void sigSendACK(); - - virtual void onSiMessageReceived(const SIMessageData &msg) = 0; - virtual void start() = 0; - virtual Type type() const = 0; - virtual void finishAndDestroy(bool ok, QVariant result); - void abort() {finishAndDestroy(false, QVariant());} - void abortWithMessage(const QString &msg) {finishAndDestroy(false, msg);} - Q_SIGNAL void aboutToFinish(); - Q_SIGNAL void finished(bool ok, QVariant result); - Q_SIGNAL void progress(int phase, int count); -protected: - //void restartRxTimer(); - void sendACK(); - void sendCommand(int cmd, const QByteArray &data); -protected: - QTimer *m_rxTimer; -}; - -class SIUT_DECL_EXPORT SiTaskSetDirectRemoteMode : public SiTask -{ - Q_OBJECT - using Super = SiTask; -public: - enum class Mode {Direct = 0, Remote}; -public: - explicit SiTaskSetDirectRemoteMode(Mode mode, QObject *parent = nullptr); - - Type type() const override {return Type::Other;} - void start() override; - void onSiMessageReceived(const siut::SIMessageData &msg) override; -private: - Mode m_mode; -}; - -class SIUT_DECL_EXPORT SiStationConfig : public QVariantMap -{ - Q_DECLARE_TR_FUNCTIONS(SiStationConfig) - - QF_VARIANTMAP_FIELD2(int, s, setS, tationNumber, 0) - QF_VARIANTMAP_FIELD2(unsigned, f, setF, lags, 0) - -public: - enum class Flag : unsigned { - ExtendedMode = 1 << 0, - AutoSend = 1 << 1, - HandShake = 1 << 2, - PasswordAccess = 1 << 4, - ReadOutAfterPunch = 1 << 7, - }; - SiStationConfig(const QVariantMap &m = QVariantMap()) : QVariantMap(m) {} - QString toString() const; -}; - -class SIUT_DECL_EXPORT SiTaskStationConfig : public SiTask -{ - Q_OBJECT - using Super = SiTask; -public: - explicit SiTaskStationConfig(QObject *parent = nullptr) : Super(parent) {} - - Type type() const override {return Type::Other;} - void start() override; - void onSiMessageReceived(const siut::SIMessageData &msg) override; -private: - enum class State {}; - QByteArray m_data; -}; - -class SIUT_DECL_EXPORT SiTaskReadStationBackupMemory : public SiTask -{ - Q_OBJECT - using Super = SiTask; -public: - explicit SiTaskReadStationBackupMemory(QObject *parent = nullptr); - - Type type() const override {return Type::Other;} - void start() override; - void onSiMessageReceived(const siut::SIMessageData &msg) override; -private: - Q_SIGNAL void siMessageForwarded(const siut::SIMessageData &msg); - QVariantMap createResult(); -private: - enum class State {SwitchToRemote, ReadPointer, CheckOverflow, ReadData, SwitchToDirect}; - static constexpr unsigned MEMORY_START = 0x100; - static constexpr unsigned MEMORY_SIZE = 0x200000; - State m_state = State::SwitchToRemote; - uint32_t m_memoryDataPointer; - uint32_t m_readDataPointer; - unsigned m_blockSize = 128; - unsigned m_blockCount; - int m_progressPhase = 0; - //bool m_isOverflow; - int m_stationNumber = 0; - QByteArray m_data; -}; - -class SIUT_DECL_EXPORT SiTaskReadCard : public SiTask -{ - Q_OBJECT - using Super = SiTask; -public: - explicit SiTaskReadCard(bool with_autosend, QObject *parent = nullptr) - : Super(parent) - , m_withAutosend(with_autosend) {} - ~SiTaskReadCard() override; - - void finishAndDestroy(bool ok, QVariant result) override; - - Type type() const override {return Type::CardRead;} -protected: - bool m_withAutosend; - SICard m_card; -}; - -class SIUT_DECL_EXPORT SiTaskReadCard5 : public SiTaskReadCard -{ - Q_OBJECT - using Super = SiTaskReadCard; -public: - explicit SiTaskReadCard5(bool with_autosend, QObject *parent = nullptr) - : Super(with_autosend, parent) {} - - void start() override; - void onSiMessageReceived(const siut::SIMessageData &msg) override; -}; - -class SIUT_DECL_EXPORT SiTaskReadCard6 : public SiTaskReadCard -{ - Q_OBJECT - using Super = SiTaskReadCard; -public: - explicit SiTaskReadCard6(bool with_autosend, QObject *parent = nullptr) - : Super(with_autosend, parent) {} - ~SiTaskReadCard6() override; - - void start() override; - void onSiMessageReceived(const siut::SIMessageData &msg) override; -private: - enum CardSerie {Invalid = 0, Card6 = 6, Card6Star}; - static const char* cardSerieToString(CardSerie cs); - - CardSerie m_cardSerie = Invalid; - int m_punchCnt = 0; -}; - -class SIUT_DECL_EXPORT SiTaskReadCard8 : public SiTaskReadCard -{ - Q_OBJECT - using Super = SiTaskReadCard; -public: - explicit SiTaskReadCard8(bool with_autosend, QObject *parent = nullptr) - : Super(with_autosend, parent) {} - ~SiTaskReadCard8() override; - - void start() override; - void onSiMessageReceived(const siut::SIMessageData &msg) override; -private: - enum CardSerie {Invalid = 0, Card8 = 2, Card9 = 1, pCard = 4, tCard = 6, Siac = 15}; - static const char* cardSerieToString(CardSerie cs); - - CardSerie m_cardSerie = Invalid; - int m_punchCnt = 0; -}; - - -} diff --git a/libsiut/src/message/simessage.cpp b/libsiut/src/message/simessage.cpp deleted file mode 100644 index 6fb742770..000000000 --- a/libsiut/src/message/simessage.cpp +++ /dev/null @@ -1,612 +0,0 @@ - -// -// Author: Frantisek Vacek , (C) 2011 -// -// Copyright: See COPYING file that comes with this distribution -// - -#include "simessage.h" - -#include -#include - -#include -#include - -//================================================= -// SIMessageBase -//================================================= -QString SIMessageBase::dump() const -{ - QString ret = m_data.dump(); - return ret; -} - -//==================================================== -// SIMessageCardReadOut -//==================================================== -SIMessageCardReadOut::Punch::Punch(SIMessageCardReadOut::Punch::SharedDummyHelper) -{ - d = new Data(); -} - -SIMessageCardReadOut::Punch::Punch() -{ - *this = sharedNull(); -} - -const SIMessageCardReadOut::Punch & SIMessageCardReadOut::Punch::sharedNull() -{ - static SIMessageCardReadOut::Punch n = SIMessageCardReadOut::Punch(SharedDummyHelper()); - return n; -} - -SIMessageCardReadOut::Punch::Punch(const QByteArray& ba, int offset, PunchRecordType record_type) -{ - d = new Data(); - if(record_type == PunchRecordClasic) { - //d->is24HoursTimeFormat = false; - //flags = 0; - if(ba.length() > offset + 2) { - d->code = (unsigned char)ba[offset]; - d->time = (((int)(unsigned char)ba[offset + 1]) << 8) + (unsigned char)ba[offset + 2]; - } - else - qfError() << "Incorrect punch data:" << SIMessageData::dumpData(ba) << "correct length is:" << offset + 3 << "offset:" << offset; - } - else if(record_type == PunchRecordDegraded) { - if(ba.length() > offset) { - d->code = (unsigned char)ba[offset]; - } - else - qfError() << "Incorrect punch data:" << SIMessageData::dumpData(ba) << "correct length is:" << offset + 0 << "offset:" << offset; - d->time = 0xEEEE; - } - else if(record_type == PunchRecordExtended) { - //d->is24HoursTimeFormat = true; - if(ba.length() > offset + 3) { - d->flags = (unsigned char)ba[offset]; - /** PTD flags - * bit 0 - am/pm - * bit 3...1 - day of week, 000 = Sunday, 110 = Saturday - * bit 5...4 - week counter 0…3, relative - * bit 7...6 - control station code number high - * - */ - d->code = (unsigned char)ba[offset + 1]; - if(d->flags & (1<<7)) - d->code = 0; - else - d->code += 256 * ((d->flags & (3 << 6)) >> 6); - /** code - * CN - control station code number, 0...255 or subsecond value1 - * subsecond value only for “start” and “finish” possible - * new from sw5.49: bit7=1 in PTD-byte indicates a subsecond value in CN byte (use always code numbers <256 for start/finish) - */ - d->time = (((int)(unsigned char)ba[offset + 2]) << 8) + (unsigned char)ba[offset + 3]; - if(d->flags & (1 << 0)) - d->time += 12*60*60; - //qfInfo() << ba.mid(offset, 4).toHex(); - //qfInfo() << "code:" << d->code; - } - else - qfError() << "Incorrect punch data:" << SIMessageData::dumpData(ba) << "correct length is:" << offset + 4 << "offset:" << offset; - } - else { - qfError() << "Incorrect punch record type:" << record_type; - } -} - -int SIMessageCardReadOut::Punch::dayOfWeek() const -{ - int ret = (d->flags & (7 << 1)) >> 1; - return ret; -} - -int SIMessageCardReadOut::Punch::weekCnt() const -{ - int ret = (d->flags & (3 << 4)) >> 4; - return ret; -} - -QVariantMap SIMessageCardReadOut::Punch::toVariantMap() const -{ - QVariantMap ret; - ret[QStringLiteral("code")] = code(); - ret[QStringLiteral("time")] = time(); - ret[QStringLiteral("msec")] = msec(); - //ret[QStringLiteral("day")] = dayOfWeek(); - //ret[QStringLiteral("week")] = weekCnt(); - return ret; -} - -static QString time_str(int _time) -{ - QString ret = "%1:%2:%3"; - if(_time == 0xEEEE) ret = "----"; - else { - int time = SIMessageCardReadOut::toAM(_time); - ret = ret.arg(time / (60*60)).arg(QString::number((time / 60) % 60), 2, '0').arg(QString::number(time % 60), 2, '0'); - } - return ret; -} - -static QString ob_time_str(int _time) -{ - QString ret = "%1.%2"; - if(_time == 0xEEEE) ret = "----"; - else { - int time = SIMessageCardReadOut::toAM(_time); - ret = ret.arg(time / 60).arg(QString::number(time % 60), 2, '0'); - } - return ret; -} - -QString SIMessageCardReadOut::Punch::toString() const -{ - QString ret = "{code: %1, time: %2, msec: %3}"; - return ret.arg(code()).arg(time_str(time())).arg(msec()); -} - -SIMessageCardReadOut::SIMessageCardReadOut(const SIMessageData& _data) - : SIMessageBase(_data) -{ -} - -QString SIMessageCardReadOut::cardTypeToString(SIMessageCardReadOut::CardType card_type) -{ - QString ret; - switch(card_type) { - case CardType5: ret = "CardType5"; break; - case CardType6: ret = "CardType6"; break; - case CardType8: ret = "CardType8"; break; - case CardType9: ret = "CardType9"; break; - case CardTypeP: ret = "CardTypeP"; break; - case CardTypeT: ret = "CardTypeT"; break; - case CardTypeSIAC: ret = "CardTypeSIAC"; break; - case CardType10: ret = "CardType10"; break; - case CardType11: ret = "CardType11"; break; - default: ret = "CardTypeUnknown"; break; - } - return ret; -} - -bool SIMessageCardReadOut::isTimeValid(int time) -{ - return time >= 0 && time < 0xEEEE; -} - -int SIMessageCardReadOut::toAM(int time_sec) -{ - return toAMms(time_sec * 1000) / 1000; -} - -int SIMessageCardReadOut::toAMms(int time_msec) -{ - constexpr int msec12hr = 12 * 60 * 60 * 1000; - int ret = time_msec; - while(ret < 0) - ret += msec12hr; - while(ret >= msec12hr) - ret -= msec12hr; - return ret; -} - -QString SIMessageCardReadOut::cardDataLayoutTypeToString(SIMessageCardReadOut::CardDataLayoutType card_layout_type) -{ - QString ret; - switch(card_layout_type) { - case DataLayout5: ret = "DataLayout5"; break; - case DataLayout6: ret = "DataLayout6"; break; - case DataLayout8: ret = "DataLayout8"; break; - case DataLayout9: ret = "DataLayout9"; break; - case DataLayout10: ret = "DataLayout10"; break; - default: ret = "DataLayoutUnknown"; break; - } - return ret; -} - -SIMessageCardReadOut::CardDataLayoutType SIMessageCardReadOut::cardDataLayoutType() const -{ - CardDataLayoutType ret = DataLayoutUnknown; - switch(cardType()) { - case CardType5: - ret = DataLayout5; - break; - case CardType6: - ret = DataLayout6; - break; - case CardType8: - ret = DataLayout8; - break; - case CardType9: - case CardTypeT: - ret = DataLayout9; - break; - case CardTypeP: - ret = DataLayoutP; - break; - case CardTypeSIAC: - case CardType10: - case CardType11: - ret = DataLayout10; - break; - default: - qfError() << "Can't assign cardDataLayout for card type:" << rawCardType() << cardTypeToString(cardType()); - ret = DataLayoutUnknown; - break; - } - return ret; -} - -int SIMessageCardReadOut::rawCardType() const -{ - int ret = -1; - switch(command()) { - case SIMessageData::Command::GetSICard5: - case SIMessageData::Command::GetSICard6: - break; - case SIMessageData::Command::GetSICard8: - { - const QByteArray &raw_data = data().data(); - ret = (int)(((unsigned char)raw_data[6 * 4]) & 0x0F); - //qfInfo() << "raw card type:" << ret; - break; - } - default: - ret = -1; - break; - } - return ret; -} - -SIMessageCardReadOut::CardType SIMessageCardReadOut::cardType() const -{ - CardType ret = CardTypeUnknown; - switch(command()) { - case SIMessageData::Command::GetSICard5: - ret = CardType5; - break; - case SIMessageData::Command::GetSICard6: - ret = CardType6; - break; - case SIMessageData::Command::GetSICard8: - { - //QByteArray raw_data = data().blockData(0); - int n = rawCardType(); - //qfInfo() << "raw card type:" << n; - switch(n) { - case 1: ret = CardType9; break; - case 2: ret = CardType8; break; - case 4: ret = CardTypeP; break; - case 6: ret = CardTypeT; break; - case 15: ret = CardTypeSIAC; break; - default: ret = CardTypeUnknown; break; - } - break; - } - default: - qfError() << "Can't assign cardType for command:" << (int)command() << SIMessageData::commandName(command()); - ret = CardTypeUnknown; - break; - } - return ret; -} - -QString SIMessageCardReadOut::dump() const -{ - QStringList sl; - sl << data().dump(); - sl << tr("cardType: %1 (raw type: %2)").arg(cardTypeToString(cardType())).arg(rawCardType()); - sl << tr("stationCodeNumber: %1").arg(stationCodeNumber()); - sl << tr("cardNumber: %1").arg(cardNumber()); - //sl << tr("startNumber: %1").arg(startNumber()); - //sl << tr("countryCode: %1").arg(countryCode()); - //sl << tr("clubCode: %1").arg(clubCode()); - int start = startTime(); - if(start == 0xEEEE) - start = checkTime(); - sl << tr("check: %1").arg(time_str(checkTime())); - sl << tr("start: %1").arg(time_str(startTime())); - sl << tr("finish: %1 (%2)").arg(time_str(finishTime())).arg(ob_time_str(finishTime() - start)); - int i = 0; - foreach(const Punch &p, punches()) { - sl << QString::number(++i) + ".\t" + QString::number(p.code()) + "\t" + ob_time_str(p.time()) + "\t" + ob_time_str(p.time() - start); - } - return sl.join("\n"); -} - -QVariantMap SIMessageCardReadOut::toVariantMap() const -{ - QVariantMap ret;// = SIMessageBase::toVariant().toMap(); - ret[QStringLiteral("stationCodeNumber")] = stationCodeNumber(); - ret[QStringLiteral("cardNumber")] = cardNumber(); - //ret["cardNumberFull"] = (cardNumber() < 100000)? 100000 + cardNumber(): cardNumber(); - //ret["startNumber"] = startNumber(); - //ret["countryCode"] = countryCode(); - //ret["clubCode"] = clubCode(); - ret[QStringLiteral("checkTime")] = checkTime(); - ret[QStringLiteral("startTime")] = startTime(); - ret[QStringLiteral("finishTime")] = finishTime(); - ret[QStringLiteral("finishTimeMs")] = 0; // TODO: some cards supports msecs, read it - QVariantList punch_list; - foreach(const Punch &p, punches()) { - punch_list << p.toVariantMap(); - } - ret["punches"] = punch_list; - return ret; -} - -int SIMessageCardReadOut::stationCodeNumber() const -{ - QByteArray raw_data = data().data(); - int ret = (((int)(unsigned char)raw_data[2]) << 8) + (unsigned char)raw_data[3]; - return ret; -} -/* -int SIMessageCardReadOut::countryCode() const -{ - QByteArray raw_data = data().rawData(); - int base = CARD5EXT_RECORD_BASE + 1; - int ret = (unsigned char)raw_data[base]; - return ret; -} - -int SIMessageCardReadOut::clubCode() const -{ - QByteArray raw_data = data().rawData(); - int base = CARD5EXT_RECORD_BASE + 2; - int ret = (((int)(unsigned char)raw_data[base]) << 8) + (unsigned char)raw_data[base + 1]; - return ret; -} -*/ -int SIMessageCardReadOut::cardNumber() const -{ - int ret = 0; - QByteArray raw_data = data().data(); - CardDataLayoutType card_data_layout_type = cardDataLayoutType(); - if(card_data_layout_type == DataLayout5) { - int base = 4; - ret = (((int)(unsigned char)raw_data[base]) << 8) + (unsigned char)raw_data[base + 1]; - int cs = (unsigned char)raw_data[base + 2]; - if(cs > 1) - ret += 100000 * cs; - //qfInfo() << SIMessageData::dumpData(raw_data); - //qfInfo() << "n:" << ret << "cs:" << cs; - //ret += (cs << 16); - } - else if(card_data_layout_type == DataLayout6) { - int base = 2*4; - //QByteArray ba = raw_data.mid(CARD8_RECORD_BASE + 2*4, 16); - //qfInfo() << ba.toHex(); - ret = (((int)(unsigned char)raw_data[base+3]) << 16) + (((int)(unsigned char)raw_data[base+4]) << 8) + (unsigned char)raw_data[base+5]; - } - else if(card_data_layout_type >= DataLayout8 && card_data_layout_type <= DataLayout10) { - int base = 24; - //QByteArray ba = raw_data.mid(CARD8_RECORD_BASE + 24, 16); - //qfInfo() << ba.toHex(); - ret = (((int)(unsigned char)raw_data[base+1]) << 16) + (((int)(unsigned char)raw_data[base+2]) << 8) + (unsigned char)raw_data[base+3]; - } - if(ret < 200000) - ret = ret % 100000; - return ret; -} -/* -int SIMessageCardReadOut::startNumber() const -{ - QByteArray raw_data = data().rawData(); - int base = CARD5EXT_RECORD_BASE + 0x11; - int ret = (((int)(unsigned char)raw_data[base]) << 8) + (unsigned char)raw_data[base + 1]; - int cs = (unsigned char)raw_data[base + 2]; - if(cs == 1) cs = 0; - ret += (cs << 16); - return ret; -} -*/ -int SIMessageCardReadOut::checkTime() const -{ - int ret = 0; - QByteArray raw_data = data().data(); - CardDataLayoutType card_data_layout_type = cardDataLayoutType(); - if(card_data_layout_type == DataLayout5) { - int base = 0x19; - ret = (((int)(unsigned char)raw_data[base]) << 8) + (unsigned char)raw_data[base + 1]; - } - else if(card_data_layout_type == DataLayout6) { - int base = 7*4; - ret = (((int)(unsigned char)raw_data[base + 2]) << 8) + (unsigned char)raw_data[base + 3]; - } - else if(card_data_layout_type >= DataLayout8 && card_data_layout_type <= DataLayout10) { - int base = 2*4; - ret = (((int)(unsigned char)raw_data[base + 2]) << 8) + (unsigned char)raw_data[base + 3]; - } - return ret; -} - -int SIMessageCardReadOut::startTime() const -{ - int ret = 0; - QByteArray raw_data = data().data(); - CardDataLayoutType card_data_layout_type = cardDataLayoutType(); - if(card_data_layout_type == DataLayout5) { - int base = 0x13; - ret = (((int)(unsigned char)raw_data[base]) << 8) + (unsigned char)raw_data[base + 1]; - } - else if(card_data_layout_type == DataLayout6) { - int base = 6*4; - ret = (((int)(unsigned char)raw_data[base + 2]) << 8) + (unsigned char)raw_data[base + 3]; - } - else if(card_data_layout_type >= DataLayout8 && card_data_layout_type <= DataLayout10) { - int base = 3*4; - ret = (((int)(unsigned char)raw_data[base + 2]) << 8) + (unsigned char)raw_data[base + 3]; - } - return ret; -} - -int SIMessageCardReadOut::finishTime() const -{ - int ret = 0; - QByteArray raw_data = data().data(); - CardDataLayoutType card_data_layout_type = cardDataLayoutType(); - if(card_data_layout_type == DataLayout5) { - int base = 0x15; - ret = (((int)(unsigned char)raw_data[base]) << 8) + (unsigned char)raw_data[base + 1]; - } - else if(card_data_layout_type == DataLayout6) { - int base = 5*4; - ret = (((int)(unsigned char)raw_data[base + 2]) << 8) + (unsigned char)raw_data[base + 3]; - } - else if(card_data_layout_type >= DataLayout8 && card_data_layout_type <= DataLayout10) { - int base = 4*4; - ret = (((int)(unsigned char)raw_data[base + 2]) << 8) + (unsigned char)raw_data[base + 3]; - } - return ret; -} - -SIMessageCardReadOut::PunchList SIMessageCardReadOut::punches() const -{ - qfLogFuncFrame(); - PunchList ret; - CardDataLayoutType card_data_layout_type = cardDataLayoutType(); - if(card_data_layout_type == DataLayout5) { - QByteArray raw_data = data().data(); - int punch_cnt = raw_data[0x17]; - punch_cnt--; - int base = 0x20; - for(int i=0; i<30 && i" << QString::number(offset, 16); - Punch p(raw_data, base + offset, PunchRecordClasic); - ret << p; - } - for(int i=30; i<36 && i= (32-14)) offset += dataOffsetInPacket(); /// dalsi packet - //qfInfo() << i << "->" << QString::number(offset, 16); - Punch p(raw_data, base + offset, PunchRecordExtended); - ret << p; - } - } - else if(card_data_layout_type == DataLayout9) { - QByteArray raw_data = data().data(); - int punch_cnt = (unsigned char)raw_data[5*4 + 2]; - /// blocks 0, 1 - /// block 0 has 18 punches starting on page 14 - /// block 1 has 32 punches starting on page 0 - /// each punch has 4 bytes - int base = 14*4; - for(int i=0; i" << "base page:" << (base / 4) << "offset page:" << (offset / 4); - } - else { - raw_data = data().dataBlock(1); - base = 0; - offset = (i - 18) * 4; - //qfInfo() << i << "->" << "base page:" << (base / 4) << "offset page:" << (offset / 4); - } - //qfInfo() << i << "->" << QString::number(offset, 16); - Punch p(raw_data, base + offset, PunchRecordExtended); - ret << p; - } - } - else if(card_data_layout_type == DataLayoutP) { - QByteArray raw_data = data().data(); - int punch_cnt = (unsigned char)raw_data[5*4 + 2]; - /// blocks 1 - /// block 1 has 20 punches starting on page 1 offset 12 - /// each punch has 4 bytes - int base = 12*4; - for(int i=0; i" << QString::number(offset, 16); - Punch p(raw_data, base + offset, PunchRecordExtended); - ret << p; - } - } - else if(card_data_layout_type == DataLayout10) { - QByteArray raw_data = data().data(); - int punch_cnt = (unsigned char)raw_data[5*4 + 2]; - /// blocks 4,5,6,7 - /// each block has 32 punches - /// each punch has 4 bytes - for(int i=0; i, (C) 2011 -// -// Copyright: See COPYING file that comes with this distribution -// - -#ifndef SIMESSAGE_H -#define SIMESSAGE_H - -#include "simessagedata.h" - -#include - -#include -#include - -class SIUT_DECL_EXPORT SIMessageBase -{ -public: - SIMessageBase() {} - SIMessageBase(const SIMessageData &data) {m_data = data;} -public: - const SIMessageData &data() const {return m_data;} - QString dump() const; - //QVariant toVariant() const {return QVariant();} - //int headerLength() const {return data().headerLength();} - SIMessageData::Command command() const {return data().command();} -protected: - SIMessageData m_data; -}; -//Q_DECLARE_METATYPE(SIMessageData); - -class SIUT_DECL_EXPORT SIMessageCardReadOut : public SIMessageBase -{ - Q_DECLARE_TR_FUNCTIONS(SIMessageCardReadOut) -private: - typedef SIMessageBase Super; -public: - SIMessageCardReadOut(const SIMessageData &data); -public: - enum CardDataLayoutType {DataLayoutUnknown, DataLayout5, DataLayout6, DataLayout8, DataLayout9, DataLayoutP, DataLayout10}; - enum CardType {CardTypeUnknown, CardType5, CardType6, CardType8, CardType9, CardTypeP, CardTypeT, CardTypeSIAC, CardType10, CardType11}; -protected: - enum PunchRecordType {PunchRecordDegraded, PunchRecordClasic, PunchRecordExtended}; - //void setCardDataLayoutType(CardDataLayoutType t) {f_data.dataRef()["cardDataLayoutType"] = t;} - CardDataLayoutType cardDataLayoutType() const; - int rawCardType() const; - CardType cardType() const; -public: - class SIUT_DECL_EXPORT Punch - { - private: - class SharedDummyHelper {}; - class Data : public QSharedData - { - public: - int flags; - int code; - int time; - int msec; - Data() : flags(0), code(0), time(0), msec(0) {} - Data(const QByteArray &ba, int offset, int record_type); - }; - QSharedDataPointer d; - - Punch(SharedDummyHelper); /// null row constructor - static const Punch& sharedNull(); - public: - int code() const {return d->code;} - void setCode(int code) {d->code = code;} - int time() const {return d->time;} - void setTime(int tm) {d->time = tm;} - int msec() const {return d->msec;} - void setMsec(int ms) {d->msec = ms;} - //bool is24HoursTimeFormat() const {return d->is24HoursTimeFormat;} - /// 0-sunday - int dayOfWeek() const; - /// 4 week counter relative - int weekCnt() const; - - QVariantMap toVariantMap() const; - QString toString() const; - - Punch(); - Punch(const QByteArray &ba, int offset, PunchRecordType record_type); - }; - typedef QListPunchList; -public: - int stationCodeNumber() const; - //int countryCode() const; - //int clubCode() const; - int cardNumber() const; - //int startNumber() const; - int startTime() const; - int checkTime() const; - int finishTime() const; - PunchList punches() const; - QString dump() const; - QVariantMap toVariantMap() const; - static QString cardDataLayoutTypeToString(CardDataLayoutType card_layout_type); - static QString cardTypeToString(CardType card_type); - static bool isTimeValid(int time); - static int toAM(int time_sec); - static int toAMms(int time_msec); -}; - -class SIUT_DECL_EXPORT SIMessageTransmitPunch : public SIMessageBase -{ - Q_DECLARE_TR_FUNCTIONS(SIMessageTransmitPunch) -private: - typedef SIMessageBase Super; -public: - SIMessageTransmitPunch(const SIMessageData &data); - - int cardNumber() const {return m_cardNumber;} - SIMessageCardReadOut::Punch punch() const {return m_punch;} - QVariantMap toVariantMap() const; -private: - int m_cardNumber = 0; - SIMessageCardReadOut::Punch m_punch; -}; - -#endif // SIMESSAGE_H - diff --git a/libsiut/src/message/simessagedata.cpp b/libsiut/src/message/simessagedata.cpp deleted file mode 100644 index bce4c06da..000000000 --- a/libsiut/src/message/simessagedata.cpp +++ /dev/null @@ -1,256 +0,0 @@ - -// -// Author: Frantisek Vacek , (C) 2011 -// -// Copyright: See COPYING file that comes with this distribution -// - -#include "simessagedata.h" - -#include - -#include - -namespace siut { -/* -namespace -{ - class SIMessageDataMetaTypeInit - { - public: - SIMessageDataMetaTypeInit() - { - qRegisterMetaType("SIMessageData"); - } - }; - - SIMessageDataMetaTypeInit initializer; -} -*/ -//================================================= -// SIMessageData -//================================================= -SIMessageData::Command SIMessageData::command(const QByteArray &si_data) -{ - Command ret = Command::Invalid; - if(si_data.length() > 1) { - ret = (Command)(unsigned char)si_data[1]; - } - else { - qfError() << "invalid message"; - //qfInfo() << NecroLog::stackTrace(); - } - return ret; -} - -const char* SIMessageData::commandName(SIMessageData::Command cmd) -{ - const char *ret; - switch(cmd) { - case Command::SICard5Detected: ret = "CmdSICard5Detected"; break; - case Command::SICard6Detected: ret = "CmdSICard6Detected"; break; - case Command::SICard8Detected: ret = "CmdSICard8+"; break; - case Command::SICardRemoved: ret = "CmdSICardRemoved"; break; - //case Command::SICardDetectedOrRemoved: ret = "CmdSICardDetectedOrRemoved"; break; - case Command::GetSICard5: ret = "CmdGetSICard5"; break; - case Command::GetSICard6: ret = "CmdGetSICard6"; break; - case Command::GetSICard8: ret = "CmdGetSICard8"; break; - case Command::GetBackupMemory: ret = "GetBackupMemory"; break; - case Command::GetSystemData: ret = "GetSystemData"; break; - //case Command::TimeSend: ret = "CmdTimeSend"; break; - case Command::TransmitRecord: ret = "CmdTransmitRecord"; break; - case Command::Invalid: ret = "CmdInvalid"; break; - //case Command::DriverInfo: ret = "DriverInfo"; break; - default: - ret = "UnknownCommand"; - break; - } - return ret; -} -/* -SIMessageData::MessageType SIMessageData::type() const -{ - MessageType ret = MessageType::Invalid; - SIMessageData::Command cmd = command(); - if(cmd > SIMessageData::Command::Invalid) - switch(cmd) { - case SIMessageData::Command::SICard5Detected: - case SIMessageData::Command::SICard6Detected: - case SIMessageData::Command::SICard8Detected: - case SIMessageData::Command::SICardRemoved: - //case SIMessageData::Command::SICardDetectedOrRemoved: - // ret = MessageType::CardEvent; - // break; - case SIMessageData::Command::GetSICard5: - case SIMessageData::Command::GetSICard6: - case SIMessageData::Command::GetSICard8: - ret = MessageType::CardReadOut; - break; - //case SIMessageData::Command::GetPunch2: - case SIMessageData::Command::TransmitRecord: - ret = MessageType::Punch; - break; - //case SIMessageData::Command::DriverInfo: - // ret = MessageType::DriverInfo; - // break; - default: - ret = MessageType::Other; - break; - } - return ret; -} - -int SIMessageData::headerLength(SIMessageData::Command cmd) -{ - int ret = 0; - switch(cmd) { - case SIMessageData::Command::GetSystemData: ret = 0; break; //depends on type of data queried - case SIMessageData::Command::SetDirectRemoteMode: ret = 5; break; - case SIMessageData::Command::SICardRemovedExt: ret = 8; break; - case SIMessageData::Command::SICard5DetectedExt: ret = 8; break; - case SIMessageData::Command::SICard6DetectedExt: ret = 8; break; - case SIMessageData::Command::SICard8AndHigherDetectedExt: ret = 8; break; - case SIMessageData::Command::GetSICard5: ret = 2; break; - case SIMessageData::Command::GetSICard5Ext: ret = 4; break; - case SIMessageData::Command::GetSICard6: ret = 3; break; - case SIMessageData::Command::GetSICard6Ext: ret = 5; break; - case SIMessageData::Command::GetSICard8Ext: ret = 5; break; - case SIMessageData::Command::TransmitRecordExt: ret = 15; break; - default: - qfError() << "Can't find header length for command:" << (int)cmd << SIMessageData::commandName(cmd); - break; - } - return ret; -} - -QByteArray SIMessageData::dataBlock(int block_ix) const -{ - QByteArray ret = m_data.value(block_ix); - if(ret.isEmpty()) { - qfError() << "Invalid block no:" << block_ix; - } - return ret; -} -*/ -#if 0 -void SIMessageData::addRawDataBlock(const QByteArray& si_data_block) -{ - m_data << si_data_block; - /* - int block_no_offset = 0; - Command cmd = command(raw_data_with_header); - //qfInfo() << "addDataBlock CMD:" << QString::number(cmd, 16); - switch(cmd) { - case SIMessageData::Command::SICard5DetectedExt: - case SIMessageData::Command::SICard6DetectedExt: - case SIMessageData::Command::SICard8AndHigherDetectedExt: - case SIMessageData::Command::SICardRemovedExt: - break; - case SIMessageData::Command::GetSICard5: - case SIMessageData::Command::GetSICard5Ext: - break; - case SIMessageData::Command::GetSICard6: - block_no_offset = 2; - break; - case SIMessageData::Command::GetSICard6Ext: - case SIMessageData::Command::GetSICard8Ext: - block_no_offset = 4; - break; - default: - break; - } - int block_no = 0; - if(block_no_offset > 0) { - if(block_no_offset < raw_data_with_header.length()) { - block_no = (unsigned char)raw_data_with_header[block_no_offset]; - } - else { - qfError() << "Buffer is too short - offset:" << block_no_offset << "buff length:" << raw_data_with_header.length(); - } - } - int hdr_len = headerLength(command(raw_data_with_header)); - if(block_no == 0) { - QByteArray hdr; - if(hdr_len > 0) - hdr = raw_data_with_header.mid(0, hdr_len); - else - hdr = raw_data_with_header; - setHeader(raw_data_with_header); - } - QByteArray data = raw_data_with_header.mid(hdr_len); - if(!data.isEmpty()) - f_blockIndex[block_no] = data; - */ -} -#endif -static char hex_digit(int d) -{ - char ret = '#'; - if(d < 10) ret = '0' + d; - else ret = 'a' + (d - 10); - return ret; -} - -QString SIMessageData::dumpData(const QByteArray& ba, int bytes_in_the_row) -{ - /* - static constexpr char STX = 0x02; - static constexpr char ETX = 0x03; - static constexpr char ACK = 0x06; - static constexpr char NAK = 0x15; - static constexpr char DLE = 0x10; - */ - QString ret = QString("data length: %1").arg(ba.length()); - int i = 0; - int page = 0; - for(unsigned char c : ba) { - QString s; - if(i % bytes_in_the_row == 0) { - ret += '\n'; - ret += QString("%1 ").arg(page++, 2, 10, QChar('0')); - ret += QString("%1 ").arg(i, 4, 16, QChar('0')); - } - /* - if(c == STX) - s = "SX"; - else if(c == ETX) - s = "EX"; - else if(c == ACK) - s = "AK"; - else if(c == NAK) - s = "NK"; - else if(c == DLE) - s = "DL"; - else */ - { - char buff[] = "xx "; - buff[0] = hex_digit(c >> 4); - buff[1] = hex_digit(c % 16); - s = QString(buff); - } - ret += s; - i++; - } - return ret; -} - -QString SIMessageData::toString(int bytes_in_the_row) const -{ - QString ret; - ret = QString("command: %1\n").arg(commandName(command())); - ret += dumpData(m_data, bytes_in_the_row); - return ret; -} -#if 0 -//==================================================== -// DriverInfo -//==================================================== -QString DriverInfo::dump() const -{ - QString ret = "level: %1\nmessage: %2"; - ret = ret.arg(NecroLog::levelName((NecroLog::Level)level())).arg(message()); - return ret; -} -#endif - -} diff --git a/libsiut/src/message/simessagedata.h b/libsiut/src/message/simessagedata.h deleted file mode 100644 index 32b600d94..000000000 --- a/libsiut/src/message/simessagedata.h +++ /dev/null @@ -1,66 +0,0 @@ - -// -// Author: Frantisek Vacek , (C) 2011 -// -// Copyright: See COPYING file that comes with this distribution -// - -#ifndef SIUT_SIMESSAGEDATA_H -#define SIUT_SIMESSAGEDATA_H - -#include - -#include - -namespace siut { - -class SIUT_DECL_EXPORT SIMessageData -{ -public: - static constexpr uint8_t MS_MODE_DIRECT = 0x4D; - static constexpr uint8_t MS_MODE_REMOTE = 0x53; - enum class Command { - Invalid=0, - //SICardDetectedOrRemoved='F', /// next byte shoul be 'I' (detect) or 'O' (removed) - GetBackupMemory=0x81, - GetSystemData=0x83, - SICard5Detected=0xE5, - SICard6Detected=0xE6, - SICard8Detected=0xE8, - SICardRemoved=0xE7, - GetSICard5=0xB1, - GetSICard6=0xE1, - GetSICard8=0xEF, - //GetPunch2=0x53, /// autosend only (ie. punch) - SetDirectRemoteMode=0xF0, - //TimeSend=0x54, /// autosend only (ie. trigger data) - TransmitRecord=0xD3, /// autosend only (transmit punch or trigger data) - - //DriverInfo=0x1000 /// Driver info (SI commands are only 8 bit long) - }; - //enum class MessageType {Invalid=0, CardEvent, CardReadOut, Punch, DriverInfo, Other}; -public: - SIMessageData() {} - SIMessageData(const QByteArray &si_data) : m_data(si_data) {} - virtual ~SIMessageData() {} -public: - bool isNull() const {return m_data.isEmpty();} - static Command command(const QByteArray &si_data); - Command command() const {return command(data());} - //MessageType type() const; - /// offset of data in packet for each command - //static int headerLength(Command); - const QByteArray& data() const {return m_data;} - virtual QString toString(int bytes_in_the_row = 4) const; - static const char* commandName(Command cmd); - static QString dumpData(const QByteArray &ba, int bytes_in_the_row); -private: - QByteArray m_data; ///< block_no->rawData -}; - -} - -Q_DECLARE_METATYPE(siut::SIMessageData) - -#endif // SIMESSAGEDATA_H - diff --git a/libsiut/src/sicard.cpp b/libsiut/src/sicard.cpp deleted file mode 100644 index 6619922fd..000000000 --- a/libsiut/src/sicard.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "sicard.h" - -namespace siut { - -static QString time_str(int _time) -{ - QString ret = "%1:%2:%3"; - if(_time == 0xEEEE) ret = "----"; - else { - int time = SICard::toAM(_time); - ret = ret.arg(time / (60*60)).arg(QString::number((time / 60) % 60), 2, '0').arg(QString::number(time % 60), 2, '0'); - } - return ret; -} -/* -static QString ob_time_str(int _time) -{ - QString ret = "%1.%2"; - if(_time == 0xEEEE) ret = "----"; - else { - int time = SICard::toAM(_time); - ret = ret.arg(time / 60).arg(QString::number(time % 60), 2, '0'); - } - return ret; -} -*/ - -SICard::SICard() -{ -} - -SICard::SICard(int card_number) -{ - setCardNumber(card_number); -} - -QString SICard::toString() const -{ - QStringList sl; - //sl << data().dump(); - //sl << tr("cardType: %1 (raw type: %2)").arg(cardTypeToString(cardType())).arg(rawCardType()); - sl << tr("stationNumber: %1").arg(stationNumber()); - sl << tr("cardNumber: %1").arg(cardNumber()); - //sl << tr("startNumber: %1").arg(startNumber()); - //sl << tr("countryCode: %1").arg(countryCode()); - //sl << tr("clubCode: %1").arg(clubCode()); - sl << tr("check: %1").arg(time_str(checkTime())); - sl << tr("start: %1").arg(time_str(startTime())); - sl << tr("finish: %1").arg(time_str(finishTime())); - for (int n = 0; n < punchCount(); ++n) { - SIPunch p = punchAt(n); - sl << (" " + QString::number(n+1)).right(4) + ".\t" + QString::number(p.code()) + "\t" + time_str(p.time()); - } - return sl.join("\n"); -} - -int SICard::punchCount() const -{ - return punches().count(); -} - -SIPunch SICard::punchAt(int i) const -{ - QVariantMap m = punches().value(i).toMap(); - return SIPunch(m); -} - -QList SICard::punchList() const -{ - QList ret; - for (int i = 0; i < punchCount(); ++i) { - ret << punchAt(i); - } - return ret; -} - -int SICard::toAMms(int time_msec) -{ - constexpr int MSEC_12HR = 12 * 60 * 60 * 1000; - int ret = time_msec; - while(ret < 0) - ret += MSEC_12HR; - while(ret >= MSEC_12HR) - ret -= MSEC_12HR; - return ret; -} - -int SICard::toAM(int time_sec) -{ - return toAMms(time_sec * 1000) / 1000; -} - -} diff --git a/libsiut/src/sicard.h b/libsiut/src/sicard.h deleted file mode 100644 index 9e8532c70..000000000 --- a/libsiut/src/sicard.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef SIUT_SICARD_H -#define SIUT_SICARD_H - -#include "sipunch.h" - -#include - -#include -#include -#include - -namespace siut { - -class SIUT_DECL_EXPORT SICard : public QVariantMap -{ - Q_DECLARE_TR_FUNCTIONS(SICard) - using Super = QVariantMap; -public: - using PunchList = QVariantList; - static constexpr int INVALID_SI_TIME = 0xEEEE; - - SICard(); - SICard(const QVariantMap &o) : Super(o) {} - SICard(int card_number); - - QF_VARIANTMAP_FIELD(int, s, setS, tationNumber) - QF_VARIANTMAP_FIELD(int, c, setC, ardNumber) - QF_VARIANTMAP_FIELD(int, c, setC, heckTime) - QF_VARIANTMAP_FIELD(int, s, setS, tartTime) - QF_VARIANTMAP_FIELD(int, f, setF, inishTime) - QF_VARIANTMAP_FIELD(int, f, setF, inishTimeMs) - QF_VARIANTMAP_FIELD(QVariantList, p, setP, unches) - - QString toString() const; - - int punchCount() const; - SIPunch punchAt(int i) const; - //void addPunch(const SIPunch &p); - QList punchList() const; - - static bool isTimeValid(int time); - static int toAMms(int time_msec); - static int toAM(int time_sec); -}; - -} - -//Q_DECLARE_METATYPE(siut::SICard) - -#endif // SICARD_H diff --git a/libsiut/src/sipunch.cpp b/libsiut/src/sipunch.cpp deleted file mode 100644 index ccd30cacb..000000000 --- a/libsiut/src/sipunch.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include "sipunch.h" - -#include - -namespace siut { - -SIPunch::SIPunch() -{ -} - -SIPunch::SIPunch(int code, int time) -{ - setCode(code); - setTime(time); -} - -SIPunch::SIPunch(const QByteArray &card_data, int ix) -{ - /* - record structure: PTD - CN - PTH - PTL - CN - control station code number, 0...255 or subsecond value1 - PTD - day of week / halfday - bit 0 - am/pm - bit 3...1 - day of week, 000 = Sunday, 110 = Saturday - bit 5...4 - week counter 0…3, relative - bit 7...6 - control station code number high - (...511) - punching time PTH, PTL - 12h binary - */ - setTime((uint16_t)getUnsigned(card_data, ix + 2, 2)); - uint8_t pdt = (uint8_t)card_data[ix]; - uint16_t code_complete = ((pdt & 0x60) >> 6) << 8; - code_complete += (uint8_t)card_data[ix + 1]; - setCode(code_complete); - setPmFlag(pdt & 1); - setDayOfWeek((pdt & 0x0e) >> 1); - setWeekCnt((pdt & 0x30) >> 4); -} - -unsigned SIPunch::getUnsigned(const QByteArray &ba, int ix, int byte_cnt) -{ - unsigned ret = 0; - if(ix + byte_cnt <= ba.size()) { - for (int i = 0; i < byte_cnt; ++i) { - ret <<= 8; - ret += static_cast(ba[ix + i]); - } - } - else { - qfError() << "array too short"; - } - return ret; -} - -} // namespace siut diff --git a/libsiut/src/sipunch.h b/libsiut/src/sipunch.h deleted file mode 100644 index e755f3312..000000000 --- a/libsiut/src/sipunch.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef SIUT_SIPUNCH_H -#define SIUT_SIPUNCH_H - -#include - -#include - -#include -#include - -namespace siut { - -class SIUT_DECL_EXPORT SIPunch : public QVariantMap -{ - using Super = QVariantMap; -public: - enum DayOfWeek {Sunday = 0, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}; -public: - SIPunch(); - SIPunch(const QVariantMap &o) : Super(o) {} - SIPunch(int code, int time); - SIPunch(const QByteArray &card_data, int ix); - - QF_VARIANTMAP_FIELD(int, c, setC, ardNumber) - QF_VARIANTMAP_FIELD(int, c, setC, ode) - QF_VARIANTMAP_FIELD(int, t, setT, ime) - QF_VARIANTMAP_FIELD(int, m, setM, sec) - QF_VARIANTMAP_FIELD(bool, p, setP, mFlag) - QF_VARIANTMAP_FIELD(int, d, setD, ayOfWeek) - QF_VARIANTMAP_FIELD(int, w, setW, eekCnt) - -// QString toString() const; - undefined - - static unsigned getUnsigned(const QByteArray &ba, int ix, int byte_cnt = 2); -}; - -} // namespace siut - -//Q_DECLARE_METATYPE(siut::SIPunch) - -#endif // SIPUNCH_H diff --git a/libsiut/src/siutglobal.h b/libsiut/src/siutglobal.h deleted file mode 100644 index d722c9e4e..000000000 --- a/libsiut/src/siutglobal.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef SIUT_GLOBAL_H -#define SIUT_GLOBAL_H - -#include -/* -#if defined Q_CC_GNU && defined Q_OS_WIN32 -# define QF_CC_MINGW -# define WINVER 0x0501 /// pro mingw jako, ze to je pro XP a vys -#endif -*/ -/// Declaration of macros required for exporting symbols -/// into shared libraries -#if defined(SIUT_BUILD_DLL) -//#warning "EXPORT" -# define SIUT_DECL_EXPORT Q_DECL_EXPORT -#else -//#warning "IMPORT" -# define SIUT_DECL_EXPORT Q_DECL_IMPORT -#endif - -#endif