/* * 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]; }