diff --git a/TODO b/TODO new file mode 100644 index 0000000000000000000000000000000000000000..2972583d743f96a4282b461cc53d3a1d732dcdb7 --- /dev/null +++ b/TODO @@ -0,0 +1,2 @@ +check and fix ResonanceStrength handling +fix units \ No newline at end of file diff --git a/src/E2Sextupole.cpp b/src/E2Sextupole.cpp index f45670eaf7640c7cb6eec739361ee3074d909384..eea8809fc6a773abb716cf2e8cf76d0c46f48b81 100644 --- a/src/E2Sextupole.cpp +++ b/src/E2Sextupole.cpp @@ -211,7 +211,7 @@ void E2Sextupole::init_device() } //create MagnetModel::Sextupole - handles calibration tables and interpolations - // we do not use teh EBS shehme with global proprties... yet + // we do not use teh EBS shehme with global properties... yet //TODO: fix/determine format and handling of Elettra 2.0 calibrations sextupole = nullptr; @@ -239,11 +239,6 @@ void E2Sextupole::init_device() correctionAtt = &get_device_attr()->get_w_attr_by_name("CorrectionStrength"); resonanceAtt = &get_device_attr()->get_w_attr_by_name("ResonanceStrength"); cursetAtt = &(get_device_attr()->get_w_attr_by_name("Current")); - init_strengths(); - - // register callback for event subscription with a delay so the memorized variables are read dn updated from DB AFTER init_device() exit - - //delayed_subscribe(subscribeDelay); /*----- PROTECTED REGION END -----*/ // E2Sextupole::init_device } @@ -555,7 +550,7 @@ void E2Sextupole::write_CorrectionStrength(Tango::WAttribute &attr) omni_mutex_lock guardio(iomutex); Tango::DevDouble newStrength; //resonanceAtt->get_write_value(_resStrength); - newStrength = w_val + wValResStrength; + newStrength = w_val + wValResStrength + *attr_DesignStrength_read; std::vector<double> req_strength; std::vector<double> curr_out; req_strength.push_back(newStrength); @@ -565,6 +560,7 @@ void E2Sextupole::write_CorrectionStrength(Tango::WAttribute &attr) wValCorrStrength = w_val; set_strength[0] = newStrength; strengthAtt->set_write_value(set_strength[0]); + /*----- PROTECTED REGION END -----*/ // E2Sextupole::write_CorrectionStrength } //-------------------------------------------------------- @@ -613,7 +609,7 @@ void E2Sextupole::write_ResonanceStrength(Tango::WAttribute &attr) */ omni_mutex_lock guardio(iomutex); Tango::DevDouble newStrength; - newStrength = w_val + wValCorrStrength; + newStrength = w_val + wValCorrStrength + *attr_DesignStrength_read; std::vector<double> req_strength; std::vector<double> curr_out; req_strength.push_back(newStrength); @@ -621,6 +617,7 @@ void E2Sextupole::write_ResonanceStrength(Tango::WAttribute &attr) Tango::DeviceAttribute watt("Current", curr_out[0]); current_dev->write_attribute(watt); wValResStrength = w_val; + //*attr_ResonanceStrength_read = w_val; set_strength[0] = newStrength; strengthAtt->set_write_value(set_strength[0]); /*----- PROTECTED REGION END -----*/ // E2Sextupole::write_ResonanceStrength @@ -751,9 +748,9 @@ void E2Sextupole::write_DesignStrength(Tango::WAttribute &attr) /* 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; + init_strengths(); + subscribe_events(); } /*----- PROTECTED REGION END -----*/ // E2Sextupole::write_DesignStrength } @@ -810,6 +807,7 @@ void E2Sextupole::reset_resonance_strength() /* clang-format off */ //force to 0 resonance strength omni_mutex_lock guardio(iomutex); + /* Tango::DevDouble newStrength; newStrength = wValCorrStrength; std::vector<double> req_strength; @@ -818,9 +816,12 @@ void E2Sextupole::reset_resonance_strength() sextupole->compute_currents(magnet_rigidity, req_strength, curr_out); Tango::DeviceAttribute watt("Current", curr_out[0]); current_dev->write_attribute(watt); + */ + wValCorrStrength += wValResStrength; wValResStrength = 0.0; - set_strength[0] = newStrength; - strengthAtt->set_write_value(set_strength[0]); + //set_strength[0] = newStrength; + //strengthAtt->set_write_value(set_strength[0]); + correctionAtt->set_write_value(wValCorrStrength); resonanceAtt->set_write_value(0.0); /*----- PROTECTED REGION END -----*/ // E2Sextupole::reset_resonance_strength } @@ -877,7 +878,7 @@ void E2Sextupole::set_current_write(const double& curr) set_current[0] = curr; } // ------------------------------------------------------------ -void E2Sextupole::init_strengths(void) // initialize strengths from power supply value +void E2Sextupole::init_strengths(void) // initialize strengths from power supply value TODO: separate read and set values { Tango::DeviceAttribute da; try { @@ -886,7 +887,7 @@ void E2Sextupole::init_strengths(void) // initialize strengths from power supply da >> outval; std::vector<Tango::DevDouble> _current; std::vector<Tango::DevDouble> _strength; - _current.push_back(outval[1]); + _current.push_back(outval[1]); //use set value of current sextupole->compute_strengths(magnet_rigidity_inv, _current, _strength); cursetAtt->set_write_value(_current[0]); @@ -895,10 +896,11 @@ void E2Sextupole::init_strengths(void) // initialize strengths from power supply strengthAtt->set_write_value(_strength[0]); *attr_Strength_read = _strength[0]; set_strength[0] = _strength[0]; + Tango::DevDouble corr = _strength[0] - *attr_DesignStrength_read; - correctionAtt->set_write_value(_strength[0]); - *attr_CorrectionStrength_read = _strength[0]; - wValCorrStrength = _strength[0]; + correctionAtt->set_write_value(corr); + *attr_CorrectionStrength_read = corr; + wValCorrStrength = corr; resonanceAtt->set_write_value(0.0); // start with resonance strength always at 0! *attr_ResonanceStrength_read = 0.0; @@ -909,28 +911,48 @@ void E2Sextupole::init_strengths(void) // initialize strengths from power supply } } //------------------------------------------------------------ -void E2Sextupole::update_values(void) +// handle changes poer poer supply read current (actula current) +void E2Sextupole::update_values_read(void) { - /* - sextupole->compute_strengths(magnet_rigidity_inv, set_current, set_strength); - attr_Strength_read[0] = set_strength[0]; - attr_ResonanceStrength_read[0] = attr_Strength_read[0] - wValCorrStrength; - attr_CorrectionStrength_read[0] = attr_Strength_read[0] - attr_ResonanceStrength_read[0]; - */ - //---------------------------------------------- - - - //INFO_STREAM << "design strength: " << *attr_DesignStrength_read; - + if (isnan(*attr_Current_read)){ //handle error + attr_Strength_read[0] = NAN; + return; + } + //INFO_STREAM << "update values read"; std::vector<Tango::DevDouble> read_curr; std::vector<Tango::DevDouble> read_strength; + omni_mutex_lock guardio(iomutex); 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] -( attr_DesignStrength_read[0] + attr_ResonanceStrength_read[0]); +} +//------------------------------------------------------------ +// hndle change of write set point of power supply cunnrent +void E2Sextupole::update_values_write(void) +{ + if (isnan(*attr_Current_read)){ //handle error + attr_Strength_read[0] = NAN; + return; + } + + INFO_STREAM << "update values write"; + std::vector<Tango::DevDouble> read_curr; + std::vector<Tango::DevDouble> read_strength; + omni_mutex_lock guardio(iomutex); + read_curr.push_back(set_current[0]); //must use the write value + sextupole->compute_strengths(magnet_rigidity_inv, read_curr, read_strength); + wValCorrStrength = read_strength[0] - (wValResStrength + *attr_DesignStrength_read); + correctionAtt->set_write_value(wValCorrStrength); +} + +//------------------------------------------------------------ +// handel che of power supply state - may just filter values +void E2Sextupole::update_values_state(void) +{ //handle state - status + //INFO_STREAM << "update values state"; switch (get_state()) { case Tango::ON: set_status("On"); @@ -988,27 +1010,43 @@ CurrentEventCallback::CurrentEventCallback(E2Sextupole* sext) //callback constru } void CurrentEventCallback::push_event(Tango::EventData* ev) //callback core method { + bool update_read = false; + bool update_write = false; + bool update_state = false; if (ev->err) { - //TODO hanlde error + //std::cerr << ev->err << " " << ev->attr_name << std::endl; + e2_sext->set_state(Tango::FAULT); + e2_sext->set_status("event error"); + *e2_sext->attr_Current_read = NAN; + e2_sext->update_values_read(); return; } - omni_mutex_lock guardio(e2_sext->iomutex); - //TODO add method to update the corrector when on value changes - std::string fullattrname = ev->attr_name; - std::size_t pos = fullattrname.find_last_of("/"); - std::string attrname = fullattrname.substr(pos+1); - if(attrname == "current") *(ev->attr_value) >> *(e2_sext->attr_Current_read); - if(attrname == "currentset"){ - Tango::DevDouble newcurr; - *(ev->attr_value) >> newcurr; - e2_sext->set_current_write(newcurr); - } - if(attrname == "state") { - Tango::DevState st; - *(ev->attr_value) >> st; - e2_sext->set_state(st); + { + omni_mutex_lock guardio(e2_sext->iomutex); + //TODO add method to update the corrector when on value changes + std::string fullattrname = ev->attr_name; + std::size_t pos = fullattrname.find_last_of("/"); + std::string attrname = fullattrname.substr(pos + 1); + if (attrname == "current") { + *(ev->attr_value) >> *(e2_sext->attr_Current_read); + update_read = true; + } + if (attrname == "currentset") { + Tango::DevDouble newcurr; + *(ev->attr_value) >> newcurr; + e2_sext->set_current_write(newcurr); + update_write = true; + } + if (attrname == "state") { + Tango::DevState st; + *(ev->attr_value) >> st; + e2_sext->set_state(st); + update_state = true; + } } - e2_sext->update_values(); + if (update_read) e2_sext->update_values_read(); + if (update_write) e2_sext->update_values_write(); + if (update_state) e2_sext->update_values_state(); } /*----- PROTECTED REGION END -----*/ // E2Sextupole::namespace_ending diff --git a/src/E2Sextupole.h b/src/E2Sextupole.h index a2c777c95c741ed1adaacf52453fc3720e5a9df0..a938bdaeebd950813fbe518dead032bded3ca1ee 100644 --- a/src/E2Sextupole.h +++ b/src/E2Sextupole.h @@ -313,7 +313,9 @@ public: // Additional Method prototypes void calc_rigidity(const double& energy); void set_current_write(const double& curr); - void update_values(void); //update internal calculated values + void update_values_write(void); //update internal calculated values when current write value is updated; + void update_values_read(void); //update internal calculated values when current read value is updated; + void update_values_state(void); //update internal calculated values when power supply state is updated; void init_strengths(void); // initialize strengths from power supply values void subscribe_events(void); //subcribe events to power supply //void delayed_subscribe(int delayedMs);