Event Handling für den ESP8266

Hallo,

ich habe mir ein eigenes kleines EventHandling programmiert, wer Interesse hat kann es sich ja mal anschauen.

typedef   unsigned char UC;     
typedef     signed char SC;     
typedef   unsigned short UI_16;
typedef   signed short SI_16;   
typedef   unsigned int UI_32;   
typedef   signed int SI_32;
typedef   unsigned long  UI_64;
typedef   signed long SI_64;

#include <Arduino.h>
#include <Ticker.h>
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
WiFiUDP UDP,UDPrx,UDP1, UDP2;

//--------------------------------------------------------------------------
IPAddress ip(192, 168, 10, 75); 
IPAddress gateway(192, 168, 10, 254);
IPAddress dns(192, 168, 10, 254);
IPAddress subnet(255, 255, 255, 0);
bool bLed;
//--------------------------------------------------------------------------
typedef void (*TIME_FU_PTR)(void);
typedef enum{SINGLE_MODE_OFF,SINGLE_MODE_ON}SINGLE_MODE;
typedef enum{TIMER_MODE_STOP,TIMER_MODE_RUN}TIMER_MODE;
//typedef bool (*BREAK_FU_PTR)(void);
typedef void (*POLLING_FU_PTR)(UI_16);
typedef enum{SINGLE_SHOT_OFF,SINGLE_SHOT_ON}TYPE_POLLING_SINGLE;
typedef enum{POLLING_DISABLE,POLLING_ENABLE}TYPE_POLLING_ENABLE;

typedef struct
{
  UI_16 LastTime;
  UI_16 DeltaTime;
  POLLING_FU_PTR FunktionPointer;
  TYPE_POLLING_SINGLE Single;
  TYPE_POLLING_ENABLE Enable;
  UC Busy;
}DELTA_TIME;
#define MAX_HANDLES 15
static DELTA_TIME DeltaTime[MAX_HANDLES+1];
static UI_16 PollIndex = 0;
UI_16 SystemTimeTick = 0;
UI_16 Index;
UC AllHandles;
//--------------------------------------------------------------------------  

#define _TICK_TIME 2500
//-------------------------------------------------------------------------------------------------------
//Timer ISR 500µs
//-------------------------------------------------------------------------------------------------------
void ICACHE_RAM_ATTR onTimerISR()
{
    SystemTimeTick++;
    timer1_write(_TICK_TIME);     

}
bool bWifiLed, WifiConnected;
//-------------------------------------------------------------------------------------------------------
// alle 100ms
//-------------------------------------------------------------------------------------------------------
void evWifiStatusLed(UI_16 Time)
{
    if(WifiConnected)
        digitalWrite(2, 1); //Led aus
    else
    {
      digitalWrite(2, bWifiLed); //Led toogle
      bWifiLed ^= true;
      
    }
}
//-------------------------------------------------------------------------------------------------------
//  alle 1000ms
//-------------------------------------------------------------------------------------------------------
void evWifi(UI_16 Time)
{
    if((WiFi.status() == WL_CONNECTED))
        WifiConnected = true;
    else
        WifiConnected = false;
}
//-------------------------------------------------------------------------------------------------------
// alle 10ms
//-------------------------------------------------------------------------------------------------------
void evMain(UI_16 Time)
{
    digitalWrite(5, bLed);
    bLed ^= true;
}
//-------------------------------------------------------------------------------------------------------
// alle 5000ms
//-------------------------------------------------------------------------------------------------------
void evSonstiges(UI_16 Time)
{
    digitalWrite(5, bLed);
    bLed ^= true;
}
//-----------------------------------------------------------------
//
//-----------------------------------------------------------------
void EventHandling(void)
{
    if((DeltaTime[PollIndex].DeltaTime != 0) && (DeltaTime[PollIndex].Enable == POLLING_ENABLE))
  {
    if(DeltaTime[PollIndex].LastTime > SystemTimeTick)
      DeltaTime[PollIndex].LastTime = (65535 - DeltaTime[PollIndex].LastTime) + SystemTimeTick;
                if((SystemTimeTick - DeltaTime[PollIndex].LastTime) >= DeltaTime[PollIndex].DeltaTime)
    {
            if(DeltaTime[PollIndex].Single == SINGLE_SHOT_ON)
                DeltaTime[PollIndex].Enable = POLLING_DISABLE;
            DeltaTime[PollIndex].FunktionPointer(SystemTimeTick - DeltaTime[PollIndex].LastTime);
            DeltaTime[PollIndex].LastTime = SystemTimeTick;
    }
  }
  if((PollIndex++) >=AllHandles)
    PollIndex= 0; 
}
//-------------------------------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------------------------------
void InitEventHandler(void)
{
    //Initialize Ticker 
    timer1_attachInterrupt(onTimerISR);
    timer1_enable(TIM_DIV16, TIM_EDGE, TIM_SINGLE);
    timer1_write(_TICK_TIME);//500µs       
}
//-----------------------------------------------------------------
//
//-----------------------------------------------------------------
UC EventHandlingAddNewEvent(UI_16 TimeMs,POLLING_FU_PTR FunktionPointer,TYPE_POLLING_SINGLE Single,TYPE_POLLING_ENABLE Enable)
{
  Index = 0;
  while(Index <MAX_HANDLES)
  {
    if(DeltaTime[Index].DeltaTime == 0)
    {
      DeltaTime[Index].DeltaTime = TimeMs*2;
      DeltaTime[Index].FunktionPointer = FunktionPointer;
      DeltaTime[Index].Single = Single;//POLLING_SINGLE_OFF;
      DeltaTime[Index].Enable = Enable;//POLLING_ENABLE;
      break;
    }
    Index++;
  }
  if(Index == MAX_HANDLES)
    return 0xff;
  else
  {
    AllHandles = Index;
    return Index;
  }
}
//-------------------------------------------------------------------------------------------------------
//
//-------------------------------------------------------------------------------------------------------
void setup() 
{
    Serial.begin(115200);
    pinMode(2, OUTPUT);
    pinMode(5, OUTPUT);
    
    WiFi.disconnect(true);  
    WiFi.mode(WIFI_STA); 
    WiFi.config(ip, dns, gateway,subnet);
    WiFi.begin("xxxx", "yyyyyyyy");      

    InitEventHandler();
    //Events Init
    EventHandlingAddNewEvent(10,evMain,SINGLE_SHOT_OFF,POLLING_ENABLE);      
    EventHandlingAddNewEvent(1000,evWifi,SINGLE_SHOT_OFF,POLLING_ENABLE);    
    EventHandlingAddNewEvent(100,evWifiStatusLed,SINGLE_SHOT_OFF,POLLING_ENABLE);    
    EventHandlingAddNewEvent(5000,evWifiStatusLed,SINGLE_SHOT_OFF,POLLING_ENABLE);   
}
//-------------------------------------------------------------------------------------------------------
// In loop wird dann nur noch EventHandling ausgeführt
//-------------------------------------------------------------------------------------------------------
void loop()
{
    EventHandling();
}

Gruß
Johann