Another way of 'cheating', but not as elegant as I would like...
long returnedValue = 0;
void setup() {
Serial.begin(9600);
}
void doFunctionAtInterval( void ( *callBackFunction )(), unsigned long *nextEvent, unsigned long interval ) {
unsigned long now = millis();
if ( now >= *nextEvent ) {
*nextEvent = now + interval;
callBackFunction();
}
}
void doFunctionAtInterval( long ( *callBackFunction )(), long *value, unsigned long *nextEvent, unsigned long interval ) {
unsigned long now = millis();
if ( now >= *nextEvent ) {
*nextEvent = now + interval;
*value = callBackFunction();
}
}
void loop() {
doFunctionAtInterval(voidNoArgsFunction, &nextVoidNoArgsFunction, 400);
doFunctionAtInterval(noArgFunction, &returnedValue, &nextVoidOneArgFunction, 1000);
}
long noArgFunction() {
return random(0,100);
}
void voidNoArgsFunction() {
Serial.println(returnedValue);
}