Commit 58f24bfa authored by Marco Buttu's avatar Marco Buttu Committed by GitHub
Browse files

Merge pull request #523 from discos/fix-issue-518

Fix issue #518
parents b9be3948 0f0f52cb
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -85,5 +85,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/
## [discos1.0.5] - 
## Added
	issue #504 - added credits clause (regarding INAF data ownership) to fits files headers
    issue #518 - KBand receivers cryo temperature read wrongly with connection problems. More information:
    https://github.com/discos/discos/issues/518#issuecomment-590838480

## Fixed
    issue #518 - In case of communication error we set a dummy value (100000) for the temperature properties, and the related timestamp keeps the value of the last communication timestamp.
## Changed    
+10 −0
Original line number Diff line number Diff line
@@ -22,6 +22,10 @@
#include <ReceiversDefinitionsC.h>
#include "MFKBandBaseUtils.h"

// Temperature dummy value to use in case of Connection Error
#define CEDUMMY 100000


/**
 * This class implements the component configuration. The data inside this class are initialized at the startup from the
 * configuration database and then are used (read) inside the component.
@@ -55,6 +59,12 @@ public:
		double relativePower;
	} TFeedValue;

	typedef struct {
		double temperature;
        ACS::Time timestamp;
	} BoardValue;


	/**
	 * Default constructor
	 */
