//
//  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:   PLCSensorData.h
//
//  Project:    6046
//
//  Author(s):  W. Arcus
//
//  Purpose:    Defines various exportable DLL classes to assist provide access 
//              to the PLC's shared sensor memory pool.
//
//  Notes:      
//

#if !defined(AFX_PLCSENSORDATA_H__2F5D9124_D37F_4F43_ACB0_1ED9EC7C0142__INCLUDED_)
#define AFX_PLCSENSORDATA_H__2F5D9124_D37F_4F43_ACB0_1ED9EC7C0142__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "RecordHeader.h"

///////////////////////////////////////////////////////////////////////////////
// CPLCSensorData class definition.

class EXPORT_DLL CPLCSensorData
{
public:

                            CPLCSensorData          (   void );
    virtual                ~CPLCSensorData          (   void );

    bool                    IsInitialized           (   void )  const;

    bool                    ResetMemoryPool         (   void );

protected:

    bool                    m_bInitialized;
    void                   *m_pvSharedMemory;

private:

    ///////////////
    // Services.

                            CPLCSensorData          (   const CPLCSensorData       &rRhs );                 // Not implemented thus private.
    CPLCSensorData  &       operator =              (   const CPLCSensorData       &rRhs );                 // Not implemented thus private.
};

///////////////////////////////////////////////////////////////////////////////
// CPLCWriteSensorData class definition.

class EXPORT_DLL CPLCWriteSensorData : public virtual CPLCSensorData
{
public:

    ///////////////
    // Services.

                            CPLCWriteSensorData     (   void );
    virtual                ~CPLCWriteSensorData     (   void );

    bool                    Write                   (   const RECORDHEADER         *psRecordHeader,
                                                        const BYTE                 *pbyRecord,
                                                        const unsigned long        &rulTotalBytesThisRecord,
                                                        const bool                 &rbHiddenRecord              = false );
private:

    ///////////////
    // Attributes.

                            CPLCWriteSensorData     (   const CPLCWriteSensorData  &rRhs );                 // Not implemented thus private.
    CPLCWriteSensorData  &  operator =              (   const CPLCWriteSensorData  &rRhs );                 // Not implemented thus private.
};

///////////////////////////////////////////////////////////////////////////////
// CPLCReadSensorData class definition.

class EXPORT_DLL CPLCReadSensorData : public virtual CPLCSensorData
{
public:

    ///////////////
    // Services.

                            CPLCReadSensorData      (   void );
    virtual                ~CPLCReadSensorData      (   void );

    HANDLE                  GetAvailableDataEvent   (   void );

    bool                    Read                    (   unsigned long              &rulReadPoint,
                                                        BYTE                       *pby7kRecord,
                                                        unsigned long              &rulBytes,
                                                        int                        &riSensorIndex,
                                                        unsigned long              &rulTimeStamp,
                                                        const unsigned long        &rulMaxBufferSize,
                                                        bool                       &rbHiddenRecord );

                            operator HANDLE         (   void )  const;

private:

    ///////////////
    // Services.

                            CPLCReadSensorData      (   const CPLCReadSensorData   &rRhs );                 // Not implemented thus private.
    CPLCReadSensorData  &   operator =              (   const CPLCReadSensorData   &rRhs );                 // Not implemented thus private.
};

class EXPORT_DLL CPLCReadWriteSensorData : public CPLCWriteSensorData, public CPLCReadSensorData
{
public:

    ///////////////
    // Services.
                                CPLCReadWriteSensorData ( void );
                               ~CPLCReadWriteSensorData ( void );

private:

                                CPLCReadWriteSensorData ( const CPLCReadWriteSensorData &rRhs );            // Not implemented thus private.
    CPLCReadWriteSensorData &   operator =              ( const CPLCReadWriteSensorData &rRhs );            // Not implemented thus private.

};

#endif // !defined(AFX_PLCSENSORDATA_H__2F5D9124_D37F_4F43_ACB0_1ED9EC7C0142__INCLUDED_)

