diff --git a/src/E2Sextupole.cpp b/src/E2Sextupole.cpp index 1d78fecd5ad80c00f75ac80f62a0bc861c44b868..f45670eaf7640c7cb6eec739361ee3074d909384 100644 --- a/src/E2Sextupole.cpp +++ b/src/E2Sextupole.cpp @@ -170,7 +170,7 @@ void E2Sextupole::init_device() set_state(Tango::INIT); set_status("Init"); attr_Current_read = new Tango::DevDouble[1]; - first_read = true; + design_strength_initialized = false; /*----- PROTECTED REGION END -----*/ // E2Sextupole::init_device_before @@ -241,21 +241,9 @@ void E2Sextupole::init_device() cursetAtt = &(get_device_attr()->get_w_attr_by_name("Current")); init_strengths(); - // register callaback for current + // register callback for event subscription with a delay so the memorized variables are read dn updated from DB AFTER init_device() exit - try{ - current_cb = new CurrentEventCallback(this); - current_event_id = current_dev->subscribe_event("current",Tango::CHANGE_EVENT,current_cb); - current_set_event_id = current_dev->subscribe_event("currentSet",Tango::CHANGE_EVENT,current_cb); - state_event_id = current_dev->subscribe_event("State",Tango::CHANGE_EVENT,current_cb); - } - catch(Tango::DevFailed &ex){ - current_cb = nullptr; - ERROR_STREAM << "failed to subscribe Tango events for " << currentDevice; - set_state(Tango::UNKNOWN); - set_status("failed to subscribe Tango events for CurrentDevice"); - return; - } + //delayed_subscribe(subscribeDelay); /*----- PROTECTED REGION END -----*/ // E2Sextupole::init_device } @@ -762,6 +750,11 @@ void E2Sextupole::write_DesignStrength(Tango::WAttribute &attr) // Add your own code /* clang-format off */ *attr_DesignStrength_read = w_val; + if (design_strength_initialized == false){ + subscribe_events(); + design_strength_initialized = true; + INFO_STREAM << "w design strength" << *attr_DesignStrength_read; + } /*----- PROTECTED REGION END -----*/ // E2Sextupole::write_DesignStrength } @@ -925,18 +918,17 @@ void E2Sextupole::update_values(void) attr_CorrectionStrength_read[0] = attr_Strength_read[0] - attr_ResonanceStrength_read[0]; */ //---------------------------------------------- - if (first_read){ - INFO_STREAM << *attr_DesignStrength_read ; - first_read = false; - } - //INFO_STREAM << *attr_DesignStrength_read ; + + + //INFO_STREAM << "design strength: " << *attr_DesignStrength_read; + std::vector<Tango::DevDouble> read_curr; std::vector<Tango::DevDouble> read_strength; read_curr.push_back(*attr_Current_read); sextupole->compute_strengths(magnet_rigidity_inv, read_curr, read_strength); attr_Strength_read[0] = read_strength[0]; - attr_ResonanceStrength_read[0] = attr_Strength_read[0] - wValCorrStrength; - attr_CorrectionStrength_read[0] = attr_Strength_read[0] - wValResStrength; + //attr_ResonanceStrength_read[0] = attr_Strength_read[0] - wValCorrStrength; + attr_CorrectionStrength_read[0] = attr_Strength_read[0] -( attr_DesignStrength_read[0] + attr_ResonanceStrength_read[0]); //handle state - status switch (get_state()) { @@ -961,6 +953,33 @@ void E2Sextupole::update_values(void) } +void E2Sextupole::subscribe_events(void) +{ + try{ + current_cb = new CurrentEventCallback(this); + current_event_id = current_dev->subscribe_event("current",Tango::CHANGE_EVENT,current_cb); + current_set_event_id = current_dev->subscribe_event("currentSet",Tango::CHANGE_EVENT,current_cb); + state_event_id = current_dev->subscribe_event("State",Tango::CHANGE_EVENT,current_cb); + } + catch(Tango::DevFailed &ex){ + current_cb = nullptr; + ERROR_STREAM << "failed to subscribe Tango events for " << currentDevice; + set_state(Tango::UNKNOWN); + set_status("failed to subscribe Tango events for CurrentDevice"); + return; + } +} +/* trick to start sunbscrition afetr some delay +void E2Sextupole::delayed_subscribe(int delayMs) +#include <thread> +#include <chrono> +{ + std::thread([this, delayMs]() { + std::this_thread::sleep_for(std::chrono::milliseconds(delayMs)); + this->subscribe_events(); // Call the method after the delay + }).detach(); // Detach the thread to run independently +} +*/ //------------------------------------------------------------ //------------------------------------------------------------ CurrentEventCallback::CurrentEventCallback(E2Sextupole* sext) //callback constructor diff --git a/src/E2Sextupole.h b/src/E2Sextupole.h index 00a9bddf440b5076d423af869d18b9cdfe904cf2..a2c777c95c741ed1adaacf52453fc3720e5a9df0 100644 --- a/src/E2Sextupole.h +++ b/src/E2Sextupole.h @@ -93,11 +93,11 @@ class E2Sextupole : public TANGO_BASE_CLASS Tango::WAttribute *resonanceAtt; std::vector<double> set_current; //the actual set point of the current (from the power supply) used for strength calculations std::vector<double> set_strength; //the strength set point + bool design_strength_initialized; //true whe design strenfght has been called at least one , first call is to init valude from DB public: omni_mutex iomutex; //guard for event and write interference Tango::DevDouble wValCorrStrength; //last CorrectionStrength write value Tango::DevDouble wValResStrength; //last ResonanceStrength write value - bool first_read; /* clang-format off */ /*----- PROTECTED REGION END -----*/ // E2Sextupole::Data Members @@ -315,6 +315,8 @@ public: void set_current_write(const double& curr); void update_values(void); //update internal calculated values void init_strengths(void); // initialize strengths from power supply values + void subscribe_events(void); //subcribe events to power supply + //void delayed_subscribe(int delayedMs); /* clang-format off */ /*----- PROTECTED REGION END -----*/ // E2Sextupole::Additional Method prototypes };