//
//  Copyright © 2002, 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:   7kRemoteControl.h
//
//  Project:    6046
//
//  Author(s):  W. Arcus
//
//  Purpose:    Defines the 
//
//  Notes:      
//

#if !defined(AFX_7KREMOTECONTROL_H__DA6CE86F_E4FA_4F42_9B23_83F86EBBF0F4__INCLUDED_)
#define AFX_7KREMOTECONTROL_H__DA6CE86F_E4FA_4F42_9B23_83F86EBBF0F4__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "..\..\..\Utils\NetUtils\7kProtocol.h"
#include "..\..\..\Utils\NetUtils\SystemTime.h"
#include "..\..\..\Utils\NetUtils\Generic7kRecordEncoder.h"

#include "7kSonarMessages.h"

class C7kRemoteControl : public CGeneric7kRecordEncoder<N7kSonarMessages::REMOTECONTROLRTH>
{
public:

    ///////////////
    // Definitions.

    typedef enum tagECOMMANDIDCODE                              // Definitions from 7k DFD. NB: "New" items below noted in v0.51 DFD. and not yet supported.
    {
        commandIdShutdown                       = 1000,
        commandIdReboot                         = 1001,
        commandIdCalibrate                      = 1002,
        commandIdRange                          = 1003,
        commandIdMaxPingRate                    = 1004,
        commandIdTransmitPower                  = 1005,
        commandIdTransmitPulseWidth             = 1006,
        commandIdTransmitPulseType              = 1007,
        commandIdReceiverGain                   = 1008,
        commandIdBottomDetectionMethodMask      = 1009,
        commandIdBottomDetectionFilterInfo      = 1010,
        commandIdProjectorSelection             = 1011,
        commandIdProjectorStabilization         = 1012,
        commandIdTransmitterStabilization       = 1013,
        commandIdAutoRange                      = 1014,
        commandIdHydrophoneSelection            = 1015,
        commandIdProjectorSteering              = 1016,
        commandIdReceiverGainType               = 1017,
        commandIdTVGCoefficients                = 1018,
        commandIdAutoReceiverGain               = 1019,

        commandIdTransmitPulseEnvelopeId        = 1020,         // 
        commandIdTransmitTransmitBeamSteering   = 1021,         // 
        commandIdProjectorBeamWidths            = 1022,         //
        commandIdProjectorBeamFocalPoint        = 1023,         //
        commandIdProjectorBeamWeighting         = 1024,         //

        commandIdReceiveBeamWeighting           = 1025,         //
        commandIdTransmitFrequenciesForChirp    = 1027,         //

        commandIdSingleRecordRequest            = 1050,
        commandIdVolatileDataFeed               = 1051,
        commandIdStopVolatileDataFeed           = 1052,
        commandIdPersistentDataFeed             = 1053,
        commandIdStopPersistentDataFeed         = 1054,
        commandIdVolatileDataFeedRange          = 1055,         // Subscribe to a range of messages.

        commandIdStartPinging                   = 1100,
        commandIdStopPinging                    = 1101,

        commandIdLoadParametersSystem           = 1102,         // Load factory parameters from disk.
        commandIdSnippetControl                 = 1103,         // Limit record 7008’s sample range to a window around the bottom detection ranges.
        commandIdBeamControl                    = 1104,         // Limit the number of beams in record 7008.
        commandIdDataSampleType                 = 1105,         // Set the data sample type for record 7008.
        commandIdSonarSequencerControl          = 1106,         // Turn sequencer on or off with this command.

        commandIdLoadParametersDevice           = 1108,         // Load factory device parameters.
        commandIdVerifySystemResponse           = 1109,         // Verify system response.

        commandIdStartRecord                    = 1200,         // Start Recording.
        commandIdStopRecord                     = 1201,         // Stop Recording.
        commandIdStartPlayback                  = 1202,         // Start playback.
        commandIdStopPlayback                   = 1203,         // Stop playback.

        commandIdAddPort                        = 1300,         // Define and a port to the system.
        commandIdControlPort                    = 1301,         // Control a physical or logical port.
        commandIdAddTrigger                     = 1302,         // Add trigger.
        commandIdControlTrigger                 = 1303,         // Control a defined trigger.
        commandIdAddSequence                    = 1304,         // Control a defined trigger. A new defined sequence does not start to execute until remote control command 1305 has been issued.
        commandIdControlSequence                = 1305          // Control a defined sequence.
    }
    ECOMMANDIDCODE;

