static char HydraulicSelect_id[] = "$Header: /usr/tiburon/unix/gui/tmacs/RCS/HydraulicSelect.cc,v 1.5 1998/03/12 16:11:24 oreilly Exp $";


/*
$Log: HydraulicSelect.cc,v $
Revision 1.5  1998/03/12 16:11:24  oreilly
*** empty log message ***

Revision 1.4  1997/08/12 14:45:26  oreilly
*** empty log message ***

Revision 1.3  97/04/30  19:42:27  19:42:27  oreilly (Thomas C. O'Reilly)
Now includes VbMotorSwitch

Revision 1.2  97/04/09  13:58:30  13:58:30  oreilly (Thomas C. O'Reilly)
Added statusCallback

Revision 1.1  97/03/20  12:29:38  12:29:38  oreilly (Thomas C. O'Reilly)
Initial revision

Revision 1.1  96/07/22  10:42:17  10:42:17  oreilly (Thomas C. O'Reilly)
First external release

*/
#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/PushB.h>
#include <Xm/Label.h>
#include <Vk/VkInfoDialog.h>
#include "TiburonApp.h"
#include "HydraulicSelect.h"
#include "VbMotorSwitch.h"
#include "tiburon.h"

#define VbModeMnem "vbMode"
#define SledModeMnem "sledMode"
#define AuxModeMnem "auxMode"

const char *const HydraulicSelect::statusChangeCallback = "statusCallback";


HydraulicSelect::HydraulicSelect(const char *name, Widget parent)
  : DmGuiObject(name, parent)
{
  _baseWidget = XtCreateWidget(name, xmFormWidgetClass, parent, NULL, 0);
  installDestroyHandler();

  
  _motor = 
    new HydraulicMotor("motor", _baseWidget);

  XtVaSetValues(_motor->baseWidget(), 
		XmNleftAttachment, XmATTACH_FORM,
		XmNtopAttachment, XmATTACH_FORM,
		NULL);
  
  _motor->show();
  
  Widget mgr = 
    XtVaCreateWidget("mgr", xmRowColumnWidgetClass, _baseWidget, 
		     XmNorientation, XmHORIZONTAL, 
		     XmNleftAttachment, XmATTACH_WIDGET,
		     XmNleftWidget, _motor->baseWidget(),
		     XmNleftOffset, 10,
		     XmNtopAttachment, XmATTACH_FORM,
		     NULL);

  _modeSelect = new VkOptionMenu(mgr, "mode");

  _modeSelect->addAction(VbModeMnem, &HydraulicSelect::modeSelectCallback, 
			 this);

  _modeSelect->addAction(SledModeMnem, &HydraulicSelect::modeSelectCallback, 
			 this);

  _modeSelect->addAction(AuxModeMnem, &HydraulicSelect::modeSelectCallback, 
			 this);  

  _modeSelect->show();
  
  XtManageChild(mgr);

  char itemName[MaxDmNameLen];
  char *namePtr;
  char errorBuf[errorMsgSize];
  
  strcpy(itemName, TIBURON_DM_PREFIX);
  namePtr = itemName + strlen(itemName);
  
  strcpy(namePtr, VB_SYSTEM_PUMP_MODE_SELECT_DM);
  _dmModeSelect = new DmEnumObject(itemName);
  if (_dmModeSelect->error())
  {
    _dmModeSelect->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  if (addDmObject(_dmModeSelect, DmProvideFlag) == -1)
    return;
  
  strcpy(namePtr, VB_SYSTEM_PUMP_MODE_STATUS_DM);
  _dmModeStatus = new DmEnumObject(itemName);
  if (_dmModeStatus->error())
  {
    _dmModeStatus->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }  
  if (addDmObject(_dmModeStatus, DmConsumeFlag) == -1)
    return;
  
  if (setConsumePeriod(Aperiodic) == -1)
    return;
  
  updateGui();
}


void HydraulicSelect::updateGui(DM_Item handle)
{
  DM_Time t;
  Int32 choice;
  Errno errno;
  if ((errno = _dmModeStatus->read(&choice, &t)) != SUCCESS)
  {
    char errorBuf[errorMsgSize];
    _dmModeStatus->errorMsg(errorBuf);
    setError(errorBuf);
  }

  _mode = (vbPumpMode )choice;
  
  switch (_mode)
  {
    case VB_MODE:
    break;
    
    case ARM_HYDRAULICS:
    break;
    
    case TOOLSLED_HYDRAULICS:
    break;
  }

  callCallbacks(statusChangeCallback, (void *)_mode);
}


vbPumpMode HydraulicSelect::mode()
{
  return _mode;
}


void HydraulicSelect::select(vbPumpMode choice)
{
  char *ptr;
  
  DM_Time t;
  gettimeofday(&t, NULL);
  Errno errno;
  
  if ((errno = _dmModeSelect->write(choice, &t)) != SUCCESS)
  {
    char errorBuf[errorMsgSize];
    _dmModeSelect->errorMsg(errorBuf);
    setError(errorBuf);
    theInfoDialog->postAndWait(errorBuf);
  }
}


void HydraulicSelect::modeSelectCallback(Widget w, XtPointer clientData,
					 XtPointer callData)
{
  char *wName = XtName(w);
  vbPumpMode mode;
  
  if (!strcmp(wName, VbModeMnem))
    mode = VB_MODE;
  else if (!strcmp(wName, SledModeMnem))
    mode = ARM_HYDRAULICS;
  else if (!strcmp(wName, AuxModeMnem))
    mode = TOOLSLED_HYDRAULICS;
  else
  {
    fprintf(stderr, "HydraulicSelect::modeSelectCallback() wName=%s?\n",
	    wName);
    return;
  }
  
  HydraulicSelect *obj = (HydraulicSelect *)clientData;
  obj->select(mode);
}



