windows-nt/Source/XPSP1/NT/ds/netapi/svcdlls/upssvc/apcsmart/batpacks.cxx
2020-09-26 16:20:57 +08:00

241 lines
5.9 KiB
C++

/*
*
* 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 <os2.h>
#endif
#include <stdlib.h>
}
#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);
}