//
//  Copyright © 2003, 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:   7kSonarMessages.h
//
//  Project:    6046
//
//  Author(s):  W. Arcus
//
//  Purpose:    Defines the 7k record specific definitions such as id numbers and 
//              various RTH's that are used by the PLC's 7k sonar interface.
//
//  Notes:      
//

#if !defined(AFX_7KSONAR_H__17C48A9D_52FD_4384_8B4E_EB57BE21D719__INCLUDED_)
#define AFX_7KSONAR_H__17C48A9D_52FD_4384_8B4E_EB57BE21D719__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

namespace N7kSonarMessages
{
    enum E7KSONARRECORDIDS                                                                          // 7k record type per the ICD.
    {
        // Generic sensor records.

        recordTypeGenericSensorBegin                =   1000,                                       // Beginning of generic sensor record range.

        recordTypeReferencePoint                    =   1000,
        recordTypeSensorOffsetPosition              =   1001,
        recordTypeCalibratedSensorOffsetPosition    =   1002,
        recordTypePosition                          =   1003,
        recordTypeAttitude                          =   1004,
        recordTypeTide                              =   1005,
        recordTypeAltitude                          =   1006,
        recordTypeMotionOverGround                  =   1007,
        recordTypeDepth                             =   1008,
        recordTypeSoundVelocityProfile              =   1009,
        recordTypeCTD                               =   1010,
        recordTypeGeodesy                           =   1011,

        // ... new generic sensor etc. records to go in here; range 1000 to 1999 reserved.
        
        recordTypeGenericSensorEnd                  =   1999,                                       // End of generic sensor record range.

        // 7k sonar specific records.

        recordTypeVolatileSettings                  =   7000,                                       // Volatile sonar settings
        recordTypeConfigurationSettings             =   7001,                                       // Configuration settings
        recordTypeMatchFilter                       =   7002,                                       // Match Filter
        recordTypeBeamGeometry                      =   7004,                                       // Beam geometry
        recordTypeCalibrationData                   =   7005,                                       // Calibration data
        recordTypeBathymetricData                   =   7006,                                       // Bathymetric data
        recordTypeBackscatterImageData              =   7007,                                       // Backscatter image data
        recordTypeBeamData                          =   7008,                                       // Beam data
        recordTypeImageData                         =   7011,                                       // Compressed raw or beamformed magnitude/phase data.
        recordTypeSystemEvents                      =   7050,                                       // System events.
        recordTypeSystemEventMessage                =   7051,                                       // System event message.
        recordTypeDataStorageStatusInfo             =   7052,                                       // Data storage status information 
        recordTypeFileHeader                        =   7200,                                       // File header 
        recordTypeTrigger                           =   7300,                                       // Trigger 
        recordTypeTriggerSequenceSetup              =   7301,                                       // Trigger sequence setup 
        recordTypeTriggerSequenceDone               =   7302,                                       // Trigger sequence done 
        recordTypeTimeMessage                       =   7400,                                       // Time message 
        recordTypeRemoteControl                     =   7500,                                       // Remote control
        recordTypeRemoteControlAck                  =   7501,                                       // Remote control acknowledge 
        recordTypeRemoteControlNak                  =   7502,                                       // Remote control not acknowledge 
        recordTypeRemoteControlSonarSettings        =   7503,                                       // Remote control sonar settings 

        // Sonar parameters.

        recordTypeSonarCorrectionDataBegin          =   7600,                                       // Beginning of sonar correction data.

        recordTypeRoll                              =   7600,                                       // Roll.
        recordTypePitch                             =   7601,                                       // Pitch.
        recordTypeSoundSpeed                        =   7610,                                       // Sound Velocity.
        recordTypeAbsorptionLoss                    =   7611,                                       // Absorption loss.
        recordTypeSpreadingLoss                     =   7612,                                       // Spreading loss.

        recordTypeSonarCorrectionDataEnd            =   7612                                        // End of sonar correction data.
    };

    enum ESYSTEMEVENTID
    {
        systemEventIdSuccess                        = 0,
        systemEventIdInformation,
        systemEventIdWarning,
        systemEventIdError
    };

#pragma pack( push, SONARMESSAGES_H_PACK, 1 )

