#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/Label.h>
#include "ToolsledInterface.h"
#include "TiburonApp.h"
#include "TableForm.h"
#include "tiburon.h"

const char *const ToolsledInterface::latchDisarmedMnem = "Disarmed";
const char *const ToolsledInterface::latchArmedMnem = "Armed";
const char *const ToolsledInterface::latchArmedNoPwrMnem = "ArmedNoPwr";
const char *const ToolsledInterface::latchRunningMnem = "Running";

const char *const ToolsledInterface::latchedMnem = "Latched";
const char *const ToolsledInterface::unlatchedMnem = "Unlatched";
const char *const ToolsledInterface::connectedMnem = "Connected";
const char *const ToolsledInterface::unconnectedMnem = "Unconnected";

ToolsledInterface::ToolsledInterface(const char *name, Widget parent,
				     Boolean showHeader)
  : DmGuiObject(name, parent)
{
  _baseWidget = XtVaCreateWidget(name, xmRowColumnWidgetClass, parent, 
				 XmNorientation, XmVERTICAL,
				 NULL);

  if (showHeader)
  {
    TableRowForm *headings = new TableRowForm("headings", _baseWidget, 3); 
  
    Widget statusLbl =
      XtVaCreateManagedWidget("latchStatusLabel", xmLabelWidgetClass, 
			      headings->baseWidget(),
			      NULL);

    headings->append(statusLbl);
  
    Widget connectorLabel = 
      XtVaCreateManagedWidget("interfaceLabel", xmLabelWidgetClass, 
			      headings->baseWidget(),
			      NULL);

    headings->append(connectorLabel);
  
    Widget mechLabel = 
      XtVaCreateManagedWidget("mechLabel", xmLabelWidgetClass,
			      headings->baseWidget(),
			      NULL);

    headings->append(mechLabel);
  
    headings->show();
  }
  
	
  TableRowForm *row = new TableRowForm("row", _baseWidget, 3);
  
  _latchStatus =
    new DynamicLabel("latchStatus", row->baseWidget());

  _latchStatus->show();
  
  row->append(_latchStatus);

  _connected = 
    new DynamicLabel("connected", row->baseWidget());
  
  _connected->show();
  
  row->append(_connected);
  
  _latched = 
    new DynamicLabel("latched", row->baseWidget());
  
  _latched->show();
  
  row->append(_latched);
  
  row->show();
  
  char errorBuf[errorMsgSize];
  char itemName[MaxDmNameLen];
  char *namePtr;
  
  strcpy(itemName, TIBURON_DM_PREFIX);
  namePtr = itemName + strlen(itemName);
  
  strcpy(namePtr, TOOLSLED_LATCH_STATUS_DM);
  _dmTsLatchStatus = new DmEnumObject(itemName);
  if (_dmTsLatchStatus->error())
  {
    _dmTsLatchStatus->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  if (addDmObject(_dmTsLatchStatus, DmConsumeFlag) == -1)
    return;
  
  strcpy(namePtr, TOOLSLED_LATCHED_DM);
  _dmTsLatched = new DmBooleanObject(itemName);
  if (_dmTsLatched->error())
  {
    _dmTsLatched->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  if (addDmObject(_dmTsLatched, DmConsumeFlag) == -1)
    return;
  
  strcpy(namePtr, TOOLSLED_CONNECTED_DM);
  _dmTsConnected = new DmBooleanObject(itemName);
  if (_dmTsConnected->error())
  {
    _dmTsConnected->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  if (addDmObject(_dmTsConnected, DmConsumeFlag) == -1)
    return;
  
  if (setConsumePeriod(Aperiodic) == -1)
    return;

  updateGui();
}


ToolsledInterface::~ToolsledInterface()
{
}


void ToolsledInterface::updateGui(DM_Item handle)
{
  char errorBuf[errorMsgSize];
  Errno errno;
  DM_Time t;
  XmString xmstr;
  MBool debug = FALSE;
  Pixel foreground, background;
  char buf[100];

  TiburonApp *app = (TiburonApp *)theApplication;
  
  Int32 latchStatus;
  
  if ((errno = _dmTsLatchStatus->read(&latchStatus, &t)) != SUCCESS)
  {
    _dmTsLatchStatus->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  switch (latchStatus)
  {
    case LATCH_DISARMED:
    strcpy(buf, latchDisarmedMnem);
    app->okColors(&foreground, &background);
    break;
      
    case LATCH_ARMED:
    strcpy(buf, latchArmedMnem);
    app->priority1Colors(&foreground, &background);
    break;
      
    case LATCH_ARMED_NO_PWR:
    strcpy(buf, latchArmedNoPwrMnem);
    app->priority1Colors(&foreground, &background);
    break;
      
    case LATCH_RUNNING:
    strcpy(buf, latchRunningMnem);
    app->priority1Colors(&foreground, &background);
    break;

    default:
    strcpy(buf, "Unknown");
    app->priority1Colors(&foreground, &background);
  }
  _latchStatus->setText(buf);
  _latchStatus->setColors(foreground, background);

  MBool latched;
  if ((errno = _dmTsLatched->read(&latched, &t)) != SUCCESS)
  {
    _dmTsLatched->errorMsg(errorBuf);
    setError(errorBuf);
  }
  
  if (latched)
  {
    strcpy(buf, latchedMnem);
    app->powerOnColors(&foreground, &background);
  }
  else
  {
    strcpy(buf, unlatchedMnem);
    app->powerOffColors(&foreground, &background);
  }

  _latched->setText(buf);
  _latched->setColors(foreground, background);
  
  MBool connected;
  if ((errno = _dmTsConnected->read(&connected, &t)) != SUCCESS)
  {
    _dmTsConnected->errorMsg(errorBuf);
    setError(errorBuf);
  }

  if (connected)
  {
    strcpy(buf, connectedMnem);
    app->powerOnColors(&foreground, &background);
  }
  else
  {
    strcpy(buf, unconnectedMnem);
    app->powerOffColors(&foreground, &background);
  }

  _connected->setText(buf);
  _connected->setColors(foreground, background);
}
