- Added delcam driver

- Fixed temperature writing at POLDI
- Added support for the HRPT tempoerature surveillance device
This commit is contained in:
koennecke
2007-12-19 09:55:13 +00:00
parent 9d7898e694
commit 99f545e67f
3 changed files with 210 additions and 4 deletions

202
lmd200.c Normal file
View File

@ -0,0 +1,202 @@
/**
* This is a module to manage the LMD-400 device used to monitor HRPT detector
* electronics temperatures and pressures. It is read only. The device sends
* alarm messages or temperature readings any now and then asynchronously. The
* format of the messages is:
* - Alarm message: date time device type of alarm
* - Data message: 3 lines
* --- date time
* --- 001..008 val val val ....
* --- 009..016 val val ....
* Please note that the values use a komma as the decimal separator and not a .
*
* copyright: see file COPYRIGHT
*
* Mark Koennecke, October 2007
*/
#include <sics.h>
#include <sicsobj.h>
#include <sicshipadaba.h>
#include <network.h>
#include <nwatch.h>
#include <commandlog.h>
#include <stptok.h>
/*
* possible states
*/
#define IDLE 0
#define WAITDATA1 1
#define WAITDATA2 2
/*
* private data structure
*/
#define BUFLEN 1024
typedef struct {
int state;
char host[256];
int port;
mkChannel *pSock;
pNWContext watchContext;
char lineBuffer[BUFLEN];
} LMD200, *pLMD200;
/*----------------------------------------------------------------------------*/
static void killLMD200(void *data){
pLMD200 priv = (pLMD200)data;
if(priv == NULL){
return;
}
if(priv->watchContext != NULL){
NetWatchRemoveCallback(priv->watchContext);
}
if(priv->pSock != NULL){
NETClosePort(priv->pSock);
free(priv->pSock);
}
free(priv);
}
/*--------------------------------------------------------------------------*/
static void doAlarm(pSICSOBJ self, char *lineBuffer){
hdbValue alarmVal;
pHdb node = NULL;
alarmVal = MakeHdbText(lineBuffer);
node = GetHipadabaNode(self->objectNode,"alarm");
assert(node != NULL);
UpdateHipadabaPar(node,alarmVal, NULL);
WriteToCommandLog("CERCA>> ", lineBuffer);
ServerWriteGlobal(lineBuffer,eError);
}
/*--------------------------------------------------------------------------*/
extern char *trim(char *);
static void storeData(pSICSOBJ self, int start, char *lineBuffer){
pHdb node = NULL;
char number[80], *pPtr = NULL, *pKomma;
node = GetHipadabaNode(self->objectNode,"data");
assert(node != NULL);
/*
* throw first away
*/
pPtr = stptok(lineBuffer,number,80," ");
pPtr = stptok(pPtr,number,80," ");
while(pPtr != NULL){
if(strstr(number,"noinp") != NULL){
node->value.v.floatArray[start] = -9999.99;
start++;
} else {
pKomma = strchr(number,',');
if(pKomma != NULL){
*pKomma = '.';
}
node->value.v.floatArray[start] = atof(trim(number));
start++;
}
pPtr = stptok(pPtr,number,80," ");
}
}
/*--------------------------------------------------------------------------*/
static int countTokens(char *lineBuffer){
int count = 0;
char myBuffer[BUFLEN];
char *pPtr = NULL;
memset(myBuffer,0,BUFLEN);
strcpy(myBuffer, lineBuffer);
pPtr = myBuffer;
while(pPtr != NULL){
count++;
pPtr = strtok(pPtr," ");
}
return count;
}
/*--------------------------------------------------------------------------*/
static void interpretLine(pSICSOBJ self, pLMD200 priv){
switch(priv->state){
case IDLE:
if(countTokens(priv->lineBuffer) == 2){
priv->state = WAITDATA1;
return;
} else {
doAlarm(self, priv->lineBuffer);
return;
}
break;
case WAITDATA1:
storeData(self, 0, priv->lineBuffer);
priv->state = WAITDATA2;
break;
case WAITDATA2:
storeData(self, 8, priv->lineBuffer);
priv->state = IDLE;
break;
}
}
/*---------------------------------------------------------------------------
* This handles the terminator discovery and causes the evaluation of complete
* lines.
* --------------------------------------------------------------------------*/
static int LMD200Callback(void *context, int mode){
pSICSOBJ self = (pSICSOBJ)context;
pLMD200 priv = NULL;
char buffer[512], *pPtr = NULL;
assert(self != NULL);
priv = (pLMD200)self->pPrivate;
if(mode == nwatch_read){
memset(buffer,0,512);
NETRead(priv->pSock, buffer, 512, 0);
pPtr = strchr(buffer,'\n');
if(pPtr != NULL){
*pPtr = '\0';
strncat(priv->lineBuffer,buffer,BUFLEN);
interpretLine(self, priv);
priv->lineBuffer[0] = '\0';
pPtr++;
strncpy(priv->lineBuffer,pPtr,BUFLEN);
} else {
strncat(priv->lineBuffer,buffer,BUFLEN);
}
}
return 1;
}
/*---------------------------------------------------------------------------*/
int MakeLMD200(SConnection *pCon, SicsInterp *pSics, void *pData,
int argc, char *argv[]){
pSICSOBJ self = NULL;
pLMD200 priv = NULL;
hdbValue dataValue, textValue;
if(argc < 5){
SCWrite(pCon,
"ERROR: require name class host and port parameter 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]);
priv->pSock = NETConnect(priv->host,priv->port);
if(priv->pSock == NULL){
SCWrite(pCon,"ERROR: failed to connect to LMD200",eError);
killLMD200(priv);
return 0;
}
self = SetupSICSOBJ(pCon,pSics, pData,argc, argv);
if(self == NULL || priv == NULL){
return 0;
}
textValue = MakeHdbText("I do not feel very alarmed");
dataValue = makeHdbValue(HIPFLOATAR,16);
AddSICSHdbPar(self->objectNode,"alarm", usInternal,textValue);
AddSICSHdbPar(self->objectNode,"data", usInternal,dataValue);
self->pPrivate = priv;
self->KillPrivate = killLMD200;
ReleaseHdbValue(&dataValue);
ReleaseHdbValue(&textValue);
NetWatchRegisterCallback(&priv->watchContext, priv->pSock->sockid,
LMD200Callback, self);
return 1;
}