#include #include #include #include #include #include #include #include "midas.h" #include "msystem.h" #include "odbxx.h" #include "mfe.h" using namespace std; using midas::odb; /*-- Globals -------------------------------------------------------*/ /* The frontend name (client name) as seen by other MIDAS clients */ const char *frontend_name = "Test FE"; /* The frontend file name, don't change it */ const char *frontend_file_name = __FILE__; /* frontend_loop is called periodically if this variable is TRUE */ BOOL frontend_call_loop = FALSE; /* a frontend status page is displayed with this frequency in ms */ INT display_period = 0; /* maximum event size produced by this frontend */ INT max_event_size = 32 * (1024 * 1024); // 32MiB /* maximum event size for fragmented events (EQ_FRAGMENTED) */ INT max_event_size_frag = 5 * 1024 * 1024; /* buffer size to hold events */ INT event_buffer_size = 4 * max_event_size; BOOL equipment_common_overwrite = TRUE;//true is overwriting the common odb /*-- Function declarations -----------------------------------------*/ INT read_odb(char * pevent, INT); void watch(odb o); /*-- Equipment list ------------------------------------------------*/ EQUIPMENT equipment[] = { { "Test FE", /* equipment name */ {1, 0, /* event ID, trigger mask */ "SYSTEM", /* event buffer */ EQ_PERIODIC, /* equipment type */ 0, /* event source */ "MIDAS", /* format */ TRUE, /* enabled */ RO_ALWAYS | RO_ODB, /* read always and update ODB */ 1000, /* read every 1 sec */ 0, /* stop run after this event limit */ 0, /* number of sub events */ 0, /* log history every event */ "", "", ""}, read_odb, /* readout routine */ }, {""}}; /*-- Dummy routines ------------------------------------------------*/ INT poll_event(INT, INT count, BOOL test) { return 0; } INT interrupt_configure(INT, INT, POINTER_T) { return 1; } /*-- Frontend Init -------------------------------------------------*/ INT frontend_init() { cm_msg(MINFO, "frontend_init() setup", "Test FE"); odb settings = { {"Test", 123}, {"sub", {}} }; settings.connect_and_fix_structure("/Equipment/Test FE/Settings"); // settings.watch(watch); <-- this works without segmentation fault odb new_settings("/Equipment/Test FE/Settings"); new_settings.watch(watch); // <-- here I am getting a segmentation fault return CM_SUCCESS; } void watch(odb o) { std::string name = o.get_name(); if (name == "Test") { printf("I am a watch on Test\n"); } } /*-- Frontend Exit -------------------------------------------------*/ INT frontend_exit() { return CM_SUCCESS; } /*-- Frontend Loop -------------------------------------------------*/ INT frontend_loop() { return CM_SUCCESS; } /*-- Begin of Run --------------------------------------------------*/ INT begin_of_run(INT run_number, char *error) { return CM_SUCCESS; } /*-- End of Run ----------------------------------------------------*/ INT end_of_run(INT run_number, char *error) { return CM_SUCCESS; } /*-- Pause Run -----------------------------------------------------*/ INT pause_run(INT run_number, char *error) { return CM_SUCCESS; } /*-- Resume Run ----------------------------------------------------*/ INT resume_run(INT run_number, char *error) { return CM_SUCCESS; } /* -- Readout --*/ INT read_odb(char *pevent, INT){ return 0; }