Skip to content
Snippets Groups Projects
Novelec_MCCE2.cpp 13 KiB
Newer Older
LE's avatar
LE committed
// ============================================================================
//
// = CONTEXT
//    TANGO Project - NovelecElectrometer Support Library
//
// = FILENAME
//    Novelec_MCCE2.cpp
//
// = AUTHOR
//    X. Elattaoui
//
// ============================================================================

// ============================================================================
// DEPENDENCIES
// ============================================================================
#include <iostream>
#include <sstream>
#include <string>
ELATTAOUI's avatar
ELATTAOUI committed
#include <Xstring.h>
LE's avatar
LE committed
#include "NovelecProtocol.h"
#include "Novelec_MCCE2.h"


// ============================================================================
// Novelec_MCCE2::Novelec_MCCE2
// ============================================================================
ELATTAOUI's avatar
ELATTAOUI committed
/*Novelec_MCCE2::Novelec_MCCE2 (std::string& comLink_device_name, unsigned short address, unsigned short novTypeNumber)
LE's avatar
LE committed
:	AbstractElectrometerClass(comLink_device_name),
ELATTAOUI's avatar
ELATTAOUI committed
	_rangeLimit(0),
ELATTAOUI's avatar
ELATTAOUI committed
  _address(address),
ELATTAOUI's avatar
ELATTAOUI committed
	_MCCE2electroTypeNumber(novTypeNumber)
LE's avatar
LE committed
{
ELATTAOUI's avatar
ELATTAOUI committed
	//std::cout << "Novelec_MCCE2::Novelec_MCCE2 <-" << std::endl;
LE's avatar
LE committed

ELATTAOUI's avatar
ELATTAOUI committed
	//std::cout << "Novelec_MCCE2::Novelec_MCCE2 ->" << std::endl;
LE's avatar
LE committed
}
ELATTAOUI's avatar
ELATTAOUI committed
*/
// ============================================================================
// Novelec_MCCE2::Novelec_MCCE2
// ============================================================================
Novelec_MCCE2::Novelec_MCCE2 (std::string& comLink_device_name, unsigned short address)
:	AbstractElectrometerClass(comLink_device_name),
	_rangeLimit(0),
  _address(address),
	_MCCE2electroTypeNumber(0),
	_MCCE2electroTypeStr("Unknown type")
ELATTAOUI's avatar
ELATTAOUI committed
{
	std::cout << "\t\tNovelec_MCCE2::Novelec_MCCE2 <-" << std::endl;

	std::cout << "\t\tNovelec_MCCE2::Novelec_MCCE2 ->" << std::endl;
}
LE's avatar
LE committed

// ============================================================================
// Novelec_MCCE2::~Novelec_MCCE2
// ============================================================================
Novelec_MCCE2::~Novelec_MCCE2 (void)
{
ELATTAOUI's avatar
ELATTAOUI committed
	//std::cout << "Novelec_MCCE2::~Novelec_MCCE2 <-" << std::endl;
LE's avatar
LE committed

ELATTAOUI's avatar
ELATTAOUI committed
	//std::cout << "Novelec_MCCE2::~Novelec_MCCE2 ->" << std::endl;
LE's avatar
LE committed
}

ELATTAOUI's avatar
ELATTAOUI committed
// ============================================================================
// Novelec_MCCE2::init_protocol
// ============================================================================
bool Novelec_MCCE2::init_protocol (void)
ELATTAOUI's avatar
ELATTAOUI committed
{
ELATTAOUI's avatar
ELATTAOUI committed
  std::string description("");
  bool success = false;
  try
  {
	  //- build the keithley Electrometer protocol obj
ELATTAOUI's avatar
ELATTAOUI committed
	_electrometerProtocol = new NovelecProtocol(_device_proxy_name, _address);

ELATTAOUI's avatar
ELATTAOUI committed
    if(_electrometerProtocol)
ELATTAOUI's avatar
ELATTAOUI committed
      success = _electrometerProtocol->build_communicationLink();

    //- find electrometer type :
    std::string elecTypeStr("");
    NovelecProtocol* _pNP = dynamic_cast<NovelecProtocol*>(_electrometerProtocol);
    if(_pNP)
      elecTypeStr = _pNP->check_electrotype();

    //- get the connected electrometer type :
    if(_pNP)
      this->_MCCE2electroTypeNumber = _pNP->get_electrometerType();

    switch(_MCCE2electroTypeNumber)
    {
    case 1 :
      _rangeLimit = 3;
      break;
    case 2 :
    case 3 :
      _rangeLimit = 7;
      break;
    }
ELATTAOUI's avatar
ELATTAOUI committed
  }
  catch(Tango::DevFailed& df)
  {
		description = "FAILED to create proxy on : " + _device_proxy_name;
ELATTAOUI's avatar
ELATTAOUI committed

ELATTAOUI's avatar
ELATTAOUI committed
		Tango::Except::re_throw_exception (df,
			(const char*)"COMMUNICATION_ERROR",
			description.c_str(),
			(const char*)"Novelec_MCCE2::init_protocol");
  }
  catch(...)
  {
		description = "FAILED to create proxy on : " + _device_proxy_name + ". Caught [...].";
ELATTAOUI's avatar
ELATTAOUI committed

ELATTAOUI's avatar
ELATTAOUI committed
		Tango::Except::throw_exception (
			(const char*)"COMMUNICATION_ERROR",
			description.c_str(),
			(const char*)"Novelec_MCCE2::init_protocol");
  }
  return success;
}

