#include <Xm/RowColumn.h>
#include <Xm/PushB.h>
#include <Vk/VkErrorDialog.h>
#include "Alarm.h"
#include "Gf5vSelfTest.h"
#include "TableForm.h"
#include "TiburonApp.h"

Gf5vSelfTest::Gf5vSelfTest(const char *name, Widget parent, 
			   Gf5vDm *gf5vDm)
  : DmGuiObject(name, parent)
{
  _status = 0;
  
  _baseWidget = XtVaCreateWidget(name, xmRowColumnWidgetClass, parent, NULL);

  installDestroyHandler();

  char errorBuf[errorMsgSize];
 
  /* Find alarm items */
  SystemAlarms *alarms = ((TiburonApp *)theApplication)->systemAlarms;

 Alarm *selfTestAlarm;
  if ((selfTestAlarm = alarms->find(gf5vDm->selfTest->getName())) == NULL)
  {
    sprintf(errorBuf,
	    "Gf5vSelfTest::Gf5vSelfTest() - couldn't find alarm \"%s\"",
	    gf5vDm->selfTest->getName());

    theErrorDialog->postAndWait(errorBuf);
  }

  
  TableRowForm *mgr = new TableRowForm(name, _baseWidget, 2);
  
  _cmdButton = 
    XtVaCreateManagedWidget("selfTestCmd", xmPushButtonWidgetClass, 
			    mgr->baseWidget(), NULL);

  XtAddCallback(_cmdButton, XmNactivateCallback,
		&Gf5vSelfTest::cmdCallback, (XtPointer )this);
  
  mgr->append(_cmdButton);
  
  _status = new AlarmText("selfTestStatus", 
			  mgr->baseWidget(), 
			  selfTestAlarm, 
			  "Test result: %s");

  mgr->append(_status);
  mgr->show();


  _cmd = gf5vDm->selfTestCmd;

  if (addDmObject(_cmd, DmConsumeFlag | DmProvideFlag) == -1)
    return;

  if (setConsumePeriod(Aperiodic) == -1)
    return;
  
  updateGui();
}


Gf5vSelfTest::~Gf5vSelfTest()
{
  delete _status;
}


void Gf5vSelfTest::updateGui(DM_Item handle)
{
  DM_Time t;
  Errno errno;
  MBool test;
}


int Gf5vSelfTest::sendCmd()
{
  char errorBuf[errorMsgSize];

  DM_Time t;
  static struct timezone tz = 
  {
    0, 0
  };
  
  gettimeofday(&t, &tz);
  
  if ((errno = _cmd->write(&t)) != SUCCESS)
  {
    sprintDmError(errno, "Gf5vSelfTest::sendCmd()",  errorBuf);
    setError(errorBuf);
    theErrorDialog->postAndWait(errorBuf);
    return -1;
  }

  return 0;
}


void Gf5vSelfTest::cmdCallback(Widget w,
			     XtPointer clientData,
			     XtPointer callData)
{
  Gf5vSelfTest *obj = (Gf5vSelfTest *)clientData;

  obj->sendCmd();
}

