Archived
Template
1
0

update blinker with XFTGenerator

This commit is contained in:
Rémi Heredero 2023-07-13 14:38:28 +02:00
parent 01d096e886
commit defd961017
6 changed files with 279 additions and 319 deletions

View File

@ -46,8 +46,8 @@ void APP_init(APP* me){
CLICK_HANDLER_onLong_click(ch1(), &longClick, me); CLICK_HANDLER_onLong_click(ch1(), &longClick, me);
CLICK_HANDLER_onLong_click(ch3(), &longClick, me); CLICK_HANDLER_onLong_click(ch3(), &longClick, me);
BLINKER_setFinished(blL(), BLINKER_defineCallBack(&endL, me)); BLINKER_onFinished(blL(), &endL, me);
BLINKER_setFinished(blR(), BLINKER_defineCallBack(&endR, me)); BLINKER_onFinished(blR(), &endR, me);
} }
@ -71,34 +71,34 @@ bool APP_processEvent(Event* ev){
case STAP_WAIT: case STAP_WAIT:
if(evid == evAPclickL) { if(evid == evAPclickL) {
me->state = STAP_BLINKER_L; me->state = STAP_BLINKER_L;
BLINKER_blink(blL()); BLINKER_emitBlink(blL(), 0);
} }
if(evid == evAPclickLn) { if(evid == evAPclickLn) {
me->state = STAP_BLINKER_L; me->state = STAP_BLINKER_L;
BLINKER_blinkN(blL()); BLINKER_emitBlinkN(blL(), 0);
} }
if(evid == evAPclickR) { if(evid == evAPclickR) {
me->state = STAP_BLINKER_R; me->state = STAP_BLINKER_R;
BLINKER_blink(blR()); BLINKER_emitBlink(blR(), 0);
} }
if(evid == evAPclickRn) { if(evid == evAPclickRn) {
me->state = STAP_BLINKER_R; me->state = STAP_BLINKER_R;
BLINKER_blinkN(blR()); BLINKER_emitBlinkN(blR(), 0);
} }
if(evid == evAPlongClick) { if(evid == evAPlongClick) {
me->state = STAP_BLINKER_W; me->state = STAP_BLINKER_W;
BLINKER_blink(blB()); BLINKER_emitBlink(blB(), 0);
} }
break; break;
case STAP_BLINKER_L: case STAP_BLINKER_L:
if(evid == evAPclickR){ if(evid == evAPclickR){
me->state = STAP_BLINKER_LR; me->state = STAP_BLINKER_LR;
BLINKER_blink(blR()); BLINKER_emitBlink(blR(), 0);
} }
if(evid == evAPclickRn){ if(evid == evAPclickRn){
me->state = STAP_BLINKER_LR; me->state = STAP_BLINKER_LR;
BLINKER_blinkN(blR()); BLINKER_emitBlinkN(blR(), 0);
} }
if(evid == evAPclickL) { if(evid == evAPclickL) {
me->state = STAP_WAIT; me->state = STAP_WAIT;
@ -110,18 +110,18 @@ bool APP_processEvent(Event* ev){
if(evid == evAPlongClick) { if(evid == evAPlongClick) {
me->state = STAP_BLINKER_W; me->state = STAP_BLINKER_W;
BLINKER_endBlink(blL()); BLINKER_endBlink(blL());
BLINKER_blink(blB()); BLINKER_emitBlink(blB(), 0);
} }
break; break;
case STAP_BLINKER_R: case STAP_BLINKER_R:
if(evid == evAPclickL){ if(evid == evAPclickL){
me->state = STAP_BLINKER_LR; me->state = STAP_BLINKER_LR;
BLINKER_blink(blL()); BLINKER_emitBlink(blL(), 0);
} }
if(evid == evAPclickLn){ if(evid == evAPclickLn){
me->state = STAP_BLINKER_LR; me->state = STAP_BLINKER_LR;
BLINKER_blinkN(blL()); BLINKER_emitBlinkN(blL(), 0);
} }
if(evid == evAPclickR) { if(evid == evAPclickR) {
me->state = STAP_WAIT; me->state = STAP_WAIT;
@ -133,7 +133,7 @@ bool APP_processEvent(Event* ev){
if(evid == evAPlongClick) { if(evid == evAPlongClick) {
me->state = STAP_BLINKER_W; me->state = STAP_BLINKER_W;
BLINKER_endBlink(blR()); BLINKER_endBlink(blR());
BLINKER_blink(blB()); BLINKER_emitBlink(blB(), 0);
} }
break; break;
@ -156,7 +156,8 @@ bool APP_processEvent(Event* ev){
me->state = STAP_BLINKER_W; me->state = STAP_BLINKER_W;
BLINKER_endBlink(blL()); BLINKER_endBlink(blL());
BLINKER_endBlink(blR()); BLINKER_endBlink(blR());
BLINKER_blink(blB()); BLINKER_emitBlink(blB(), 0);
} }
break; break;

View File

@ -145,12 +145,12 @@ void Factory_build() {
BUTTON_onReleased(b2(), &CLICK_HANDLER_emitPbrelease, ch2()); BUTTON_onReleased(b2(), &CLICK_HANDLER_emitPbrelease, ch2());
BUTTON_onReleased(b3(), &CLICK_HANDLER_emitPbrelease, ch3()); BUTTON_onReleased(b3(), &CLICK_HANDLER_emitPbrelease, ch3());
BLINKER_setTurnOn(blL(), BLINKER_defineCallBack(&LED_on, l1())); BLINKER_onOn(blL(), &LED_on, l1());
BLINKER_setTurnOff(blL(), BLINKER_defineCallBack(&LED_off, l1())); BLINKER_onOff(blL(), &LED_off, l1());
BLINKER_setTurnOn(blR(), BLINKER_defineCallBack(&LED_on, l10())); BLINKER_onOn(blR(), &LED_on, l10());
BLINKER_setTurnOff(blR(), BLINKER_defineCallBack(&LED_off, l10())); BLINKER_onOff(blR(), &LED_off, l10());
BLINKER_setTurnOn(blB(), BLINKER_defineCallBack(&warningBlink, true)); BLINKER_onOn(blB(), &warningBlink, true);
BLINKER_setTurnOff(blB(), BLINKER_defineCallBack(&warningBlink, false)); BLINKER_onOff(blB(), &warningBlink, false);
} }
@ -162,8 +162,8 @@ void Factory_start() {
CLICK_HANDLER_startBehaviour(ch1()); CLICK_HANDLER_startBehaviour(ch1());
CLICK_HANDLER_startBehaviour(ch2()); CLICK_HANDLER_startBehaviour(ch2());
CLICK_HANDLER_startBehaviour(ch3()); CLICK_HANDLER_startBehaviour(ch3());
BLINKER_starBehaviour(blL()); BLINKER_startBehaviour(blL());
BLINKER_starBehaviour(blR()); BLINKER_startBehaviour(blR());
BLINKER_starBehaviour(blB()); BLINKER_startBehaviour(blB());
APP_startBehaviour(app()); APP_startBehaviour(app());
} }

View File

@ -1,155 +1,189 @@
/** /**
* @author Rémi Heredero (remi@heredero.ch) * @author Rémi Heredero
* @version. 1.0.0 * @version 1.0.0
* @date 2023-06-15 * @date July 2023
* @file blinker.c
*/ */
#include "blinker.h" #include "blinker.h"
void BLINKER_init(BLINKER* me){
void BLINKER_init(BLINKER* me) {
me->state = STBL_INIT; me->state = STBL_INIT;
me->tON = 500; me->timeOn = 500;
me->tOFF = 500; me->timeOff = 500;
me->nBlink = 3; me->numberOfBlink = 3;
me->nBlinkIsOn = false; me->nBlinkIsOn = false;
me->remainBlinks = 3; me->remainBlinks = 3;
me->turnOn.fCallBack = NULL; me->wait.f = NULL;
me->turnOff.fCallBack = NULL; me->on.f = NULL;
me->off.f = NULL;
me->finished.f = NULL;
} }
blinkerCallBack BLINKER_defineCallBack(fBlinkerCallBack f, void* param) { void BLINKER_startBehaviour(BLINKER* me) {
blinkerCallBack c;
c.fCallBack = f;
c.param = param;
return c;
}
void BLINKER_starBehaviour(BLINKER* me) {
POST(me, &BLINKER_processEvent, evBLinit, 0, 0); POST(me, &BLINKER_processEvent, evBLinit, 0, 0);
} }
void BLINKER_setTurnOn(BLINKER* me, blinkerCallBack callBack) {
me->turnOn = callBack;
}
void BLINKER_setTurnOff(BLINKER* me, blinkerCallBack callBack) {
me->turnOff = callBack;
}
void BLINKER_setFinished(BLINKER* me, blinkerCallBack callBack){
me->finished = callBack;
}
void BLINKER_defineNblink(BLINKER* me, uint8_t n){
me->nBlink = n;
}
void BLINKER_setTimeOn(BLINKER*me, uint16_t t) {
me->tON = t;
}
void BLINKER_setTimeOff(BLINKER*me, uint16_t t) {
me->tOFF = t;
}
void BLINKER_blinkN(BLINKER* me){
POST(me, &BLINKER_processEvent, evBLblinkN, 0, 0);
}
void BLINKER_blink(BLINKER* me){
POST(me, &BLINKER_processEvent, evBLblink, 0, 0);
}
bool BLINKER_processEvent(Event* ev) { bool BLINKER_processEvent(Event* ev) {
bool processed = false; bool processed = false;
BLINKER* me = (BLINKER*) Event_getTarget(ev); BLINKER* me = (BLINKER*)Event_getTarget(ev);
BLINKER_STATES oldState = me->state; BLINKER_STATES oldState = me->state;
evIDT evid = Event_getId(ev); evIDT evid = Event_getId(ev);
switch(me->state) { switch (me->state) { // onState
case STBL_INIT: case STBL_INIT:
if(evid == evBLinit) { if (ev->id == evBLinit) {
me->state = STBL_WAIT; me->state = STBL_WAIT;
} }
break; break;
case STBL_WAIT: case STBL_WAIT:
me->remainBlinks = me->nBlink; me->remainBlinks = me->numberOfBlink;
if(evid == evBLblinkN) { if(evid == evBLblinkN) {
me->state = STBL_ON; me->state = STBL_ON;
me->nBlinkIsOn = true; me->nBlinkIsOn = true;
POST(me, &BLINKER_processEvent, evBLtimer, me->tON, 0); BLINKER_emitTimer(me, me->timeOn);
} }
if(evid == evBLblink) {
if(evid==evBLblink) {
me->state = STBL_ON; me->state = STBL_ON;
me->nBlinkIsOn = false; me->nBlinkIsOn = false;
POST(me, &BLINKER_processEvent, evBLtimer, me->tON, 0); BLINKER_emitTimer(me, me->timeOn);
} }
break; break;
case STBL_ON: case STBL_ON:
if(me->nBlinkIsOn) me->remainBlinks--; if (me->nBlinkIsOn) {
me->remainBlinks--;
if(evid == evBLtimer) { }
me->state = STBL_OFF; if (evid == evBLtimer) {
POST(me, &BLINKER_processEvent, evBLtimer, me->tOFF, 0); me->state = STBL_OFF;
BLINKER_emitTimer(me, me->timeOff);
} }
break; break;
case STBL_OFF: case STBL_OFF:
if (evid == evBLtimer) {
if(evid == evBLtimer) { if (me->remainBlinks == 0) {
if(me->remainBlinks == 0) {
me->state = STBL_WAIT; me->state = STBL_WAIT;
if(me->finished.fCallBack != NULL) me->finished.fCallBack(me->finished.param); if (me->finished.f != NULL) {
me->finished.f(me->finished.p);
}
} else { } else {
me->state = STBL_ON; me->state = STBL_ON;
POST(me, &BLINKER_processEvent, evBLtimer, me->tON, 0); BLINKER_emitTimer(me, me->timeOn);
} }
} }
break; break;
} }
if(oldState != me->state) { if(oldState != me->state){
switch(me->state) { // on entry switch (oldState) { // onExit
case STBL_INIT: case STBL_INIT:
break; break;
case STBL_WAIT: case STBL_WAIT:
break; break;
case STBL_ON: case STBL_ON:
if(me->turnOn.fCallBack != NULL) me->turnOn.fCallBack(me->turnOn.param);
break; break;
case STBL_OFF: case STBL_OFF:
if(me->turnOff.fCallBack != NULL) me->turnOff.fCallBack(me->turnOff.param);
break; break;
} }
switch (me->state) { // onEntry
case STBL_INIT:
break;
case STBL_WAIT:
if (me->wait.f != NULL) {
me->wait.f(me->wait.p);
}
break;
case STBL_ON:
if (me->on.f != NULL) {
me->on.f(me->on.p);
}
break;
case STBL_OFF:
if (me->off.f != NULL) {
me->off.f(me->off.p);
}
break;
}
processed = true; processed = true;
} }
return processed; return processed;
} }
/*************
* Callbacks *
*************/
void BLINKER_onWait(BLINKER* me, BLINKER_CALLBACK_FUNCTION f, void* p) {
me->wait.f = f;
me->wait.p = p;
}
void BLINKER_onOn(BLINKER* me, BLINKER_CALLBACK_FUNCTION f, void* p) {
me->on.f = f;
me->on.p = p;
}
void BLINKER_onOff(BLINKER* me, BLINKER_CALLBACK_FUNCTION f, void* p) {
me->off.f = f;
me->off.p = p;
}
void BLINKER_onFinished(BLINKER* me, BLINKER_CALLBACK_FUNCTION f, void* p) {
me->finished.f = f;
me->finished.p = p;
}
/************
* EMITTERS *
************/
void BLINKER_emitBlink(BLINKER* me, uint16_t t) {
POST(me, &BLINKER_processEvent, evBLblink, t, 0);
}
void BLINKER_emitBlinkN(BLINKER* me, uint16_t t) {
POST(me, &BLINKER_processEvent, evBLblinkN, t, 0);
}
void BLINKER_emitTimer(BLINKER* me, uint16_t t) {
POST(me, &BLINKER_processEvent, evBLtimer, t, 0);
}
/***********
* SETTERS *
***********/
void BLINKER_setTimeOn(BLINKER* me, uint16_t v) {
me->timeOn = v;
}
void BLINKER_setTimeOff(BLINKER* me, uint16_t v) {
me->timeOff = v;
}
void BLINKER_setNumberOfBlink(BLINKER* me, uint8_t v) {
me->numberOfBlink = v;
}
void BLINKER_setNBlinkIsOn(BLINKER* me, bool v) {
me->nBlinkIsOn = v;
}
void BLINKER_setRemainBlinks(BLINKER* me, uint8_t v) {
me->remainBlinks = v;
}
void BLINKER_endBlink(BLINKER* me) { void BLINKER_endBlink(BLINKER* me) {
me->remainBlinks = 0; me->remainBlinks = 0;
} }
void BLINKER_toggle(BLINKER* me){
switch(me->state) {
case STBL_WAIT:
BLINKER_blink(me);
break;
case STBL_OFF:
BLINKER_endBlink(me);
break;
case STBL_ON:
BLINKER_endBlink(me);
break;
}
}

View File

@ -1,11 +1,11 @@
/** /**
* @author Rémi Heredero (remi@heredero.ch) * @author Rémi Heredero
* @version 1.0.0 * @version 1.0.0
* @date 2023-06-15 * @date July 2023
* @file blinker.h
*/ */
#ifndef BLINKER_H #ifndef BLINKER_H
#define BLINKER_H #define BLINKER_H
#include "../xf/xf.h" #include "../xf/xf.h"
@ -20,116 +20,148 @@ typedef enum {
evBLinit = 200, evBLinit = 200,
evBLblink, evBLblink,
evBLblinkN, evBLblinkN,
evBLtimer, evBLtimer
evEndBlink
} BLINKER_EVENTS; } BLINKER_EVENTS;
typedef void (*fBlinkerCallBack)(void*); typedef void (*BLINKER_CALLBACK_FUNCTION)(void*);
typedef struct { typedef struct {
fBlinkerCallBack fCallBack; BLINKER_CALLBACK_FUNCTION f; // function
void* param; void* p; // param(s)
} blinkerCallBack; } BLINKER_CALLBACK;
typedef struct { typedef struct {
BLINKER_STATES state; // Actual state BLINKER_STATES state; //Actual state
uint16_t tON; // Time on uint16_t timeOn; // Time on
uint16_t tOFF; // Time off uint16_t timeOff; // Time off
uint8_t nBlink; // Number of blink for this blinker when start with blinkN uint8_t numberOfBlink; // Number of blink for this blinker when start with blinkN
bool nBlinkIsOn; // If the nBlink way is enable bool nBlinkIsOn; // If the nBlink way is enable
uint8_t remainBlinks; // Actual remain blink uint8_t remainBlinks; // Actual remain blink
blinkerCallBack turnOn; // Callback for turnOn BLINKER_CALLBACK wait;
blinkerCallBack turnOff; // Calbback for turnOff BLINKER_CALLBACK on;
blinkerCallBack finished; // Callback for finish n blink BLINKER_CALLBACK off;
}BLINKER; BLINKER_CALLBACK finished;
} BLINKER;
/** /**
* Initialize the blinker * Initialize the BLINKER
* @param me blinker itself * @param me the BLINKER itself
*/ */
void BLINKER_init(BLINKER* me); void BLINKER_init(BLINKER* me);
/** /**
* Define a callback for BLINKER * Start the BLINKER state machine
* @param f callback for BLINKER * @param me the BLINKER itself
* @param param callback paramater for ther function
* @return the callback struct
*/ */
blinkerCallBack BLINKER_defineCallBack(fBlinkerCallBack f, void* param); void BLINKER_startBehaviour(BLINKER* me);
/** /**
* Start state machine of the BLINKER * Process the event
* @param me the blinker itself * @param ev the event to process
*/ * @return true if the event is processed
void BLINKER_starBehaviour(BLINKER* me);
/**
* Set callback event functions for turn on
* @param me the blinker itself
* @param callBack function when the blinker is on
*/
void BLINKER_setTurnOn(BLINKER* me, blinkerCallBack callBack);
/**
* Set callback event functions for turn off
* @param me the blinker itself
* @param callBack function when the blinker is off
*/
void BLINKER_setTurnOff(BLINKER* me, blinkerCallBack callBack);
/**
* Set callback event functions for when the blinker has blink n times
* @param me the blinker itseld
* @param callBack callBack function when the blinker has blink n times
*/
void BLINKER_setFinished(BLINKER* me, blinkerCallBack callBack);
/**
* define number of time the Blinker have to blink
* @param me the blinker itself
* @param n number of blink
*/
void BLINKER_defineNblink(BLINKER* me, uint8_t n);
/**
* define time to stay ON
* @param me the blinker itself
* @param t the time to stay ON
*/
void BLINKER_setTimeOn(BLINKER*me, uint16_t t);
/**
* define time to stay OFF
* @param me the blinker itself
* @param t the time to stay OFF
*/
void BLINKER_setTimeOff(BLINKER*me, uint16_t t);
/**
* Start to blink n time
* @param me the blinker itself
*/
void BLINKER_blinkN(BLINKER* me);
/**
* Start to blink indefinitely
* @param me the blinker itself
*/
void BLINKER_blink(BLINKER* me);
/**
* State machine of the BUTTON
* @param ev event to process on the state machine
*/ */
bool BLINKER_processEvent(Event* ev); bool BLINKER_processEvent(Event* ev);
/*************
* Callbacks *
*************/
/**
* Set the callback function to call when the BLINKER is entering state wait
* @param me the BLINKER itself
* @param f the function to call
* @param p the param(s) to pass to the function
*/
void BLINKER_onWait(BLINKER* me, BLINKER_CALLBACK_FUNCTION f, void* p);
/**
* Set the callback function to call when the BLINKER is entering state on
* @param me the BLINKER itself
* @param f the function to call
* @param p the param(s) to pass to the function
*/
void BLINKER_onOn(BLINKER* me, BLINKER_CALLBACK_FUNCTION f, void* p);
/**
* Set the callback function to call when the BLINKER is entering state off
* @param me the BLINKER itself
* @param f the function to call
* @param p the param(s) to pass to the function
*/
void BLINKER_onOff(BLINKER* me, BLINKER_CALLBACK_FUNCTION f, void* p);
/**
* Set the callabck function to call when the BLINKER is entering state finished
* @param me the BLINKER itself
* @param f the function to call
* @param t the param(s) to pass to the function
*/
void BLINKER_onFinished(BLINKER* me, BLINKER_CALLBACK_FUNCTION f, void* p);
/************
* EMITTERS *
************/
/**
* Emit the blink event
* @param me the BLINKER itself
* @param t time to wait in ms before triggering event
*/void BLINKER_emitBlink(BLINKER* me, uint16_t t);
/**
* Emit the blinkn event
* @param me the BLINKER itself
* @param t time to wait in ms before triggering event
*/void BLINKER_emitBlinkN(BLINKER* me, uint16_t t);
/**
* Emit the timer event
* @param me the BLINKER itself
* @param t time to wait in ms before triggering event
*/void BLINKER_emitTimer(BLINKER* me, uint16_t t);
/***********
* SETTERS *
***********/
/**
* Set the time on
* @param me the BLINKER itself
* @param v the value to set
*/
void BLINKER_setTimeOn(BLINKER* me, uint16_t v);
/**
* Set the time off
* @param me the BLINKER itself
* @param v the value to set
*/
void BLINKER_setTimeOff(BLINKER* me, uint16_t v);
/**
* Set the number of blink
* @param me the BLINKER itself
* @param v the value to set
*/
void BLINKER_setNumberOfBlink(BLINKER* me, uint8_t v);
/**
* Set the nBlinkIsOn
* @param me the BLINKER itself
* @param v the value to set
*/
void BLINKER_setNBlinkIsOn(BLINKER* me, bool v);
/**
* Set the remain blink(s)
* @param me the BLINKER itself
* @param v the value to set
*/
void BLINKER_setRemainBlinks(BLINKER* me, uint8_t v);
/** /**
* Stop to blink if it was indefinitely blinking * Stop to blink if it was indefinitely blinking
* @param me the blinker itself * @param me the blinker itself
*/ */
void BLINKER_endBlink(BLINKER* me); void BLINKER_endBlink(BLINKER* me);
void BLINKER_toggle(BLINKER* me); #endif
#endif /* BLINKER_H */

View File

@ -1,52 +0,0 @@
/**
* @author Rémi Heredero
* @version 1.0.0
* @date July 2023
* @file ${FILENAME}.c
*/
#include "${FILENAME}.h"
void ${FILENAME}_init(${FILENAME}* me){
me->state = ST${FN}_INIT;
}
void ${FILENAME}_startBehaviour(${FILENAME}* me){
POST(me, &${FILENAME}_processEvent, ev${FN}init, 0, 0);
}
bool ${FILENAME}_processEvent(Event* ev) {
bool processed = false;
${FILENAME}* me = (${FILENAME}*)Event_getTarget(ev);
switch (me->state) { // onState
case ST${FN}_INIT:
if (ev->id == ev${FN}init) {}
break;
{STATES}
}
if(oldState != me->state){
switch (oldState) { // onExit
case ST${FN}_INIT:
break;
{STATES}
}
switch (me->state) { // onEntry
case ST${FN}_INIT:
break;
{STATES}
}
processed = true;
}
return processed;
}
void ${FILENAME}_set{VAR}(${FILENAME}*me, uint16_t t) {
me->tON = t;
}
void ${FILENAME}_emit${EVENT}(${FILENAME}*me, uint16_t t) {
POST(me, &${FILENAME}_processEvent, ev${FN}${EVENT}, t, 0);
}

View File

@ -1,55 +0,0 @@
/**
* @author Rémi Heredero
* @version 1.0.0
* @date July 2023
* @file ${FILENAME}.h
*/
#ifndef ${FILENAME}_H
#define ${FILENAME}_H
#include "../xf/xf.h"
typedef enum{
ST${FN}_INIT,
{STATES}
} ${FILENAME}_STATES;
typedef enum{
ev${FN}init = 100, // TODO change this number
{EVENTS}
} ${FILENAME}_EVENTS;
typedef struct{
${FILENAME}_STATES state;
} ${FILENAME};
/**
* Initialize the ${FILENAME}
* @param me the ${FILENAME} itself
*/
void ${FILENAME}_init(${FILENAME}* me);
/**
* Start the ${FILENAME} state machine
* @param me the ${FILENAME} itself
*/
void ${FILENAME}_startBehaviour(${FILENAME}* me);
/**
* Process the event
* @param ev the event to process
* @return true if the event is processed
*/
bool ${FILENAME}_processEvent(Event* ev);
void ${FILENAME}_set{TIMEON}(${FILENAME}*me, uint16_t t);
/**
* Emit the ${EVENT} event
* @param me the ${FILENAME} itself
* @param t Time to wait before trig the event
*/
void ${FILENAME}_emit${EVENT}(${FILENAME}*me, uint16_t t);
#endif