
#ifndef _timeouts_h
#define _timeouts_h

#include "RBPXPLRTERM_config.h"

/*
 * ========================== timeout support ==============================
 */

typedef void (*TimeoutCompletionFunction) (int param);     // pointer to a timeout completion function with no result and one integer parameter

//
// timeouts 
//
volatile struct {
	bool isRunning;
	int  ticks;
	TimeoutCompletionFunction callOnCompletion;
	int completionParam;
  String completionData;
} timeouts[NUM_TIMEOUTS];

void stopTimeout(int num);                                                                      // stop a timeout
int findTimeoutSlot();                                                                          // find a free timeout slot
int startTimeout(int ticksToRun, TimeoutCompletionFunction callback, int callbackParam);        // start a timeout of <ticksToRun>, on completion <callback> is invoked with <callbackParam> as parameter
void registerTicker(DFuncParPtr ticker, int tickerparam);                                       // register a ticker function to be called at each basic tick
int startEventTimeout(int ticksToRun, int timeoutCompletionEventCode);                          // start a timeout that produces an event upon completion
int restartEventTimeout(int num, int ticksToRun, int timeoutCompletionEventCode);								// restart a timeout that produces an event upon completion
void eventTimeoutComplete(int callbackParam);

//
// basic tick timer interrupt service function
//
#ifdef ENV_ESP32
void IRAM_ATTR tickTimer();
#else
void tickTimer();
#endif

void initTimeouts();                     // initialize the timeout mechanism 

#endif
