22 #include "lemSCWatchdog.h"
26 #define HVR400_INIT_ERROR -2
28 #define HVR400_MAX_ERROR 5
29 #define HVR400_DELTA_TIME_ERROR 600
33 #define MSCB_DEBUG FALSE
36 #define HVR400_CONTROL 0
37 #define HVR400_VDEMAND 1
38 #define HVR400_VMEAS 2
39 #define HVR400_IMEAS 3
40 #define HVR400_STATUS 4
41 #define HVR400_TRIPCNT 5
42 #define HVR400_RAMPUP 6
43 #define HVR400_RAMPDOWN 7
44 #define HVR400_VLIMIT 8
45 #define HVR400_ILIMIT 9
46 #define HVR400_RILIMIT 10
47 #define HVR400_TRIPMAX 11
48 #define HVR400_TRIPTIME 12
51 #define HVR400_CTRL_HV_ON 0x01
52 #define HVR400_CTRL_REGULATION 0x02
53 #define HVR400_CTRL_IDLE 0x04
62 char port[NAME_LENGTH];
63 char pwd[NAME_LENGTH];
66 char name[NAME_LENGTH];
71 #define HVR400_SETTINGS_STR "\
73 SCW_IN_USE = BOOL : 0\n\
74 Detailed Messages = INT : 0\n\
75 MSCB Port = STRING : [32] usb1\n\
76 MSCB Pwd = STRING : [32]\n\
77 Group Addr = INT : 400\n\
78 Node Addr = INT : 1\n\
79 HVR400 Name = STRING : [32] HVR400_1\n\
80 HV ODB Offset = INT : 0\n\
123 #define HVR400_SCW_STR "\
124 Proc Name = STRING : [32]\n\
126 Log Name = STRING : [64]\n\
127 DD Name = STRING : [32] \n\
128 Last Updated = DWORD : 0\n\
129 Timeout = DWORD : 180\n\
154 unsigned char buffer[256], *pbuf;
156 size =
sizeof(buffer);
157 status = mscb_read_range(info->
fd, info->
settings.
node_addr+channel, 0, 12, buffer, &size);
158 if (status != MSCB_SUCCESS) {
159 cm_msg(MERROR,
"hr400_read_all",
160 "Cannot access MSCB HVR400 address \"%d\". Check power and connection.",
168 pbuf +=
sizeof(char);
171 pbuf +=
sizeof(float);
174 pbuf +=
sizeof(float);
177 pbuf +=
sizeof(float);
179 pbuf +=
sizeof(char);
181 pbuf +=
sizeof(char);
184 pbuf +=
sizeof(float);
187 pbuf +=
sizeof(float);
190 pbuf +=
sizeof(float);
193 pbuf +=
sizeof(float);
196 pbuf +=
sizeof(float);
198 pbuf +=
sizeof(char);
235 cm_get_experiment_database(&hDB, NULL);
239 if ((status != DB_SUCCESS) && (status != DB_OPEN_RECORD)) {
240 cm_msg(MERROR,
"hvr400_init",
"hvr400_init: Error creating DD/HVR400 record in ODB, status=%d", status);
245 db_find_key(hDB, hKey,
"DD/HVR400", &hkeydd);
247 db_get_record(hDB, hkeydd, &info->
settings, &size, 0);
251 if ((status != DB_SUCCESS) && (status != DB_OPEN_RECORD)) {
252 cm_msg(MERROR,
"hvr400_init",
"hvr400_init: Error creating DD/SCW record in ODB, status=%d", status);
263 cm_msg(MINFO,
"hvr400_init",
"hvr400_init: %s not enabled", info->
settings.
name);
272 cm_msg(MINFO,
"hvr400_init",
"hvr400_init: Couldn't initialize MSCB port %s, Error no: %d",
281 if (status != MSCB_SUCCESS) {
282 cm_msg(MINFO,
"hvr400_init",
"Cannot access HVR node at address \"%d\". Please check cabling and power.",
290 if (strcmp(node_info.node_name,
"HVR-400") != 0) {
291 cm_msg(MINFO,
"hvr400_init",
292 "Found unexpected node \"%s\" at address \"%d\".",
300 for (i=0; i<channels; i++) {
302 if (status != FE_SUCCESS) {
308 cm_msg(MINFO,
"hvr400_init",
"hvr400_init: %s initialized", info->
settings.
name);
314 db_find_key(hDB, hKey,
"DD/SCW", &hkeydd);
316 size =
sizeof(info->
scw);
317 db_get_record(hDB, hkeydd, &info->
scw, &size, 0);
319 info->
scw.pid = ss_getpid();
320 info->
scw.last_updated = ss_time();
323 db_set_record(hDB, hkeydd, &info->
scw,
sizeof(info->
scw), 0);
326 status = lem_scw_init(&info->
scw);
327 if (status != LEM_SCW_SUCCESS) {
328 cm_msg(MINFO,
"hvr400_init",
"Couldn't register with lem watchdog");
352 lem_scw_exit(&info->
scw);
374 unsigned char hv_on_off;
383 mscb_value = fabs(value*1000.f);
418 DWORD nowtime, difftime;
419 unsigned char buffer[256], *pbuf;
444 size =
sizeof(buffer);
446 if (status != MSCB_SUCCESS) {
449 cm_msg(MINFO,
"hvr400_get",
450 "Cannot access MSCB HVR address \"%d\". Check power and connection.",
459 pbuf +=
sizeof(char);
462 pbuf +=
sizeof(float);
465 pbuf +=
sizeof(float);
473 info->
scw.last_updated = ss_time();
474 lem_scw_update(&info->
scw);
493 DWORD nowtime, difftime;
510 mscb_value = limit*1000.f;
530 DWORD nowtime, difftime;
547 mscb_value = limit*1000.f;
568 DWORD nowtime, difftime;
585 mscb_value = ramp * 1000.f;
606 DWORD nowtime, difftime;
623 mscb_value = ramp * 1000.f;
643 DWORD nowtime, difftime;
644 unsigned char mscb_value;
660 mscb_value = (
unsigned char) trip_time;
675 float value, *pvalue;
678 va_start(argptr, cmd);
683 hKey = va_arg(argptr, HNDLE);
684 info = va_arg(argptr,
void *);
685 channel = va_arg(argptr, INT);
686 status =
hvr400_init(hKey, (
void **)info, channel);
690 info = va_arg(argptr,
void *);
695 info = va_arg(argptr,
void *);
696 channel = va_arg(argptr, INT);
697 value = (float) va_arg(argptr,
double);
702 info = va_arg(argptr,
void *);
703 channel = va_arg(argptr, INT);
704 pvalue = va_arg(argptr,
float*);
709 info = va_arg(argptr,
void *);
710 channel = va_arg(argptr, INT);
711 pvalue = va_arg(argptr,
float*);
715 case CMD_GET_CURRENT:
716 info = va_arg(argptr,
void *);
717 channel = va_arg(argptr, INT);
718 pvalue = va_arg(argptr,
float*);
728 case CMD_SET_CURRENT_LIMIT:
729 info = va_arg(argptr,
void *);
730 channel = va_arg(argptr, INT);
731 value = (float) va_arg(argptr,
double);
735 case CMD_SET_VOLTAGE_LIMIT:
736 info = va_arg(argptr,
void *);
737 channel = va_arg(argptr, INT);
738 value = (float) va_arg(argptr,
double);
742 case CMD_GET_VOLTAGE_LIMIT:
743 info = va_arg(argptr,
void *);
744 channel = va_arg(argptr, INT);
745 pvalue = va_arg(argptr,
float *);
749 case CMD_GET_THRESHOLD:
750 info = va_arg(argptr,
void *);
751 channel = va_arg(argptr, INT);
752 pvalue = va_arg(argptr,
float*);
756 case CMD_GET_THRESHOLD_CURRENT:
757 info = va_arg(argptr,
void *);
758 channel = va_arg(argptr, INT);
759 pvalue = va_arg(argptr,
float*);
763 case CMD_GET_THRESHOLD_ZERO:
764 info = va_arg(argptr,
void *);
765 channel = va_arg(argptr, INT);
766 pvalue = va_arg(argptr,
float*);
770 case CMD_GET_CURRENT_LIMIT:
771 info = va_arg(argptr,
void *);
772 channel = va_arg(argptr, INT);
773 pvalue = va_arg(argptr,
float*);
778 info = va_arg(argptr,
void *);
779 channel = va_arg(argptr, INT);
780 value = (float) va_arg(argptr,
double);
784 case CMD_SET_RAMPDOWN:
785 info = va_arg(argptr,
void *);
786 channel = va_arg(argptr, INT);
787 value = (float) va_arg(argptr,
double);
792 info = va_arg(argptr,
void *);
793 channel = va_arg(argptr, INT);
794 pvalue = va_arg(argptr,
float*);
798 case CMD_GET_RAMPDOWN:
799 info = va_arg(argptr,
void *);
800 channel = va_arg(argptr, INT);
801 pvalue = va_arg(argptr,
float*);
805 case CMD_SET_TRIP_TIME:
806 info = va_arg(argptr,
void *);
807 channel = va_arg(argptr, INT);
808 value = (float) va_arg(argptr,
double);
812 case CMD_GET_TRIP_TIME:
813 info = va_arg(argptr,
void *);
814 channel = va_arg(argptr, INT);
815 pvalue = va_arg(argptr,
float*);
824 cm_msg(MERROR,
"hvr400 device driver",
"Received unkown command %d", cmd);
825 status = FE_ERR_DRIVER;
INT hvr400_exit(HVR400_INFO *info)
INT startup_error
initializer error tag, if set, hvr400_get and hvr400_set won't do anything
INT hvr400_set_triptime(HVR400_INFO *info, INT channel, float trip_time)
unsigned char trip_max
maximal allowed number of HV trips
DWORD lasterrtime
last error time stamp
INT hvr400_read_all(HVR400_INFO *info, int channel)
#define HVR400_SETTINGS_STR
Initializing string for the struct HVR400_SETTINGS.
INT hvr400_set_rampup(HVR400_INFO *info, INT channel, float ramp)
#define HVR400_CTRL_REGULATION
INT hvr400_set(HVR400_INFO *info, INT channel, float value)
float ramp_up
ramp up speed in (V/s)
BOOL enabled
flag indicating if the device is enabled or disabled
BOOL scw_in_use
flag indicating if the slowcontrol watchdog shall be used
INT hvr400_set_current_limit(HVR400_INFO *info, INT channel, float limit)
unsigned char cached
cache flag
HVR400_NODE_VARS * node_vars
stores the variables of all HVR400 node
char pwd[NAME_LENGTH]
MSCB password for MSCB ethernet modules.
unsigned char trip_time
??
float u_limit
voltage limit in (V)
#define HVR400_MAX_ERROR
maximum number of error messages
#define HVR400_SCW_STR
defines the slowcontrol default watchdog info structure
INT hvr400_init(HNDLE hKey, void **pinfo, INT channels)
This structure contains private variables for the device driver.
INT odb_offset
HV channel offset within ODB.
INT node_addr
node address of the first HV channel within the MSCB
unsigned char status
status tag
INT group_addr
group address within the MSCB
LEM_SC_WATCHDOG scw
slowcontrol watchdog info structure
float ramp_down
ramp down speed in (V/s)
INT hvr400_set_voltage_limit(HVR400_INFO *info, INT channel, float limit)
float u_meas
measured HV in (V)
char port[NAME_LENGTH]
MSCB port, e.g. /dev/parport0 or usb1.
unsigned char control
control tag
INT detailed_msg
flag indicating if detailed status/error messages are wanted
INT hvr400_get(HVR400_INFO *info, INT channel, float *pvalue)
float i_meas
measured current in (uA)
HVR400_SETTINGS settings
stores the internal DD settings
unsigned char trip_cnt
trip counter
char name[NAME_LENGTH]
name of the hvr_400 card
float u_demand
demand HV in (V)
float i_limit
current limit in (uA)
INT errcount
error counter in order not to flood the message queue
INT fd
MSCB file desciptor.
#define HVR400_INIT_ERROR
tag: initializing error
#define HVR400_CTRL_HV_ON
INT hvr400_set_rampdown(HVR400_INFO *info, INT channel, float ramp)
#define HVR400_DELTA_TIME_ERROR
reset error counter after DELTA_TIME_ERROR seconds
#define MSCB_DEBUG
MSCB debug flag.