Remove superfluous trailing white space from C files
This commit is contained in:
@ -34,6 +34,6 @@ main(int argc, char *argv[]) {
|
||||
}
|
||||
}
|
||||
gzclose(fp);
|
||||
if (error==0)
|
||||
if (error==0)
|
||||
printf("There were no errors.\n");
|
||||
}
|
||||
|
@ -119,7 +119,7 @@ int camdriv_out(void *me, event_t Eo) {
|
||||
}
|
||||
if (Eo.dr) {
|
||||
printf("camdriv_out: symbol=%s, output=%s\n", event_names[Eo.dr], event_signatures[Eo.dr]);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -170,7 +170,7 @@ int main(int argc, char *argv[]) {
|
||||
else if (strstr(argv[1], "help")) {
|
||||
usage(argv[0]);
|
||||
return 0;
|
||||
} else
|
||||
} else
|
||||
test = atoi(argv[1]);
|
||||
|
||||
if ((test < 1) || (test > tflag)) {
|
||||
@ -180,11 +180,11 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
|
||||
if (test & 1)
|
||||
if (test & 1)
|
||||
ret = test_camrep2sym();
|
||||
if (test & 2)
|
||||
if (test & 2)
|
||||
ret = test_trans_fn();
|
||||
if (test & 4)
|
||||
if (test & 4)
|
||||
ret = test_camdriv_event_io();
|
||||
|
||||
if (ret)
|
||||
|
@ -32,13 +32,13 @@ static void setTextSICSVar(char *VarName, char *value) {
|
||||
|
||||
/**
|
||||
* @brief Update a SICS variable with the current status
|
||||
*
|
||||
*
|
||||
* @param input, status from device
|
||||
* @param identifier, status query identifier
|
||||
*/
|
||||
void AO_istatus(int input, char *identifier) {
|
||||
int testVal;
|
||||
|
||||
|
||||
if (strcasecmp(identifier, "QKK:TI1") == 0) {
|
||||
testVal = 48 & input;
|
||||
if (testVal == 32) { // Fast shutter open
|
||||
|
@ -1,10 +1,10 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
This is a motor driver which is implemented in Tcl. This means
|
||||
this code is only a wrapper which calls Tcl functions to do the
|
||||
this code is only a wrapper which calls Tcl functions to do the
|
||||
actual work.
|
||||
|
||||
The Tcl functions to implement the interface are called with the name
|
||||
of the motor as first parameter followed by any additional parameters
|
||||
of the motor as first parameter followed by any additional parameters
|
||||
such as the position to run to for run. Functions have to return the proper
|
||||
SICS return codes for a motor driver as integer numbers.
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
This is a motor driver which is implemented in Tcl. This means
|
||||
this code is only a wrapper which calls Tcl functions to do the
|
||||
this code is only a wrapper which calls Tcl functions to do the
|
||||
actual work.
|
||||
|
||||
copyright: see file COPYRIGHT
|
||||
@ -12,7 +12,7 @@
|
||||
#include "stringdict.h"
|
||||
|
||||
typedef struct ___TclDriv {
|
||||
/* general motor driver interface
|
||||
/* general motor driver interface
|
||||
fields. REQUIRED!
|
||||
*/
|
||||
float fUpper; /* upper limit */
|
||||
|
@ -1,18 +1,18 @@
|
||||
/*
|
||||
This is a histogram memory driver for the 2005-6 version of the
|
||||
histogram memory software based on RTAI-Linux and an embedded WWW-server
|
||||
for communications. For all http work the ghttp library from the gnome
|
||||
for communications. For all http work the ghttp library from the gnome
|
||||
project is used.
|
||||
|
||||
|
||||
This HM is meant to be used in conjunction with a counter module
|
||||
chained through the hmcontrol module. No need to handle counters here
|
||||
when hmcontrol can do the chaining.
|
||||
|
||||
|
||||
copyright: see file COPYRIGHT
|
||||
|
||||
|
||||
Mark Koennecke, January 2005 (original SINQ version)
|
||||
Mark Lesha, 9 October 2006 (ANSTO version)
|
||||
|
||||
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
@ -57,7 +57,7 @@ static char devName[32] = "histmem";
|
||||
#define BADSTATUS -707
|
||||
#define BADAUTH -708
|
||||
/*=====================================================================
|
||||
our driver private data structure
|
||||
our driver private data structure
|
||||
======================================================================*/
|
||||
typedef struct {
|
||||
ghttp_request *syncRequest;
|
||||
@ -81,14 +81,14 @@ typedef struct {
|
||||
static int anstoHttpGetPrepare(pAnstoHttp self, char *request){
|
||||
char url[512];
|
||||
ghttp_status httpStatus;
|
||||
|
||||
|
||||
if(self->asyncRunning){
|
||||
while((httpStatus = ghttp_process(self->syncRequest))
|
||||
== ghttp_not_done){
|
||||
}
|
||||
self->asyncRunning = 0;
|
||||
self->asyncRunning = 0;
|
||||
}
|
||||
|
||||
|
||||
self->errorCode = 0;
|
||||
ghttp_clean(self->syncRequest);
|
||||
memset(self->hmError,0,512*sizeof(char));
|
||||
@ -153,7 +153,7 @@ static int anstoHttpGet(pAnstoHttp self, char *request){
|
||||
return 0; // MJL return here if failed
|
||||
ghttp_prepare(self->syncRequest); // MJL be sure to call ghttp_prepare before each ghttp_process
|
||||
httpStatus = ghttp_process(self->syncRequest);
|
||||
}
|
||||
}
|
||||
if(httpStatus != ghttp_done){
|
||||
strncpy(self->hmError,"Reconnect", 511);
|
||||
self->errorCode = SERVERERROR;
|
||||
@ -173,10 +173,10 @@ static int AnstoHttpConfigure(pHistDriver self, SConnection *pCon,
|
||||
int i;
|
||||
char *confData = NULL;
|
||||
ghttp_status httpStatus;
|
||||
|
||||
|
||||
pPriv = (pAnstoHttp)self->pPriv;
|
||||
assert(pPriv != NULL);
|
||||
|
||||
|
||||
/*
|
||||
* The HM computer address
|
||||
*/
|
||||
@ -187,7 +187,7 @@ static int AnstoHttpConfigure(pHistDriver self, SConnection *pCon,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* looser credentials
|
||||
*/
|
||||
if(StringDictGet(pOpt,"username",pPriv->userName, 131) != 1){
|
||||
@ -202,11 +202,11 @@ static int AnstoHttpConfigure(pHistDriver self, SConnection *pCon,
|
||||
eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* actual configuration. Check for flag INIT in
|
||||
options. We do not need to configure, if the HM has configured
|
||||
itself already. What is does, these days.
|
||||
*/
|
||||
*/
|
||||
status = StringDictGetAsNumber(pOpt,"init",&fVal);
|
||||
iInit = 0;
|
||||
if(status == 1) {
|
||||
@ -214,7 +214,7 @@ static int AnstoHttpConfigure(pHistDriver self, SConnection *pCon,
|
||||
iInit = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
actually do configure
|
||||
*/
|
||||
@ -283,16 +283,16 @@ static int AnstoHttpConfigure(pHistDriver self, SConnection *pCon,
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// MJL NOTE: Added extra init parameters here, these get committed
|
||||
// regardless of whether we are doing the first init or not
|
||||
// (i.e. will get committed even if init=1).
|
||||
// Need to do init on the histogram object (e.g. 'hm init')
|
||||
// in order to commit changed settings during operation.
|
||||
// Specifically, this is important if FAT settings need to be
|
||||
// Specifically, this is important if FAT settings need to be
|
||||
// modified during operation. To do this, the command
|
||||
// 'hm configure FAT_Xxxx vvv' needs to be performed,
|
||||
// where Xxxx is the name of the item in the FAT, and vvv is the desired value.
|
||||
@ -326,8 +326,8 @@ static int AnstoHttpConfigure(pHistDriver self, SConnection *pCon,
|
||||
}
|
||||
}
|
||||
} while(pItem);
|
||||
|
||||
return 1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*--------------------------------------------------------------------*/
|
||||
static int readStatus(pHistDriver pDriv){
|
||||
@ -335,10 +335,10 @@ static int readStatus(pHistDriver pDriv){
|
||||
char line[132];
|
||||
char name[80], value[80];
|
||||
pAnstoHttp self = NULL;
|
||||
|
||||
|
||||
self = (pAnstoHttp)pDriv->pPriv;
|
||||
assert(self != NULL);
|
||||
|
||||
|
||||
pPtr = ghttp_get_body(self->syncRequest);
|
||||
if(pPtr == NULL){
|
||||
strncpy(self->hmError,"No body in status response",131);
|
||||
@ -386,7 +386,7 @@ static int AnstoHttpStatus_Base(pHistDriver self,SConnection *pCon,int *pextrast
|
||||
int status;
|
||||
pAnstoHttp pInternal = NULL;
|
||||
static int last_known_status=HWIdle; // assume idle initially
|
||||
|
||||
|
||||
pPriv = (pAnstoHttp)self->pPriv;
|
||||
assert(pPriv != NULL);
|
||||
|
||||
@ -438,8 +438,8 @@ static int AnstoHttpStatus_Base(pHistDriver self,SConnection *pCon,int *pextrast
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
status = readStatus(self);
|
||||
if(status != 1){
|
||||
if (pextrastatus) *pextrastatus=ANSTO_HS_STATUS_INVALID;
|
||||
@ -532,7 +532,7 @@ static int AnstoHttpStatusWithRetries(pHistDriver self, int requiredstate,SConne
|
||||
// Retry after a delay if status hasn't changed yet
|
||||
// (DAE takes time to start up / shut down)
|
||||
if (retcode != HWPause && runloop) // Only wait if we're going to loop, otherwise drop out immediately
|
||||
{
|
||||
{
|
||||
long long start_time_us=get_localtime_us();
|
||||
do // make sure the yield in this loop gets called at least once
|
||||
{
|
||||
@ -557,7 +557,7 @@ static int AnstoHttpStart(pHistDriver self, SConnection *pCon){
|
||||
assert(pPriv != NULL);
|
||||
|
||||
status = anstoHttpGet(pPriv,startdaq);
|
||||
|
||||
|
||||
if(status != 1){
|
||||
return HWFault;
|
||||
}
|
||||
@ -577,14 +577,14 @@ static int AnstoHttpHalt(pHistDriver self){ // hmm, why isn't there a pCon like
|
||||
if(status != 1){
|
||||
return HWFault;
|
||||
}
|
||||
|
||||
|
||||
//TODO check statuscheck flag
|
||||
|
||||
StringDictGet(self->pOption,"statuscheck",checkstatus,20);
|
||||
StringDictGet(self->pOption,"statuscheck",checkstatus,20);
|
||||
if (strcmp(checkstatus,"true") == 0) {
|
||||
AnstoHttpStatusWithRetries(self,ANSTO_HS_STATUS_STOPPED,NULL); // no pCon available :(
|
||||
}
|
||||
|
||||
|
||||
return OKOK;
|
||||
}
|
||||
/*---------------------------------------------------------------------*/
|
||||
@ -611,9 +611,9 @@ static int AnstoHttpVeto(pHistDriver self,SConnection *pCon)
|
||||
return HWFault;
|
||||
}
|
||||
pPriv->pause = 1;
|
||||
|
||||
|
||||
AnstoHttpStatusWithRetries(self,ANSTO_HS_STATUS_PAUSED,pCon);
|
||||
|
||||
|
||||
return OKOK;
|
||||
}
|
||||
static int AnstoHttpNoVeto(pHistDriver self,SConnection *pCon)
|
||||
@ -653,9 +653,9 @@ int AnstoHttpPause(pHistDriver self,SConnection *pCon){
|
||||
/*ffr AnstoHttpVeto now provides pause()
|
||||
pPriv->pause = 1;
|
||||
*/
|
||||
|
||||
|
||||
AnstoHttpStatusWithRetries(self,ANSTO_HS_STATUS_PAUSED,pCon);
|
||||
|
||||
|
||||
return OKOK;
|
||||
}
|
||||
static int AnstoHttpPauseNoCon(pHistDriver self) {
|
||||
@ -678,7 +678,7 @@ static int AnstoHttpContinue(pHistDriver self, SConnection *pCon){
|
||||
return OKOK;
|
||||
}
|
||||
/*---------------------------------------------------------------------*/
|
||||
static int AnstoHttpError(pHistDriver self, int *code,
|
||||
static int AnstoHttpError(pHistDriver self, int *code,
|
||||
char *error, int errLen){
|
||||
pAnstoHttp pPriv = NULL;
|
||||
|
||||
@ -768,7 +768,7 @@ static int AnstoHttpGetHistogram(pHistDriver self, SConnection *pCon,
|
||||
{
|
||||
int size=((end-start)>(MAX_HTTP_REQUEST_BYTES/sizeof(int)))
|
||||
?(MAX_HTTP_REQUEST_BYTES/sizeof(int)):(end-start);
|
||||
|
||||
|
||||
// Send traditional SICS bank,start,end parameters to the server
|
||||
// bank is now ignored by the server though, and start and end
|
||||
// may be overridden by supplementary settings (see below).
|
||||
@ -794,27 +794,27 @@ static int AnstoHttpGetHistogram(pHistDriver self, SConnection *pCon,
|
||||
}
|
||||
}
|
||||
} while(pItem);
|
||||
|
||||
|
||||
// Send our request
|
||||
status = anstoHttpGet(pPriv,command);
|
||||
if(status != 1){
|
||||
return HWFault;
|
||||
}
|
||||
|
||||
|
||||
len = ghttp_get_body_len(pPriv->syncRequest);
|
||||
if(len < (int) (size*sizeof(int))){
|
||||
pPriv->errorCode = BODYSHORT;
|
||||
strncpy(pPriv->hmError,"Not enough data received from HM",511);
|
||||
return HWFault;
|
||||
}
|
||||
|
||||
|
||||
hmdata = (HistInt *)ghttp_get_body(pPriv->syncRequest);
|
||||
if(hmdata == NULL){ // MJL check ghttp_get_body for NULL return
|
||||
pPriv->errorCode = NOBODY;
|
||||
strncpy(pPriv->hmError,"No body in HM data response",511);
|
||||
return HWFault;
|
||||
}
|
||||
|
||||
|
||||
// MJL removed the ntohl, our histogram server doesn't apply htonl,
|
||||
// so the data arrives in LE format. (Would have to buffer data
|
||||
// at the server otherwise...)
|
||||
@ -836,10 +836,10 @@ static int AnstoHttpSetHistogram(pHistDriver self, SConnection *pCon,
|
||||
|
||||
pPriv = (pAnstoHttp)self->pPriv;
|
||||
assert(pPriv != NULL);
|
||||
|
||||
|
||||
pPriv->errorCode = NOTIMPLEMENTED;
|
||||
strncpy(pPriv->hmError,"Not implemented",511);
|
||||
return HWFault;
|
||||
strncpy(pPriv->hmError,"Not implemented",511);
|
||||
return HWFault;
|
||||
}
|
||||
/*---------------------------------------------------------------------*/
|
||||
static long AnstoHttpGetMonitor(pHistDriver self, int i,
|
||||
@ -874,7 +874,7 @@ static int AnstoHttpFreePrivate(pHistDriver self){
|
||||
if(pPriv == NULL){
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
if(pPriv->syncRequest != NULL){
|
||||
ghttp_request_destroy(pPriv->syncRequest);
|
||||
}
|
||||
@ -882,7 +882,7 @@ static int AnstoHttpFreePrivate(pHistDriver self){
|
||||
DeleteCallBackInterface(pPriv->pCall);
|
||||
}
|
||||
free(pPriv);
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------*/
|
||||
@ -890,12 +890,12 @@ pHistDriver CreateAnstoHttpDriver(pStringDict pOption){
|
||||
pHistDriver pNew = NULL;
|
||||
pAnstoHttp pInternal = NULL;
|
||||
pICallBack pCallNew = NULL;
|
||||
|
||||
|
||||
/* create the general driver */
|
||||
pNew = CreateHistDriver(pOption);
|
||||
if(!pNew){
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* add our options */
|
||||
StringDictAddPair(pOption,"hmaddress","http://localhost:8080");
|
||||
@ -922,7 +922,7 @@ pHistDriver CreateAnstoHttpDriver(pStringDict pOption){
|
||||
free(pInternal);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
// Save a pointer to the string dictionary internally,
|
||||
// for the use of those functions that require it and
|
||||
// don't get a pOption passed in via the argument list.
|
||||
@ -945,7 +945,7 @@ pHistDriver CreateAnstoHttpDriver(pStringDict pOption){
|
||||
pNew->FreePrivate = AnstoHttpFreePrivate;
|
||||
pNew->Pause = AnstoHttpVeto;
|
||||
pNew->Continue = AnstoHttpContinue;
|
||||
|
||||
|
||||
return pNew;
|
||||
}
|
||||
|
||||
@ -1006,7 +1006,7 @@ pHistDriver CreateAnstoHttpDriver(pStringDict pOption){
|
||||
pHistMem pNew = NULL;
|
||||
char pBueffel[512];
|
||||
int iRet;
|
||||
|
||||
|
||||
/* check no of arguments */
|
||||
if(argc < 3)
|
||||
{
|
||||
@ -1014,7 +1014,7 @@ pHistDriver CreateAnstoHttpDriver(pStringDict pOption){
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* make new HM */
|
||||
strtolower(argv[2]);
|
||||
pNew = CreateHistMemory(argv[2]);
|
||||
@ -1023,11 +1023,11 @@ pHistDriver CreateAnstoHttpDriver(pStringDict pOption){
|
||||
sprintf(pBueffel,"ERROR: failed to create Histogram Memory %s, driver %s may be invalid or no memory",
|
||||
argv[1], argv[2]);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
StringDictAddPair(pNew->pDriv->pOption,"name",argv[1]);
|
||||
|
||||
|
||||
/* install HM as command */
|
||||
iRet = AddCommand(pSics,argv[1],ANSTO_HistAction,DeleteHistMemory,(void *)pNew);
|
||||
if(!iRet)
|
||||
|
@ -1,18 +1,18 @@
|
||||
/*
|
||||
This is a histogram mmeory driver for the 2005-6 version of the
|
||||
histogram mmeory software based on RTAI-Linux and an embedded WWW-server
|
||||
for communications. For all http work the ghttp library from the gnome
|
||||
for communications. For all http work the ghttp library from the gnome
|
||||
project is used.
|
||||
|
||||
|
||||
This HM is meant to be used in conjunction with a counter module
|
||||
chained through the hmcontrol module. No need to handle counters here
|
||||
when hmcontrol can do the chaining.
|
||||
|
||||
|
||||
copyright: see file COPYRIGHT
|
||||
|
||||
|
||||
Mark Koennecke, January 2005 (original SINQ version)
|
||||
Mark Lesha, 9 October 2006 (ANSTO version)fs
|
||||
|
||||
|
||||
----------------------------------------------------------------------*/
|
||||
#ifndef ANSTOHTTP_H_
|
||||
#define ANSTOHTTP_H_
|
||||
|
@ -28,12 +28,12 @@ char *getParam(SConnection *pCon, Tcl_Interp *pTcl, char *params, char *parName,
|
||||
SCWrite(pCon,pError, eError);
|
||||
}
|
||||
return pPtr;
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Lookup named host in /etc/hosts
|
||||
* \param *pCon (r) connection object.
|
||||
* \param *hostName (r) name of host to look up
|
||||
* \return
|
||||
* \return
|
||||
* - host address on success
|
||||
* - 0 on failure
|
||||
*/
|
||||
@ -101,10 +101,10 @@ int hostNamCmd(SConnection *pCon, SicsInterp *pInter, void *pData, int argc, cha
|
||||
const char* hn;
|
||||
//int iMacro;
|
||||
char hostaddr[132];
|
||||
|
||||
|
||||
assert(pCon != NULL);
|
||||
assert(pInter != NULL);
|
||||
|
||||
|
||||
switch (argc) {
|
||||
case 2:
|
||||
hn = getHostNam(pCon, argv[1]);
|
||||
@ -114,7 +114,7 @@ int hostNamCmd(SConnection *pCon, SicsInterp *pInter, void *pData, int argc, cha
|
||||
SCWrite(pCon,"Insufficient arguments to hostNamCmd",eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//iMacro = SCinMacro(pCon);
|
||||
//SCsetMacro(pCon,0);
|
||||
SCWrite(pCon,hostaddr,eValue);
|
||||
@ -125,7 +125,7 @@ int hostNamCmd(SConnection *pCon, SicsInterp *pInter, void *pData, int argc, cha
|
||||
/** \brief Lookup named port in /etc/services
|
||||
* \param *pCon (r) connection object.
|
||||
* \param *portName (r) name of port to look up
|
||||
* \return
|
||||
* \return
|
||||
* - port number on success
|
||||
* - 0 on failure
|
||||
*/
|
||||
@ -192,10 +192,10 @@ int portNumCmd(SConnection *pCon, SicsInterp *pInter, void *pData, int argc, cha
|
||||
int pn;
|
||||
//int iMacro;
|
||||
char portNum[MAXNUMCHAR];
|
||||
|
||||
|
||||
assert(pCon != NULL);
|
||||
assert(pInter != NULL);
|
||||
|
||||
|
||||
switch (argc) {
|
||||
case 2:
|
||||
pn = getPortNum(pCon, argv[1]);
|
||||
@ -205,7 +205,7 @@ int portNumCmd(SConnection *pCon, SicsInterp *pInter, void *pData, int argc, cha
|
||||
SCWrite(pCon,"Insufficient arguments to portNumCmd",eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//iMacro = SCinMacro(pCon);
|
||||
//SCsetMacro(pCon,0);
|
||||
SCWrite(pCon,portNum,eValue);
|
||||
@ -215,5 +215,5 @@ int portNumCmd(SConnection *pCon, SicsInterp *pInter, void *pData, int argc, cha
|
||||
|
||||
int AbortBatch(SConnection *pCon, SicsInterp *pInter, void *pData, int argc, char *argv[]) {
|
||||
SCSetInterrupt(pCon,eAbortBatch);
|
||||
return TCL_ERROR;
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
@ -5,7 +5,7 @@
|
||||
#define ERRLEN 256
|
||||
#define FAILURE 0
|
||||
#define SUCCESS 1
|
||||
char *getParam(SConnection *pCon, Tcl_Interp *pTcl, char *params, char *parName, int mustHave );
|
||||
char *getParam(SConnection *pCon, Tcl_Interp *pTcl, char *params, char *parName, int mustHave );
|
||||
int hostNamCmd(SConnection *pCon, SicsInterp *pInter, void *pData, int argc, char *argv[]);
|
||||
int portNumCmd(SConnection *pCon, SicsInterp *pInter, void *pData, int argc, char *argv[]);
|
||||
int getPortNum(SConnection *pCon, char *portName);
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
@file beamstopaction.c
|
||||
@brief Proof of concept action object for Quokka beamstops.
|
||||
@brief Proof of concept action object for Quokka beamstops.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@ -84,15 +84,15 @@ int ActNm2ID(char *actnm, char *actlist[], int numact) {
|
||||
|
||||
static void *AO_GetInterface(void *pData, int iID) {
|
||||
pAction self = NULL;
|
||||
|
||||
|
||||
self = (pAction)pData;
|
||||
assert(self);
|
||||
|
||||
if(iID == DRIVEID){
|
||||
return self->pDrivInt;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int AO_Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData, int argc, char *argv[]) {
|
||||
char msg[128]="No message", output[256];
|
||||
@ -144,7 +144,7 @@ int AO_Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData, int argc, char
|
||||
}
|
||||
/* TODO allow plain output */
|
||||
switch (msgType) {
|
||||
case eValue:
|
||||
case eValue:
|
||||
sprintf(output, "%s = %s", argv[0], msg);
|
||||
SCWrite(pCon, output, eValue);
|
||||
break;
|
||||
@ -179,7 +179,7 @@ static long AO_StartAction(void *pData, SConnection *pCon, float fVal) {
|
||||
if fVal == start then
|
||||
get actionsequence which matches the actionID
|
||||
send sequence
|
||||
set currentAction = actionID, used by status
|
||||
set currentAction = actionID, used by status
|
||||
*/
|
||||
char msg[128];
|
||||
char cmd[AO_CMDLEN], reply[AO_CMDLEN];
|
||||
@ -222,14 +222,14 @@ if fVal == start then
|
||||
debugmsg(pCon, self, "Start action");
|
||||
self->fTarget = fVal;
|
||||
return OKOK;
|
||||
}
|
||||
}
|
||||
static int AO_CheckStatus(void *pData, SConnection *pCon) {
|
||||
pAction self =(pAction) pData;
|
||||
char cmd[AO_CMDLEN], reply[AO_CMDLEN]= " 0000000113 0007831721 0000000047 0000000000 0000000001\n:";
|
||||
int devStatus, sicsStatus, comStatus, limswi, cmd_len;
|
||||
int iSteps, iCounts, iFlags, iBG, iStopCode;
|
||||
char msg[128];
|
||||
|
||||
|
||||
sprintf(cmd, "MG {F10.0} _TD%c,_TP%c,_TS%c,_BG%c,_SC%c", self->cf_axis,self->cf_axis,self->cf_axis,self->cf_axis,self->cf_axis);
|
||||
debugmsg(pCon, self, cmd);
|
||||
// comStatus = 1;
|
||||
@ -272,7 +272,7 @@ cmd_len = AO_CMDLEN;
|
||||
return sicsStatus;
|
||||
}
|
||||
|
||||
/* @brief Check the device status and return the SICS status code
|
||||
/* @brief Check the device status and return the SICS status code
|
||||
*/
|
||||
static float AO_GetValue(void *pData, SConnection *pCon) {
|
||||
pAction self = (pAction) pData;
|
||||
@ -341,7 +341,7 @@ int ActionObjectFactory(SConnection *pCon, SicsInterp *pSics, void *pData, int a
|
||||
return 0;
|
||||
}
|
||||
printf("Create the %s action object on asyncqueue %s\n", argv[1], argv[2]);
|
||||
|
||||
|
||||
|
||||
pNew = AO_Create(pCon, argv[2]);
|
||||
if (pNew == NULL) {
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* A SICS counter can manage several monitors, this is the driver
|
||||
* for the beam monitor developed at ANSTO
|
||||
*
|
||||
*
|
||||
* Copyright: see file Copyright.txt
|
||||
*
|
||||
* Ferdi Franceschini July 2006
|
||||
@ -57,7 +57,7 @@ typedef struct {
|
||||
prs232 controller;
|
||||
int state;
|
||||
int errorCode;
|
||||
char *errorMsg; /**< Points to memory for error messages */
|
||||
char *errorMsg; /**< Points to memory for error messages */
|
||||
char *host;
|
||||
int iPort;
|
||||
float dummy_threshold;
|
||||
@ -135,7 +135,7 @@ static int checkConnection(pBeamMon self)
|
||||
/* no data to read, otherwise OK */
|
||||
return SUCCESS;
|
||||
}
|
||||
flog(self, "#::counter recv = %d, errno = %d:%s\n", status, errno, strerror(errno));
|
||||
flog(self, "#::counter recv = %d, errno = %d:%s\n", status, errno, strerror(errno));
|
||||
flog(self, "#::Channel Error!");
|
||||
self->errorCode = BADREAD;
|
||||
return FAILURE;
|
||||
@ -253,7 +253,7 @@ static int MonWrite(pBeamMon self, char* text) {
|
||||
|
||||
status = writeRS232(self->controller, text, (int) len);
|
||||
if (status != 1) {
|
||||
flog(self, "#::MonWrite status = %d, errno = %d\n", status, errno);
|
||||
flog(self, "#::MonWrite status = %d, errno = %d\n", status, errno);
|
||||
self->errorCode = status;
|
||||
if (status == BADSEND && errno == EPIPE)
|
||||
self->errorCode = NOTCONNECTED;
|
||||
@ -351,7 +351,7 @@ static int MonSend(CounterDriver *cntrData, char *pText, char *pReply, int iRepl
|
||||
return status;
|
||||
if ((status = MonRead(self, pReply, &iReplyLen)) == SUCCESS)
|
||||
{
|
||||
pReply[iReplyLen] = '\0';
|
||||
pReply[iReplyLen] = '\0';
|
||||
return SUCCESS;
|
||||
}
|
||||
return status;
|
||||
@ -470,7 +470,7 @@ static void MonHandleInput(CounterDriver *cntrData, BUFFER* bp) {
|
||||
* breaks input into lines terminated by <CR><LF> pairs and passes complete lines to MonHandleInput for processing.
|
||||
*
|
||||
* \param cntrData provides access to a monitor's data
|
||||
* \param timeout upper limit on time to wait for data to arrive
|
||||
* \param timeout upper limit on time to wait for data to arrive
|
||||
*/
|
||||
static void MonLookForInput(CounterDriver *cntrData, /*@unused@*/ int timeout) {
|
||||
BeamMon* self = NULL;
|
||||
@ -548,8 +548,8 @@ static int MonGetStatus(CounterDriver *cntrData, float *fControl) {
|
||||
case HWFault:
|
||||
default:
|
||||
return HWFault;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Starts counting in the current mode and with the current preset
|
||||
*
|
||||
@ -586,12 +586,12 @@ static int MonStart(CounterDriver *cntrData) {
|
||||
return FAILURE;
|
||||
}
|
||||
}
|
||||
/*@-duplicatequals@ for uint64 */
|
||||
/*@-formattype@ for uint64 */
|
||||
/*@-duplicatequals@ for uint64 */
|
||||
/*@-formattype@ for uint64 */
|
||||
(void) snprintf(str, sizeof(str), "SICS SET TERMINAL=%llu",
|
||||
(uint64) cntrData->fPreset);
|
||||
/*@+formattype@*/
|
||||
/*@+duplicatequals@*/
|
||||
/*@+formattype@*/
|
||||
/*@+duplicatequals@*/
|
||||
status = MonSendBuffer(cntrData, str, &self->buffer);
|
||||
if (status != SUCCESS || strcasecmp(self->buffer.body, "OK") != 0) {
|
||||
self->errorCode = /* TODO */ 0;
|
||||
@ -625,7 +625,7 @@ static int MonPause(CounterDriver *cntrData) {
|
||||
return SUCCESS;
|
||||
}
|
||||
return FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
/* \brief Continues a paused counting operation.
|
||||
*
|
||||
@ -646,7 +646,7 @@ static int MonContinue(CounterDriver *cntrData) {
|
||||
return SUCCESS;
|
||||
}
|
||||
return FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Cancels a counting operation. This is an emergency stop used when interrupting an operation.
|
||||
* \param *cntrData provides access to a monitor's data
|
||||
@ -666,7 +666,7 @@ static int MonHalt(CounterDriver *cntrData) {
|
||||
return SUCCESS;
|
||||
}
|
||||
return FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Reads the counter and the monitors in the lCounts array.
|
||||
*
|
||||
@ -686,10 +686,10 @@ static int MonReadValues(CounterDriver *cntrData) {
|
||||
return SUCCESS;
|
||||
}
|
||||
return FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
/* \brief Called when an error condition is reported by a counter operation.
|
||||
*
|
||||
*
|
||||
* \param *cntrData provides access to a monitor's data
|
||||
* \param *iCode error code returned to logical counter.
|
||||
* \param *error error message
|
||||
@ -707,7 +707,7 @@ static int MonGetError(CounterDriver *cntrData, int *iCode, char *error, int iEr
|
||||
}
|
||||
*iCode = self->errorCode;
|
||||
flog(self, ".::MonGetError: %d", self->errorCode);
|
||||
switch (*iCode) {
|
||||
switch (*iCode) {
|
||||
case 0:
|
||||
if (checkConnection(self) == FAILURE) {
|
||||
if (self->errorCode == NOTCONNECTED) {
|
||||
@ -749,9 +749,9 @@ static int MonGetError(CounterDriver *cntrData, int *iCode, char *error, int iEr
|
||||
self->errorMsg = strdup(error);
|
||||
self->errorCode = 0;
|
||||
return SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
/* \brief Tries to fix problem associated with iCode error reported by MonGetError.
|
||||
/* \brief Tries to fix problem associated with iCode error reported by MonGetError.
|
||||
*
|
||||
* \param *cntrData provides access to a monitor's data
|
||||
* \param *iCode error code from MonGetError.
|
||||
@ -773,8 +773,8 @@ static int MonTryAndFixIt(CounterDriver *cntrData, int iCode) {
|
||||
if (initRS232(self->controller) == 1)
|
||||
return COREDO;
|
||||
return COTERM;
|
||||
case BADREAD:
|
||||
case BADSEND:
|
||||
case BADREAD:
|
||||
case BADSEND:
|
||||
case TIMEOUT:
|
||||
case BADMEMORY: /* Won't happen if MonConnect sets the send terminator */
|
||||
case INCOMPLETE:
|
||||
@ -795,11 +795,11 @@ static int MonSet(CounterDriver *cntrData, char *name, int iCter, float fVal) {
|
||||
self = (BeamMon *) cntrData->pData;
|
||||
flog(self, ".::MonSet(%s, %d, %f)", name, iCter, fVal);
|
||||
if(strcmp(name,"threshold") == 0){
|
||||
//TODO set threshold
|
||||
//TODO set threshold
|
||||
self->dummy_threshold = fVal;
|
||||
}
|
||||
else if(strcmp(name,"debug") == 0){
|
||||
//TODO set threshold
|
||||
//TODO set threshold
|
||||
self->debug = fVal;
|
||||
}
|
||||
/* TODO*/
|
||||
@ -811,11 +811,11 @@ static int MonGet(CounterDriver *cntrData, char *name, int iCter, float *fVal) {
|
||||
|
||||
self = (BeamMon *) cntrData->pData;
|
||||
if(strcasecmp(name,"threshold") == 0){
|
||||
//TODO get threshold
|
||||
//TODO get threshold
|
||||
*fVal = self->dummy_threshold;
|
||||
}
|
||||
else if(strcasecmp(name,"debug") == 0){
|
||||
//TODO get threshold
|
||||
//TODO get threshold
|
||||
*fVal = self->debug;
|
||||
}
|
||||
/* TODO*/
|
||||
@ -903,7 +903,7 @@ static void KillMon(/*@null@*/ pCounterDriver cntrData) {
|
||||
if(!pCntDriv) {
|
||||
free(newCtr);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
pCntDriv->GetStatus = MonGetStatus;
|
||||
pCntDriv->Start = MonStart;
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Abstraction of the counter device.
|
||||
*
|
||||
*
|
||||
*/
|
||||
#include "device.h"
|
||||
#include "params.h"
|
||||
|
@ -432,7 +432,7 @@ void process_form(int n, BUFFER* bp)
|
||||
}
|
||||
state = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -440,7 +440,7 @@ void process_form(int n, BUFFER* bp)
|
||||
*
|
||||
* \param n index of socket
|
||||
*
|
||||
* Used after a command button to redirect to the display page. Uses
|
||||
* Used after a command button to redirect to the display page. Uses
|
||||
* HTTP 303 REDIRECT to get the browser to display the page.
|
||||
*/
|
||||
void put_page_refresh(int n)
|
||||
@ -493,7 +493,7 @@ void put_page_refresh(int n)
|
||||
*
|
||||
* \param n index of socket
|
||||
*
|
||||
* Used after a command button to redirect to the control form. Uses
|
||||
* Used after a command button to redirect to the control form. Uses
|
||||
* HTTP 303 REDIRECT to get the browser to display the form.
|
||||
*/
|
||||
void put_form_refresh(int n)
|
||||
|
@ -43,7 +43,7 @@ typedef struct parameter_t
|
||||
bool sync;
|
||||
/** source 0:default, 1:timebase_1, 2:timebase_2, 3:timebase_3 */
|
||||
int source;
|
||||
|
||||
|
||||
} PARAMETERS, *pPARAMETERS;
|
||||
|
||||
bool param_set(pPARAMETERS pp, char* name, char* value);
|
||||
|
@ -26,13 +26,13 @@ typedef enum terminal_mode_t
|
||||
/** unknown or uninitialised */
|
||||
term_idle = 0,
|
||||
/** telnet socket */
|
||||
term_tty,
|
||||
term_tty,
|
||||
/** web page GET */
|
||||
term_page,
|
||||
term_page,
|
||||
/** web form POST */
|
||||
term_form,
|
||||
term_form,
|
||||
/** SOAP request */
|
||||
term_soap
|
||||
term_soap
|
||||
} TERM_MODE;
|
||||
|
||||
/**
|
||||
|
@ -33,7 +33,7 @@ char* make_timestamp(const struct timeval* tv)
|
||||
|
||||
double time_diff(struct timeval* later, struct timeval* earlier)
|
||||
{
|
||||
double delta =
|
||||
double delta =
|
||||
((double) later->tv_sec - (double) earlier->tv_sec)
|
||||
+ 0.000001 * ((double) later->tv_usec - (double) earlier->tv_usec);
|
||||
return delta;
|
||||
|
@ -29,7 +29,7 @@ typedef struct buffer_t
|
||||
*
|
||||
* Makes a string version of the time for printing. Uses
|
||||
* only the time of day to produce a string in the format
|
||||
* HH:MM:SS.UUUUUU at microsecond resolution.
|
||||
* HH:MM:SS.UUUUUU at microsecond resolution.
|
||||
*
|
||||
* Uses a circular set of internal static buffers allowing
|
||||
* several calls without overwriting - useful for
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Abstraction of the counter device.
|
||||
*
|
||||
*
|
||||
*/
|
||||
#include "device.h"
|
||||
#include "params.h"
|
||||
|
@ -515,7 +515,7 @@ void process_form(int n, BUFFER* bp)
|
||||
}
|
||||
state = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -523,7 +523,7 @@ void process_form(int n, BUFFER* bp)
|
||||
*
|
||||
* \param n index of socket
|
||||
*
|
||||
* Used after a command button to redirect to the display page. Uses
|
||||
* Used after a command button to redirect to the display page. Uses
|
||||
* HTTP 303 REDIRECT to get the browser to display the page.
|
||||
*/
|
||||
void put_page_refresh(int n)
|
||||
@ -576,7 +576,7 @@ void put_page_refresh(int n)
|
||||
*
|
||||
* \param n index of socket
|
||||
*
|
||||
* Used after a command button to redirect to the control form. Uses
|
||||
* Used after a command button to redirect to the control form. Uses
|
||||
* HTTP 303 REDIRECT to get the browser to display the form.
|
||||
*/
|
||||
void put_form_refresh(int n)
|
||||
|
@ -675,11 +675,11 @@ void initMite(iBus *bus)
|
||||
physicalBar1 = bus->get(kBusAddressPhysical,kPCI_BAR1);
|
||||
|
||||
// ***** 6602/6608 specific MITE initialization *****
|
||||
// Hit the IO Window Base/Size Register 1 (IOWBSR1) in the MITE. We set the
|
||||
// Hit the IO Window Base/Size Register 1 (IOWBSR1) in the MITE. We set the
|
||||
// address, enable the window and set the size of the window:
|
||||
Bar0.write32(0xC4, (physicalBar1 & 0xffffff00L) | 0x8C);
|
||||
|
||||
// Write to the IO Window Control Register 1 (IOWCR1) to make the IO window
|
||||
// Write to the IO Window Control Register 1 (IOWCR1) to make the IO window
|
||||
// go to RAM memory space instead of the config space
|
||||
Bar0.write32(0xF4, 0);
|
||||
|
||||
@ -735,7 +735,7 @@ void initCard(pHWARE hware)
|
||||
pci->tio_2->IO_Pin_32_33_Configuration_Register.writeIO_Pin_32_Select(0); //0='input'
|
||||
pci->tio_2->IO_Pin_36_37_Configuration_Register.writeIO_Pin_36_Select(0); //0='input'
|
||||
|
||||
//Bind the first TIO to counters 0-3 on the IO connector, and
|
||||
//Bind the first TIO to counters 0-3 on the IO connector, and
|
||||
//bind the second TIO to counters 4-7
|
||||
pci->tio_1->Clock_Configuration_Register.writeCntr_Swap(0);
|
||||
pci->tio_2->Clock_Configuration_Register.writeCntr_Swap(1);
|
||||
@ -906,7 +906,7 @@ typedef struct device_private_t
|
||||
int hware_ctor(const char* device_name, pHWARE* ptr)
|
||||
{
|
||||
pHWARE hware = NULL;
|
||||
|
||||
|
||||
hware = (DEVICE_PRIVATE*) malloc(sizeof(DEVICE_PRIVATE));
|
||||
*ptr = hware;
|
||||
memset(hware, 0, sizeof(DEVICE_PRIVATE));
|
||||
|
@ -45,7 +45,7 @@ typedef struct parameter_t
|
||||
int source;
|
||||
/** filter 0:none, 1:sync_TB3, 2:5uS, 3:1uS, 4:500nS, 5:100nS, 6:25nS */
|
||||
int filter;
|
||||
|
||||
|
||||
} PARAMETERS, *pPARAMETERS;
|
||||
|
||||
bool param_set(pPARAMETERS pp, const char* name, const char* value);
|
||||
|
@ -26,13 +26,13 @@ typedef enum terminal_mode_t
|
||||
/** unknown or uninitialised */
|
||||
term_idle = 0,
|
||||
/** telnet socket */
|
||||
term_tty,
|
||||
term_tty,
|
||||
/** web page GET */
|
||||
term_page,
|
||||
term_page,
|
||||
/** web form POST */
|
||||
term_form,
|
||||
term_form,
|
||||
/** SOAP request */
|
||||
term_soap
|
||||
term_soap
|
||||
} TERM_MODE;
|
||||
|
||||
/**
|
||||
|
@ -33,7 +33,7 @@ char* make_timestamp(const struct timeval* tv)
|
||||
|
||||
double time_diff(struct timeval* later, struct timeval* earlier)
|
||||
{
|
||||
double delta =
|
||||
double delta =
|
||||
((double) later->tv_sec - (double) earlier->tv_sec)
|
||||
+ 0.000001 * ((double) later->tv_usec - (double) earlier->tv_usec);
|
||||
return delta;
|
||||
|
@ -29,7 +29,7 @@ typedef struct buffer_t
|
||||
*
|
||||
* Makes a string version of the time for printing. Uses
|
||||
* only the time of day to produce a string in the format
|
||||
* HH:MM:SS.UUUUUU at microsecond resolution.
|
||||
* HH:MM:SS.UUUUUU at microsecond resolution.
|
||||
*
|
||||
* Uses a circular set of internal static buffers allowing
|
||||
* several calls without overwriting - useful for
|
||||
|
@ -38,7 +38,7 @@
|
||||
$ @tasmad_disk:[mad.lib.sinq]sinq_olb StrMatch debug
|
||||
$
|
||||
$ define/group sinq_olb mad_lib:sinq.olb
|
||||
$ @tasmad_disk:[mad.lib.sinq]sinq_olb StrMatch
|
||||
$ @tasmad_disk:[mad.lib.sinq]sinq_olb StrMatch
|
||||
**
|
||||
** Updates:
|
||||
** 1A01 12-Nov-1999 DM. Initial version.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* @file aqp_opalstatus.c
|
||||
* @brief
|
||||
* @brief
|
||||
* Implements a simple protocol to GET reactor status using an HTTP/1.1 GET.
|
||||
* It sets the UserAgent as SICS to avoid re-directs because we don't handle them.
|
||||
* If the HTTP status is not OK then it returns the status in the data buffer.
|
||||
@ -17,7 +17,7 @@
|
||||
#endif
|
||||
#define HOST "Host: neutron.ansto.gov.au\r\n"
|
||||
|
||||
enum replystates {START, HEADER, CHKHEADEREND, MSG};
|
||||
enum replystates {START, HEADER, CHKHEADEREND, MSG};
|
||||
static pAsyncProtocol OPAL_Protocol = NULL;
|
||||
|
||||
static int OPAL_Tx(pAsyncProtocol p, pAsyncTxn txn) {
|
||||
@ -82,7 +82,7 @@ static int OPAL_Rx(pAsyncProtocol p, pAsyncTxn txn, int ch) {
|
||||
}
|
||||
break;
|
||||
case MSG:
|
||||
if (txn->inp_idx >= txn->inp_len)
|
||||
if (txn->inp_idx >= txn->inp_len)
|
||||
ret = AQU_POP_CMD;
|
||||
if (nlctr == 0 && ch != '\n')
|
||||
txn->inp_buf[txn->inp_idx++] = ch;
|
||||
|
@ -90,7 +90,7 @@
|
||||
** Routines called:
|
||||
** AsynSrv_SendSpecCmnd
|
||||
** Description:
|
||||
** AsynSrv_SendSpecCmnd is called to send the 4-byte "special"
|
||||
** AsynSrv_SendSpecCmnd is called to send the 4-byte "special"
|
||||
** command "-006" to the server to cause it to close its serial ports.
|
||||
**---------------------------------------------------------------------
|
||||
** int AsynSrv_Close (&asyn_info, force_flag)
|
||||
@ -237,7 +237,7 @@
|
||||
** Routines called:
|
||||
** Same as AsynSrv_ChanClose
|
||||
** Description:
|
||||
** AsynSrv_SendSpecCmnd is called to send the 4-byte "special"
|
||||
** AsynSrv_SendSpecCmnd is called to send the 4-byte "special"
|
||||
** command "-004" to the server to cause it to close its serial ports.
|
||||
**-------------------------------------------------------------------------
|
||||
** int AsynSrv_GetLenTerm (&asyn_info, &rcve_buff, &rply, *len, &term)
|
||||
@ -428,7 +428,7 @@
|
||||
** that the Terminal Server detected an
|
||||
** error. The reply is added to the
|
||||
** routine call stack for debug purposes.
|
||||
**
|
||||
**
|
||||
** ASYNSRV__BAD_RECV1 \ These are network errors whilst receiving
|
||||
** ASYNSRV__BAD_RECV1_PIPE > the body of the response. They are
|
||||
** ASYNSRV__BAD_RECV1_NET / equivalent to ASYNSRV__BAD_RECV,
|
||||
@ -447,7 +447,7 @@
|
||||
** awaited and read in when it arrives.
|
||||
**
|
||||
** For any of the following errors:
|
||||
** ASYNSRV__BAD_SEND (Note: ASYNSRV__BAD_SEND_LEN and
|
||||
** ASYNSRV__BAD_SEND (Note: ASYNSRV__BAD_SEND_LEN and
|
||||
** ASYNSRV__BAD_SEND_PIPE ASYNSRV__BAD_RECV_LEN and
|
||||
** ASYNSRV__BAD_SEND_NET ASYNSRV__BAD_REPLY
|
||||
** ASYNSRV__BAD_SEND_UNKN do not cause a close)
|
||||
@ -553,10 +553,10 @@
|
||||
** command which was sent.
|
||||
** Note:
|
||||
** For any of the following errors:
|
||||
** ASYNSRV__BAD_SEND
|
||||
** ASYNSRV__BAD_SEND_PIPE
|
||||
** ASYNSRV__BAD_SEND_NET
|
||||
** ASYNSRV__BAD_SEND_UNKN
|
||||
** ASYNSRV__BAD_SEND
|
||||
** ASYNSRV__BAD_SEND_PIPE
|
||||
** ASYNSRV__BAD_SEND_NET
|
||||
** ASYNSRV__BAD_SEND_UNKN
|
||||
** ASYNSRV__BAD_RECV
|
||||
** ASYNSRV__BAD_RECV_PIPE
|
||||
** ASYNSRV__BAD_RECV_NET
|
||||
@ -609,7 +609,7 @@
|
||||
** Routines called:
|
||||
** Same as AsynSrv_ChanClose
|
||||
** Description:
|
||||
** AsynSrv_SendSpecCmnd is called to send the 4-byte "special"
|
||||
** AsynSrv_SendSpecCmnd is called to send the 4-byte "special"
|
||||
** command "-005" to the server to cause it to write its trace
|
||||
** buffer to disk.
|
||||
**============================================================================*/
|
||||
@ -744,7 +744,7 @@
|
||||
}
|
||||
/*------------------------------------------------------
|
||||
** Now find the table entry for the AsynSrvOpen call.
|
||||
*/
|
||||
*/
|
||||
for (j = 0; j < AsynSrv_n_active; j++) {
|
||||
if ((AsynSrv_active[j] == asyn_info) &&
|
||||
(AsynSrv_active[j]->skt == my_skt)) {
|
||||
@ -871,7 +871,7 @@
|
||||
case '0':
|
||||
my_eot[0] = txt_ptr[0];
|
||||
break;
|
||||
default:
|
||||
default:
|
||||
AsynSrv_errcode = ASYNSRV__BAD_PAR;
|
||||
return False;
|
||||
}
|
||||
@ -941,7 +941,7 @@
|
||||
case '0':
|
||||
AsynSrv_eot[0] = txt_ptr[0];
|
||||
break;
|
||||
default:
|
||||
default:
|
||||
AsynSrv_errcode = ASYNSRV__BAD_PAR;
|
||||
return False;
|
||||
}
|
||||
@ -1336,7 +1336,7 @@
|
||||
** Set short time-out (VMS systems only)
|
||||
*/
|
||||
#ifdef __VMS
|
||||
oto_len = sizeof (old_time_out); /* Save current time-out first */
|
||||
oto_len = sizeof (old_time_out); /* Save current time-out first */
|
||||
oto_status = getsockopt (my_skt, IPPROTO_TCP, UCX$C_TCP_PROBE_IDLE,
|
||||
old_time_out, &oto_len);
|
||||
|
||||
|
@ -182,7 +182,7 @@ char *strevent(event_t E) {
|
||||
* cm = cameram model event stream
|
||||
* cd = command event stream
|
||||
* dr = driver event stream
|
||||
*
|
||||
*
|
||||
* The next state is a 3-tuple as above.
|
||||
*
|
||||
* 0 = wildcard for components of current state.
|
||||
|
@ -4,7 +4,7 @@
|
||||
* types used in the state machine.
|
||||
*
|
||||
* \Author Ferdi Franceschini February 2013
|
||||
*
|
||||
*
|
||||
* Copyright: see file Copyright.txt
|
||||
*
|
||||
* Deterministic Finite State machine transducer (Mealy)
|
||||
|
@ -171,7 +171,7 @@ static int CAM_Rx(pAsyncProtocol p, pAsyncTxn txn, int ch) {
|
||||
if (ch == '\r')
|
||||
ret = 1;
|
||||
else if (ch == '\n')
|
||||
ret = AQU_POP_CMD;
|
||||
ret = AQU_POP_CMD;
|
||||
else if (txn->inp_idx < txn->inp_len)
|
||||
txn->inp_buf[txn->inp_idx++] = ch;
|
||||
else
|
||||
@ -210,7 +210,7 @@ static int CamGetStatus(CounterDriver *cntrData, float *fControl) {
|
||||
}
|
||||
|
||||
/* \brief run_sm, call the state machine with the given input.
|
||||
* \param self, driver context including current state
|
||||
* \param self, driver context including current state
|
||||
* \param ev_sym, input event
|
||||
*/
|
||||
static void run_sm(CamObj *self, enum event_codes ev_sym) {
|
||||
@ -267,7 +267,7 @@ int sendcfg(CamObj *self) {
|
||||
/* TBD, other fields to be set
|
||||
if(self->file.updatecfg) {
|
||||
sprintf(cfgCmd, "set camera, path=%s,basename=%s,startnumber=%d,imageformat=%s,experimentdetail=%s",
|
||||
self->file.path,
|
||||
self->file.path,
|
||||
self->file.basename,
|
||||
self->file.startnumber,
|
||||
self->file.imageformat, self->file.experimentdetail);
|
||||
@ -689,7 +689,7 @@ int camdriv_out(void *me, event_t Eo) {
|
||||
event_names[Eo.dr], event_signatures[Eo.dr]);
|
||||
SICSLogWrite(logmsg, eLog);
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
static int cb_state_timer(void *ctx, int mode) {
|
||||
|
@ -1,15 +1,15 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
D I L U U T I L
|
||||
|
||||
|
||||
A few utility functions for talking to Dillution temperature controller
|
||||
CCO-510/ AVSI via the SINQ setup: TCP/IP--MAC--RS-232--DILLU.
|
||||
|
||||
This controller is weird in that way, that is accepts temperatures as
|
||||
|
||||
This controller is weird in that way, that is accepts temperatures as
|
||||
resistance values in Ohms. Therefore a translation table is required
|
||||
in order to convert from Kelvin to Ohms.
|
||||
|
||||
|
||||
Mark Koennecke, October 1997
|
||||
|
||||
|
||||
----------------------------------------------------------------------------*/
|
||||
#ifndef SINQDILLU
|
||||
#define SINQDILLU
|
||||
@ -17,7 +17,7 @@
|
||||
#include "table.h"
|
||||
|
||||
/*----------------------- ERRORCODES--------------------------------------
|
||||
Most functions return a negative error code on failure. Error codes
|
||||
Most functions return a negative error code on failure. Error codes
|
||||
defined are those defined for serialsinq plus a few additional ones:
|
||||
*/
|
||||
#define DILLU__FILENOTFOUND -710
|
||||
@ -32,14 +32,14 @@
|
||||
/*------------------------------------------------------------------------*/
|
||||
typedef struct __DILLU {
|
||||
void *pData;
|
||||
pSTable pTranstable;
|
||||
pSTable pTranstable;
|
||||
int iReadOnly;
|
||||
} DILLU;
|
||||
} DILLU;
|
||||
|
||||
typedef struct __DILLU *pDILLU;
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
int DILLU_Open(pDILLU *pData,char *pHost, int iPort, int iChannel,
|
||||
int DILLU_Open(pDILLU *pData,char *pHost, int iPort, int iChannel,
|
||||
int iMode, char *pTransFile);
|
||||
/***** creates an DILLU datastructure and opens a connection to the ITCL4
|
||||
controller. Input Parameters are:
|
||||
@ -49,44 +49,44 @@
|
||||
iMode: 1 for ReadOnly, 0 for normal mode
|
||||
pTransFile: name and path of the temperature ohms
|
||||
trnslation file.
|
||||
|
||||
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
|
||||
*/
|
||||
|
||||
*/
|
||||
|
||||
void DILLU_Close(pDILLU *pData);
|
||||
/****** close a connection to an DILLU controller and frees its
|
||||
data structure. The only parameter is a pointer to the data
|
||||
data structure. The only parameter is a pointer to the data
|
||||
structure for this controller. This pointer will be invalid after
|
||||
this call.
|
||||
*/
|
||||
*/
|
||||
|
||||
int DILLU_Config(pDILLU *pData, int iTmo);
|
||||
int DILLU_Config(pDILLU *pData, int iTmo);
|
||||
/***** configure some aspects of a DILLU temperature controller.
|
||||
The parameter are:
|
||||
- a pointer to the data structure for the controller as
|
||||
- a pointer to the data structure for the controller as
|
||||
returned by Open_DILLU
|
||||
- a value for the connection timeout
|
||||
The function returns 1 on success, a negative error code on
|
||||
The function returns 1 on success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
|
||||
|
||||
int DILLU_Send(pDILLU *pData, char *pCommand, char *pReply, int iLen);
|
||||
/******* send a the command in pCommand to the DILLU controller.
|
||||
A possible reply is returned in the buffer pReply.
|
||||
Maximum iLen characters are copied to pReply.
|
||||
The first parameter is a pointer to a DILLU data structure
|
||||
as returned by Open_DILLU.
|
||||
|
||||
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
|
||||
|
||||
int DILLU_Read(pDILLU *pData, float *fVal);
|
||||
/******
|
||||
/******
|
||||
Reads the current temperature at the controller
|
||||
|
||||
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
@ -101,8 +101,8 @@
|
||||
failure.
|
||||
*/
|
||||
|
||||
void DILLU_Error2Text(pDILLU *pData, int iCode, char *pError, int iLen);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
void DILLU_Error2Text(pDILLU *pData, int iCode, char *pError, int iLen);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
Fix file for David renaming lots of el734 error codes.
|
||||
|
||||
|
||||
Mark Koennecke, October 1998
|
||||
----------------------------------------------------------------------------*/
|
||||
#ifndef EL734FIX
|
||||
@ -9,7 +9,7 @@
|
||||
|
||||
#define EL734__BAD_HOST ASYNSRV__BAD_HOST
|
||||
#define EL734__BAD_BIND ASYNSRV__BAD_BIND
|
||||
#define EL734__BAD_SENDLEN ASYNSRV__BAD_SEND_LEN
|
||||
#define EL734__BAD_SENDLEN ASYNSRV__BAD_SEND_LEN
|
||||
#define EL734__BAD_SEND ASYNSRV__BAD_SEND
|
||||
#define EL734__BAD_SEND_PIPE ASYNSRV__BAD_SEND_PIPE
|
||||
#define EL734__BAD_SEND_UNKN ASYNSRV__BAD_SEND_UNKN
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
Fix file for David renaming lots of el734 error codes.
|
||||
|
||||
|
||||
Mark Koennecke, October 1998
|
||||
----------------------------------------------------------------------------*/
|
||||
#ifndef EL737FIX
|
||||
@ -9,7 +9,7 @@
|
||||
|
||||
#define EL737__BAD_HOST ASYNSRV__BAD_HOST
|
||||
#define EL737__BAD_BIND ASYNSRV__BAD_BIND
|
||||
#define EL737__BAD_SENDLEN ASYNSRV__BAD_SEND_LEN
|
||||
#define EL737__BAD_SENDLEN ASYNSRV__BAD_SEND_LEN
|
||||
#define EL737__BAD_SEND ASYNSRV__BAD_SEND
|
||||
#define EL737__BAD_SEND_PIPE ASYNSRV__BAD_SEND_PIPE
|
||||
#define EL737__BAD_SEND_UNKN ASYNSRV__BAD_SEND_UNKN
|
||||
@ -25,7 +25,7 @@
|
||||
#define EL737__BAD_RECV1_PIPE ASYNSRV__BAD_RECV1_PIPE
|
||||
#define EL737__BAD_RECV1_NET ASYNSRV__BAD_RECV1_NET
|
||||
#define EL737__BAD_CONNECT ASYNSRV__BAD_CONNECT
|
||||
#define EL737__BAD_ID -99995
|
||||
#define EL737__BAD_ID -99995
|
||||
#define EL737__BAD_SNTX -99991
|
||||
#define EL737__BAD_REPLY -99992
|
||||
#define EL737__BAD_ADR -99993
|
||||
|
@ -49,7 +49,7 @@
|
||||
case -29:
|
||||
strcpy(pBuffer,"EL734__BAD_PAR");
|
||||
break;
|
||||
|
||||
|
||||
case -17:
|
||||
strcpy(pBuffer,"EL734__BAD_RECV");
|
||||
break;
|
||||
@ -100,6 +100,6 @@
|
||||
break;
|
||||
default:
|
||||
strcpy(pBuffer,"Unknown EL734 error");
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1,26 +1,26 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
I T C L 4 U T I L
|
||||
|
||||
|
||||
A few utility functions for talking to a Oxford Instruments ITCL-4
|
||||
temperature controller via the SINQ setup: TCP/IP--MAC--RS-232--
|
||||
ITC-4.
|
||||
|
||||
|
||||
Mark Koennecke, Juli 1997
|
||||
|
||||
|
||||
----------------------------------------------------------------------------*/
|
||||
#ifndef SINQITCL4
|
||||
#define SINQITCL4
|
||||
|
||||
/*----------------------- ERRORCODES--------------------------------------
|
||||
Most functions return a negative error code on failure. Error codes
|
||||
Most functions return a negative error code on failure. Error codes
|
||||
defined are those defined for serialsinq plus a few additional ones:
|
||||
*/
|
||||
|
||||
#define ITC4__BADCOM -501
|
||||
#define ITC4__BADCOM -501
|
||||
/* command not recognized */
|
||||
#define ITC4__BADPAR -502
|
||||
#define ITC4__BADPAR -502
|
||||
/* bad parameter to command */
|
||||
#define ITC4__BADMALLOC -503
|
||||
#define ITC4__BADMALLOC -503
|
||||
/* error allocating memory */
|
||||
#define ITC4__BADREAD -504
|
||||
/* error analysing command string on Read */
|
||||
@ -40,7 +40,7 @@
|
||||
int iReadOnly;
|
||||
int i503; /* flag for model 503, understanding float*/
|
||||
prs232 controller;
|
||||
} ITC4;
|
||||
} ITC4;
|
||||
|
||||
typedef struct __ITC4 *pITC4;
|
||||
|
||||
@ -56,49 +56,49 @@
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
|
||||
*/
|
||||
|
||||
*/
|
||||
|
||||
void ITC4_Close(pITC4 *pData);
|
||||
/****** close a connection to an ITC4controller and frees its
|
||||
data structure. The only parameter is a pointer to the data
|
||||
data structure. The only parameter is a pointer to the data
|
||||
structure for this controller. This pointer will be invalid after
|
||||
this call.
|
||||
*/
|
||||
*/
|
||||
|
||||
int ITC4_Config(pITC4 *pData, int iTmo, int iRead,
|
||||
int ITC4_Config(pITC4 *pData, int iTmo, int iRead,
|
||||
int iControl, float fDiv, float fMult);
|
||||
/***** configure some aspects of a ITC4temperature controller.
|
||||
The parameter are:
|
||||
- a pointer to the data structure for the controller as
|
||||
- a pointer to the data structure for the controller as
|
||||
returned by OpenITCL4
|
||||
- a value for the connection timeout
|
||||
- the temperature sensor to use for reading the
|
||||
- the temperature sensor to use for reading the
|
||||
temperature.
|
||||
- the temperature sensor used by the ITC4controller
|
||||
- the temperature sensor used by the ITC4controller
|
||||
for regulating the temperature.
|
||||
- the divisor needed to calculate the real temperature
|
||||
from the sensor.
|
||||
The function returns 1 on success, a negative error code on
|
||||
from the sensor.
|
||||
The function returns 1 on success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
|
||||
|
||||
int ITC4_Send(pITC4 *pData, char *pCommand, char *pReply, int iLen);
|
||||
/******* send a the command in pCommand to the ITC4controller.
|
||||
A possible reply is returned in the buffer pReply.
|
||||
Maximum iLen characters are copied to pReply.
|
||||
The first parameter is a pointer to a ITC4data structure
|
||||
as returned by OpenITCL4.
|
||||
|
||||
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
|
||||
|
||||
int ITC4_Read(pITC4 *pData, float *fVal);
|
||||
/******* reads the current actual temperature of the sensor
|
||||
configured by ConfigITC4for reading. The value is returned
|
||||
in fVal. The first parameter is a pointer to a ITCL4
|
||||
data structure as returned by OpenITCL4.
|
||||
|
||||
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
@ -112,14 +112,14 @@
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
|
||||
|
||||
void ITC4_ErrorTxt(pITC4 *pData, int iCode, char *pError, int iLen);
|
||||
/******* translates one of the negative error ITC4error codes
|
||||
into text. Maximum iLen bytes will be copied to the
|
||||
buffer pError;
|
||||
*/
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -1,10 +1,10 @@
|
||||
/*--------------------------------------------------------------------------
|
||||
|
||||
L A K E S H O R E 3 4 0 U T I L
|
||||
|
||||
|
||||
A few utility functions for dealing with a LAKESHORE340 temperature controller
|
||||
within the SINQ setup: host -- TCP/IP -- MAC --- RS-232.
|
||||
|
||||
|
||||
Mark Koennecke, Juli 1997
|
||||
Mark Lesha, January 2006 (based on ITC4 code)
|
||||
|
||||
@ -87,7 +87,7 @@
|
||||
printf("Busy or bad response received!\n");
|
||||
return LAKESHORE340__BADREAD;
|
||||
}
|
||||
|
||||
|
||||
int LAKESHORE340_ConfigureAndQueryGen(pLAKESHORE340 self, char *command,
|
||||
char *configandqueryparameters, char *configonlyparameters,char *diagnosis)
|
||||
/* Issue a command to the Lakeshore 340, if this works, */
|
||||
@ -138,14 +138,14 @@
|
||||
printf("Response was good.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int LAKESHORE340_ConfigureAndQuery(pLAKESHORE340 self, char *command,
|
||||
char *parameters, char *diagnosis)
|
||||
/* Use for config/query transactions that don't require index parameters in the query. */
|
||||
{
|
||||
return LAKESHORE340_ConfigureAndQueryGen(self,command,"",parameters,diagnosis);
|
||||
}
|
||||
|
||||
|
||||
int LAKESHORE340_SetControl(pLAKESHORE340 self, int iControl)
|
||||
{
|
||||
/* Attempt to set the sensor used for temperature control. */
|
||||
@ -162,23 +162,23 @@
|
||||
else
|
||||
return LAKESHORE340__BADPAR;
|
||||
}
|
||||
|
||||
|
||||
int LAKESHORE340_Setup(pLAKESHORE340 self, int iControl) /* Operations common to both Open and Config functions */
|
||||
{
|
||||
int iRet;
|
||||
char pCommand[20];
|
||||
char pReply[132];
|
||||
|
||||
|
||||
/* MJL enable RS232 debugging mode. */
|
||||
//setRS232Debug(self->controller,1);
|
||||
//printf("***RS232 debug mode enabled for LAKESHORE340***\n");fflush(stdout);
|
||||
|
||||
|
||||
/* Setup the comms port (the baudrate etc. are probably just academic since */
|
||||
/* they must be correct if we have established comms, but the termination */
|
||||
/* character setting is relevant - use just \r. */
|
||||
if ((iRet=LAKESHORE340_ConfigureAndQuery(self,"COMM","3,5,2","bad comms setup"))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
/* Reset the controller to power-on state. */
|
||||
sprintf(pCommand,"*RST");
|
||||
usleep(100000); // Required to meet Lakeshore340 spec.
|
||||
@ -197,12 +197,12 @@
|
||||
/* Basically this just makes sure comms is up. */
|
||||
if ((iRet=LAKESHORE340_Check_Status(self))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
/* Check the POST status, it should be 0 and not 1. */
|
||||
sprintf(pCommand,"*TST?");
|
||||
usleep(100000); // Required to meet Lakeshore340 spec.
|
||||
if ((iRet=transactRS232(self->controller,pCommand,strlen(pCommand),pReply,79))<=0)
|
||||
return iRet;
|
||||
return iRet;
|
||||
if (strcmp(pReply,"0")!=0)
|
||||
{
|
||||
if (strcmp(pReply,"1")==0)
|
||||
@ -216,7 +216,7 @@
|
||||
return LAKESHORE340__BADREAD;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Check that the controller is a gen-new-wine Lakeshore 340 */
|
||||
/* There's also the *REV command to check the firmware revision, but */
|
||||
/* that would be going too far ;) */
|
||||
@ -229,7 +229,7 @@
|
||||
strcpy(self->pAns,pReply);
|
||||
return LAKESHORE340__NOLAKESHORE340;
|
||||
}
|
||||
|
||||
|
||||
/* Switch to remote operation - but leave the keypad unlocked */
|
||||
if ((iRet=LAKESHORE340_ConfigureAndQuery(self,"MODE","2",""))!=1)
|
||||
return iRet;
|
||||
@ -243,7 +243,7 @@
|
||||
usleep(100000); // Required to meet Lakeshore340 spec.
|
||||
if ((iRet=writeRS232(self->controller, pCommand,strlen(pCommand)))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
/* Set up the front panel display on the Lakeshore 340. */
|
||||
/* Set 2 output fields, which we will use to display the set temp */
|
||||
/* and the actual temp at the controlling sensor selected. */
|
||||
@ -251,7 +251,7 @@
|
||||
/* matches exactly and we can use LAKESHORE340_ConfigureAndQuery ;) */
|
||||
if ((iRet=LAKESHORE340_ConfigureAndQuery(self,"DISPLAY","4,060,1",""))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
/* Set up the 4 fields on the front panel display to show both sensor temps. */
|
||||
if ((iRet=LAKESHORE340_ConfigureAndQueryGen(self,"DISPFLD","1","A,1",""))!=1)
|
||||
return iRet;
|
||||
@ -261,7 +261,7 @@
|
||||
return iRet;
|
||||
if ((iRet=LAKESHORE340_ConfigureAndQueryGen(self,"DISPFLD","4","D,1",""))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
/* Set the sensor used for controlling temperature. */
|
||||
/* Sets sensor A when iControl==1 and sensor B when iControl==2. */
|
||||
if ((LAKESHORE340_SetControl(self,iControl))!=1)
|
||||
@ -275,18 +275,18 @@
|
||||
|
||||
/* Don't bother setting the controller's date & time
|
||||
(not easy to code and probably wouldn't be useful). */
|
||||
|
||||
|
||||
/* Check the LAKESHORE340 operating status one last time */
|
||||
if ((iRet=LAKESHORE340_Check_Status(self))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
return 1; /* Success */
|
||||
}
|
||||
|
||||
int LAKESHORE340_Open(pLAKESHORE340 *pData, char *pRS232, int iSensor, int iCTRL, int iMode)
|
||||
{
|
||||
pLAKESHORE340 self = NULL;
|
||||
|
||||
|
||||
self = (pLAKESHORE340)malloc(sizeof(LAKESHORE340));
|
||||
if(self == NULL)
|
||||
{
|
||||
@ -296,14 +296,14 @@
|
||||
self->iControl = iCTRL;
|
||||
self->iRead = iSensor;
|
||||
self->iReadOnly = iMode;
|
||||
|
||||
|
||||
/* The LAKESHORE340 doesn't require divisors or multipliers
|
||||
and they are always forced to 1.0 */
|
||||
self->fDiv = 1.0;
|
||||
self->fMult = 1.0;
|
||||
|
||||
|
||||
self->controller = NULL;
|
||||
|
||||
|
||||
self->controller = (prs232)FindCommandData(pServ->pSics,pRS232,
|
||||
"RS232 Controller");
|
||||
if(!self->controller){
|
||||
@ -315,35 +315,35 @@
|
||||
return LAKESHORE340_Setup(self, self->iControl);
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
void LAKESHORE340_Close(pLAKESHORE340 *pData)
|
||||
{
|
||||
pLAKESHORE340 self;
|
||||
|
||||
|
||||
self = *pData;
|
||||
if (!self)
|
||||
return; // Just in case
|
||||
|
||||
|
||||
/* Try to turn off the heater as a precaution. */
|
||||
LAKESHORE340_ConfigureAndQuery(self,"RANGE","0","");
|
||||
|
||||
|
||||
/* switch off remote operation */
|
||||
/* Not sure if this is really necessary but do it just in case */
|
||||
LAKESHORE340_ConfigureAndQuery(self,"MODE","1","");
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int LAKESHORE340_Config(pLAKESHORE340 *pData, int iTmo, int iRead, int iControl,
|
||||
int LAKESHORE340_Config(pLAKESHORE340 *pData, int iTmo, int iRead, int iControl,
|
||||
float fDiv,float fMult)
|
||||
{
|
||||
pLAKESHORE340 self;
|
||||
|
||||
|
||||
self = *pData;
|
||||
|
||||
|
||||
return LAKESHORE340_Setup(self, iControl);
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int LAKESHORE340_Send(pLAKESHORE340 *pData, char *pCommand, char *pReply, int iLen)
|
||||
{
|
||||
@ -351,7 +351,7 @@
|
||||
pLAKESHORE340 self;
|
||||
|
||||
self = *pData;
|
||||
|
||||
|
||||
/* Send command direct to the LAKESHORE340 */
|
||||
/* Because the LAKESHORE340 only provides a response for query commands (those
|
||||
ending in a '?'), just perform a write for others and not a full transaction. */
|
||||
@ -371,7 +371,7 @@
|
||||
usleep(100000); // Required to meet Lakeshore340 spec.
|
||||
iRet=transactRS232(self->controller,pCommand,commandlen,pReply,iLen);
|
||||
}
|
||||
|
||||
|
||||
/* Check the LAKESHORE340 operating status after issuing the command, if it was successful */
|
||||
if (iRet>=1)
|
||||
iRet=LAKESHORE340_Check_Status(self);
|
||||
@ -409,19 +409,19 @@
|
||||
default:
|
||||
return LAKESHORE340__BADPAR; // But shouldn't happen
|
||||
}
|
||||
|
||||
|
||||
usleep(100000); // Required to meet Lakeshore340 spec.
|
||||
if ((iRet=transactRS232(self->controller,pCommand,strlen(pCommand),pReply,79))<=0)
|
||||
return iRet;
|
||||
|
||||
|
||||
iRet = sscanf(pReply,"%g",&fRead); // KRDG returns free-format exponentiated value
|
||||
if(iRet != 1) // Not a number, probably an error response
|
||||
{
|
||||
return LAKESHORE340__BADREAD;
|
||||
}
|
||||
|
||||
|
||||
*fVal = fRead;
|
||||
|
||||
|
||||
/* Check the LAKESHORE340 operating status after the read, and return */
|
||||
iRet=LAKESHORE340_Check_Status(self);
|
||||
return iRet;
|
||||
@ -441,25 +441,25 @@
|
||||
{
|
||||
return LAKESHORE340__READONLY;
|
||||
}
|
||||
|
||||
|
||||
/* Note we are using control loop #1 only for temperature control. */
|
||||
sprintf(pCommand,"SETP 1,%1.1f",fVal);
|
||||
sprintf(pCommandRead,"SETP? 1"); // To read back and check the set value
|
||||
|
||||
|
||||
/* try three times: send, read, test, if OK return, else resend. */
|
||||
/* MJL doesn't think this is necessary... left over from itc4 */
|
||||
for(i = 0; i < 3; i++)
|
||||
{
|
||||
{
|
||||
/* send SETP command, we don't get any response so use writeRS232 */
|
||||
usleep(100000); // Required to meet Lakeshore340 spec.
|
||||
if ((iRet=writeRS232(self->controller,pCommand,strlen(pCommand)))!=1)
|
||||
return iRet;
|
||||
return iRet;
|
||||
/* read the set value again using the SETP? command */
|
||||
usleep(100000); // Required to meet Lakeshore340 spec.
|
||||
if ((iRet=transactRS232(self->controller,pCommandRead,strlen(pCommandRead),pReply,131))<=0)
|
||||
return iRet;
|
||||
printf("SETP: Response %d characters: '%s'\n",iRet,pReply);
|
||||
if(pReply[0] == '-'&&strlen(pReply)>7)
|
||||
if(pReply[0] == '-'&&strlen(pReply)>7)
|
||||
{
|
||||
strcpy(self->pAns,pReply);
|
||||
return LAKESHORE340__BADCOM;
|
||||
@ -500,7 +500,7 @@
|
||||
pLAKESHORE340 self;
|
||||
|
||||
self = *pData;
|
||||
|
||||
|
||||
switch(iCode)
|
||||
{
|
||||
case LAKESHORE340__BADCOM:
|
||||
@ -530,6 +530,6 @@
|
||||
break;
|
||||
default:
|
||||
getRS232Error(iCode, pError,iLen);
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1,27 +1,27 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
L A K E S H O R E 3 4 0 U T I L
|
||||
|
||||
|
||||
A few utility functions for talking to a Lakeshore 340
|
||||
temperature controller via the SINQ setup: TCP/IP--MAC--RS-232--
|
||||
LAKESHORE340.
|
||||
|
||||
|
||||
Mark Koennecke, Juli 1997
|
||||
Mark Lesha, January 2006 (based on ITC4 code)
|
||||
|
||||
|
||||
----------------------------------------------------------------------------*/
|
||||
#ifndef SINQLAKESHORE340
|
||||
#define SINQLAKESHORE340
|
||||
|
||||
/*----------------------- ERRORCODES--------------------------------------
|
||||
Most functions return a negative error code on failure. Error codes
|
||||
Most functions return a negative error code on failure. Error codes
|
||||
defined are those defined for serialsinq plus a few additional ones:
|
||||
*/
|
||||
|
||||
#define LAKESHORE340__BADCOM -501
|
||||
/* command not recognized */
|
||||
#define LAKESHORE340__BADPAR -502
|
||||
#define LAKESHORE340__BADPAR -502
|
||||
/* bad parameter to command */
|
||||
#define LAKESHORE340__BADMALLOC -503
|
||||
#define LAKESHORE340__BADMALLOC -503
|
||||
/* error allocating memory */
|
||||
#define LAKESHORE340__BADREAD -504
|
||||
/* error analysing command string on Read */
|
||||
@ -45,7 +45,7 @@
|
||||
float fMult;
|
||||
int iReadOnly;
|
||||
prs232 controller;
|
||||
} LAKESHORE340;
|
||||
} LAKESHORE340;
|
||||
|
||||
typedef struct __LAKESHORE340 *pLAKESHORE340;
|
||||
|
||||
@ -61,49 +61,49 @@
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
|
||||
*/
|
||||
|
||||
*/
|
||||
|
||||
void LAKESHORE340_Close(pLAKESHORE340 *pData);
|
||||
/****** close a connection to an LAKESHORE340controller and frees its
|
||||
data structure. The only parameter is a pointer to the data
|
||||
data structure. The only parameter is a pointer to the data
|
||||
structure for this controller. This pointer will be invalid after
|
||||
this call.
|
||||
*/
|
||||
*/
|
||||
|
||||
int LAKESHORE340_Config(pLAKESHORE340 *pData, int iTmo, int iRead,
|
||||
int LAKESHORE340_Config(pLAKESHORE340 *pData, int iTmo, int iRead,
|
||||
int iControl, float fDiv, float fMult);
|
||||
/***** configure some aspects of a LAKESHORE340temperature controller.
|
||||
The parameter are:
|
||||
- a pointer to the data structure for the controller as
|
||||
- a pointer to the data structure for the controller as
|
||||
returned by LAKESHORE340_Open
|
||||
- a value for the connection timeout
|
||||
- the temperature sensor to use for reading the
|
||||
- the temperature sensor to use for reading the
|
||||
temperature.
|
||||
- the temperature sensor used by the LAKESHORE340controller
|
||||
- the temperature sensor used by the LAKESHORE340controller
|
||||
for regulating the temperature.
|
||||
- the divisor needed to calculate the real temperature
|
||||
from the sensor.
|
||||
The function returns 1 on success, a negative error code on
|
||||
from the sensor.
|
||||
The function returns 1 on success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
|
||||
|
||||
int LAKESHORE340_Send(pLAKESHORE340 *pData, char *pCommand, char *pReply, int iLen);
|
||||
/******* send a the command in pCommand to the LAKESHORE340controller.
|
||||
A possible reply is returned in the buffer pReply.
|
||||
Maximum iLen characters are copied to pReply.
|
||||
The first parameter is a pointer to a LAKESHORE340data structure
|
||||
as returned by LAKESHORE340_Open.
|
||||
|
||||
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
|
||||
|
||||
int LAKESHORE340_Read(pLAKESHORE340 *pData, float *fVal);
|
||||
/******* reads the current actual temperature of the sensor
|
||||
configured by ConfigLAKESHORE340for reading. The value is returned
|
||||
in fVal. The first parameter is a pointer to a LAKESHORE340
|
||||
data structure as returned by LAKESHORE340_Open.
|
||||
|
||||
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
@ -117,14 +117,14 @@
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.pEVInterface
|
||||
*/
|
||||
|
||||
|
||||
void LAKESHORE340_ErrorTxt(pLAKESHORE340 *pData, int iCode, char *pError, int iLen);
|
||||
/******* translates one of the negative error LAKESHORE340error codes
|
||||
into text. Maximum iLen bytes will be copied to the
|
||||
buffer pError;
|
||||
*/
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -1,10 +1,10 @@
|
||||
/*--------------------------------------------------------------------------
|
||||
|
||||
L H 4 5 U T I L
|
||||
|
||||
|
||||
A few utility functions for dealing with a LH45 temperature controller
|
||||
within the SINQ setup: host -- TCP/IP -- MAC --- RS-232.
|
||||
|
||||
|
||||
Mark Koennecke, Juli 1997
|
||||
Mark Lesha, January 2006 (based on ITC4 code)
|
||||
|
||||
@ -64,7 +64,7 @@ char *ReplyStart(char *pReply)
|
||||
int iRet;
|
||||
char pCommand[20];
|
||||
char pReply[132],*pReplyStart;
|
||||
|
||||
|
||||
/* Check the status. It should read '03 REMOTE START' or possibly '03 REMOTE START,DEGASING'. */
|
||||
/* If there is any LH45 overload or other fault condition it will be detected here. */
|
||||
// printf("Checking LH45 status...");fflush(stdout);
|
||||
@ -75,17 +75,17 @@ char *ReplyStart(char *pReply)
|
||||
pReplyStart=ReplyStart(pReply);
|
||||
usleep(500000);
|
||||
if(iRet <= 0)
|
||||
{
|
||||
{
|
||||
//transactRS232(self->co/home/mrt/workspacentroller,"\nDEBUG: RS232 transaction bad.\n",28,pReply,79);
|
||||
return iRet;
|
||||
}
|
||||
}
|
||||
printf("Status is: '%s'\n",pReplyStart);fflush(stdout);
|
||||
|
||||
|
||||
int i;
|
||||
for(i=0;i<strlen(pReply);i++)
|
||||
printf("0x%02x ",((unsigned char *)pReply)[i]);
|
||||
printf("\n");
|
||||
|
||||
|
||||
if (strncmp(pReplyStart,"03 REMOTE START",15)!=0)
|
||||
{
|
||||
//transactRS232(self->controller,"\nDEBUG: RS232 response bad\n",27,pReply,79);
|
||||
@ -96,17 +96,17 @@ char *ReplyStart(char *pReply)
|
||||
//transactRS232(self->controller,"\nDEBUG: Status reply is good!\n",30,pReply,79);
|
||||
return 1; // 1 = no fault
|
||||
}
|
||||
|
||||
|
||||
int LH45_Setup(pLH45 self, int iControl) /* Operations common to both Open and Config functions */
|
||||
{
|
||||
int iRet;
|
||||
char pCommand[20];
|
||||
//char pReply[132];
|
||||
|
||||
|
||||
/* MJL enable RS232 debugging mode. */
|
||||
//setRS232Debug(self->controller,1);
|
||||
//printf("***RS232 debug mode enabled for LH45***\n");fflush(stdout);
|
||||
|
||||
|
||||
/* switch to remote operation - although don't want it to initialise */
|
||||
/* NOTE: The Julabo does not provide any response for 'out' commands,
|
||||
so we just use writeRS232 not transactRS232 for these */
|
||||
@ -116,19 +116,19 @@ char *ReplyStart(char *pReply)
|
||||
usleep(500000);
|
||||
printf("OUT_MODE_05 1 is completed \n");fflush(stdout);
|
||||
if(iRet != 1)
|
||||
{
|
||||
{
|
||||
return iRet;
|
||||
}
|
||||
}
|
||||
/* if(pReply[0] == '-') // Probably an error response
|
||||
{
|
||||
strcpy(self->pAns,pReply);
|
||||
return LH45__BADCOM;
|
||||
} */
|
||||
|
||||
|
||||
/* Check the LH45 operating status */
|
||||
if ((iRet=LH45_Check_Status(self))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
/* Set heater sensor */
|
||||
/* For the LH45 there is a choice of internal or external sensor control,
|
||||
set internal when iControl==1 and external when iControl==2 */
|
||||
@ -139,32 +139,32 @@ char *ReplyStart(char *pReply)
|
||||
if(iRet != 1)
|
||||
{
|
||||
return LH45__BADCOM;
|
||||
}
|
||||
}
|
||||
/* else if(pReply[0] == '-') // Probably an error response
|
||||
{
|
||||
strcpy(self->pAns,pReply);
|
||||
return LH45__BADCOM;
|
||||
} */
|
||||
self->iControl=iControl; // Store control sensor setting since it was assigned to the LH45 successfully
|
||||
|
||||
|
||||
/* reset timeout - currently not being used */
|
||||
/* iRet = SerialConfig(&self->pData, 10);
|
||||
if(iRet != 1)
|
||||
{
|
||||
return iRet;
|
||||
} */
|
||||
|
||||
|
||||
/* Check the LH45 operating status one last time */
|
||||
if ((iRet=LH45_Check_Status(self))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
return 1; /* Success */
|
||||
}
|
||||
|
||||
int LH45_Open(pLH45 *pData, char *pRS232, int iSensor, int iCTRL, int iMode)
|
||||
{
|
||||
pLH45 self = NULL;
|
||||
|
||||
|
||||
self = (pLH45)malloc(sizeof(LH45));
|
||||
if(self == NULL)
|
||||
{
|
||||
@ -174,14 +174,14 @@ char *ReplyStart(char *pReply)
|
||||
self->iControl = iCTRL;
|
||||
self->iRead = iSensor;
|
||||
self->iReadOnly = iMode;
|
||||
|
||||
|
||||
/* The LH45 doesn't require divisors or multipliers
|
||||
and they are always forced to 1.0 */
|
||||
self->fDiv = 1.0;
|
||||
self->fMult = 1.0;
|
||||
|
||||
|
||||
self->controller = NULL;
|
||||
|
||||
|
||||
self->controller = (prs232)FindCommandData(pServ->pSics,pRS232,
|
||||
"RS232 Controller");
|
||||
if(!self->controller){
|
||||
@ -192,7 +192,7 @@ char *ReplyStart(char *pReply)
|
||||
if(!self->iReadOnly)
|
||||
return LH45_Setup(self, self->iControl);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
void LH45_Close(pLH45 *pData)
|
||||
{
|
||||
@ -204,7 +204,7 @@ char *ReplyStart(char *pReply)
|
||||
self = *pData;
|
||||
if (!self)
|
||||
return; // Just in case
|
||||
|
||||
|
||||
/* switch off remote operation */
|
||||
/* Not sure if this is really necessary but do it just in case */
|
||||
sprintf(pCommand,"OUT_MODE_05 0");
|
||||
@ -213,19 +213,19 @@ char *ReplyStart(char *pReply)
|
||||
/* Don't bother checking the status but record any error reply */
|
||||
/* if(pReply[0] == '-') // Probably an error response
|
||||
strcpy(self->pAns,pReply); */
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int LH45_Config(pLH45 *pData, int iTmo, int iRead, int iControl,
|
||||
int LH45_Config(pLH45 *pData, int iTmo, int iRead, int iControl,
|
||||
float fDiv,float fMult)
|
||||
{
|
||||
pLH45 self;
|
||||
|
||||
|
||||
self = *pData;
|
||||
|
||||
|
||||
return LH45_Setup(self, iControl);
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int LH45_Send(pLH45 *pData, char *pCommand, char *pReply, int iLen)
|
||||
{
|
||||
@ -240,7 +240,7 @@ char *ReplyStart(char *pReply)
|
||||
{
|
||||
strcat(pCommand,"\r");
|
||||
} */
|
||||
|
||||
|
||||
/* Send command direct to the LH45 */
|
||||
/* Because the Julabo LH45 only provides a response for the 'version', 'status'
|
||||
and 'in' commands and not for the 'out' commands, just perform a write
|
||||
@ -262,8 +262,8 @@ char *ReplyStart(char *pReply)
|
||||
} while(*pReplyStart++);
|
||||
}
|
||||
if(iRet <= 0)
|
||||
return iRet;
|
||||
|
||||
return iRet;
|
||||
|
||||
/* Check the LH45 operating status after issuing the command, and return */
|
||||
iRet=LH45_Check_Status(self);
|
||||
return iRet;
|
||||
@ -294,17 +294,17 @@ char *ReplyStart(char *pReply)
|
||||
default:
|
||||
return LH45__BADPAR; // But shouldn't happen
|
||||
}
|
||||
|
||||
|
||||
iRet = transactRS232(self->controller, pCommand,strlen(pCommand),
|
||||
pReply,79);
|
||||
pReplyStart=ReplyStart(pReply);
|
||||
usleep(500000);
|
||||
|
||||
|
||||
if(iRet <= 0)
|
||||
{
|
||||
return iRet;
|
||||
}
|
||||
|
||||
|
||||
//sprintf(self->pAns,"The read value is '%s'\n and the command is: '%s' \n",pReply,pCommand);
|
||||
//return LH45__FAULT;
|
||||
if(*pReplyStart == '-' && strlen(pReplyStart)>7) // Not a number (-XXX.X\r), probably an error response
|
||||
@ -312,11 +312,11 @@ char *ReplyStart(char *pReply)
|
||||
strcpy(self->pAns,pReplyStart);
|
||||
return LH45__BADCOM;
|
||||
}
|
||||
|
||||
|
||||
iRet = sscanf(pReplyStart,"%f",&fRead);
|
||||
if (iRet == 1)
|
||||
*fVal = fRead;
|
||||
|
||||
|
||||
/* Check the LH45 operating status after the read, and return */
|
||||
iRet=LH45_Check_Status(self);
|
||||
return iRet;
|
||||
@ -336,27 +336,27 @@ char *ReplyStart(char *pReply)
|
||||
{
|
||||
return LH45__READONLY;
|
||||
}
|
||||
|
||||
|
||||
sprintf(pCommand,"OUT_SP_00 %1.1f",fVal);
|
||||
sprintf(pCommandRead,"IN_SP_00"); // To read back and check the set value
|
||||
|
||||
|
||||
/* try three times: send, read, test, if OK return, else resend. */
|
||||
for(i = 0; i < 3; i++)
|
||||
{
|
||||
/* send command, since it's an 'out' we don't get any response, so use writeRS232 */
|
||||
{
|
||||
/* send command, since it's an 'out' we don't get any response, so use writeRS232 */
|
||||
iRet = writeRS232(self->controller,pCommand,strlen(pCommand));
|
||||
usleep(500000);
|
||||
//writeRS232(self->controller,pReply,strlen(pReply)); // MJL DEBUG
|
||||
if(iRet != 1)
|
||||
{
|
||||
return iRet;
|
||||
}
|
||||
}
|
||||
/* if(pReply[0] == '-') // Probably an error response
|
||||
{
|
||||
strcpy(self->pAns,pReply);
|
||||
return LH45__BADCOM;
|
||||
} */
|
||||
|
||||
|
||||
/* read the set value again using the 'in' command */
|
||||
iRet = transactRS232(self->controller,pCommandRead,strlen(pCommandRead),pReply,131);
|
||||
pReplyStart=ReplyStart(pReply);
|
||||
@ -365,7 +365,7 @@ char *ReplyStart(char *pReply)
|
||||
if(iRet <= 0)
|
||||
{
|
||||
return iRet;
|
||||
}
|
||||
}
|
||||
if(*pReplyStart == '-'&&strlen(pReplyStart)>7) // Not a number (-XXX.X\r), probably an error response
|
||||
{
|
||||
strcpy(self->pAns,pReplyStart);
|
||||
@ -405,7 +405,7 @@ char *ReplyStart(char *pReply)
|
||||
pLH45 self;
|
||||
|
||||
self = *pData;
|
||||
|
||||
|
||||
switch(iCode)
|
||||
{
|
||||
case LH45__BADCOM:
|
||||
@ -431,6 +431,6 @@ char *ReplyStart(char *pReply)
|
||||
break;
|
||||
default:
|
||||
getRS232Error(iCode, pError,iLen);
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1,27 +1,27 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
L H 4 5 U T I L
|
||||
|
||||
|
||||
A few utility functions for talking to a Julabo LH45
|
||||
temperature controller via the SINQ setup: TCP/IP--MAC--RS-232--
|
||||
LH45.
|
||||
|
||||
|
||||
Mark Koennecke, Juli 1997
|
||||
Mark Lesha, January 2006 (based on ITC4 code)
|
||||
|
||||
|
||||
----------------------------------------------------------------------------*/
|
||||
#ifndef SINQLH45
|
||||
#define SINQLH45
|
||||
|
||||
/*----------------------- ERRORCODES--------------------------------------
|
||||
Most functions return a negative error code on failure. Error codes
|
||||
Most functions return a negative error code on failure. Error codes
|
||||
defined are those defined for serialsinq plus a few additional ones:
|
||||
*/
|
||||
|
||||
#define LH45__BADCOM -501
|
||||
#define LH45__BADCOM -501
|
||||
/* command not recognized */
|
||||
#define LH45__BADPAR -502
|
||||
#define LH45__BADPAR -502
|
||||
/* bad parameter to command */
|
||||
#define LH45__BADMALLOC -503
|
||||
#define LH45__BADMALLOC -503
|
||||
/* error allocating memory */
|
||||
#define LH45__BADREAD -504
|
||||
/* error analysing command string on Read */
|
||||
@ -45,7 +45,7 @@
|
||||
float fMult;
|
||||
int iReadOnly;
|
||||
prs232 controller;
|
||||
} LH45;
|
||||
} LH45;
|
||||
|
||||
typedef struct __LH45 *pLH45;
|
||||
|
||||
@ -61,49 +61,49 @@
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
|
||||
*/
|
||||
|
||||
*/
|
||||
|
||||
void LH45_Close(pLH45 *pData);
|
||||
/****** close a connection to an LH45controller and frees its
|
||||
data structure. The only parameter is a pointer to the data
|
||||
data structure. The only parameter is a pointer to the data
|
||||
structure for this controller. This pointer will be invalid after
|
||||
this call.
|
||||
*/
|
||||
*/
|
||||
|
||||
int LH45_Config(pLH45 *pData, int iTmo, int iRead,
|
||||
int LH45_Config(pLH45 *pData, int iTmo, int iRead,
|
||||
int iControl, float fDiv, float fMult);
|
||||
/***** configure some aspects of a LH45temperature controller.
|
||||
The parameter are:
|
||||
- a pointer to the data structure for the controller as
|
||||
- a pointer to the data structure for the controller as
|
||||
returned by LH45_Open
|
||||
- a value for the connection timeout
|
||||
- the temperature sensor to use for reading the
|
||||
- the temperature sensor to use for reading the
|
||||
temperature.
|
||||
- the temperature sensor used by the LH45controller
|
||||
- the temperature sensor used by the LH45controller
|
||||
for regulating the temperature.
|
||||
- the divisor needed to calculate the real temperature
|
||||
from the sensor.
|
||||
The function returns 1 on success, a negative error code on
|
||||
from the sensor.
|
||||
The function returns 1 on success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
|
||||
|
||||
int LH45_Send(pLH45 *pData, char *pCommand, char *pReply, int iLen);
|
||||
/******* send a the command in pCommand to the LH45controller.
|
||||
A possible reply is returned in the buffer pReply.
|
||||
Maximum iLen characters are copied to pReply.
|
||||
The first parameter is a pointer to a LH45data structure
|
||||
as returned by LH45_Open.
|
||||
|
||||
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
|
||||
|
||||
int LH45_Read(pLH45 *pData, float *fVal);
|
||||
/******* reads the current actual temperature of the sensor
|
||||
configured by ConfigLH45for reading. The value is returned
|
||||
in fVal. The first parameter is a pointer to a LH45
|
||||
data structure as returned by LH45_Open.
|
||||
|
||||
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
@ -117,14 +117,14 @@
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
|
||||
|
||||
void LH45_ErrorTxt(pLH45 *pData, int iCode, char *pError, int iLen);
|
||||
/******* translates one of the negative error LH45error codes
|
||||
into text. Maximum iLen bytes will be copied to the
|
||||
buffer pError;
|
||||
*/
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -235,7 +235,7 @@
|
||||
/* =========
|
||||
*/
|
||||
int len, i;
|
||||
|
||||
|
||||
for (i = 0; chr[i] != NIL; i++) chr[i] &= 0x7F;
|
||||
|
||||
len = strlen (chr);
|
||||
|
@ -5,16 +5,16 @@ Paul Barron, January 2008
|
||||
|
||||
RTU Modbus functions designed for use with the WEST4100 Temperature Controller.
|
||||
If another modbus device is required at ANSTO sections of this code will need
|
||||
to be modified.
|
||||
to be modified.
|
||||
|
||||
MBAP: Modbus Application Protocol Header
|
||||
PDU: Protocol Data Unit
|
||||
|
||||
|
||||
Modbus TCP Packet Format
|
||||
| MBAP | PDU |
|
||||
|Transact Identifier|Protocol Identifier|Length Field|Unit ID|Funct Code|Data|
|
||||
| 2 Bytes | 2 Bytes | 2 Bytes | 1 Byte| 1 Byte | n |
|
||||
|
||||
|
||||
Paul Barron, January 2008
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
@ -30,28 +30,28 @@ Paul Barron, January 2008
|
||||
|
||||
int ModbusTCPException(unsigned char *response);
|
||||
|
||||
int MsgGenModbusTCP(unsigned char *ModbusMsg, int ModbusMsgLength, unsigned char *TcpPacket,
|
||||
int MsgGenModbusTCP(unsigned char *ModbusMsg, int ModbusMsgLength, unsigned char *TcpPacket,
|
||||
int *TcpPacketLength)
|
||||
{
|
||||
{
|
||||
unsigned char MBAPbyte1 = 1, MBAPbyte2 = 1;
|
||||
unsigned char lengthByte1, lengthByte2;
|
||||
int index;
|
||||
|
||||
// Check if Device Address is Valid. This is based on RS485 having up to
|
||||
|
||||
// Check if Device Address is Valid. This is based on RS485 having up to
|
||||
// 32 devices, since we currently only have one device this won't be a problem.
|
||||
if ((ModbusMsg[0] > 32) || (ModbusMsg[0] < 1))
|
||||
{
|
||||
printf("Error: Modbus Address out of Range: %X\n",ModbusMsg[0]);
|
||||
return MODBUSTCP_BadDataAddress;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check if Function code is Valid
|
||||
if ((ModbusMsg[1] > 16) || (ModbusMsg[1] < 1))
|
||||
{
|
||||
printf("Error: Modbus Function Code Invalid: %X\n",ModbusMsg[1]);
|
||||
return MODBUSTCP_BadFunction;
|
||||
}
|
||||
|
||||
|
||||
// Calculate Legth Field
|
||||
// Length should never be greater than 255 but just in case.
|
||||
if ((ModbusMsgLength)>255){
|
||||
@ -60,17 +60,17 @@ int MsgGenModbusTCP(unsigned char *ModbusMsg, int ModbusMsgLength, unsigned char
|
||||
}
|
||||
else{
|
||||
lengthByte1=0;
|
||||
lengthByte2=ModbusMsgLength;
|
||||
lengthByte2=ModbusMsgLength;
|
||||
}
|
||||
|
||||
|
||||
sprintf((char *)TcpPacket,"%c%c%c%c%c%c",MBAPbyte1,MBAPbyte2,0,0,lengthByte1,lengthByte2);
|
||||
|
||||
|
||||
for(index=0;index<=ModbusMsgLength;index++)sprintf((char *)&TcpPacket[index+6],"%c",ModbusMsg[index]);
|
||||
|
||||
|
||||
*TcpPacketLength=ModbusMsgLength+6;
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
@ -78,49 +78,49 @@ int transactModbusTCP(prs232 self, unsigned char *query, int queryLength, unsign
|
||||
{
|
||||
unsigned char TCPquery[40];
|
||||
int iRet, index, TCPqueryLength;
|
||||
|
||||
|
||||
// Generate the TCP message
|
||||
iRet=MsgGenModbusTCP(query,queryLength,TCPquery,&TCPqueryLength);
|
||||
|
||||
|
||||
// Send the message and Read the reply
|
||||
memset(response,0,responseLength); // puts zeros in reply up until reply length
|
||||
if ((iRet=transactRS232(self,TCPquery,/*strlen(pCommand)*/12,response,20))<=0)
|
||||
{
|
||||
printf("Comms error!\n");
|
||||
return iRet; // Comms problem
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check that the response transact and protocol identifier are the same
|
||||
if( (strncmp((char *)TCPquery,(char *)response,3)) == 0)
|
||||
{
|
||||
{
|
||||
// Check that there is not a modbus error, see page 98 from WEST4100 User manual.
|
||||
if ( response[7] > 0x80 )
|
||||
{
|
||||
iRet=ModbusTCPException(response);
|
||||
|
||||
|
||||
return iRet;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
// Return the modbus response minus the TCP Header
|
||||
for(index=0;index<6;index++)
|
||||
response[index]=response[index+6];
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
return 1; // Success
|
||||
}
|
||||
|
||||
|
||||
return MODBUSTCP_TCPError;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
int ModbusTCPException(unsigned char *response)
|
||||
{
|
||||
{
|
||||
if(response[8] == 0x01){
|
||||
printf("Exception Code 01h: Illegal Function\n");
|
||||
printf("Exception Code 01h: Illegal Function\n");
|
||||
return MODBUSTCP_IllegalFunction;
|
||||
}else if(response[8] == 0x02){
|
||||
printf("Exception Code 02h: Illegal Data Address\n");
|
||||
@ -131,7 +131,7 @@ int ModbusTCPException(unsigned char *response)
|
||||
}else{
|
||||
printf("Error code is greater than 81h, 82h or 83h\n");
|
||||
return MODBUSTCP_UnsupportedError;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
@ -2,7 +2,7 @@
|
||||
M O D B U S T C P . H
|
||||
|
||||
Modbus functions designed for use with the WEST4100 Temperature Controller.
|
||||
|
||||
|
||||
Paul Barron, 2008
|
||||
----------------------------------------------------------------------------*/
|
||||
|
||||
@ -11,9 +11,9 @@ Paul Barron, 2008
|
||||
#include "rs232controller.h"
|
||||
|
||||
// Own Codes
|
||||
#define MODBUSTCP_BadFunction -8001
|
||||
#define MODBUSTCP_BadFunction -8001
|
||||
#define MODBUSTCP_BadDataAddress -8002
|
||||
#define MODBUSTCP_IllegalFunction -8011
|
||||
#define MODBUSTCP_IllegalFunction -8011
|
||||
#define MODBUSTCP_IllegalDataAddress -8012
|
||||
#define MODBUSTCP_IllegalDataValue -8013
|
||||
#define MODBUSTCP_UnsupportedError -8014 // Device returned a modbus error that is not 81, 82 or 83
|
||||
@ -22,7 +22,7 @@ Paul Barron, 2008
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
int transactModbusTCP(prs232 self, unsigned char *query, int queryLength, unsigned char *response, int responseLength);
|
||||
|
||||
#endif
|
||||
|
@ -128,7 +128,7 @@
|
||||
** decimal chars.
|
||||
** term 1 The terminating character which was detected at the
|
||||
** end of the reply. This will be one of the
|
||||
** characters specified in <terms>.
|
||||
** characters specified in <terms>.
|
||||
** rply <rply_len-1> The zero-terminated reply. This is effectively the
|
||||
** reply as received with the terminating character
|
||||
** replaced by '\0'.
|
||||
@ -143,7 +143,7 @@
|
||||
** decimal chars.
|
||||
** term 1 The terminating character which was detected at the
|
||||
** end of the reply. This will be one of the
|
||||
** characters specified in <terms>.
|
||||
** characters specified in <terms>.
|
||||
** rply <rply_len-1> The zero-terminated reply. This is effectively the
|
||||
** reply as received with the terminating character
|
||||
** replaced by '\0'.
|
||||
|
@ -55,7 +55,7 @@ int GalilReading(Ascon *a) {
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
switch (chr) {
|
||||
case ' ':
|
||||
return AsconStdHandler(a);
|
||||
@ -117,7 +117,7 @@ int GalilProtHandler(Ascon *a) {
|
||||
|
||||
void AddGalilProtocoll(){
|
||||
AsconProtocol *prot = NULL;
|
||||
|
||||
|
||||
prot = calloc(sizeof(AsconProtocol), 1);
|
||||
prot->name = strdup("galil");
|
||||
prot->init = AsconStdInit;
|
||||
|
@ -63,7 +63,7 @@ BYTE getHexCode(BYTE startPos, char *str){
|
||||
}
|
||||
|
||||
|
||||
/** @brief Send the Hexdecimal string with CRC
|
||||
/** @brief Send the Hexdecimal string with CRC
|
||||
*/
|
||||
int LFGenWriteStart(Ascon *a) {
|
||||
|
||||
@ -78,7 +78,7 @@ int LFGenWriteStart(Ascon *a) {
|
||||
HEAD = getHexCode(0, curText);
|
||||
LEN = getHexCode(2, curText);
|
||||
|
||||
// buffer size,
|
||||
// buffer size,
|
||||
pNewBuffer = (char *)malloc((LEN+2)*sizeof(char));
|
||||
bufInd=0;
|
||||
pNewBuffer[bufInd] = HEAD;
|
||||
@ -130,9 +130,9 @@ int LFConcatChar(pDynString self, char chr){
|
||||
char *lfChr[2];
|
||||
|
||||
BYTE lfByte = (BYTE)chr;
|
||||
sprintf(lfChr, "%02x", lfByte);
|
||||
sprintf(lfChr, "%02x", lfByte);
|
||||
DynStringConcat(self, lfChr);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -158,28 +158,28 @@ int LFGenReading(Ascon *a)
|
||||
if (HEAD==0x96) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (a->timeout > 0) {
|
||||
if (DoubleTime() - a->start > 0.05) {
|
||||
AsconError(a, "read timeout", 0);
|
||||
/* a->state = AsconTimeout; */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
ret = AsconReadChar(a->fd, &chr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// read LEN info
|
||||
ret = AsconReadChar(a->fd, &chr);
|
||||
if(ret<0) {
|
||||
AsconError(a, "AsconReadChar failed in LEN reading in LFGenReading:", 0);
|
||||
AsconError(a, "AsconReadChar failed in LEN reading in LFGenReading:", 0);
|
||||
//a->state = AsconReadDone;
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
LEN = (BYTE)chr;
|
||||
if(LEN<2) {
|
||||
if(LEN<2) {
|
||||
AsconError(a, "Reading Error from the LF AG1010 device, wrong LEN info", 0);
|
||||
a->state = AsconReadDone;
|
||||
return 0;
|
||||
@ -189,7 +189,7 @@ int LFGenReading(Ascon *a)
|
||||
int ind=0;
|
||||
lfchar[ind] = HEAD; ind++;
|
||||
lfchar[ind] = LEN; ind++;
|
||||
|
||||
|
||||
// read all other chars
|
||||
while(ind<LEN+2) {
|
||||
ret = AsconReadChar(a->fd, &chr);
|
||||
|
@ -54,11 +54,11 @@ static double ieee2double(char ieee[4]) {
|
||||
long mantissa;
|
||||
double output;
|
||||
int exponent;
|
||||
|
||||
mantissa = ((ieee[1] << 16) & 0x7FFFFF)
|
||||
|
||||
mantissa = ((ieee[1] << 16) & 0x7FFFFF)
|
||||
| ((ieee[2] << 8) & 0xFF00)
|
||||
| ((ieee[3] ) & 0xFF);
|
||||
|
||||
|
||||
exponent = (ieee[0] & 0x7F) * 2 + ((ieee[1] >> 7) & 1); /* raw exponent */
|
||||
if (exponent == 0 && mantissa == 0) {
|
||||
return 0.0;
|
||||
@ -287,7 +287,7 @@ int ModbusProtHandler(Ascon *a) {
|
||||
|
||||
void AddModbusProtocoll(){
|
||||
AsconProtocol *prot = NULL;
|
||||
|
||||
|
||||
prot = calloc(sizeof(AsconProtocol), 1);
|
||||
prot->name = strdup("modbus");
|
||||
prot->init = AsconStdInit;
|
||||
|
@ -40,12 +40,12 @@ int OrdHVPSWriteStart(Ascon *a) {
|
||||
char cmd[MAXARGLEN];
|
||||
int cmd_len, ci,cj,bi;
|
||||
char *wrBArray, ch;
|
||||
|
||||
|
||||
// strcpy(wrBArray, GetCharArray(a->wrBuffer));
|
||||
wrBArray = GetCharArray(a->wrBuffer);
|
||||
cmd_len = GetDynStringLength(a->wrBuffer);
|
||||
for (ci=2, cj=0, bi=0; ci<MAXARGS && bi<cmd_len && cj < MAXARGLEN; ci++) {
|
||||
for (cj=0; (ch = wrBArray[bi]) != ' ' && bi<cmd_len; bi++, cj++)
|
||||
for (cj=0; (ch = wrBArray[bi]) != ' ' && bi<cmd_len; bi++, cj++)
|
||||
cmdArgv[ci][cj] = ch;
|
||||
cmdArgv[ci][cj] = '\0';
|
||||
while (wrBArray[bi] == ' ' && bi < cmd_len)
|
||||
@ -63,7 +63,7 @@ int OrdHVPSWriteStart(Ascon *a) {
|
||||
// we also allow the third argument to be an explicit command/response format.
|
||||
// This is in format "<cmd>-<resp>" where the command and response fields
|
||||
// are format specifiers containing the required/expected ASCII letters
|
||||
// in the command, and the format specifiers '%s' (string),
|
||||
// in the command, and the format specifiers '%s' (string),
|
||||
// '%d' (integer 0-255), , '%B' (a board name e.g. x0-y15),
|
||||
// '%P' (a pot name e.g. x0-y191), or '%A' (ack code as 'ACK'/'NAK').
|
||||
// Formats '%c' (a character) and '%x' (char as 2 hex digits) could be
|
||||
@ -94,7 +94,7 @@ int OrdHVPSWriteStart(Ascon *a) {
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
// Prepare the command string
|
||||
// Prepare the command string
|
||||
char *pcmd=cmd;
|
||||
int nfmtspec=0;
|
||||
while(*pcmdrspfmt!='-')
|
||||
@ -120,7 +120,7 @@ int OrdHVPSWriteStart(Ascon *a) {
|
||||
{
|
||||
case 's': // probably never used
|
||||
pcmd+=sprintf(pcmd,"%s",cmdArgv[nfmtspec+2]);
|
||||
break;
|
||||
break;
|
||||
case 'd':
|
||||
sscanf(cmdArgv[nfmtspec+2],"%d",&v1);
|
||||
pcmd+=sprintf(pcmd,"%c",(char)v1);
|
||||
@ -179,7 +179,7 @@ int OrdFmtReply(char *rdBArray, int rsp_len, char *response, char *errmsg) {
|
||||
/*
|
||||
ffr If AsconStdHandler doesn't see a '\r' or '\n' and there are no more
|
||||
chars to read, it leaves state=AsconReading and the rdBuffer char array
|
||||
without a null terminator. So we assume that higher level code can tell
|
||||
without a null terminator. So we assume that higher level code can tell
|
||||
if the response is OK and set the state and terminator.
|
||||
*/
|
||||
DynStringConcatChar(a->rdBuffer, '\0');
|
||||
@ -245,7 +245,7 @@ int OrdFmtReply(char *rdBArray, int rsp_len, char *response, char *errmsg) {
|
||||
idx=0;
|
||||
idx=sprintf(errmsg,"Bad response format: ");
|
||||
for (i = 0; i < rsp_len && idx < 31; ++i) {
|
||||
if (response[i] < 32 || response[i] > 126)
|
||||
if (response[i] < 32 || response[i] > 126)
|
||||
idx+=sprintf(&errmsg[idx], "%02Xh", response[i]);
|
||||
else
|
||||
errmsg[idx++] = response[i];
|
||||
@ -267,7 +267,7 @@ int OrdHVPSReading(Ascon *a) {
|
||||
int ret, rsp_len;
|
||||
static int retries = MAXRETRY;
|
||||
char chr, errmsg[ERRMSGLEN], response[MAXARGLEN];
|
||||
|
||||
|
||||
ret = AsconReadChar(a->fd, &chr);
|
||||
if (ret > 0 && chr == NAK && retries > 0) {
|
||||
AsconReadGarbage(a->fd);
|
||||
|
@ -2,7 +2,7 @@
|
||||
@file sct_protek.c
|
||||
@brief Protocol handler for Protek 608 multimeter
|
||||
|
||||
Reads the display bitmap and generates an ASCII string similar to the
|
||||
Reads the display bitmap and generates an ASCII string similar to the
|
||||
following,
|
||||
SD3:0.|SD4:1|SD5: |DUTY2:0|HOLD2:0|RANGE2:0|ZD2:0|DC2:0|SIGN2:0|AC2:0|CONT2:0|PW1:0|X1:0|B1:1|B0:1|B16:0|B8:0|B4:0|B2:0|DC1:1|SIGN1:1|AC1:0|LOBAT:0|MD5:0.|MD4:0|MD3:0|X2:0|X3:0|PLUS:0|MINUS:0|RS232C:1|AUTOOFF:0|X4:0|PULSE:0|STORE:0|AVG:0|MINUSPEAK:0|MIN:0|RECALL:0|REL:0|PLUSPEAK:0|MAX:0|GO/NG:0|REF:0|MINUSPER:0|PLUSPER:0|MD2:0|MD1:2|s1:0|DEGF1:0|Hz1:0|X5:0|F1:0|A1:0|OHM1:0|X6:0|DEGC1:0|S1:0|V1:1|k1:0|n1:0|m1:0|u1:0|M1:0|B8K:0|B16K:0|X7:0|X8:0|B4K:0|B2K:0|B1K:0|B512:0|B32:0|B64:0|B128:0|B256:0|M2:1|G2:0|m2:0|PERCENT2:0|k2:0|OHM2:1|V2:0|dBm2:0|X9:0|Hz2:0|A2:0|DEGK2:0|SD1:0|SD2:5|ROTSWITCH:0
|
||||
|
||||
@ -461,7 +461,7 @@ int AsconProtek608Init(Ascon *a, SConnection *con, int argc, char *argv[])
|
||||
void AddProtek608Protocol()
|
||||
{
|
||||
AsconProtocol *prot = NULL;
|
||||
|
||||
|
||||
prot = calloc(sizeof(AsconProtocol), 1);
|
||||
prot->name = strdup("protek608");
|
||||
prot->init = AsconProtek608Init;
|
||||
|
@ -6,7 +6,7 @@
|
||||
"OK", when successful
|
||||
"ANSRFAMP: Set failed", on error
|
||||
|
||||
Current should be ramped up in steps of 0.5A but it doesn't
|
||||
Current should be ramped up in steps of 0.5A but it doesn't
|
||||
have to be ramped down.
|
||||
|
||||
Provides two commands (L)ist and (S)et
|
||||
@ -102,7 +102,7 @@ int RFAmpWriteStart (Ascon *a)
|
||||
AsconError(a, errMsg, 0);
|
||||
return 1;
|
||||
}
|
||||
if (address < '1' || address > '9') {
|
||||
if (address < '1' || address > '9') {
|
||||
snprintf(errMsg, ERRLEN, "ANSRFAMP: Invalid address %c, it should be between 1 and 9", address);
|
||||
a->state = AsconWriteDone;
|
||||
a->noResponse = 1;
|
||||
@ -253,12 +253,12 @@ int RFAmpReading (Ascon *a)
|
||||
GetReplyFailed = 1;
|
||||
break;
|
||||
} else {
|
||||
DynStringReplace(a->rdBuffer, "OK", 0);
|
||||
DynStringReplace(a->rdBuffer, "OK", 0);
|
||||
}
|
||||
*/
|
||||
|
||||
/* ffr Just report OK until we have a proper fix */
|
||||
DynStringReplace(a->rdBuffer, "OK", 0);
|
||||
DynStringReplace(a->rdBuffer, "OK", 0);
|
||||
|
||||
a->state = AsconReadDone;
|
||||
data->transactInProg = txNormalRead;
|
||||
|
@ -58,11 +58,11 @@ static double ieee2double(unsigned char ieee[4]) {
|
||||
long mantissa;
|
||||
double output, norm = 1;
|
||||
int exponent, bias = 127;
|
||||
|
||||
mantissa = ((ieee[1] << 16) & 0x7F0000)
|
||||
|
||||
mantissa = ((ieee[1] << 16) & 0x7F0000)
|
||||
| ((ieee[2] << 8) & 0xFF00)
|
||||
| ((ieee[3] ) & 0xFF);
|
||||
|
||||
|
||||
exponent = (ieee[0] & 0x7F) * 2 + ((ieee[1] >> 7) & 1); /* raw exponent */
|
||||
if (exponent == 255) {
|
||||
if (mantissa == 0) {
|
||||
@ -412,7 +412,7 @@ int TCPMBUtil(SConnection *pCon, SicsInterp *pSics, void *pData, int argc, char
|
||||
{"double2ieee",1,{FUPAFLOAT}},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
|
||||
Arg2Text(argc, argv, cmdLine, 511);
|
||||
iRet = EvaluateFuPa((pFuncTemplate)&CommandTemplate,iNumCmds,argc-1,&argv[1],&PaRes);
|
||||
switch(iRet) {
|
||||
@ -466,7 +466,7 @@ int TCPMBProtHandler(Ascon *a) {
|
||||
|
||||
void AddTCPMBProtocol(){
|
||||
AsconProtocol *prot = NULL;
|
||||
|
||||
|
||||
AddCommand(pServ->pSics, "fermi", TCPMBUtil, NULL, NULL);
|
||||
prot = calloc(sizeof(AsconProtocol), 1);
|
||||
prot->name = strdup("tcpmodbus");
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <ascon.h>
|
||||
#include <ascon.i>
|
||||
@ -44,7 +44,7 @@ int USBTMC_ProtHandler(Ascon *a) {
|
||||
|
||||
void AddUSBTMCProtocoll(){
|
||||
AsconProtocol *prot = NULL;
|
||||
|
||||
|
||||
prot = calloc(sizeof(AsconProtocol), 1);
|
||||
prot->name = strdup("usbtmc");
|
||||
prot->init = AsconStdInit;
|
||||
|
@ -41,7 +41,7 @@ int VelSelProtHandler(Ascon *a)
|
||||
void AddVelSelProtocol()
|
||||
{
|
||||
AsconProtocol *prot = NULL;
|
||||
|
||||
|
||||
prot = calloc(sizeof(AsconProtocol), 1);
|
||||
prot->name = strdup("astvelsel");
|
||||
prot->init = AsconStdInit;
|
||||
|
@ -1,12 +1,12 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
S E R I A L S I N Q
|
||||
Implementation file of the functions for talking with a RS--232 port
|
||||
on a SINQ terminal server. This code has been adapted from code
|
||||
provided by David Maden for the EL734 motor controller. A new version
|
||||
became necessary as the Dornier velocity selector supports a
|
||||
on a SINQ terminal server. This code has been adapted from code
|
||||
provided by David Maden for the EL734 motor controller. A new version
|
||||
became necessary as the Dornier velocity selector supports a
|
||||
completely different protocoll than the EL734. The basics, however, are
|
||||
the same.
|
||||
|
||||
|
||||
Mark Koennecke, Juli 1997
|
||||
|
||||
Copyright:
|
||||
@ -90,7 +90,7 @@
|
||||
struct RS__MsgStruct to_host;
|
||||
struct RS__RespStruct from_host;
|
||||
SerialSleep pFunc;
|
||||
void *pData;
|
||||
void *pData;
|
||||
struct AsynSrv__info sAsync;
|
||||
};
|
||||
/*------------------- The default sleep function -----------------------*/
|
||||
@ -115,9 +115,9 @@
|
||||
//struct RS__RplyStruct *rply_ptr;
|
||||
|
||||
*pData = NULL;
|
||||
|
||||
|
||||
/*
|
||||
** allocate memory first
|
||||
** allocate memory first
|
||||
*/
|
||||
*pData = malloc (sizeof (struct SerialInfo));
|
||||
if (*pData == NULL) {
|
||||
@ -138,7 +138,7 @@
|
||||
}
|
||||
|
||||
/* intialize data structures */
|
||||
StrJoin (my_info->host, sizeof (my_info->host), pHost, "");
|
||||
StrJoin (my_info->host, sizeof (my_info->host), pHost, "");
|
||||
my_info->skt = my_info->sAsync.skt;
|
||||
my_info->port = iPort;
|
||||
my_info->chan = iChannel;
|
||||
@ -176,8 +176,8 @@
|
||||
}
|
||||
my_info = *pData;
|
||||
memset(my_info,0,sizeof(struct SerialInfo));
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
**-------------------------- Set up the connection
|
||||
*/
|
||||
@ -190,7 +190,7 @@
|
||||
}
|
||||
|
||||
/* intialize data structures */
|
||||
StrJoin (my_info->host, sizeof (my_info->host), pHost, "");
|
||||
StrJoin (my_info->host, sizeof (my_info->host), pHost, "");
|
||||
my_info->skt = my_info->sAsync.skt;
|
||||
my_info->port = iPort;
|
||||
my_info->chan = iChannel;
|
||||
@ -209,10 +209,10 @@
|
||||
int SerialConfig(void **pData, int iTmo)
|
||||
{
|
||||
struct SerialInfo *my_info = NULL;
|
||||
|
||||
|
||||
my_info = (struct SerialInfo *)*pData;
|
||||
assert(my_info);
|
||||
|
||||
|
||||
if(iTmo < 100)
|
||||
{
|
||||
my_info->tmo = 1;
|
||||
@ -224,20 +224,20 @@
|
||||
if(my_info->tmo > 9999)my_info->tmo = 9999;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int GetSerialTmo(void **pData)
|
||||
{
|
||||
struct SerialInfo *my_info = NULL;
|
||||
int iTmo;
|
||||
|
||||
|
||||
my_info = (struct SerialInfo *)*pData;
|
||||
assert(my_info);
|
||||
|
||||
|
||||
iTmo = my_info->tmo*100-99; /* convert back to milli seconds */
|
||||
|
||||
return iTmo;
|
||||
}
|
||||
}
|
||||
int SerialGetTmo(void **pData)
|
||||
{
|
||||
return GetSerialTmo(pData);
|
||||
@ -247,14 +247,14 @@
|
||||
{
|
||||
struct SerialInfo *my_info = NULL;
|
||||
// int iTmo;
|
||||
|
||||
|
||||
my_info = (struct SerialInfo *)*pData;
|
||||
assert(my_info);
|
||||
|
||||
return my_info->skt;
|
||||
|
||||
return my_info->skt;
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int SerialClose(void **pData)
|
||||
{
|
||||
@ -295,14 +295,14 @@
|
||||
int SerialATerm(void **pData, char *pTerm)
|
||||
{
|
||||
struct SerialInfo *my_info = NULL;
|
||||
|
||||
|
||||
my_info = (struct SerialInfo *)*pData;
|
||||
if(my_info == NULL)
|
||||
{
|
||||
printf("Serious Programming problem: data = NULL\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* only three characters in this field */
|
||||
if(strlen(pTerm) > 4)
|
||||
{
|
||||
@ -310,39 +310,39 @@
|
||||
}
|
||||
memset(my_info->pTerms,0,4);
|
||||
strcpy(my_info->pTerms,pTerm);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int SerialAGetTerm(void **pData, char *pTerm, int iTermLen)
|
||||
{
|
||||
struct SerialInfo *my_info = NULL;
|
||||
|
||||
|
||||
my_info = (struct SerialInfo *)*pData;
|
||||
assert(my_info);
|
||||
|
||||
|
||||
strncpy(pTerm,my_info->pTerms,iTermLen);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int SerialSendTerm(void **pData, char *pTerm)
|
||||
{
|
||||
struct SerialInfo *my_info = NULL;
|
||||
|
||||
|
||||
my_info = (struct SerialInfo *)*pData;
|
||||
assert(my_info);
|
||||
|
||||
|
||||
/* only 0 characters in this field */
|
||||
if(strlen(pTerm) > 9)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
strcpy(my_info->pSendTerm,pTerm);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
int SerialSend(void **pData, char *pCommand)
|
||||
@ -400,16 +400,16 @@
|
||||
}else {
|
||||
strcpy (cmnd_lst_ptr+4, txt_ptr);
|
||||
/* make sure that the string is properly terminated */
|
||||
if((strstr(txt_ptr,info_ptr->pSendTerm) == 0) &&
|
||||
if((strstr(txt_ptr,info_ptr->pSendTerm) == 0) &&
|
||||
(strlen(txt_ptr) > 0) )
|
||||
{
|
||||
strcpy(cmnd_lst_ptr+4+strlen(txt_ptr),info_ptr->pSendTerm);
|
||||
c_len = strlen(txt_ptr) + strlen(info_ptr->pSendTerm);
|
||||
c_len = strlen(txt_ptr) + strlen(info_ptr->pSendTerm);
|
||||
}
|
||||
else
|
||||
{
|
||||
c_len = strlen (txt_ptr);
|
||||
}
|
||||
}
|
||||
sprintf (text, "%4.4d", c_len);
|
||||
memcpy (cmnd_lst_ptr, text, 4);
|
||||
cmnd_lst_ptr = cmnd_lst_ptr + c_len + 4;
|
||||
@ -445,7 +445,7 @@
|
||||
int SerialReceive(void **pData, char *pBuffer, int iBufLen)
|
||||
{
|
||||
struct SerialInfo *info_ptr;
|
||||
int status;//, c_len,
|
||||
int status;//, c_len,
|
||||
int size, max_size; //, ncmnds;
|
||||
int bytes_to_come, bytes_left;
|
||||
int iResult;
|
||||
@ -458,7 +458,7 @@
|
||||
//long lMask = 0L;
|
||||
//struct timeval tmo = {0,1};
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** Do nothing if no connection - the connection gets
|
||||
** closed if an error is detected.
|
||||
@ -478,7 +478,7 @@
|
||||
if(status <= 0)
|
||||
{
|
||||
return SELECTFAIL;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/* try read the message length to come */
|
||||
@ -492,8 +492,8 @@
|
||||
else if (status == -1) {
|
||||
iResult = EL734__BAD_RECV_NET; /* It's some other net problem */
|
||||
}
|
||||
else
|
||||
{
|
||||
else
|
||||
{
|
||||
iResult = EL734__BAD_RECV_NET;
|
||||
}
|
||||
AsynSrv_Close (&(info_ptr->sAsync),1);
|
||||
@ -564,11 +564,11 @@
|
||||
return True;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int SerialReceiveWithTerm(void **pData, char *pBuffer,
|
||||
int SerialReceiveWithTerm(void **pData, char *pBuffer,
|
||||
int iBufLen, char *cTerm )
|
||||
{
|
||||
struct SerialInfo *info_ptr;
|
||||
int status;//, c_len,
|
||||
int status;//, c_len,
|
||||
int size, max_size;//, ncmnds;
|
||||
int bytes_to_come, bytes_left;
|
||||
int iResult;
|
||||
@ -581,7 +581,7 @@
|
||||
//long lMask = 0L;
|
||||
//struct timeval tmo = {0,1};
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** Do nothing if no connection - the connection gets
|
||||
** closed if an error is detected.
|
||||
@ -601,7 +601,7 @@
|
||||
if(status <= 0)
|
||||
{
|
||||
return SELECTFAIL;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/* try read the message length to come */
|
||||
@ -615,8 +615,8 @@
|
||||
else if (status == -1) {
|
||||
iResult = EL734__BAD_RECV_NET; /* It's some other net problem */
|
||||
}
|
||||
else
|
||||
{
|
||||
else
|
||||
{
|
||||
iResult = EL734__BAD_RECV_NET;
|
||||
}
|
||||
AsynSrv_Close (&(info_ptr->sAsync),1);
|
||||
@ -687,7 +687,7 @@
|
||||
}
|
||||
return True;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int SerialError(int iErr, char *pBuffer, int iBufLen)
|
||||
{
|
||||
@ -702,10 +702,10 @@
|
||||
break;
|
||||
case -301:
|
||||
strncpy(pBuffer,"No reply found", iBufLen);
|
||||
break;
|
||||
break;
|
||||
case -100:
|
||||
strncpy(pBuffer,"No reply found", iBufLen);
|
||||
break;
|
||||
break;
|
||||
case EL734__BAD_ADR:
|
||||
strncpy(pBuffer,"SERIAL__BAD_ADR",iBufLen);
|
||||
break;
|
||||
@ -745,7 +745,7 @@
|
||||
case EL734__BAD_PAR:
|
||||
strncpy(pBuffer,"SERIAL__BAD_PAR",iBufLen);
|
||||
break;
|
||||
|
||||
|
||||
case EL734__BAD_RECV:
|
||||
strncpy(pBuffer,"SERIAL__BAD_RECV",iBufLen);
|
||||
break;
|
||||
@ -800,24 +800,24 @@
|
||||
case OPENFAILURE:
|
||||
strncpy(pBuffer,
|
||||
"FAILED to open connection to serial port server", iBufLen);
|
||||
break;
|
||||
break;
|
||||
default:
|
||||
strcpy(pBuffer,"Unknown SERIAL error");
|
||||
break;
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int SerialWriteRead(void **pData, char *pCommand,
|
||||
int SerialWriteRead(void **pData, char *pCommand,
|
||||
char *pBuffer, int iBufLen)
|
||||
{
|
||||
|
||||
|
||||
struct SerialInfo *pInfo = NULL;
|
||||
int iRet;
|
||||
time_t tTarget, tCurrent;
|
||||
|
||||
|
||||
pInfo = (struct SerialInfo *)*pData;
|
||||
|
||||
|
||||
/* write */
|
||||
iRet = SerialSend(pData,pCommand);
|
||||
if(iRet != 1)
|
||||
@ -825,11 +825,11 @@
|
||||
SerialError(iRet, pBuffer,iBufLen);
|
||||
return iRet;
|
||||
}
|
||||
|
||||
|
||||
/* check for answers for maximum time out */
|
||||
tTarget = tCurrent = time(&tCurrent);
|
||||
tTarget += pInfo->tmo*100 - 90;
|
||||
|
||||
|
||||
while(tCurrent < tTarget)
|
||||
{
|
||||
pInfo->pFunc(pInfo->pData, 100);
|
||||
@ -843,27 +843,27 @@
|
||||
return iRet;
|
||||
}
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
return 1; /* there is data read, we are done */
|
||||
}
|
||||
tCurrent = time(&tCurrent);
|
||||
}
|
||||
return TIMEOUT;
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int SerialNoReply(void **pData, char *pCommand)
|
||||
{
|
||||
|
||||
|
||||
struct SerialInfo *pInfo = NULL;
|
||||
int iRet, iOld, i;
|
||||
char pBuffer[30];
|
||||
|
||||
|
||||
pInfo = (struct SerialInfo *)*pData;
|
||||
|
||||
|
||||
iOld = pInfo->tmo;
|
||||
pInfo->tmo = 0;
|
||||
|
||||
|
||||
/* write */
|
||||
iRet = SerialSend(pData,pCommand);
|
||||
if(iRet != 1)
|
||||
@ -871,7 +871,7 @@
|
||||
pInfo->tmo = iOld;
|
||||
return iRet;
|
||||
}
|
||||
|
||||
|
||||
/* try some time to find a TMO */
|
||||
for(i = 0 ; i < 10; i++)
|
||||
{
|
||||
@ -888,19 +888,19 @@
|
||||
}
|
||||
pInfo->tmo = iOld;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
void SetSerialSleep(void **pData, SerialSleep pFun, void *pUserData)
|
||||
{
|
||||
struct SerialInfo *pInfo = NULL;
|
||||
// int iRet;
|
||||
|
||||
|
||||
pInfo = (struct SerialInfo *)*pData;
|
||||
pInfo->pFunc = pFun;
|
||||
pInfo->pData = pUserData;
|
||||
|
||||
}
|
||||
|
||||
pInfo->pData = pUserData;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -35,12 +35,12 @@
|
||||
|
||||
int SerialSend(void **pData, char *pCommand);
|
||||
int SerialReceive(void **pData, char *pBuffer, int iBufLen);
|
||||
int SerialReceiveWithTerm(void **pData, char *pBuffer,
|
||||
int SerialReceiveWithTerm(void **pData, char *pBuffer,
|
||||
int iBufLen,char *cTerm);
|
||||
int SerialError(int iError, char *pError, int iErrLen);
|
||||
int SerialWriteRead(void **pData, char *pCommand,
|
||||
int SerialWriteRead(void **pData, char *pCommand,
|
||||
char *pBuffer, int iBufLen);
|
||||
int SerialNoReply(void **pData, char *pCommand);
|
||||
int SerialNoReply(void **pData, char *pCommand);
|
||||
|
||||
#line 175 "velodorn.w"
|
||||
|
||||
|
@ -48,7 +48,7 @@
|
||||
|
||||
pSINQHM CreateSINQHM(char *pHMComputer, int iMasterPort);
|
||||
pSINQHM CopySINQHM(pSINQHM self);
|
||||
void DeleteSINQHM(pSINQHM self);
|
||||
void DeleteSINQHM(pSINQHM self);
|
||||
void SINQHMSetPar(pSINQHM self, int iRank, int iLength, int iBinWidth);
|
||||
void SINQHMSetPSD(pSINQHM self, int xSize, int xOff, int xFac,
|
||||
int ySize, int yOff, int yFac);
|
||||
@ -59,12 +59,12 @@
|
||||
|
||||
#line 155 "sinqhm.w"
|
||||
|
||||
int SINQHMConfigure(pSINQHM self, int iMode, int iRank, int iLength,
|
||||
int SINQHMConfigure(pSINQHM self, int iMode, int iRank, int iLength,
|
||||
int iBinWidth, int iLowBin, int iCompress);
|
||||
int SINQHMConfigurePSD(pSINQHM self, int iMode,
|
||||
int xSize, int xOff, int xFac,
|
||||
int ySize, int yOff, int yFac,
|
||||
int iBinWidth,
|
||||
int iBinWidth,
|
||||
float *iEdges, int iEdgeLength);
|
||||
|
||||
int SINQHMDeconfigure(pSINQHM self, int iHarsh);
|
||||
@ -73,7 +73,7 @@
|
||||
int *iLength, int *iClients);
|
||||
int SINQHMDebug(pSINQHM self, int iLevel);
|
||||
int SINQHMKill(pSINQHM self);
|
||||
|
||||
|
||||
|
||||
#line 261 "sinqhm.w"
|
||||
|
||||
@ -84,12 +84,12 @@
|
||||
int SINQHMStopDAQ(pSINQHM self);
|
||||
int SINQHMInhibitDAQ(pSINQHM self);
|
||||
int SINQHMContinueDAQ(pSINQHM self);
|
||||
|
||||
int SINQHMWrite(pSINQHM self, int iNum, int iStart, int iEnd,
|
||||
|
||||
int SINQHMWrite(pSINQHM self, int iNum, int iStart, int iEnd,
|
||||
void *pData);
|
||||
long SINQHMSize(pSINQHM self, int iNum, int iStart, int iEnd);
|
||||
int SINQHMRead(pSINQHM self, int iNum, int iStart, int iEnd,
|
||||
void *pData, int iDataLen);
|
||||
int SINQHMRead(pSINQHM self, int iNum, int iStart, int iEnd,
|
||||
void *pData, int iDataLen);
|
||||
int SINQHMProject(pSINQHM self, int code, int xStart, int nx,
|
||||
int yStart, int ny, void *pData, int iDataLen);
|
||||
int SINQHMZero(pSINQHM self, int iNum, int iStart, int iEnd);
|
||||
|
@ -218,7 +218,7 @@
|
||||
#define LWL_TOF_C9 (0x09000000) /* TOF-Mode 9 chan dgrm hdr */
|
||||
|
||||
#define LWL_PSD_TSI 0x0E000000 /* PSD-Mode TSI datagram */
|
||||
#define LWL_PSD_DATA 0x12000000 /* PSD-mode data datagram */
|
||||
#define LWL_PSD_DATA 0x12000000 /* PSD-mode data datagram */
|
||||
#define LWL_PSD_PWF 0x20000000 /* PSD-mode Power Fail bit */
|
||||
#define LWL_PSD_TIME 0x000fffff /* PSD-mode time stamp extraction
|
||||
mask */
|
||||
@ -369,7 +369,7 @@
|
||||
|
||||
struct {uint sub_cmnd;} daq;
|
||||
|
||||
struct {uint sub_code,
|
||||
struct {uint sub_code,
|
||||
x_lo,
|
||||
nx,
|
||||
y_lo,
|
||||
|
@ -1,11 +1,11 @@
|
||||
/**
|
||||
* This is an asynchronous protocol implementation for HTTP.
|
||||
* It includes special features to store binary data coming
|
||||
* from a SINQ http histogram memory in a sinqdata object.
|
||||
* This is an asynchronous protocol implementation for HTTP.
|
||||
* It includes special features to store binary data coming
|
||||
* from a SINQ http histogram memory in a sinqdata object.
|
||||
* Which has to be specified on initialisation.
|
||||
*
|
||||
*
|
||||
* copyright: see file COPYRIGHT
|
||||
*
|
||||
*
|
||||
* Mark Koennecke, June 2008
|
||||
*/
|
||||
#include <ascon.h>
|
||||
@ -25,7 +25,7 @@ static int configRequest(Ascon *a){
|
||||
pHttpProt pHttp = (pHttpProt)a->private;
|
||||
pDynString request;
|
||||
char *uri = NULL;
|
||||
|
||||
|
||||
request = CreateDynString(64,64);
|
||||
if(request == NULL){
|
||||
AsconError(a,"Out of memory", 122);
|
||||
@ -36,7 +36,7 @@ static int configRequest(Ascon *a){
|
||||
DynStringConcatChar(request,'/');
|
||||
DynStringConcat(request,GetCharArray(a->wrBuffer));
|
||||
uri = GetCharArray(request);
|
||||
|
||||
|
||||
ghttp_clean(pHttp->request);
|
||||
ghttp_set_type(pHttp->request,ghttp_type_get);
|
||||
ghttp_set_header(pHttp->request,"connection", "keep-alive");
|
||||
@ -45,13 +45,13 @@ static int configRequest(Ascon *a){
|
||||
return 0;
|
||||
}
|
||||
if(pHttp->userName != NULL && pHttp->password != NULL){
|
||||
ghttp_set_authinfo(pHttp->request,
|
||||
ghttp_set_authinfo(pHttp->request,
|
||||
pHttp->userName, pHttp->password);
|
||||
}
|
||||
ghttp_set_sync(pHttp->request,ghttp_async);
|
||||
ghttp_prepare(pHttp->request);
|
||||
DeleteDynString(request);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------------*/
|
||||
@ -60,7 +60,7 @@ static void handleReply(Ascon *a){
|
||||
int len, i, *dataPtr = NULL;
|
||||
HistInt *hmData = NULL;
|
||||
pHttpProt pHttp = (pHttpProt)a->private;
|
||||
|
||||
|
||||
pPtr = ghttp_get_body(pHttp->request);
|
||||
len = ghttp_get_body_len(pHttp->request);
|
||||
if(strstr(pPtr,"ERROR") != NULL){
|
||||
@ -96,7 +96,7 @@ static int HttpHandler(Ascon *a) {
|
||||
int socke, selStat;
|
||||
fd_set rmask;
|
||||
struct timeval tmo = {0,0};
|
||||
|
||||
|
||||
switch (a->state) {
|
||||
case AsconConnectStart:
|
||||
a->state = AsconConnecting;
|
||||
@ -161,7 +161,7 @@ static int HttpHandler(Ascon *a) {
|
||||
break;
|
||||
case ghttp_error:
|
||||
/*
|
||||
* A first error may not be an error but a
|
||||
* A first error may not be an error but a
|
||||
* reconnect
|
||||
*/
|
||||
ghttp_close(pHttp->request);
|
||||
@ -178,7 +178,7 @@ static int HttpHandler(Ascon *a) {
|
||||
break;
|
||||
default:
|
||||
return AsconStdHandler(a);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
@ -199,10 +199,10 @@ static void killHttp(void *data){
|
||||
free(prot);
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
static int HttpProtInit(Ascon *a, SConnection *con,
|
||||
static int HttpProtInit(Ascon *a, SConnection *con,
|
||||
int argc, char *argv[]){
|
||||
pHttpProt pHttp = NULL;
|
||||
|
||||
|
||||
if(argc < 3){
|
||||
SCWrite(con,"ERROR: too few arguments in HttpProtInit", eError);
|
||||
return 0;
|
||||
@ -238,7 +238,7 @@ static int HttpProtInit(Ascon *a, SConnection *con,
|
||||
/*-------------------------------------------------------------------------*/
|
||||
void AddHttpProtocoll(){
|
||||
AsconProtocol *prot = NULL;
|
||||
|
||||
|
||||
prot = calloc(sizeof(AsconProtocol), 1);
|
||||
prot->name = strdup("sinqhttp");
|
||||
prot->init = HttpProtInit;
|
||||
|
@ -253,14 +253,14 @@
|
||||
}else {
|
||||
*nxt++ = '\\'; break;
|
||||
}
|
||||
case '0':
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '7':
|
||||
i = strspn (in, "01234567");
|
||||
if (i > 3) {
|
||||
sscanf (in, "%3o", &j);
|
||||
@ -273,7 +273,7 @@
|
||||
in += i;
|
||||
break;
|
||||
}else {
|
||||
*nxt++ = '\\';
|
||||
*nxt++ = '\\';
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
@ -1,35 +1,35 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
A general purpose translation table and interpolation module.
|
||||
Interpolation tables are read from a file, which is meant to
|
||||
contain pairs of val1 val2 per line.
|
||||
|
||||
|
||||
contain pairs of val1 val2 per line.
|
||||
|
||||
|
||||
Mark Koennecke, October 1997
|
||||
|
||||
|
||||
copyright: see copyright.h
|
||||
|
||||
-----------------------------------------------------------------------------*/
|
||||
-----------------------------------------------------------------------------*/
|
||||
#ifndef SICSTABLE
|
||||
#define SICSTABLE
|
||||
typedef struct __SicsTable *pSTable;
|
||||
|
||||
|
||||
/*------------------------- live & death ----------------------------------*/
|
||||
pSTable CreateTable(FILE *fd);
|
||||
/*
|
||||
creates a new table from a given file. The file is meant to have
|
||||
been positioned to the first entry for the table in the file.
|
||||
/*
|
||||
creates a new table from a given file. The file is meant to have
|
||||
been positioned to the first entry for the table in the file.
|
||||
This leaves the caller free to examine a header, if any.
|
||||
*/
|
||||
*/
|
||||
void DeleteTable(pSTable self);
|
||||
/*------------------------- Interpolation --------------------------------*/
|
||||
int InterpolateVal1(pSTable pTable, float fKey, float *fResult);
|
||||
/*
|
||||
Returns a result from the second column for a key from the
|
||||
first column.
|
||||
*/
|
||||
int InterpolateVal2(pSTable pTable, float fKey, float *fResult);
|
||||
*/
|
||||
int InterpolateVal2(pSTable pTable, float fKey, float *fResult);
|
||||
/*
|
||||
Returns a result from the first column for a key from the
|
||||
second column.
|
||||
*/
|
||||
#endif
|
||||
*/
|
||||
#endif
|
||||
|
@ -1,13 +1,13 @@
|
||||
/*--------------------------------------------------------------------------
|
||||
|
||||
W E S T 4 1 0 0 U T I L . C
|
||||
|
||||
|
||||
A few utility functions for dealing with a WEST4100 temperature controller
|
||||
within the SINQ setup: host -- TCP/IP -- MAC --- RS-232.
|
||||
|
||||
|
||||
Mark Koennecke, Juli 1997
|
||||
Mark Lesha, January 2006 (based on ITC4 code)
|
||||
Paul Barron, January 2008 (Note: This is based on the old LAKESHORE340 code and
|
||||
Paul Barron, January 2008 (Note: This is based on the old LAKESHORE340 code and
|
||||
not the new LS340 code written by Rodney Davies Feb 08)
|
||||
|
||||
Copyright:
|
||||
@ -68,26 +68,26 @@
|
||||
sprintf(pCommand,"%c%c%c%c%c%c",self->iAdr,0x01,0x00,0x05,0x00,0x01);
|
||||
if ((iRet=transactModbusTCP(self->controller,pCommand,6,pReply,79))<=0)
|
||||
return iRet;
|
||||
|
||||
|
||||
if(pReply[3] != 0x0)
|
||||
{
|
||||
printf("Warning: Alarm 1 Activated\n");
|
||||
strcpy(self->pAns,pReply);
|
||||
return 1;
|
||||
}else printf("OK\n");
|
||||
|
||||
|
||||
// Check Alarm 2
|
||||
printf("%-9s %-23s","Checking:", "Status Alarm 2........");
|
||||
sprintf(pCommand,"%c%c%c%c%c%c",self->iAdr,0x01,0x00,0x06,0x00,0x01);
|
||||
if ((iRet=transactModbusTCP(self->controller,pCommand,6,pReply,79))<=0)
|
||||
return iRet;
|
||||
|
||||
|
||||
if(pReply[3]!=0x0)
|
||||
{
|
||||
printf("Warning: Alarm 2 Activated\n");
|
||||
strcpy(self->pAns,pReply);
|
||||
return 1;
|
||||
}else{
|
||||
}else{
|
||||
printf("OK\n");
|
||||
return 1;
|
||||
}
|
||||
@ -97,34 +97,34 @@
|
||||
printf("Bad response received!\n");
|
||||
return WEST4100__BADREAD;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int WEST4100_ConfigureAndQueryGen(pWEST4100 self, char *command, int fParAdr, float fVal, char *diagnosis)
|
||||
{
|
||||
int iRet;
|
||||
unsigned char pCommandSet[79], pCommandCheck[79];
|
||||
unsigned char pReply[79];
|
||||
unsigned char fParAdrHex[2],fValHex[2];
|
||||
|
||||
|
||||
// Convert int to hexstring
|
||||
if((iRet=(int2hexstring((int)fParAdr,fParAdrHex)))==0)
|
||||
return iRet;
|
||||
if((iRet=(int2hexstring((int)fVal,fValHex)))==0)
|
||||
return iRet;
|
||||
|
||||
|
||||
/* Construct a write command. */
|
||||
printf("%-9s %-23s","Setting: ",command);
|
||||
sprintf(pCommandSet,"%c%c%c%c%c%c",self->iAdr,0x06,
|
||||
fParAdrHex[0],fParAdrHex[1],fValHex[0],fValHex[1]);
|
||||
|
||||
|
||||
/* Issue a write command. */
|
||||
if((iRet=transactModbusTCP(self->controller,pCommandSet,/*strlen(pCommand)*/6,pReply,79))!=1)
|
||||
if((iRet=transactModbusTCP(self->controller,pCommandSet,/*strlen(pCommand)*/6,pReply,79))!=1)
|
||||
return iRet;
|
||||
printf("OK\n");
|
||||
|
||||
|
||||
/* Construct a read command to check that the paramater was set.*/
|
||||
printf("%-9s %-23s","Checking:",command);
|
||||
sprintf(pCommandCheck,"%c%c%c%c%c%c",self->iAdr,04,fParAdrHex[0],fParAdrHex[1],0x00,0x1);
|
||||
|
||||
|
||||
/* Issue a read command .*/
|
||||
if ((iRet=transactModbusTCP(self->controller,pCommandCheck,6,pReply,79))<=0)
|
||||
{
|
||||
@ -132,7 +132,7 @@
|
||||
printf("DEBUG: pReply='%s' len=%d \n",pReply,strlen(pReply));
|
||||
return iRet;
|
||||
}
|
||||
|
||||
|
||||
// Check that the read data is the same as that was set
|
||||
if ( (pCommandSet[4]!=pReply[3]) || (pCommandSet[5]!=pReply[4]) )
|
||||
{
|
||||
@ -146,25 +146,25 @@
|
||||
printf("OK\n");
|
||||
return 1;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int WEST4100_SetControl(pWEST4100 self, int iControl)
|
||||
{
|
||||
// Left over from lakeshore code, West only has 1 sensor to choose from.
|
||||
|
||||
// Left over from lakeshore code, West only has 1 sensor to choose from.
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int WEST4100_Setup(pWEST4100 self)
|
||||
{
|
||||
int iRet;
|
||||
unsigned char pCommand[40];
|
||||
unsigned char pReply[132];
|
||||
//int fVal = 999999.;
|
||||
|
||||
|
||||
/* Check the WEST4100 status */
|
||||
if ((iRet=WEST4100_Check_Status(self))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
// Check the write status
|
||||
printf("%-9s %-23s","Checking:", "Write Status..........");
|
||||
sprintf(pCommand,"%c%c%c%c%c%c",self->iAdr,0x01,0x00,0x01,0x00,0x01);
|
||||
@ -179,15 +179,15 @@
|
||||
}else if (pReply[3] == 0x00)
|
||||
{
|
||||
printf("Status is Write Disabled.\n");
|
||||
return WEST4100__READONLY;
|
||||
return WEST4100__READONLY;
|
||||
}
|
||||
|
||||
|
||||
/* Check that the controller is a gen-new-wine WEST4100 */
|
||||
printf("%-9s %-23s","Checking:", "ID....................");
|
||||
sprintf(pCommand,"%c%c%c%c%c%c",self->iAdr,0x03,0x00,122,0x00,0x01);
|
||||
if((iRet=transactModbusTCP(self->controller,pCommand,/*strlen*/6,pReply,79))!=1)
|
||||
if((iRet=transactModbusTCP(self->controller,pCommand,/*strlen*/6,pReply,79))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
if ((pReply[3]!=0x17) || (pReply[4]!=0xd4))
|
||||
{
|
||||
printf("Error: Incorrect ID\n");
|
||||
@ -197,40 +197,40 @@
|
||||
else printf("OK\n");
|
||||
|
||||
// Set Output Limit
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Output Power to 40%..",20,40,""))!=1)
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Output Power to 40%..",20,40,""))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
// Set Alarm1 Limit
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Alarm1 to 1600........",13,1600,""))!=1)
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Alarm1 to 1600........",13,1600,""))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
// Set Alarm2 Limit
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Alarm2 to 0...........",14,0,""))!=1)
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Alarm2 to 0...........",14,0,""))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
// Set Upper Limit
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Upper Limit to 1800...",22,1800,""))!=1)
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Upper Limit to 1800...",22,1800,""))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
// Set Lower Limit
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Lower Limit to 0......",23,0,""))!=1)
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Lower Limit to 0......",23,0,""))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
// Set Ramp Rate
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Ramp Rate to 0ff......",24,10000,""))!=1)
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Ramp Rate to 0ff......",24,10000,""))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
/* Check the WEST4100 operating status one last time */
|
||||
if ((iRet=WEST4100_Check_Status(self))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
return 1; /* Success */
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int WEST4100_Open(pWEST4100 *pData, char *pRS232, int iAddress, int iTransaction)
|
||||
{
|
||||
pWEST4100 self = NULL;
|
||||
|
||||
|
||||
self = (pWEST4100)malloc(sizeof(WEST4100));
|
||||
if(self == NULL)
|
||||
{
|
||||
@ -241,7 +241,7 @@
|
||||
self->iTransact = iTransaction;
|
||||
|
||||
self->controller = NULL;
|
||||
|
||||
|
||||
self->controller = (prs232)FindCommandData(pServ->pSics,pRS232,
|
||||
"RS232 Controller");
|
||||
if(!self->controller){
|
||||
@ -250,27 +250,27 @@
|
||||
}
|
||||
|
||||
return WEST4100_Setup(self);
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
void WEST4100_Close(pWEST4100 *pData)
|
||||
{
|
||||
pWEST4100 self;
|
||||
|
||||
|
||||
self = *pData;
|
||||
if (!self)
|
||||
return; // Just in case
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int WEST4100_Config(pWEST4100 *pData, int iTmo, int iRead, int iControl)
|
||||
{
|
||||
pWEST4100 self;
|
||||
|
||||
|
||||
self = *pData;
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int WEST4100_Send(pWEST4100 *pData, char *pCommand, char *pReply, int iLen)
|
||||
{
|
||||
@ -278,12 +278,12 @@
|
||||
pWEST4100 self;
|
||||
|
||||
self = *pData;
|
||||
|
||||
|
||||
char *ptr = pCommand;
|
||||
unsigned int byte;
|
||||
unsigned char pCommandHex[79];
|
||||
size_t i;
|
||||
|
||||
|
||||
// Convert char string command to hex string with every two characters concatenated to one array field
|
||||
for (i=0;i<sizeof pCommandHex ;++i)
|
||||
{
|
||||
@ -294,23 +294,23 @@
|
||||
pCommandHex[i]=byte;
|
||||
ptr +=2;
|
||||
}
|
||||
|
||||
|
||||
// Issue hex command
|
||||
printf("%s ","Issuing Send: ");
|
||||
if((iRet=transactModbusTCP(self->controller,pCommandHex,6,pReply,79))!=1){
|
||||
printf("%-s","Response: ");
|
||||
displayHexString(pReply);
|
||||
displayHexString(pReply);
|
||||
return iRet;
|
||||
}
|
||||
printf("OK\n");
|
||||
|
||||
|
||||
printf("%-s","Response: ");
|
||||
displayHexString(pReply);
|
||||
|
||||
|
||||
/* Check the WEST4100 operating status after issuing the command, if it was successful */
|
||||
if (iRet>=1)
|
||||
iRet=WEST4100_Check_Status(self);
|
||||
|
||||
|
||||
return iRet;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
@ -322,7 +322,7 @@
|
||||
pWEST4100 self;
|
||||
|
||||
self = *pData;
|
||||
|
||||
|
||||
sprintf(pCommand,"%c%c%c%c%c%c",self->iAdr,04,0x0,0x1,0x0,0x1);
|
||||
if ((iRet=transactModbusTCP(self->controller,pCommand,6,pReply,79))<=0)
|
||||
{
|
||||
@ -332,15 +332,15 @@
|
||||
}
|
||||
|
||||
// Because a value read will never be greater than FF FF we can use a simple line to convert
|
||||
fRead=(256*pReply[3])+pReply[4];
|
||||
|
||||
fRead=(256*pReply[3])+pReply[4];
|
||||
|
||||
if(fRead > 65535 || fRead < 0) // Not a number, probably an error response
|
||||
{
|
||||
return WEST4100__BADREAD;
|
||||
}
|
||||
|
||||
|
||||
*fVal = fRead;
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
@ -351,7 +351,7 @@
|
||||
pWEST4100 self;
|
||||
|
||||
self = *pData;
|
||||
|
||||
|
||||
int2hexstring(parAddress,pAddress);
|
||||
sprintf(pCommand,"%c%c%c%c%c%c",self->iAdr,0x4,pAddress[0],pAddress[1],0x0,0x1);
|
||||
if ((iRet=transactModbusTCP(self->controller,pCommand,6,pReply,79))<=0)
|
||||
@ -362,13 +362,13 @@
|
||||
}
|
||||
|
||||
// Because a value read will never be greater than FF FF we can use a simple line to convert
|
||||
*parValue=(256*pReply[3])+pReply[4];
|
||||
|
||||
*parValue=(256*pReply[3])+pReply[4];
|
||||
|
||||
if(*parValue > 65535 || *parValue < 0) // Not a number, probably an error response
|
||||
{
|
||||
return WEST4100__BADREAD;
|
||||
}
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
@ -379,14 +379,14 @@
|
||||
pWEST4100 self;
|
||||
|
||||
self = *pData;
|
||||
|
||||
|
||||
sprintf(displaytext,"Parameter Number %d...",parAddress);
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,displaytext,parAddress,parValue,""))!=1)
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,displaytext,parAddress,parValue,""))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
if ((iRet=WEST4100_Check_Status(self))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
@ -396,16 +396,16 @@
|
||||
pWEST4100 self;
|
||||
|
||||
self = *pData;
|
||||
|
||||
|
||||
for(i = 0; i < 3; i++)
|
||||
{
|
||||
// Set setpoint
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Setpoint...",0x02,fVal,""))!=1)
|
||||
{
|
||||
// Set setpoint
|
||||
if((iRet=WEST4100_ConfigureAndQueryGen(self,"Setpoint...",0x02,fVal,""))!=1)
|
||||
return iRet;
|
||||
|
||||
|
||||
printf("SETP OK, checking status and returning.\n");
|
||||
iRet=WEST4100_Check_Status(self);
|
||||
|
||||
|
||||
return iRet;
|
||||
}
|
||||
printf("SETP failed!\n");
|
||||
@ -418,7 +418,7 @@ void WEST4100_ErrorTxt(pWEST4100 *pData,int iCode, char *pError, int iLen)
|
||||
pWEST4100 self;
|
||||
|
||||
self = *pData;
|
||||
|
||||
|
||||
switch(iCode)
|
||||
{
|
||||
case WEST4100__BADCOM:
|
||||
@ -448,25 +448,25 @@ void WEST4100_ErrorTxt(pWEST4100 *pData,int iCode, char *pError, int iLen)
|
||||
break;
|
||||
default:
|
||||
getRS232Error(iCode, pError,iLen);
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int int2hexstring(int fVal, unsigned char *hexstring)
|
||||
{
|
||||
size_t k;
|
||||
int fValInt;
|
||||
unsigned char temp[79];
|
||||
int result,remainder,index,index2;
|
||||
|
||||
|
||||
fValInt=fVal;
|
||||
|
||||
|
||||
if(fValInt>65535)
|
||||
{
|
||||
printf("Value greater than FF FF");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// Convert integer to hex and putting each char in an array
|
||||
memset(temp,0,sizeof(temp));
|
||||
result=1;
|
||||
@ -477,15 +477,15 @@ int int2hexstring(int fVal, unsigned char *hexstring)
|
||||
fValInt=result;
|
||||
temp[k]=remainder;
|
||||
}
|
||||
|
||||
|
||||
// Formatting a new array so that there is one byte per array field
|
||||
if((k%2)==0)
|
||||
index2=k/2-1;
|
||||
else
|
||||
index2=k/2;
|
||||
|
||||
|
||||
if(fVal>255)
|
||||
{
|
||||
{
|
||||
for(index=0;index2>=0;(index=index+2),index2--)
|
||||
{
|
||||
hexstring[index2]=(temp[index+1]*16)+temp[index];
|
||||
@ -493,15 +493,15 @@ int int2hexstring(int fVal, unsigned char *hexstring)
|
||||
}else{
|
||||
hexstring[0]=0x0;
|
||||
hexstring[1]=(temp[1]*16)+temp[0];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
void displayHexString(unsigned char *hexstring)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
for(i=0;(i<5)|(hexstring[i]!='\0');i++)printf("%02x ",hexstring[i]);
|
||||
printf("\n");
|
||||
}
|
||||
|
@ -1,29 +1,29 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
W E S T 4 1 0 0
|
||||
|
||||
W E S T 4 1 0 0
|
||||
|
||||
A few utility functions for talking to a Lakeshore 340
|
||||
temperature controller via the SINQ setup: TCP/IP--MAC--RS-232--
|
||||
WEST4100.
|
||||
|
||||
|
||||
Mark Koennecke, Juli 1997
|
||||
Mark Lesha, January 2006 (based on ITC4 code)
|
||||
Paul Barron, January 2008 (Note: This is based on the old LAKESHORE340 code and
|
||||
Paul Barron, January 2008 (Note: This is based on the old LAKESHORE340 code and
|
||||
not the new LS340 code written by Rodney Davies Feb 08)
|
||||
|
||||
|
||||
----------------------------------------------------------------------------*/
|
||||
#ifndef SINQWEST4100
|
||||
#define SINQWEST4100
|
||||
|
||||
/*----------------------- ERRORCODES--------------------------------------
|
||||
Most functions return a negative error code on failure. Error codes
|
||||
Most functions return a negative error code on failure. Error codes
|
||||
defined are those defined for serialsinq plus a few additional ones:
|
||||
*/
|
||||
|
||||
#define WEST4100__BADCOM -501
|
||||
/* command not recognized */
|
||||
#define WEST4100__BADPAR -502
|
||||
#define WEST4100__BADPAR -502
|
||||
/* bad parameter to command */
|
||||
#define WEST4100__BADMALLOC -503
|
||||
#define WEST4100__BADMALLOC -503
|
||||
/* error allocating memory */
|
||||
#define WEST4100__BADREAD -504
|
||||
/* error analysing command string on Read */
|
||||
@ -41,7 +41,7 @@
|
||||
void *pData;
|
||||
char pAns[80];
|
||||
prs232 controller;
|
||||
} WEST4100;
|
||||
} WEST4100;
|
||||
|
||||
typedef struct __WEST4100 *pWEST4100;
|
||||
|
||||
@ -57,49 +57,49 @@
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
|
||||
*/
|
||||
|
||||
*/
|
||||
|
||||
void WEST4100_Close(pWEST4100 *pData);
|
||||
/****** close a connection to an WEST4100controller and frees its
|
||||
data structure. The only parameter is a pointer to the data
|
||||
data structure. The only parameter is a pointer to the data
|
||||
structure for this controller. This pointer will be invalid after
|
||||
this call.
|
||||
*/
|
||||
*/
|
||||
|
||||
int WEST4100_Config(pWEST4100 *pData, int iTmo, int iRead,
|
||||
int WEST4100_Config(pWEST4100 *pData, int iTmo, int iRead,
|
||||
int iControl);
|
||||
/***** configure some aspects of a WEST4100temperature controller.
|
||||
The parameter are:
|
||||
- a pointer to the data structure for the controller as
|
||||
- a pointer to the data structure for the controller as
|
||||
returned by WEST4100_Open
|
||||
- a value for the connection timeout
|
||||
- the temperature sensor to use for reading the
|
||||
- the temperature sensor to use for reading the
|
||||
temperature.
|
||||
- the temperature sensor used by the WEST4100controller
|
||||
- the temperature sensor used by the WEST4100controller
|
||||
for regulating the temperature.
|
||||
- the divisor needed to calculate the real temperature
|
||||
from the sensor.
|
||||
The function returns 1 on success, a negative error code on
|
||||
from the sensor.
|
||||
The function returns 1 on success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
|
||||
|
||||
int WEST4100_Send(pWEST4100 *pData, char *pCommand, char *pReply, int iLen);
|
||||
/******* send a the command in pCommand to the WEST4100controller.
|
||||
A possible reply is returned in the buffer pReply.
|
||||
Maximum iLen characters are copied to pReply.
|
||||
The first parameter is a pointer to a WEST4100data structure
|
||||
as returned by WEST4100_Open.
|
||||
|
||||
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
|
||||
|
||||
int WEST4100_Read(pWEST4100 *pData, float *fVal);
|
||||
/******* reads the current actual temperature of the sensor
|
||||
configured by ConfigWEST4100for reading. The value is returned
|
||||
in fVal. The first parameter is a pointer to a WEST4100
|
||||
data structure as returned by WEST4100_Open.
|
||||
|
||||
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.
|
||||
*/
|
||||
@ -113,18 +113,18 @@
|
||||
Return values are 1 for success, a negative error code on
|
||||
failure.pEVInterface
|
||||
*/
|
||||
|
||||
|
||||
void WEST4100_ErrorTxt(pWEST4100 *pData, int iCode, char *pError, int iLen);
|
||||
/******* translates one of the negative error WEST4100error codes
|
||||
into text. Maximum iLen bytes will be copied to the
|
||||
buffer pError;
|
||||
*/
|
||||
|
||||
*/
|
||||
|
||||
int WEST4100_Query(pWEST4100 *pData, int parAddress, int *parValue);
|
||||
int WEST4100_Write(pWEST4100 *pData, int parAddress, int parValue);
|
||||
int int2hexstring(int fVal, unsigned char *hexstring);
|
||||
void displayHexString(unsigned char *hexstring);
|
||||
void displayHexString(unsigned char *hexstring);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*--------------------------------------------------------------------------
|
||||
H M _ A S I M
|
||||
|
||||
The ANSTO simulated histogramming memory driver include file
|
||||
The ANSTO simulated histogramming memory driver include file
|
||||
|
||||
Paul Hathaway, September 2004
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
/*--------------------------------------------------------------------------
|
||||
H M _ T A N G O
|
||||
|
||||
Header file for the ANSTO histogramming memory driver interfacing
|
||||
Header file for the ANSTO histogramming memory driver interfacing
|
||||
a TANGO server
|
||||
|
||||
Based on anstohm.h (Andy Gotz, February 2004)
|
||||
|
@ -3,11 +3,11 @@
|
||||
|
||||
A module creating a slightly modified HMControl object suitable for the
|
||||
ANSTO HM. This works exactly the same as the existing HMControl, but
|
||||
has extra options (e.g. pausing HM's at the end of a count instead of
|
||||
has extra options (e.g. pausing HM's at the end of a count instead of
|
||||
stopping them).
|
||||
|
||||
copyright: see copyright.h
|
||||
|
||||
|
||||
Mark Lesha, October 2006
|
||||
-------------------------------------------------------------------------*/
|
||||
|
||||
@ -54,7 +54,7 @@ static int HMCStatus_ANSTO(void *pData, SConnection *pCon)
|
||||
// to support pause-on-count-terminate option for ANSTO HM,
|
||||
// and termination either by counter or by HM.
|
||||
{
|
||||
int status,i;
|
||||
int status,i;
|
||||
pHMcontrol self = NULL;
|
||||
|
||||
self = (pHMcontrol)pData;
|
||||
@ -66,7 +66,7 @@ static int HMCStatus_ANSTO(void *pData, SConnection *pCon)
|
||||
if(status == HWIdle || status == HWFault)
|
||||
{
|
||||
/*
|
||||
stop counting on slaves when finished or when an error
|
||||
stop counting on slaves when finished or when an error
|
||||
occurred.
|
||||
*/
|
||||
InvokeCallBack(self->pCall,COUNTEND,pCon);
|
||||
@ -87,7 +87,7 @@ static int HMCStatus_ANSTO(void *pData, SConnection *pCon)
|
||||
*/
|
||||
self->pCount->Pause(self,pCon);
|
||||
releaseMCntrLocks(self->slaveData[0]);
|
||||
ReleaseCountLock(self->pCount); // Release hmc
|
||||
ReleaseCountLock(self->pCount); // Release hmc
|
||||
} else
|
||||
self->pCount->Halt(self);
|
||||
}
|
||||
@ -107,7 +107,7 @@ static int HMCStatus_ANSTO(void *pData, SConnection *pCon)
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
int HMControlAction_ANSTO(SConnection *pCon, SicsInterp *pSics,
|
||||
int HMControlAction_ANSTO(SConnection *pCon, SicsInterp *pSics,
|
||||
void *pData, int argc, char *argv[])
|
||||
// This function extends HMControlAction by looking for an optional fifth
|
||||
// and sixth command argument, which are stored to the expanded command data.
|
||||
@ -147,7 +147,7 @@ int HMControlAction_ANSTO(SConnection *pCon, SicsInterp *pSics,
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
int MakeHMControl_ANSTO(SConnection *pCon, SicsInterp *pSics,
|
||||
int MakeHMControl_ANSTO(SConnection *pCon, SicsInterp *pSics,
|
||||
void *pData, int argc, char *argv[])
|
||||
{
|
||||
/* Start by making a plain vanilla HMControl object, */
|
||||
|
@ -3,18 +3,18 @@
|
||||
|
||||
A module creating a slightly modified HMControl object suitable for the
|
||||
ANSTO HM. This works exactly the same as the existing HMControl, but
|
||||
has extra options (e.g. pausing HM's at the end of a count instead of
|
||||
has extra options (e.g. pausing HM's at the end of a count instead of
|
||||
stopping them).
|
||||
|
||||
copyright: see copyright.h
|
||||
|
||||
|
||||
Mark Lesha, October 2006
|
||||
-------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef HMCONTROL_ANSTO_H_
|
||||
#define HMCONTROL_ANSTO_H_
|
||||
|
||||
typedef struct
|
||||
typedef struct
|
||||
{
|
||||
/* Data of the original HMControl object */
|
||||
HMcontrol hmc;
|
||||
@ -23,7 +23,7 @@ typedef struct
|
||||
int Termination_Object;
|
||||
} HMcontrol_ANSTO, *pHMcontrol_ANSTO;
|
||||
|
||||
int MakeHMControl_ANSTO(SConnection *pCon, SicsInterp *pSics,
|
||||
int MakeHMControl_ANSTO(SConnection *pCon, SicsInterp *pSics,
|
||||
void *pData, int argc, char *argv[]);
|
||||
|
||||
#endif /*HMCONTROL_ANSTO_H_*/
|
||||
|
@ -1,11 +1,11 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
I T C 4
|
||||
|
||||
|
||||
This is the implementation for a ITC4 object derived from an more general
|
||||
environment controller.
|
||||
|
||||
|
||||
Mark Koennecke, August 1997
|
||||
|
||||
|
||||
Copyright:
|
||||
|
||||
Labor fuer Neutronenstreuung
|
||||
@ -56,15 +56,15 @@
|
||||
int ITC4SetPar(pEVControl self, char *name, float fNew, SConnection *pCon)
|
||||
{
|
||||
int iRet;
|
||||
|
||||
|
||||
/* check authorsisation */
|
||||
if(!SCMatchRights(pCon,usUser))
|
||||
{
|
||||
SCWrite(pCon,"ERROR: you are not authorised to change this parameter",
|
||||
eError);
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* just catch those three names which we understand */
|
||||
if(strcmp(name,"sensor") == 0)
|
||||
{
|
||||
@ -164,7 +164,7 @@
|
||||
{
|
||||
int iRet;
|
||||
float fDiv;
|
||||
|
||||
|
||||
/* just catch those two names which we understand */
|
||||
if(strcmp(name,"sensor") == 0)
|
||||
{
|
||||
@ -204,7 +204,7 @@
|
||||
{
|
||||
char pBueffel[132];
|
||||
int iRet;
|
||||
|
||||
|
||||
iRet = EVCList(self,pCon);
|
||||
sprintf(pBueffel,"%s.sensor = %d\n",self->pName,
|
||||
GetSensorITC4(self->pDriv));
|
||||
@ -221,7 +221,7 @@
|
||||
sprintf(pBueffel,"%s.multiplicator = %f\n",self->pName,
|
||||
GetMultITC4(self->pDriv));
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
return iRet;
|
||||
return iRet;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int ITC4Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
@ -232,17 +232,17 @@
|
||||
int iRet;
|
||||
double fNum;
|
||||
float fVal;
|
||||
|
||||
|
||||
self = (pEVControl)pData;
|
||||
assert(self);
|
||||
assert(pCon);
|
||||
assert(pSics);
|
||||
|
||||
|
||||
if(argc < 2)
|
||||
{
|
||||
return EVControlWrapper(pCon,pSics,pData,argc,argv);
|
||||
}
|
||||
|
||||
|
||||
strtolower(argv[1]);
|
||||
if((strcmp(argv[1],"sensor") == 0) || (strcmp(argv[1],"control") == 0) ||
|
||||
(strcmp(argv[1],"timeout") == 0) || (strcmp(argv[1],"divisor") == 0) ||
|
||||
@ -256,7 +256,7 @@
|
||||
sprintf(pBueffel,"ERROR: expected number, got %s",argv[2]);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return ITC4SetPar(self,argv[1],(float)fNum,pCon);
|
||||
}
|
||||
else /* get case */
|
||||
@ -269,7 +269,7 @@
|
||||
}
|
||||
}
|
||||
else if(strcmp(argv[1],"list") == 0)
|
||||
{
|
||||
{
|
||||
return ITCList(self,pCon);
|
||||
}
|
||||
else
|
||||
@ -277,5 +277,5 @@
|
||||
return EVControlWrapper(pCon,pSics,pData,argc,argv);
|
||||
}
|
||||
/* not reached */
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
ITC 4
|
||||
|
||||
|
||||
Support for Oxford Instruments ITC4 Temperature controllers for SICS.
|
||||
The meaning and working of the functions defined is as desribed for a
|
||||
general environment controller.
|
||||
@ -33,11 +33,11 @@
|
||||
|
||||
int ITC4Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]);
|
||||
int ITC4SetPar(pEVControl self, char *name, float fNew,
|
||||
int ITC4SetPar(pEVControl self, char *name, float fNew,
|
||||
SConnection *pCon);
|
||||
int ITC4GetPar(pEVControl self, char *name, float *fVal);
|
||||
int ITCList(pEVControl self, SConnection *pCon);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -3,11 +3,11 @@ SINQ makes heavy use of Oxford Instruments ITC4 temperature controllers. In
|
||||
order to support them the following software components had to be defined in
|
||||
addition to the basic environmet controller interfaces:
|
||||
\begin{itemize}
|
||||
\item ITC4driver, naturally.
|
||||
\item ITC4driver, naturally.
|
||||
\item A ITC4-controller object as derivation of environment controller. ITC4
|
||||
's allow you to select a sensor which you read as your standard sensor and a
|
||||
sensor which is used for automatic control. The ITC4 controller object adds
|
||||
just that additional functionality to the statndard environment controller.
|
||||
just that additional functionality to the statndard environment controller.
|
||||
\end{itemize}
|
||||
The additional data, the selection of sensors, will be kept in the driver.
|
||||
This serves also an example for implementing inheritance without C++.
|
||||
@ -30,13 +30,13 @@ The driver interface:
|
||||
@}
|
||||
|
||||
The ConfigITC4 is special. It has to be called to commit changes to the
|
||||
driver read and control parameters.
|
||||
driver read and control parameters.
|
||||
|
||||
The ITC4 object interface:
|
||||
@d itco @{
|
||||
int ITC4Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]);
|
||||
int ITC4SetPar(pEVControl self, char *name, float fNew,
|
||||
int ITC4SetPar(pEVControl self, char *name, float fNew,
|
||||
SConnection *pCon);
|
||||
int ITC4GetPar(pEVControl self, char *name, float *fVal);
|
||||
int ITCList(pEVControl self, SConnection *pCon);
|
||||
@ -52,7 +52,7 @@ functions described above are just needed to implement the extra parameters.
|
||||
@o itc4.h @{
|
||||
/*-------------------------------------------------------------------------
|
||||
ITC 4
|
||||
|
||||
|
||||
Support for Oxford Instruments ITC4 Temperature controllers for SICS.
|
||||
The meaning and working of the functions defined is as desribed for a
|
||||
general environment controller.
|
||||
@ -69,6 +69,6 @@ functions described above are just needed to implement the extra parameters.
|
||||
/*------------------------- The ITC4 object ------------------------------*/
|
||||
@<itco@>
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@}
|
||||
|
@ -1,10 +1,10 @@
|
||||
/*--------------------------------------------------------------------------
|
||||
I T C 4 D R I V
|
||||
|
||||
This file contains the implementation of a driver for the Oxford
|
||||
This file contains the implementation of a driver for the Oxford
|
||||
Instruments ITC4 Temperature controller.
|
||||
|
||||
|
||||
|
||||
Mark Koennecke, Juli 1997
|
||||
|
||||
Copyright:
|
||||
@ -49,7 +49,7 @@
|
||||
|
||||
typedef struct __EVDriver *pEVDriver;
|
||||
|
||||
#include <evdriver.i>
|
||||
#include <evdriver.i>
|
||||
/* Do we need these ?
|
||||
#include <sics.h>
|
||||
#include <modriv.h>
|
||||
@ -64,8 +64,8 @@
|
||||
|
||||
pEVDriver CreateITC4Driver(int argc, char *argv[]);
|
||||
int ConfigITC4(pEVDriver self);
|
||||
|
||||
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
typedef struct {
|
||||
pITC4 pData;
|
||||
@ -84,12 +84,12 @@
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv)self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
iRet = ITC4_Read(&pMe->pData,fPos);
|
||||
|
||||
iRet = ITC4_Read(&pMe->pData,fPos);
|
||||
if(iRet != 1 )
|
||||
{
|
||||
pMe->iLastError = iRet;
|
||||
@ -102,13 +102,13 @@
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int ITC4Run(pEVDriver self, float fVal)
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -125,7 +125,7 @@
|
||||
static int ITC4Error(pEVDriver self, int *iCode, char *error, int iErrLen)
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv)self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -137,7 +137,7 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
ITC4_ErrorTxt(&pMe->pData,pMe->iLastError,error,iErrLen);
|
||||
ITC4_ErrorTxt(&pMe->pData,pMe->iLastError,error,iErrLen);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@ -146,7 +146,7 @@
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -159,13 +159,13 @@
|
||||
}
|
||||
return 1;
|
||||
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int ITC4Init(pEVDriver self)
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -182,29 +182,29 @@
|
||||
{
|
||||
pMe->iLastError = iRet;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int ITC4Close(pEVDriver self)
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
ITC4_Close(&pMe->pData);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int ITC4Fix(pEVDriver self, int iError)
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -230,11 +230,11 @@
|
||||
if(iRet)
|
||||
{
|
||||
return DEVREDO;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return DEVFAULT;
|
||||
}
|
||||
}
|
||||
break;
|
||||
/* handable protocoll errors */
|
||||
case EL734__BAD_TMO:
|
||||
@ -243,47 +243,47 @@
|
||||
case -501: /* Bad_COM */
|
||||
return DEVREDO;
|
||||
case -504: /* Badly formatted */
|
||||
return DEVREDO;
|
||||
return DEVREDO;
|
||||
default:
|
||||
return DEVFAULT;
|
||||
break;
|
||||
break;
|
||||
}
|
||||
return DEVFAULT;
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int ITC4Halt(pEVDriver *self)
|
||||
{
|
||||
assert(self);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
void KillITC4(void *pData)
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
|
||||
|
||||
pMe = (pITC4Driv)pData;
|
||||
assert(pMe);
|
||||
|
||||
|
||||
if(pMe->pHost)
|
||||
{
|
||||
free(pMe->pHost);
|
||||
}
|
||||
free(pMe);
|
||||
}
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
pEVDriver CreateITC4Driver(int argc, char *argv[])
|
||||
{
|
||||
pEVDriver pNew = NULL;
|
||||
pITC4Driv pSim = NULL;
|
||||
|
||||
|
||||
/* check for arguments */
|
||||
if(argc < 3)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
pNew = CreateEVDriver(argc,argv);
|
||||
pSim = (pITC4Driv)malloc(sizeof(ITC4Driv));
|
||||
memset(pSim,0,sizeof(ITC4Driv));
|
||||
@ -293,7 +293,7 @@
|
||||
}
|
||||
pNew->pPrivate = pSim;
|
||||
pNew->KillPrivate = KillITC4;
|
||||
|
||||
|
||||
/* initalise pITC4Driver */
|
||||
pSim->iControl = atoi(argv[2]);
|
||||
pSim->iRead = atoi(argv[1]);
|
||||
@ -304,8 +304,8 @@
|
||||
pSim->pHost = strdup(argv[0]);
|
||||
pSim->iPort = 0;
|
||||
pSim->iChannel = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
/* initialise function pointers */
|
||||
pNew->SetValue = ITC4Run;
|
||||
pNew->GetValue = GetITC4Pos;
|
||||
@ -314,20 +314,20 @@
|
||||
pNew->TryFixIt = ITC4Fix;
|
||||
pNew->Init = ITC4Init;
|
||||
pNew->Close = ITC4Close;
|
||||
|
||||
return pNew;
|
||||
}
|
||||
|
||||
return pNew;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int ConfigITC4(pEVDriver self)
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
iRet = ITC4_Config(&pMe->pData, pMe->iTmo, pMe->iRead,
|
||||
iRet = ITC4_Config(&pMe->pData, pMe->iTmo, pMe->iRead,
|
||||
pMe->iControl,pMe->fDiv,pMe->fMult);
|
||||
if(iRet < 0)
|
||||
{
|
||||
@ -341,7 +341,7 @@
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -349,7 +349,7 @@
|
||||
if( (iSensor < 1) || (iSensor > 4) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
pMe->iRead = iSensor;
|
||||
pMe->pData->iRead = iSensor;
|
||||
return 1;
|
||||
@ -359,7 +359,7 @@
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -367,7 +367,7 @@
|
||||
if( (iSensor < 1) || (iSensor > 4) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
pMe->iControl = iSensor;
|
||||
pMe->pData->iControl = iSensor;
|
||||
return 1;
|
||||
@ -377,7 +377,7 @@
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -385,7 +385,7 @@
|
||||
if(iSensor < 10)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
pMe->iTmo = iSensor;
|
||||
return 1;
|
||||
}
|
||||
@ -394,7 +394,7 @@
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -406,7 +406,7 @@
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -418,7 +418,7 @@
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -430,7 +430,7 @@
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -442,7 +442,7 @@
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -455,7 +455,7 @@
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -467,7 +467,7 @@
|
||||
{
|
||||
pITC4Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pITC4Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -475,4 +475,4 @@
|
||||
pMe->fMult = fDiv;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
L A K E S H O R E 3 4 0
|
||||
|
||||
|
||||
This is the implementation for a LAKESHORE340 object derived from a more general
|
||||
environment controller.
|
||||
|
||||
|
||||
Mark Koennecke, August 1997
|
||||
Mark Lesha, January 2006 (based on ITC4 code)
|
||||
|
||||
|
||||
Copyright:
|
||||
|
||||
Labor fuer Neutronenstreuung
|
||||
@ -57,15 +57,15 @@
|
||||
int LAKESHORE340SetPar(pEVControl self, char *name, float fNew, SConnection *pCon)
|
||||
{
|
||||
int iRet;
|
||||
|
||||
|
||||
/* check authorisation */
|
||||
if(!SCMatchRights(pCon,usUser))
|
||||
{
|
||||
SCWrite(pCon,"ERROR: you are not authorised to change this parameter",
|
||||
eError);
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* just catch those three names which we understand */
|
||||
if(strcmp(name,"sensor") == 0)
|
||||
{
|
||||
@ -167,7 +167,7 @@
|
||||
{
|
||||
int iRet;
|
||||
float fDiv;
|
||||
|
||||
|
||||
/* just catch those two names which we understand */
|
||||
if(strcmp(name,"sensor") == 0)
|
||||
{
|
||||
@ -207,7 +207,7 @@
|
||||
{
|
||||
char pBueffel[132];
|
||||
int iRet;
|
||||
|
||||
|
||||
iRet = EVCList(self,pCon);
|
||||
sprintf(pBueffel,"%s.sensor = %d\n",self->pName,
|
||||
GetSensorLAKESHORE340(self->pDriv));
|
||||
@ -224,7 +224,7 @@
|
||||
sprintf(pBueffel,"%s.multiplicator = %f\n",self->pName,
|
||||
GetMultLAKESHORE340(self->pDriv));
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
return iRet;
|
||||
return iRet;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int LAKESHORE340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
@ -235,17 +235,17 @@
|
||||
int iRet;
|
||||
double fNum;
|
||||
float fVal;
|
||||
|
||||
|
||||
self = (pEVControl)pData;
|
||||
assert(self);
|
||||
assert(pCon);
|
||||
assert(pSics);
|
||||
|
||||
|
||||
if(argc < 2)
|
||||
{
|
||||
return EVControlWrapper(pCon,pSics,pData,argc,argv);
|
||||
}
|
||||
|
||||
|
||||
strtolower(argv[1]);
|
||||
if((strcmp(argv[1],"sensor") == 0) || (strcmp(argv[1],"control") == 0) ||
|
||||
(strcmp(argv[1],"timeout") == 0) || (strcmp(argv[1],"divisor") == 0) ||
|
||||
@ -259,7 +259,7 @@
|
||||
sprintf(pBueffel,"ERROR: expected number, got %s",argv[2]);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return LAKESHORE340SetPar(self,argv[1],(float)fNum,pCon);
|
||||
}
|
||||
else /* get case */
|
||||
@ -272,7 +272,7 @@
|
||||
}
|
||||
}
|
||||
else if(strcmp(argv[1],"list") == 0)
|
||||
{
|
||||
{
|
||||
return LAKESHORE340List(self,pCon);
|
||||
}
|
||||
else
|
||||
@ -280,5 +280,5 @@
|
||||
return EVControlWrapper(pCon,pSics,pData,argc,argv);
|
||||
}
|
||||
/* not reached */
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
LAKESHORE 340
|
||||
|
||||
|
||||
Support for Lakeshore 340 Temperature controllers for SICS.
|
||||
The meaning and working of the functions defined is as desribed for a
|
||||
general environment controller.
|
||||
@ -39,11 +39,11 @@
|
||||
|
||||
int LAKESHORE340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]);
|
||||
int LAKESHORE340SetPar(pEVControl self, char *name, float fNew,
|
||||
int LAKESHORE340SetPar(pEVControl self, char *name, float fNew,
|
||||
SConnection *pCon);
|
||||
int LAKESHORE340GetPar(pEVControl self, char *name, float *fVal);
|
||||
int LAKESHORE340List(pEVControl self, SConnection *pCon);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
L H 4 5
|
||||
|
||||
|
||||
This is the implementation for a LH45 object derived from an more general
|
||||
environment controller.
|
||||
|
||||
|
||||
Mark Koennecke, August 1997
|
||||
Mark Lesha, January 2006 (based on ITC4 code)
|
||||
|
||||
|
||||
Copyright:
|
||||
|
||||
Labor fuer Neutronenstreuung
|
||||
@ -57,15 +57,15 @@
|
||||
int LH45SetPar(pEVControl self, char *name, float fNew, SConnection *pCon)
|
||||
{
|
||||
int iRet;
|
||||
|
||||
|
||||
/* check authorsisation */
|
||||
if(!SCMatchRights(pCon,usUser))
|
||||
{
|
||||
SCWrite(pCon,"ERROR: you are not authorised to change this parameter",
|
||||
eError);
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* just catch those three names which we understand */
|
||||
if(strcmp(name,"sensor") == 0)
|
||||
{
|
||||
@ -167,7 +167,7 @@
|
||||
{
|
||||
int iRet;
|
||||
float fDiv;
|
||||
|
||||
|
||||
/* just catch those two names which we understand */
|
||||
if(strcmp(name,"sensor") == 0)
|
||||
{
|
||||
@ -207,7 +207,7 @@
|
||||
{
|
||||
char pBueffel[132];
|
||||
int iRet;
|
||||
|
||||
|
||||
iRet = EVCList(self,pCon);
|
||||
sprintf(pBueffel,"%s.sensor = %d\n",self->pName,
|
||||
GetSensorLH45(self->pDriv));
|
||||
@ -224,7 +224,7 @@
|
||||
sprintf(pBueffel,"%s.multiplicator = %f\n",self->pName,
|
||||
GetMultLH45(self->pDriv));
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
return iRet;
|
||||
return iRet;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int LH45Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
@ -235,17 +235,17 @@
|
||||
int iRet;
|
||||
double fNum;
|
||||
float fVal;
|
||||
|
||||
|
||||
self = (pEVControl)pData;
|
||||
assert(self);
|
||||
assert(pCon);
|
||||
assert(pSics);
|
||||
|
||||
|
||||
if(argc < 2)
|
||||
{
|
||||
return EVControlWrapper(pCon,pSics,pData,argc,argv);
|
||||
}
|
||||
|
||||
|
||||
strtolower(argv[1]);
|
||||
if((strcmp(argv[1],"sensor") == 0) || (strcmp(argv[1],"control") == 0) ||
|
||||
(strcmp(argv[1],"timeout") == 0) || (strcmp(argv[1],"divisor") == 0) ||
|
||||
@ -259,7 +259,7 @@
|
||||
sprintf(pBueffel,"ERROR: expected number, got %s",argv[2]);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return LH45SetPar(self,argv[1],(float)fNum,pCon);
|
||||
}
|
||||
else /* get case */
|
||||
@ -272,7 +272,7 @@
|
||||
}
|
||||
}
|
||||
else if(strcmp(argv[1],"list") == 0)
|
||||
{
|
||||
{
|
||||
return LH45List(self,pCon);
|
||||
}
|
||||
else
|
||||
@ -280,5 +280,5 @@
|
||||
return EVControlWrapper(pCon,pSics,pData,argc,argv);
|
||||
}
|
||||
/* not reached */
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
LH 45
|
||||
|
||||
|
||||
Support for Julabo LH45 Temperature controllers for SICS.
|
||||
The meaning and working of the functions defined is as desribed for a
|
||||
general environment controller.
|
||||
@ -39,11 +39,11 @@
|
||||
|
||||
int LH45Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]);
|
||||
int LH45SetPar(pEVControl self, char *name, float fNew,
|
||||
int LH45SetPar(pEVControl self, char *name, float fNew,
|
||||
SConnection *pCon);
|
||||
int LH45GetPar(pEVControl self, char *name, float *fVal);
|
||||
int LH45List(pEVControl self, SConnection *pCon);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
This file contains the implementation of a driver for the Julabo
|
||||
LH45 Temperature controller.
|
||||
|
||||
|
||||
|
||||
Mark Koennecke, Juli 1997
|
||||
Mark Lesha, January 2006 (based on ITC4 code)
|
||||
|
||||
@ -50,7 +50,7 @@
|
||||
|
||||
typedef struct __EVDriver *pEVDriver;
|
||||
|
||||
#include <evdriver.i>
|
||||
#include <evdriver.i>
|
||||
/* Do we need these ?
|
||||
#include <sics.h>
|
||||
#include <modriv.h>
|
||||
@ -65,8 +65,8 @@
|
||||
|
||||
pEVDriver CreateLH45Driver(int argc, char *argv[]);
|
||||
int ConfigLH45(pEVDriver self);
|
||||
|
||||
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
typedef struct {
|
||||
pLH45 pData;
|
||||
@ -85,12 +85,12 @@
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv)self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
iRet = LH45_Read(&pMe->pData,fPos);
|
||||
|
||||
iRet = LH45_Read(&pMe->pData,fPos);
|
||||
if(iRet <= 0 )
|
||||
{
|
||||
pMe->iLastError = iRet;
|
||||
@ -103,13 +103,13 @@
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int LH45Run(pEVDriver self, float fVal)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -126,7 +126,7 @@
|
||||
static int LH45Error(pEVDriver self, int *iCode, char *error, int iErrLen)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv)self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -138,7 +138,7 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
LH45_ErrorTxt(&pMe->pData,pMe->iLastError,error,iErrLen);
|
||||
LH45_ErrorTxt(&pMe->pData,pMe->iLastError,error,iErrLen);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@ -147,7 +147,7 @@
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -160,13 +160,13 @@
|
||||
}
|
||||
return 1;
|
||||
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int LH45Init(pEVDriver self)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -183,28 +183,28 @@
|
||||
{
|
||||
pMe->iLastError = iRet;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int LH45Close(pEVDriver self)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
LH45_Close(&pMe->pData);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int LH45Fix(pEVDriver self, int iError)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -230,11 +230,11 @@
|
||||
if(iRet)
|
||||
{
|
||||
return DEVREDO;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return DEVFAULT;
|
||||
}
|
||||
}
|
||||
break;
|
||||
/* handable protocoll errors */
|
||||
case EL734__BAD_TMO:
|
||||
@ -243,47 +243,47 @@
|
||||
case -501: /* Bad_COM */
|
||||
return DEVREDO;
|
||||
case -504: /* Badly formatted */
|
||||
return DEVREDO;
|
||||
return DEVREDO;
|
||||
default:
|
||||
return DEVFAULT;
|
||||
break;
|
||||
break;
|
||||
}
|
||||
return DEVFAULT;
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
// static int LH45Halt(pEVDriver *self)
|
||||
// {
|
||||
// assert(self);
|
||||
//
|
||||
//
|
||||
// return 1;
|
||||
// }
|
||||
/*------------------------------------------------------------------------*/
|
||||
void KillLH45(void *pData)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
|
||||
|
||||
pMe = (pLH45Driv)pData;
|
||||
assert(pMe);
|
||||
|
||||
|
||||
if(pMe->pHost)
|
||||
{
|
||||
free(pMe->pHost);
|
||||
}
|
||||
free(pMe);
|
||||
}
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
pEVDriver CreateLH45Driver(int argc, char *argv[])
|
||||
{
|
||||
pEVDriver pNew = NULL;
|
||||
pLH45Driv pSim = NULL;
|
||||
|
||||
|
||||
/* check for arguments */
|
||||
if(argc < 3)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
pNew = CreateEVDriver(argc,argv);
|
||||
pSim = (pLH45Driv)malloc(sizeof(LH45Driv));
|
||||
memset(pSim,0,sizeof(LH45Driv));
|
||||
@ -293,23 +293,23 @@
|
||||
}
|
||||
pNew->pPrivate = pSim;
|
||||
pNew->KillPrivate = KillLH45;
|
||||
|
||||
|
||||
/* initalise pLH45Driver */
|
||||
pSim->iControl = atoi(argv[2]);
|
||||
pSim->iRead = atoi(argv[1]);
|
||||
pSim->iLastError = 0;
|
||||
pSim->iTmo = 10;
|
||||
|
||||
|
||||
/* The LH45 doesn't require divisors or multipliers
|
||||
and they are always forced to 1.0 */
|
||||
pSim->fDiv = 1.0;
|
||||
pSim->fMult = 1.0;
|
||||
|
||||
|
||||
pSim->pHost = strdup(argv[0]);
|
||||
pSim->iPort = 0;
|
||||
pSim->iChannel = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
/* initialise function pointers */
|
||||
pNew->SetValue = LH45Run;
|
||||
pNew->GetValue = GetLH45Pos;
|
||||
@ -318,20 +318,20 @@
|
||||
pNew->TryFixIt = LH45Fix;
|
||||
pNew->Init = LH45Init;
|
||||
pNew->Close = LH45Close;
|
||||
|
||||
return pNew;
|
||||
}
|
||||
|
||||
return pNew;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int ConfigLH45(pEVDriver self)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
iRet = LH45_Config(&pMe->pData, pMe->iTmo, pMe->iRead,
|
||||
iRet = LH45_Config(&pMe->pData, pMe->iTmo, pMe->iRead,
|
||||
pMe->iControl,pMe->fDiv,pMe->fMult);
|
||||
if(iRet < 0)
|
||||
{
|
||||
@ -344,17 +344,17 @@
|
||||
int SetSensorLH45(pEVDriver self, int iSensor)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
|
||||
/* The LH45 allows bath temp, external temp and tank temp to be read
|
||||
so allow iRead=1 to 3 for each of these respectively */
|
||||
if( (iSensor < 1) || (iSensor > 3) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
pMe->iRead = iSensor;
|
||||
pMe->pData->iRead = iSensor;
|
||||
return 1;
|
||||
@ -363,7 +363,7 @@
|
||||
int SetControlLH45(pEVDriver self, int iSensor)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -373,7 +373,7 @@
|
||||
if( (iSensor < 1) || (iSensor > 2) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
pMe->iControl = iSensor;
|
||||
pMe->pData->iControl = iSensor;
|
||||
return 1;
|
||||
@ -382,7 +382,7 @@
|
||||
int SetTMOLH45(pEVDriver self, int iSensor)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -390,7 +390,7 @@
|
||||
if(iSensor < 10)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
pMe->iTmo = iSensor;
|
||||
return 1;
|
||||
}
|
||||
@ -398,7 +398,7 @@
|
||||
int GetControlLH45(pEVDriver self)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -409,7 +409,7 @@
|
||||
int GetSensorLH45(pEVDriver self)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -420,7 +420,7 @@
|
||||
int GetTMOLH45(pEVDriver self)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -431,7 +431,7 @@
|
||||
float GetDivisorLH45(pEVDriver self)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -442,7 +442,7 @@
|
||||
int SetDivisorLH45(pEVDriver self, float fDiv)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -455,7 +455,7 @@
|
||||
float GetMultLH45(pEVDriver self)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -466,13 +466,13 @@
|
||||
int SetMultLH45(pEVDriver self, float fDiv)
|
||||
{
|
||||
pLH45Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pLH45Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
|
||||
/* The LH45 doesn't need multiplier, force to 1.0 */
|
||||
pMe->fMult = 1.0; /* fDiv */;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
LS340 - LAKESHORE340
|
||||
LS340 - LAKESHORE340
|
||||
Support for the Lakeshore 340 Temperature Controller
|
||||
|
||||
The meaning and working of the functions defined is as desribed for a
|
||||
@ -85,7 +85,7 @@ typedef struct ls340_s {
|
||||
float fValue; /* current temperature of control sensor in degrees K */
|
||||
float fTarget; /* requested target temperature */
|
||||
int iSettleTime; /* settling time (sec) */
|
||||
float fTolerance; /* settline tolerance level 0..100 */
|
||||
float fTolerance; /* settline tolerance level 0..100 */
|
||||
bool isLocked; /* changes no longer permitted */
|
||||
unsigned long ulIdleDelay; /* idle timer timeout duration in milliseconds */
|
||||
unsigned long ulIdlePollRate; /* idle timer timeout duration in milliseconds */
|
||||
@ -248,7 +248,7 @@ static void LS340State_Unknown(pStateMachine sm, pEvtEvent event) {
|
||||
do {
|
||||
pAsyncTxn pCmd = event->event.msg.cmd;
|
||||
pCmd->inp_buf[pCmd->inp_idx] = '\0';
|
||||
|
||||
|
||||
if (sm->mySubState == 1) {
|
||||
/* IDN Request */
|
||||
char* p = strchr(pCmd->inp_buf, '\r');
|
||||
@ -256,18 +256,18 @@ static void LS340State_Unknown(pStateMachine sm, pEvtEvent event) {
|
||||
char line[132];
|
||||
*p = '\0';
|
||||
sprintf(line, "IDN: %s", pCmd->inp_buf);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
}
|
||||
#if 0
|
||||
sprintf(cmd, "RANGE 0"); /* ensure heater is off */
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), NULL);
|
||||
#endif
|
||||
sprintf(cmd, "CSET %d, %s, 1, %d, 1", priv->iPidLoop, priv->cValidSensors[priv->iCtrlSens], priv->iHeaterStatus);
|
||||
sprintf(cmd, "CSET %d, %s, 1, %d, 1", priv->iPidLoop, priv->cValidSensors[priv->iCtrlSens], priv->iHeaterStatus);
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), NULL);
|
||||
|
||||
sprintf(cmd, "CLIMIT? %d", priv->iPidLoop);
|
||||
sprintf(cmd, "CLIMIT? %d", priv->iPidLoop);
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), fsm_msg_callback);
|
||||
|
||||
|
||||
sm->mySubState = 2;
|
||||
|
||||
return;
|
||||
@ -279,14 +279,14 @@ static void LS340State_Unknown(pStateMachine sm, pEvtEvent event) {
|
||||
if (p) {
|
||||
char line[132];
|
||||
*p = '\0';
|
||||
|
||||
|
||||
sprintf(line, "CLIMIT (Unknown): %s", pCmd->inp_buf);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
|
||||
sscanf(pCmd->inp_buf, "%f,%f,%f,%d,%d", &priv->fSetPointLimit, &priv->fPosSlope, &priv->fNegSlope, &priv->iMaxCurrent, &priv->iMaxRange);
|
||||
}
|
||||
|
||||
sprintf(cmd, "SETP? %d", priv->iPidLoop);
|
||||
sprintf(cmd, "SETP? %d", priv->iPidLoop);
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), fsm_msg_callback);
|
||||
sm->mySubState = 3;
|
||||
|
||||
@ -300,14 +300,14 @@ static void LS340State_Unknown(pStateMachine sm, pEvtEvent event) {
|
||||
if (p) {
|
||||
char line[132];
|
||||
*p = '\0';
|
||||
|
||||
|
||||
sprintf(line, "SETP: %s", pCmd->inp_buf);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
sscanf(pCmd->inp_buf, "%f", &priv->fSetPoint);
|
||||
priv->fTarget = priv->fSetPoint; /* Set target and setpoints to current values from controller */
|
||||
}
|
||||
|
||||
sprintf(cmd, "KRDG? %s", priv->cValidSensors[0]);
|
||||
sprintf(cmd, "KRDG? %s", priv->cValidSensors[0]);
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), fsm_msg_callback);
|
||||
sm->mySubState = 4;
|
||||
|
||||
@ -322,21 +322,21 @@ static void LS340State_Unknown(pStateMachine sm, pEvtEvent event) {
|
||||
*p = '\0';
|
||||
priv->fSensorValues[sm->mySubState-4] = atof(pCmd->inp_buf);
|
||||
|
||||
if (sm->mySubState-4 == priv->iCtrlSens) {
|
||||
if (sm->mySubState-4 == priv->iCtrlSens) {
|
||||
priv->fValue = priv->fSensorValues[sm->mySubState-4];
|
||||
}
|
||||
sprintf(line, "KRDG? (Unknown) sensor %s = %8.2f", priv->cValidSensors[sm->mySubState-4], priv->fSensorValues[sm->mySubState-4]);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
}
|
||||
|
||||
if (sm->mySubState >= priv->iNumSensors+3) {
|
||||
if (sm->mySubState >= priv->iNumSensors+3) {
|
||||
fsm_change_state(sm, LS340State_Idle);
|
||||
return;
|
||||
}
|
||||
sm->mySubState++;
|
||||
sprintf(cmd, "KRDG? %s", priv->cValidSensors[sm->mySubState-4]);
|
||||
sprintf(cmd, "KRDG? %s", priv->cValidSensors[sm->mySubState-4]);
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), fsm_msg_callback);
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
} while (0);
|
||||
@ -353,9 +353,9 @@ static void LS340State_Unknown(pStateMachine sm, pEvtEvent event) {
|
||||
}
|
||||
|
||||
static void LS340State_Idle(pStateMachine sm, pEvtEvent event){
|
||||
|
||||
|
||||
char cmd[CMDLEN];
|
||||
|
||||
|
||||
pEVDriver driv = (pEVDriver) sm->context;
|
||||
pLS340Driv priv = (pLS340Driv) driv->pPrivate;
|
||||
switch (event->event_type) {
|
||||
@ -367,7 +367,7 @@ static void LS340State_Idle(pStateMachine sm, pEvtEvent event){
|
||||
priv->ulIdleDelay,
|
||||
fsm_tmr_callback, sm);
|
||||
|
||||
sprintf(cmd, "CLIMIT? %d", priv->iPidLoop);
|
||||
sprintf(cmd, "CLIMIT? %d", priv->iPidLoop);
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), fsm_msg_callback);
|
||||
sm->mySubState = 1;
|
||||
|
||||
@ -383,15 +383,15 @@ static void LS340State_Idle(pStateMachine sm, pEvtEvent event){
|
||||
if (p) {
|
||||
char line[132];
|
||||
*p = '\0';
|
||||
|
||||
|
||||
sprintf(line, "CLIMIT (Idle): %s", pCmd->inp_buf);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
|
||||
sscanf(pCmd->inp_buf, "%f,%f,%f,%d,%d", &priv->fSetPointLimit, &priv->fPosSlope, &priv->fNegSlope, &priv->iMaxCurrent, &priv->iMaxRange);
|
||||
}
|
||||
|
||||
sm->mySubState++;
|
||||
|
||||
|
||||
} else if (sm->mySubState >= 2 && sm->mySubState <= priv->iNumSensors+1) {
|
||||
/* KRDG? Requests */
|
||||
char* p = strchr(pCmd->inp_buf, '\r');
|
||||
@ -401,7 +401,7 @@ static void LS340State_Idle(pStateMachine sm, pEvtEvent event){
|
||||
priv->fSensorValues[sm->mySubState-2] = atof(pCmd->inp_buf);
|
||||
if (sm->mySubState-2 == priv->iCtrlSens) priv->fValue = priv->fSensorValues[sm->mySubState-2];
|
||||
sprintf(line, "KRDG? (Idle) sensor %s = %8.2f", priv->cValidSensors[sm->mySubState-2], priv->fSensorValues[sm->mySubState-2]);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
}
|
||||
|
||||
if (sm->mySubState >= priv->iNumSensors+1) {
|
||||
@ -410,7 +410,7 @@ static void LS340State_Idle(pStateMachine sm, pEvtEvent event){
|
||||
}
|
||||
|
||||
sm->mySubState++;
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
} while (0);
|
||||
@ -418,10 +418,10 @@ static void LS340State_Idle(pStateMachine sm, pEvtEvent event){
|
||||
case eTimerEvent:
|
||||
priv->state_timer = NULL;
|
||||
|
||||
if (priv->controller) {
|
||||
if (priv->controller) {
|
||||
char line[132];
|
||||
sprintf(line, "LS340 eMode: = %d", priv->controller->eMode);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
|
||||
}
|
||||
|
||||
@ -437,19 +437,19 @@ static void LS340State_Idle(pStateMachine sm, pEvtEvent event){
|
||||
}
|
||||
if (priv->fTarget < priv->fSetPoint) {
|
||||
priv->fSetPoint = priv->fTarget; /* set the setpoint to be the target */
|
||||
|
||||
|
||||
priv->iHeaterStatus = 1;
|
||||
sprintf(cmd, "SETP %d, %8.2f", priv->iPidLoop, priv->fSetPoint); /* tell the Lakeshore to change the current setpoint to target */
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), NULL);
|
||||
fsm_change_state(sm, LS340State_Lowering);
|
||||
return;
|
||||
}
|
||||
if (sm->mySubState >= 2 && sm->mySubState <= priv->iNumSensors+1) {
|
||||
if (sm->mySubState >= 2 && sm->mySubState <= priv->iNumSensors+1) {
|
||||
char line[132];
|
||||
sprintf(cmd, "KRDG? %s", priv->cValidSensors[sm->mySubState-2]);
|
||||
sprintf(cmd, "KRDG? %s", priv->cValidSensors[sm->mySubState-2]);
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), fsm_msg_callback);
|
||||
sprintf(line, "eTimerEvent (Idle): Sent: %s", cmd);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
}
|
||||
|
||||
/* restart timer */
|
||||
@ -471,7 +471,7 @@ static void LS340State_Raising(pStateMachine sm, pEvtEvent event){
|
||||
char cmd[CMDLEN];
|
||||
|
||||
switch (event->event_type) {
|
||||
|
||||
|
||||
case eStateEvent:
|
||||
if (priv->state_timer)
|
||||
NetWatchRemoveTimer(priv->state_timer);
|
||||
@ -483,8 +483,8 @@ static void LS340State_Raising(pStateMachine sm, pEvtEvent event){
|
||||
|
||||
sprintf(cmd, "RANGE %d", priv->iRange); /* set the Range value > 0 turns heater on */
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), NULL);
|
||||
|
||||
sprintf(cmd, "CLIMIT? %d", priv->iPidLoop);
|
||||
|
||||
sprintf(cmd, "CLIMIT? %d", priv->iPidLoop);
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), fsm_msg_callback);
|
||||
sm->mySubState = 1;
|
||||
|
||||
@ -500,9 +500,9 @@ static void LS340State_Raising(pStateMachine sm, pEvtEvent event){
|
||||
if (p) {
|
||||
char line[132];
|
||||
*p = '\0';
|
||||
|
||||
|
||||
sprintf(line, "CLIMIT (Raising): %s", pCmd->inp_buf);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
|
||||
sscanf(pCmd->inp_buf, "%f,%f,%f,%d,%d", &priv->fSetPointLimit, &priv->fPosSlope, &priv->fNegSlope, &priv->iMaxCurrent, &priv->iMaxRange);
|
||||
}
|
||||
@ -510,7 +510,7 @@ static void LS340State_Raising(pStateMachine sm, pEvtEvent event){
|
||||
sm->mySubState++;
|
||||
|
||||
} else if (sm->mySubState >= 2 && sm->mySubState <= priv->iNumSensors+1) {
|
||||
|
||||
|
||||
/* KRDG? Requests */
|
||||
char* p = strchr(pCmd->inp_buf, '\r');
|
||||
if (p) {
|
||||
@ -519,12 +519,12 @@ static void LS340State_Raising(pStateMachine sm, pEvtEvent event){
|
||||
priv->fSensorValues[sm->mySubState-2] = atof(pCmd->inp_buf);
|
||||
if (sm->mySubState-2 == priv->iCtrlSens) priv->fValue = priv->fSensorValues[sm->mySubState-2];
|
||||
sprintf(line, "KRDG? (Raising) sensor %s = %8.2f", priv->cValidSensors[sm->mySubState-2], priv->fSensorValues[sm->mySubState-2]);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
|
||||
}
|
||||
|
||||
sm->mySubState++;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* restart timer */
|
||||
@ -544,17 +544,17 @@ static void LS340State_Raising(pStateMachine sm, pEvtEvent event){
|
||||
}
|
||||
if (priv->fTarget < priv->fSetPoint) {
|
||||
priv->fSetPoint = priv->fTarget; /* set the setpoint to be the target */
|
||||
|
||||
|
||||
sprintf(cmd, "SETP %d, %8.2f", priv->iPidLoop, priv->fSetPoint); /* tell the Lakeshore to change the current setpoint to target */
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), NULL);
|
||||
fsm_change_state(sm, LS340State_Lowering);
|
||||
return;
|
||||
}
|
||||
|
||||
if (sm->mySubState > priv->iNumSensors+1) sm->mySubState = 2;
|
||||
if (sm->mySubState > priv->iNumSensors+1) sm->mySubState = 2;
|
||||
|
||||
if (sm->mySubState >= 2 && sm->mySubState <= priv->iNumSensors+1) {
|
||||
sprintf(cmd, "KRDG? %s", priv->cValidSensors[sm->mySubState-2]);
|
||||
if (sm->mySubState >= 2 && sm->mySubState <= priv->iNumSensors+1) {
|
||||
sprintf(cmd, "KRDG? %s", priv->cValidSensors[sm->mySubState-2]);
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), fsm_msg_callback);
|
||||
}
|
||||
return;
|
||||
@ -569,12 +569,12 @@ static void LS340State_Raising(pStateMachine sm, pEvtEvent event){
|
||||
static void LS340State_Lowering(pStateMachine sm, pEvtEvent event){
|
||||
pEVDriver driv = (pEVDriver) sm->context;
|
||||
pLS340Driv priv = (pLS340Driv) driv->pPrivate;
|
||||
|
||||
|
||||
char cmd[CMDLEN];
|
||||
|
||||
|
||||
switch (event->event_type) {
|
||||
|
||||
|
||||
case eStateEvent:
|
||||
if (priv->state_timer)
|
||||
NetWatchRemoveTimer(priv->state_timer);
|
||||
@ -582,7 +582,7 @@ static void LS340State_Lowering(pStateMachine sm, pEvtEvent event){
|
||||
sprintf(cmd, "RANGE %d", priv->iRange); /* set the Range value > 0 turns heater on */
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), NULL);
|
||||
|
||||
sprintf(cmd, "CLIMIT? %d", priv->iPidLoop);
|
||||
sprintf(cmd, "CLIMIT? %d", priv->iPidLoop);
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), fsm_msg_callback);
|
||||
sm->mySubState = 1;
|
||||
|
||||
@ -598,9 +598,9 @@ static void LS340State_Lowering(pStateMachine sm, pEvtEvent event){
|
||||
if (p) {
|
||||
char line[132];
|
||||
*p = '\0';
|
||||
|
||||
|
||||
sprintf(line, "CLIMIT (lowering): %s", pCmd->inp_buf);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
|
||||
sscanf(pCmd->inp_buf, "%f,%f,%f,%d,%d", &priv->fSetPointLimit, &priv->fPosSlope, &priv->fNegSlope, &priv->iMaxCurrent, &priv->iMaxRange);
|
||||
}
|
||||
@ -608,9 +608,9 @@ static void LS340State_Lowering(pStateMachine sm, pEvtEvent event){
|
||||
sm->mySubState++;
|
||||
|
||||
} else if (sm->mySubState >= 2 && sm->mySubState <= priv->iNumSensors+1) {
|
||||
|
||||
|
||||
/* KRDG? Requests */
|
||||
|
||||
|
||||
char* p = strchr(pCmd->inp_buf, '\r');
|
||||
if (p) {
|
||||
char line[132];
|
||||
@ -618,12 +618,12 @@ static void LS340State_Lowering(pStateMachine sm, pEvtEvent event){
|
||||
priv->fSensorValues[sm->mySubState-2] = atof(pCmd->inp_buf);
|
||||
if (sm->mySubState-2 == priv->iCtrlSens) priv->fValue = priv->fSensorValues[sm->mySubState-2];
|
||||
sprintf(line, "KRDG? (Lowering) sensor %s = %8.2f", priv->cValidSensors[sm->mySubState-2], priv->fSensorValues[sm->mySubState-2]);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
|
||||
}
|
||||
|
||||
sm->mySubState++;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* restart timer */
|
||||
@ -643,18 +643,18 @@ static void LS340State_Lowering(pStateMachine sm, pEvtEvent event){
|
||||
if (priv->fTarget > priv->fSetPoint) {
|
||||
|
||||
priv->fSetPoint = priv->fTarget; /* set the setpoint to be the target */
|
||||
|
||||
|
||||
sprintf(cmd, "SETP %d, %8.2f", priv->iPidLoop, priv->fSetPoint); /* tell the Lakeshore to change the current setpoint to target */
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), NULL);
|
||||
|
||||
|
||||
fsm_change_state(sm, LS340State_Raising);
|
||||
return;
|
||||
}
|
||||
|
||||
if (sm->mySubState > priv->iNumSensors+1) sm->mySubState = 2;
|
||||
if (sm->mySubState > priv->iNumSensors+1) sm->mySubState = 2;
|
||||
|
||||
if (sm->mySubState >= 2 && sm->mySubState <= priv->iNumSensors+1) {
|
||||
sprintf(cmd, "KRDG? %s", priv->cValidSensors[sm->mySubState-2]);
|
||||
if (sm->mySubState >= 2 && sm->mySubState <= priv->iNumSensors+1) {
|
||||
sprintf(cmd, "KRDG? %s", priv->cValidSensors[sm->mySubState-2]);
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), fsm_msg_callback);
|
||||
}
|
||||
|
||||
@ -695,12 +695,12 @@ static int LS340SetValue( pEVDriver self, float fPos) {
|
||||
}
|
||||
|
||||
static int LS340Send(pEVDriver self, char *pCommand, char *pReply, int iLen) {
|
||||
|
||||
|
||||
int rsp_len;
|
||||
rsp_len = iLen;
|
||||
|
||||
|
||||
LS340_SendReceive(self->pPrivate, pCommand, strlen(pCommand), pReply, &rsp_len);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -853,12 +853,12 @@ static int LS340_PrepareTxn(pAsyncProtocol p, pAsyncTxn txn, const char* cmd, in
|
||||
}
|
||||
memcpy(txn->out_buf, cmd, cmd_len);
|
||||
txn->out_len = cmd_len;
|
||||
|
||||
|
||||
if (txn->out_buf[txn->out_len-1] != '\r') {
|
||||
txn->out_buf[txn->out_len++] = '\r';
|
||||
// txn->out_buf[txn->out_len++] = '\r';
|
||||
}
|
||||
|
||||
|
||||
// txn->out_buf[txn->out_len++] = '\0';
|
||||
return 1;
|
||||
}
|
||||
@ -883,11 +883,11 @@ pEVDriver CreateLS340Driver(int argc, char *argv[])
|
||||
|
||||
pEVDriver self = NULL;
|
||||
pLS340Driv priv = NULL;
|
||||
|
||||
|
||||
|
||||
/* tcl script eg: EvFactory new tc1 ls340 sertemp1 1 B
|
||||
* Argv[] entering CreateLS340Driver -
|
||||
* 0 -
|
||||
* 0 -
|
||||
*/
|
||||
|
||||
if (argc < 1)
|
||||
@ -933,17 +933,17 @@ pEVDriver CreateLS340Driver(int argc, char *argv[])
|
||||
priv->fsm.event_name = event_name;
|
||||
priv->name = strdup(argv[3]);
|
||||
priv->iPidLoop = atoi(argv[5]); /* PID Loop 1..2 */
|
||||
|
||||
|
||||
|
||||
if (argc < 7) return NULL;
|
||||
|
||||
strncpy(priv->cCtrlSensName, argv[6], strlen(argv[6])); /* control sensor name */
|
||||
if (strlen(priv->cCtrlSensName) > 0) {
|
||||
strncpy(priv->cValidSensors[0], priv->cCtrlSensName, strlen(priv->cCtrlSensName));
|
||||
strncpy(priv->cValidSensors[0], priv->cCtrlSensName, strlen(priv->cCtrlSensName));
|
||||
priv->iCtrlSens = 0;
|
||||
d++;
|
||||
}
|
||||
|
||||
|
||||
/* parse out valid sensor names from argv[7] */
|
||||
for (i = d; i < NUM_INPUT_SENSORS; i++) {
|
||||
priv->cValidSensors[i][0] = 'X'; /* clear the list, first */
|
||||
@ -958,19 +958,19 @@ pEVDriver CreateLS340Driver(int argc, char *argv[])
|
||||
cname[0] = argv[7][i];
|
||||
cname[1] = '\0';
|
||||
cname[2] = '\0';
|
||||
|
||||
|
||||
if (isdigit(argv[7][i+1]) > 0) {
|
||||
cname[1] = argv[7][i+1];
|
||||
i++;
|
||||
}
|
||||
|
||||
|
||||
v = 0;
|
||||
/* check to see if sensor is already in list */
|
||||
for (k = 0; k < NUM_INPUT_SENSORS; k++) {
|
||||
if (priv->cValidSensors[k][0] == cname[0]) {
|
||||
if (strcmp(priv->cValidSensors[k], cname) == 0) {
|
||||
v = 1;
|
||||
break; /* already in list, skip */
|
||||
break; /* already in list, skip */
|
||||
}
|
||||
/* C vs C2 */
|
||||
if (priv->cValidSensors[k][1] == '\0' && isdigit(cname[1]) > 0) {
|
||||
@ -985,12 +985,12 @@ pEVDriver CreateLS340Driver(int argc, char *argv[])
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
if (v == 0) { /* not in list, so add it in! */
|
||||
}
|
||||
if (v == 0) { /* not in list, so add it in! */
|
||||
strncpy(priv->cValidSensors[d], cname, strlen(cname));
|
||||
d++;
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
priv->iNumSensors = d; /* assign number of sensors found */
|
||||
@ -1032,12 +1032,12 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
{
|
||||
return EVControlWrapper(pCon,pSics,pData,argc,argv);
|
||||
}
|
||||
if (strcasecmp("send", argv[1]) == 0) {
|
||||
if (strcasecmp("send", argv[1]) == 0) {
|
||||
char cmd[CMDLEN];
|
||||
int cmd_len;
|
||||
char rsp[CMDLEN];
|
||||
int rsp_len;
|
||||
|
||||
|
||||
/* Managers only */
|
||||
if (!SCMatchRights(pCon, usMugger)) {
|
||||
return 0;
|
||||
@ -1054,7 +1054,7 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* assign control sensor index */
|
||||
if (strcasecmp("controlsensor", argv[1]) == 0) {
|
||||
char cmd[64];
|
||||
@ -1078,7 +1078,7 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
SCWrite(pCon, line, eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* swap control sensor locations from [0] */
|
||||
strncpy(cname, p, sizeof(cname));
|
||||
|
||||
@ -1092,8 +1092,8 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if (v > -1) { /* in list, swap values */
|
||||
float temp;
|
||||
|
||||
@ -1104,8 +1104,8 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
strcpy(priv->cValidSensors[v], priv->cCtrlSensName);
|
||||
|
||||
strcpy(priv->cCtrlSensName, cname);
|
||||
|
||||
sprintf(cmd, "CSET %d, %s, 1, %d, 1", priv->iPidLoop, priv->cValidSensors[priv->iCtrlSens], priv->iHeaterStatus);
|
||||
|
||||
sprintf(cmd, "CSET %d, %s, 1, %d, 1", priv->iPidLoop, priv->cValidSensors[priv->iCtrlSens], priv->iHeaterStatus);
|
||||
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), NULL);
|
||||
|
||||
@ -1138,27 +1138,27 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
char rsp[CMDLEN];
|
||||
snprintf(rsp, CMDLEN, "%s.setpoint = %8.2f", priv->name, priv->fSetPoint);
|
||||
SCWrite(pCon, rsp, eValue);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
if (strcasecmp("numsensors", argv[1]) == 0) {
|
||||
char rsp[CMDLEN];
|
||||
snprintf(rsp, CMDLEN, "%s.numsensors = %d", priv->name, priv->iNumSensors);
|
||||
SCWrite(pCon, rsp, eValue);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
if (strcasecmp("pollingrate", argv[1]) == 0) {
|
||||
char rsp[CMDLEN];
|
||||
if (argc > 2) {
|
||||
priv->ulIdlePollRate = (unsigned)atol(argv[2]);
|
||||
priv->ulIdlePollRate = (unsigned)atol(argv[2]);
|
||||
priv->ulIdleDelay = priv->ulIdlePollRate / priv->iNumSensors+1; /* +1 to include CLIMIT query */
|
||||
|
||||
|
||||
fsm_change_state(&priv->fsm, LS340State_Unknown);
|
||||
}
|
||||
}
|
||||
snprintf(rsp, CMDLEN, "%s.pollingrate = %lu", priv->name, priv->ulIdlePollRate);
|
||||
SCWrite(pCon, rsp, eValue);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -1166,7 +1166,7 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
char rsp[CMDLEN];
|
||||
char cmd[CMDLEN];
|
||||
if (argc > 2) {
|
||||
priv->iHeaterStatus = atoi(argv[2]);
|
||||
priv->iHeaterStatus = atoi(argv[2]);
|
||||
if (priv->iHeaterStatus == 1) { /* turn heater on */
|
||||
/* sprintf(cmd, "RANGE %d", priv->iRange);
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), NULL);
|
||||
@ -1175,10 +1175,10 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
sprintf(cmd, "RANGE 0"); /* turn heater off otherwise */
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
snprintf(rsp, CMDLEN, "%s.heateron = %d", priv->name, priv->iHeaterStatus);
|
||||
SCWrite(pCon, rsp, eValue);
|
||||
|
||||
|
||||
if (argc > 2) fsm_change_state(&priv->fsm, LS340State_Idle); /* move back to Idle state? */
|
||||
return 1;
|
||||
}
|
||||
@ -1186,16 +1186,16 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
char rsp[CMDLEN];
|
||||
char cmd[CMDLEN];
|
||||
if (argc > 2) {
|
||||
priv->iRange = atoi(argv[2]);
|
||||
priv->iRange = atoi(argv[2]);
|
||||
|
||||
if (priv->iRange > 0) priv->iHeaterStatus = 1;
|
||||
|
||||
sprintf(cmd, "RANGE %d", priv->iRange);
|
||||
LS340_SendCmd(priv, cmd, strlen(cmd), NULL);
|
||||
}
|
||||
}
|
||||
snprintf(rsp, CMDLEN, "%s.range = %d", priv->name, priv->iRange);
|
||||
SCWrite(pCon, rsp, eValue);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -1206,13 +1206,13 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
char rsp[CMDLEN];
|
||||
char senslist[132];
|
||||
char temp[132];
|
||||
|
||||
|
||||
strcpy(senslist, ""); /* prepare string */
|
||||
|
||||
for (i = 0; i < priv->iNumSensors; i++) {
|
||||
sprintf(temp, "sensor%s", priv->cValidSensors[i]);
|
||||
strcat(senslist, temp);
|
||||
if (i < priv->iNumSensors-1) strcat(senslist, ",");
|
||||
strcat(senslist, temp);
|
||||
if (i < priv->iNumSensors-1) strcat(senslist, ",");
|
||||
}
|
||||
|
||||
snprintf(rsp, CMDLEN, "%s.sensorlist = %s", priv->name, senslist);
|
||||
@ -1230,13 +1230,13 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
name[0] = '\0';
|
||||
name[1] = '\0';
|
||||
name[2] = '\0';
|
||||
|
||||
|
||||
if (strlen(argv[1]) == 7) { /* sensorA */
|
||||
name[0] = argv[1][6];
|
||||
name[0] = argv[1][6];
|
||||
}
|
||||
|
||||
if (strlen(argv[1]) == 8) { /* sensorC1 */
|
||||
name[0] = argv[1][6];
|
||||
name[0] = argv[1][6];
|
||||
name[1] = argv[1][7];
|
||||
}
|
||||
|
||||
@ -1261,12 +1261,12 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
char rsp[CMDLEN];
|
||||
char senslist[132];
|
||||
char temp[132];
|
||||
|
||||
|
||||
iRet = EVControlWrapper(pCon,pSics,pData,argc,argv);
|
||||
if (iRet) {
|
||||
if (iRet) {
|
||||
snprintf(rsp, CMDLEN, "%s.pidloop = %d", priv->name, priv->iPidLoop);
|
||||
SCWrite(pCon, rsp, eValue);
|
||||
|
||||
|
||||
snprintf(rsp, CMDLEN, "%s.controlsensor = sensor%s", priv->name, priv->cValidSensors[priv->iCtrlSens]);
|
||||
SCWrite(pCon, rsp, eValue);
|
||||
|
||||
@ -1277,8 +1277,8 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
|
||||
for (i = 0; i < priv->iNumSensors; i++) {
|
||||
sprintf(temp, "sensor%s", priv->cValidSensors[i]);
|
||||
strcat(senslist, temp);
|
||||
if (i < priv->iNumSensors-1) strcat(senslist, ",");
|
||||
strcat(senslist, temp);
|
||||
if (i < priv->iNumSensors-1) strcat(senslist, ",");
|
||||
}
|
||||
|
||||
snprintf(rsp, CMDLEN, "%s.sensorlist = %s", priv->name, senslist);
|
||||
@ -1294,7 +1294,7 @@ int LS340Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
SCWrite(pCon, rsp, eValue);
|
||||
snprintf(rsp, CMDLEN, "%s.setpoint = %8.2f", priv->name, priv->fSetPoint);
|
||||
SCWrite(pCon, rsp, eValue);
|
||||
|
||||
|
||||
snprintf(rsp, CMDLEN, "%s.target = %8.2f", priv->name, priv->fTarget);
|
||||
SCWrite(pCon, rsp, eValue);
|
||||
snprintf(rsp, CMDLEN, "%s.setpointlimit = %8.2f", priv->name, priv->fSetPointLimit);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
LS340 - LAKESHORE 340
|
||||
LS340 - LAKESHORE 340
|
||||
|
||||
Asynchronous state-machine based driver for controller LAKESHORE 340
|
||||
|
||||
|
@ -42,11 +42,11 @@ extern int DMC2280MotionControl;
|
||||
#define INST_READY_BIT (1 << 16)
|
||||
#define LAMP_TEST_BIT (1 << 17)
|
||||
|
||||
#define KEY_BOTH_BITS (KEY_ENABLED_BIT | KEY_DISABLED_BIT)
|
||||
#define SEC_BOTH_BITS (SEC_OPENED_BIT | SEC_CLOSED_BIT)
|
||||
#define TER_BOTH_BITS (TER_OPENED_BIT | TER_CLOSED_BIT)
|
||||
#define MOTOR_BOTH_BITS (MOTOR_ENABLED_BIT | MOTOR_DISABLED_BIT)
|
||||
#define ACCESS_BOTH_BITS (ACCESS_LOCKED_BIT | ACCESS_UNLOCKED_BIT)
|
||||
#define KEY_BOTH_BITS (KEY_ENABLED_BIT | KEY_DISABLED_BIT)
|
||||
#define SEC_BOTH_BITS (SEC_OPENED_BIT | SEC_CLOSED_BIT)
|
||||
#define TER_BOTH_BITS (TER_OPENED_BIT | TER_CLOSED_BIT)
|
||||
#define MOTOR_BOTH_BITS (MOTOR_ENABLED_BIT | MOTOR_DISABLED_BIT)
|
||||
#define ACCESS_BOTH_BITS (ACCESS_LOCKED_BIT | ACCESS_UNLOCKED_BIT)
|
||||
|
||||
static pAsyncProtocol LSS_Protocol = NULL;
|
||||
|
||||
@ -198,10 +198,10 @@ static mxml_type_t xmlLoadStringCallback(mxml_node_t *node) {
|
||||
|
||||
|
||||
sprintf(value, "NO VALUE");
|
||||
|
||||
|
||||
type = mxmlElementGetAttr(node, "type");
|
||||
|
||||
if (type == NULL)
|
||||
if (type == NULL)
|
||||
type = node->value.element.name;
|
||||
|
||||
|
||||
@ -215,10 +215,10 @@ static mxml_type_t xmlLoadStringCallback(mxml_node_t *node) {
|
||||
|
||||
if (myType == (MXML_INTEGER))
|
||||
sprintf(value, "%d", node->value.integer);
|
||||
|
||||
|
||||
if (myType == (MXML_TEXT))
|
||||
sprintf(value, "%s", "text");
|
||||
|
||||
|
||||
if (myType == (MXML_REAL))
|
||||
sprintf(value, "%f", node->value.real);
|
||||
|
||||
@ -226,14 +226,14 @@ static mxml_type_t xmlLoadStringCallback(mxml_node_t *node) {
|
||||
sprintf(value, "%s", node->value.opaque);
|
||||
|
||||
|
||||
/*
|
||||
/*
|
||||
if (node->value.text.string != NULL) {
|
||||
if (myType == (MXML_TEXT))
|
||||
snprintf(value, 132, "[%c]", node->value.text.string);
|
||||
}
|
||||
*/
|
||||
sprintf(line, "xmlLoadStringCallback: [%s] [%s] [%s] [%s] [%s] [%s]", node->value.element.name, type, mxmlElementGetAttr(node, "description"), mxmlElementGetAttr(node, "time"), mxmlElementGetAttr(node, "tag"), value);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
|
||||
return myType;
|
||||
}
|
||||
@ -266,7 +266,7 @@ static int GetCallback(pAsyncTxn txn)
|
||||
|
||||
|
||||
/* free memory from previous tree */
|
||||
if (tree) {
|
||||
if (tree) {
|
||||
mxmlDelete(tree);
|
||||
}
|
||||
|
||||
@ -295,7 +295,7 @@ static int MyOneShotCallback(void* context, int mode)
|
||||
{
|
||||
|
||||
char line[132];
|
||||
|
||||
|
||||
pLSSController self = (pLSSController) context;
|
||||
self->oneshot = 0;
|
||||
AsyncUnitSendTxn(self->unit, "WRITE 0", 7, NULL, NULL, 132);
|
||||
@ -316,7 +316,7 @@ static int MyTimerCallback(void* context, int mode)
|
||||
|
||||
/* disable READ-polling timer for now - wait for reply ... */
|
||||
NetWatchRemoveTimer(self->nw_tmr);
|
||||
|
||||
|
||||
|
||||
AsyncUnitSendTxn(self->unit, "READ", 4, GetCallback, self, 1024*1024);
|
||||
sprintf(line, "lssmonitor.c: MyTimerCallback() -> AsyncUnitSendTxn(READ 1MB)");
|
||||
@ -425,28 +425,28 @@ static int LSS_Action(SConnection *pCon, SicsInterp *pSics,
|
||||
return OKOK;
|
||||
}
|
||||
else if (argc == 2) {
|
||||
if (strcasecmp(argv[1], "list") == 0) {
|
||||
if (strcasecmp(argv[1], "list") == 0) {
|
||||
|
||||
current = tree;
|
||||
|
||||
|
||||
for (node = mxmlWalkNext(current, tree, MXML_DESCEND); node != NULL; node = mxmlWalkNext(node, tree, MXML_DESCEND)) {
|
||||
if (node->value.element.attrs) {
|
||||
if (node->value.element.attrs) {
|
||||
if (mxmlElementGetAttr(node, "version") == NULL) {
|
||||
|
||||
snprintf(line, 132, "%s.%s %s = %s (%s)", argv[0], mxmlElementGetAttr(node, "description"), mxmlElementGetAttr(node, "tag"), node->child->value.text.string, mxmlElementGetAttr(node, "time"));
|
||||
SCWrite(pCon, line, eLog);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return OKOK;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* search by sub string */
|
||||
if (findElement(pCon, argv[1]) > 0) {
|
||||
return OKOK;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(line, 132, "%s does not understand %s", argv[0], argv[1]);
|
||||
@ -480,13 +480,13 @@ static int LSS_Init(pLSSController self)
|
||||
NetWatchRemoveTimer(self->nw_tmr);
|
||||
|
||||
AsyncUnitSendTxn(self->unit, "READ", 4, GetCallback, self, 1024*1024);
|
||||
|
||||
/*
|
||||
|
||||
/*
|
||||
NetWatchRegisterTimerPeriodic(&self->nw_tmr,
|
||||
2000, 2000,
|
||||
MyTimerCallback,
|
||||
self);
|
||||
self->timeout=120000;
|
||||
self->timeout=120000;
|
||||
*/
|
||||
return 1;
|
||||
}
|
||||
@ -494,7 +494,7 @@ static int LSS_Init(pLSSController self)
|
||||
static void LSS_Kill(void* pData)
|
||||
{
|
||||
/* free memory from previous tree */
|
||||
if (tree) {
|
||||
if (tree) {
|
||||
mxmlDelete(tree);
|
||||
}
|
||||
|
||||
@ -537,10 +537,10 @@ int LSSFactory(SConnection *pCon, SicsInterp *pSics,
|
||||
}
|
||||
|
||||
/*
|
||||
create data structure and open port
|
||||
create data structure and open port
|
||||
*/
|
||||
pNew = LSS_Create(argv[2]);
|
||||
|
||||
|
||||
if(!pNew)
|
||||
{
|
||||
SCWrite(pCon,"ERROR: failed to create LSS in LSSFactory",eError);
|
||||
@ -553,7 +553,7 @@ int LSSFactory(SConnection *pCon, SicsInterp *pSics,
|
||||
sprintf(pError,"ERROR: failed to connect to %s",argv[2]);
|
||||
SCWrite(pCon,pError,eError);
|
||||
}
|
||||
/*
|
||||
/*
|
||||
for (i=0; i < sizeof(lss_parname)/sizeof(lss_parname[0]); i++) {
|
||||
lssVar = VarCreate(LSS_UserPriv,veText,lss_parname[i]);
|
||||
LSS_GetState(pNew,lss_parname[i],&lssState);
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*-----------------------------------------------------------------------------
|
||||
|
||||
Based on SINQ code 1996-2003 by Mark Koennecke
|
||||
|
||||
|
||||
Modifications: Paul Hathaway April 2004
|
||||
SimRun failure rate independent of polling rate
|
||||
Fault condition determined at initial drive command and reported
|
||||
@ -15,7 +15,7 @@
|
||||
|
||||
Instrument definition file usage:
|
||||
Motor motname ASIM lowerlimit upperlimit failpercent [speed]
|
||||
|
||||
|
||||
----------------------------------------------------------------------------*/
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
@ -41,11 +41,11 @@
|
||||
|
||||
/* ----------------------- Simulation -----------------------------------*/
|
||||
/* #ifndef SICS_ANSTO_MOTOR_ASIM */
|
||||
#define SICS_ANSTO_MOTOR_ASIM
|
||||
#define SICS_ANSTO_MOTOR_ASIM
|
||||
#define MAX_LONG 2147483647
|
||||
|
||||
/* device internal status and error codes */
|
||||
/* BUSY - motor in motion toward target
|
||||
/* BUSY - motor in motion toward target
|
||||
* IDLE - movement complete, normal condition
|
||||
* FAULT - no motion, motor awaiting reset
|
||||
* CRASH - no motion, unable to recover
|
||||
@ -61,9 +61,9 @@
|
||||
#define SETPOS "setpos"
|
||||
#define BUFFLEN 512
|
||||
|
||||
/* the first fields of ASIMDriv structure HAVE to be IDENTICAL to the
|
||||
/* the first fields of ASIMDriv structure HAVE to be IDENTICAL to the
|
||||
* abstract motor driver structure in modriv.h (motor_driver.h)
|
||||
*/
|
||||
*/
|
||||
|
||||
typedef struct ___MoDriv {
|
||||
/* general motor driver interface fields. REQUIRED! */
|
||||
@ -77,11 +77,11 @@ typedef struct ___MoDriv {
|
||||
int (*TryAndFixIt)(void *self,int iError, float fNew);
|
||||
int (*Halt)(void *self);
|
||||
int (*GetDriverPar)(void *self, char *name, float *value);
|
||||
int (*SetDriverPar)(void *self,SConnection *pCon, char *name,
|
||||
int (*SetDriverPar)(void *self,SConnection *pCon, char *name,
|
||||
float newValue);
|
||||
void (*ListDriverPar)(void *self, char *motorName, SConnection *pCon);
|
||||
void (*KillPrivate)(void *self);
|
||||
|
||||
|
||||
/* ASIM-specific fields */
|
||||
pMotor pMot; /**< Points to logical motor object */
|
||||
float fFailure; /* percent random failures */
|
||||
@ -150,7 +150,7 @@ static int SimStat(void *self);
|
||||
pDriv->iRunningTime += ((long)tD - pDriv->iLastPollTime);
|
||||
}
|
||||
pDriv->iLastPollTime = (long)tD;
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void UpdatePosition(ASIMDriv *pDriv)
|
||||
{
|
||||
@ -186,9 +186,9 @@ static int SimStat(void *self);
|
||||
case ASIM_FAULT:
|
||||
motCode = HWFault;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return motCode;
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int SimRun(void *self, float fVal)
|
||||
{
|
||||
@ -200,25 +200,25 @@ static int SimStat(void *self);
|
||||
float fDelta;
|
||||
float fDuration;
|
||||
time_t tD;
|
||||
|
||||
|
||||
assert(self);
|
||||
pDriv = (ASIMDriv *)self;
|
||||
|
||||
switch (pDriv->iStatus)
|
||||
{
|
||||
case ASIM_IDLE: pDriv->iStatus = ASIM_BUSY;
|
||||
case ASIM_BUSY: break;
|
||||
default: pDriv->iStatus = ASIM_CRASH;
|
||||
case ASIM_BUSY: break;
|
||||
default: pDriv->iStatus = ASIM_CRASH;
|
||||
case ASIM_CRASH:
|
||||
case ASIM_FAULT: return HWFault;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/* New run command */
|
||||
/* Determine desired distance and direction (fDiff >= 0.0)*/
|
||||
pDriv->fDestination = fVal;
|
||||
fDiff = fVal - pDriv->fPos;
|
||||
if(0.0 > fDiff)
|
||||
if(0.0 > fDiff)
|
||||
{
|
||||
fDiff = -fDiff;
|
||||
fDirection = -1.0;
|
||||
@ -231,7 +231,7 @@ static int SimStat(void *self);
|
||||
iSucceed = 1;
|
||||
else
|
||||
iSucceed = 0;
|
||||
|
||||
|
||||
/* Determine delta from actual target by fault mode */
|
||||
if (0 == iSucceed)
|
||||
{
|
||||
@ -242,14 +242,14 @@ static int SimStat(void *self);
|
||||
pDriv->iFaultType = ASIM_HW_FAULT;
|
||||
fDelta = -fDiff;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
if (TH_STALL_FAULT > fFault)
|
||||
if (TH_STALL_FAULT > fFault)
|
||||
{ /* stall before 80% complete */
|
||||
pDriv->iFaultType = ASIM_STALL_FAULT;
|
||||
fDelta = (-1.0) * fDiff * (0.2 + SimRandom()/125.0);
|
||||
}
|
||||
else
|
||||
else
|
||||
{ /* position fault to +/- 10% */
|
||||
pDriv->iFaultType = ASIM_POS_FAULT;
|
||||
fDelta = fDiff * SimRandom()/1000.0;
|
||||
@ -266,9 +266,9 @@ static int SimStat(void *self);
|
||||
/* Calculate target and time using speed */
|
||||
if (pDriv->fSpeed >= MIN_SPEED)
|
||||
{
|
||||
fDiff = fDiff + fDelta;
|
||||
fDiff = fDiff + fDelta;
|
||||
fDuration = fDiff/(pDriv->fSpeed);
|
||||
if (fDuration > MAX_LONG)
|
||||
if (fDuration > MAX_LONG)
|
||||
pDriv->iDuration = 2000000000;
|
||||
else
|
||||
pDriv->iDuration = (long)fDuration;
|
||||
@ -282,14 +282,14 @@ static int SimStat(void *self);
|
||||
pDriv->iRunningTime = 0;
|
||||
pDriv->iLastPollTime = time(&tD);
|
||||
pDriv->iTime = tD + pDriv->iDuration;
|
||||
|
||||
|
||||
if(ASIM_BUSY==pDriv->iStatus)
|
||||
return OKOK;
|
||||
else
|
||||
return HWFault;
|
||||
|
||||
} /* SimRun */
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
/* iErrLen fixed to 131 in fn [reportAndFixError] of <motor.c>
|
||||
* iCode reported to SimFix via [reportAndFixError]
|
||||
@ -298,27 +298,27 @@ static int SimStat(void *self);
|
||||
{
|
||||
int motCode = HWFault;
|
||||
ASIMDriv *pDriv;
|
||||
|
||||
|
||||
assert(self);
|
||||
pDriv = (ASIMDriv *)self;
|
||||
|
||||
switch (pDriv->iStatus)
|
||||
{
|
||||
case ASIM_IDLE: motCode = HWIdle; break;
|
||||
case ASIM_BUSY: motCode = HWBusy; break;
|
||||
case ASIM_BUSY: motCode = HWBusy; break;
|
||||
case ASIM_CRASH:
|
||||
case ASIM_FAULT:
|
||||
case ASIM_FAULT:
|
||||
default: motCode = HWFault; break;
|
||||
}
|
||||
|
||||
|
||||
*iCode = pDriv->iFaultType;
|
||||
|
||||
|
||||
switch (pDriv->iFaultType)
|
||||
{
|
||||
case ASIM_POS_FAULT:
|
||||
strncpy(error,"ERROR: ASIM Position Fault",iErrLen);
|
||||
break;
|
||||
case ASIM_NO_FAULT:
|
||||
case ASIM_NO_FAULT:
|
||||
strncpy(error,"STATUS: ASIM No Fault",iErrLen);
|
||||
break;
|
||||
case ASIM_HW_FAULT:
|
||||
@ -333,18 +333,18 @@ static int SimStat(void *self);
|
||||
}
|
||||
assert(strlen(error)<131);
|
||||
} /* SimError */
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int SimFix(void *self, int iError, float fNew)
|
||||
{
|
||||
ASIMDriv *pDriv;
|
||||
|
||||
assert(self);
|
||||
pDriv = (ASIMDriv *)self;
|
||||
|
||||
pDriv = (ASIMDriv *)self;
|
||||
|
||||
switch (pDriv->iStatus)
|
||||
{
|
||||
case ASIM_IDLE:
|
||||
case ASIM_IDLE:
|
||||
switch (pDriv->iFaultType)
|
||||
{
|
||||
case ASIM_POS_FAULT: return MOTOK;
|
||||
@ -354,11 +354,11 @@ static int SimStat(void *self);
|
||||
default: return MOTFAIL; /* error: unknown fault type */
|
||||
}
|
||||
break;
|
||||
case ASIM_BUSY: return MOTOK; break;
|
||||
case ASIM_BUSY: return MOTOK; break;
|
||||
case ASIM_CRASH: return MOTFAIL; break;
|
||||
case ASIM_FAULT:
|
||||
case ASIM_FAULT:
|
||||
SimHalt(self);
|
||||
if(TH_HW_FAULT >= SimRandom())
|
||||
if(TH_HW_FAULT >= SimRandom())
|
||||
{
|
||||
pDriv->iStatus = ASIM_CRASH;
|
||||
return MOTFAIL;
|
||||
@ -367,11 +367,11 @@ static int SimStat(void *self);
|
||||
pDriv->iFaultType = ASIM_NO_FAULT;
|
||||
return MOTOK;
|
||||
break;
|
||||
default:
|
||||
pDriv->iStatus = ASIM_CRASH;
|
||||
default:
|
||||
pDriv->iStatus = ASIM_CRASH;
|
||||
pDriv->iFaultType = ASIM_HW_FAULT;
|
||||
return MOTFAIL;
|
||||
}
|
||||
}
|
||||
/* SICSLogWrite("Attempt fix for simulated motor",eHWError); */
|
||||
} /* SimFix */
|
||||
|
||||
@ -381,7 +381,7 @@ static int SimStat(void *self);
|
||||
int motCode = OKOK;
|
||||
ASIMDriv *pDriv;
|
||||
assert(self);
|
||||
|
||||
|
||||
pDriv = (ASIMDriv *)self;
|
||||
UpdatePosition(pDriv);
|
||||
pDriv->iTime = 0;
|
||||
@ -406,7 +406,7 @@ static int SimStat(void *self);
|
||||
assert(self);
|
||||
pDriv = (ASIMDriv *)self;
|
||||
|
||||
UpdatePosition(pDriv);
|
||||
UpdatePosition(pDriv);
|
||||
switch (pDriv->iStatus)
|
||||
{
|
||||
case ASIM_BUSY: motCode = HWBusy; break;
|
||||
@ -438,7 +438,7 @@ static int SimSetPar(void *self, SConnection *pCon, char *name, float newValue)
|
||||
{
|
||||
pDriv->fSpeed = newValue;
|
||||
iSuccess = 1;
|
||||
}
|
||||
}
|
||||
return iSuccess;
|
||||
}
|
||||
|
||||
@ -473,7 +473,7 @@ static void SimListPar(void *self, char *motorName, SConnection *pCon)
|
||||
/* ASIMDriv *pDriv = (ASIMDriv *) self;
|
||||
char pBuffer[256];
|
||||
*/
|
||||
|
||||
|
||||
assert(self);
|
||||
assert(pCon);
|
||||
/* The logical motor does this for us
|
||||
@ -495,7 +495,7 @@ static void SimListPar(void *self, char *motorName, SConnection *pCon)
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
MotorDriver *CreateASIM(SConnection *pCon, char *motor, char *params)
|
||||
{
|
||||
@ -503,10 +503,10 @@ MotorDriver *CreateASIM(SConnection *pCon, char *motor, char *params)
|
||||
time_t tD;
|
||||
char *pPtr = NULL;
|
||||
Tcl_Interp *interp;
|
||||
|
||||
|
||||
assert(pCon);
|
||||
interp = InterpGetTcl(pServ->pSics);
|
||||
|
||||
|
||||
/* allocate memory */
|
||||
pDriv = (ASIMDriv *)malloc(sizeof(ASIMDriv));
|
||||
if(!pDriv)
|
||||
@ -531,13 +531,13 @@ MotorDriver *CreateASIM(SConnection *pCon, char *motor, char *params)
|
||||
}
|
||||
sscanf(pPtr,"%s",pDriv->units);
|
||||
pDriv->fFailure = 0;
|
||||
|
||||
|
||||
/* calculate current position, initialise func pters */
|
||||
pDriv->fPos = (pDriv->fUpper + pDriv->fLower)/2.0;
|
||||
/* pDriv->name = strdup("SICS_ANSTO_MOTOR_ASIM"); */
|
||||
/* pDriv->name = strdup("SICS_ANSTO_MOTOR_ASIM"); */
|
||||
pDriv->name = malloc((1+strlen("SICS_ANSTO_MOTOR_ASIM"))*sizeof(char));
|
||||
strcpy(pDriv->name,"SICS_ANSTO_MOTOR_ASIM");
|
||||
|
||||
|
||||
pDriv->GetPosition = SimGetPos;
|
||||
pDriv->RunTo = SimRun;
|
||||
pDriv->GetStatus = SimStat;
|
||||
@ -548,7 +548,7 @@ MotorDriver *CreateASIM(SConnection *pCon, char *motor, char *params)
|
||||
pDriv->GetDriverPar = SimGetPar;
|
||||
pDriv->ListDriverPar = SimListPar;
|
||||
pDriv->KillPrivate = SimKill;
|
||||
|
||||
|
||||
/* set default parameters */
|
||||
pDriv->fSpeed = 1.0;
|
||||
pDriv->iTime = time(&tD);
|
||||
@ -559,7 +559,7 @@ MotorDriver *CreateASIM(SConnection *pCon, char *motor, char *params)
|
||||
pDriv->fTarget = pDriv->fPos;
|
||||
pDriv->fDestination = pDriv->fPos;
|
||||
pDriv->iStatus = OKOK;
|
||||
|
||||
|
||||
srand( (unsigned)time( NULL ) );
|
||||
|
||||
return (MotorDriver *)pDriv;
|
||||
|
@ -1671,7 +1671,7 @@ static int rspStatus(pDMC2280Driv self, const char* text) {
|
||||
&iStopCode, &iTIzero, &iTIone, &iXQ0);
|
||||
if (iRet != 8)
|
||||
return 0;
|
||||
/* TODO Put the following in specialised response handlers */
|
||||
/* TODO Put the following in specialised response handlers */
|
||||
if (self->ao_id[0] != '\0') {
|
||||
AO_istatus(iTIone, "QKK:TI1");
|
||||
}
|
||||
|
@ -17,7 +17,7 @@
|
||||
int (*TryAndFixIt)(void *self, int iError,float fNew);
|
||||
int (*Halt)(void *self);
|
||||
int (*GetDriverPar)(void *self, char *name, float *value);
|
||||
int (*SetDriverPar)(void *self,SConnection *pCon, char *name,
|
||||
int (*SetDriverPar)(void *self,SConnection *pCon, char *name,
|
||||
float newValue);
|
||||
void (*ListDriverPar)(void *self, char *motorName, SConnection *pCon);
|
||||
void (*KillPrivate)(void *self);
|
||||
|
@ -1282,7 +1282,7 @@ int NHQ200Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
if (strcasecmp("rate", argv[1]) == 0) {
|
||||
char rsp[CMDLEN];
|
||||
if (argc > 2) {
|
||||
if (!SCMatchRights(pCon, usUser))
|
||||
if (!SCMatchRights(pCon, usUser))
|
||||
return 0;
|
||||
if (priv->isLocked && !SCMatchRights(pCon, usMugger)) {
|
||||
SCWrite(pCon, "object is locked", eError);
|
||||
|
@ -107,8 +107,8 @@ static int ORHV_SendReceive(pORHVPSDriv priv,
|
||||
int *rep_len) {
|
||||
int status;
|
||||
|
||||
if (!*cmd)
|
||||
{
|
||||
if (!*cmd)
|
||||
{
|
||||
*reply='\0';
|
||||
*rep_len=0;
|
||||
return FAILURE;
|
||||
@ -302,7 +302,7 @@ static void ORHVState_Unknown(pStateMachine sm, pEvtEvent event) {
|
||||
char line[132];
|
||||
*p = '\0';
|
||||
sprintf(line, "Version: %s", pCmd->inp_buf);
|
||||
SICSLogWrite(line, eLog);
|
||||
SICSLogWrite(line, eLog);
|
||||
}
|
||||
ORHV_SendCmd(priv, "Hz", 2, fsm_msg_callback);
|
||||
sm->mySubState = 2;
|
||||
@ -1051,7 +1051,7 @@ int ORHVPSWrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
// we also allow the third argument to be an explicit command/response format.
|
||||
// This is in format "<cmd>-<resp>" where the command and response fields
|
||||
// are format specifiers containing the required/expected ASCII letters
|
||||
// in the command, and the format specifiers '%s' (string),
|
||||
// in the command, and the format specifiers '%s' (string),
|
||||
// '%d' (integer 0-255), , '%B' (a board name e.g. x0-y15),
|
||||
// '%P' (a pot name e.g. x0-y191), or '%A' (ack code as 'ACK'/'NAK').
|
||||
// Formats '%c' (a character) and '%x' (char as 2 hex digits) could be
|
||||
@ -1077,7 +1077,7 @@ int ORHVPSWrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
case 'l': pcmdrspfmt="l%Bz-%A"; break; // Re-enable a board
|
||||
case 'J': pcmdrspfmt="Jz-J%dz"; break; // Check jumper settings
|
||||
}
|
||||
// Prepare the command string
|
||||
// Prepare the command string
|
||||
char *pcmd=cmd;
|
||||
int nfmtspec=0;
|
||||
while(*pcmdrspfmt!='-')
|
||||
@ -1101,7 +1101,7 @@ int ORHVPSWrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
{
|
||||
case 's': // probably never used
|
||||
pcmd+=sprintf(pcmd,"%s",argv[nfmtspec+2]);
|
||||
break;
|
||||
break;
|
||||
case 'd':
|
||||
sscanf(argv[nfmtspec+2],"%d",&v1);
|
||||
pcmd+=sprintf(pcmd,"%c",(char)v1);
|
||||
@ -1366,7 +1366,7 @@ int ORHVPSWrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
if (strcasecmp("rate", argv[1]) == 0) {
|
||||
char rsp[CMDLEN];
|
||||
if (argc > 2) {
|
||||
if (!SCMatchRights(pCon, usUser))
|
||||
if (!SCMatchRights(pCon, usUser))
|
||||
return 0;
|
||||
if (priv->isLocked && !SCMatchRights(pCon, usMugger)) {
|
||||
SCWrite(pCon, "object is locked", eError);
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
REFL2T.c
|
||||
|
||||
Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
---------------------------------------------------------------------------*/
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
@ -31,13 +31,13 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
|
||||
|
||||
/*======================================================================
|
||||
The core of it all: The calculation of the settings for the various
|
||||
The core of it all: The calculation of the settings for the various
|
||||
motors.
|
||||
========================================================================*/
|
||||
static int CalculateREFL(pRefl2T self, SConnection *pCon, float fNew)
|
||||
{
|
||||
float fDetPos, HeightOffset, DetLength;
|
||||
int iRet;
|
||||
int iRet;
|
||||
|
||||
/* assume: solid sample, horizontal beam, surface at height zero */
|
||||
/* read vals of motor coy */
|
||||
@ -52,10 +52,10 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
|
||||
/* calculate det height above beam axis */
|
||||
/* add detector offset height */
|
||||
|
||||
|
||||
fNew = DetLength * tan((double)(fNew * PI / 180.0)) + HeightOffset ;
|
||||
self->fTarget = fNew;
|
||||
return 1;
|
||||
return 1;
|
||||
|
||||
/* Replacement code using MotEntry structure
|
||||
self->toStart[MOTCOZ].pMot = self->aEngine[MOTCOZ];
|
||||
@ -81,7 +81,7 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
{
|
||||
return iRet;
|
||||
}
|
||||
|
||||
|
||||
/* start them all */
|
||||
/* for(i = 0; i < self->iStart; i++)
|
||||
{*/
|
||||
@ -94,13 +94,13 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
if(iRet != OKOK)
|
||||
{
|
||||
return iRet;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* } */
|
||||
return OKOK;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
static int R2THalt(void *pData)
|
||||
{
|
||||
@ -118,7 +118,7 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
if(pDriv != NULL)
|
||||
{
|
||||
iRet = pDriv->Halt(self->aEngine[MOTCOZ].pMot);
|
||||
}
|
||||
}
|
||||
/* } */
|
||||
return OKOK;
|
||||
}
|
||||
@ -130,7 +130,7 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
pRefl2T self = (pRefl2T) pData;
|
||||
SConnection *pDumCon = NULL;
|
||||
|
||||
/* Define code for this function */
|
||||
/* Define code for this function */
|
||||
assert(self);
|
||||
pDumCon = SCCreateDummyConnection(pServ->pSics);
|
||||
assert(pDumCon);
|
||||
@ -142,7 +142,7 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
{
|
||||
return iRet;
|
||||
}
|
||||
|
||||
|
||||
/* check them all */
|
||||
/* for(i = 0; i < self->iStart; i++)
|
||||
{*/
|
||||
@ -156,39 +156,39 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
if(iRet != 1)
|
||||
{
|
||||
return iRet;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* } */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static float R2TGetValue(void *pData, SConnection *pCon)
|
||||
{
|
||||
|
||||
|
||||
pRefl2T self = (pRefl2T) pData;
|
||||
|
||||
|
||||
assert(self);
|
||||
|
||||
|
||||
return fResult;
|
||||
}
|
||||
|
||||
|
||||
static void *R2TGetInterface(void *pData, int iID)
|
||||
{
|
||||
pRefl2T self = (pRefl2T) pData;
|
||||
|
||||
|
||||
assert(self);
|
||||
if(iID == DRIVEID)
|
||||
{
|
||||
return self->pDriv;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void Refl2TKill(void *pData)
|
||||
{
|
||||
pRefl2T self = (pRefl2T) pData;
|
||||
|
||||
|
||||
if(self == NULL)
|
||||
return;
|
||||
|
||||
@ -206,7 +206,7 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
/*--------------------------------------------------------------------------
|
||||
Initialization: All is done from the Factory function. This takes an Tcl
|
||||
array as parameter which is supposed to hold the names of all motors.
|
||||
This must fail if one of the motors cannot be accessed.
|
||||
This must fail if one of the motors cannot be accessed.
|
||||
--------------------------------------------------------------------------*/
|
||||
int Refl2TFactory(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[])
|
||||
@ -249,7 +249,7 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
SCWrite(pCon,"ERROR: no value for coz motr found",eError);
|
||||
Refl2TKill(pNew);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
pNew->aMot[MOTCOZ] = FindMotor(pSics,pMot);
|
||||
if(!pNew->aEngine[MOTCOZ])
|
||||
{
|
||||
@ -265,7 +265,7 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
SCWrite(pCon,"ERROR: no value for coy motor found",eError);
|
||||
Refl2TKill(pNew);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
pNew->aEngine[MOTCOY] = FindMotor(pSics,pMot);
|
||||
if(!pNew->aEngine[MOTCOY])
|
||||
{
|
||||
@ -281,7 +281,7 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
SCWrite(pCon,"ERROR: no value for coz motor found",eError);
|
||||
Refl2TKill(pNew);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
pNew->aEngine[MOTSOZ] = FindMotor(pSics,pMot);
|
||||
if(!pNew->aEngine[MOTSOZ])
|
||||
{
|
||||
@ -389,7 +389,7 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
|
||||
assert(pCon);
|
||||
assert(self);
|
||||
|
||||
|
||||
Tcl_DStringInit(&tString);
|
||||
sprintf(pBueffel,
|
||||
"%s.detectord %f \n", name, ObVal(self->aParameter,PARDDD));
|
||||
@ -399,5 +399,5 @@ Paul Hathaway, Nick Hauser, Mark Koennecke, February 2004
|
||||
Tcl_DStringInit(&tString);
|
||||
sprintf(pBueffel,
|
||||
"%s.sampleoffset %f \n", name, ObVal(self->aParameter,PARDSO));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
#define MAXMOT = 3;
|
||||
|
||||
/* aMot is the array of motors that includes the
|
||||
/* aMot is the array of motors that includes the
|
||||
1. sample stage height motor
|
||||
2. detector x motor
|
||||
3. detector z motor
|
||||
@ -46,4 +46,4 @@
|
||||
float fTarget;
|
||||
int iLast;
|
||||
}MotEntry, *pMotEntry;
|
||||
|
||||
|
||||
|
@ -35,11 +35,11 @@ extern int DMC2280MotionControl;
|
||||
#define INST_READY_BIT (1 << 16)
|
||||
#define LAMP_TEST_BIT (1 << 17)
|
||||
|
||||
#define KEY_BOTH_BITS (KEY_ENABLED_BIT | KEY_DISABLED_BIT)
|
||||
#define SEC_BOTH_BITS (SEC_OPENED_BIT | SEC_CLOSED_BIT)
|
||||
#define TER_BOTH_BITS (TER_OPENED_BIT | TER_CLOSED_BIT)
|
||||
#define MOTOR_BOTH_BITS (MOTOR_ENABLED_BIT | MOTOR_DISABLED_BIT)
|
||||
#define ACCESS_BOTH_BITS (ACCESS_LOCKED_BIT | ACCESS_UNLOCKED_BIT)
|
||||
#define KEY_BOTH_BITS (KEY_ENABLED_BIT | KEY_DISABLED_BIT)
|
||||
#define SEC_BOTH_BITS (SEC_OPENED_BIT | SEC_CLOSED_BIT)
|
||||
#define TER_BOTH_BITS (TER_OPENED_BIT | TER_CLOSED_BIT)
|
||||
#define MOTOR_BOTH_BITS (MOTOR_ENABLED_BIT | MOTOR_DISABLED_BIT)
|
||||
#define ACCESS_BOTH_BITS (ACCESS_LOCKED_BIT | ACCESS_UNLOCKED_BIT)
|
||||
|
||||
static pAsyncProtocol PLC_Protocol = NULL;
|
||||
|
||||
@ -503,10 +503,10 @@ int SafetyPLCFactory(SConnection *pCon, SicsInterp *pSics,
|
||||
}
|
||||
|
||||
/*
|
||||
create data structure and open port
|
||||
create data structure and open port
|
||||
*/
|
||||
pNew = PLC_Create(argv[2]);
|
||||
|
||||
|
||||
if(!pNew)
|
||||
{
|
||||
SCWrite(pCon,"ERROR: failed to create SafetyPLC in SafetyPLCFactory",eError);
|
||||
@ -519,7 +519,7 @@ int SafetyPLCFactory(SConnection *pCon, SicsInterp *pSics,
|
||||
sprintf(pError,"ERROR: failed to connect to %s",argv[2]);
|
||||
SCWrite(pCon,pError,eError);
|
||||
}
|
||||
|
||||
|
||||
for (i=0; i < sizeof(plc_parname)/sizeof(plc_parname[0]); i++) {
|
||||
plcVar = VarCreate(PLC_UserPriv,veText,plc_parname[i]);
|
||||
PLC_GetState(pNew,plc_parname[i],&plcState);
|
||||
|
@ -39,8 +39,8 @@ static void SetModeNode(pSctEmon self, EVMode mode)
|
||||
*/
|
||||
|
||||
static void *SCTEmonGetInterface(void *pData, int ID){
|
||||
pSctEmon self = NULL;
|
||||
|
||||
pSctEmon self = NULL;
|
||||
|
||||
self = (pSctEmon)pData;
|
||||
assert(self);
|
||||
if (self->modeNode == NULL || self->tolNode == NULL || self->errNode == NULL)
|
||||
@ -63,8 +63,8 @@ Convert mode string from the evmode textnode value to
|
||||
------------------------------------------------------------------*/
|
||||
static EVMode SCTEmonGetMode(void *pData)
|
||||
{
|
||||
pSctEmon self = NULL;
|
||||
|
||||
pSctEmon self = NULL;
|
||||
|
||||
self = (pSctEmon)pData;
|
||||
assert(self);
|
||||
switch(self->modeNode->value.v.text[0]) {
|
||||
@ -92,8 +92,8 @@ static EVMode SCTEmonGetMode(void *pData)
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------
|
||||
This routine can return 0 when a limit problem occurred
|
||||
OKOK when the motor was successfully started
|
||||
This routine can return 0 when a limit problem occurred
|
||||
OKOK when the motor was successfully started
|
||||
HWFault when a problem occured starting the device
|
||||
Possible errors shall be printed to pCon
|
||||
For real motors, this is supposed to try at least three times
|
||||
@ -103,7 +103,7 @@ Reads value from the "isintolerance" node (1 or 0)
|
||||
------------------------------------------------------------------*/
|
||||
static int SCTEmonIsInTolerance(void *pData)
|
||||
{
|
||||
pSctEmon self = NULL;
|
||||
pSctEmon self = NULL;
|
||||
pExeList pExe;
|
||||
char pBueffel[512];
|
||||
char monMode;
|
||||
@ -133,15 +133,15 @@ static int SCTEmonIsInTolerance(void *pData)
|
||||
HWFault when a hardware problem ocurred
|
||||
HWPosFault when the hardware cannot reach a position
|
||||
Errors are duly to be printed to pCon
|
||||
For real motors CheckStatus again shall try hard to fix any
|
||||
issues with the motor
|
||||
For real motors CheckStatus again shall try hard to fix any
|
||||
issues with the motor
|
||||
|
||||
The HandleError node value can be one of Lazy, Pause, Interrupt, Safe
|
||||
NOTE: emon ignores the returned iStatus value
|
||||
------------------------------------------------------------------*/
|
||||
static int SCTEmonHandleError(void *pData)
|
||||
{
|
||||
pSctEmon self = NULL;
|
||||
pSctEmon self = NULL;
|
||||
pExeList pExe;
|
||||
int iRet, iHandler, iStatus;
|
||||
char monMode;
|
||||
@ -166,7 +166,7 @@ static int SCTEmonHandleError(void *pData)
|
||||
PauseExecution(pExe);
|
||||
self->iPaused = 1;
|
||||
//XXX nopause SetModeNode(self, EVPaused);
|
||||
iStatus = 1;
|
||||
iStatus = 1;
|
||||
}
|
||||
break;
|
||||
case 'i':
|
||||
@ -180,7 +180,7 @@ static int SCTEmonHandleError(void *pData)
|
||||
/*TODO Drive environment to a safevalue */
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
return 0;
|
||||
|
||||
}
|
||||
/* NOTE: emon ignores the return value */
|
||||
@ -190,7 +190,7 @@ static int SCTEmonHandleError(void *pData)
|
||||
returns NULL on failure, a new datastructure else
|
||||
------------------------------------------------------------------*/
|
||||
static pSctEmon SCTEMONMakeObject(){
|
||||
pSctEmon self = NULL;
|
||||
pSctEmon self = NULL;
|
||||
|
||||
self = calloc(sizeof(SctEmon),1);
|
||||
if(self == NULL){
|
||||
@ -214,7 +214,7 @@ static pSctEmon SCTEMONMakeObject(){
|
||||
free(self);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
self->pDes->GetInterface = SCTEmonGetInterface;
|
||||
self->pEVI->GetMode = SCTEmonGetMode;
|
||||
self->pEVI->IsInTolerance = SCTEmonIsInTolerance;
|
||||
@ -246,33 +246,33 @@ int SctMakeEmonAdapter(SConnection *pCon, SicsInterp *pSics, void *object,
|
||||
int argc, char *argv[]) {
|
||||
pSctEmon pNew = NULL;
|
||||
hdbCallback *cb;
|
||||
|
||||
|
||||
if(argc < 5){
|
||||
SCWrite(pCon,"ERROR: not enough arguments for SctMakeEmonAdapter", eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
pNew = SCTEMONMakeObject();
|
||||
if(pNew == NULL){
|
||||
SCWrite(pCon,"ERROR: out of memory in SctMakeEmonAdapter",
|
||||
eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
pNew->pName = strdup(argv[1]);
|
||||
pNew->modeNode = FindHdbNode(NULL,argv[2], pCon);
|
||||
pNew->tolNode = FindHdbNode(NULL,argv[3], pCon);
|
||||
pNew->errNode = FindHdbNode(NULL,argv[4], pCon);
|
||||
pNew->iPaused = 0;
|
||||
|
||||
|
||||
/*XXX I'm guessing that SctEmonDeleteNode will be called when the
|
||||
script context object is deleted. So the emon functions should check
|
||||
if node == NULL before trying to do something */
|
||||
script context object is deleted. So the emon functions should check
|
||||
if node == NULL before trying to do something */
|
||||
cb = MakeHipadabaCallback(SctDummyCallback, pNew, SctEmonDeleteNode);
|
||||
assert(cb);
|
||||
AppendHipadabaCallback(pNew->modeNode, cb);
|
||||
|
||||
EVRegisterController(FindEMON(pSics),argv[1],pNew, pCon);
|
||||
|
||||
EVRegisterController(FindEMON(pSics),argv[1],pNew, pCon);
|
||||
return 1;
|
||||
}
|
||||
/*---------------------------------------------------------------*/
|
||||
|
@ -407,7 +407,7 @@ static void RemoveCommands(SicsInterp *pSics){
|
||||
/* create the motor */
|
||||
strtolower(argv[1]);
|
||||
if(strcmp(argv[1],"dmc2280") == 0) {
|
||||
pDriver = (MotorDriver *)CreateDMC2280(pCon,argv[0],argv[2]);
|
||||
pDriver = (MotorDriver *)CreateDMC2280(pCon,argv[0],argv[2]);
|
||||
if(!pDriver){
|
||||
return NULL;
|
||||
}
|
||||
@ -415,7 +415,7 @@ static void RemoveCommands(SicsInterp *pSics){
|
||||
if(!pNew) {
|
||||
sprintf(pBueffel,"ERROR:SITE: Failure to create motor %s",argv[1]);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
pNew->pActionRoutine = DMC2280Action;
|
||||
}
|
||||
@ -428,7 +428,7 @@ static void RemoveCommands(SicsInterp *pSics){
|
||||
if(!pNew) {
|
||||
sprintf(pBueffel,"ERROR:SITE: Failure to create motor %s",argv[1]);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
pNew->pActionRoutine = SimAction;
|
||||
}
|
||||
@ -456,14 +456,14 @@ static pCounterDriver CreateCounterDriverAnsto(SConnection *pCon,
|
||||
/*-------------------------------------------------------------------*/
|
||||
static HistDriver *CreateAnstoHistMem(char *name, pStringDict pOptions){
|
||||
HistDriver *pNew = NULL;
|
||||
|
||||
|
||||
if(strcmp(name,"anstohttp") == 0){
|
||||
pNew = CreateAnstoHttpDriver(pOptions);
|
||||
}
|
||||
return pNew;
|
||||
}
|
||||
/*-------------------------------------------------------------------*/
|
||||
static pVelSelDriv CreateVelSelDriv(char *name, char *array,
|
||||
static pVelSelDriv CreateVelSelDriv(char *name, char *array,
|
||||
Tcl_Interp *pTcl){
|
||||
pVelSelDriv pNew = NULL;
|
||||
return pNew;
|
||||
@ -514,7 +514,7 @@ static pEVControl InstallEnvironmentController(SicsInterp *pSics,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Added code for new Lakeshore 340 driver */
|
||||
if(strcmp(argv[3],"west4100") == 0) {
|
||||
pDriv = CreateWEST4100Driver(argc-4,&argv[4]);
|
||||
@ -595,7 +595,7 @@ pSite getSite(void)
|
||||
we cannot go on if we do not even have enough memory to allocate
|
||||
the site data structure
|
||||
*/
|
||||
assert(siteANSTO);
|
||||
assert(siteANSTO);
|
||||
/*
|
||||
initializing function pointers
|
||||
*/
|
||||
@ -603,7 +603,7 @@ pSite getSite(void)
|
||||
siteANSTO->RemoveSiteCommands = RemoveCommands;
|
||||
siteANSTO->CreateMotor = CreateMotorAnsto;
|
||||
siteANSTO->CreateCounterDriver = CreateCounterDriverAnsto;
|
||||
siteANSTO->CreateHistogramMemoryDriver = CreateAnstoHistMem;
|
||||
siteANSTO->CreateHistogramMemoryDriver = CreateAnstoHistMem;
|
||||
siteANSTO->CreateVelocitySelector = CreateVelSelDriv;
|
||||
siteANSTO->CreateControllerDriver = CreateController;
|
||||
siteANSTO->InstallEnvironmentController = InstallEnvironmentController;
|
||||
@ -620,13 +620,13 @@ pSite getSite(void)
|
||||
char *dyn;
|
||||
unsigned int l;
|
||||
int res;
|
||||
|
||||
|
||||
va_start(ap, fmt);
|
||||
l = vsnprintf(buf, sizeof buf, fmt, ap);
|
||||
va_end(ap);
|
||||
if (l >= sizeof buf) {
|
||||
/* we have probably a C99 conforming snprintf and
|
||||
need a larger buffer
|
||||
/* we have probably a C99 conforming snprintf and
|
||||
need a larger buffer
|
||||
*/
|
||||
dyn = malloc(l+1);
|
||||
if (dyn != NULL) {
|
||||
|
@ -47,7 +47,7 @@ static pMotor CreateMotor(SConnection *pCon, int argc, char *argv[]){
|
||||
if(!pNew){
|
||||
sprintf(pBueffel,"Failure to create motor %s",argv[1]);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return pNew;
|
||||
@ -62,7 +62,7 @@ static pCounterDriver CreateAnstoCounterDriver(SConnection *pCon,
|
||||
/*-------------------------------------------------------------------*/
|
||||
static HistDriver *CreateHistMem(char *name, pStringDict pOptions){
|
||||
HistDriver *pNew = NULL;
|
||||
|
||||
|
||||
if(strcmp(name,"anstohm") == 0){
|
||||
printf("try to CreateAnstoHM() ...\n");
|
||||
#ifdef __cplusplus
|
||||
@ -72,7 +72,7 @@ static HistDriver *CreateHistMem(char *name, pStringDict pOptions){
|
||||
return pNew;
|
||||
}
|
||||
/*-------------------------------------------------------------------*/
|
||||
static pVelSelDriv CreateVelSelDriv(char *name, char *array,
|
||||
static pVelSelDriv CreateVelSelDriv(char *name, char *array,
|
||||
Tcl_Interp *pTcl){
|
||||
pVelSelDriv pNew = NULL;
|
||||
return pNew;
|
||||
@ -110,7 +110,7 @@ pSite getSite(void){
|
||||
we cannot go on if we do not even have enough memory to allocate
|
||||
the site data structure
|
||||
*/
|
||||
assert(siteANSTO);
|
||||
assert(siteANSTO);
|
||||
/*
|
||||
initializing function pointers
|
||||
*/
|
||||
@ -118,10 +118,10 @@ pSite getSite(void){
|
||||
siteANSTO->RemoveSiteCommands = RemoveCommands;
|
||||
siteANSTO->CreateMotor = CreateMotor;
|
||||
siteANSTO->CreateCounterDriver = CreateAnstoCounterDriver;
|
||||
siteANSTO->CreateHistogramMemoryDriver = CreateHistMem;
|
||||
siteANSTO->CreateHistogramMemoryDriver = CreateHistMem;
|
||||
siteANSTO->CreateVelocitySelector = CreateVelSelDriv;
|
||||
siteANSTO->CreateControllerDriver = CreateController;
|
||||
siteANSTO->InstallEnvironmentController =
|
||||
siteANSTO->InstallEnvironmentController =
|
||||
InstallEnvironmentController;
|
||||
siteANSTO->ConfigureScan = ConfigureScan;
|
||||
siteANSTO->KillSite = KillSite;
|
||||
|
@ -1,14 +1,14 @@
|
||||
/*---------------------------------------------------------------------------
|
||||
W E S T 4 1 0 0 . C
|
||||
|
||||
|
||||
This is the implementation for a WEST4100 object derived from a more general
|
||||
environment controller.
|
||||
|
||||
|
||||
Mark Koennecke, August 1997
|
||||
Mark Lesha, January 2006 (based on ITC4 code)
|
||||
Paul Barron, January 2008 (Note: This is based on the old LAKESHORE340 code and
|
||||
Paul Barron, January 2008 (Note: This is based on the old LAKESHORE340 code and
|
||||
not the new LS340 code written by Rodney Davies Feb 08)
|
||||
|
||||
|
||||
Copyright:
|
||||
|
||||
Labor fuer Neutronenstreuung
|
||||
@ -74,15 +74,15 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
int WEST4100SetPar(pEVControl self, char *name, float fNew, SConnection *pCon)
|
||||
{
|
||||
int iRet;
|
||||
|
||||
|
||||
/* check authorisation */
|
||||
if(!SCMatchRights(pCon,usUser))
|
||||
{
|
||||
SCWrite(pCon,"ERROR: you are not authorised to change this parameter",
|
||||
eError);
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* just catch those three names which we understand */
|
||||
if(strcmp(name,"setpoint") == 0)
|
||||
{
|
||||
@ -102,7 +102,7 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
if(strcmp(name,"alarm1") == 0)
|
||||
{
|
||||
iRet = SetAlarm1WEST4100(self->pDriv,(int)fNew);
|
||||
@ -121,7 +121,7 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
if(strcmp(name,"alarm2") == 0)
|
||||
{
|
||||
iRet = SetAlarm2WEST4100(self->pDriv,(int)fNew);
|
||||
@ -140,7 +140,7 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
if(strcmp(name,"powerlimit") == 0)
|
||||
{
|
||||
iRet = SetPowerLimitWEST4100(self->pDriv,(int)fNew);
|
||||
@ -159,7 +159,7 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
if(strcmp(name,"ramprate") == 0)
|
||||
{
|
||||
iRet = SetRampRateWEST4100(self->pDriv,(int)fNew);
|
||||
@ -178,7 +178,7 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
return EVCSetPar(self,name,fNew,pCon);
|
||||
}
|
||||
@ -186,7 +186,7 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
int WEST4100GetPar(pEVControl self, char *name, float *fNew)
|
||||
{
|
||||
int iRet;
|
||||
|
||||
|
||||
/* just catch those two names which we understand */
|
||||
if(strcmp(name,"setpoint") == 0)
|
||||
{
|
||||
@ -229,7 +229,7 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
iRet = GetProcessValueWEST4100(self->pDriv); // Furnace only has 1 sensor
|
||||
*fNew = (float)iRet;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
return EVCGetPar(self,name,fNew);
|
||||
}
|
||||
@ -238,44 +238,44 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
{
|
||||
char pBueffel[132];
|
||||
int iRet;
|
||||
|
||||
|
||||
iRet = EVCList(self,pCon);
|
||||
|
||||
|
||||
sprintf(pBueffel,"%s.NumSensors = %d",self->pName,1);
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
|
||||
|
||||
sprintf(pBueffel,"%s.ControlSensor = %s",self->pName,"SensorA");
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
|
||||
|
||||
|
||||
sprintf(pBueffel,"%s.ModbusAddress = %d",self->pName,GetAddressWEST4100(self->pDriv));
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
|
||||
|
||||
sprintf(pBueffel,"%s.TransactionNumber = %d",self->pName,GetTransactWEST4100(self->pDriv));
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
|
||||
|
||||
sprintf(pBueffel,"%s.ProcessValue = %d",self->pName,GetProcessValueWEST4100(self->pDriv));
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
|
||||
|
||||
sprintf(pBueffel,"%s.Setpoint = %d",self->pName,GetSetpointWEST4100(self->pDriv));
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
|
||||
|
||||
sprintf(pBueffel,"%s.WorkingSetpoint = %d",self->pName,GetWorkingSetpointWEST4100(self->pDriv));
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
|
||||
|
||||
sprintf(pBueffel,"%s.Alarm1 = %d",self->pName,GetAlarm1WEST4100(self->pDriv));
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
|
||||
|
||||
sprintf(pBueffel,"%s.Alarm2 = %d",self->pName,GetAlarm2WEST4100(self->pDriv));
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
|
||||
sprintf(pBueffel,"%s.PowerLimit = %d",self->pName,GetPowerLimitWEST4100(self->pDriv));
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
|
||||
sprintf(pBueffel,"%s.RampRate = %d",self->pName,GetRampRateWEST4100(self->pDriv));
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
|
||||
return iRet;
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
|
||||
return iRet;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int WEST4100Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
@ -287,19 +287,19 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
double fNum;
|
||||
float fVal;
|
||||
int fValue;
|
||||
|
||||
|
||||
self = (pEVControl)pData;
|
||||
assert(self);
|
||||
assert(pCon);
|
||||
assert(pSics);
|
||||
|
||||
|
||||
if(argc < 2)
|
||||
{
|
||||
return EVControlWrapper(pCon,pSics,pData,argc,argv);
|
||||
}
|
||||
// Set or Get
|
||||
strtolower(argv[1]);
|
||||
if( (strcmp(argv[1],"controlsensor") == 0) || (strcmp(argv[1],"sensorlist") == 0)){
|
||||
if( (strcmp(argv[1],"controlsensor") == 0) || (strcmp(argv[1],"sensorlist") == 0)){
|
||||
sprintf(pBueffel,"%s.%s = %s",self->pName,argv[1],"sensorA");
|
||||
SCWrite(pCon,pBueffel,eValue);
|
||||
return 1;
|
||||
@ -317,7 +317,7 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
sprintf(pBueffel,"ERROR: expected number, got %s",argv[2]);
|
||||
SCWrite(pCon,pBueffel,eError);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return WEST4100SetPar(self,argv[1],(float)fNum,pCon);
|
||||
}
|
||||
else /* get case */
|
||||
@ -329,10 +329,10 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
}
|
||||
}
|
||||
// Write or Query
|
||||
else if(strcmp(argv[1],"parameter") == 0)
|
||||
else if(strcmp(argv[1],"parameter") == 0)
|
||||
{
|
||||
if(argc > 3) /* set case */
|
||||
{
|
||||
{
|
||||
return WEST4100Write(self->pDriv,atoi(argv[2]),atoi(argv[3]));
|
||||
}
|
||||
else /* get case */
|
||||
@ -345,7 +345,7 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
}
|
||||
// List
|
||||
else if(strcmp(argv[1],"list") == 0)
|
||||
{
|
||||
{
|
||||
return WEST4100List(self,pCon);
|
||||
}
|
||||
else
|
||||
@ -353,5 +353,5 @@ int GetWorkingSetpointWEST4100(pEVDriver self);
|
||||
return EVControlWrapper(pCon,pSics,pData,argc,argv);
|
||||
}
|
||||
/* not reached */
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,14 +1,14 @@
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
W E S T 4 1 0 0
|
||||
|
||||
|
||||
Support for Lakeshore 340 Temperature controllers for SICS.
|
||||
The meaning and working of the functions defined is as desribed for a
|
||||
general environment controller.
|
||||
|
||||
Mark Koennecke, Juli 1997
|
||||
Mark Lesha, January 2006 (based on ITC4 code)
|
||||
Paul Barron, January 2008 (Note: This is based on the old LAKESHORE340 code and
|
||||
Paul Barron, January 2008 (Note: This is based on the old LAKESHORE340 code and
|
||||
not the new LS340 code written by Rodney Davies Feb 08)
|
||||
|
||||
copyright: see implementation file.
|
||||
@ -31,11 +31,11 @@
|
||||
|
||||
int WEST4100Wrapper(SConnection *pCon, SicsInterp *pSics, void *pData,
|
||||
int argc, char *argv[]);
|
||||
int WEST4100SetPar(pEVControl self, char *name, float fNew,
|
||||
int WEST4100SetPar(pEVControl self, char *name, float fNew,
|
||||
SConnection *pCon);
|
||||
int WEST4100GetPar(pEVControl self, char *name, float *fVal);
|
||||
int WEST4100List(pEVControl self, SConnection *pCon);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -4,10 +4,10 @@
|
||||
This file contains the implementation of a driver for the
|
||||
Lakeshore 340 Temperature controller.
|
||||
|
||||
|
||||
|
||||
Mark Koennecke, Juli 1997
|
||||
Mark Lesha, January 2006 (based on ITC4 code)
|
||||
Paul Barron, January 2008 (Note: This is based on the old LAKESHORE340 code and
|
||||
Paul Barron, January 2008 (Note: This is based on the old LAKESHORE340 code and
|
||||
not the new LS340 code written by Rodney Davies Feb 08)
|
||||
|
||||
Copyright:
|
||||
@ -52,7 +52,7 @@
|
||||
|
||||
typedef struct __EVDriver *pEVDriver;
|
||||
|
||||
#include <evdriver.i>
|
||||
#include <evdriver.i>
|
||||
/* Do we need these ?
|
||||
#include <sics.h>
|
||||
#include <modriv.h>
|
||||
@ -67,8 +67,8 @@
|
||||
|
||||
pEVDriver CreateWEST4100Driver(int argc, char *argv[]);
|
||||
int ConfigWEST4100(pEVDriver self);
|
||||
|
||||
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
typedef struct {
|
||||
pWEST4100 pData;
|
||||
@ -85,8 +85,8 @@
|
||||
int iWorkingSetpoint;
|
||||
int iAlarm1;
|
||||
int iAlarm2;
|
||||
int iPowerLimit;
|
||||
int iRampRate;
|
||||
int iPowerLimit;
|
||||
int iRampRate;
|
||||
int iTmo;
|
||||
int iLastError;
|
||||
} WEST4100Driv, *pWEST4100Driv;
|
||||
@ -95,12 +95,12 @@
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv)self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
iRet = WEST4100_Read(&pMe->pData,fPos);
|
||||
|
||||
iRet = WEST4100_Read(&pMe->pData,fPos);
|
||||
if(iRet <= 0 )
|
||||
{
|
||||
pMe->iLastError = iRet;
|
||||
@ -113,13 +113,13 @@
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int WEST4100Run(pEVDriver self, float fVal)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -136,7 +136,7 @@
|
||||
static int WEST4100Error(pEVDriver self, int *iCode, char *error, int iErrLen)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv)self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -148,7 +148,7 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
WEST4100_ErrorTxt(&pMe->pData,pMe->iLastError,error,iErrLen);
|
||||
WEST4100_ErrorTxt(&pMe->pData,pMe->iLastError,error,iErrLen);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@ -157,7 +157,7 @@
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -170,13 +170,13 @@
|
||||
}
|
||||
return 1;
|
||||
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int WEST4100Init(pEVDriver self)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -193,29 +193,29 @@
|
||||
{
|
||||
pMe->iLastError = iRet;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
static int WEST4100Close(pEVDriver self)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
//int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
WEST4100_Close(&pMe->pData);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static int WEST4100Fix(pEVDriver self, int iError)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -241,11 +241,11 @@
|
||||
if(iRet)
|
||||
{
|
||||
return DEVREDO;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return DEVFAULT;
|
||||
}
|
||||
}
|
||||
break;
|
||||
/* handable protocoll errors */
|
||||
case EL734__BAD_TMO:
|
||||
@ -254,20 +254,20 @@
|
||||
case -501: /* Bad_COM */
|
||||
return DEVREDO;
|
||||
case -504: /* Badly formatted */
|
||||
return DEVREDO;
|
||||
return DEVREDO;
|
||||
default:
|
||||
return DEVFAULT;
|
||||
break;
|
||||
break;
|
||||
}
|
||||
return DEVFAULT;
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
#if 0
|
||||
static int WEST4100Halt(pEVDriver *self)
|
||||
{
|
||||
assert(self);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
@ -275,28 +275,28 @@
|
||||
void KillWEST4100(void *pData)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
|
||||
|
||||
pMe = (pWEST4100Driv)pData;
|
||||
assert(pMe);
|
||||
|
||||
|
||||
if(pMe->pHost)
|
||||
{
|
||||
free(pMe->pHost);
|
||||
}
|
||||
free(pMe);
|
||||
}
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
pEVDriver CreateWEST4100Driver(int argc, char *argv[])
|
||||
{
|
||||
pEVDriver pNew = NULL;
|
||||
pWEST4100Driv pSim = NULL;
|
||||
|
||||
|
||||
/* check for arguments */
|
||||
if(argc < 3)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
pSim = (pWEST4100Driv)malloc(sizeof(WEST4100Driv));
|
||||
if(!pSim) {
|
||||
return NULL;
|
||||
@ -309,19 +309,19 @@
|
||||
memset(pSim,0,sizeof(WEST4100Driv));
|
||||
pNew->pPrivate = pSim;
|
||||
pNew->KillPrivate = KillWEST4100;
|
||||
|
||||
|
||||
/* initalise pWEST4100Driver */
|
||||
// This is where parameters are initialised using values from the configuration file eg. sertemp 1 2
|
||||
pSim->iAddress = atoi(argv[1]);
|
||||
pSim->iTransaction = atoi(argv[2]);
|
||||
pSim->iLastError = 0;
|
||||
pSim->iTmo = 10;
|
||||
|
||||
|
||||
pSim->pHost = strdup(argv[0]);
|
||||
pSim->iPort = 0;
|
||||
pSim->iChannel = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
/* initialise function pointers */
|
||||
pNew->SetValue = WEST4100Run;
|
||||
pNew->GetValue = GetWEST4100Pos;
|
||||
@ -330,15 +330,15 @@
|
||||
pNew->TryFixIt = WEST4100Fix;
|
||||
pNew->Init = WEST4100Init;
|
||||
pNew->Close = WEST4100Close;
|
||||
|
||||
return pNew;
|
||||
}
|
||||
|
||||
return pNew;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int ConfigWEST4100(pEVDriver self)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
@ -356,33 +356,33 @@
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
// int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
if((parameterAddress>0 && parameterAddress<=35) || (parameterAddress>=122 && parameterAddress<=133))
|
||||
return WEST4100_Query(&pMe->pData, parameterAddress, parameterValue);
|
||||
|
||||
if((parameterAddress>0 && parameterAddress<=35) || (parameterAddress>=122 && parameterAddress<=133))
|
||||
return WEST4100_Query(&pMe->pData, parameterAddress, parameterValue);
|
||||
else
|
||||
printf("Parameter %d out of range.\n",parameterAddress);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int WEST4100Write(pEVDriver self, int parameterAddress, int parameterValue)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
// int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
|
||||
if((parameterAddress>0 && parameterAddress<=35) || (parameterAddress>=122 && parameterAddress<=133))
|
||||
return WEST4100_Write(&pMe->pData, parameterAddress, parameterValue);
|
||||
return WEST4100_Write(&pMe->pData, parameterAddress, parameterValue);
|
||||
else
|
||||
printf("Parameter %d out of range.\n",parameterAddress);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
@ -390,11 +390,11 @@
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
// int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
|
||||
return pMe->iAddress;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
@ -403,11 +403,11 @@
|
||||
pWEST4100Driv pMe = NULL;
|
||||
// int iRet;
|
||||
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
|
||||
return pMe->iTransaction;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
@ -415,45 +415,45 @@
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int fVal;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
WEST4100_Query(&pMe->pData, 1, &fVal);
|
||||
|
||||
|
||||
WEST4100_Query(&pMe->pData, 1, &fVal);
|
||||
|
||||
pMe->iProcessValue = fVal;
|
||||
|
||||
|
||||
return pMe->iProcessValue;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int GetWorkingSetpointWEST4100(pEVDriver self)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int fVal;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
WEST4100_Query(&pMe->pData, 21, &fVal);
|
||||
|
||||
|
||||
WEST4100_Query(&pMe->pData, 21, &fVal);
|
||||
|
||||
pMe->iWorkingSetpoint = fVal;
|
||||
|
||||
|
||||
return pMe->iWorkingSetpoint;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int SetSetpointWEST4100(pEVDriver self, int Setpoint)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
iRet=WEST4100_Write(&pMe->pData, 2, Setpoint);
|
||||
|
||||
|
||||
iRet=WEST4100_Write(&pMe->pData, 2, Setpoint);
|
||||
|
||||
pMe->iSetpoint = Setpoint;
|
||||
|
||||
return 1;
|
||||
@ -463,29 +463,29 @@
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int fVal;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
WEST4100_Query(&pMe->pData, 2, &fVal);
|
||||
|
||||
|
||||
WEST4100_Query(&pMe->pData, 2, &fVal);
|
||||
|
||||
pMe->iSetpoint = fVal;
|
||||
|
||||
|
||||
return pMe->iSetpoint;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int SetRampRateWEST4100(pEVDriver self, int RampRate)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
iRet=WEST4100_Write(&pMe->pData, 24, RampRate);
|
||||
|
||||
|
||||
iRet=WEST4100_Write(&pMe->pData, 24, RampRate);
|
||||
|
||||
pMe->iRampRate = RampRate;
|
||||
|
||||
return 1;
|
||||
@ -495,29 +495,29 @@
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int fVal;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
WEST4100_Query(&pMe->pData, 24, &fVal);
|
||||
|
||||
|
||||
WEST4100_Query(&pMe->pData, 24, &fVal);
|
||||
|
||||
pMe->iRampRate = fVal;
|
||||
|
||||
|
||||
return pMe->iRampRate;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int SetAlarm1WEST4100(pEVDriver self, int Alarm1)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
|
||||
iRet=WEST4100_Write(&pMe->pData, 13, Alarm1);
|
||||
|
||||
|
||||
pMe->iAlarm1 = Alarm1;
|
||||
|
||||
return 1;
|
||||
@ -527,29 +527,29 @@
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int fVal;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
WEST4100_Query(&pMe->pData, 13, &fVal);
|
||||
|
||||
|
||||
WEST4100_Query(&pMe->pData, 13, &fVal);
|
||||
|
||||
pMe->iAlarm1 = fVal;
|
||||
|
||||
|
||||
return pMe->iAlarm1;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int SetAlarm2WEST4100(pEVDriver self, int Alarm2)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
|
||||
iRet=WEST4100_Write(&pMe->pData, 14, Alarm2);
|
||||
|
||||
|
||||
pMe->iAlarm2 = Alarm2;
|
||||
|
||||
return 1;
|
||||
@ -559,29 +559,29 @@
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int fVal;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
WEST4100_Query(&pMe->pData, 14, &fVal);
|
||||
|
||||
|
||||
WEST4100_Query(&pMe->pData, 14, &fVal);
|
||||
|
||||
pMe->iAlarm2 = fVal;
|
||||
|
||||
|
||||
return pMe->iAlarm2;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int SetPowerLimitWEST4100(pEVDriver self, int PowerLimit)
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int iRet;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
iRet=WEST4100_Write(&pMe->pData, 20, PowerLimit);
|
||||
|
||||
|
||||
iRet=WEST4100_Write(&pMe->pData, 20, PowerLimit);
|
||||
|
||||
pMe->iPowerLimit = PowerLimit;
|
||||
|
||||
return 1;
|
||||
@ -591,14 +591,14 @@
|
||||
{
|
||||
pWEST4100Driv pMe = NULL;
|
||||
int fVal;
|
||||
|
||||
|
||||
assert(self);
|
||||
pMe = (pWEST4100Driv )self->pPrivate;
|
||||
assert(pMe);
|
||||
|
||||
WEST4100_Query(&pMe->pData, 20, &fVal);
|
||||
|
||||
|
||||
WEST4100_Query(&pMe->pData, 20, &fVal);
|
||||
|
||||
pMe->iPowerLimit = fVal;
|
||||
|
||||
|
||||
return pMe->iPowerLimit;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user