#include "IbcApp.h"
#include "ibcItemNames.h"

IbcApp::IbcApp(const char *systemName,
	       const char *appName,
	       Sio32Interface *device) 
  : MicroApp(systemName, appName, device)
{
  char errorBuf[errorMsgSize];

  ibc = new IbcCardManager(systemName, appName, device->channel(), CPU196);
  
  if (ibc->error())
  {
    ibc->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  IbcApp::device = device;
}

  
IbcApp::~IbcApp()
{
  delete ibc;
  free((void *)_systemName);
  free((void *)_appName);
}


int IbcApp::initialize()
{
  MicroApp::initialize();
}


int IbcApp::processSrq(Byte *packet, int nPacketBytes)
{
  MBool debug = FALSE;

  Word requestCode = wordFromBuf(packet, 0);

  MBool found = FALSE;
  
  for (int i = 0; i < waterAlarms.size(); i++)
  { 
    WaterAlarm *alarm;
    waterAlarms.get(i, (void **)&alarm);

    if (alarm->statusChanged(requestCode))
    {
      found = TRUE;
      break;
    }
  }


  if (!found) {
    dprintf("IbcApp::processSrq() - found water alarm = %d\n", found);
    ibc->handleSrq(requestCode, packet);
  }
  else {
    dprintf("IbcApp::processSrq() - found water alarm\n");
  }

  return 0;
}


DeviceInterface::LinkState IbcApp::processMicroReset()
{
  DeviceInterface::LinkState linkState;
    
  if ((linkState = MicroApp::processMicroReset()) != DeviceInterface::LinkUp)
    return linkState;
  
  // Device link is up

  ibc->handleResetSrq(taskSync);
  
  return taskSync->deviceLinkState();
}  



WaterAlarm *IbcApp::addWaterAlarm(WaterAlarmType type,
				  Word getCmd,
				  Word getCmdMask,
				  Word getThreshCmd,
				  Word setThreshCmd,
				  Word onSrqOpcode,
				  Word offSrqOpcode)
{
  
  char *typeMnem;

  switch (type) {

  case HousingWaterAlarm:
    typeMnem = HousingWaterAlarmName;
    break;

  case JboxWaterAlarm:
    typeMnem = JboxWaterAlarmName;
    break;

  default:
    typeMnem = "BadWaterAlarmType";
  }


  char alarmItemName[MaxDmNameLen];
  sprintf(alarmItemName, "%s.%s.%s", _systemName, _appName, typeMnem);

  char threshItemName[MaxDmNameLen];
  sprintf(threshItemName, "%s.%s.%s_%s", 
	  _systemName, _appName, typeMnem, ThresholdMnem);

  WaterAlarm *alarm = new WaterAlarm(alarmItemName, 
				     threshItemName, 
				     getCmd,
				     getCmdMask, getThreshCmd, setThreshCmd, 
				     onSrqOpcode, offSrqOpcode);
  
  waterAlarms.add((void **)&alarm);
  return alarm;
}

