[ return ]

sensor.c



/*
 *  file : sensor.c
 *
 * [DEFINE DESCRIPTION = Modified vector class (compatible with connector class)]
 * 
 *  Name                Date        Description
 *  --------------      --------    -------------------------------------
 *  Andrew H. Fagg      08/10/92    Original
 *
 *  The sensor class is essential a vector of sensor values except :
 * each element has a name, and the data elements are represented in
 * such a way that the sensor interfaces well to the connector
 * class.
 *
 */

#include "nsl_include.h"
#include "alib.h"
#include "gen.h"
#include "sensor.h"

/*
 *  sensor_class::sensor_class(int d, char* n)
 *
 *  <d> = size of sensor vector.
 *  <n> = a string name for the sensor.
 *
 *  Create sensor class.  Create base name, list of names,
 *   and a list of individual elements.
 */

sensor_class::sensor_class(int d, char* n)
{
  int i;
  char buf[10];

  dim = d;
                 /*  Sensor names.  */
  name = new name_class(n);

                 /*  Array for name for each element.  */
  names = new name_class*[dim];
                 /*  Data value for each element.      */
  sensors = new nsl_data*[dim];

                 /*  Create individual elements.       */
  for(i = 0; i < dim; ++i)
    {
      sprintf(buf, "%d", i);
      names[i] = new name_class(buf, name);
      sensors[i] = new nsl_data;
    }
}


/*
 *  sensor_class::~sensor_class()
 *
 *  Destructor.
 */

sensor_class::~sensor_class()
{
  int i;
                  /*  Handle each element first.  */
  for(i = 0; i < dim; ++i)
    {
      delete names[i];
      delete sensors[i];
    }
                  /*  Then other storage.  */
  delete name;
  delete names;
  delete sensors;
}

/*
 *  void sensor_class::set_values(nsl_vector& vec)        //OVERLOAD CALL: set_values: reverse_connector.c(reverse_connector_output_class), sensor.c(sensor_class), sensor.c(sensor_class)
 *
 *  <vec> = vector of values.
 *
 *  Set the sensor values from an input vector.
 *  The vector dimension must be the same size as the
 * as the sensor.
 *
 */

void sensor_class::set_values(nsl_vector& vec)
{
                     /*  Check dimension.  */

  if(dim != vec.get_xn())
    {
      cmd_error("*** sensor_class_set_values ***");
      cmd_error("Bad vector match");
      cout << dim sp << vec.get_xn() nl;
    }
  
  int i;
                     /*  Copy values.  */

  for(i = 0; i < dim; ++i)
      sensors[i]->elem() = vec.elem(i);
}


/*
 *  void sensor_class::set_values(nsl_vector& vec, int start)        //OVERLOAD CALL: set_values: reverse_connector.c(reverse_connector_output_class), sensor.c(sensor_class), sensor.c(sensor_class)
 *
 *  <vec> = vector of values.
 *
 *  Set the sensor values from an input vector, where
 *  <vec> is a subvector of the sensor.  Start writing vec(0)
 *  into sensor(start), etc.
 *  The vector size must be such that it will fit within the
 *  sensor starting at <start>.
 *
 */

void sensor_class::set_values(nsl_vector& vec, int start)
{
  int vec_size;

  vec_size = vec.get_xn();
                     /*  Check sizes.  */
  if(dim < vec_size + start)
    {
      cmd_error("*** sensor_class_set_values ***");
      cmd_error("Bad vector match");
      cout << dim sp << vec.get_xn() << start nl;
    }
  
  int i;
                     /*  Copy values.  */

  for(i = 0; i < vec_size; ++i)
      sensors[i+start]->elem() = vec.elem(i);
}


/*
 *  nsl_vector sensor_class::get_values()        //OVERLOAD CALL: get_values: connector.c(connector_class), reverse_connector.c(reverse_connector_input_class), reverse_connector.c(reverse_connector_output_class), sensor.c(sensor_class)
 *
 *
 *  Get the sensor values from an input vector.
 *
 */

nsl_vector sensor_class::get_values()
{
  nsl_vector vec(dim);
  int i;
                     /*  Copy values.  */

  for(i = 0; i < dim; ++i)
    vec.elem(i) = sensors[i]->elem();
  return vec;
}


/*
 *  name_class* sensor_class::get_name(int i)        //OVERLOAD CALL: get_name: column.c(column_class), connector.c(connector_class), gate.c(gate_class), layer.c(layer_class), reverse_connector.c(reverse_connector_input_class), reverse_connector.c(reverse_connector_output_class), sensor.c(sensor_class)
 *
 *  <i> = the sensor element of interest.
 *
 *  Fetch the name of a particular sensor element.
 *
 *  Return = the name of sensor element i.
 */

name_class* sensor_class::get_name(int i)
{
              /*  Check index.  */

  if(i < 0 || i >= dim)
    {
      cmd_error("*** sensor_class::get_name() ***");        //OVERLOAD CALL: get_name: column.c(column_class), connector.c(connector_class), gate.c(gate_class), layer.c(layer_class), reverse_connector.c(reverse_connector_input_class), reverse_connector.c(reverse_connector_output_class), sensor.c(sensor_class)
      cmd_error("Bad vector match");
      cout << dim nl;
      return NULL;
    }
  else
    return names[i];
}

/*
 *  int sensor_class::get_dim()
 *
 *  Return the sensor dimension.
 *
 */

int sensor_class::get_dim()
{
  return dim;
}

/*
 *  nsl_data* sensor_class::get_element(int i)
 *
 *  <i> = the element index of interest.
 *
 *  Return a pointer to an individual sensor element,
 *     or NULL if an illegal index.
 *
 */

nsl_data* sensor_class::get_element(int i)
{
              /*  Check index.  */

  if(i < 0 || i >= dim)
    {
      cmd_error("*** sensor_class::get_element() ***");
      cmd_error("Bad vector match");
      cout << dim nl;
      return NULL;
    }
  else
    return sensors[i];
}


[ return ]