LE's avatar
LE committed
// ============================================================================
// Novelec_MCCE2::get_ElectroMeterPolarity
// ============================================================================
std::string Novelec_MCCE2::get_ElectroMeterPolarity (void)
ELATTAOUI's avatar
ELATTAOUI committed
{
ELATTAOUI's avatar
ELATTAOUI committed
  if( !this->_electrometerProtocol )
ELATTAOUI's avatar
ELATTAOUI committed
		throw electrometer::ElectrometerException("INIT_ERROR",
ELATTAOUI's avatar
ELATTAOUI committed
												"Novelec protocol initialization failed.",
												"Novelec_MCCE2::get_ElectroMeterPolarity( ).");

ELATTAOUI's avatar
ELATTAOUI committed
	return _electrometerProtocol->get_polarity();
LE's avatar
LE committed
}

// ============================================================================
// Novelec_MCCE2::set_ElectroMeterPolarity
// ============================================================================
void Novelec_MCCE2::set_ElectroMeterPolarity (std::string polarity)
ELATTAOUI's avatar
ELATTAOUI committed
{
ELATTAOUI's avatar
ELATTAOUI committed
  if( !this->_electrometerProtocol )
ELATTAOUI's avatar
ELATTAOUI committed
		throw electrometer::ElectrometerException("INIT_ERROR",
ELATTAOUI's avatar
ELATTAOUI committed
												"Novelec protocol initialization failed.",
												"Novelec_MCCE2::set_ElectroMeterPolarity( ).");

ELATTAOUI's avatar
ELATTAOUI committed
	_electrometerProtocol->set_polarity(polarity);
LE's avatar
LE committed
}

// ============================================================================
// Novelec_MCCE2::set_Zero_VonF_function
// ============================================================================
void Novelec_MCCE2::set_Zero_VonF_function (void)
ELATTAOUI's avatar
ELATTAOUI committed
{
ELATTAOUI's avatar
ELATTAOUI committed
  if( !this->_electrometerProtocol )
ELATTAOUI's avatar
ELATTAOUI committed
		throw electrometer::ElectrometerException("INIT_ERROR",
ELATTAOUI's avatar
ELATTAOUI committed
												"Novelec protocol initialization failed.",
												"Novelec_MCCE2::set_Zero_VonF_function( ).");

ELATTAOUI's avatar
ELATTAOUI committed
	_electrometerProtocol->unable_zeroVF_func();
LE's avatar
LE committed
}

// ============================================================================
// Novelec_MCCE2::set_Offset_function
// ============================================================================
void Novelec_MCCE2::set_Offset_ZeroV1_function (void)
ELATTAOUI's avatar
ELATTAOUI committed
{
ELATTAOUI's avatar
ELATTAOUI committed
  if( !this->_electrometerProtocol )
ELATTAOUI's avatar
ELATTAOUI committed
		throw electrometer::ElectrometerException("INIT_ERROR",
ELATTAOUI's avatar
ELATTAOUI committed
												"Novelec protocol initialization failed.",
												"Novelec_MCCE2::set_Offset_ZeroV1_function( ).");

ELATTAOUI's avatar
ELATTAOUI committed
	_electrometerProtocol->unable_offset_zeroV1_func();
LE's avatar
LE committed
}

