- Refactored site specific stuff into a site module - PSI specific stuff is now in the PSI directory. - The old version has been tagged with pre-ansto SKIPPED: psi/A1931.c psi/A1931.h psi/amor2t.c psi/amor2t.h psi/amor2t.i psi/amor2t.tex psi/amor2t.w psi/amorscan.c psi/amorscan.h psi/amorscan.w psi/amorstat.c psi/amorstat.h psi/amorstat.i psi/amorstat.tex psi/amorstat.w psi/bruker.c psi/bruker.h psi/bruker.w psi/buffer.c psi/buffer.h psi/dilludriv.c psi/dilludriv.h psi/dmc.c psi/dmc.h psi/dmc.w psi/docho.c psi/ecb.c psi/ecb.h psi/ecb.i psi/ecb.w psi/ecbdriv.c psi/ecbdriv.h psi/el734dc.c psi/el734driv.c psi/el755driv.c psi/el755driv.h psi/faverage.c psi/faverage.h psi/faverage.tex psi/faverage.w psi/fowrite.c psi/fowrite.h psi/itc4.c psi/itc4.h psi/itc4.w psi/itc4driv.c psi/ltc11.c psi/ltc11.h psi/nextrics.c psi/nextrics.h psi/nxamor.c psi/nxamor.h psi/nxamor.tex psi/nxamor.w psi/pimotor.c psi/pimotor.h psi/pimotor.tex psi/pimotor.w psi/pipiezo.c psi/polterwrite.c psi/polterwrite.h psi/psi.c psi/ruli.c psi/ruli.h psi/sanscook.c psi/sanswave.c psi/sanswave.h psi/sanswave.tex psi/sanswave.w psi/serial.c psi/serial.h psi/serial.w psi/sinqhmdriv.c psi/sinqhmdriv.i psi/sinqhmdriv.w psi/slsmagnet.c psi/sps.c psi/sps.h psi/sps.i psi/sps.tex psi/sps.w psi/swmotor.c psi/swmotor.h psi/swmotor.i psi/tas.c psi/tas.h psi/tas.tex psi/tas.w psi/tasdrive.c psi/tasinit.c psi/tasscan.c psi/tasu.h psi/tasutil.c psi/tdchm.c psi/tdchm.h psi/tecsdriv.c psi/tecsdriv.h psi/velodorn.c psi/velodorn.h psi/velodorn.w psi/velodornier.c psi/hardsup/README psi/hardsup/StrMatch.c psi/hardsup/asynsrv_def.h psi/hardsup/asynsrv_errcodes.h psi/hardsup/asynsrv_mark.c psi/hardsup/asynsrv_utility.c psi/hardsup/c_interfaces.c psi/hardsup/dillutil.c psi/hardsup/dillutil.h psi/hardsup/el734_def.h psi/hardsup/el734_errcodes.h psi/hardsup/el734_utility.c psi/hardsup/el734fix.h psi/hardsup/el734tcl.c psi/hardsup/el737_def.h psi/hardsup/el737_errcodes.h psi/hardsup/el737_utility.c psi/hardsup/el737fix.h psi/hardsup/el737tcl.c psi/hardsup/el755_def.h psi/hardsup/el755_errcodes.h psi/hardsup/el755_errorlog.c psi/hardsup/el755_utility.c psi/hardsup/err.c psi/hardsup/failinet.c psi/hardsup/geterrno.c psi/hardsup/itc4util.c psi/hardsup/itc4util.h psi/hardsup/make_gen psi/hardsup/makefile_alpha psi/hardsup/makefile_linux psi/hardsup/makeprint.c psi/hardsup/rs232c_def.h psi/hardsup/serialsinq.c psi/hardsup/serialsinq.h psi/hardsup/sinq_defs.h psi/hardsup/sinq_prototypes.h psi/hardsup/sinqhm.c psi/hardsup/sinqhm.h psi/hardsup/sinqhm_def.h psi/hardsup/stredit.c psi/hardsup/strjoin.c psi/hardsup/table.c psi/hardsup/table.h psi/hardsup/velsel_def.h psi/hardsup/velsel_utility.c psi/motor/Makefile psi/motor/el734_test psi/motor/el734_test.c psi/motor/makeprint.c psi/sinqhm/FOCUS_gbl.h psi/sinqhm/FOCUS_srv_main.c psi/sinqhm/Makefile psi/sinqhm/SinqHM_bootParamsConfig.c psi/sinqhm/SinqHM_bootUtil.c psi/sinqhm/SinqHM_def.h psi/sinqhm/SinqHM_gbl.h psi/sinqhm/SinqHM_srv_filler.c psi/sinqhm/SinqHM_srv_main.c psi/sinqhm/SinqHM_srv_routines.c psi/sinqhm/SinqHM_srv_server.c psi/sinqhm/bld psi/sinqhm/bld2 psi/sinqhm/bldmen psi/sinqhm/hist_mem_notes.tex psi/sinqhm/hist_mem_spec.tex psi/sinqhm/hist_mem_spec_fig1.ps psi/sinqhm/hist_mem_spec_fig2.ps psi/sinqhm/hist_mem_spec_fig3.ps psi/sinqhm/hist_mem_spec_fig4.ps psi/sinqhm/lwl_client.c psi/sinqhm/lwl_server.c psi/sinqhm/make_sinqhm.com psi/sinqhm/monitor.c psi/sinqhm/psi_logo.ps psi/sinqhm/sinq_logo.ps psi/sinqhm/sinqhm_bootutil_client.c psi/sinqhm/sinqhm_client.c psi/sinqhm/sinqhm_ctrl.c psi/sinqhm/usrConfig.c psi/sinqhm/usrConfig.c_diffs psi/sinqhm/usrConfig2604.c psi/sinqhm/vmio10_def.h psi/sinqhm/vmio_utility.c psi/tecs/coc_client.c psi/tecs/coc_client.h psi/tecs/coc_logfile.c psi/tecs/coc_logfile.h psi/tecs/coc_server.c psi/tecs/coc_server.h psi/tecs/coc_util.c psi/tecs/coc_util.h psi/tecs/fortify1.c psi/tecs/instr_hosts.c psi/tecs/instr_hosts.h psi/tecs/keep_running.c psi/tecs/make_gen psi/tecs/make_opt psi/tecs/make_opt_alpha psi/tecs/make_opt_llc psi/tecs/makefile psi/tecs/makefile_alpha psi/tecs/makefile_linux psi/tecs/myc_buf.c psi/tecs/myc_buf.h psi/tecs/myc_err.c psi/tecs/myc_err.h psi/tecs/myc_fortran.h psi/tecs/myc_mem.h psi/tecs/myc_str.c psi/tecs/myc_str.h psi/tecs/myc_time.c psi/tecs/myc_time.h psi/tecs/myc_tmp.c psi/tecs/myc_tmp.h psi/tecs/rstart.c psi/tecs/six.c psi/tecs/str.f psi/tecs/sys_cmdpar.f psi/tecs/sys_date.f psi/tecs/sys_env.c psi/tecs/sys_get_key.f psi/tecs/sys_getenv.f psi/tecs/sys_lun.f psi/tecs/sys_open.f psi/tecs/sys_open_alpha.f psi/tecs/sys_rdline.c psi/tecs/sys_select.c psi/tecs/sys_select.h psi/tecs/sys_unix.c psi/tecs/sys_wait.f psi/tecs/tecs.bld psi/tecs/tecs.c psi/tecs/tecs.tcl psi/tecs/tecs_c.c psi/tecs/tecs_c.h psi/tecs/tecs_cli.c psi/tecs/tecs_cli.h psi/tecs/tecs_client.f psi/tecs/tecs_data.c psi/tecs/tecs_data.h psi/tecs/tecs_dlog.inc psi/tecs/tecs_for.f psi/tecs/tecs_lsc.c psi/tecs/tecs_lsc.h psi/tecs/tecs_plot.f psi/tecs/tecs_serial.c psi/tecs/tecs_serial.h psi/tecs/term.c psi/tecs/term.h psi/utils/Makefile psi/utils/SerPortServer.c psi/utils/asynsrv_test.c psi/utils/ecb-load.c psi/utils/el734.c psi/utils/el734_test.c psi/utils/el737.c psi/utils/make.ecb psi/utils/check/amorcheck psi/utils/check/dmccheck psi/utils/check/focuscheck psi/utils/check/focusstatus.tcl psi/utils/check/hrptcheck psi/utils/check/sanscheck psi/utils/check/sicssyntax.tex psi/utils/check/sicssyntaxlib.tcl psi/utils/check/test.tcl psi/utils/check/topsicheck psi/utils/check/tricscheck psi/utils/check/tst
360 lines
8.8 KiB
C
360 lines
8.8 KiB
C
/*--------------------------------------------------------------------------
|
|
|
|
S I M C O U N T E R
|
|
|
|
As the Schluempfe fail to provide proper complete instruments for
|
|
testing, we need a simulated counter. This is implemented here.
|
|
|
|
|
|
Mark Koennecke, January 1997
|
|
|
|
Copyright:
|
|
|
|
Labor fuer Neutronenstreuung
|
|
Paul Scherrer Institut
|
|
CH-5423 Villigen-PSI
|
|
|
|
|
|
The authors hereby grant permission to use, copy, modify, distribute,
|
|
and license this software and its documentation for any purpose, provided
|
|
that existing copyright notices are retained in all copies and that this
|
|
notice is included verbatim in any distributions. No written agreement,
|
|
license, or royalty fee is required for any of the authorized uses.
|
|
Modifications to this software may be copyrighted by their authors
|
|
and need not follow the licensing terms described here, provided that
|
|
the new terms are clearly indicated on the first page of each file where
|
|
they apply.
|
|
|
|
IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
|
|
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
|
|
ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
|
|
DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
|
|
POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
|
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
|
|
IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
|
|
NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
|
|
MODIFICATIONS.
|
|
----------------------------------------------------------------------------*/
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
#include <math.h>
|
|
#include <time.h>
|
|
#include "fortify.h"
|
|
#include <string.h>
|
|
#include "sics.h"
|
|
#include "countdriv.h"
|
|
/*---------------------------------------------------------------------------
|
|
A SIMCOUNTER HAS a BUILT IN FAILURE RATE OF 10% FOR TESTING ERROR HANDLING
|
|
CODE. A negative failure rate means absolute success.
|
|
*/
|
|
static float FAILRATE;
|
|
/*----------------------------------------------------------------------------*/
|
|
static float SimRandom(void)
|
|
{
|
|
float fVal;
|
|
|
|
fVal = ( (float) rand() / (float)RAND_MAX) * 100.0;
|
|
return fVal;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
typedef struct {
|
|
long lEnd;
|
|
int iPause;
|
|
long tStart;
|
|
} SimSt;
|
|
/*---------------------------------------------------------------------------*/
|
|
static int SIMGetStatus(struct __COUNTER *self, float *fControl)
|
|
{
|
|
SimSt *pSim = NULL;
|
|
time_t tD, tDe;
|
|
int iRun;
|
|
|
|
assert(self);
|
|
pSim = (SimSt *)self->pData;
|
|
assert(pSim);
|
|
|
|
/*
|
|
no fail, no wait case
|
|
*/
|
|
if(FAILRATE < .0)
|
|
{
|
|
return HWIdle;
|
|
}
|
|
|
|
if(SimRandom() < FAILRATE)
|
|
{
|
|
return HWFault;
|
|
}
|
|
|
|
/* calculate time */
|
|
self->fTime = (long)time(NULL) - pSim->tStart;
|
|
|
|
iRun = 1;
|
|
if(self->eMode == eTimer)
|
|
{
|
|
if((long)time(&tD) > pSim->lEnd)
|
|
{
|
|
iRun = 0;
|
|
}
|
|
tDe = pSim->lEnd - tD;
|
|
*fControl = (float)tDe;
|
|
|
|
}
|
|
else
|
|
{
|
|
pSim->lEnd += SimRandom();
|
|
if(pSim->lEnd > (long)self->fPreset)
|
|
{
|
|
iRun = 0;
|
|
}
|
|
*fControl = (float)pSim->lEnd;
|
|
}
|
|
if(iRun)
|
|
{
|
|
return HWBusy;
|
|
}
|
|
else
|
|
{
|
|
if(pSim->iPause == 1)
|
|
{
|
|
return HWPause;
|
|
}
|
|
return HWIdle;
|
|
}
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
static int SIMStart(struct __COUNTER *self)
|
|
{
|
|
SimSt *pSim = NULL;
|
|
time_t tD;
|
|
int iRun;
|
|
|
|
assert(self);
|
|
pSim = (SimSt *)self->pData;
|
|
assert(pSim);
|
|
|
|
pSim->iPause = 0;
|
|
pSim->tStart = time(NULL);
|
|
if(self->eMode == eTimer)
|
|
{
|
|
pSim->lEnd = (long)time(&tD) + (long)self->fPreset;
|
|
}
|
|
else
|
|
{
|
|
pSim->lEnd = 0;
|
|
}
|
|
|
|
if(FAILRATE < .0)
|
|
{
|
|
return OKOK;
|
|
}
|
|
|
|
if(SimRandom() < FAILRATE)
|
|
{
|
|
return HWFault;
|
|
}
|
|
|
|
return OKOK;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
static int SIMPause(struct __COUNTER *self)
|
|
{
|
|
SimSt *pSim = NULL;
|
|
time_t tD;
|
|
int iRun;
|
|
|
|
assert(self);
|
|
pSim = (SimSt *)self->pData;
|
|
assert(pSim);
|
|
|
|
pSim->iPause = 1;
|
|
|
|
/*
|
|
no fail, no wait case
|
|
*/
|
|
if(FAILRATE < .0)
|
|
{
|
|
return OKOK;
|
|
}
|
|
|
|
if(SimRandom() < FAILRATE)
|
|
{
|
|
return HWFault;
|
|
}
|
|
|
|
return OKOK;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
static int SIMContinue(struct __COUNTER *self)
|
|
{
|
|
SimSt *pSim = NULL;
|
|
time_t tD;
|
|
int iRun;
|
|
|
|
assert(self);
|
|
pSim = (SimSt *)self->pData;
|
|
assert(pSim);
|
|
|
|
pSim->iPause = 0;
|
|
|
|
if(FAILRATE < .0)
|
|
{
|
|
return OKOK;
|
|
}
|
|
|
|
if(SimRandom() < FAILRATE)
|
|
{
|
|
return HWFault;
|
|
}
|
|
|
|
return OKOK;
|
|
}
|
|
/*--------------------------------------------------------------------------*/
|
|
static int SIMHalt(struct __COUNTER *self)
|
|
{
|
|
SimSt *pSim = NULL;
|
|
int iRun;
|
|
|
|
assert(self);
|
|
pSim = (SimSt *)self->pData;
|
|
assert(pSim);
|
|
|
|
if(FAILRATE < .0)
|
|
{
|
|
return OKOK;
|
|
}
|
|
|
|
if(SimRandom() < FAILRATE)
|
|
{
|
|
return HWFault;
|
|
}
|
|
if(self->eMode == eTimer)
|
|
{
|
|
pSim->lEnd = 0;
|
|
}
|
|
else
|
|
{
|
|
pSim->lEnd = (long)self->fPreset + 10;
|
|
}
|
|
return OKOK;
|
|
}
|
|
/*-------------------------------------------------------------------------*/
|
|
static int SIMReadValues(struct __COUNTER *self)
|
|
{
|
|
SimSt *pSim = NULL;
|
|
int i;
|
|
|
|
assert(self);
|
|
pSim = (SimSt *)self->pData;
|
|
assert(pSim);
|
|
|
|
/*
|
|
no fail, no wait case
|
|
*/
|
|
if(FAILRATE < .0)
|
|
{
|
|
for(i = 0; i < MAXCOUNT; i++)
|
|
{
|
|
self->lCounts[i] = (long)rand();
|
|
}
|
|
self->lCounts[1] = self->fPreset;
|
|
return OKOK;
|
|
}
|
|
|
|
if(SimRandom() < FAILRATE)
|
|
{
|
|
return HWFault;
|
|
}
|
|
|
|
for(i = 0; i < MAXCOUNT; i++)
|
|
{
|
|
self->lCounts[i] = (long)rand();
|
|
}
|
|
self->lCounts[1] = self->fPreset;
|
|
return OKOK;
|
|
}
|
|
/*-------------------------------------------------------------------------*/
|
|
static int SIMGetError(struct __COUNTER *self, int *iCode, char *error,
|
|
int iErrLen)
|
|
{
|
|
strncpy(error,"Randomly simulated counter error",iErrLen);
|
|
*iCode = 1;
|
|
return 1;
|
|
}
|
|
/*--------------------------------------------------------------------------*/
|
|
static int SIMTryAndFixIt(struct __COUNTER *self, int iCode)
|
|
{
|
|
if(SimRandom() < FAILRATE)
|
|
{
|
|
return COTERM;
|
|
}
|
|
return COREDO;
|
|
}
|
|
/*--------------------------------------------------------------------------*/
|
|
static int SIMSet(struct __COUNTER *self, char *name, int iCter, float FVal)
|
|
{
|
|
return 1;
|
|
}
|
|
/*--------------------------------------------------------------------------*/
|
|
static int SIMGet(struct __COUNTER *self, char *name, int iCter, float *fVal)
|
|
{
|
|
*fVal = 25.999;
|
|
return 1;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
static int SIMSend(struct __COUNTER *self, char *pText,
|
|
char *pReply, int iReplyLen)
|
|
{
|
|
strncpy(pReply,"Simulated response",iReplyLen);
|
|
return 1;
|
|
}
|
|
/*---------------------------------------------------------------------------*/
|
|
pCounterDriver NewSIMCounter(char *name, float fFail)
|
|
{
|
|
pCounterDriver pRes = NULL;
|
|
SimSt *pData = NULL;
|
|
int iRet;
|
|
int iC1, iC2, iC3;
|
|
char *pErr;
|
|
char pBueffel[132];
|
|
|
|
pRes = CreateCounterDriver(name, "SIM");
|
|
if(!pRes)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
pData = (SimSt *)malloc(sizeof(SimSt));
|
|
if(!pData)
|
|
{
|
|
DeleteCounterDriver(pRes);
|
|
return NULL;
|
|
}
|
|
pData->lEnd = 0;
|
|
pData->iPause = 0;
|
|
pRes->pData = (void *)pData;
|
|
pRes->iNoOfMonitors = 2;
|
|
pRes->fTime = 0;
|
|
|
|
/* assign functions */
|
|
pRes->GetStatus = SIMGetStatus;
|
|
pRes->Start = SIMStart;
|
|
pRes->Halt = SIMHalt;
|
|
pRes->ReadValues = SIMReadValues;
|
|
pRes->GetError = SIMGetError;
|
|
pRes->TryAndFixIt = SIMTryAndFixIt;
|
|
pRes->Pause = SIMPause;
|
|
pRes->Continue = SIMContinue;
|
|
pRes->Set = SIMSet;
|
|
pRes->Get = SIMGet;
|
|
pRes->Send = SIMSend;
|
|
pRes->KillPrivate = NULL;
|
|
|
|
FAILRATE = fFail;
|
|
return pRes;
|
|
}
|
|
|