#include <Vk/VkErrorDialog.h>
#include "TelemMicro.h"
#include "TiburonApp.h"
#include "telemDiag.h"

TelemMicro::TelemMicro(const char *name, const char *dmPrefix)
  : Micro(name, dmPrefix)
{
  telemDm = new TelemDm(name, dmPrefix);
  if (telemDm->error())
  {
    char errorBuf[errorMsgSize];
    telemDm->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
}


TelemMicro::~TelemMicro()
{
}


MicroGui *TelemMicro::gui(Widget parent, int period)
{
  TelemMicroGui *gui = new TelemMicroGui(_name, parent, this, period);
  gui->show();
  return gui;
}


MicroH2OTemp *TelemMicro::h2OTemp(Widget parent, int period)
{
  TelemH2OTemp *gui = new TelemH2OTemp(_name, parent, this, period);
  gui->show();
  return gui;
}


MicroGf *TelemMicro::gf(Widget parent, int period)
{
  TelemGf *gui = new TelemGf(_name, parent, this, period);
  gui->show();
  return gui;
}


TelemH2OTemp::TelemH2OTemp(const char *name, Widget parent, 
			   TelemMicro *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->telemDm->dmPrefix());
  
  char *alarmNamePtr = alarmName + strlen(alarmName);

  strcpy(alarmNamePtr, TEMPERATURE_ALARM_DM);
  Alarm *tempAlarm;
  if ((tempAlarm = alarms->find(alarmName)) == NULL)
  {
    sprintf(errorBuf, 
	    "TelemH2OTemp::TelemH2OTemp() - 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->telemDm->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();
}


TelemH2OTemp::~TelemH2OTemp()
{
}


TelemGf::TelemGf(const char *name, Widget parent, TelemMicro *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->telemDm->dmPrefix());
  
  char *alarmNamePtr = alarmName + strlen(alarmName);

  strcpy(alarmNamePtr, LOCAL_GND_FLT_ALARM_DM);
  Alarm *localGfAlarm;
  if ((localGfAlarm = 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);

  _localGf = 
    new AlarmedInt16Text("localGf", _row->baseWidget(), "%-3.0f", 
			 micro->telemDm->localGfCurrent,
			 period, localGfAlarm, Dynamic); 

  _row->append(_localGf);

  Widget notApplicable = 
    XtVaCreateManagedWidget("notApplicable", xmLabelWidgetClass, 
			    _row->baseWidget(),
			    NULL);			    

  _row->append(notApplicable);

  _row->show();
}


TelemGf::~TelemGf()
{
}


TelemMicroGui::TelemMicroGui(const char *name, Widget parent, 
			       TelemMicro *micro, int period)
  : MbariMicroGui(name, parent, micro)
{
  _temp = 0;
  _gfSelfTest = 0;
  _localGf = 0;
  _fddiStatus = 0;
  _laserStatus = 0;
  _rcvPower = 0;
  _subMux = 0;
  _bitErrorAlarm = 0;
  _bitErrorRate = 0;
  _bitErrorLongRate = 0;
  _dmBitErrorRate = 0;
  _dmBitErrorLongRate = 0;
  _dmPsuStatus = 0;

  TelemDm *telemDm = micro->telemDm;
  
  /* Find alarm items */
  SystemAlarms *alarms = ((TiburonApp *)theApplication)->systemAlarms;
  
  char itemName[MaxDmNameLen];
  char errorBuf[errorMsgSize];
  
  strcpy(itemName, (const char *)telemDm->dmPrefix());
  
  char *itemNamePtr = itemName + strlen(itemName);

  strcpy(itemNamePtr, TEMPERATURE_ALARM_DM);  
  Alarm *tempAlarm;
  if ((tempAlarm = alarms->find(itemName)) == NULL)
  {
    sprintf(errorBuf,
	    "CameraH2OTemp::CameraH2OTemp() - couldn't find alarm \"%s\"",
	    itemName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(itemNamePtr, LOCAL_GND_FLT_ALARM_DM);
  Alarm *localGfAlarm;
  if ((localGfAlarm = alarms->find(itemName)) == NULL)
  {
    sprintf(errorBuf, 
	    "TelemMicroGui::TelemMicroGui() - couldn't find alarm \"%s\"",
	    itemName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(itemNamePtr, TELEM_FDDI_STATUS_ALARM_DM);
  Alarm *fddiStatusAlarm;
  if ((fddiStatusAlarm = alarms->find(itemName)) == NULL)
  {
    sprintf(errorBuf, 
	    "TelemMicroGui::TelemMicroGui() - couldn't find alarm \"%s\"",
	    itemName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(itemNamePtr, TELEM_LASER_STATUS_ALARM_DM);
  Alarm *laserStatusAlarm;
  if ((laserStatusAlarm = alarms->find(itemName)) == NULL)
  {
    sprintf(errorBuf, 
	    "TelemMicroGui::TelemMicroGui() - couldn't find alarm \"%s\"",
	    itemName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(itemNamePtr, TELEM_SUB_MUX_ALARM_DM);
  Alarm *subMuxAlarm;
  if ((subMuxAlarm = alarms->find(itemName)) == NULL)
  {
    sprintf(errorBuf, 
	    "TelemMicroGui::TelemMicroGui() - couldn't find alarm \"%s\"",
	    itemName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(itemNamePtr, TELEM_RECV_PWR_ALARM_DM);
  Alarm *rcvPowerAlarm;
  if ((rcvPowerAlarm = alarms->find(itemName)) == NULL)
  {
    sprintf(errorBuf, 
	    "TelemMicroGui::TelemMicroGui() - couldn't find alarm \"%s\"",
	    itemName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(itemNamePtr, BIT_ERROR_RATE_ALARM_DM);
  Alarm *bitErrorAlarm;
  if ((bitErrorAlarm = alarms->find(itemName)) == NULL)
  {
    sprintf(errorBuf, 
	    "TelemMicroGui::TelemMicroGui() - couldn't find alarm \"%s\"",
	    itemName);
    
    theErrorDialog->postAndWait(errorBuf);
  }

  strcpy(itemNamePtr, BIT_ERROR_RATE_SHORT_DM);
  _dmBitErrorRate = new DmFlt32Object(itemName);

  strcpy(itemNamePtr, BIT_ERROR_RATE_LONG_TERM_DM);
  _dmBitErrorLongRate = new DmFlt32Object(itemName);

  strcpy(itemNamePtr, TELEM_PSU_STATUS_DM);
  _dmPsuStatus = new DmNat16Object(itemName);

  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",
			 telemDm->microTemp, period, tempAlarm, Dynamic);
  
  mgr->append(_temp);
  
  mgr->show();

  char cmdItemName[MaxDmNameLen];
  char statusItemName[MaxDmNameLen];

  strcpy(cmdItemName, (const char *)telemDm->dmPrefix());
  strcat(cmdItemName, GND_FLT_TEST_DM);
  strcpy(statusItemName, (const char *)telemDm->dmPrefix());
  strcat(statusItemName, GND_FLT_TEST_STATUS_DM);
  
  _gfSelfTest = new GfSelfTest("gfSelfTest", _baseWidget, 
			       cmdItemName, statusItemName);
  
  _gfSelfTest->show();

  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("localGfLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);

  mgr->append(label);
  
  _localGf = 
    new AlarmedInt16Text("localGf", mgr->baseWidget(), "%-3.0f", 
			 telemDm->localGfCurrent,
			 period, localGfAlarm, Dynamic); 

  mgr->append(_localGf);
  mgr->show();

  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("fddiStatusLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);

  mgr->append(label);
  
  _fddiStatus = 
    new AlarmText("fddiStatus", mgr->baseWidget(), fddiStatusAlarm, "%s");
  
  mgr->append(_fddiStatus);
  mgr->show();

  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("laserStatusLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);

  mgr->append(label);
  
  _laserStatus = 
    new AlarmText("laserStatus", mgr->baseWidget(), laserStatusAlarm, "%s");
  
  mgr->append(_laserStatus);
  mgr->show();
  
  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("rcvPowerLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);

  mgr->append(label);
  
  _rcvPower = 
    new AlarmText("rcvPower", mgr->baseWidget(), rcvPowerAlarm, 
		  "%s");
  
  mgr->append(_rcvPower);
  mgr->show();

  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("subMuxLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);

  mgr->append(label);
  
  _subMux = 
    new AlarmText("subMux", mgr->baseWidget(), subMuxAlarm, "%s");
  
  mgr->append(_subMux);
  mgr->show();

  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("bitErrorAlarmLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);

  mgr->append(label);
  
  _bitErrorAlarm = 
    new AlarmText("bitErrorAlarm", mgr->baseWidget(), bitErrorAlarm, "%s");
  
  mgr->append(_bitErrorAlarm);
  mgr->show();

  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("bitErrorRateLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);

  mgr->append(label);
  
  _bitErrorRate = 
    new AlarmedFlt32Text("bitErrorRate", mgr->baseWidget(), 
			 "%.3e", _dmBitErrorRate, Aperiodic, NULL);
  
  mgr->append(_bitErrorRate);
  mgr->show();

  mgr = new TableRowForm("mgr", _baseWidget, 2);
  
  label = 
    XtVaCreateManagedWidget("bitErrorLongRateLabel", xmLabelWidgetClass, 
			    mgr->baseWidget(),
			    NULL);

  mgr->append(label);
  
  _bitErrorLongRate = 
    new AlarmedFlt32Text("bitErrorLongRate", mgr->baseWidget(), 
			 "%.3e", _dmBitErrorLongRate, Aperiodic, NULL);
  
  mgr->append(_bitErrorLongRate);
  mgr->show();
}


TelemMicroGui::~TelemMicroGui()
{
  delete _temp;
  delete _gfSelfTest;
  delete _localGf;
  delete _fddiStatus;
  delete _laserStatus;
  delete _rcvPower;
  delete _subMux;
  delete _bitErrorAlarm;
  delete _bitErrorRate;
  delete _bitErrorLongRate;
  delete _dmBitErrorRate;
  delete _dmBitErrorLongRate;
  delete _dmPsuStatus;
}


void TelemMicroGui::updateGui(DM_Item handle)
{
  MicroGui::updateGui();
}
