From 31889531c8666a214816369ea57dc97e633b83e4 Mon Sep 17 00:00:00 2001 From: andre Ebersold Date: Mon, 13 Nov 2023 21:10:18 +0100 Subject: [PATCH] Seems to work with all default cards. Pull up resistor on SDL maid it work! --- .../WorkhourMeter/WorkMeterHandler.cpp | 48 ++++++++++----- Application/WorkhourMeter/WorkMeterHandler.h | 3 + Application/WorkhourMeter/main.cpp | 58 ++++++++++++++----- HAL/Drivers/PN532Interface_I2C.cpp | 4 +- Metadata/Errors.h | 16 +++-- Platform/ErrorHandler/ErrorHandler.cpp | 22 +++---- Platform/ErrorHandler/ErrorHandler.h | 5 +- Platform/ErrorHandler/IErrorHandler.h | 2 +- Platform/RFIDReader/RFIDReaderHandler.cpp | 13 +++-- Platform/RFIDReader/RFIDReaderHandler.h | 3 +- 10 files changed, 121 insertions(+), 53 deletions(-) diff --git a/Application/WorkhourMeter/WorkMeterHandler.cpp b/Application/WorkhourMeter/WorkMeterHandler.cpp index 2648468..c9b5fb5 100644 --- a/Application/WorkhourMeter/WorkMeterHandler.cpp +++ b/Application/WorkhourMeter/WorkMeterHandler.cpp @@ -81,6 +81,10 @@ void WorkMeterHandler::setTime() { } +/** + * Cycle of scheduler is 10ms. So the cycle below is 1s + * + */ void WorkMeterHandler::run() { if (m_Ticks++ > 100) @@ -113,28 +117,44 @@ void WorkMeterHandler::run() { uint8_t _present = 0; m_Params->readValue(PID_BadgePresent,_present); - if (_present> 0) - { - m_LCD->print(reinterpret_cast("1")); - } else - { + if (_present> 0) + { + m_LCD->print(reinterpret_cast("1")); + } else + { m_LCD->print(reinterpret_cast("0")); - } - m_State = ST_WAIT; + } + m_State = ST_WAIT; } break; case ST_DISP_UPDATE_TIME: - timeToString(); - m_LCD->print(m_StrTime); - m_State = ST_WAIT_BADGE; + timeToString(); + m_LCD->print(m_StrTime); + m_State = ST_WAIT_BADGE; break; case ST_WAIT_BADGE: - /* 0 is fail :*/ - m_State = ST_DISP_UPDATE_CURSOR_TAG; - //m_State = ST_WAIT; + /* 0 is fail :*/ + m_State = ST_DISP_UPDATE_CURSOR_TAG; + //m_State = ST_WAIT; break; case ST_WAIT: - m_State = ST_WAIT; + m_State = ST_WAIT; + if (tagPresenceChanged()) + { + m_State = ST_DISP_UPDATE_CURSOR_TAG; + } break; }; } + +Bool_t WorkMeterHandler::tagPresenceChanged() +{ + uint8_t _present = 0; + m_Params->readValue(PID_BadgePresent,_present); + if (_present != m_TagChange) + { + m_TagChange = _present; + return true; + } + return false; +} diff --git a/Application/WorkhourMeter/WorkMeterHandler.h b/Application/WorkhourMeter/WorkMeterHandler.h index c832553..d326b79 100644 --- a/Application/WorkhourMeter/WorkMeterHandler.h +++ b/Application/WorkhourMeter/WorkMeterHandler.h @@ -29,6 +29,8 @@ class WorkMeterHandler : public ITask, public IParameterListener void getTime(); /**/ void setTime(); + + Bool_t tagPresenceChanged(); private: Uint8_t m_StrTime[9]; Uint8_t m_UID[7]; @@ -40,6 +42,7 @@ class WorkMeterHandler : public ITask, public IParameterListener RtcTime_t m_Time; Uint32_t m_Ticks; Uint8_t m_State; + Bool_t m_TagChange; }; #endif diff --git a/Application/WorkhourMeter/main.cpp b/Application/WorkhourMeter/main.cpp index 401ec4f..6f4b2b4 100644 --- a/Application/WorkhourMeter/main.cpp +++ b/Application/WorkhourMeter/main.cpp @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include #include #include @@ -54,6 +56,7 @@ */ class Scheduler : public IInterruptActivity { + typedef void (Scheduler::*pFunction_t)(); private: enum TIME_SLOTS { FIRST_TIME_SLOT = 0, @@ -74,6 +77,31 @@ class Scheduler : public IInterruptActivity } Task_type ; static Task_type gTasks[TASK_COUNT]; + private: + Led0 *m_Led; + IProtocolLayer2 *m_Netstring; + CommunicationHandler *m_Com; + ITask *m_WorkMeter; + ITask *m_Storage; + ITask *m_RFIDReader; + volatile TIME_SLOTS m_CurrentTimeslot; + ETASK_ID m_CurrentTask; + RtcTime_t m_Time; + private: + void doTask1() + { + m_WorkMeter->run(); + } + void doTask2() + { + m_Led->tick(); + m_RFIDReader->run(); + } + void doTask3() + { + m_Led->tick(); + m_Storage->run(); + } public: Scheduler( Led0 *_led,IProtocolLayer2 *_net , CommunicationHandler *_com @@ -95,9 +123,20 @@ class Scheduler : public IInterruptActivity // main entry point void schedule() { + + static const Scheduler::pFunction_t task[3] = { + &Scheduler::doTask1 + , &Scheduler::doTask2 + , &Scheduler::doTask3 + }; + + waitForTimeslot(); m_Com->run(); - switch (m_CurrentTask) +#if 1 + (this->*(task[m_CurrentTask]))(); +#else + switch (m_CurrentTask) { case TASK1: //m_Adc->run(); @@ -116,8 +155,10 @@ class Scheduler : public IInterruptActivity ; } +#endif m_CurrentTask = gTasks[m_CurrentTask].m_NextTask; } + // called by the interrupt timer handler virtual void tick() { @@ -141,16 +182,6 @@ class Scheduler : public IInterruptActivity ; } } - private: - Led0 *m_Led; - IProtocolLayer2 *m_Netstring; - CommunicationHandler *m_Com; - ITask *m_WorkMeter; - ITask *m_Storage; - ITask *m_RFIDReader; - volatile TIME_SLOTS m_CurrentTimeslot; - ETASK_ID m_CurrentTask; - RtcTime_t m_Time; }; @@ -174,7 +205,8 @@ void init(IParameterHandler *m_Param) */ int main(void) { - ParameterHandler gParam; + ParameterHandler gParam; + ErrorHandler gError(&gParam); #if defined (__AVR_ATmega32U4__) Led0 led(&PORTC, &DDRC, PINB7,&gParam); #else @@ -193,7 +225,7 @@ int main(void) NetString netstring(&uart); CommunicationHandler gCom(&netstring,&gParam); PersistentStorage gStorage(&gEeprom,&gParam); - RFIDReaderHandler gRFIDReader(&nfc,&gParam); + RFIDReaderHandler gRFIDReader(&nfc,&gParam,&gError); WorkMeterHandler gWorkMeter(&gRtc,&lcd,&gParam,&nfc); Scheduler sched( &led , &netstring diff --git a/HAL/Drivers/PN532Interface_I2C.cpp b/HAL/Drivers/PN532Interface_I2C.cpp index ae5a458..988bcd2 100644 --- a/HAL/Drivers/PN532Interface_I2C.cpp +++ b/HAL/Drivers/PN532Interface_I2C.cpp @@ -167,7 +167,7 @@ Int8_t PN532InterfaceI2C::readAckFrame() break; } timeout--; - _delay_ms(1); + _delay_us(500); } while (timeout > 0); /* If Succeed compare result */ m_ReadReady = false; @@ -197,7 +197,7 @@ Int16_t PN532InterfaceI2C::getResponseLength( Uint8_t *_buff break; } timeout--; - _delay_ms(1); + _delay_us(500); } while(timeout); } diff --git a/Metadata/Errors.h b/Metadata/Errors.h index c457426..575c769 100644 --- a/Metadata/Errors.h +++ b/Metadata/Errors.h @@ -2,11 +2,15 @@ #define __ERRORS_H__ enum ErrorIds_t { - ERROR_Application_Starting = 0 - ,ERROR_Eeprom_Read_Invalid_Length = 1 - ,ERROR_Eeprom_Read_Invalid_Address = 2 - ,ERROR_Eeprom_Write_Invalid_Length = 3 - ,ERROR_Eeprom_Write_Invalid_Address = 4 - ,ERROR_MAX = 5 + ERR_Application_Starting = 0 + ,ERR_Eeprom_Read_Invalid_Length = 1 + ,ERR_Eeprom_Read_Invalid_Address = 2 + ,ERR_Eeprom_Write_Invalid_Length = 3 + ,ERR_Eeprom_Write_Invalid_Address = 4 + ,ERR_I2C_Transaction_Ongoing = 5 + ,ERR_I2C_Write_Failed = 6 + ,ERR_I2C_Read_Failed = 7 + ,ERR_I2C_Timeout = 8 + ,ERROR_MAX }; #endif diff --git a/Platform/ErrorHandler/ErrorHandler.cpp b/Platform/ErrorHandler/ErrorHandler.cpp index 02bc74d..49724af 100644 --- a/Platform/ErrorHandler/ErrorHandler.cpp +++ b/Platform/ErrorHandler/ErrorHandler.cpp @@ -1,17 +1,19 @@ #include #include +#include #include #include "IErrorHandler.h" #include "ErrorHandler.h" -static Uint8_t m_PID_Errors[ERROR_VECTORS] = {PID_LowLevelError1,PID_LowLevelError2}; -static Uint32_t m_LowLevelErrors[ERROR_VECTORS] {0,0}; +Uint8_t ErrorHandler::m_PID_Errors[ERROR_VECTORS] = {PID_LowLevelError1,PID_LowLevelError2}; +Uint32_t ErrorHandler::m_LowLevelErrors[ERROR_VECTORS] = {0,0}; -void ErrorHandler::ErrorHandler() +ErrorHandler::ErrorHandler(IParameterHandler *argParams) + : m_Params(argParams) { } @@ -20,27 +22,27 @@ void ErrorHandler::run() updateErrors(); } -void ErrorHandler::setError(Error_t _err) +void ErrorHandler::setError(Uint16_t _err) { Uint16_t _offset = 0; Uint8_t _vect = 0; Bool_t _found = false; - while (!_found && (_vect < ERROR_VECTOR) ) + while (!_found && (_vect < ERROR_VECTORS) ) { - if (_err < (offset + 32)) + if (_err < (_offset + 32)) { - Uint32_t _errorBit = static_cast(1)<<(_err - ofsset); - m_LowLevelErrors[_vect] |= + Uint32_t _errorBit = static_cast(1)<<(_err - _offset); + m_LowLevelErrors[_vect] |= _errorBit; _found = true; } - offset+=32; + _offset+=32; _vect++; }; } void ErrorHandler::updateErrors() { - for (Uint8_t i = 0; i < ERROR_VECTOR ; ++i) + for (Uint8_t i = 0; i < ERROR_VECTORS ; ++i) { m_Params->writeValue(m_PID_Errors[i],m_LowLevelErrors[i]); m_LowLevelErrors[i] = 0L; diff --git a/Platform/ErrorHandler/ErrorHandler.h b/Platform/ErrorHandler/ErrorHandler.h index 5c81877..91c51e8 100644 --- a/Platform/ErrorHandler/ErrorHandler.h +++ b/Platform/ErrorHandler/ErrorHandler.h @@ -21,8 +21,9 @@ class ErrorHandler : public IErrorHandler , public ITask private: void updateErrors(); private: - static Uint8_t m_PID_Errors[ERROR_VECTORS]; - static Uint32_t m_LowLevelErrors[ERROR_VECTORS]; + IParameterHandler *m_Params; + static Uint8_t m_PID_Errors[ERROR_VECTORS]; + static Uint32_t m_LowLevelErrors[ERROR_VECTORS]; }; #endif diff --git a/Platform/ErrorHandler/IErrorHandler.h b/Platform/ErrorHandler/IErrorHandler.h index 6f7c9b0..9a8b9c7 100644 --- a/Platform/ErrorHandler/IErrorHandler.h +++ b/Platform/ErrorHandler/IErrorHandler.h @@ -11,6 +11,6 @@ class IErrorHandler public: IErrorHandler() {}; /// - virtual setError(Uint16_t error_id) = 0 ; + virtual void setError(Uint16_t error_id) = 0 ; }; #endif diff --git a/Platform/RFIDReader/RFIDReaderHandler.cpp b/Platform/RFIDReader/RFIDReaderHandler.cpp index 9ec5ea4..98d0981 100644 --- a/Platform/RFIDReader/RFIDReaderHandler.cpp +++ b/Platform/RFIDReader/RFIDReaderHandler.cpp @@ -3,16 +3,20 @@ #include "Abstract/RFID/IPN532Interface.h" #include "HAL/Drivers/PN532.h" #include "Platform/IParameterHandler.h" +#include "Platform/ErrorHandler/IErrorHandler.h" #include "Metadata/WorkmeterParamIds.h" +#include "Metadata/Errors.h" #include "Platform/RFIDReader/RFIDReaderHandler.h" -RFIDReaderHandler::RFIDReaderHandler(PN532 *argNFC,IParameterHandler *argParam) - : m_NFC(argNFC), m_Param(argParam),m_State(ST_INIT) +RFIDReaderHandler::RFIDReaderHandler(PN532 *argNFC + ,IParameterHandler *argParam + ,IErrorHandler *argError) + : m_NFC(argNFC), m_Param(argParam),m_Error(argError),m_State(ST_INIT) , m_1Milli(10),m_CurrentRequest(ST_IDLE),m_Ticks(0) { } @@ -46,6 +50,7 @@ void RFIDReaderHandler::doStateMachine() { Uint32_t ver = m_NFC->getFirmwareVersion(); m_Param->writeValue(PID_RFFirmwareVersion,ver); + m_State = ST_IDLE; } break; case ST_REQ_BADGE_ID: @@ -61,7 +66,7 @@ void RFIDReaderHandler::doStateMachine() m_State = ST_DISP_ON; // Do nothing } else { - m_1Milli = 10; + m_1Milli = 1; m_State = ST_WAIT_RESPONSE; } break; @@ -73,7 +78,7 @@ void RFIDReaderHandler::doStateMachine() break; case ST_DISP_OFF: doDisplay(true); - m_1Milli = 10; + m_1Milli = 1; m_State = ST_WAIT_RESPONSE; m_CurrentRequest = ST_REQ_BADGE_ID; break; diff --git a/Platform/RFIDReader/RFIDReaderHandler.h b/Platform/RFIDReader/RFIDReaderHandler.h index 560eec8..e49cabb 100644 --- a/Platform/RFIDReader/RFIDReaderHandler.h +++ b/Platform/RFIDReader/RFIDReaderHandler.h @@ -20,7 +20,7 @@ class RFIDReaderHandler : public ITask ,ST_DELAY_1MILLI }; public: - RFIDReaderHandler(PN532 *argNFC,IParameterHandler *argParam); + RFIDReaderHandler(PN532 *argNFC,IParameterHandler *argParam,IErrorHandler *argError); void run(); private: void doStateMachine(); @@ -33,6 +33,7 @@ class RFIDReaderHandler : public ITask private: PN532 *m_NFC; IParameterHandler *m_Param; + IErrorHandler *m_Error; Uint8_t m_State; Uint8_t m_1Milli; Uint8_t m_CurrentRequest; -- 2.30.2