Low-Energy Muon (LEM) Experiment  0.5.2
danfysik_spin_rot_scfe.cxx
Go to the documentation of this file.
1 /********************************************************************\
2 
3  Name: danfysik_spin_rot_scfe.cxx
4  Created by: Andreas Suter
5 
6  Contents: midas slowcontrol frontend to handle the magnet of the
7  LEM spin rotator via the danfysik power supply.
8 
9 \********************************************************************/
10 
11 #include <cstdio>
12 #include <cstdlib>
13 #include <cstring>
14 #include <cmath>
15 
16 #include "midas.h"
17 #include "mfe.h"
18 
19 #include "class/multi.h"
20 #include "danfysik.h"
21 #include "tcpip_rs232.h"
22 
23 //-- Globals -------------------------------------------------------
24 
25 #define DANFYSIK_REMOTE_CH 0
26 #define DANFYSIK_STATE_CH 1
27 #define DANFYSIK_DEMAND_CH 2
28 #define DANFYSIK_MEASURE_CH 3
29 
30 #define DANFYSIK_TIMEOUT_CHECK 30
31 // danfysik demand <-> measured check timestamp
33 
35 const char *frontend_name = "SpinRotMagnet_SC";
37 const char *frontend_file_name = __FILE__;
38 
40 BOOL frontend_call_loop = FALSE;
41 
43 INT display_period = 1000;
44 
46 INT max_event_size = 10000;
47 
49 INT max_event_size_frag = 5*1024*1024;
50 
52 INT event_buffer_size = 10*10000;
53 
54 //-- Equipment list ------------------------------------------------
55 
60 DEVICE_DRIVER danfysik_driver[] = {
61  { "Danfysik_in", danfysik_in, 5, tcpip_rs232, DF_INPUT },
62  { "Danfysik_out", danfysik_out, 4, tcpip_rs232, DF_OUTPUT },
63  { "" }
64 };
65 
75 
77 EQUIPMENT equipment[] = {
78 
79  { "Danfysik_Spin_Rot", // equipment name
80  {98, 0, // event ID, trigger mask
81  "SYSTEM", // event buffer
82  EQ_SLOW, // equipment type
83  0, // event source
84  "FIXED", // format
85  TRUE, // enabled
86  RO_RUNNING |
87  RO_TRANSITIONS, // read when running and on transitions
88  30000, // read every 30 sec
89  0, // stop run after this event limit
90  0, // number of sub events
91  1, // log history every event
92  "", "", "",},
93  cd_multi_read, // readout routine
94  cd_multi, // class driver main routine
95  danfysik_driver, // device driver list
96  NULL, // init string
97  },
98 
99  { "" }
100 };
101 
102 
103 
104 //-- Dummy routines ------------------------------------------------
105 
106 INT poll_event(INT source, INT count, BOOL test) {return 1;};
107 INT interrupt_configure(INT cmd, INT source, POINTER_T adr) {return 1;};
108 
109 //-- Frontend Init -------------------------------------------------
115 {
116  // de-register run-transition notifications
117  cm_deregister_transition(TR_START);
118  cm_deregister_transition(TR_STOP);
119  cm_deregister_transition(TR_PAUSE);
120  cm_deregister_transition(TR_RESUME);
121 
122  // init danfysik demand <-> measured read timer
123  danfysik_check_timestamp = ss_time();
124 
125  return CM_SUCCESS;
126 }
127 
128 //-- Frontend Exit -------------------------------------------------
134 {
135  return CM_SUCCESS;
136 }
137 
138 //-- Frontend Loop -------------------------------------------------
143 {
144  DWORD now;
145  HNDLE hDB, hKeyIn, hKeyOut;
146  int status, size;
147  float setpoint_current, measured_current, remote, state;
148  static int err_count = 0;
149  char str[128];
150 
151  // is it time to check things?
152  now = ss_time();
154  return CM_SUCCESS;
155 
156  // update timestamp
158 
159  // get experiment handle
160  cm_get_experiment_database(&hDB, NULL);
161 
162  // get danfysik input handle
163  status = db_find_key(hDB, 0, "/Equipment/Danfysik_Spin_Rot/Variables/Input", &hKeyIn);
164  if (status != DB_SUCCESS) {
165  cm_msg(MINFO, "frontend_loop", "danfysik_spin_rot_scfe, frontend_loop: couldn't get danfysik spin rot input key from the ODB.");
166  return CM_SUCCESS;
167  }
168  // get danfysik output handle
169  status = db_find_key(hDB, 0, "/Equipment/Danfysik_Spin_Rot/Variables/Output", &hKeyOut);
170  if (status != DB_SUCCESS) {
171  cm_msg(MINFO, "frontend_loop", "danfysik_spin_rot_scfe, frontend_loop: couldn't get danfysik spin rot output key from the ODB.");
172  return CM_SUCCESS;
173  }
174 
175  // get danfysik state and remote flag
176  size = sizeof(float);
177  status = db_get_data_index(hDB, hKeyOut, &remote, &size, DANFYSIK_REMOTE_CH, TID_FLOAT);
178  size = sizeof(float);
179  status = db_get_data_index(hDB, hKeyOut, &state, &size, DANFYSIK_STATE_CH, TID_FLOAT);
180 
181  // if remote and on check things
182  if ((remote != 1.0) || (state != 1.0))
183  return CM_SUCCESS;
184 
185  // get current demand
186  size = sizeof(float);
187  status = db_get_data_index(hDB, hKeyOut, &setpoint_current, &size, DANFYSIK_DEMAND_CH, TID_FLOAT);
188 
189  // get current measured
190  size = sizeof(float);
191  status = db_get_data_index(hDB, hKeyIn, &measured_current, &size, DANFYSIK_MEASURE_CH, TID_FLOAT);
192 
193  // max deviation < 10%?
194  if (fabsf(setpoint_current-measured_current)/fabsf(setpoint_current) > 0.1) {
195  err_count++;
196  } else {
197  err_count = 0;
198  }
199 
200  // too many consecutive error counts, hence issue a warning
201  if (err_count == 10) {
202  sprintf(str, "Danfysik Spin Rot Setpoint = %0.1f A, Measured = %0.1f A: something is fishy!", setpoint_current, measured_current);
203  al_trigger_alarm( "danfysik_spin_rot_current_monitoring", str, "Warning", str, AT_INTERNAL);
204  }
205 
206  return CM_SUCCESS;
207 }
208 
209 //-- Begin of Run --------------------------------------------------
214 INT begin_of_run(INT run_number, char *error)
215 {
216  return CM_SUCCESS;
217 }
218 
219 //-- End of Run ----------------------------------------------------
224 INT end_of_run(INT run_number, char *error)
225 {
226  return CM_SUCCESS;
227 }
228 
229 //-- Pause Run -----------------------------------------------------
234 INT pause_run(INT run_number, char *error)
235 {
236  return CM_SUCCESS;
237 }
238 
239 //-- Resume Run ----------------------------------------------------
244 INT resume_run(INT run_number, char *error)
245 {
246  return CM_SUCCESS;
247 }
248 
249 //------------------------------------------------------------------
const char * frontend_name
&lt; created by ODBedit, command &quot;make&quot;
Definition: vme_fe.cxx:167
INT max_event_size
maximum event size produced by this frontend
Definition: vme_fe.cxx:179
#define DANFYSIK_DEMAND_CH
BOOL frontend_call_loop
frontend_loop is called periodically if this variable is TRUE
Definition: vme_fe.cxx:173
INT display_period
a frontend status page is displayed with this frequency in ms
Definition: vme_fe.cxx:176
INT event_buffer_size
buffer size to hold events
Definition: vme_fe.cxx:185
#define DANFYSIK_STATE_CH
INT frontend_exit()
Definition: vme_fe.cxx:565
EQUIPMENT equipment[]
Definition: vme_fe.cxx:343
INT begin_of_run(INT run_number, char *error)
Definition: vme_fe.cxx:597
INT danfysik_in(INT cmd,...)
DEVICE_DRIVER danfysik_driver[]
INT interrupt_configure(INT cmd, INT source, PTYPE adr)
Definition: vme_fe.cxx:2105
INT frontend_loop()
Definition: vme_fe.cxx:957
INT resume_run(INT run_number, char *error)
Definition: vme_fe.cxx:900
INT max_event_size_frag
maximum event size for fragmented events (EQ_FRAGMENTED)
Definition: vme_fe.cxx:182
INT frontend_init()
Definition: vme_fe.cxx:429
BOOL equipment_common_overwrite
Definition: vme_fe.cxx:341
#define DANFYSIK_MEASURE_CH
INT end_of_run(INT run_number, char *error)
Definition: vme_fe.cxx:865
INT poll_event(INT source, INT count, BOOL test)
Definition: vme_fe.cxx:2088
#define DANFYSIK_REMOTE_CH
HNDLE hDB
INT pause_run(INT run_number, char *error)
Definition: vme_fe.cxx:893
#define DANFYSIK_TIMEOUT_CHECK
const char * frontend_file_name
The frontend file name, don&#39;t change it.
Definition: vme_fe.cxx:170
DWORD danfysik_check_timestamp
INT danfysik_out(INT cmd,...)