Files
sics/serialwait.c
cvs e3cd728ecb - Rearranged directory structure for forking out ANSTO
- 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
2003-06-20 10:17:44 +00:00

244 lines
6.3 KiB
C

/*--------------------------------------------------------------------------
S E R I A L W A I T
wait for an command to execute in a serial device by polling with
null messages in SICS.
copyright: see copyright.h
Mark Koennecke, June 1998
This code is defunct and not used at the time being. It is left in the
source tree for documentation purposes. Mark Koennecke, June 2003
---------------------------------------------------------------------------*/
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
#include "fortify.h"
#include "serialwait.h"
#include "dynstring.h"
/*
#define SDEBUG 1
*/
/*--------------- The wait data structure --------------------------------*/
typedef struct {
int iEnd; /* end signal flag */
int iError; /* error returns */
int iFirst; /* first call, receive only */
time_t tEnd; /* not more then a minute! */
pDynString data; /* reply data read */
void **pData; /* the serial IO data structure */
} SW, *pSW;
/*---------------- The signal function --------------------------------*/
static void SWSignal(void *pUser, int iSignal, void *pSigData)
{
pSW self = NULL;
int *iInt;
self = (pSW)pUser;
iInt = (int *)pSigData;
if(iSignal == SICSINT)
{
if(*iInt > eContinue)
{
self->iEnd = 2;
}
}
}
/*---------------------- The task function ------------------------------*/
static int SWTask(void *pData)
{
pSW self = NULL;
char pReply[1024];
int iRet, iCount;
char *pPtr;
self = (pSW)pData;
assert(self);
/* check for interrupt end */
if(self->iEnd > 0)
{
return 0;
}
/* check for timeout */
if(time(NULL) >= self->tEnd)
{
self->iError = TIMEOUT;
self->iEnd = 3;
return 0;
}
/* wait for a second */
SicsWait(1);
/* send a null command and read reply */
if(!self->iFirst)
{
iRet = SerialSend(self->pData,"");
}
else
{
self->iFirst = 0;
}
pReply[0] = '\0';
iRet = SerialReceive(self->pData,pReply,1023);
#ifdef SDEBUG
printf("Primary answer: %s\n",pReply);
#endif
if((iRet == TIMEOUT) || (iRet == SELECTFAIL) )
{
#ifdef SDEBUG
printf("Return 1 on timeout\n");
#endif
return 1;
}
else if(iRet < 0)
{
self->iError = iRet;
self->iEnd = 3;
#ifdef SDEBUG
printf("Error %d return Receive 0\n", iRet);
#endif
return 0;
}
/* is there data ? */
iCount = strlen(pReply);
if(iCount <= 0)
{
#ifdef SDEBUG
printf("No data in Reply, return 1\n");
#endif
return 1;
}
/* do we have a tmo message ? */
if(strncmp("?TMO",pReply,4) == 0)
{
/* is there additional data appended ? */
if(iCount > 4)
{
/* store what we have */
pPtr = pReply + 4;
DynStringConcat(self->data, pPtr);
/* set tmo high, read rest of reply */
SerialConfig(self->pData, 90000);
pReply[0] = '\0';
iRet = SerialWriteRead(self->pData,"",pReply,1023);
#ifdef SDEBUG
printf(" sec rep: %s\n",pReply);
#endif
if(iRet != 1)
{
self->iError = iRet;
self->iEnd = 3;
#ifdef SDEBUG
printf("return 0, on secondary read error\n");
#endif
return 0;
}
DynStringConcat(self->data,pReply);
self->iEnd = 1;
#ifdef SDEBUG
printf("Complete read on second try, return 0\n");
#endif
return 0;
}
else /* schnuuuueeeeeffffff! no data, poll again */
{
#ifdef SDEBUG
printf("Do agaian, got a TMO \n");
#endif
return 1;
}
}
else /* we obtained all the data right away */
{
DynStringConcat(self->data,pReply);
self->iEnd = 1;
#ifdef SDEBUG
printf("Return 0, received all data in one go \n");
#endif
return 0;
}
/* should not get here */
#ifdef SDEBUG
printf("Should not get here return 1\n");
#endif
return 1;
}
/*-------------------------- The actual working function ------------------*/
int SerialSicsExecute(void **pData, char *pCommand,
char *pReply, int iBufLen)
{
int iOldTmo, iRet, iResult;
long lTask;
SW control;
char *pPtr;
/* set timeout to 0 */
iOldTmo = SerialGetTmo(pData);
SerialConfig(pData,200);
/* send the command to execute */
iRet = SerialSend(pData,pCommand);
if(iRet != 1)
{
SerialConfig(pData,iOldTmo);
return iRet;
}
/* initialize task data structure */
control.iEnd = 0;
control.iError = 0;
control.iFirst = 1;
control.pData = pData;
/* do a timeout after a minute without a reply */
control.tEnd = time(NULL) + 60;
control.data = CreateDynString(1024,1024);
/* start task */
lTask = TaskRegister(pServ->pTasker,
SWTask,
SWSignal,
NULL,
&control,
1);
/* wait for it to end */
TaskWait(pServ->pTasker,lTask);
/* analyse what we have got, success first */
if(control.iEnd == 1)
{
iResult = 1;
pPtr = GetCharArray(control.data);
strncpy(pReply,pPtr,iBufLen);
}
else if(control.iEnd == 2) /* interrupted */
{
iResult = INTERRUPTED;
}
else
{
iResult = control.iError;
}
control.iEnd = 10;
/* clear up and go */
DeleteDynString(control.data);
SerialConfig(pData,iOldTmo);
return iResult;
}