//
//  Copyright © 2004, RESON Inc. All Rights Reserved.
//
//  No part of this file may be reproduced or transmitted in any form or by
//  any means, electronic or mechanical, including photocopy, recording, or
//  information storage or retrieval system, without permission in writing
//  from RESON Inc.
//
//  Filename:   SensorStatus.h
//
//  Project:    6046
//
//  Author(s):  W. Arcus
//
//  Purpose:    
//
//  Notes:      
//

#if !defined(AFX_SENSORSTATUS_H__A042FD89_E0AF_47D3_9606_507545974F4C__INCLUDED_)
#define AFX_SENSORSTATUS_H__A042FD89_E0AF_47D3_9606_507545974F4C__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#pragma warning( push, 3 )                                                                                                          // Microsoft's STL is dirty so suppress necessary warnings.
#pragma warning( disable : 4018 4284 4146 )
#include <deque>
#include <list>
#pragma warning( default : 4018 4284 4146 )
#pragma warning( pop )

#include "..\..\..\Utils\NetUtils\Critical.h"

class CSensorStatus
{
public:

    ///////////////
    // Services.

    class CMessageDescriptor
    {
    public:

        enum EACKNAKTYPE
        {
            ackNakTypeUnspecified,
            ackNakTypeAcknowledge,
            ackNakTypeNotAcknowledge
        };

        ///////////////
        // Services.

                                CMessageDescriptor  (   void );
        virtual                ~CMessageDescriptor  (   void );

                                CMessageDescriptor  (   const CMessageDescriptor        &rRhs );
        CMessageDescriptor &    operator =          (   const CMessageDescriptor        &rRhs );

        void                    Clear               (   void );

        void                    SetAckNak           (   const EACKNAKTYPE               &reAckNakType,
                                                        const int                       &riClientIndex,
                                                        const unsigned long             &rulRemoteControlId );

        bool                    IsAckNak            (   void )  const;

        ///////////////
        // Attributes.

        // Ack/Nak type info.

        bool                    m_bAckNak;
        EACKNAKTYPE             m_eAckNakType;
        int                     m_iClientIndex;
        unsigned long           m_ulRemoteControlId;

        // Status/Alarm type info.

        int                     m_iType;
        int                     m_iMode;
        int                     m_iId;
        unsigned long           m_ulTimeStamp;
        std::string             m_sMessage;
    };

    ///////////////
    // Services.

                                CSensorStatus       (   void );
    virtual                    ~CSensorStatus       (   void );

    void                        Reset               (   void );

    // Set retrieve health status.

    void                        Health              (   const bool                      &rbHealthy );
    bool                        IsHealthy           (   void );
    void                        SetTimeoutPeriod    (   const unsigned long             &rulTimeoutInMilliseconds );

    // Access to queued messages.

    bool                        IsQueued            (   void )  const;
    bool                        QueueMessage        (   const CMessageDescriptor        &rMessageDescriptor );
    bool                        RetrieveNextMessage (   CMessageDescriptor              &rMessageDescriptor );

private:

    ///////////////
    // Definitions.

    typedef std::deque<CMessageDescriptor>          MessageQueue_t;
    typedef MessageQueue_t::iterator                MessageQueueIterator_t;

    ///////////////
    // Attributes.

    const unsigned long                             m_ulDefaultNonResponsePeriod;

    bool                                            m_bHealthy;

    unsigned long                                   m_ulNonResponsePeriod;
    unsigned long                                   m_ulTimeOfLastUpdate;

    mutable CCritical                               m_StateGuard;
    mutable MessageQueue_t                          m_MessageQueue;

    ///////////////
    // Services.

                        CSensorStatus               (   const CSensorStatus             &rRhs );                 // Not implemented thus private.
    CSensorStatus &     operator =                  (   const CSensorStatus             &rRhs );                 // Not implemented thus private.

};

#endif // !defined(AFX_SENSORSTATUS_H__A042FD89_E0AF_47D3_9606_507545974F4C__INCLUDED_)
