#include <Xm/RowColumn.h>
#include <Xm/Label.h>
#include <Vk/VkRadioBox.h>
#include "VbMode.h"
#include "tiburon.h"
#include "vbSystem.h"
#include "DmErrno.h"

DM_Time VbMode::_t;
struct timezone VbMode::_tz;

VbMode::VbMode(const char *name, Widget parent)
  : DmGuiObject(name, parent)
{
  _baseWidget = XtVaCreateWidget(name, xmRowColumnWidgetClass, parent, 
				 XmNorientation, XmVERTICAL, 0);

  installDestroyHandler();

  _controls = new VkRadioBox("motorControls", _baseWidget);

  /* *****
  _floodButton = _controls->addItem("flood", False, 
				    &VbMode::controlButtonCallback,
				    this);
  ***** */

  _emptyButton = _controls->addItem("empty", False, 
				    &VbMode::controlButtonCallback,
				    this);  

  /* *****
  _stopButton = _controls->addItem("stop", False, 
				   &VbMode::controlButtonCallback,
				   this);
  ***** */

  _controls->show();
  
  _status = XtVaCreateManagedWidget("status", xmLabelWidgetClass, 
				    _baseWidget, 0);

  char errorBuf[errorMsgSize];
  char itemName[MaxDmNameLen];
  char *namePtr;
  strcpy(itemName, TIBURON_DM_PREFIX);
  namePtr = itemName + strlen(itemName);

  strcpy(namePtr, VB_SYSTEM_FLOOD_DM);
  _dmFlood = new DmBooleanObject(itemName);
  if (_dmFlood->error())
  {
    _dmFlood->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  if (addDmObject(_dmFlood, DmConsumeFlag | DmProvideFlag) == -1)
    return;

  strcpy(namePtr, VB_SYSTEM_EMPTY_DM);
  _dmEmpty = new DmBooleanObject(itemName);
  if (_dmEmpty->error())
  {
    _dmEmpty->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  if (addDmObject(_dmEmpty, DmConsumeFlag | DmProvideFlag) == -1)
    return;
  
  if (setConsumePeriod(Aperiodic) == -1)
    return;
}


void VbMode::updateGui(DM_Item handle)
{
  Errno errno;
  char errorBuf[errorMsgSize];
  MBool flood, empty;
  
  _externalChange = True;
  
  if ((errno = _dmFlood->read(&flood, &_t)) != SUCCESS)
  {
    sprintDmError(errno, "VbMode::updateGui() - _dmFlood->read()", errorBuf);
    setError(errorBuf);
  }
  if (flood)
    _controls->setValue(0, True);
  
  if ((errno = _dmEmpty->read(&empty, &_t)) != SUCCESS)
  {
    sprintDmError(errno, "VbMode::updateGui() - _dmEmpty->read()", errorBuf);
    setError(errorBuf);
  }
  if (empty)
    _controls->setValue(1, True);

  _externalChange = False;

}


void VbMode::setBuoy(Widget w)
{
  MBool flood, empty;
  
  if (w == _floodButton)
  {
    flood = TRUE;
    empty = FALSE;
  }
  else if (w == _emptyButton)
  {
    flood = FALSE;
    empty = TRUE;
  }
  else if (w == _stopButton)
  {
    flood = empty = FALSE;
  }

  gettimeofday(&_t, &_tz);
  
  _dmFlood->write(flood, &_t);
  _dmEmpty->write(empty, &_t);
}



void VbMode::controlButtonCallback(Widget w, XtPointer clientData, 
				   XtPointer callData)
{
  XmToggleButtonCallbackStruct *cb = 
    (XmToggleButtonCallbackStruct *)callData;

  if (!cb->set)
    return;
  
  VbMode *obj = (VbMode *)clientData;

  if (obj->_externalChange)
    // User has set button
    obj->setBuoy(w);
}