    ///////////////
    // Services.

                                C7kRemoteControl            (   void );
    virtual                    ~C7kRemoteControl            (   void );

    bool                        SetClientId                 (   const GUID             &rsClientId );

    bool                        VerifySystemResponse        (   void );

    bool                        PingEnable                  (   const bool              &rbEnable,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        Shutdown                    (   void );

    bool                        Reboot                      (   void );

    bool                        Calibrate                   (   void );

    bool                        Range                       (   const float             &rfRangeInMeters,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        MaxPingRate                 (   const float             &rfMaxPingsPerSecond,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        TransmitPower               (   const float             &rfdBReOneMicroPascal,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        PulseWidth                  (   const float             &rfTxPulseWidthInSeconds,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        PulseType                   (   const unsigned long     &rulPulseType,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        ReceiverGain                (   const float             &rfGainIndB,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        BottomDetectMethod          (   const unsigned long     &rulBottomDetectMask,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        BottomDetectionFilterInfo   (   const float             &rfMinRange,
                                                                const float             &rfMaxRange,
                                                                const float             &rfMinDepth,
                                                                const float             &rfMaxDepth,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        ProjectorSelection          (   const unsigned long     &rulProjectorMagicNumber,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        ProjectorStabilization      (   const unsigned long     &rulProjectorMask,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        TransmitterStabilization    (   const unsigned long     &rulStabalizationMask,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        AutoRange                   (   const unsigned long     &rulAutoRangeMask );

    bool                        SelectHydroPhone            (   const unsigned long     &rulHydroPhoneMagicNumber );

    bool                        ProjectorSteering           (   const float             &rfSteeringAngleX,
                                                                const float             &rfSteeringAngleY );
    bool                        ReceiverGainType            (   const unsigned long     &rulReceiverGainType );

    bool                        TVGCoefficients             (   void );

    bool                        AutoReceiverGain            (   const unsigned long     &rulGainFlag,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        RequestSingleRecord         (   const unsigned long     &rulRecordType,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        VolatileDataFeed            (   const unsigned long     &rulNumberOfRecords,
                                                                const unsigned long     *paulRecordNumbers,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        VolatileDataFeed            (   const unsigned long     &rulBeginRecordId,
                                                                const unsigned long     &rulEndRecordId,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        DisableVolatileDataFeed     (   const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        PersistentDataFeed          (   const bool              &rbEnable,
                                                                const unsigned long     &rulIPAddress,
                                                                const unsigned short    &runPort,
                                                                const unsigned short    &runProtocolFlag,
                                                                const unsigned long     &rulNumberOfRecords,
                                                                const unsigned long     *paulRecordNumbers,
                                                                const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    bool                        LoadSystemDefaults          (   void );

    bool                        LoadDeviceDefaults          (   const unsigned long     &rulDeviceId,
                                                                const unsigned short    &runEnumerator );

    static unsigned long        RecordType                  (   void );

private:

    ///////////////
    // Attributes.

    static const unsigned long  m_ulRecordType;

    unsigned long               m_ulTicketNumber;
    GUID                        m_sClientId;

    ///////////////
    // Services.

    bool                    Encode                          (   const unsigned long     &rulCommandId,
                                                                const BYTE              *pbyRecordData          = NULL,
                                                                const unsigned long     &rulRecordDataBytes     = 0UL,
                                                                const bool              &rbUseChecksum          = false,
                                                                const unsigned long     &rulDeviceId            = 7000UL,
                                                                const unsigned short    &runSystemEnumerator    = 0         );


                            C7kRemoteControl                (   const C7kRemoteControl  &rRhs );                     // Not implemented thus private.
    C7kRemoteControl &      operator =                      (   const C7kRemoteControl  &rRhs );                     // Not implemented thus private.

};

#endif // !defined(AFX_7KREMOTECONTROL_H__DA6CE86F_E4FA_4F42_9B23_83F86EBBF0F4__INCLUDED_)
