using System; using System.Text; using Microsoft.SPOT.Hardware; using SWModules; namespace HWModules { public sealed class EnergyMonitorBatteryBus { //TODO P1 this may not need to be a singleton if it is only used in StateBase private EnergyMonitorBatteryBus() { underVoltageError = new ErrorHandler(3, underVoltageErrorTS, underVoltageLabel, ErrorHandler.ErrorType.critical, ErrorHandler.setRecoveryMode); //underVoltageError.criticalErrorHandler += new ErrorHandler.CriticalErrorHandler(ErrorHandler.setRecoveryMode); } public static EnergyMonitorBatteryBus Instance { get { return Nested.instance;} } private class Nested { // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit static Nested() { } internal static readonly EnergyMonitorBatteryBus instance = new EnergyMonitorBatteryBus(); } EnergyMonitorLTC2946 em = new EnergyMonitorLTC2946(new I2CDevice.Configuration(0xDE >> 1, 400), EnergyMonitorLTC2946.VoltageSource.Vdd, 0.025, 0.50); private static TimeSpan underVoltageErrorTS = new TimeSpan(10000, 0, 0); private static StringBuilder underVoltageLabel = new StringBuilder("Bat Bus Under Voltage Error"); private static ErrorHandler underVoltageError; private static EnergyMonitorLTC2946.EM_VandI emData; private const double busVoltageEndMissionThreshold = 26.5; public EnergyMonitorLTC2946.EM_VandI getVoltsAndMilliAmps() { emData = em.getVandI(); if (SV.CurrentState != CPFStates.SMNotRunning) //TODO P3 might not need to check state as this might only be called after state machine starts { if (emData.voltage < busVoltageEndMissionThreshold) underVoltageError.logError(); } SV.busVoltage = emData.voltage; return emData; } } }