// ============================================================================
// Novelec_MCCE2::set_Leakage_ZeroV2_function
// ============================================================================
void Novelec_MCCE2::set_Leakage_ZeroV2_function (void)
ELATTAOUI's avatar
ELATTAOUI committed
{
ELATTAOUI's avatar
ELATTAOUI committed
  if( !this->_electrometerProtocol )
ELATTAOUI's avatar
ELATTAOUI committed
		throw electrometer::ElectrometerException("INIT_ERROR",
ELATTAOUI's avatar
ELATTAOUI committed
												"Novelec protocol initialization failed.",
												"Novelec_MCCE2::set_Leakage_ZeroV2_function( ).");

ELATTAOUI's avatar
ELATTAOUI committed
	_electrometerProtocol->unable_leakage_zeroV2_func();
LE's avatar
LE committed
}

// ============================================================================
// Novelec_MCCE2::set_Test_function
// ============================================================================
void Novelec_MCCE2::set_Test_function (void)
ELATTAOUI's avatar
ELATTAOUI committed
{
ELATTAOUI's avatar
ELATTAOUI committed
  if( !this->_electrometerProtocol )
ELATTAOUI's avatar
ELATTAOUI committed
		throw electrometer::ElectrometerException("INIT_ERROR",
ELATTAOUI's avatar
ELATTAOUI committed
												"Novelec protocol initialization failed.",
												"Novelec_MCCE2::set_Test_function( ).");

ELATTAOUI's avatar
ELATTAOUI committed
	_electrometerProtocol->unable_test_func();
LE's avatar
LE committed
}

// ============================================================================
// Novelec_MCCE2::set_Measure_function
// ============================================================================
void Novelec_MCCE2::set_Measure_function (void)
ELATTAOUI's avatar
ELATTAOUI committed
{
ELATTAOUI's avatar
ELATTAOUI committed
  if( !this->_electrometerProtocol )
ELATTAOUI's avatar
ELATTAOUI committed
		throw electrometer::ElectrometerException("INIT_ERROR",
ELATTAOUI's avatar
ELATTAOUI committed
												"Novelec protocol initialization failed.",
												"Novelec_MCCE2::set_Measure_function( ).");

ELATTAOUI's avatar
ELATTAOUI committed
	_electrometerProtocol->unable_measure_func();
LE's avatar
LE committed
}

// ============================================================================
// Novelec_MCCE2::mcce_on
// ============================================================================
void Novelec_MCCE2::mcce_on (void)
ELATTAOUI's avatar
ELATTAOUI committed
{
ELATTAOUI's avatar
ELATTAOUI committed
  if( !this->_electrometerProtocol )
ELATTAOUI's avatar
ELATTAOUI committed
		throw electrometer::ElectrometerException("INIT_ERROR",
ELATTAOUI's avatar
ELATTAOUI committed
												"Novelec protocol initialization failed.",
												"Novelec_MCCE2::mcce_on( ).");

ELATTAOUI's avatar
ELATTAOUI committed
	_electrometerProtocol->switch_MCCE2_ON();
LE's avatar
LE committed
}

// ============================================================================
// Novelec_MCCE2::mcce_off
// ============================================================================
void Novelec_MCCE2::mcce_off (void)
ELATTAOUI's avatar
ELATTAOUI committed
{
ELATTAOUI's avatar
ELATTAOUI committed
  if( !this->_electrometerProtocol )
ELATTAOUI's avatar
ELATTAOUI committed
		throw electrometer::ElectrometerException("INIT_ERROR",
ELATTAOUI's avatar
ELATTAOUI committed
												"Novelec protocol initialization failed.",
												"Novelec_MCCE2::mcce_off( ).");

ELATTAOUI's avatar
ELATTAOUI committed
	_electrometerProtocol->switch_MCCE2_OFF();
LE's avatar
LE committed
}

