text: /**
   * \file
   * \author T. Canham
   * \brief PolyDb is a database for storing telemetry for internal software use
   *
   * \copyright
   * Copyright 2009-2015, by the California Institute of Technology.
   * ALL RIGHTS RESERVED.  United States Government Sponsorship
   * acknowledged.
   * <br /><br />
   */
  #ifndef POLYDBIMPL_HPP_
  #define POLYDBIMPL_HPP_
  
  #include <Svc/PolyDb/PolyDbComponentAc.hpp>
  #include <Fw/Types/PolyType.hpp>
  #include <PolyDbImplCfg.hpp>
  
  namespace Svc {
  
      //! \class PolyDbImpl
      //! \brief PolyDb Component Class
      //!
      //! This component allows the setting and retrieving of PolyType
      //! telemetry values. It be used as a central analog database
      //! that can decouple measurement sources from measurement users.
      //! The intent is that measurement sources would convert DNs (data numbers)
      //! to ENs (Engineering Numbers) to decouple the conversion as well.
      //!
  
      class PolyDbImpl : public PolyDbComponentBase {
          public:
              //!  \brief PolyDbImpl constructor
              //!
              //!  The constructor initializes the database to "MeasurementStatus::STALE."
              //!  All values retrieved will have this status until the first
              //!  update is received.
              //!
  
              PolyDbImpl(const char* name);
  
              //!  \brief PolyDbImpl initialization
              //!
              //!  The PolyDbImpl initialization function calls the base
              //!  class initializer.
              //!
  
              void init(NATIVE_INT_TYPE instance);
  
              //!  \brief PolyDbImpl destructor
              //!
              //!  The destructor is empty.
              //!
  
              virtual ~PolyDbImpl();
          protected:
          private:
  
              //!  \brief The value getter port handler
              //!
              //!  The getter port handler looks up the indicated entry
              //!  in the database and copies the contents into the user
              //!  supplied arguments status, time, and val.
              //!
              //!  \param portNum port number of request (always 0)
              //!  \param status last status of retrieved measurement
              //!  \param time time tag of latest measurement
              //!  \param val value of latest measurement
  
              void getValue_handler(NATIVE_INT_TYPE portNum, U32 entry, MeasurementStatus &status, Fw::Time &time, Fw::PolyType &val);
  
              //!  \brief The value setter port handler
              //!
              //!  The setter port handler takes the values passed
              //!  and updates the entry in the database
              //!
              //!  \param portNum port number of request (always 0)
              //!  \param status status of new measurement
              //!  \param time time tag of new measurement
              //!  \param val value of new measurement
  
              void setValue_handler(NATIVE_INT_TYPE portNum, U32 entry, MeasurementStatus &status, Fw::Time &time, Fw::PolyType &val);
  
              //! \struct t_dbStruct
              //! \brief PolyDb database structure
              //!
              //! This structure stores the latest values of the measurements.
              //! The statuses are all initialized to MeasurementStatus::STALE by the constructor.
              //!
  
              struct t_dbStruct {
                  MeasurementStatus status; //!< last status of measurement
                  Fw::PolyType val; //!< the last value of the measurement
                  Fw::Time time; //!< the timetag of the last measurement
              } m_db[POLYDB_NUM_DB_ENTRIES];
  
      };
  }
  
  #endif /* POLYDBIMPL_HPP_ */
  