Skip to content
Snippets Groups Projects
Commit 38a76b66 authored by Claudio Scafuri's avatar Claudio Scafuri :speech_balloon:
Browse files

handle correctly initial setting of design strength

parent cfb685d4
No related branches found
No related tags found
2 merge requests!2Development,!1Development
......@@ -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
......
......@@ -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
};
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment