diff --git a/src/device/itc_pressure_optimizer.cpp b/src/device/itc_pressure_optimizer.cpp index f92d83e..7a4fe0f 100644 --- a/src/device/itc_pressure_optimizer.cpp +++ b/src/device/itc_pressure_optimizer.cpp @@ -14,6 +14,8 @@ itcPressureOptimizer::itcPressureOptimizer(std::string equipmentName, const char *equipmentFilename, int channel) : TMFeEquipment(equipmentName.c_str(), equipmentFilename) { + fEqConfReadOnlyWhenRunning = false; + fEqConfPeriodMilliSec = 100; this->equipmentPath = std::string("/Equipment/") + equipmentName; info.num_channels = channel; } @@ -25,14 +27,24 @@ itcPressureOptimizer::HandleInit(const std::vector &args) { } void itcPressureOptimizer::HandlePeriodic() { + midas::odb o(this->equipmentPath + "/" + Configuration::VARIABLE_DIR); + for (int i = 0; i < info.num_channels; i++) { + info.last_measured[i] = o[Configuration::MEASURED_VARNAME.c_str()][i]; + info.last_demand[i] = o[Configuration::DEMAND_VARNAME.c_str()][i]; + } + + this->mitc_pressc_update_mitc_input(); + this->mitc_pressc_update_pressure_demanded(); + this->mitc_pressc_recalculate(); + + for (int i = 0; i < info.num_channels; i++) { + o[Configuration::MEASURED_VARNAME.c_str()][i] = info.last_measured[i]; + o[Configuration::DEMAND_VARNAME.c_str()][i] = info.last_demand[i]; } } INT itcPressureOptimizer::mitc_pressc_init() { - /* - cm_get_experiment_database(&hDB, NULL); - */ int status = SUCCESS; bool isDefaultNameExists; bool isDefaultThresholdExists; @@ -147,6 +159,7 @@ INT itcPressureOptimizer::mitc_pressc_init() { } info.mitcPath = Configuration::SLASH + Configuration::EQUIPMENT_DIR + + Configuration::SLASH + info.mitcpressc_settings.mitcequipment + Configuration::SLASH + Configuration::VARIABLE_DIR; @@ -163,7 +176,6 @@ INT itcPressureOptimizer::mitc_pressc_init() { info.last_press_mitc_output = 0; info.recalculate = TRUE; info.pending = TRUE; - // info.mitc_input = NULL; info.press_mitc_output = -1.0f; info.nvals_mitc_input = 0; info.nvals_mitc_output = 0; @@ -297,6 +309,21 @@ INT itcPressureOptimizer::mitc_pressc_init() { // this is done in mitc_pressc_set() when the last parameter is // initialized + /* + Hot link + */ + + midas::odb to_watch(this->equipmentPath + "/" + + Configuration::VARIABLE_DIR + "/" + + Configuration::DEMAND_VARNAME); + + to_watch.watch([&](midas::odb &arg) { + midas::odb o(this->equipmentPath + "/" + Configuration::VARIABLE_DIR); + int index = arg.get_last_index(); + float value = o[Configuration::DEMAND_VARNAME][arg.get_last_index()]; + this->mitc_pressc_set(index, value); + }); + return FE_SUCCESS; } @@ -323,6 +350,14 @@ INT itcPressureOptimizer::mitc_pressc_update_mitc_input() { } float tpow; + { + std::string mitc_input_path = std::string("/Equipment/") + + info.mitcpressc_settings.mitcequipment + + "/" + Configuration::VARIABLE_DIR; + midas::odb o(mitc_input_path.c_str()); + + info.mitc_input = o[Configuration::INPUT_VARNAME.c_str()]; + } // TODO : Understand what this piece of code is used, and does the float // condition correct ... "!=" is suspect @@ -333,7 +368,11 @@ INT itcPressureOptimizer::mitc_pressc_update_mitc_input() { DWORD curtime; // measured MITCPRESSC_MercuryITC Loop0 Temperature Setpoint 1 + printf("update temps\n"); if ((info.mitc_input[info.mitcpressc_settings.getvarioxspindex]) != -1) { + printf("last measured\n"); + printf("index %d value %f\n", info.mitcpressc_settings.getvarioxspindex, + info.mitc_input[info.mitcpressc_settings.getvarioxspindex]); if (info.last_measured[1] != info.mitc_input[info.mitcpressc_settings.getvarioxspindex]) { @@ -439,8 +478,10 @@ INT itcPressureOptimizer::mitc_pressc_update_pressure_demanded() { } INT itcPressureOptimizer::mitc_pressc_recalculate() { - if (!info.initialised) + if (!info.initialised) { + printf("not initialised\n"); return FE_SUCCESS; + } if (info.pending) { info.recalculate = TRUE; @@ -460,6 +501,7 @@ INT itcPressureOptimizer::mitc_pressc_recalculate() { if (info.last_measured[4] >= 0.f) { // Calculate presure + printf("calculate pressure \n"); info.pending = FALSE; @@ -483,11 +525,12 @@ INT itcPressureOptimizer::mitc_pressc_recalculate() { // if (p > pmax) p = pmax c2contrib = info.last_measured[4] * info.last_demand[11]; - c1contrib = info.last_demand[10] * info.last_measured[2] - - info.last_measured[1] - c2contrib; + c1contrib = + info.last_demand[10] * + (info.last_measured[2] - info.last_measured[1] - c2contrib); press = info.last_demand[8] + c1contrib; - info.last_measured[10] - c1contrib; + info.last_measured[10] = c1contrib; if (c2contrib != 0.0f) info.last_measured[11] = -c2contrib * info.last_demand[10]; @@ -502,7 +545,7 @@ INT itcPressureOptimizer::mitc_pressc_recalculate() { press = info.last_demand[8]; // Presure larger than max? -> take max - if (press < info.last_demand[9]) + if (press > info.last_demand[9]) press = info.last_demand[9]; // update measured of MITCPRESSC_CalcPressure 5 @@ -518,6 +561,7 @@ INT itcPressureOptimizer::mitc_pressc_recalculate() { // Check of hkey_demand is missing if (fabsf(info.last_demand[0] - presst) >= 0.05f) { midas::odb o(this->equipmentPath); + printf("%f is a new value\n", presst); o[Configuration::DEMANDE_PATH.c_str()][0] = presst; } info.last_demand[0] = presst; @@ -677,18 +721,37 @@ INT itcPressureOptimizer::mitc_pressc_set(INT channel, float value) { return FE_SUCCESS; } -INT itcPressureOptimizer::mitc_pressc_get_demand(INT channel, float *pvalue) { - if (pvalue) { - if ((channel >= 0) && (channel < info.num_channels)) { - if (*pvalue != info.last_demand[channel]) - cm_msg(MLOG, "", "Channel %d: Output was %f - now set to %f", - channel, *pvalue, info.last_demand.at(channel)); - *pvalue = info.last_demand.at(channel); - } else { - *pvalue = -1.0f; - } +float itcPressureOptimizer::getDemand(int channel) { + float pvalue; + if ((channel >= 0) && (channel < info.num_channels)) { + pvalue = info.last_demand.at(channel); + } else { + pvalue = -1.0f; } - return FE_SUCCESS; + return pvalue; +} + +float itcPressureOptimizer::get(int channel) { + // update variox readout + mitc_pressc_update_mitc_input(); + + // update pressure demand readout + mitc_pressc_update_pressure_demanded(); + + // recalculate pressure and nv% + mitc_pressc_recalculate(); + + if ((channel == info.num_channels - 1) && !info.initialised) + ss_sleep(1000); + float pvalue; + if ((channel >= 0) && (channel < info.num_channels)) { + pvalue = info.last_measured[channel]; + + } else { + pvalue = -1.0f; + } + + return pvalue; } INT itcPressureOptimizer::mitc_pressc_get(INT channel, float *pvalue) { diff --git a/src/device/itc_pressure_optimizer.h b/src/device/itc_pressure_optimizer.h index 7130a73..b7e6050 100644 --- a/src/device/itc_pressure_optimizer.h +++ b/src/device/itc_pressure_optimizer.h @@ -48,7 +48,7 @@ class itcPressureOptimizer : public TMFeEquipment { /* ???? */ - INT mitc_pressc_get_demand(INT channel, float *pvalue); + float getDemand(int channel); /* @@ -58,6 +58,8 @@ class itcPressureOptimizer : public TMFeEquipment { std::string getDefaultName(int channel); float getDefaultThreshold(int channel); + + float get(int channel); }; #endif \ No newline at end of file