+10 −10
Original line number Diff line number Diff line
@@ -329,35 +329,35 @@ public:
     * This is getter method. No need to make it thread safe......
     * @return the current value of the cryogenic temperature at cool head in °K
     */
    double getCryoCoolHead() const { return m_cryoCoolHead; }
    CConfiguration::BoardValue getCryoCoolHead() const { return m_cryoCoolHead; }


    /**
     * This is getter method. No need to make it thread safe......
     * @return the current value of the cryogenic temperature at cool head window in °K
     */
    double getCryoCoolHeadWin() const { return m_cryoCoolHeadWin; }
    CConfiguration::BoardValue getCryoCoolHeadWin() const { return m_cryoCoolHeadWin; }


    /**
     * This is getter method. No need to make it thread safe......
      * @return the current value of the cryogenic temperature at LNA in °K
     */
    double getCryoLNA() const { return m_cryoLNA; }
    CConfiguration::BoardValue getCryoLNA() const { return m_cryoLNA; }


    /**
     * This is getter method. No need to make it thread safe......
     * @return the current value of the cryogenic temperature at LNA  window in °K
     */
    double getCryoLNAWin() const { return m_cryoLNAWin; }
    CConfiguration::BoardValue getCryoLNAWin() const { return m_cryoLNAWin; }


    /**
     * This is getter method. No need to make it thread safe......
     * @return the current vertex temperature in °K
     */
    double getVertexTemperature() const { return m_envTemperature; }
    CConfiguration::BoardValue getVertexTemperature() const { return m_envTemperature; }


    /**
@@ -547,12 +547,12 @@ protected:
    ACS::doubleSeq m_startFreq;
    ACS::doubleSeq m_bandwidth;
    IRA::CString m_setupMode;
    double m_envTemperature;
    double m_vacuum;
    double m_cryoCoolHead;
    double m_cryoCoolHeadWin;
    double m_cryoLNA;
    double m_cryoLNAWin;
    CConfiguration::BoardValue m_envTemperature;
    CConfiguration::BoardValue m_cryoCoolHead;
    CConfiguration::BoardValue m_cryoCoolHeadWin;
    CConfiguration::BoardValue m_cryoLNA;
    CConfiguration::BoardValue m_cryoLNAWin;
    double m_vacuumDefault;
    bool m_calDiode;

+21 −7
Original line number Diff line number Diff line
@@ -22,8 +22,12 @@ void CComponentCore::initialize(maci::ContainerServices* services)
    m_control=NULL;
    m_localOscillatorDevice=Receivers::LocalOscillator::_nil();
    m_localOscillatorFault=false;
    m_cryoCoolHead=m_cryoCoolHeadWin= m_cryoLNA=m_cryoLNAWin=m_vacuum=0.0;
    m_envTemperature=20.0;
    m_cryoCoolHeadWin.temperature = 0.0;
    m_cryoLNA.temperature = 0.0;
    m_cryoLNAWin.temperature = 0.0;
    m_cryoCoolHead.temperature = 0.0;
    m_envTemperature.temperature = 20.0;
    m_vacuum=0.0;
    m_fetValues.VDL=m_fetValues.IDL=m_fetValues.VGL=m_fetValues.VDR=m_fetValues.IDR=m_fetValues.VGR=0.0;
    m_statusWord=0;
    m_ioMarkError = false;
@@ -1027,9 +1031,11 @@ void CComponentCore::updateCryoCoolHead() throw (ReceiversErrors::ReceiverContro
{
    // Not under the mutex protection because the m_control object is thread safe (at the micro controller board stage)
    try {
        m_cryoCoolHead=m_control->cryoTemperature(0,voltage2Kelvin);
        m_cryoCoolHead.temperature = m_control->cryoTemperature(0,voltage2Kelvin);
        m_cryoCoolHead.timestamp = getTimeStamp();
    }
    catch (IRA::ReceiverControlEx& ex) {
        m_cryoCoolHead.temperature = CEDUMMY;
        _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateCryoCoolHead()");
        impl.setDetails(ex.what().c_str());
        setStatusBit(CONNECTIONERROR);
@@ -1043,9 +1049,11 @@ void CComponentCore::updateCryoCoolHeadWin() throw (ReceiversErrors::ReceiverCon
{
    // Not under the mutex protection because the m_control object is thread safe (at the micro controller board stage)
    try {
        m_cryoCoolHeadWin=m_control->cryoTemperature(1,voltage2Kelvin);
        m_cryoCoolHeadWin.temperature = m_control->cryoTemperature(1,voltage2Kelvin);
        m_cryoCoolHeadWin.timestamp = getTimeStamp();
    }
    catch (IRA::ReceiverControlEx& ex) {
        m_cryoCoolHeadWin.temperature = CEDUMMY;
        _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateCryoCoolHeadWin()");
        impl.setDetails(ex.what().c_str());
        setStatusBit(CONNECTIONERROR);
@@ -1059,9 +1067,11 @@ void CComponentCore::updateCryoLNA() throw (ReceiversErrors::ReceiverControlBoar
{
    // Not under the mutex protection because the m_control object is thread safe (at the micro controller board stage)
    try {
        m_cryoLNA=m_control->cryoTemperature(3,voltage2Kelvin);
        m_cryoLNA.temperature = m_control->cryoTemperature(3,voltage2Kelvin);
        m_cryoLNA.timestamp = getTimeStamp();
    }
    catch (IRA::ReceiverControlEx& ex) {
        m_cryoLNA.temperature = CEDUMMY;
        _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateCryoLNA()");
        impl.setDetails(ex.what().c_str());
        setStatusBit(CONNECTIONERROR);
@@ -1075,9 +1085,11 @@ void CComponentCore::updateCryoLNAWin() throw (ReceiversErrors::ReceiverControlB
{
    // Not under the mutex protection because the m_control object is thread safe (at the micro controller board stage)
    try {
        m_cryoLNAWin=m_control->cryoTemperature(4,voltage2Kelvin);
        m_cryoLNAWin.temperature = m_control->cryoTemperature(4,voltage2Kelvin);
        m_cryoLNAWin.timestamp = getTimeStamp();
    }
    catch (IRA::ReceiverControlEx& ex) {
        m_cryoLNAWin.temperature = CEDUMMY;
        _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateCryoLNAWin()");
        impl.setDetails(ex.what().c_str());
        setStatusBit(CONNECTIONERROR);
@@ -1091,9 +1103,11 @@ void CComponentCore::updateVertexTemperature() throw (ReceiversErrors::ReceiverC
{
    // Not under the mutex protection because the m_control object is thread safe (at the micro controller board stage)
    try {
        m_envTemperature =m_control->vertexTemperature(voltage2Celsius);
        m_envTemperature.temperature = m_control->vertexTemperature(voltage2Celsius);
        m_envTemperature.timestamp = getTimeStamp();
    }
    catch (IRA::ReceiverControlEx& ex) {
        m_envTemperature.temperature = CEDUMMY;
        _EXCPT(ReceiversErrors::ReceiverControlBoardErrorExImpl,impl,"CComponentCore::updateVertexTemperature()");
        impl.setDetails(ex.what().c_str());
        setStatusBit(CONNECTIONERROR);
+3 −2
Original line number Diff line number Diff line
@@ -54,8 +54,9 @@ public:
	*/
	CORBA::Double read(ACS::Time& timestamp) throw (ACSErr::ACSbaseExImpl)
	{
		m_val=m_pCore->getCryoCoolHead();
		timestamp=getTimeStamp();  //Completion time
        CConfiguration::BoardValue result = m_pCore->getCryoCoolHead();
        m_val = result.temperature;
        timestamp = result.timestamp;
		return m_val;
	}
	/**
Loading