- Made the HRPT temperature log lmd200 work

- Added a special el734hp which scales with 1000 for SANSLI
- Added another error to the magnet driver: magnet broken
This commit is contained in:
koennecke
2008-05-08 09:29:48 +00:00
parent 358c121b30
commit 5e96ae6939
7 changed files with 155 additions and 35 deletions

106
lmd200.c
View File

@ -54,15 +54,21 @@
}
free(priv);
}
/*--------------------------------------------------------------------------*/
static void doAlarm(pSICSOBJ self, char *lineBuffer){
/*-------------------------------------------------------------------------*/
static void setAlarm(pSICSOBJ self, char *text){
hdbValue alarmVal;
pHdb node = NULL;
alarmVal = MakeHdbText(lineBuffer);
alarmVal = MakeHdbText(text);
node = GetHipadabaNode(self->objectNode,"alarm");
assert(node != NULL);
UpdateHipadabaPar(node,alarmVal, NULL);
ReleaseHdbValue(&alarmVal);
}
/*--------------------------------------------------------------------------*/
static void doAlarm(pSICSOBJ self, char *lineBuffer){
setAlarm(self,lineBuffer);
WriteToCommandLog("CERCA>> ", lineBuffer);
ServerWriteGlobal(lineBuffer,eError);
}
@ -79,6 +85,7 @@ static void storeData(pSICSOBJ self, int start, char *lineBuffer){
* throw first away
*/
pPtr = stptok(lineBuffer,number,80," ");
pPtr = trim(pPtr);
pPtr = stptok(pPtr,number,80," ");
while(pPtr != NULL){
if(strstr(number,"noinp") != NULL){
@ -89,46 +96,76 @@ static void storeData(pSICSOBJ self, int start, char *lineBuffer){
if(pKomma != NULL){
*pKomma = '.';
}
pKomma = strchr(number,'(');
if(pKomma != NULL){
*pKomma = ' ';
}
pKomma = strchr(number,')');
if(pKomma != NULL){
*pKomma = ' ';
}
node->value.v.floatArray[start] = atof(trim(number));
start++;
}
}
pPtr = trim(pPtr);
pPtr = stptok(pPtr,number,80," ");
}
}
/*--------------------------------------------------------------------------*/
static int countTokens(char *lineBuffer){
int count = 0;
char myBuffer[BUFLEN];
char myBuffer[BUFLEN], token[60];
char *pPtr = NULL;
memset(myBuffer,0,BUFLEN);
strcpy(myBuffer, lineBuffer);
pPtr = myBuffer;
pPtr = stptok(pPtr,token, 60," \r\n");
while(pPtr != NULL){
count++;
pPtr = strtok(pPtr," ");
pPtr = trim(pPtr);
pPtr = stptok(pPtr,token,60," \r\n");
}
return count;
}
/*--------------------------------------------------------------------------*/
static void interpretLine(pSICSOBJ self, pLMD200 priv){
pHdb node = NULL;
switch(priv->state){
case IDLE:
if(countTokens(priv->lineBuffer) == 2){
priv->state = WAITDATA1;
return;
if(strstr(priv->lineBuffer, "Alarm") != NULL){
doAlarm(self, priv->lineBuffer);
return;
} else if(strstr(priv->lineBuffer,"Pre") != NULL){
setAlarm(self,priv->lineBuffer);
} else {
doAlarm(self, priv->lineBuffer);
return;
priv->state = WAITDATA1;
setAlarm(self,"I do not feel very alarmed");
return;
}
break;
case WAITDATA1:
if(strstr(priv->lineBuffer,"...0") == NULL){
/* this data is out of order, recover...*/
priv->state == IDLE;
return;
}
storeData(self, 0, priv->lineBuffer);
priv->state = WAITDATA2;
break;
case WAITDATA2:
if(strstr(priv->lineBuffer,"...0") == NULL){
/* this data is out of order, recover...*/
priv->state == IDLE;
return;
}
storeData(self, 8, priv->lineBuffer);
priv->state = IDLE;
node = GetHipadabaNode(self->objectNode,"data");
assert(node != NULL);
NotifyHipadabaPar(node,NULL);
break;
}
}
@ -139,23 +176,22 @@ static void interpretLine(pSICSOBJ self, pLMD200 priv){
static int LMD200Callback(void *context, int mode){
pSICSOBJ self = (pSICSOBJ)context;
pLMD200 priv = NULL;
char buffer[512], *pPtr = NULL;
char buffer[512], *pPtr = NULL, line[132];
assert(self != NULL);
priv = (pLMD200)self->pPrivate;
if(mode == nwatch_read){
memset(buffer,0,512);
memset(line,0,132);
NETRead(priv->pSock, buffer, 512, 0);
pPtr = strchr(buffer,'\n');
if(pPtr != NULL){
*pPtr = '\0';
strncat(priv->lineBuffer,buffer,BUFLEN);
pPtr = stptok(buffer,line,132,"\r");
while(pPtr != NULL){
if(strlen(line) > 3){
strncpy(priv->lineBuffer,line,BUFLEN);
interpretLine(self, priv);
priv->lineBuffer[0] = '\0';
pPtr++;
strncpy(priv->lineBuffer,pPtr,BUFLEN);
} else {
strncat(priv->lineBuffer,buffer,BUFLEN);
}
pPtr = stptok(pPtr,line,132,"\r");
}
}
return 1;
@ -166,17 +202,18 @@ int MakeLMD200(SConnection *pCon, SicsInterp *pSics, void *pData,
pSICSOBJ self = NULL;
pLMD200 priv = NULL;
hdbValue dataValue, textValue;
if(argc < 5){
int status;
if(argc < 4){
SCWrite(pCon,
"ERROR: require name class host and port parameter for initialization",
"ERROR: require name host and port parameters for initialization",
eError);
return 0;
}
priv = (pLMD200)malloc(sizeof(LMD200));
memset(priv,0,sizeof(LMD200));
strncpy(priv->host,argv[3], 256);
priv->port = atoi(argv[4]);
strncpy(priv->host,argv[2], 256);
priv->port = atoi(argv[3]);
priv->pSock = NETConnect(priv->host,priv->port);
if(priv->pSock == NULL){
SCWrite(pCon,"ERROR: failed to connect to LMD200",eError);
@ -184,7 +221,7 @@ int MakeLMD200(SConnection *pCon, SicsInterp *pSics, void *pData,
return 0;
}
self = SetupSICSOBJ(pCon,pSics, pData,argc, argv);
self = MakeSICSOBJv(argv[1],"LMD400",HIPNONE, 0);
if(self == NULL || priv == NULL){
return 0;
}
@ -198,5 +235,18 @@ int MakeLMD200(SConnection *pCon, SicsInterp *pSics, void *pData,
ReleaseHdbValue(&textValue);
NetWatchRegisterCallback(&priv->watchContext, priv->pSock->sockid,
LMD200Callback, self);
status = AddCommand(pSics,
argv[1],
InterInvokeSICSOBJ,
KillSICSOBJ,
self);
if(status != 1){
KillSICSOBJ(self);
SCPrintf(pCon,eError,"ERROR: failed create duplicate command %s", argv[1]);
return 0;
}
return 1;
}