Seems to work with all default cards. Pull up resistor on SDL maid it work!
authorandre Ebersold <andre.ebersold@free.fr>
Mon, 13 Nov 2023 20:10:18 +0000 (21:10 +0100)
committerandre Ebersold <andre.ebersold@free.fr>
Mon, 13 Nov 2023 20:10:18 +0000 (21:10 +0100)
Application/WorkhourMeter/WorkMeterHandler.cpp
Application/WorkhourMeter/WorkMeterHandler.h
Application/WorkhourMeter/main.cpp
HAL/Drivers/PN532Interface_I2C.cpp
Metadata/Errors.h
Platform/ErrorHandler/ErrorHandler.cpp
Platform/ErrorHandler/ErrorHandler.h
Platform/ErrorHandler/IErrorHandler.h
Platform/RFIDReader/RFIDReaderHandler.cpp
Platform/RFIDReader/RFIDReaderHandler.h

index 2648468a6bfcf49110ed175535bc0d091eadf185..c9b5fb5485b4a59a1b484e0b3a67f285a787c3de 100644 (file)
@@ -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<const Uint8_t *>("1"));
-            } else
-            {
+             if (_present> 0) 
+             {
+                 m_LCD->print(reinterpret_cast<const Uint8_t *>("1"));
+             } else
+             {
                 m_LCD->print(reinterpret_cast<const Uint8_t *>("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;
+}
index c8325537cdf4fbeb2b8bff30c1a36d94f86ec92c..d326b7955e1969097c60a6165aa0525f1b843c97 100644 (file)
@@ -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
index 401ec4f85b35fe844917ae8fe90901bf5a686269..6f4b2b4c420f8198029ab15609c01ab1766026b5 100644 (file)
@@ -24,6 +24,8 @@
 #include <AVR/AvrEeprom.h>
 #include <AVR/AvrI2C.h>
 #include <Platform/IParameterHandler.h>
+#include <Platform/ErrorHandler/IErrorHandler.h>
+#include <Platform/ErrorHandler/ErrorHandler.h>
 #include <Metadata/WorkmeterParamIds.h>
 #include <Platform/ParameterHandler.h>
 #include <Platform/PersistentStorage.h>
@@ -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
index ae5a458b4726cf460ebbb64e336a6d193f256239..988bcd2c7b618a266d72a74c5f15735892b8e717 100644 (file)
@@ -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);
     }
 
index c45742670f7f20cf605cbf741569041799b8d381..575c7697fe864346d43fc82146ae8f8e0c2bd523 100644 (file)
@@ -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
index 02bc74de56147243a6edab233564a3958189e11d..49724af5788c1978317132cd3801c539aca79392 100644 (file)
@@ -1,17 +1,19 @@
 #include <Utils/StdTypes.h>
 
 #include <Platform/IParameterHandler.h>
+#include <Application/ITask.h>
 
 #include <Metadata/ParameterTable.h>
 
 #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<Uin32_t>(1)<<(_err - ofsset);
-            m_LowLevelErrors[_vect] |=
+            Uint32_t _errorBit = static_cast<Uint32_t>(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;
index 5c81877fd08622aa39a2d4031c869fb3240e1a99..91c51e81de1f6a732a599f9f54a285a2f02ab0dd 100644 (file)
@@ -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
index 6f7c9b00cf24c632cb2163b5b95ef27d53640336..9a8b9c726c470859b523d800b90fab45558dffdc 100644 (file)
@@ -11,6 +11,6 @@ class IErrorHandler
     public:
         IErrorHandler() {};
         /// 
-        virtual setError(Uint16_t error_id) = 0 ;
+        virtual void setError(Uint16_t error_id) = 0 ;
 };
 #endif
index 9ec5ea45c538df090b27433e239d8297fcf6b45d..98d0981bd967a18432be6814f794378cc1f51711 100644 (file)
@@ -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;
index 560eec89a6306710c301665ac2120524c0ccf750..e49cabb29afb84e3fe5b93ab823f4c6832d00941 100644 (file)
@@ -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;