//
//  Copyright © 2001 - 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:   Sensor.cpp
//
//  Project:    6046
//
//  Author(s):  W. Arcus
//
//  Purpose:    
//
//  Notes:      
//

#include "StdAfx.h"
#include "Sensor.h"

namespace
{
    const int iMaxFailCount_c   = 4;
}

//////////////////////////////////////////////////////////////////////
// CSensor class implementation.

CSensor::CSensor( void )
        :m_iMaxFailCount( iMaxFailCount_c )
{
    m_bFailAlarmActive = false;
    m_iFailCount       = 0;

    Reset();
}

CSensor::CSensor( const CSensor &rRhs )
        :m_iMaxFailCount( iMaxFailCount_c )
{
    CopySensorInfo( (SENSORINFO *) rRhs );

    m_bFailAlarmActive = rRhs.m_bFailAlarmActive;
    m_iFailCount       = rRhs.m_iFailCount;
}

CSensor::CSensor( const SENSORINFO *psSensorInfo )
        :m_iMaxFailCount( iMaxFailCount_c )
{
    m_bFailAlarmActive = false;
    m_iFailCount       = 0;

    ASSERT( psSensorInfo != NULL );

    if ( psSensorInfo != NULL )
    {
        CopySensorInfo( psSensorInfo );
    }
}

CSensor::~CSensor( void )
{
    Reset();
}

CSensor::operator SENSORINFO * () const
{
    return ( (::SENSORINFO *) this );
}

CSensor & CSensor::operator = ( const CSensor &rRhs )
{
    m_bFailAlarmActive = rRhs.m_bFailAlarmActive;
    m_iFailCount       = rRhs.m_iFailCount;

    CopySensorInfo( (SENSORINFO *) rRhs );

    return *this;
}

CSensor & CSensor::operator = ( const SENSORINFO *psSensorInfo )
{
    ASSERT( psSensorInfo != NULL );

    if ( psSensorInfo != NULL )
    {
        CopySensorInfo( psSensorInfo );
    }

    return *this;
}

bool CSensor::Reset( void )
{
    //szName          [ 64 ];
    //iPriority;
    //iFilter;
    //iSensorId;              // Sensor identifier.
    //iSensorIndex;           // Sensor index (dynamic list of mapped sensors).
    //iSensorType;
    //iMediaType;             // 0 = TCP/UDP, 1 = COM port.
    //iMediaPort;             // TCP/UDP or serial port for data.
    //szMediaName     [ 64 ]; // Name such as an address.
    //iCommandPort;           // TCP/UDP or serial port for commands.
    //szAddress       [ 16 ]; // Address of target sonar (eg. "127.0.0.1").
    //iSubsystemId;           // Sensor subsystem id.
    //iDataChannels;          // Data channels per subsystem (eg. 2 for SSS, 1 for SBP).

    return true;
}

bool CSensor::Set( const SENSORINFO &rsSensorInfo )
{
    CopySensorInfo( &rsSensorInfo );

    return true;
}

inline
void CSensor::CopySensorInfo( const SENSORINFO *psSensorInfo )
{
    if ( psSensorInfo != NULL )
    {
        // Use SENSOR_INFO's assignement operator to ensure correct
        // copy due to byte alignment.

        *((SENSORINFO *) this) = *psSensorInfo;
    }
}

void CSensor::ClearFailCount( void )
{
    m_iFailCount = 0;
}

void CSensor::MaxFailCount( void )
{
    m_iFailCount = m_iMaxFailCount;
}

void CSensor::IncrementFailCount( void )
{
    if ( ++m_iFailCount > m_iMaxFailCount )
    {
        m_iFailCount = m_iMaxFailCount;
    }
}

bool CSensor::IsMaxFailCount( void ) const
{
    return ( m_iFailCount >= m_iMaxFailCount );
}

bool CSensor::IsFailedAlarmActive( void ) const
{
    return m_bFailAlarmActive;
}

void CSensor::FailAlarm( const bool &rbActive )
{
    m_bFailAlarmActive = rbActive;
}

