/*
$Log: PduMicro.cc,v $
Revision 1.4  1997/10/03 09:31:39  oreilly
*** empty log message ***

Revision 1.3  97/08/12  14:51:09  14:51:09  oreilly (Thomas C. O'Reilly)
*** empty log message ***

Revision 1.2  97/05/30  16:30:48  16:30:48  oreilly (Thomas C. O'Reilly)
*** empty log message ***

Revision 1.1  97/05/06  16:30:17  16:30:17  oreilly (Thomas C. O'Reilly)
Initial revision

*/
#include <stdlib.h>
#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/Label.h>
#include <Xm/PushB.h>
#include <Xm/Separator.h>
#include <Xm/Frame.h>
#include <Vk/VkQuestionDialog.h>
#include <Vk/VkErrorDialog.h>
#include "PduMicro.h"
#include "TiburonApp.h"
#include "DmErrno.h"
#include "parseUtils.h"
#include "DataRates.h"
#include "pduMicro.h"

PduMicro::PduMicro(const char *name, const char *dmPrefix)
  : Micro(name, dmPrefix)
{
  pduDm = new PduDm(name, dmPrefix);
  if (pduDm->error())
  {
    char errorBuf[errorMsgSize];
    pduDm->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
}


PduMicro::~PduMicro()
{
}


MicroGui *PduMicro::gui(Widget parent, int period)
{
  PduMicroGui *gui = new PduMicroGui(_name, parent, this, period);
  gui->show();
  return gui;
}


MicroH2OTemp *PduMicro::h2OTemp(Widget parent, int period)
{
  PduH2OTemp *gui = new PduH2OTemp(_name, parent, this, period);
  gui->show();
  return gui;
}


MicroGf *PduMicro::gf(Widget parent, int period)
{
  PduGf *gui = new PduGf(_name, parent, this, period);
  gui->show();
  return gui;
}


PduH2OTemp::PduH2OTemp(const char *name, Widget parent, 
			       PduMicro *micro, 
			       int period)
  : MicroH2OTemp(name, parent)
{
  if (error())
    return;
  
  /* Find alarm items */
  SystemAlarms *alarms = ((TiburonApp *)theApplication)->systemAlarms;
  
  char alarmName[MaxDmNameLen];
  char errorBuf[errorMsgSize];
  
  strcpy(alarmName, (const char *)micro->pduDm->dmPrefix());
  
  char *alarmNamePtr = alarmName + strlen(alarmName);

  strcpy(alarmNamePtr, TEMP_ALARM_DM);
  Alarm *tempAlarm;
  if ((tempAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf, 
	    "PanTiltMicroGui::PanTiltMicroGui() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  Widget nameWidget =
    XtVaCreateManagedWidget(name, xmLabelWidgetClass, _row->baseWidget(),
			    NULL);			    

  _row->append(nameWidget);
  
  char format[100];
  
  _temp = 
    new AlarmedInt16Text("temperature", _row->baseWidget(), "%-3.0f C", 
			 micro->pduDm->temperature, 
			 period, tempAlarm, Dynamic); 

  _row->append(_temp);
  
  Widget notApplicable;

  notApplicable =
    XtVaCreateManagedWidget("notApplicable", xmLabelWidgetClass, 
			    _row->baseWidget(), 
			    NULL);

  _row->append(notApplicable);

  notApplicable =
    XtVaCreateManagedWidget("notApplicable", xmLabelWidgetClass, 
			    _row->baseWidget(), 
			    NULL);

  _row->append(notApplicable);

  notApplicable =
    XtVaCreateManagedWidget("notApplicable", xmLabelWidgetClass, 
			    _row->baseWidget(), 
			    NULL);

  _row->append(notApplicable);

  _row->show();
}


PduH2OTemp::~PduH2OTemp()
{
}


PduGf::PduGf(const char *name, Widget parent, PduMicro *micro, 
		 int period)
  : MicroGf(name, parent)
{
  if (error())
    return;
  
  /* Find alarm items */
  SystemAlarms *alarms = ((TiburonApp *)theApplication)->systemAlarms;
  
  char alarmName[MaxDmNameLen];
  char errorBuf[errorMsgSize];
  
  strcpy(alarmName, (const char *)micro->pduDm->dmPrefix());
  
  char *alarmNamePtr = alarmName + strlen(alarmName);

  strcpy(alarmNamePtr, EXT_GND_FLT_ALARM_DM);
  Alarm *externGfAlarm;
  if ((externGfAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf, 
	    "PduGf::PduGf() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  Widget nameWidget =
    XtVaCreateManagedWidget(name, xmLabelWidgetClass, _row->baseWidget(),
			    NULL);			    

  _row->append(nameWidget);

  Widget notApplicable = 
    XtVaCreateManagedWidget("notApplicable", xmLabelWidgetClass, 
			    _row->baseWidget(),
			    NULL);			    

  _row->append(notApplicable);

  _externGf = 
    new AlarmedInt16Text("externGf", _row->baseWidget(), "%-3.0f", 
			 micro->pduDm->externGfCurrent,
			 period, externGfAlarm, Dynamic); 

  _row->append(_externGf);

  _row->show();

}


PduGf::~PduGf()
{
}


PduMicroGui::PduMicroGui(const char *name, Widget parent, 
			       PduMicro *micro, int period)
  : MicroGui(name, parent, micro)
{
  _temp = 0;
  _externGf = 0;
  _wattage = 0;
  _voltage = 0;
  _transformerTemp = 0;

  for (int index = 0; index < 3; index++)
    _phase[index] = 0;
  
  _lowVoltage = 0;
  _phaseShift = 0;
  _gfSelfTest = 0;

  PduDm *pduDm = micro->pduDm;
  
  /* Find alarm items */
  SystemAlarms *alarms = ((TiburonApp *)theApplication)->systemAlarms;
  
  char alarmName[MaxDmNameLen];
  char errorBuf[errorMsgSize];
  
  strcpy(alarmName, (const char *)pduDm->dmPrefix());
  
  char *alarmNamePtr = alarmName + strlen(alarmName);

  strcpy(alarmNamePtr, TEMP_ALARM_DM);  
  Alarm *tempAlarm;
  if ((tempAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "PduMicroGui::PduMicroGui() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(alarmNamePtr, EXT_GND_FLT_ALARM_DM);  
  Alarm *externGfAlarm;
  if ((externGfAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "PduMicroGui::PduMicroGui() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(alarmNamePtr, WATTAGE_ALARM_DM);  
  Alarm *wattageAlarm;
  if ((wattageAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "PduMicroGui::PduMicroGui() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(alarmNamePtr, VOLTAGE_ALARM_DM);  
  Alarm *voltageAlarm;
  if ((voltageAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "PduMicroGui::PduMicroGui() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(alarmNamePtr, VOLTAGE_MIN_ALARM_DM);  
  Alarm *lowVoltageAlarm;
  if ((lowVoltageAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "PduMicroGui::PduMicroGui() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(alarmNamePtr, TRANS_TEMP_ALARM_DM);  
  Alarm *transformerTempAlarm;
  if ((transformerTempAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "PduMicroGui::PduMicroGui() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(alarmNamePtr, AMPS_PHASE1_ALARM_DM);  
  Alarm *phase1Alarm;
  if ((phase1Alarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "PduMicroGui::PduMicroGui() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(alarmNamePtr, AMPS_PHASE2_ALARM_DM);  
  Alarm *phase2Alarm;
  if ((phase2Alarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "PduMicroGui::PduMicroGui() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(alarmNamePtr, AMPS_PHASE3_ALARM_DM);  
  Alarm *phase3Alarm;
  if ((phase3Alarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "PduMicroGui::PduMicroGui() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(alarmNamePtr, OUT_OF_PHASE_ALARM_DM);  
  Alarm *phaseShiftAlarm;
  if ((phaseShiftAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf,
	    "PduMicroGui::PduMicroGui() - couldn't find alarm \"%s\"",
	    alarmName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  Widget label;
  TableRowForm *mgr;
  
  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("tempLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);
  
  mgr->append(label);
  
  _temp = 
    new AlarmedInt16Text("temperature", mgr->baseWidget(), "%-3.0f C",
			 pduDm->microTemp, period, tempAlarm, Dynamic);
  
  mgr->append(_temp);
  
  mgr->show();

  char testCmdItemName[MaxDmNameLen];
  char testStatusItemName[MaxDmNameLen];
  
  strcpy(testCmdItemName, pduDm->dmPrefix());
  strcat(testCmdItemName, GND_FLT_TEST_DM);
  strcpy(testStatusItemName, pduDm->dmPrefix());
  strcat(testStatusItemName, GND_FLT_TEST_STATUS_DM);

  _gfSelfTest = new GfSelfTest("gfSelfTest", _baseWidget, 
			       testCmdItemName, testStatusItemName);
  
  _gfSelfTest->show();

  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("externGfLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);
  mgr->append(label);

  _externGf = 
    new AlarmedInt16Text("externGf", mgr->baseWidget(), "%-3.0f", 
			 pduDm->externGfCurrent, period, externGfAlarm, 
			 Dynamic); 

  mgr->append(_externGf);
  
  mgr->show();
  
  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("wattageLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);
  mgr->append(label);

  _wattage = 
    new AlarmedFlt32Text("wattage", mgr->baseWidget(), "%-3.0f", 
			 pduDm->wattage, period, wattageAlarm, Dynamic); 

  mgr->append(_wattage);
  
  mgr->show();

  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("voltageLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);
  mgr->append(label);

  _voltage =
    new AlarmedInt16Text("voltage", mgr->baseWidget(), "%-3.0f", 
			 pduDm->voltage, period, voltageAlarm, Dynamic); 

  mgr->append(_voltage);
  
  mgr->show();


  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("lowVoltageAlarmLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);
  mgr->append(label);

  _lowVoltage = 
    new AlarmText("lowVoltage", mgr->baseWidget(), lowVoltageAlarm, "%s");

  mgr->append(_lowVoltage);
  
  mgr->show();

  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("transformerTempLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);
  mgr->append(label);

  _transformerTemp = 
    new AlarmedInt16Text("transformerTemp", mgr->baseWidget(), "%-3.0f", 
			 pduDm->transTemperature, period, 
			 transformerTempAlarm, Dynamic); 

  mgr->append(_transformerTemp);
  
  mgr->show();

  for (int index = 0; index < 3; index++)
  {
    mgr = new TableRowForm("mgr", _baseWidget, 2);

    char objName[100];
    sprintf(objName, "phase%dLabel", index + 1);
    
    label = 
      XtVaCreateManagedWidget(objName, xmLabelWidgetClass, 
			      mgr->baseWidget(),
			      NULL);
    mgr->append(label);

    sprintf(objName, "phase%d", index + 1);
    
    _phase[index] = 
      new AlarmedInt16Text(objName, mgr->baseWidget(), "%-3.0f", 
			   pduDm->phase[index], period, wattageAlarm, 
			   Dynamic); 

    mgr->append(_phase[index]);
  
    mgr->show();
  }

  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("phaseShiftLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);
  mgr->append(label);

  _phaseShift = 
    new AlarmText("phaseShift", mgr->baseWidget(), phaseShiftAlarm, "%s");

  mgr->append(_phaseShift);
  
  mgr->show();
  
}


PduMicroGui::~PduMicroGui()
{
  delete _temp;
  delete _externGf;
  delete _wattage;
  delete _voltage;
  delete _transformerTemp;

  for (int index = 0; index < 3; index++)
    delete _phase[index];
  
  delete _lowVoltage;
  delete _phaseShift;
  delete _gfSelfTest;
}


void PduMicroGui::updateGui(DM_Item handle)
{
  MicroGui::updateGui();
}