    typedef struct tagR7000                                     // Volatile data... taken verbatim from 7k.h
    {
        ULARGE_INTEGER   serial_number;
        DWORD            ping_number;
        WORD             multiping_sequence;
        float            frequency;
        float            sample_rate;
        float            receiver_bandwidth;
        float            pulse_width;
        DWORD            pulse_type;
        DWORD            pulse_envelope_type;
        float            pulse_envelope_parameter;
        DWORD            pulse_reserved;
        float            max_ping_rate;
        float            ping_period;
        float            range;
        float            power;
        float            gain;
        DWORD            control_flags;
        DWORD            projector_magic_number;
        float            projector_beam_steer_x;  
        float            projector_beam_steer_z;    
        float            projector_beam_width_x;
        float            projector_beam_width_z;
        float            projector_beam_focal_point;
        DWORD            projector_beam_weighting_type;
        float            projector_beam_weighting_parameter;
        DWORD            transmit_flags;
        DWORD            hydrophone_magic_number;
        DWORD            hydrophone_beam_weighting_type;
        float            hydrophone_beam_weighting_parameter;
        DWORD            receive_flags;
        float            bottom_detection_info1;
        float            bottom_detection_info2;
        float            bottom_detection_info3;
        float            bottom_detection_info4;
        float            absorption;
        float            sound_velocity;
        float            spreading_loss;
        WORD             reserved;
    }
    R7000, *PR7000;

    typedef struct tagCONFIGURATIONRTH
    {
        unsigned __int64    m_ui64SonarId;                                                          // u64 Serial number.
        unsigned long       m_ulNumberOfDevices;                                                    // Number of devices to follow in embedded data.
    }
    CONFIGURATIONRTH, *PCONFIGURATIONRTH;

    typedef struct tagTIMEMESSAGERTH                                                                // RTH for Record # 7400.
    {
        char            m_cLeapSecondOffset;                                                        // Leap second offset i8 -1, 0 or +1 second for midnight 31 Dec.
        unsigned char   m_ucPulseFlag;                                                              // Pulse flag u8 0  Message is not associated with hardware pulse.
                                                                                                    // 1  Message preceding hardware pulse.
                                                                                                    // 2  Message following hardware pulse.
        unsigned short  m_unPortNumber;                                                             // Port identifier u16 Port number identifier for pulse.
        unsigned long   m_ulReserved1;                                                              // Reserved u32 Reserved.
        unsigned char   m_ucReserved2[ 8 ];                                                         // Reserved u64 Reserved.
    }
    TIMEMESSAGERTH, *PTIMEMESSAGERTH;

