#include <string.h>
#include <malloc.h>
#include "NavSensor.h"

NavSensor::NavSensor(const char *name, NavSensors *sensors, int maxBad)
{
  _name = strdup(name);
  _maxConsecutiveBad = maxBad;
  _nConsecutiveBad = 0;
  _taskIF = 0;
  _status = DeviceIF::Initializing;
  _sampleTime.seconds = _sampleTime.nanoSeconds = 0;
  _valid = False;

  // Add to sensor list
  NavSensor *sensor = this;
  sensors->add(&sensor);
}


NavSensor::~NavSensor()
{
  free((void *)_name);
}


void NavSensor::connect(int timeout)
{
  _taskIF = 0;
  // Call creation method implemented by subclass
  try {
    _taskIF = createTaskIF(timeout);
  }
  catch (...) {
  }
}


Boolean NavSensor::read()
{
  _valid = False;

  if (taskIF() && taskIF()->connected()) {
    // TaskInterface exists and is connected to server
    try {
      if ((_status = readTaskIF(&_valid, &_sampleTime)) == DeviceIF::Ok) {
	// Reset bad hit counter
	_nConsecutiveBad = 0;
      }
      else {
	// Error from device
	_valid = False;
	// Keep track of consecutive bad hits
	_nConsecutiveBad++;
      }
    }
    catch (...) {
      // Lost connection to server?
      _valid = False;

      // Keep track of consecutive bad hits
      _nConsecutiveBad++;
    }
  }
  else {
    // No TaskInterface, or it's not connected to server
    _valid = False;
  }

  return _valid;
}


TaskInterface *NavSensor::taskIF()
{
  return _taskIF;
}


DeviceIF::Status NavSensor::deviceStatus()
{
  return _status;
}



Boolean NavSensor::valid()
{
  if (!taskIF())
    return False;

  return _valid;
}


Boolean NavSensor::failed()
{
  return (_nConsecutiveBad > _maxConsecutiveBad);
}


const char *NavSensor::name()
{
  return _name;
}


int NavSensor::nConsecutiveBad()
{
  return _nConsecutiveBad;
}


int NavSensor::maxConsecutiveBad()
{
  return _maxConsecutiveBad;
}