// ============================================================================
// Novelec_MCCE2::electrometer_status
// ============================================================================
std::string Novelec_MCCE2::electrometer_status (void)
ELATTAOUI's avatar
ELATTAOUI committed
{
LE's avatar
LE committed
	std::string tmp(" ");
ELATTAOUI's avatar
ELATTAOUI committed
	short status	= 0;
LE's avatar
LE committed

ELATTAOUI's avatar
ELATTAOUI committed
  if( !this->_electrometerProtocol )
ELATTAOUI's avatar
ELATTAOUI committed
		throw electrometer::ElectrometerException("INIT_ERROR",
ELATTAOUI's avatar
ELATTAOUI committed
												"Novelec protocol initialization failed.",
												"Novelec_MCCE2::electrometer_status( ).");

	NovelecProtocol* nproto = dynamic_cast<NovelecProtocol*>(_electrometerProtocol);
	if( !nproto )
ELATTAOUI's avatar
ELATTAOUI committed
		throw electrometer::ElectrometerException("BAD_ALLOC",
												"Memory allocation failed to query the electrmometer status.",
LE's avatar
LE committed
												"Novelec_MCCE2::electrometer_status( ).");
ELATTAOUI's avatar
ELATTAOUI committed

  /***********************************************************************
          DISABLED PART TO INCREASE SERIAL PERFORMANCE
ELATTAOUI's avatar
ELATTAOUI committed
  ***********************************************************************/

	argout = "\n\nINFOS :\n";
	argout += "----------\n";

ELATTAOUI's avatar
ELATTAOUI committed
	switch(this->_MCCE2electroTypeNumber)
ELATTAOUI's avatar
ELATTAOUI committed
	{
	case 1 :	this->_MCCE2electroTypeStr = "Photovoltaque UHS";
ELATTAOUI's avatar
ELATTAOUI committed
		break;
	case 2 :	this->_MCCE2electroTypeStr = "Photovoltaque HS";
ELATTAOUI's avatar
ELATTAOUI committed
		break;
	case 3 :	this->_MCCE2electroTypeStr = "Photovoltaque MS";
ELATTAOUI's avatar
ELATTAOUI committed
		break;
	case 4 :	this->_MCCE2electroTypeStr = "Photoconducteur HS";
ELATTAOUI's avatar
ELATTAOUI committed
		break;
	case 5 :	this->_MCCE2electroTypeStr = "Photoconducteur MS";
ELATTAOUI's avatar
ELATTAOUI committed
		break;
	default :	set_electroState(FAULT);
				argout = "Invalid status string returned !";
				return argout;
	}
	argout += "Novelec type : " + this->_MCCE2electroTypeStr + "\n";
ELATTAOUI's avatar
ELATTAOUI committed

	//- get Electrometer mode :
	argout += "Novelec mode : " + _electrometerProtocol->get_mode() + "\n";
ELATTAOUI's avatar
ELATTAOUI committed

ELATTAOUI's avatar
ELATTAOUI committed
  /***********************************************************************/
ELATTAOUI's avatar
ELATTAOUI committed

LE's avatar
LE committed
	try
	{
ELATTAOUI's avatar
ELATTAOUI committed
		//- read novelec status from HW
LE's avatar
LE committed
		tmp		= _electrometerProtocol->get_raw_status();
ELATTAOUI's avatar
ELATTAOUI committed

		status	= XString<short>::convertFromString(tmp);
LE's avatar
LE committed
	}
	catch(...)
	{
		set_electroState(FAULT);
ELATTAOUI's avatar
ELATTAOUI committed
		throw electrometer::ElectrometerException("COMMUNICATION_ERROR",
ELATTAOUI's avatar
ELATTAOUI committed
												"Unable to query the electrmometer status.",
												"Novelec_MCCE2::electrometer_status( ).");
LE's avatar
LE committed
	}

LE's avatar
LE committed
	argout += "------------------------\n";

	//- build novelec status
ELATTAOUI's avatar
ELATTAOUI committed
	if(status & 0x10)
LE's avatar
LE committed
		argout += "En mesure\n";
	else
		argout += "Hors mesure\n";
ELATTAOUI's avatar
ELATTAOUI committed
	if(status & 0x20)
LE's avatar
LE committed
		argout += "Paramtres par defaut\n";
	else
		argout += "Ram OK\n";
ELATTAOUI's avatar
ELATTAOUI committed
	if(status & 0x40)
LE's avatar
LE committed
		argout += "Paramtre invalide\n";
	else
		argout += "Paramtre OK\n";
ELATTAOUI's avatar
ELATTAOUI committed
	if(status & 0x80)
LE's avatar
LE committed
	{
		argout += "ERREUR\n";
		set_electroState(ALARM);
	}
	else
	{
		argout += "Pas d'erreur\n";
		set_electroState(ON);
	}

	//- error(s) detail(s)
ELATTAOUI's avatar
ELATTAOUI committed
	if(status & 0x80)
	{
	  short errors = -1;
LE's avatar
LE committed
		try
		{
			//- read novelec error(s) from HW
ELATTAOUI's avatar
ELATTAOUI committed
			tmp		= nproto->get_errors();
ELATTAOUI's avatar
ELATTAOUI committed
			errors= XString<short>::convertFromString(tmp);
LE's avatar
LE committed
		}
		catch(...)
		{
			set_electroState(FAULT);
ELATTAOUI's avatar
ELATTAOUI committed
			throw electrometer::ElectrometerException("INTERNAL_ERROR",
LE's avatar
LE committed
													"Unable to query the electrmometer errors.",
													"Novelec_MCCE2::electrometer_status( ).");
		}

		argout += "\nError(s) detail(s) :\n";
		argout += "------------------------\n";
ELATTAOUI's avatar
ELATTAOUI committed
    bool change_state_to_alarm = true;
LE's avatar
LE committed

ELATTAOUI's avatar
ELATTAOUI committed
		if(errors & 0x01)
LE's avatar
LE committed
			argout += "Paramtre par dfaut\n";
ELATTAOUI's avatar
ELATTAOUI committed
		if(errors & 0x02)
LE's avatar
LE committed
			argout += "Erreur srie\n";
ELATTAOUI's avatar
ELATTAOUI committed
		if(errors & 0x04)
LE's avatar
LE committed
			argout += "Paramtre invalide\n";
ELATTAOUI's avatar
ELATTAOUI committed
		if(errors & 0x08)
    {
LE's avatar
LE committed
			argout += "Electromtre satur\n";
ELATTAOUI's avatar
ELATTAOUI committed
      change_state_to_alarm = false;
    }
		if(errors & 0x10)
    {
			argout += "Electromtre bloqu (Polarity error ?)\n";
      change_state_to_alarm = false;
    }
		if(errors & 0x20)
LE's avatar
LE committed
			argout += "HT < limite basse\n";
ELATTAOUI's avatar
ELATTAOUI committed
		if(errors & 0x40)
LE's avatar
LE committed
			argout += "HT > limite haute\n";
ELATTAOUI's avatar
ELATTAOUI committed
		if(errors & 0x80)
LE's avatar
LE committed
			argout += "Initialisation\n";
ELATTAOUI's avatar
ELATTAOUI committed
		if(errors & 0x100)
LE's avatar
LE committed
			argout += "Dfaut batterie\n";
ELATTAOUI's avatar
ELATTAOUI committed
		if(errors & 0x200)
LE's avatar
LE committed
			argout += "Dfaut d'alimentation\n";
ELATTAOUI's avatar
ELATTAOUI committed
		if(errors & 0x400)
LE's avatar
LE committed
			argout += "Type d'lectromtre inconnu\n";
ELATTAOUI's avatar
ELATTAOUI committed
		if(errors & 0x800)
LE's avatar
LE committed
			argout += "Electromtre dconnect\n";
ELATTAOUI's avatar
ELATTAOUI committed

    //- set state according to specifications : if "bloqu" or "satur" do not change the state to ALARM !!
    if ( change_state_to_alarm )
      set_electroState(ALARM);
LE's avatar
LE committed
	}

	return argout;
}
ELATTAOUI's avatar
ELATTAOUI committed

// ============================================================================
// Novelec_MCCE2::check_range_value
// ============================================================================
short Novelec_MCCE2::check_range_value (const std::string& rgToCheck, const std::string* electroRangeList)
ELATTAOUI's avatar
ELATTAOUI committed
{
ELATTAOUI's avatar
ELATTAOUI committed
	std::string electroRg("");
	for (unsigned int idx = 0; idx <= _rangeLimit; idx++)
ELATTAOUI's avatar
ELATTAOUI committed
	{
ELATTAOUI's avatar
ELATTAOUI committed
		electroRg = electroRangeList[idx];
		std::cout << "\t Novelec_MCCE2::check_range_value idx = " << idx
			<< " rgToCheck = $" << rgToCheck << "$"
			<< " electroRg = $" << electroRg << "$"
			<< std::endl;
		if( electroRg.find(rgToCheck) != std::string::npos )
			{
				//- value is in the list
				return idx;
			}
ELATTAOUI's avatar
ELATTAOUI committed
	}

	//- new range value not found in the electrometer range list !
	return -1;
}