diff --git a/tests/src/TecDummy.cc b/tests/src/TecDummy.cc index a8609defa0b38afd1e78554df97c7d91756c3d1c..5aafffac01359f6299ebca1bdfda09f15f03f72f 100644 --- a/tests/src/TecDummy.cc +++ b/tests/src/TecDummy.cc @@ -6,6 +6,58 @@ #include <boost/crc.hpp> #include <sstream> +// Read-only tec variables as per tec communication specification document +static std::vector<TecFrame::TecParameter> READ_ONLY_VARS = { + // Parameters 100-999 are read-only, except 108 (Enable/disable save to flash) + TecFrame::TecParameter::DeviceType, + TecFrame::TecParameter::HardwareVersion, + TecFrame::TecParameter::SerialNumber, + TecFrame::TecParameter::FirmwareVersion, + TecFrame::TecParameter::DeviceStatus, + TecFrame::TecParameter::ErrorNumber, + TecFrame::TecParameter::ErrorInstance, + TecFrame::TecParameter::ErrorParameter, + TecFrame::TecParameter::ParameterSystemFlashStatus, + + // All monitoring parmaters are read-only + TecFrame::TecParameter::MonObjectTemperature, + TecFrame::TecParameter::MonSinkTemperature, + TecFrame::TecParameter::MonTargetObjectTemperature, + TecFrame::TecParameter::MonRampNominalObjectTemperature, + TecFrame::TecParameter::MonThermalPowerModelCurrent, + TecFrame::TecParameter::MonActualOutputCurrent, + TecFrame::TecParameter::MonActualOutputVoltage, + TecFrame::TecParameter::MonPIDLowerLimitation, + TecFrame::TecParameter::MonPIDUpperLimitation, + TecFrame::TecParameter::MonPIDControlVariable, + TecFrame::TecParameter::MonObjectSensorRawADCValue, + TecFrame::TecParameter::MonSinkSensorRawADCValue, + TecFrame::TecParameter::MonObjectSensorResistance, + TecFrame::TecParameter::MonSinkSensorResitance, + TecFrame::TecParameter::MonSinkSensorTemperature, + TecFrame::TecParameter::MonObjectSensorTemperature, + TecFrame::TecParameter::MonObjectSensorType, // and 1046 + TecFrame::TecParameter::MonFirmwareVersion, + TecFrame::TecParameter::MonFirmwareBuildNumber, + TecFrame::TecParameter::MonHardwareVersion, + TecFrame::TecParameter::MonSerialNumber, + TecFrame::TecParameter::MonDriverInputVoltage, + TecFrame::TecParameter::MonMedVInternalSupply, + TecFrame::TecParameter::Mon33VInternalSupply, + TecFrame::TecParameter::MonBasePlateTemperature, + TecFrame::TecParameter::MonErrorNumber, + TecFrame::TecParameter::MonErrorInstance, + TecFrame::TecParameter::MonErrorParameter, + TecFrame::TecParameter::MonParallelActualOutputCurrent, + TecFrame::TecParameter::MonDriverStatus, + TecFrame::TecParameter::MonParameterSystemFlashStatus, + TecFrame::TecParameter::MonFanRelativeCoolingPower, + TecFrame::TecParameter::MonFanNominalFanSpeed, + TecFrame::TecParameter::MonFanActualFanSpeed, + TecFrame::TecParameter::MonFanActualPwmLevel, + TecFrame::TecParameter::MonTemperatureIsStable, +}; + #define TEC_MAGIC_TIMEOUT 0xfaceb00b TecDummy::BackendRegisterer TecDummy::backendRegisterer; @@ -159,7 +211,6 @@ std::string TecDummy::processFrame(const std::string& command) { static_cast<TecFrame::TecParameter>(std::stoul("0x" + parsedFrame[TecFramePart::PARAMETER_ID], nullptr, 16)); if(errorFlags[parameterId] != TecErrorCode::NO_ERROR) { - // Returing an error has been requested through the dummy interface // Returning an error has been requested through the dummy interface result = "!" + parsedFrame[TecFramePart::ADDRESS] + parsedFrame[TecFramePart::SEQUENCE]; result += "+"; // marks the error @@ -169,6 +220,15 @@ std::string TecDummy::processFrame(const std::string& command) { result += getCrc(result); } else if(parsedFrame[TecFramePart::COMMAND] == "VS") { + if (std::find(READ_ONLY_VARS.begin(), READ_ONLY_VARS.end(), parameterId) != READ_ONLY_VARS.end()) { + // Write requested to a read-only variable + result = "!" + parsedFrame[TecFramePart::ADDRESS] + parsedFrame[TecFramePart::SEQUENCE]; + result += "+"; // marks the error + std::stringstream ss; + ss << std::hex << std::setw(2) << std::setfill('0') << std::uppercase << static_cast<int>(TecErrorCode::EER_PAR_NOT_WRITABLE); + result += ss.str(); + result += getCrc(result); + } // Handle store command int32_t value = std::stol("0x" + parsedFrame[TecFramePart::PAYLOAD], nullptr, 16);