diff --git a/src/device/itc_pressure_optimizer.cpp b/src/device/itc_pressure_optimizer.cpp index 5e2e826..da3583f 100644 --- a/src/device/itc_pressure_optimizer.cpp +++ b/src/device/itc_pressure_optimizer.cpp @@ -499,27 +499,235 @@ INT itcPressureOptimizer::mitc_pressc_recalculate(MITCPRESSC_INFO *info) { } return FE_SUCCESS; } + +/* + _Pressure 0 D + _MercuryITCSetpoint 1 + _MercuryITCTemperat(ure) 2 + _MercuryITCPower 3 + _AveragedPower 4 + _CalcPressure 5 + _PressureControlMode 6 D + _SetRCPressure 7 D + _PressureCalc_minPressure 8 D + _PressureCalc_maxPressure 9 D + _PressureCalc_const1 10 D + _PressureCalc_const2 11 D + */ + INT itcPressureOptimizer::mitc_pressc_set(MITCPRESSC_INFO *info, INT channel, float value) { - return 0; + switch (channel) { + case 0: // PRESSURE - only set pressure if not in calculated mode + if (info->last_demand[6] != 1.0f) { + if (info->last_demand[channel] != value) { + info->last_demand[channel] = value; + info->last_demand_set[channel] = ss_time(); + info->recalculate = TRUE; + } + } else { + if (std::abs(info->last_demand[channel] - value) > 0.2f) { + cm_msg(MLOG, "", + "PressureControlMode is set to calculated! " + "- Not setting pressure!"); + } + } + break; + case 6: // Pressure Control Mode : 1 = Calc(automatic), 0 = Man + if ((info->last_demand[channel] != 1.0f) && (value == 1.0f)) { + info->last_demand[channel] = 1.0f; + info->last_demand_set[channel] = ss_time(); + cm_msg(MLOG, "", "Pressure Control Mode is set to Calculated"); + + info->recalculate = TRUE; + } else if ((info->last_demand[channel] != 0.0f) && (value != 1.0f)) { + info->last_demand[channel] = 0.0f; + info->last_demand_set[channel] = ss_time(); + + cm_msg(MLOG, "", "Pressure Control Mode is set to Manual"); + + info->recalculate = TRUE; + } + break; + case 7: // set Pressure for Mercury ITC: 1 = Update Mercury ITC Pressure + // Setpoint + // 0 = do not + if ((info->last_demand[channel] != 1.0f) && (value == 1.0f)) { + info->last_demand[channel] = 1.0f; + info->last_demand_set[channel] = ss_time(); + + cm_msg(MLOG, "", + "MPC_SetPressure is enabled - Setting Mercury ITC " + "Pressure Setpoint in ODB"); + } else if ((info->last_demand[channel] != 0.0f) && (value != 1.0f)) { + info->last_demand[channel] = 0.0f; + info->last_demand_set[channel] = ss_time(); + cm_msg(MLOG, "", + "MPC_SetPressure is disabled - Not Setting Mercury ITC " + "Pressure Setpoint in ODB"); + + info->recalculate = TRUE; + } + break; + case 8: // min pressure + case 9: // max pressure + case 10: // pressure c1 + case 11: // pressure c2 + if (info->last_demand[channel] != value) { + char name[NAME_LENGTH], + name1[NAME_LENGTH]; // TODO : change to std::string + mitc_pressc_get_name(info, channel, name); + if (info->initialised) + cm_msg(MLOG, "", "Channel %d (%s): output was %f now set to %f", + channel, name, *(info->last_demand + channel), value); + else + cm_msg(MLOG, "", "%s (Channel %d): Output is set to %f", name, + channel, value); + + if (channel == 9) { + if (info->last_demand[channel - 1] >= value) { + mitc_pressc_get_name(info, channel - 1, name1); + cm_msg(MERROR, "mitc_pressc_set", + "%s should be larger than %s (%f)", name, name1, + *(info->last_demand + channel - 1)); + } + } + info->last_demand[channel] = value; + info->last_demand_set[channel] = ss_time(); + info->recalculate = TRUE; + } + break; + } + + // all demand values set from ODB during init? + if ((channel == info->num_channels - 1) && !info->initialised) { + info->initialised = TRUE; // flag init done + info->recalculate = TRUE; // flag to recalculate + } + + mitc_pressc_recalculate(info); + return FE_SUCCESS; } INT itcPressureOptimizer::mitc_pressc_get_demand(MITCPRESSC_INFO *info, INT channel, float *pvalue) { - return 0; + if (pvalue) { + if ((channel >= 0) && (channel < info->num_channels) && + (info->last_demand)) { + if (*pvalue != info->last_demand[channel]) + cm_msg(MLOG, "", "Channel %d: Output was %f - now set to %f", + channel, *pvalue, *(info->last_demand + channel)); + *pvalue = info->last_demand[channel]; + } else { + *pvalue = -1.0f; + } + } + return FE_SUCCESS; } INT itcPressureOptimizer::mitc_pressc_get(MITCPRESSC_INFO *info, INT channel, float *pvalue) { - return 0; + // update variox readout + mitc_pressc_update_mitc_input(info); + + // update pressure demand readout + mitc_pressc_update_pressure_demanded(info); + + // recalculate pressure and nv% + mitc_pressc_recalculate(info); + + if ((channel == info->num_channels - 1) && !info->initialised) + ss_sleep(1000); + + if (pvalue) { + if ((channel >= 0) && (channel < info->num_channels) && + info->last_measured) { + if (*pvalue != info->last_measured[channel]) { + *pvalue = info->last_measured[channel]; + } + } else { + *pvalue = -1.0f; + } + } + return FE_SUCCESS; } +/* + Default threshold for measured values index threshold + ---------------------------------------------------------------------- + _Pressure 0 0.01 + _MercuryITCSetpoint 1 0.001 + _MercuryITCTemperat(ure) 2 0.0001 + _MercuryITCPower 3 0.1 + _AveragedPower 4 0.01 + _CalcPressure 5 0.01 + _PressureControlMode 6 - + _SetRCPressure 7 - + _PressureCalc_minPressure 8 0.01 + _PressureCalc_maxPressure 9 0.01 + _PressureCalc_const1 10 0.01 + _PressureCalc_const2 11 0.01 + */ + INT itcPressureOptimizer::mitc_pressc_get_default_threshold( MITCPRESSC_INFO *info, INT channel, float *pvalue) { - return 0; + switch (channel) { + case 0: + case 4: + case 5: + case 8: + case 9: + case 10: + case 11: + *pvalue = 0.01; + break; + + case 3: + *pvalue = 0.1; + break; + case 1: + *pvalue = 0.001; + break; + + case 2: + *pvalue = 0.0001; + break; + default: + *pvalue = 1.0; + } + return FE_SUCCESS; } INT itcPressureOptimizer::mitc_pressc_get_name(MITCPRESSC_INFO *info, INT channel, char *name) { - return 0; + if (name != nullptr) { + if (channel == 0) + strcpy(name, "Pressure Setpoint"); + else if (channel == 1) + strcpy(name, "MPC_ITC_VarioxSP"); + else if (channel == 2) + strcpy(name, "MPC_ITC_VarioxTemp"); + else if (channel == 3) + strcpy(name, "MPC_ITC_VarioxPower"); + else if (channel == 4) + strcpy(name, "MPC_AveragedPower"); + else if (channel == 5) + strcpy(name, "MPC_CalcPressure"); + else if (channel == 6) + strcpy(name, "Pressure Control Mode"); + else if (channel == 7) + strcpy(name, "MPC_SetPressure"); + else if (channel == 8) + strcpy(name, "MPC_PressCalcminPress"); + else if (channel == 9) + strcpy(name, "MPC_PressCalcmaxPress"); + else if (channel == 10) + strcpy(name, "MPC_PressCalc_const1"); + else if (channel == 11) + strcpy(name, "MPC_PressCalc_const2"); + else + strcpy(name, "NONE"); + } + + return FE_SUCCESS; }