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