/* * * NOTES: * * REVISIONS: * ker23NOV92 Initial OS/2 Revision * pcy07Dec92: DeepGet no longer needs aCode * pcy11Dec92: Rework * pcy16Feb93: Have DeepGet return the value it gets event if error * cad07Oct93: Plugging Memory Leaks * ajr09Dec93: Added some error condition alerts through _theErrorLogger * cad16Dec93: fixed lookupsensorname * rct06Jan94: fixed sensor IsaCode stuff & lookupSensorName() * cad04Mar94: fix for mups sensor isa translation * pcy08Apr94: Trim size, use static iterators, dead code removal * pcy13Apr94: Use automatic variables decrease dynamic mem allocation * awm27Oct97: Added performance monitor offset to sensor class, and initialized * counters here * dma16Dec97: Changed DeepGet implementation to make an Update call. * awm14Jan98: Removed performance monitor offset to sensor class * clk11Feb98: Added DeepGetWithoutUpdate function * mholly25Sep98 : change the buffer size in DeepGet & DeepGetWithoutUpdate * to MAX_UPS_LINK_RESPONSE_LENGTH - now set at 256, granted * an arbitrary value, but it was set at 32, a value that was * too small to hold the allowed return of ^A */ #include "cdefine.h" #define INCL_BASE #define INCL_DOS #define INCL_NOPM extern "C" { #if (C_OS & C_OS2) #include #endif #include #include #include #include } #include "apc.h" #include "sensor.h" #include "utils.h" #include "comctrl.h" #include "event.h" #include "errlogr.h" #include "isa.h" #define MAX_UPS_LINK_RESPONSE_LENGTH 256 //Constructor Sensor :: Sensor(PDevice aParent, PCommController aCommController, INT aSensorCode, ACCESSTYPE anACCESSTYPE) : UpdateObj() { theDevice = aParent; theCommController = aCommController; theSensorCode = aSensorCode; readOnly = anACCESSTYPE; theValue = (PCHAR)NULL; } //Destructor Sensor :: ~Sensor() { if(theValue) free(theValue); } //Member Functions INT Sensor::Get(PCHAR aValue) { INT err = ErrNO_ERROR; if(theValue) { strcpy(aValue,theValue); } else { err = ErrNO_VALUE; } return err; } //Default behavior is to only support gets and sets on your own code // this does a deep get to the UPS, but will not update the sensor value INT Sensor::DeepGetWithoutUpdate(PCHAR aValue) { CHAR the_temp_value[MAX_UPS_LINK_RESPONSE_LENGTH] = {NULL}; INT err = ErrNO_ERROR; if ((err = theCommController->Get(theSensorCode, the_temp_value)) == ErrNO_ERROR) { if(aValue) { strcpy(aValue, the_temp_value); } } return err; } INT Sensor::DeepGet(PCHAR aValue) { CHAR the_temp_value[MAX_UPS_LINK_RESPONSE_LENGTH]; strcpy(the_temp_value,""); INT err = ErrNO_ERROR; if((err = theCommController->Get(theSensorCode, the_temp_value)) == ErrNO_ERROR) { if((err = Validate(theSensorCode, the_temp_value)) == ErrNO_ERROR) { storeValue(the_temp_value); PEvent sensor_event = new Event(theSensorCode, theValue); err = UpdateObj::Update(sensor_event); delete sensor_event; sensor_event = NULL; } else { #ifdef AJR_DEBUG CHAR tmp_error[80]; sprintf(tmp_error,"Sensor::Validate fails with %d\0",err); _theErrorLogger->LogError(tmp_error,__FILE__,__LINE__); #endif } } else { #ifdef AJR_DEBUG CHAR tmp_error[80]; sprintf(tmp_error,"Sensor::DeepGet theommController->Get fails with %d\0",err); _theErrorLogger->LogError(tmp_error,__FILE__,__LINE__); #endif } if(aValue) { strcpy(aValue, the_temp_value); } return err; } INT Sensor::storeValue(const PCHAR aValue) { if(aValue) { UtilStoreString(theValue, aValue); } return ErrNO_ERROR; } INT Sensor::Get(INT aCode, PCHAR aValue) { if(aCode == theSensorCode) return Get(aValue); else return ErrINVALID_CODE; } INT Sensor::Set(const PCHAR aValue) { INT err = ErrNO_ERROR; if(readOnly == AREAD_ONLY) { err = ErrREAD_ONLY; } else { if(aValue) { if((err = Validate(theSensorCode, aValue)) == ErrNO_ERROR) { if((err = theCommController->Set(theSensorCode, aValue)) == ErrNO_ERROR) { storeValue(aValue); } } } } return err; } INT Sensor::Set(INT aCode, const PCHAR aValue) { INT err = ErrNO_ERROR; if(aCode == theSensorCode) err = Set(aValue); else err = ErrINVALID_CODE; return err; } INT Sensor::Update(PEvent anEvent) { INT err = ErrNO_ERROR; INT the_temp_code; PCHAR the_temp_value; the_temp_code=anEvent->GetCode(); the_temp_value=anEvent->GetValue(); if((err = Validate(the_temp_code, the_temp_value)) == ErrNO_ERROR) { storeValue(the_temp_value); err = UpdateObj::Update(anEvent); } return err; } typedef struct IsaCode { INT isa_code; PCHAR sensor_name; } ISACODE; static ISACODE isa_codes[] = { { ABNORMALCONDITIONSENSOR, "AbnormalConditionSensor" }, { ALARMDELAYSENSOR, "AlarmDelaySensor" }, { BATTERYCALIBRATIONTESTSENSOR, "BatteryCalibrationTestSensor" }, { BATTERYCAPACITYSENSOR, "BatteryCapacitySensor" }, { BATTERYCONDITIONSENSOR, "BatteryConditionSensor" }, { BATTERYREPLACEMENTDATESENSOR, "BatteryReplacementDateSensor" }, { BATTERYVOLTAGESENSOR, "BatteryVoltageSensor" }, { COMMUNICATIONSTATESENSOR, "CommunicationStateSensor" }, { COPYRIGHTSENSOR, "CopyrightSensor" }, { DIPSWITCHPOSITIONSENSOR, "DipSwitchPositionSensor" }, { FIRMWAREREVSENSOR, "FirmwareRevSensor" }, { OUTPUTFREQUENCYSENSOR, "FrequencySensor" }, { HIGHTRANSFERVOLTAGESENSOR, "HighTransferVoltageSensor" }, { LINEVOLTAGESENSOR, "LineVoltageSensor" }, { LIGHTSTESTSENSOR, "LightsTestSensor" }, { LOWBATTERYDURATIONSENSOR, "LowBatteryDurationSensor" }, { LOWTRANSFERVOLTAGESENSOR, "LowTransferVoltageSensor" }, { MANUFACTUREDATESENSOR, "ManufactureDateSensor" }, { MAXLINEVOLTAGESENSOR, "MaxLineVoltageSensor" }, { MINLINEVOLTAGESENSOR, "MinLineVoltageSensor" }, { MINRETURNCAPACITYSENSOR, "MinReturnCapacitySensor" }, { OUTPUTVOLTAGESENSOR, "OutputVoltageSensor" }, { OVERLOADSENSOR, "OverloadSensor" }, { RATEDBATTERYVOLTAGESENSOR, "RatedBatteryVoltageSensor" }, { REPLACEBATTERYSENSOR, "ReplaceBatterySensor" }, { RATEDLINEVOLTAGESENSOR, "RatedLineVoltageSensor" }, { RATEDOUTPUTVOLTAGESENSOR, "RatedOutputVoltageSensor" }, { RUNTIMEREMAININGSENSOR, "RunTimeRemainingSensor" }, { SELFTESTRESULTSENSOR, "SelfTestResultSensor" }, { SELFTESTSCHEDULESENSOR, "SelfTestScheduleSensor" }, { SHUTDOWNDELAYSENSOR, "ShutdownDelaySensor" }, { SMARTBOOSTSENSOR, "SmartBoostSensor" }, // unused { TURNOFFUPSIMMEDIATELYSENSOR, "TurnOffUpsImmediatelySensor" }, { TURNOFFWITHDELAYSENSOR, "TurnOffWithDelaySensor" }, { TRANSFERCAUSESENSOR, "TransferCauseSensor" }, { TRIPREGISTERSENSOR, "TripRegisterSensor" }, { TURNONDELAYSENSOR, "TurnOnDelaySensor" }, { TURNOFFUPSONBATTERYSENSOR, "TurnOffUpsOnBatterySensor" }, { UTILITYLINECONDITIONSENSOR, "UtilityLineConditionSensor" }, { UNSUPPORTEDSENSOR, "UnsupportedSensor" }, { PUTUPSTOSLEEPSENSOR, "PutUpsToSleepSensor" }, { UPSBATTERYTYPESENSOR, "UpsBatteryTypeSensor" }, { UPSIDSENSOR, "UpsIdSensor" }, { UPSLOADSENSOR, "UpsLoadSensor" }, { UPSSENSITIVITYSENSOR, "UpsSensitivitySensor" }, { UPSSERIALNUMBERSENSOR, "UpsSerialNumberSensor" }, { UPSSIMULATEPOWERFAILSENSOR, "UpsSimulatePowerFailSensor" }, { UPSTEMPERATURESENSOR, "UpsTemperatureSensor" }, { TURNOFFDELAYSENSOR, "TurnOffDelaySensor" }, { SELFTESTSENSOR, "SelfTestSensor" }, { AMBIENTTEMPERATURESENSOR, "AmbientTemperatureSensor" }, { HUMIDITYSENSOR, "HumiditySensor" }, { CONTACTSENSOR, "ContactSensor" }, { NUMBERBATTERYPACKSSENSOR, "NumberBatteryPacksSensor" }, { NUMBERBADBATTERIESSENSOR, "NumberBadBatteriesSensor" }, { STATEREGISTERSENSOR, "StateRegisterSensor" }, { FANFAILURESENSOR, "FanFailureSensor" }, { BATTERYCHARGERSENSOR, "BatteryChargerSensor" }, { OVERTEMPFAULTSENSOR, "OverTempFaultSensor" }, { BYPASSMODESENSOR, "BypassModeSensor" }, { BYPASSRELAYFAILEDSENSOR, "BypassRelayFailedSensor" }, { BYPASSPOWERSUPPLYFAULTSENSOR, "BypassPowerSupplyFaultSensor" }, { MUPSFIRMWAREREVSENSOR, "MupsFirmwareRevSensor" }, { BATTERYRUNTIMESENSOR, "BatteryRunTimeSensor" }, { PANELPASSWORDSENSOR, "FrontPanelPasswordSensor" }, { RUNTIMEAFTERLOWBATTERYSENSOR, "RunTimeAfterLowBatterySensor" }, { 0, "NoMatch" } }; PCHAR Sensor::lookupSensorName(INT anIsaCode) { ISACODE * code = isa_codes; while(code->isa_code != 0) { if(code->isa_code == anIsaCode) { break; } code++; } return code->sensor_name; }