MIDAS
Loading...
Searching...
No Matches
crfe.cxx
Go to the documentation of this file.
1/********************************************************************\
2
3 Name: crfe.cxx
4 Created by: Stefan Ritt
5
6 Contents: Code for modern slow control front-end "Clock and Reset"
7 to illustrate manual generation of slow control
8 events and hardware updates via cm_watch().
9
10 The values of
11
12 /Equipment/Clock Reset/Settings/Active
13 /Equipment/Clock Reset/Settings/Delay
14
15 are propagated to hardware when the ODB value chanes.
16
17 The triggers
18
19 /Equipment/Clock Reset/Settings/Reset Trigger
20 /Equipment/Clock Reset/Settings/Sync Trigger
21
22 can be set to TRUE to trigger a specific action
23 in this front-end.
24
25 For a real program, the "TODO" lines have to be
26 replaced by actual hardware acces.
27
28 Custom page
29 -----------
30
31 The custom page "cr.html" in this directory can be
32 used to control the settins of this frontend. To
33 do so, set "/Custom/Path" in the ODB to this
34 directory and create a string
35
36 /Custom/Clock Reset = cr.html
37
38 then click on "Clock Reset" on the left lower corner
39 in the web status page.
40
41\********************************************************************/
42
43#include <stdio.h>
44#include <assert.h>
45#include "midas.h"
46#include "mfe.h"
47
48/*-- Globals -------------------------------------------------------*/
49
50/* The frontend name (client name) as seen by other MIDAS clients */
51const char *frontend_name = "CR Frontend";
52/* The frontend file name, don't change it */
53const char *frontend_file_name = __FILE__;
54
55/* frontend_loop is called periodically if this variable is TRUE */
57
58/* a frontend status page is displayed with this frequency in ms */
60
61/* maximum event size produced by this frontend */
63
64/* maximum event size for fragmented events (EQ_FRAGMENTED) */
65INT max_event_size_frag = 5 * 1024 * 1024;
66
67/* buffer size to hold events */
69
70/*-- Function declarations -----------------------------------------*/
71
72INT read_cr_event(char *pevent, INT off);
73void cr_settings_changed(HNDLE, HNDLE, int, void *);
74
75/*-- Equipment list ------------------------------------------------*/
76
78
79/* Default values for /Equipment/Clock Reset/Settings */
80const char *cr_settings_str[] = {
81"Active = BOOL : 1",
82"Delay = INT : 0",
83"Reset Trigger = BOOL : 0",
84"Sync Trigger = BOOL : 0",
85"Names CRT1 = STRING[4] :",
86"[32] Temp0",
87"[32] Temp1",
88"[32] Temp2",
89"[32] Temp3",
90NULL
91};
92
94
95 {"Clock Reset", /* equipment name */
96 {10, 0, /* event ID, trigger mask */
97 "SYSTEM", /* event buffer */
98 EQ_PERIODIC, /* equipment type */
99 0, /* event source */
100 "MIDAS", /* format */
101 TRUE, /* enabled */
102 RO_ALWAYS | RO_ODB, /* read always and update ODB */
103 10000, /* read every 10 sec */
104 0, /* stop run after this event limit */
105 0, /* number of sub events */
106 1, /* log history every event */
107 "", "", ""} ,
108 read_cr_event, /* readout routine */
109 },
110
111 {""}
112};
113
114
115/*-- Dummy routines ------------------------------------------------*/
116
118{
119 return 1;
120};
121
123{
124 return 1;
125};
126
127/*-- Frontend Init -------------------------------------------------*/
128
130{
131 HNDLE hKey;
132
133 // create Settings structure in ODB
134 db_create_record(hDB, 0, "Equipment/Clock Reset/Settings", strcomb1(cr_settings_str).c_str());
135 db_find_key(hDB, 0, "/Equipment/Clock Reset", &hKey);
136 assert(hKey);
137
139
140 /*
141 * Set our transition sequence. The default is 500. Setting it
142 * to 600 means we are called AFTER most other clients.
143 */
145
146 return CM_SUCCESS;
147}
148
149/*-- Frontend Exit -------------------------------------------------*/
150
152{
153 return CM_SUCCESS;
154}
155
156/*-- Frontend Loop -------------------------------------------------*/
157
159{
160 return CM_SUCCESS;
161}
162
163/*-- Begin of Run --------------------------------------------------*/
164
165#define N_READBACK 4
166
168{
169 /*
170 * This example code starts a run transition, then waits on some
171 * external conditions by polling an array in the ODB. It expects
172 * that other programs set the readback array in the ODB to the
173 * current run number
174 */
175
176 HNDLE hDB, hKey;
177 INT readback[N_READBACK], i;
179
180 // set requested run number in ODB
181 db_set_value(hDB, 0, "/Equipment/Clock Reset/Run transitions/Requested run number", &run_number, sizeof(INT), 1, TID_INT);
182
183 // retrieve readback array form ODB
184 int size = sizeof(readback);
185 memset(readback, 0, size);
186 db_find_key(hDB, 0, "/Equipment/Clock Reset/Run transitions/FEB readback", &hKey);
187 if (!hKey) {
188 // create readback array if not existing
189 db_create_key(hDB, 0, "/Equipment/Clock Reset/Run transitions/FEB readback", TID_INT);
190 db_find_key(hDB, 0, "/Equipment/Clock Reset/Run transitions/FEB readback", &hKey);
191 db_set_data(hDB, hKey, readback, size, N_READBACK, TID_INT);
192 }
193
194 // set equipment status for status web page
195 set_equipment_status("Clock Reset", "Waiting for readback", "yellowLight");
196
197 // wait until readback succeeds
198 int start_time = ss_time();
199 do {
200 db_get_data(hDB, hKey, readback, &size, TID_INT);
201 for (i=0 ; i<N_READBACK ; i++) {
202 if (readback[i] != run_number)
203 break;
204 }
205 if (i == N_READBACK)
206 break;
207
208 // don't waste 100% CPU time
209 ss_sleep(10);
210
211 } while (ss_time() < start_time + 5); // wait maximal 5 seconds
212
213 if (i < N_READBACK) {
214 strcpy(error, "Timeout receiving FEB feedback");
215 return FE_ERR_HW;
216 }
217
218 // set equipment status for status web page
219 set_equipment_status("Clock Reset", "Ok", "greenLight");
220
221 return CM_SUCCESS;
222}
223
224/*-- End of Run ----------------------------------------------------*/
225
227{
228 return CM_SUCCESS;
229}
230
231/*-- Pause Run -----------------------------------------------------*/
232
234{
235 return CM_SUCCESS;
236}
237
238/*-- Resume Run ----------------------------------------------------*/
239
241{
242 return CM_SUCCESS;
243}
244
245/*--- Read Clock and Reset Event to be put into data stream --------*/
246
247 /*
248 *
249 // example event to be directly injected into the stream
250 struct EVENT {
251 BANK_HEADER header;
252 BANK32 bank;
253 DWORD d1[4];
254 };
255
256 struct EVENT e = {
257 { // BANK_HEADER
258 sizeof(BANK32) + ALIGN8(4*sizeof(DWORD)), // total size
259 BANK_FORMAT_VERSION | BANK_FORMAT_32BIT // flags
260 },
261 { // BANK32
262 {'N', 'A', 'M', 'E'}, // bank name
263 TID_DWORD, // type
264 4*sizeof(DWORD) // data size
265 },
266 { 1, 2, 3, 4 } // data
267 };
268
269 Inject event via -->
270
271 INT read_cr_event(char *pevent, INT off)
272 {
273 memcpy(pevent, &e, sizeof(e));
274 return bk_size(pevent);
275 }
276 */
277
278INT read_cr_event(char *pevent, INT off)
279{
280 bk_init(pevent);
281
282 float *pdata;
283 bk_create(pevent, "CRT1", TID_FLOAT, (void **)&pdata);
284
285 *pdata++ = (float) rand() / RAND_MAX;
286 *pdata++ = (float) rand() / RAND_MAX;
287 *pdata++ = (float) rand() / RAND_MAX;
288 *pdata++ = (float) rand() / RAND_MAX;
289
290 bk_close(pevent, pdata);
291
292 return bk_size(pevent);
293}
294
295/*--- Called whenever settings have changed ------------------------*/
296
298{
299 KEY key;
300
302
303 if (std::string(key.name) == "Active") {
304 BOOL value;
305 int size = sizeof(value);
306 db_get_data(hDB, hKey, &value, &size, TID_BOOL);
307 cm_msg(MINFO, "cr_settings_changed", "Set active to %d", value);
308 // TODO: propagate to hardware
309 }
310
311 if (std::string(key.name) == "Delay") {
312 INT value;
313 int size = sizeof(value);
314 db_get_data(hDB, hKey, &value, &size, TID_INT);
315 cm_msg(MINFO, "cr_settings_changed", "Set delay to %d", value);
316 // TODO: propagate to hardware
317 }
318
319 if (std::string(key.name) == "Reset Trigger") {
320 BOOL value;
321 int size = sizeof(value);
322 db_get_data(hDB, hKey, &value, &size, TID_BOOL);
323 if (value) {
324 cm_msg(MINFO, "cr_settings_changed", "Execute reset");
325 // TODO: propagate to hardware
326 value = FALSE; // reset flag in ODB
327 db_set_data(hDB, hKey, &value, sizeof(value), 1, TID_BOOL);
328 }
329 }
330
331 if (std::string(key.name) == "Sync Trigger") {
332 BOOL value;
333 int size = sizeof(value);
334 db_get_data(hDB, hKey, &value, &size, TID_BOOL);
335 if (value) {
336 cm_msg(MINFO, "cr_settings_changed", "Execute sync");
337 // TODO: propagate to hardware
338 value = FALSE; // reset flag in ODB
339 db_set_data(hDB, hKey, &value, sizeof(value), 1, TID_BOOL);
340 }
341 }
342}
#define FALSE
Definition cfortran.h:309
BOOL frontend_call_loop
Definition crfe.cxx:56
const char * frontend_file_name
Definition crfe.cxx:53
#define N_READBACK
Definition crfe.cxx:165
INT max_event_size
Definition crfe.cxx:62
INT frontend_exit()
Frontend exit.
Definition crfe.cxx:151
INT frontend_init()
Frontend initialization.
Definition crfe.cxx:129
INT event_buffer_size
Definition crfe.cxx:68
INT read_cr_event(char *pevent, INT off)
Definition crfe.cxx:278
INT max_event_size_frag
Definition crfe.cxx:65
INT interrupt_configure(INT cmd, INT source, POINTER_T adr)
Definition crfe.cxx:122
BOOL equipment_common_overwrite
Definition crfe.cxx:77
void cr_settings_changed(HNDLE, HNDLE, int, void *)
Definition crfe.cxx:297
INT poll_event(INT source, INT count, BOOL test)
Definition crfe.cxx:117
EQUIPMENT equipment[]
Definition crfe.cxx:93
const char * frontend_name
Definition crfe.cxx:51
const char * cr_settings_str[]
Definition crfe.cxx:80
INT display_period
Definition crfe.cxx:59
INT begin_of_run(INT run_number, char *error)
Begin of Run.
Definition crfe.cxx:167
INT frontend_loop()
Frontend loop.
Definition crfe.cxx:158
INT end_of_run(INT run_number, char *error)
End of Run.
Definition crfe.cxx:226
INT bk_close(void *event, void *pdata)
Definition midas.cxx:16780
void bk_init(void *event)
Definition midas.cxx:16406
void bk_create(void *event, const char *name, WORD type, void **pdata)
Definition midas.cxx:16561
INT bk_size(const void *event)
Definition midas.cxx:16495
INT cm_get_experiment_database(HNDLE *hDB, HNDLE *hKeyClient)
Definition midas.cxx:3011
INT cm_set_transition_sequence(INT transition, INT sequence_number)
Definition midas.cxx:3723
#define CM_SUCCESS
Definition midas.h:582
#define FE_ERR_HW
Definition midas.h:719
#define TID_BOOL
Definition midas.h:340
#define TR_START
Definition midas.h:405
#define RO_ODB
Definition midas.h:438
#define EQ_PERIODIC
Definition midas.h:414
#define MINFO
Definition midas.h:560
#define TID_INT
Definition midas.h:338
#define TID_FLOAT
Definition midas.h:341
#define RO_ALWAYS
Definition midas.h:436
DWORD ss_time()
Definition system.cxx:3462
INT ss_sleep(INT millisec)
Definition system.cxx:3628
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
Definition midas.cxx:915
std::string strcomb1(const char **list)
Definition odb.cxx:598
INT db_get_data(HNDLE hDB, HNDLE hKey, void *data, INT *buf_size, DWORD type)
Definition odb.cxx:6539
INT db_create_key(HNDLE hDB, HNDLE hKey, const char *key_name, DWORD type)
Definition odb.cxx:3308
INT db_get_key(HNDLE hDB, HNDLE hKey, KEY *key)
Definition odb.cxx:6019
INT db_watch(HNDLE hDB, HNDLE hKey, void(*dispatcher)(INT, INT, INT, void *), void *info)
Definition odb.cxx:13813
INT db_set_data(HNDLE hDB, HNDLE hKey, const void *data, INT buf_size, INT num_values, DWORD type)
Definition odb.cxx:7215
INT db_set_value(HNDLE hDB, HNDLE hKeyRoot, const char *key_name, const void *data, INT data_size, INT num_values, DWORD type)
Definition odb.cxx:5261
INT db_find_key(HNDLE hDB, HNDLE hKey, const char *key_name, HNDLE *subhKey)
Definition odb.cxx:4079
INT db_create_record(HNDLE hDB, HNDLE hKey, const char *orig_key_name, const char *init_str)
Definition odb.cxx:12800
HNDLE hKey
INT run_number[2]
Definition mana.cxx:246
HNDLE hDB
main ODB handle
Definition mana.cxx:207
double count
Definition mdump.cxx:33
KEY key
Definition mdump.cxx:34
INT i
Definition mdump.cxx:32
int set_equipment_status(const char *name, const char *equipment_status, const char *status_class)
Definition mfe.cxx:884
INT HNDLE
Definition midas.h:132
DWORD BOOL
Definition midas.h:105
int INT
Definition midas.h:129
#define TRUE
Definition midas.h:182
#define POINTER_T
Definition midas.h:166
#define resume_run
#define pause_run
program test
Definition miniana.f:6
double value[100]
Definition odbhist.cxx:42
Definition midas.h:1026
char name[NAME_LENGTH]
Definition midas.h:1029