    typedef struct tagREMOTECONTROLSONARSETTINGS                                                    // RTH for record #7503.
    {
        unsigned __int64    m_ui64SonarId;                                                          // u64 Serial number.
        unsigned long       m_ulPingNumber;                                                         // u32 Sequential number.
        float               m_fFrequency;                                                           // f32 Center transmit frequency in Hertz.
        float               m_fSampleRate;                                                          // f32 Sample in Hertz
        float               m_fReceiverBandwidth;                                                   // f32 In Hertz.
        float               m_fTxPulseWidth;                                                        // f32 Seconds of pulse.
        unsigned long       m_ulTxPulseTypeIdentifier;                                              // u32 0  CW
        unsigned long       m_ulTxPulseEnvelopeIdentifier;                                          // u32 0  Tapered rectangular, 1 - Tukey
        float               m_fTxPulseEnvelopeParameter;                                            // f32 Some envelopes doesnt use this parameter.
        unsigned long       m_ulTxPulseReserved;                                                    // u32 Additional pulse information.
        float               m_fPingPeriod;                                                          // f32 Seconds since last ping.
        float               m_fRangeSelection;                                                      // f32 Range selection in meters.
        float               m_fPowerSelection;                                                      // f32 Power selection in dB//΅ Pa
        float               m_fGainSelection;                                                       // f32 Gain selection in dB.
        unsigned long       m_ulControlFlags;                                                       // u32 BITFIELD
                                                                                                        // 3-0: Auto range method.
                                                                                                        // 7-4: Auto bottom detect filter method.
                                                                                                        // 8: Bottom detect range filter.
                                                                                                        // 9: Bottom detect depth filter.
                                                                                                        // 14-10: Auto receiver gain method.
                                                                                                        // 31-15: Reserved.
        unsigned long       m_ulProjectorMagicNumber;                                               // u32 Projector selection.
        float               m_fProjectorBeamSteeringAngleX;                                         // f32 In radians.
        float               m_fProjectorBeamSteeringAngleY;                                         // f32 In radians.
        float               m_fProjectorBeamWidth3dBX;                                              // f32 In radians.
        float               m_fProjectorBeamWidth3dBY;                                              // f32 In radians.
        float               m_fProjectorBeamFocalPoing;                                             // f32 In meters.
        unsigned long       m_fulProjectorBeamWeightingWindow;                                      // u32 0  Rectangular, 1  Chebychev
        unsigned long       m_ulProjectorBeamWeightingWindow;                                       // f32  N/A
                                                                                                    // parameter       
        unsigned long       m_ulTransmitFlags;                                                      // u32 BITFIELD
                                                                                                    // 3-0: Pitch stabilization method.
                                                                                                    // 7-4: Yaw stabilization method.
                                                                                                    // 31-8: Reserved.
        unsigned long       m_ulHydrophoneMagicNumber;                                              // u32 Hydrophone selection.
        unsigned long       m_ulReceiveBeamWeightingWindow;                                         // u32 0  Chebychev, 1 - Kaiser.
        float               m_fReceiveBeamWeighting;                                                // f32 N/A.
        unsigned long       m_ulReceiveFlags;                                                       // u32 BITFIELD thus:
                                                                                                        // 3-0: Roll stabilization method.
                                                                                                        // 7-4: Dynamic focusing method.
                                                                                                        // 11-8: Doppler compensation method.
                                                                                                        // 15-12: Match filtering method.
                                                                                                        // 19-16: TVG method.
                                                                                                        // 31-20: Reserved.
        float               m_fBottomDetectionFilterMinRange;                                       // f32 Min range (if range filter active).
        float               m_fBottomDetectionFilterMaxRange;                                       // f32 Max range (if range filter active).
        float               m_fBottomDetectionFilterMinDepth;                                       // f32 Min depth (if depth filter active).
        float               m_fBottomDetectionFilterMaxDepth;                                       // f32 Max depth (if depth filter active).
        float               m_fAbsorptionCoefficient;                                               // f32 Absorption coefficient in dB/km.
        float               m_fSoundSpeed;                                                          // f32 Sound Velocity in m/s
        float               m_fSpreadingLoss;                                                       // f32 Spreading loss in dB.
        unsigned short      m_unReserved;                                                           // u16 Reserved.
        float               m_fTxArrayOffsetX;                                                      // f32 New to DFD 0.54; details pending. 
        float               m_fTxArrayOffsetY;                                                      // f32 New to DFD 0.54; details pending.
        float               m_fTxArrayOffsetZ;                                                      // f32 New to DFD 0.54; details pending.
        float               m_fHeadTiltX;                                                           // f32 New to DFD 0.54; details pending.
        float               m_fHeadTiltY;                                                           // f32 New to DFD 0.54; details pending.
        float               m_fHeadTiltZ;                                                           // f32 New to DFD 0.54; details pending.
        unsigned long       m_ulPingOnOffState;                                                     // u32 New to DFD 0.54; 0 == off, 1 == on.
    }
    REMOTECONTROLSONARSETTINGS, *PREMOTECONTROLSONARSETTINGS;

    typedef struct tagREMOTECONTROLRTH
    {
        unsigned long   m_ulCommandId;
        unsigned long   m_ulTicket;
        unsigned char   m_ucTrackingNumber[ 16 ];                                                   // u128 Tracking number.
    }
    REMOTECONTROLRTH, *PREMOTECONTROLRTH;

    typedef struct tagREMOTECONTROLACKRTH
    {
        unsigned long   m_ulTicket;
        unsigned char   m_ucTrackingNumber[ 16 ];                                                   // u128 Tracking number.
    }
    REMOTECONTROLACKRTH, *PREMOTECONTROLACKRTH;

    typedef struct tagREMOTECONTROLNAKRTH
    {
        unsigned long   m_ulTicket;
        unsigned char   m_ucTrackingNumber[ 16 ];                                                   // u128 Tracking number.
        unsigned long   m_ulErrorCode;
    }
    REMOTECONTROLNAKRTH, *PREMOTECONTROLNAKRTH;

    typedef struct tagSYSTEMEVENTSRTH
    {
        unsigned __int64    m_ui64SonarId;
        unsigned long       m_ulNumberOfEvents;
    }
    SYSTEMEVENTSRTH, *PSYSTEMEVENTSRTH;

    typedef struct tagSYSTEMEVENTMESSAGERTH
    {
        unsigned __int64    m_SonarId;
        unsigned short      m_unEventId;
        unsigned short      m_unMessageLength;
        unsigned short      m_unEventIdentifier;
    }
    SYSTEMEVENTMESSAGERTH, *PSYSTEMEVENTMESSAGERTH;

#pragma pack( pop, SONARMESSAGES_H_PACK )

}

#endif  // !defined(AFX_7KSONAR_H__17C48A9D_52FD_4384_8B4E_EB57BE21D719__INCLUDED_)
