#include "IbcDmMonitor.h"

IbcDmMonitor::IbcDmMonitor(const char *name, IbcApp *ibcApp)
  : DmMonitor(name, ibcApp)
{
  _ibcApp = ibcApp;

  // Monitor water alarm thresholds
  for (int i = 0; i < _ibcApp->waterAlarms.size(); i++)
  {
    WaterAlarm *alarm;
    _ibcApp->waterAlarms.get(i, (void **)&alarm);
    addMonitoredItem(alarm->threshold);
  }
}


int IbcDmMonitor::startMonitoring()
{
  MBool debug = FALSE;

  DmMonitor::startMonitoring();
  
  dprintf("IbcDmMonitor::startMonitoring() - ibc->buildSwitches()\n");

  _ibcApp->ibc->buildSwitches(_dmUpdateSem, _powerReqSem);

  dprintf("IbcDmMonitor::startMonitoring() - done with buildSwitches()\n");

  dprintf("IbcDmMonitor::startMonitoring() - ibc->startMonitoring()\n");
  _ibcApp->ibc->startMonitoring(this);
}


IbcDmMonitor::~IbcDmMonitor()
{
}


int IbcDmMonitor::handleResetSemaphore()
{
  MBool debug = TRUE;
  DmMonitor::handleResetSemaphore();

  _ibcApp->ibc->handleResetSemaphore();  

  for (int i = 0; i < _ibcApp->waterAlarms.size(); i++)
  {
    WaterAlarm *alarm;
    _ibcApp->waterAlarms.get(i, (void **)&alarm);
    dprintf("IbcDmMonitor::handleResetSemaphore() - proc water alarm #%d...",
	    i);

    alarm->updateThresholdDm(_ibcApp->device->channel());
    dprintf("done.\n");
  }

  return 0;
}


switchStatus IbcDmMonitor::powerSwitchStatus()
{
  return _ibcApp->ibc->powerSwitchStatus();
}


int IbcDmMonitor::cmdGroupCallback()
{
  MBool debug = TRUE;
  dprintf("IbcDmMonitor::cmdGroupCallback()\n");
  
  DmMonitor::cmdGroupCallback();
  _ibcApp->ibc->processDmChanges(_monitoredGroup);

  for (int i = 0; i < _ibcApp->waterAlarms.size(); i++)
  {
    WaterAlarm *alarm;
    _ibcApp->waterAlarms.get(i, (void **)&alarm);
    if (itemChanged(alarm->threshold))
    {
      dprintf("IbcDmMonitor::cmdGroupCallback() - "
	      "water alarm threshold \"%s\" changed\n", 
	      alarm->threshold->getName());
      
      alarm->updateThreshold(_ibcApp->device->channel());
    }
  }

  return 0;
}





