16 #include <sys/types.h>
27 #include "lemSCWatchdog.h"
31 #define SCS900_INIT_ERROR -2
32 #define SCS900_MSCB_DEBUG FALSE
35 #define SCS900_NOVARS 51
36 #define SCS900_DAC_OFFSET 8
43 char dd_name[NAME_LENGTH];
44 char port[NAME_LENGTH];
45 char pwd[NAME_LENGTH];
49 char err_log[4*NAME_LENGTH];
50 char adc_name[8][NAME_LENGTH];
51 char dac_name[8][NAME_LENGTH];
55 #define SCS900_SETTINGS_STR "\
56 Detailed Messages = INT : 0\n\
57 SCW_IN_USE = INT : 0\n\
58 Read Period (sec) = INT : 1\n\
59 DD Name = STRING : [32] SCS900\n\
60 MSCB Port = STRING : [32] usb0\n\
61 MSCB Pwd = STRING : [32] \n\
62 Group Addr = INT : 1\n\
63 Node Addr = INT : 1\n\
64 Error Timeout = INT : 3600\n\
65 Error Log = STRING : [128] \n\
66 ADC Name = STRING[8] : \n\
75 DAC Name = STRING[8] : \n\
87 #define SCS900_SCW_STR "\
88 Proc Name = STRING : [32]\n\
90 Log Name = STRING : [64]\n\
91 DD Name = STRING : [32] scs900\n\
92 Last Updated = DWORD : 0\n\
93 Timeout = DWORD : 180\n\
102 char input_buffer[32];
103 float present_value[8];
104 float previous_value[8];
132 MSCB_INFO_VAR var_info;
138 cm_get_experiment_database(&hDB, NULL);
142 if ((status != DB_SUCCESS) && (status != DB_OPEN_RECORD)) {
143 cm_msg(MERROR,
"scs900_in_init",
"scs900_in_init: Error creating SCS Settings record in ODB, status=%d", status);
148 db_find_key(hDB, hKey,
"DD/SCS900", &hkeydd);
150 db_get_record(hDB, hkeydd, &info->
settings, &size, 0);
154 if ((status != DB_SUCCESS) && (status != DB_OPEN_RECORD)) {
155 cm_msg(MERROR,
"scs900_in_init",
"scs900_in_init: Error creating SCS900 SCW record in ODB, status=%d", status);
168 if (info->
fd == -1) {
169 cm_msg(MINFO,
"scs900_init",
"scs900_init: %s, Couldn't initialize MSCB port %s",
175 cm_msg(MINFO,
"scs900_init",
"scs900_init: %s: MSCB node %d initialized",
181 if (status != MSCB_SUCCESS) {
182 cm_msg(MINFO,
"scs900_init",
"scs900_init: Couldn't get node info");
188 cm_msg(MINFO,
"scs900_init",
"scs900_init: %s: No of vars should be %d, found %d",
197 if (status != MSCB_SUCCESS) {
198 cm_msg(MINFO,
"scs900_init",
"scs900_init: %s: Couldn't get DAC variable info",
206 cm_msg(MINFO,
"scs900_init",
"scs900_init: %s: MSCB node %d all necessary checks performed.",
213 db_find_key(hDB, hKey,
"DD/SCW", &hkeydd);
215 size =
sizeof(info->
scw);
216 db_get_record(hDB, hkeydd, &info->
scw, &size, 0);
219 info->
scw.pid = ss_getpid();
220 info->
scw.last_updated = ss_time();
222 db_set_record(hDB, hkeydd, &info->
scw,
sizeof(info->
scw), 0);
225 status = lem_scw_init(&info->
scw);
226 if (status != LEM_SCW_SUCCESS) {
227 cm_msg(MINFO,
"scs900_in_init",
"%s: Couldn't register with lem watchdog", info->
settings.
dd_name);
252 cm_get_experiment_database(&hDB, NULL);
275 lem_scw_exit(&info->
scw);
296 char tt[64], str[128];
309 if (status != MSCB_SUCCESS) {
311 fd = open(info->
settings.
err_log, O_CREAT | O_WRONLY | O_APPEND, 0644);
315 strcpy(tt, ctime(&err_time));
316 tt[strlen(tt)-1]=
'\0';
318 sprintf(str,
"[%s] scs900_set: %s, MSCB error %d", tt, info->
settings.
dd_name, status);
319 write(fd, str, strlen(str));
378 buff[3-i] = data[index+i];
380 result = *((
float*) &buff);
398 DWORD nowtime, difftime;
400 char tt[64], str[128];
412 info->
scw.last_updated = ss_time();
413 lem_scw_update(&info->
scw);
422 cm_msg(MINFO,
"scs900_get",
"scs900_get: %s: %d errors occurred in the last %d sec",
435 (
unsigned char) 0, (
unsigned char) 7,
438 if (status == MSCB_SUCCESS) {
439 size =
sizeof(float);
440 for (i=0; i<8; i++) {
449 fd = open(info->
settings.
err_log, O_CREAT | O_WRONLY | O_APPEND, 0644);
454 strcpy(tt, ctime(&err_time));
455 tt[strlen(tt)-1]=
'\0';
457 sprintf(str,
"[%s] scs900_set: %s, MSCB error %d\n", tt, info->
settings.
dd_name, status);
458 write(fd, str, strlen(str));
485 va_start(argptr, cmd);
490 hKey = va_arg(argptr, HNDLE);
491 info = va_arg(argptr,
void *);
492 channel = va_arg(argptr, INT);
493 flags = va_arg(argptr, DWORD);
498 info = va_arg(argptr,
void *);
503 info = va_arg(argptr,
void *);
504 channel = va_arg(argptr, INT);
505 pvalue = va_arg(argptr,
float*);
510 info = va_arg(argptr,
void *);
511 channel = va_arg(argptr, INT);
512 name = va_arg(argptr,
char *);
537 va_start(argptr, cmd);
542 hKey = va_arg(argptr, HNDLE);
543 info = va_arg(argptr,
void *);
544 channel = va_arg(argptr, INT);
545 flags = va_arg(argptr, DWORD);
550 info = va_arg(argptr,
void *);
551 channel = va_arg(argptr, INT);
552 value = (float) va_arg(argptr,
double);
557 info = va_arg(argptr,
void *);
558 channel = va_arg(argptr, INT);
559 name = va_arg(argptr,
char *);
INT startup_error
initializer error tag, if set, scs900_get and scs900_set won't do anything
float present_value[8]
present ADC values
INT scs900_set(SCS900_INFO *info, INT channel, float value)
INT fd
MSCB file desciptor.
INT group_addr
group address within the MSCB
char port[NAME_LENGTH]
MSCB port, e.g. /dev/parport0.
Stores all the parameters the device driver needs.
char dac_name[8][NAME_LENGTH]
Name of the DAC channels.
INT read_timeout
how often the data should be read in (sec)
LEM_SC_WATCHDOG scw
slowcontrol watchdog info structure
INT detailed_msg
flag indicating if detailed status/error messages are wanted
#define SCS900_DAC_OFFSET
offset for the DAC channels
INT scs900_in(INT cmd,...)
float previous_value[8]
previous ADC values
INT scs900_in_init(HNDLE hKey, void **pinfo, INT channels)
INT node_addr
node address within the MSCB
INT errcount
error counter in order not to flood the message queue
unsigned char dac_width
width of the DAC value
#define SCS900_INIT_ERROR
tag: initializing error
DWORD lasterrtime
last error time stamp
INT scs900_out(INT cmd,...)
INT scw_in_use
flag indicating if the slowcontrol watchdog shall be used
char err_log[4 *NAME_LENGTH]
name for error log file, if empty no log file will be written
INT scs900_out_init(HNDLE hKey, void **pinfo, INT channels)
float scs900_mscb_to_float(char *data, int index)
#define SCS900_SETTINGS_STR
Initializing string for the struct SCS900_SETTINGS.
INT scs900_get_in_label(SCS900_INFO *info, INT channel, char *name)
DWORD read_timer
timer to get the input data read
INT scs900_get(SCS900_INFO *info, INT channel, float *pvalue)
#define SCS900_NOVARS
number of variables of the SCS900
#define SCS900_MSCB_DEBUG
MSCB debug flag.
INT scs900_get_out_label(SCS900_INFO *info, INT channel, char *name)
INT scs900_exit(SCS900_INFO *info)
char input_buffer[32]
raw input buffer for the ADC values
#define SCS900_SCW_STR
defines the slowcontrol default watchdog info structure
char pwd[NAME_LENGTH]
MSCB password for the MSCB ethernet submaster.
char dd_name[NAME_LENGTH]
internal name for the DD
INT err_timeout
error report interval in sec
This structure contains private variables for the device driver.
SCS900_SETTINGS settings
stores the internal DD settings
char adc_name[8][NAME_LENGTH]
Name of the ADC channels.