Low-Energy Muon (LEM) Experiment  0.5.1
mirror_scfe.c
Go to the documentation of this file.
1 /********************************************************************\
2 
3  Name: mirror_scfe.c
4  Created by: Andreas Suter
5 
6  Contents: midas slowcontrol frontend to handle the
7  Phytron MCC controller needed for the Mirror.
8 
9 \********************************************************************/
10 
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <math.h>
15 
16 #include "midas.h"
17 #include "class/multi.h"
18 #include "phytron_mcc.h"
19 #include "tcpip_rs232.h"
20 
21 //-- Globals -------------------------------------------------------
22 
24 char *frontend_name = "Mirror_SC";
26 char *frontend_file_name = __FILE__;
27 
29 BOOL frontend_call_loop = TRUE;
30 
32 INT display_period = 1000;
33 
35 INT max_event_size = 10000;
36 
38 INT max_event_size_frag = 5*1024*1024;
39 
41 INT event_buffer_size = 10*10000;
42 
43 //-- Equipment list ------------------------------------------------
44 
49 DEVICE_DRIVER mirror_driver[] = {
50  { "mirror_in", phytron_mcc_in, 3, tcpip_rs232, DF_INPUT | DF_PRIO_DEVICE },
51  { "mirror_out", phytron_mcc_out, 2, tcpip_rs232, DF_OUTPUT },
52  { "" }
53 };
54 
56 EQUIPMENT equipment[] = {
57 
58  { "Mirror", // equipment name
59  {77, 0, // event ID, trigger mask
60  "SYSTEM", // event buffer
61  EQ_SLOW, // equipment type
62  0, // event source
63  "FIXED", // format
64  TRUE, // enabled
65  RO_RUNNING |
66  RO_TRANSITIONS, // read when running and on transitions
67  30000, // read every 30 sec
68  0, // stop run after this event limit
69  0, // number of sub events
70  1, // log history every event
71  "", "", "",},
72  cd_multi_read, // readout routine
73  cd_multi, // class driver main routine
74  mirror_driver, // device driver list
75  NULL, // init string
76  },
77 
78  { "" }
79 };
80 
81 //-- Dummy routines ------------------------------------------------
82 
83 INT poll_event(INT source[], INT count, BOOL test) {return 1;};
84 INT interrupt_configure(INT cmd, INT source[], PTYPE adr) {return 1;};
85 
86 //-- Frontend Init -------------------------------------------------
92 {
93  // de-register run-transition notifications
94  cm_deregister_transition(TR_START);
95  cm_deregister_transition(TR_STOP);
96  cm_deregister_transition(TR_PAUSE);
97  cm_deregister_transition(TR_RESUME);
98 
99  return CM_SUCCESS;
100 }
101 
102 //-- Frontend Exit -------------------------------------------------
108 {
109  return CM_SUCCESS;
110 }
111 
112 //-- Frontend Loop -------------------------------------------------
118 {
119  HNDLE hDB, hKey;
120  char str[128];
121  int size;
122  static DWORD change_time;
123  static float prev_demand=294.76;
124  float demand;
125  float measured;
126 
127  // get experiment handle
128  cm_get_experiment_database(&hDB, NULL);
129 
130  // get measured mirror position
131  sprintf(str, "/Equipment/Mirror/Variables/Input");
132  db_find_key(hDB, 0, str, &hKey);
133  size = sizeof(float);
134  db_get_data_index(hDB, hKey, &measured, &size, 0, TID_FLOAT);
135 
136  // get demand mirror position
137  sprintf(str, "/Equipment/Mirror/Variables/Output");
138  db_find_key(hDB, 0, str, &hKey);
139  size = sizeof(float);
140  db_get_data_index(hDB, hKey, &demand, &size, 0, TID_FLOAT);
141 
142  if (fabs(demand-prev_demand) > 0.1) { // demand changed hence start a timer
143  change_time = ss_time();
144  } else {
145  if (ss_time() - change_time > 60) { // enough time difference between a change of the demand
146  if (fabs(demand-measured) > 0.1) { // something is wrong
147  sprintf(str, "Mirror Demand = %0.1f, Measured = %0.1f: something is wrong!", demand, measured);
148  al_trigger_alarm( "mirror_scfe", str, "Warning", str, AT_INTERNAL);
149  }
150  }
151  }
152 
153  return CM_SUCCESS;
154 }
155 
156 //-- Begin of Run --------------------------------------------------
161 INT begin_of_run(INT run_number, char *error)
162 {
163  return CM_SUCCESS;
164 }
165 
166 //-- End of Run ----------------------------------------------------
171 INT end_of_run(INT run_number, char *error)
172 {
173  return CM_SUCCESS;
174 }
175 
176 //-- Pause Run -----------------------------------------------------
181 INT pause_run(INT run_number, char *error)
182 {
183  return CM_SUCCESS;
184 }
185 
186 //-- Resume Run ----------------------------------------------------
191 INT resume_run(INT run_number, char *error)
192 {
193  return CM_SUCCESS;
194 }
195 
196 //------------------------------------------------------------------
INT interrupt_configure(INT cmd, INT source, PTYPE adr)
Definition: vme_fe.c:2119
char * frontend_name
experiment specific ODB structures
Definition: vme_fe.c:159
EQUIPMENT equipment[]
Definition: vme_fe.c:326
INT max_event_size_frag
maximum event size for fragmented events (EQ_FRAGMENTED)
Definition: vme_fe.c:174
INT end_of_run(INT run_number, char *error)
Definition: vme_fe.c:858
INT frontend_init()
Definition: vme_fe.c:416
HNDLE hKey
Definition: write_summary.c:97
INT frontend_loop()
Definition: vme_fe.c:949
BOOL frontend_call_loop
frontend_loop is called periodically if this variable is TRUE
Definition: vme_fe.c:165
HNDLE hDB
Definition: write_summary.c:97
INT max_event_size
maximum event size produced by this frontend
Definition: vme_fe.c:171
INT pause_run(INT run_number, char *error)
Definition: vme_fe.c:886
INT frontend_exit()
Definition: vme_fe.c:557
INT event_buffer_size
buffer size to hold events
Definition: vme_fe.c:177
char * frontend_file_name
The frontend file name, don&#39;t change it.
Definition: vme_fe.c:162
INT poll_event(INT source, INT count, BOOL test)
Definition: vme_fe.c:2102
INT begin_of_run(INT run_number, char *error)
Definition: vme_fe.c:589
DEVICE_DRIVER mirror_driver[]
Definition: mirror_scfe.c:49
INT display_period
a frontend status page is displayed with this frequency in ms
Definition: vme_fe.c:168
INT resume_run(INT run_number, char *error)
Definition: vme_fe.c:893