/** \file
 *
 *  Contains the BPC1_BattStick class declaration.
 *
 *  Copyright (c) 2014 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 */

#ifndef BPC1_BattStick_h
#define BPC1_BattStick_h

#include "data/DataElement.h"
#include "logger/Logger.h"


struct BattStick
{
    // Constructor
    BattStick();

    // The battery stick number
    int stickID_;

    bool isReserveStick_;

    // The Inspired battery serial number (s/n string gets written under Config/Battery)
    unsigned int serialNumber_;
    Str serialNumberStr_;

    // The battery temp
    float temp_;
    DataWriter *battTempWriter_;

    // The battery voltage
    float voltage_;
    DataWriter *battVoltageWriter_;

    // The battery current
    float current_;
    DataWriter *battCurrentWriter_;

    // The battery capacity
    float capacity_;
    DataWriter *battCapacityWriter_;

    // The battery status
    int status_;
    DataWriter *battStatusWriter_;

    Timestamp lastCheckInTime_;

    // Number of consecutive alarms to qulify a stick as missing.
    static const unsigned short MAX_STICK_ALARM_COUNT;

    // The status returned from the battery controller
    typedef enum
    {
        // ALARM BITS
        OVER_CHARGED_ALARM = 0x8000,
        TERMINATE_CHARGE_ALARM = 0x4000,
        OVER_TEMP_ALARM = 0x1000,
        TERMINATE_DISCHARGE_ALARM = 0x0800,
        REMAINING_CAPACITY_ALARM = 0x0200,
        REMAINING_TIME_ALARM = 0x0100,
        // STATUS BITS
        INITIALIZED = 0x0080,
        DISCHARGING = 0x0040,
        FULLY_CHARGED = 0x0020,
        FULLY_DISCHARGED = 0x0010
    } SMBStatus;

    // Checks the reported battery stick status against alarm bits
    bool checkStatus( Logger& logger );

    // Checks if battery stick thinks it's charging
    bool isCharging( void );

    int statusAlarmCount_;
    bool statusAlarmFlag_;
};


#endif /* BPC1_BattStick_h */
