/* * * NOTES: * * REVISIONS: * pcy08Apr94: Trim size, use static iterators, dead code removal * pcy13Apr94: Use automatic variables decrease dynamic mem allocation * djs22Feb96: Added internal, external, and total packs * cgm12Apr96: Add destructor with unregister * poc28Sep96: Fixed SIR 4363. * djs29May97: Added update method for Symmetra events */ #define INCL_BASE #define INCL_DOS #define INCL_NOPM #include "cdefine.h" extern "C" { #if (C_OS & C_OS2) #include #endif #include } #include "batpacks.h" #include "comctrl.h" #include "sensor.h" #include "event.h" #include "dispatch.h" #include "utils.h" NumberBatteryPacksSensor :: NumberBatteryPacksSensor(PDevice aParent, PCommController aCommController, PFirmwareRevSensor aFirmwareRev) :EepromSensor(aParent, aCommController, EXTERNAL_BATTERY_PACKS) { theFirmwareRev = aFirmwareRev; CHAR external_packs[32]; // theValue of this sensor is the number of external battery packs. // Internal battery packs will be stored locally by this sensor. theFirmwareRev->Get(EXTERNAL_BATTERY_PACKS,external_packs); if (_strcmpi(external_packs,"YES") == 0) { theCommController->RegisterEvent(theSensorCode, this); } CHAR External_Battery_Packs_Changeable[32]; theFirmwareRev->Get(EXTERNAL_PACKS_CHANGEABLE,External_Battery_Packs_Changeable); if (_strcmpi(External_Battery_Packs_Changeable, "Yes") ==0) { readOnly = AREAD_WRITE; setInitialValue(); } CHAR Internal_Packs[32]; theFirmwareRev->Get(INTERNAL_BATTERY_PACKS,Internal_Packs); theNumber_Of_Internal_Packs = atoi(Internal_Packs); // Disable validation checking until the sensor value // is initialized theSensorIsInitialized = 0; if (!theFirmwareRev->IsBackUpsPro()) { DeepGet(); } } INT NumberBatteryPacksSensor::Get(INT aCode, PCHAR aValue) { INT err = ErrNO_ERROR; switch(aCode) { case EXTERNAL_BATTERY_PACKS: err = Sensor::Get(aValue); if (strlen(aValue) > 2) { aValue[0] = aValue[1]; aValue[1] = aValue[2]; aValue[2] = aValue[3]; // copy null terminator } break; case INTERNAL_BATTERY_PACKS: _itoa(theNumber_Of_Internal_Packs,aValue,10); break; case TOTAL_BATTERY_PACKS: { CHAR External_Packs[32]; err = Sensor::Get(External_Packs); INT Total_Batteries; Total_Batteries = theNumber_Of_Internal_Packs + atoi(External_Packs); _itoa(Total_Batteries,aValue,10); } break; default: err = Sensor::Set(aCode, aValue); break; } return err; } INT NumberBatteryPacksSensor::Set(INT aCode, const PCHAR aValue) { INT err = ErrNO_ERROR; switch(aCode) { case EXTERNAL_BATTERY_PACKS: { // Left pad number of battery packs with zeros // Default: set number of external battery packs to zero if (strlen(aValue) == 0) { aValue[3] = NULL; aValue[2] = '0'; aValue[1] = '0'; } if (strlen(aValue) == 1) { aValue[3] = aValue[1]; // copy null terminator aValue[2] = aValue[0]; aValue[1] = '0'; } if (strlen(aValue) == 2) { aValue[3] = aValue[2]; // copy null terminator aValue[2] = aValue[1]; aValue[1] = aValue[0]; } aValue[0] = '0'; err = Sensor::Set(aValue); } break; default: err = Sensor::Set(aCode, aValue); break; } return err; } INT NumberBatteryPacksSensor::Set(const PCHAR aValue) { return (Set(EXTERNAL_BATTERY_PACKS, aValue)); } INT NumberBatteryPacksSensor::Update(PEvent anEvent) { INT err = ErrNO_ERROR; switch (anEvent->GetCode()) { case EXTERNAL_BATTERY_PACKS: err = storeValue(anEvent->GetValue()); break; default: err = EepromSensor::Update(anEvent); break; } return err; } INT NumberBatteryPacksSensor::storeValue(const PCHAR aValue) { CHAR Ups_Is_A_Matrix[32]; theFirmwareRev ->Get(IS_MATRIX,Ups_Is_A_Matrix); if (_strcmpi(Ups_Is_A_Matrix,"Yes") ==0) { // // Initialize curr_num so if theValue is not set (should only be first // time thru) we will generate a CHECK_CABLE event // INT curr_num = -1; if(theValue) { curr_num = atoi(theValue); } INT new_count = atoi(aValue); if(new_count == 0 && curr_num != 0) { // create Check signal cable Event Event tmp(SMART_CELL_SIGNAL_CABLE_STATE, CHECK_CABLE); UpdateObj::Update(&tmp); } if(new_count != 0 && curr_num == 0) { // create Ignore battery good event. The UPS sends a battery good // when plugging back in the cable. Another UPSLink-ism. Event tmp(SMART_CELL_SIGNAL_CABLE_STATE, IGNORE_BATTERY_GOOD); UpdateObj::Update(&tmp); } } // Check for an new battery and generate an event if (theSensorIsInitialized) { if (strcmp(aValue, theValue) > 0) { PEvent added_event = new Event(BATTERY_ADDED, ""); UpdateObj::Update(added_event); delete added_event; added_event = NULL; } // Check for a battery removal and generate an event if (strcmp(aValue, theValue) < 0) { PEvent removed_event = new Event(BATTERY_REMOVED, ""); UpdateObj::Update(removed_event); delete removed_event; removed_event = NULL; } } else { theSensorIsInitialized = 1; } Sensor::storeValue(aValue); return ErrNO_ERROR; } NumberBatteryPacksSensor :: ~NumberBatteryPacksSensor() { theCommController->UnregisterEvent(theSensorCode, this); }