/** \file
 *
 *  Contains the Inspired Energy Battery Stick class implementation.
 *
 *  Copyright (c) 2014 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 */

#include "BPC1_BattStick.h"


/// Number of consecutive alarms to qulify a stick as missing.
const unsigned short BattStick::MAX_STICK_ALARM_COUNT( 3 );

/// Initialize battery pack values
BattStick::BattStick()
    :
    stickID_( 0 ),
    isReserveStick_( false ),
    serialNumber_( 0 ),
    serialNumberStr_( "" ),
    temp_( 0.0 ),
    battTempWriter_( NULL ),
    voltage_( nanf( "" ) ),
    battVoltageWriter_( NULL ),
    current_( 0.0 ),
    battCurrentWriter_( NULL ),
    capacity_( 0.0 ),
    battCapacityWriter_( NULL ),
    status_( 0 ),
    battStatusWriter_( NULL ),
    lastCheckInTime_( Timestamp::Now() ),
    statusAlarmCount_( 0 ),
    statusAlarmFlag_( false )
{}


/// Checks the reported battery stick status word against alarm bits
bool BattStick::checkStatus( Logger& logger )
{
    Str errorMsg;
    bool ok = true;

    if( static_cast<bool>( status_ & TERMINATE_DISCHARGE_ALARM ) )
    {
        errorMsg = "TERMINATE_DISCHARGE_ALARM";
        ok = false;
    }
    else if( static_cast<bool>( status_ & TERMINATE_CHARGE_ALARM ) )
    {
        errorMsg = "TERMINATE_CHARGE_ALARM";
        ok = false;
    }
    else if( static_cast<bool>( status_ & OVER_CHARGED_ALARM ) )
    {
        errorMsg = "OVER_CHARGED_ALARM";
        ok = false;
    }
    else if( static_cast<bool>( status_ & OVER_TEMP_ALARM ) )
    {
        errorMsg = "OVER_TEMP_ALARM";
        ok = false;
    }

    // Report alarm status if any
    if( !ok )
    {
        statusAlarmCount_++;
        if( statusAlarmCount_ >= MAX_STICK_ALARM_COUNT ) statusAlarmFlag_ = true;

        char stickStatusStr[5];
        sprintf( stickStatusStr, "%04X", status_ );
        logger.syslog( "Battery stick #" + Str( stickID_ ) + " (s/n: " + serialNumberStr_ + ") reported " + errorMsg + ". Status code: 0x" + Str( stickStatusStr ) + ".", ( statusAlarmCount_ == MAX_STICK_ALARM_COUNT ) ? Syslog::FAULT : Syslog::ERROR );
    }
    else
    {
        // No alarms, reset count.
        statusAlarmCount_ = 0;
        statusAlarmFlag_ = false;
    }

    return ok;
}

bool BattStick::isCharging()
{
    if( static_cast<bool>( status_ & DISCHARGING ) )
    {
        return false;
    }
    return true;
}