|
|
/*
* * NOTES: * * REVISIONS: * ker07DEC92: Initial OS/2 revision * ker14DEC92: fleshed out the methods * pcy17Dec92: Set should not use const PCHAR * pcy26Jan93: Added SetEepromAccess() * pcy02Feb93: Made Set() return value for all cases * cad03Sep93: Fixed problem where date not being cached, but cache used * cad07Oct93: Plugging Memory Leaks * cad11Nov93: Making sure all timers are cancelled on destruction * cad04Mar94: fixes for access code problem * pcy13Apr94: Use automatic variables decrease dynamic mem allocation * djs22Feb96: changed to new firmware rev interface * cgm16Apr96: Add unregister to destructor * ntf30Jul97: Added code after strncpy to cater for situation where * no '\0' added. * ntf30Jul97: Added 1 to the size of theReplaceDate and theAgeLimit as, well, * theReplaceDate anyway, was being copied to by a strncpy which * said its length excluding room for NULL char was * REPLACE_DATE_MAX which was actuall its size including NULL. * tjg02Mar98: Added theReplaceBatterySensor->DeepGet() in Reinitialize() */
#include "cdefine.h"
#define INCL_BASE
#define INCL_DOS
#define INCL_NOPM
extern "C" { #if (C_OS & C_OS2)
#include <os2.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
} #include "_defs.h"
#include "apc.h"
#include "battmgr.h"
#include "battrep.h"
#include "replbatt.h"
#include "cfgmgr.h"
#include "unssens.h"
#include "timerman.h"
#include "eeprom.h"
#include "smartups.h"
#if (C_OS & C_UNIX)
#include "utils.h"
#endif
#define REPLACE_DATE_MAX 32
BatteryReplacementManager::BatteryReplacementManager(PUpdateObj aParent, PCommController aCommController, PFirmwareRevSensor aFirmwareRevSensor) :Device(aParent, aCommController), theTimerId(0) { theReplaceDate=new CHAR[REPLACE_DATE_MAX+1]; theAgeLimit=new CHAR[REPLACE_DATE_MAX+1];
theParent=aParent; theCommController=aCommController;
CHAR Battery_Replacement_Date_Capable[32]; aFirmwareRevSensor->Get(IS_BATTERY_DATE,Battery_Replacement_Date_Capable);
if (_strcmpi(Battery_Replacement_Date_Capable,"No") == 0) { theBatteryReplacementDateSensor = &_theUnsupportedSensor; _theConfigManager->Get(CFG_BATTERY_REPLACEMENT_DATE, theReplaceDate); } else { theBatteryReplacementDateSensor=new BatteryReplacementDateSensor(this, theCommController); theBatteryReplacementDateSensor->Get(BATTERY_REPLACEMENT_DATE, theReplaceDate); } _theConfigManager->Get(CFG_BATTERY_AGE_LIMIT, theAgeLimit);
theReplaceBatterySensor = new ReplaceBatterySensor(this, theCommController); theReplaceBatterySensor->RegisterEvent(BATTERY_REPLACEMENT_CONDITION, this); }
BatteryReplacementManager::~BatteryReplacementManager() { if (theTimerId) { _theTimerManager->CancelTimer(theTimerId); theTimerId = 0; }
if(theBatteryReplacementDateSensor && (theBatteryReplacementDateSensor != &_theUnsupportedSensor)) { delete theBatteryReplacementDateSensor; theBatteryReplacementDateSensor = NULL; }
if (theReplaceBatterySensor){ theReplaceBatterySensor->UnregisterEvent(BATTERY_REPLACEMENT_CONDITION, this); delete theReplaceBatterySensor; theReplaceBatterySensor = NULL; }
if (theReplaceDate) { delete[] theReplaceDate; theReplaceDate = NULL; } if (theAgeLimit) { delete[] theAgeLimit; theAgeLimit = NULL; } }
INT BatteryReplacementManager::Get(INT aCode, PCHAR aValue) { INT err = ErrNO_ERROR;
switch(aCode) { case BATTERY_REPLACEMENT_DATE: strcpy(aValue, theReplaceDate); break;
case BATTERY_AGE_LIMIT: strcpy(aValue, theAgeLimit); break;
case LIGHTS_TEST: err = theParent->Get(aCode, aValue); break;
default: err =ErrINVALID_CODE; break; } return err; }
INT BatteryReplacementManager::Set(INT aCode, const PCHAR aValue) { INT err = ErrNO_ERROR;
switch(aCode) {
case BATTERY_REPLACEMENT_DATE: strncpy(theReplaceDate, aValue, REPLACE_DATE_MAX); //ntf30Jul97: Added next line in case theReplaceDate was full.
*(theReplaceDate + REPLACE_DATE_MAX) = '\0'; theBatteryReplacementDateSensor->Set(aCode, theReplaceDate); //err = _theConfigManager->Set(CFG_BATTERY_REPLACEMENT_DATE,
// theReplaceDate);
break;
case BATTERY_AGE_LIMIT: //err = _theConfigManager->Set(aCode, aValue);
break;
default: err = ErrINVALID_CODE; break; } return err; }
INT BatteryReplacementManager::Update(PEvent ev) { if ((ev->GetCode() == BATTERY_REPLACEMENT_CONDITION) && (atoi(ev->GetValue()) == BATTERY_NEEDS_REPLACING)) {
theTimerId = 0; } return Device::Update(ev); }
INT BatteryReplacementManager::SetReplacementTimer(void) {
//Get Date Battery Was Replaced/Installed
CHAR the_temp_string[REPLACE_DATE_MAX]; strcpy(the_temp_string, theReplaceDate); the_temp_string[2]='\0'; the_temp_string[5]='\0';
INT the_birth_month=atoi(the_temp_string); PCHAR the_day_pointer=&(the_temp_string[3]); INT the_birth_day=atoi(the_day_pointer); PCHAR the_year_pointer=&(the_temp_string[6]); INT the_birth_year=atoi(the_year_pointer);
//Get Lifespan of Battery
INT the_battery_lifespan=atoi(theAgeLimit);
//Calculate the month of death
INT the_month=the_birth_month+=(the_battery_lifespan%12);
INT the_year=the_birth_year+=(the_battery_lifespan/12); if(the_year>=100) the_year-=100;
//Create a DateTimeObj with that date
DateTimeObj my_date_time_obj(the_year, the_month, the_birth_day, 0L, 0L, 0L);
//Create the Event
Event the_timer_event(BATTERY_REPLACEMENT_CONDITION, BATTERY_NEEDS_REPLACING);
//Send it to the Timer manager and forget it
theTimerId = _theTimerManager->SetTheTimer(&my_date_time_obj, &the_timer_event, this);
return TRUE; }
VOID BatteryReplacementManager :: SetEepromAccess(INT anAccessCode) { ((PEepromChoiceSensor)theBatteryReplacementDateSensor)->SetEepromAccess(anAccessCode); }
VOID BatteryReplacementManager :: GetAllowedValue(INT code, CHAR *aValue) { ((PSmartUps)theParent)->GetAllowedValue(code, aValue); }
VOID BatteryReplacementManager::Reinitialize() { theBatteryReplacementDateSensor->DeepGet(); theReplaceBatterySensor->DeepGet(); }
|