/* Generated with snc from ../sncPauFcomPush.stt */ /* Program "sncPauFcomPush" */ #include #include #include #include #include "epicsTypes.h" #include "seqCom.h" /* Variable declarations */ struct UserVar { # line 108 "../sncPauFcomPush.stt" int i; # line 109 "../sncPauFcomPush.stt" unsigned long userData[4]; # line 110 "../sncPauFcomPush.stt" char *muxName; # line 111 "../sncPauFcomPush.stt" char *fcomName; # line 113 "../sncPauFcomPush.stt" int feedback_mode; # line 117 "../sncPauFcomPush.stt" double static_data[4]; }; /* C code definitions */ # line 4 "../sncPauFcomPush.stt" #define FBCK_OFF 0 #define FBCK_ON 1 # line 11 "../sncPauFcomPush.stt" #include #include #include #include typedef struct { char fcomPVName[40]; FcomID fcomId; FcomBlob *pBlob; int status; double pushVal; unsigned succCnt; unsigned failCnt; } usrData_ts; static usrData_ts * usrAllocate(char *mux_name) { usrData_ts *pUsr = (usrData_ts*) mallocMustSucceed(sizeof(usrData_ts), mux_name); FcomBlob *pBlob = (FcomBlob *) mallocMustSucceed(sizeof(FcomBlob), mux_name); if(pUsr && pBlob) { pUsr->pBlob = pBlob; return pUsr; } else return (usrData_ts *)NULL; } static unsigned long initFcom(char *mux_name, int slot) { if(!mux_name) return 0; usrData_ts *p = usrAllocate(mux_name); if(!p) return 0; p->status = 0; p->pushVal = 0.; p->succCnt = 0; p->failCnt = 0; makeFcomPVNamewithSlotNumber(mux_name, p->fcomPVName, slot); p->fcomId = fcomLCLSPV2FcomID(p->fcomPVName); if(!p->fcomId) return 0; else return (unsigned long) p; } static void reportFcom(char *mux_name, unsigned long usrData) { if(!usrData) return; usrData_ts *p = (usrData_ts*) usrData; epicsPrintf("\tsncPauFcomPush: mux (%s), fcomPV (%s), fcomID (0x%8x), pUsr (%8p), pBlob (%8p)\n", mux_name, p->fcomPVName, (unsigned int) p->fcomId, p, p->pBlob); } static int pushFcom(unsigned long usrData, double value) { if(!usrData) return -1; usrData_ts *pUsr = (usrData_ts *) usrData; FcomBlob *pBlob = pUsr->pBlob; epicsTimeStamp timestamp; pUsr->pushVal = value; epicsTimeGetCurrent(×tamp); pBlob->fc_vers = FCOM_PROTO_VERSION; pBlob->fc_tsHi = timestamp.secPastEpoch; pBlob->fc_tsLo = timestamp.nsec; pBlob->fc_stat = 0; pBlob->fc_type = FCOM_EL_DOUBLE; pBlob->fc_nelm = 1; pBlob->fc_idnt = pUsr->fcomId; pBlob->fc_dbl = &pUsr->pushVal; pUsr->status = fcomPutBlob(pBlob); if(!pUsr->status) pUsr->succCnt++; else pUsr->failCnt++; return pUsr->status; } /* Program init func */ static void G_prog_init(struct UserVar *pVar) { static struct UserVar pVarInit = { 0, {0,0,0,0}, 0, 0, 0, {0,0,0,0}, }; *pVar = pVarInit; } /****** Code for state "init" in state set "fcomPush" ******/ /* Entry function for state "init" in state set "fcomPush" */ static void I_fcomPush_init(SS_ID ssId, struct UserVar *pVar) { # line 140 "../sncPauFcomPush.stt" pVar->muxName = seq_macValueGet(ssId, "MUX_NAME"); # line 141 "../sncPauFcomPush.stt" pVar->fcomName = seq_macValueGet(ssId, "FCOM_NAME"); # line 142 "../sncPauFcomPush.stt" if (pVar->fcomName) # line 142 "../sncPauFcomPush.stt" pVar->muxName = pVar->fcomName; # line 144 "../sncPauFcomPush.stt" for (pVar->i = 0; pVar->i < 4; pVar->i++) { # line 145 "../sncPauFcomPush.stt" pVar->userData[pVar->i] = initFcom(pVar->muxName, pVar->i); } } /* Exit function for state "init" in state set "fcomPush" */ static void O_fcomPush_init(SS_ID ssId, struct UserVar *pVar) { # line 153 "../sncPauFcomPush.stt" for (pVar->i = 0; pVar->i < 4; pVar->i++) { # line 154 "../sncPauFcomPush.stt" reportFcom(pVar->muxName, pVar->userData[pVar->i]); } } /* Delay function for state "init" in state set "fcomPush" */ static void D_fcomPush_init(SS_ID ssId, struct UserVar *pVar) { # line 149 "../sncPauFcomPush.stt" seq_delayInit(ssId, 0, (1.)); } /* Event function for state "init" in state set "fcomPush" */ static seqBool E_fcomPush_init(SS_ID ssId, struct UserVar *pVar, int *pTransNum, int *pNextState) { # line 149 "../sncPauFcomPush.stt" if (seq_delay(ssId, 0)) { *pNextState = 1; *pTransNum = 0; return TRUE; } return FALSE; } /* Action function for state "init" in state set "fcomPush" */ static void A_fcomPush_init(SS_ID ssId, struct UserVar *pVar, int transNum, int *pNextState) { switch(transNum) { case 0: { } return; } } /****** Code for state "deactivate" in state set "fcomPush" ******/ /* Delay function for state "deactivate" in state set "fcomPush" */ static void D_fcomPush_deactivate(SS_ID ssId, struct UserVar *pVar) { } /* Event function for state "deactivate" in state set "fcomPush" */ static seqBool E_fcomPush_deactivate(SS_ID ssId, struct UserVar *pVar, int *pTransNum, int *pNextState) { # line 160 "../sncPauFcomPush.stt" if (!pVar->feedback_mode) { *pNextState = 2; *pTransNum = 0; return TRUE; } return FALSE; } /* Action function for state "deactivate" in state set "fcomPush" */ static void A_fcomPush_deactivate(SS_ID ssId, struct UserVar *pVar, int transNum, int *pNextState) { switch(transNum) { case 0: { } return; } } /****** Code for state "activate" in state set "fcomPush" ******/ /* Delay function for state "activate" in state set "fcomPush" */ static void D_fcomPush_activate(SS_ID ssId, struct UserVar *pVar) { } /* Event function for state "activate" in state set "fcomPush" */ static seqBool E_fcomPush_activate(SS_ID ssId, struct UserVar *pVar, int *pTransNum, int *pNextState) { # line 166 "../sncPauFcomPush.stt" if (pVar->feedback_mode) { *pNextState = 1; *pTransNum = 0; return TRUE; } # line 170 "../sncPauFcomPush.stt" if (seq_efTestAndClear(ssId, 1/*ev_data0*/)) { *pNextState = 2; *pTransNum = 1; return TRUE; } # line 174 "../sncPauFcomPush.stt" if (seq_efTestAndClear(ssId, 2/*ev_data1*/)) { *pNextState = 2; *pTransNum = 2; return TRUE; } # line 178 "../sncPauFcomPush.stt" if (seq_efTestAndClear(ssId, 3/*ev_data2*/)) { *pNextState = 2; *pTransNum = 3; return TRUE; } # line 182 "../sncPauFcomPush.stt" if (seq_efTestAndClear(ssId, 4/*ev_data3*/)) { *pNextState = 2; *pTransNum = 4; return TRUE; } return FALSE; } /* Action function for state "activate" in state set "fcomPush" */ static void A_fcomPush_activate(SS_ID ssId, struct UserVar *pVar, int transNum, int *pNextState) { switch(transNum) { case 0: { } return; case 1: { # line 171 "../sncPauFcomPush.stt" pushFcom(pVar->userData[0], pVar->static_data[0]); } return; case 2: { # line 175 "../sncPauFcomPush.stt" pushFcom(pVar->userData[1], pVar->static_data[1]); } return; case 3: { # line 179 "../sncPauFcomPush.stt" pushFcom(pVar->userData[2], pVar->static_data[2]); } return; case 4: { # line 183 "../sncPauFcomPush.stt" pushFcom(pVar->userData[3], pVar->static_data[3]); } return; } } /************************ Tables ************************/ /* Channel table */ static seqChan G_channels[] = { /* chName, offset, varName, varType, count, eventNum, efId, monitored, queueSize, queueIndex */ {"{MUX_NAME}:FBCK", offsetof(struct UserVar, feedback_mode), "feedback_mode", "int", 1, 5, 0, 1, 0, 0}, {"{MUX_NAME}:SETDATA_0", offsetof(struct UserVar, static_data[0]), "static_data[0]", "double", 1, 6, 1, 1, 0, 0}, {"{MUX_NAME}:SETDATA_1", offsetof(struct UserVar, static_data[1]), "static_data[1]", "double", 1, 7, 2, 1, 0, 0}, {"{MUX_NAME}:SETDATA_2", offsetof(struct UserVar, static_data[2]), "static_data[2]", "double", 1, 8, 3, 1, 0, 0}, {"{MUX_NAME}:SETDATA_3", offsetof(struct UserVar, static_data[3]), "static_data[3]", "double", 1, 9, 4, 1, 0, 0} }; /* Event masks for state set "fcomPush" */ static const seqMask EM_fcomPush_init[] = { 0x00000000, }; static const seqMask EM_fcomPush_deactivate[] = { 0x00000020, }; static const seqMask EM_fcomPush_activate[] = { 0x0000003e, }; /* State table for state set "fcomPush" */ static seqState G_fcomPush_states[] = { { /* state name */ "init", /* action function */ A_fcomPush_init, /* event function */ E_fcomPush_init, /* delay function */ D_fcomPush_init, /* entry function */ I_fcomPush_init, /* exit function */ O_fcomPush_init, /* event mask array */ EM_fcomPush_init, /* state options */ (0) }, { /* state name */ "deactivate", /* action function */ A_fcomPush_deactivate, /* event function */ E_fcomPush_deactivate, /* delay function */ D_fcomPush_deactivate, /* entry function */ 0, /* exit function */ 0, /* event mask array */ EM_fcomPush_deactivate, /* state options */ (0) }, { /* state name */ "activate", /* action function */ A_fcomPush_activate, /* event function */ E_fcomPush_activate, /* delay function */ D_fcomPush_activate, /* entry function */ 0, /* exit function */ 0, /* event mask array */ EM_fcomPush_activate, /* state options */ (0) }, }; /* State set table */ static seqSS G_state_sets[] = { { /* state set name */ "fcomPush", /* states */ G_fcomPush_states, /* number of states */ 3, /* number of delays */ 1 }, }; /* Program table (global) */ seqProgram sncPauFcomPush = { /* magic number */ 2001006, /* program name */ "sncPauFcomPush", /* channels */ G_channels, /* num. channels */ 5, /* state sets */ G_state_sets, /* num. state sets */ 1, /* user var size */ sizeof(struct UserVar), /* param */ "", /* num. event flags */ 4, /* encoded options */ (0 | OPT_CONN | OPT_NEWEF | OPT_REENT), /* init func */ G_prog_init, /* entry func */ NULL, /* exit func */ NULL, /* num. queues */ 0 }; /* Register sequencer commands and program */ #include "epicsExport.h" static void sncPauFcomPushRegistrar (void) { seqRegisterSequencerCommands(); seqRegisterSequencerProgram (&sncPauFcomPush); } epicsExportRegistrar(sncPauFcomPushRegistrar);