LRAUV  revA
DataElement.h
Go to the documentation of this file.
1 
10 #ifndef DATAELEMENT_H_
11 #define DATAELEMENT_H_
12 
13 #include <exception>
14 
15 #include "data/DataValue.h"
16 #include "data/UniversalURI.h"
17 #include "data/DataReader.h"
18 #include "data/DataWriter.h"
19 #include "utils/FlexArray.h"
20 #include "utils/Mutex.h"
21 #include "utils/Str.h"
22 
23 class Component;
24 class CodedStr;
25 class Slate;
26 class Unit;
28 
38 {
39 
40  friend class CommandLine; // for access to getDataValue
41  friend class DataAccess;
42  friend class DataEntry; // for access to getDataValue
43  friend class MissionStateLogger; // for access to getDataValue
44  friend class Slate; // for ReadOnce operations
45  friend class UniversalDataElement;
46 
47 public:
48 
50  {
51  public:
52  UninitializedException( /*const Str& message*/ )
53  //: message_( message )
54  {
55  //message_ = message;
56  }
57 
58  virtual ~UninitializedException() throw()
59  {}
60 
61  const char* what() const throw()
62  {
63  //return message_.cStr();
64  return "DataElement not active";
65  }
66 
67  private:
68  //Str message_;
69  };
70 
73  static const float NO_ACCURACY;
74 
76  virtual ~DataElement();
77 
79  DataReader* findReader( const ElementURI& uri );
80 
82  DataWriter* findWriter( const ElementURI& uri );
83 
87  const ElementURI& getUri( void ) const;
88 
90  virtual const Timestamp& getTimestamp() const
91  {
92  return timestamp_;
93  };
94 
95  //-- Functions dealing with the element's "state" ---------------
96 
100  virtual bool isUnavailable( void ) const;
101 
105  virtual bool isInvalid( void ) const;
106 
107  virtual bool isOwnersFailed( void ) const;
108 
114  bool setUnavailable( bool unavailable, DataWriter* notifier );
115  bool setUnavailable( bool unavailable, Component* notifier );
116 
122  bool setInvalid( bool invalid, DataWriter* notifier );
123  bool setInvalid( bool invalid, Component* notifier );
124 
127  virtual void setTimestamp( const Timestamp& timestamp = Timestamp::NOT_SET_TIME );
128 
132  virtual bool isOrphaned( void ) const;
133 
134  virtual bool isOwnersActive( void ) const;
135 
141  virtual bool isActivatable( void ) const;
142 
147  virtual bool isActive( void ) const;
148 
156 
159  const Unit* getUnit( void ) const;
160 
161  virtual bool isUniversal( ) const
162  {
163  return false;
164  }
165 
166  //-- Registration functions -------------------------------------
173  void registerUniversal( UniversalDataElement *abstract );
174 
178  {
179  return universal_;
180  }
181 
185  void registerReader( DataReader *reader );
186 
190  void unregisterReader( DataReader *reader );
191 
195  unsigned int readerCount() const;
196 
200  bool hasReaders( void ) const
201  {
202  return 0 < readerCount();
203  }
204 
206  bool isDataRequested();
207 
209  bool isImplemented();
210 
214  void registerWriter( DataWriter *writer );
215 
219  void unregisterWriter( DataWriter *writer );
220 
224  unsigned int writerCount() const;
225 
229  bool hasWriters( void ) const
230  {
231  return 0 < writerCount();
232  }
233 
234  //===============================================================
235  // Logging functions
236  virtual void registerRead( DataReader &reader );
237  virtual void registerWrite( DataWriter &writer, bool changed );
238 
239  //===============================================================
240  // Universal interactions
241  void registerChangePending( DataWriter* writer );
242  void registerChangeDone( Component* notifier );
243  void registerChangeDone( void );
244 
245  //===============================================================
249  virtual bool get( DataReader &reader, const Unit& unit, bool& readTo ) throw( UninitializedException );
250  virtual bool get( DataReader &reader, const Unit& unit, unsigned char& readTo ) throw( UninitializedException );
251  virtual bool get( DataReader &reader, const Unit& unit, double& readTo ) throw( UninitializedException );
252  virtual bool get( DataReader &reader, const Unit& unit, float& readTo ) throw( UninitializedException );
253  virtual bool get( DataReader &reader, const Unit& unit, int &readTo ) throw( UninitializedException );
254  virtual bool get( DataReader &reader, DataValue& readTo ) throw( UninitializedException );
256 
259  virtual const double asDouble( DataReader &reader, const Unit& unit ) throw( UninitializedException );
260  virtual const int asInt( DataReader &reader, const Unit& unit ) throw( UninitializedException );
261  virtual const Str asString( DataReader &reader, const Unit& unit ) throw( UninitializedException );
263 
267  virtual float getAccuracy( const Unit& unit ) const throw( UninitializedException ) = 0;
268 
271  virtual float getWrittenAccuracy( const Unit& unit ) const
272  {
273  return unit.getScaled( writtenAccuracy_ );
274  }
275 
276  //===============================================================
283  virtual bool set( DataWriter &writer, const Unit& unit, const bool value, const Timestamp& timestamp = Timestamp::NOT_SET_TIME );
284  virtual bool set( DataWriter &writer, const Unit& unit, const unsigned char value, const Timestamp& timestamp = Timestamp::NOT_SET_TIME );
285  virtual bool set( DataWriter &writer, const Unit& unit, const double value, const Timestamp& timestamp = Timestamp::NOT_SET_TIME );
286  virtual bool set( DataWriter &writer, const Unit& unit, const float value, const Timestamp& timestamp = Timestamp::NOT_SET_TIME );
287  virtual bool set( DataWriter &writer, const Unit& unit, const int value, const Timestamp& timestamp = Timestamp::NOT_SET_TIME );
288  virtual bool set( DataWriter &writer, const DataValue& value, const Timestamp& timestamp = Timestamp::NOT_SET_TIME );
290 
298  virtual bool setWithAccuracy( DataWriter &writer, const Unit& unit, const bool value, const float accuracy, const Timestamp& timestamp = Timestamp::NOT_SET_TIME );
299  virtual bool setWithAccuracy( DataWriter &writer, const Unit& unit, const unsigned char value, const float accuracy, const Timestamp& timestamp = Timestamp::NOT_SET_TIME );
300  virtual bool setWithAccuracy( DataWriter &writer, const Unit& unit, const double value, const float accuracy, const Timestamp& timestamp = Timestamp::NOT_SET_TIME );
301  virtual bool setWithAccuracy( DataWriter &writer, const Unit& unit, const int value, const float accuracy, const Timestamp& timestamp = Timestamp::NOT_SET_TIME );
302  virtual bool setWithAccuracy( DataWriter &writer, const DataValue& value, const float accuracy, const Timestamp& timestamp = Timestamp::NOT_SET_TIME );
304 
305  //===============================================================
311  virtual bool setAccuracy( DataWriter &writer, const Unit& unit, const float accuracy );
312 
314  virtual float getBaseAccuracy() const = 0;
315 
317  virtual const Unit* getBaseUnit()
318  {
319  return baseUnit_;
320  }
321 
323  virtual size_t getTypeSize()
324  {
325  return typeSize_;
326  }
327 
332  virtual bool wasTouchedSinceLastRun( const Component* component );
333 
335  float getPower()
336  {
337  return power_;
338  }
339 
341  float getError()
342  {
343  return getBaseAccuracy();
344  }
345 
347  float getLatency()
348  {
349  return latency_;
350  }
351 
353  float getFrequency()
354  {
355  return frequency_;
356  }
357 
359  void setPower( float power )
360  {
361  power_ = power;
362  }
363 
365  void setLatency( float latency )
366  {
367  latency_ = latency;
368  }
369 
371  void setFrequency( float frequency )
372  {
373  frequency_ = frequency;
374  }
375 
376 protected:
377 
379  DataElement( const ElementURI& name, const Unit* baseUnit, size_t typeSize );
380 
383  bool setWrittenAccuracy();
384 
386 
389  //UniversalElementQueue universalQueue_;
390  // Really just one UniversalElement.
392 
396 
399 
403 
406  bool invalid_;
407 
410 
413 
416 
419 
424  virtual DataValue* getDataValue( void ) const = 0;
425 
426  virtual void setDataValue( DataValue* dataValue ) = 0;
427 
434  virtual float setAccuracy( const Unit& unit, float accuracy ) = 0;
435 
438 
440  const Unit* baseUnit_;
441 
442  virtual void setBaseUnit( const Unit* baseUnit )
443  {
444  baseUnit_ = baseUnit;
445  }
446 
448  size_t typeSize_;
449 
450  virtual void setTypeSize( const size_t typeSize )
451  {
452  typeSize_ = typeSize;
453  }
454 
456  float power_;
457 
459  float latency_;
460 
462  float frequency_;
463 
464 private:
465  // Note that the copy constructor below is private and not given a body.
466  // Any attempt to call it will return a compiler error.
467  DataElement( const DataElement& old ); // disallow copy constructor
468 
469 };
470 
472 
473 #endif /*DATAELEMENT_H_*/
FlexArray< DataWriter * > writers_
List of all registered DataWriters.
Definition: DataElement.h:397
bool hasReaders(void) const
Does this DataElement have any readers?
Definition: DataElement.h:200
Serializable representation of DataAccessor object.
Definition: DataAccess.h:30
void setPower(float power)
Power used by the component that owns this element.
Definition: DataElement.h:359
void registerChangeDone(void)
Definition: DataElement.cpp:718
virtual const Unit * getBaseUnit()
The base unit that all writers and readers must use when accessing this value.
Definition: DataElement.h:317
void registerChangePending(DataWriter *writer)
Definition: DataElement.cpp:727
virtual bool isOwnersActive(void) const
Definition: DataElement.cpp:101
void registerReader(DataReader *reader)
Add the given DataReader to the list of readers for this DataElement.
Definition: DataElement.cpp:154
virtual bool isOwnersFailed(void) const
Definition: DataElement.cpp:76
bool isImplemented()
Returns true if there is a non-failed "implementor" reader of this element.
Definition: DataElement.cpp:199
Implementation of a DataElement as a "UniversalDataElement".
Definition: UniversalDataElement.h:29
Contains the DataReader class definition.
UniversalDataElement * getUniversal(void) const
Returns the universal data element registered to this data element.
Definition: DataElement.h:177
bool hasBeenSet_
Flag – false until the first call to set done.
Definition: DataElement.h:437
bool setInvalid(bool invalid, DataWriter *notifier)
Set the element's invalid flag.
Definition: DataElement.cpp:651
virtual void setBaseUnit(const Unit *baseUnit)
Definition: DataElement.h:442
virtual bool isUniversal() const
Definition: DataElement.h:161
float writtenAccuracy_
Accuracy of last written value.
Definition: DataElement.h:415
float getFrequency()
Frequency of measurements possible.
Definition: DataElement.h:353
A DataAccessor that reads values from the Slate Contains a default dataValue that must not be NULL...
Definition: DataReader.h:30
const ElementURI & getUri(void) const
Get the full ElementURI for the DataElement.
Definition: DataElement.cpp:58
float latency_
Latency involved in requesting a measurement.
Definition: DataElement.h:459
virtual bool isInvalid(void) const
Is the element "invalid".
Definition: DataElement.cpp:71
A simple pthread Mutex abstraction.
Definition: Mutex.h:20
Contains the UniversalURI class definition.
virtual const int asInt(DataReader &reader, const Unit &unit)
Definition: DataElement.cpp:338
bool setUnavailable(bool unavailable, DataWriter *notifier)
Set the element's unavailable flag.
Definition: DataElement.cpp:614
const double getScaled(const double &siValue) const
Definition: Unit.cpp:63
virtual bool isOrphaned(void) const
Returns the value of the element's "orphand" flag.
Definition: DataElement.cpp:96
virtual void registerRead(DataReader &reader)
Definition: DataElement.cpp:700
A DataValue is an abstract base class for a data value and associated engineering units of the value...
Definition: DataValue.h:35
virtual bool isActive(void) const
Indicates if the element is "active".
Definition: DataElement.cpp:120
float frequency_
Frequency of measurements possible.
Definition: DataElement.h:462
A DataAccessor that writes values to the Slate via its associated DataElement.
Definition: DataWriter.h:27
Provides a simple command line interface to the LRAUV.
Definition: CommandLine.h:38
unsigned int writerCount() const
Number of writers registered to this DataElement.
Definition: DataElement.cpp:252
Extends the Str class, adding an unsigned short code (actually, the codes are limited to 14 bits...
Definition: CodedStr.h:23
Contains the FlexArrayBase and FlexArray class declarations.
virtual void setTypeSize(const size_t typeSize)
Definition: DataElement.h:450
bool isDataRequested()
Returns true if one of the registered readers is requesting data.
Definition: DataElement.cpp:179
static const Timestamp NOT_SET_TIME
Constant value to represent "no time".
Definition: Timestamp.h:37
virtual bool isActivatable(void) const
Indicates if the element is capable of being "active".
Definition: DataElement.cpp:125
virtual const Str asString(DataReader &reader, const Unit &unit)
Definition: DataElement.cpp:347
Code unit that represents an atomic unit of data destined for writing in the log file.
Definition: DataEntry.h:43
FlexArray< DataReader * > readers_
List of all registered DataReaders.
Definition: DataElement.h:398
virtual const Timestamp & getTimestamp() const
Returns the timestamp of last write.
Definition: DataElement.h:90
FlexArray< DataElement * > DataElementList
Definition: DataElement.h:471
DataElement(const ElementURI &name, const Unit *baseUnit, size_t typeSize)
Protected constructor for base class.
Definition: DataElement.cpp:740
virtual bool isUnavailable(void) const
Is the element "unavailable".
Definition: DataElement.cpp:66
bool unavailable_
The "unavailable" flag is actually a simple boolean which is set by the user or by the DataElement it...
Definition: DataElement.h:402
void registerUniversal(UniversalDataElement *abstract)
Indicates this DataElement should participate in the selection process for the given Universal...
Definition: DataElement.cpp:144
void registerWriter(DataWriter *writer)
Add the given writer to the list of registered writers for this DataElement.
Definition: DataElement.cpp:219
float getPower()
Power used by the component that owns this element.
Definition: DataElement.h:335
Replacement for standard template class string.
Definition: Str.h:12
virtual ~DataElement()
Destructor.
Definition: DataElement.cpp:26
UniversalDataElement * universal_
Queue of UniversalElements which this DataElement "participates in".
Definition: DataElement.h:391
size_t typeSize_
The base size that all writers must specify.
Definition: DataElement.h:448
virtual bool setWithAccuracy(DataWriter &writer, const Unit &unit, const bool value, const float accuracy, const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Set w/ Accuracy functions.
Definition: DataElement.cpp:549
void setLatency(float latency)
Latency involved in requesting a measurement.
Definition: DataElement.h:365
Abstract Base class for software components.
Definition: Component.h:53
Definition: DataAccessor.h:45
virtual void setTimestamp(const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Sets the timestamp of last write Used if a more acurate timestamp is available.
Definition: DataElement.cpp:689
void setFrequency(float frequency)
Frequency of measurements possible.
Definition: DataElement.h:371
virtual size_t getTypeSize()
The base size that all writers must specify.
Definition: DataElement.h:323
virtual float getWrittenAccuracy(const Unit &unit) const
Returns the accuracy at the time of the last write;.
Definition: DataElement.h:271
DataReader * findReader(const ElementURI &uri)
Returns the DataReader associated with this DataElement and the specified ElementURI.
Definition: DataElement.cpp:29
float getError()
Error in measurements.
Definition: DataElement.h:341
unsigned int readerCount() const
The number of readers currently registered to this DataElement.
Definition: DataElement.cpp:173
Contains the Mutex, ThreadCondition, and MutexLocker class declarations.
virtual bool setAccuracy(DataWriter &writer, const Unit &unit, const float accuracy)
Set just the accuracy.
Definition: DataElement.cpp:583
bool setWrittenAccuracy()
Called before set commands to update the written accuracy Returns true if the written accuracy has ch...
Definition: DataElement.cpp:764
void unregisterWriter(DataWriter *writer)
Remove the given writer from the list of registered writers for this DataElement. ...
Definition: DataElement.cpp:232
Contains the DataWriter class definition.
Code unit that represents the slate.
Definition: Slate.h:73
virtual bool wasTouchedSinceLastRun(const Component *component)
Returns true if the value was touched since the last run of the indicated component.
Definition: DataElement.cpp:732
virtual float getAccuracy(const Unit &unit) const =0
Access to get the current accuracy.
virtual float getBaseAccuracy() const =0
Returns the accuracy in base, unscaled SI units.
virtual void setDataValue(DataValue *dataValue)=0
bool isBest(DataAccessor::RequestStrategy strategy=DataAccessor::MIN_ERROR) const
Indicates if the element is the "best" of a set of measurements that feed into a universal.
Definition: DataElement.cpp:130
void unregisterReader(DataReader *reader)
Remove the given DataReader from the list of reader for this DataElement.
Definition: DataElement.cpp:160
bool invalid_
The "invalid" flag is actually a simple boolean which is set by the user or by the DataElement itself...
Definition: DataElement.h:406
Contains the DataValue class definition.
bool wasOrphaned_
Indicates that the element was previously orphaned.
Definition: DataElement.h:409
ElementURI name_
The DataElement ElementURI.
Definition: DataElement.h:385
bool hasWriters(void) const
Does this DataElement have any writers?
Definition: DataElement.h:229
Definition: DataElement.h:49
Code unit that represents a unique name for a DataElement.
Definition: ElementURI.h:27
const Unit * baseUnit_
The base unit that all writers and readers must use when accessing this value.
Definition: DataElement.h:440
float power_
Power used by the component that owns this element.
Definition: DataElement.h:456
float getLatency()
Latency involved in requesting a measurement.
Definition: DataElement.h:347
virtual void registerWrite(DataWriter &writer, bool changed)
Definition: DataElement.cpp:705
const char * what() const
Definition: DataElement.h:61
Timestamp timestamp_
Timestamp of last write.
Definition: DataElement.h:418
DataWriter * findWriter(const ElementURI &uri)
Returns the DataWriter associated with this DataElement and the specified ElementURI.
Definition: DataElement.cpp:42
const Unit * getUnit(void) const
Returns the Unit associated with this data element or NULL if no Unit is associated.
Definition: DataElement.cpp:136
virtual ~UninitializedException()
Definition: DataElement.h:58
Code that represents an engineering unit.
Definition: Unit.h:24
DataWriter * notifier_
The data writer responsable for notifying this element's Universal data element that a change is pend...
Definition: DataElement.h:395
virtual DataValue * getDataValue(void) const =0
Provides access to the an Element's DataValue.
virtual bool set(DataWriter &writer, const Unit &unit, const bool value, const Timestamp &timestamp=Timestamp::NOT_SET_TIME)
Set functions set int value.
Definition: DataElement.cpp:390
Serializes and unserializes mission state to allow missions to be resumed.
Definition: MissionStateLogger.h:35
Represents absolute times.
Definition: Timestamp.h:31
static const float NO_ACCURACY
Defines an accuracy quantity which means "no accuracy specified" typically means "don't use" i...
Definition: DataElement.h:73
virtual const double asDouble(DataReader &reader, const Unit &unit)
Definition: DataElement.cpp:329
UninitializedException()
Definition: DataElement.h:52
Abstact base class for one "element" of the Slate.
Definition: DataElement.h:37
Mutex mutex_
Mutex for thread-safing an instance of DataElement.
Definition: DataElement.h:412
RequestStrategy
Definition: DataAccessor.h:41