ProcessShue.cc 4.44 KB
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/* 
 * File:   ProcessShue.cpp
 * Author: hacene
 * 
 * Created on December 31, 2020, 3:42 PM
 */


#include <stdlib.h>
#include <string>

#include <boost/lexical_cast.hpp>

#include "DicError.hh"
#include "AMDA_exception.hh"

#include "Operation.hh"
#include "ParameterManager.hh"
#include "ParamMgr.hh"
#include "ParameterCreatorFromExpression.hh"

#include "ProcessShue.hh"


using namespace std;
using namespace boost;
using namespace log4cxx;

namespace AMDA {
namespace Parameters {


ProcessShue::ProcessShue(Parameter &parameter) : SingleParamProcess_CRTP(parameter) {
}

ProcessShue::ProcessShue(const ProcessShue& pProcess, Parameter &parameter): SingleParamProcess_CRTP(pProcess, parameter) {
}

ProcessShue::~ProcessShue() {
    
    if (_inputImfParam != nullptr) {
		_inputImfParam->closeConnection(this);
	}
	if (_inputPswParam != nullptr) {
		_inputPswParam->closeConnection(this);
	}
     
}
 
void ProcessShue::establishConnection(){
   
    
if (_attributList.size() < 2) {
		BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_PROCESS_ERR) << AMDA::ex_msg(std::string("ProcessShue::parse require 3 attributes'")));
	}

	//Imf parameter
	_inputImfParam = _parameter.getParameterManager().getParameter(_attributList[0]);
	if (_inputImfParam == nullptr) {
		BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_PROCESS_ERR) << AMDA::ex_msg(std::string("ProcessShue::parse cannot retrieve imf param")));
	}
	_inputImfParam->openConnection(this);

	//Psw parameter
	_inputPswParam = _parameter.getParameterManager().getParameter(_attributList[1]);
	if (_inputPswParam == nullptr) {
		BOOST_THROW_EXCEPTION(AMDA::AMDA_exception() << AMDA::errno_code(AMDA_PROCESS_ERR) << AMDA::ex_msg(std::string("ProcessShue::parse cannot retrieve psw param")));
	}
	_inputPswParam->openConnection(this);


	SingleParamProcess::establishConnection();
     
  }
  
TimeStamp ProcessShue::init() {
   
  
                    _model98 = true;
                    if (_attributList.size() > 2 && _attributList[2] == "shue97")
                        _model98 = false;
                    
                    _inGSE = true;
                     if (_attributList.size() > 3 && _attributList[3] == "GSM")
                        _inGSE = false;
                    
                        if (_attributList.size() > 4)
                        _type= _attributList[4];
    
                    
	TimeStamp time = _parameterInput->init( this, _timeIntervalList);
        
         

	_inputImfParam->init( this, _timeIntervalList);
	ParamData* lImfParamInput = _inputImfParam->getParamData(this).get();

	_inputPswParam->init( this, _timeIntervalList);
	ParamData* lPswParamInput = _inputPswParam->getParamData(this).get();

	_paramInput = _parameterInput->getParamData(this).get();

	ShueCreator lCreator(*this, *_paramInput, *lImfParamInput, *lPswParamInput, _inGSE,_model98, _type );
	_operation = lCreator.getOperation();	
	_paramData = ParamDataSPtr(_operation->getParamOutput());
	_paramData->setMinSampling(_paramInput->getMinSampling());
         
	return time;
}

unsigned int ProcessShue::write() {
	getImfData();
	getPswData();	
	return SingleParamProcess::write();
}

void ProcessShue::getImfData() {
	try {
		ParamDataIndexInfo lParamDataIndexInfo;
		lParamDataIndexInfo = _inputImfParam->getAsync(this).get();
		while ((!lParamDataIndexInfo._noMoreTimeInt && !lParamDataIndexInfo._timeIntToProcessChanged) || (lParamDataIndexInfo._nbDataToProcess > 0)) {
			reinterpret_cast<Shue::ShueBase*>(_operation)->pushImfData(lParamDataIndexInfo);
			if (lParamDataIndexInfo._timeIntToProcessChanged || lParamDataIndexInfo._noMoreTimeInt)
				break;
			lParamDataIndexInfo = _inputImfParam->getAsync(this).get();
		}
	}catch (...) {
		throw;
	}
}

void ProcessShue::getPswData() {
	try {
		ParamDataIndexInfo lParamDataIndexInfo;
		lParamDataIndexInfo = _inputPswParam->getAsync(this).get();
		while ((!lParamDataIndexInfo._noMoreTimeInt && !lParamDataIndexInfo._timeIntToProcessChanged) || (lParamDataIndexInfo._nbDataToProcess > 0)) {
			reinterpret_cast<Shue::ShueBase*>(_operation)->pushPswData(lParamDataIndexInfo);
			if (lParamDataIndexInfo._timeIntToProcessChanged || lParamDataIndexInfo._noMoreTimeInt)
				break;
			lParamDataIndexInfo = _inputPswParam->getAsync(this).get();
		}
	}catch (...) {
		throw;
	}
		
}
 

}
}