#include "math.h"
#include "powerAlloc.h"
#include "powerDM.h"
#include "GeoMonitor.h"
#include "Toolsled.h"
#include "ECUBoard.h"
#include "time.h"
#include "usrTime.h"

GeoMonitor::GeoMonitor(const char *name, GeoApp *app)
  : IbcDmMonitor(name, app)
{
  _geoApp = app;
  
  _spareDigitalInput0State = FALSE;
 
  sledName = name;
  
  addMonitoredItem(_geoApp->dmItems->spareAnalogOutput0);
  addMonitoredItem(_geoApp->dmItems->spareAnalogOutput1);

  addMonitoredItem(_geoApp->dmItems->spareDigitalInput0);
}


GeoMonitor::~GeoMonitor()
{
}


int GeoMonitor::handleResetSemaphore()
{
  IbcDmMonitor::handleResetSemaphore();
    
  Int16 initAnalogOutputValue = 0;
  switchStatus initSwitchState = SWITCH_OFF;

  //Initialize Spare Analog Output value
  urgentWriteDmItem(_geoApp->dmItems->spareAnalogOutput0->getHandle(),
                    &initAnalogOutputValue,
                    sizeof(initAnalogOutputValue)); 

  //Initialize Spare Analog Output value
  urgentWriteDmItem(_geoApp->dmItems->spareAnalogOutput1->getHandle(),
                    &initAnalogOutputValue,
                    sizeof(initAnalogOutputValue)); 

}


int GeoMonitor::cmdGroupCallback()
{
  IbcDmMonitor::cmdGroupCallback();
    
  MBool debug = TRUE;
  
  MBool autoIndexSense;
  Int16 spareAnalogOutputValue;
  SwitchStatus valveSwitchState;

  if (_monitoredGroup->itemChanged(_geoApp->dmItems->spareAnalogOutput0))
  {   
    dprintf("GeoMonitor::processDmInput() - input for spareAnalogOutput0\n");
    _geoApp->dmItems->spareAnalogOutput0->read(&spareAnalogOutputValue, 
					     (DM_Time *) NULL); 
    
    // Write Analog Value to micro
    setAnalogValue((Nat16 )spareAnalogOutputValue, SpareAnalogOutput0Channel);
  }

  if (_monitoredGroup->itemChanged(_geoApp->dmItems->spareAnalogOutput1))
  {   
    dprintf("GeoMonitor::processDmInput() - input for spareAnalogOutput1\n");
    _geoApp->dmItems->spareAnalogOutput1->read(&spareAnalogOutputValue, 
					     (DM_Time *) NULL); 
    
    // Write Analog Value to micro
    setAnalogValue((Nat16 )spareAnalogOutputValue, SpareAnalogOutput1Channel);
  }

  if (_monitoredGroup->itemChanged(_geoApp->dmItems->spareDigitalInput0))
  {
    dprintf("GeoMonitor::processDmInput() -input for spareDigitalInput0\n");    
    _geoApp->dmItems->spareDigitalInput0->read(&_spareDigitalInput0State,
                                             (DM_Time *) NULL);  
  }
  
  if (_geoApp->valvePack->newRequest(_monitoredGroup))
  {
    dprintf("GeoMonitor::processDmInput() - req for valvePack\n");
    _geoApp->valvePack->processSwitchRequest();

    taskDelay(CLOCKS_PER_SEC / (USECS_PER_SEC / POWER_DELAY));

    valveSwitchState = _geoApp->valvePack->status();
    
    if(valveSwitchState == SWITCH_ON)    
      _geoApp->ecuBoard->initECUDigitalOutputs();

  }
}

STATUS GeoMonitor::setAnalogValue(Nat16 level, Nat16 chan)
{
  return IBC_ISO_IO_SetDacLevel(_geoApp->device->channel(),
				ISO_IO_0_ADDR,
				chan,
				level);
}









