windows-nt/Source/XPSP1/NT/ds/netapi/svcdlls/upssvc/apcsmart/matrix.cxx

298 lines
7.1 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*
*
* REVISIONS:
*
* cad08Sep93: Fix for setting from front end
* pcy13Sep93: Override SmartUps::HandleLineFail so we dont worry about boost
* cad16Sep93: Fixed state check bug
* pcy18Sep93: Cleaned up include files
* pcy20Sep93: Add line condition to smrt cable event so we dont crash in host
* cad02Nov93: name fix
* cad11Nov93: Making sure all timers are cancelled on destruction
* cad08Jan94: took out get for ups model (virtualized in smartups)
* pcy08Apr94: Trim size, use static iterators, dead code removal
* djs22Feb96: Removed smart trim sensor
*/
#include <stdlib.h>
#include "cdefine.h"
#include "_defs.h"
#include "matrix.h"
#include "batpacks.h"
#include "badbatts.h"
#include "bypmodes.h"
#include "timerman.h"
#include "unssens.h"
Matrix::Matrix(PUpdateObj aDeviceController, PCommController aCommController)
: SmartUps(aDeviceController, aCommController),
theIgnoreBattConditionOKFlag(FALSE),
theTimerID(0)
{
theNumberBadBatteriesSensor = new NumberBadBatteriesSensor(this, aCommController);
theBypassModeSensor = new BypassModeSensor(this, aCommController);
}
Matrix::~Matrix()
{
if (theTimerID) {
_theTimerManager->CancelTimer(theTimerID);
theTimerID = 0;
}
delete theNumberBadBatteriesSensor;
theNumberBadBatteriesSensor = NULL;
delete theBypassModeSensor;
theBypassModeSensor = NULL;
}
//-------------------------------------------------------------------------
VOID Matrix::registerForEvents()
{
SmartUps::registerForEvents();
theBypassModeSensor->RegisterEvent(BYPASS_MODE, this);
theNumberBatteryPacksSensor->RegisterEvent(SMART_CELL_SIGNAL_CABLE_STATE, this);
}
//-------------------------------------------------------------------------
INT Matrix::Get(INT code, char *aValue)
{
INT err = ErrINVALID_CODE;
switch(code)
{
// These, however, have no meaning to Matrix
case ALLOWED_LOW_TRANSFER_VOLTAGES:
case MIN_RETURN_CAPACITY:
case ALLOWED_MIN_RETURN_CAPACITIES:
//
// These are not implemented on Matrix so dont ask the SmartUps
// to do them.
break;
case MATRIX_FAN_STATE:
err = ErrUNSUPPORTED;
break;
case BAD_BATTERY_PACKS:
err = theNumberBadBatteriesSensor->Get(code, aValue);
break;
case BYPASS_POWER_SUPPLY_CONDITION:
err = ErrUNSUPPORTED;
break;
case BYPASS_MODE:
err = theBypassModeSensor->Get(code, aValue);
break;
case UPS_FRONT_PANEL_PASSWORD:
err = ErrUNSUPPORTED;
break;
case UPS_RUN_TIME_AFTER_LOW_BATTERY:
err = ErrUNSUPPORTED;
break;
case ALLOWED_UPS_RUN_TIME_AFTER_LOW_BATTERY:
err = ErrUNSUPPORTED;
break;
default:
err = SmartUps::Get(code, aValue);
break;
}
return err;
}
//-------------------------------------------------------------------------
INT Matrix::Set(INT code, const PCHAR aValue)
{
INT err = ErrINVALID_CODE;
switch(code)
{
case LOW_TRANSFER_VOLTAGE:
case ALLOWED_LOW_TRANSFER_VOLTAGES:
case MIN_RETURN_CAPACITY:
case ALLOWED_MIN_RETURN_CAPACITIES:
break;
case BYPASS_MODE:
err = theBypassModeSensor->Set(code, aValue);
break;
case UPS_FRONT_PANEL_PASSWORD:
err = ErrUNSUPPORTED;
break;
case UPS_RUN_TIME_AFTER_LOW_BATTERY:
err = ErrUNSUPPORTED;
break;
default:
err = SmartUps::Set(code, aValue);
break;
}
return err;
}
INT Matrix::Update(PEvent anEvent)
{
switch(anEvent->GetCode()) {
case BYPASS_MODE:
handleBypassModeEvent(anEvent);
break;
case BYPASS_POWER_SUPPLY_CONDITION:
break;
case SMART_CELL_SIGNAL_CABLE_STATE:
handleSmartCellSignalCableStateEvent(anEvent);
break;
default:
SmartUps::Update(anEvent);
break;
}
return ErrNO_ERROR;
}
VOID Matrix::HandleLineConditionEvent(PEvent anEvent)
{
switch(atoi(anEvent->GetValue())) {
case LINE_GOOD:
if (IS_STATE(UPS_STATE_ON_BATTERY)) {
BackUps::HandleLineConditionEvent(anEvent);
}
break;
case LINE_BAD:
{
CHAR value[32];
theBypassModeSensor->Get(BYPASS_MODE, value);
INT bypmode = atoi(value);
if (bypmode != UPS_ON_BYPASS) {
BackUps::HandleLineConditionEvent(anEvent);
}
}
break;
}
}
VOID Matrix::HandleBatteryConditionEvent(PEvent anEvent)
{
CHAR value[32];
theNumberBatteryPacksSensor->DeepGet(value);
INT packs = atoi(value);
// If packs is 0 we assume the smart cell signal cable is not plugged in
// and ignore the battery condition events the UPS puts out (a UPSLink-ism)
if (packs > 0) {
INT val = atoi(anEvent->GetValue());
if((val == BATTERY_BAD) ||
((val == BATTERY_GOOD) && (theIgnoreBattConditionOKFlag == FALSE))) {
SmartUps::HandleBatteryConditionEvent(anEvent);
}
}
}
VOID Matrix::handleBypassModeEvent(PEvent anEvent)
{
INT bit_to_use = 0;
INT cause = atoi(anEvent->GetAttributeValue(BYPASS_CAUSE));
switch(cause) {
case BYPASS_BY_SOFTWARE:
case BYPASS_BY_SWITCH:
bit_to_use = BYPASS_MAINT_BIT;
break;
case BYPASS_BY_DC_IMBALANCE:
case BYPASS_BY_VOLTAGE_LIMITS:
case BYPASS_BY_TOP_FAN_FAILURE:
case BYPASS_BY_INTERNAL_TEMP:
case BYPASS_BY_BATT_CHARGER_FAILED:
bit_to_use = BYPASS_MODULE_FAILED_BIT;
break;
}
INT val = atoi(anEvent->GetValue());
switch(val) {
case UPS_ON_BYPASS:
SET_BIT(theUpsState, bit_to_use);
break;
case UPS_NOT_ON_BYPASS:
CLEAR_BIT(theUpsState, bit_to_use);
break;
}
UpdateObj::Update(anEvent);
}
VOID Matrix::handleSmartCellSignalCableStateEvent(PEvent anEvent)
{
INT val = atoi(anEvent->GetValue());
switch(val) {
case CHECK_CABLE:
case CABLE_OK:
if(IS_STATE(UPS_STATE_ON_BATTERY)) {
anEvent->AppendAttribute(UTILITY_LINE_CONDITION, LINE_BAD);
}
else {
anEvent->AppendAttribute(UTILITY_LINE_CONDITION, LINE_GOOD);
}
UpdateObj::Update(anEvent);
break;
case IGNORE_BATTERY_GOOD:
{
Event cable_event(SMART_CELL_SIGNAL_CABLE_STATE,
RESPOND_TO_BATTERY_GOOD);
theIgnoreBattConditionOKFlag = TRUE;
theTimerID = _theTimerManager->SetTheTimer(5, &cable_event, this);
UpdateObj::Update(anEvent);
}
break;
case RESPOND_TO_BATTERY_GOOD:
theIgnoreBattConditionOKFlag = FALSE;
break;
}
}
INT Matrix::MakeSmartBoostSensor(const PFirmwareRevSensor rev)
{
//
// Smart-Boost is not supported on the Matrix
//
theSmartBoostSensor = &_theUnsupportedSensor;
return ErrNO_ERROR;
}
INT Matrix::MakeSmartTrimSensor(const PFirmwareRevSensor rev)
{
//
// SmartTrim is not supported on the Matrix
//
theSmartTrimSensor = &_theUnsupportedSensor;
return ErrNO_ERROR;
}
VOID Matrix::reinitialize()
{
SmartUps::reinitialize();
theNumberBadBatteriesSensor->DeepGet();
}