#include <Xm/Frame.h>
#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/PushB.h>
#include <Xm/ToggleB.h>
#include <Xm/Label.h>
#include <Xm/ArrowB.h>
#include <Xm/Scale.h>
#include <Xm/Scale.h>
#include <xpm.h>
#include <Vk/VkErrorDialog.h>
#include "GeologyGui.h"
#include "toolsledNames.h"
#include "geoNames.h"
#include "powerDM.h"
#include "DmErrno.h"
#include "TiburonApp.h"
 
#define dprintf if (debug) fprintf


XtResource GeologyPower::_resources[] = 
{
  {
    "science12v0Label",
    "Science12v0Label",
    XmRString,
    sizeof(char *),
    XtOffset(GeologyPower *, _science12v0Label),
    XmRImmediate, 
    "12V Port 0"
  },
  {
    "science12v1Label",
    "Science12v1Label",
    XmRString,
    sizeof(char *),
    XtOffset(GeologyPower *, _science12v1Label),
    XmRImmediate,
    "12V Port 1"
  },

  {
    "camera12vLabel",
    "Camera12vLabel",
    XmRString,
    sizeof(char *),
    XtOffset(GeologyPower *, _camera12vLabel),
    XmRImmediate,
    "Camera 12V"
  },

  {
    "science24v0Label",
    "Science24v0Label",
    XmRString,
    sizeof(char *),
    XtOffset(GeologyPower *, _science24v0Label),
    XmRImmediate,
    "24V Port 0"
  },

  {
    "science24v1Label",
    "Science24v1Label",
    XmRString,
    sizeof(char *),
    XtOffset(GeologyPower *, _science24v1Label),
    XmRImmediate,
    "24V Port 1"
  },

};


GeologyPower::GeologyPower(const char *name, Widget parent,
			   GeologyGui *geologyGui, const char *platformName)
{
  _baseWidget = XtVaCreateWidget(name, xmRowColumnWidgetClass, parent,
				XmNorientation, XmVERTICAL, NULL);
  
  installDestroyHandler();

  getResources(_resources, XtNumber(_resources));

  _geologyGui = geologyGui;
  
  Widget label = 
    XtVaCreateManagedWidget("powerLabel", xmLabelWidgetClass, _baseWidget, 
			    NULL);
  
  Widget mgr2 = 
    XtVaCreateWidget("mgr2", xmRowColumnWidgetClass, _baseWidget,
		     XmNorientation, XmHORIZONTAL, NULL);
  
  char itemName[MaxDmNameLen];
  DmObject::buildPrefix(itemName, platformName, PowerName, 0);

  char *namePtr = itemName + strlen(itemName);
  
  sprintf(namePtr, "%s.%s", GeoAppName, TungstenLampName);
  
  _incandLight = new PowerSwitchGui("incandLight", mgr2,
				    itemName,
				    "Incand Light", 100, 50, 500, True);
  
  _incandLight->show();

  sprintf(namePtr, "%s.%s", GeoAppName, ValvePackName);
  
  _valvePack = new PowerSwitchGui("valvePack", mgr2,
				  itemName,
				  "ECU Board", 100, 50, 500, True);
  
  _valvePack->show();

  
  sprintf(namePtr, "%s.%s", GeoAppName, Camera1Name);
  
  _camera1 =
    new PowerSwitchGui("camera1", mgr2, itemName,
		       "Camera 1", 100, 50, 500, True);

  _camera1->show();


  sprintf(namePtr, "%s.%s", GeoAppName, Camera2Name);
  
  _camera2 =
    new PowerSwitchGui("camera2", mgr2, itemName,
		       "Camera 2", 100, 50, 500, True);

  _camera2->show();


  sprintf(namePtr, "%s.%s", GeoAppName, ManipulatorName);
  
  _manipulator = 
    new PowerSwitchGui("manipulator", mgr2, itemName,
		       "Manip", 100, 50, 500, True);

  _manipulator->show();

  XtManageChild(mgr2);

  mgr2 = 
    XtVaCreateWidget("mgr2", xmRowColumnWidgetClass, _baseWidget,
		     XmNorientation, XmHORIZONTAL, NULL);

  sprintf(namePtr, "%s.%s", GeoAppName, SciencePort12v0Name);
  
  _science12v0 = 
    new PowerSwitchGui("science12v0", mgr2, itemName,
		       _science12v0Label, 100, 50, 500, True);

  _science12v0->show();

  sprintf(namePtr, "%s.%s", GeoAppName, SciencePort12v1Name);
  
  _science12v1 = 
    new PowerSwitchGui("science12v1", mgr2, itemName,
		       _science12v1Label, 100, 50, 500, True);

  _science12v1->show();


  sprintf(namePtr, "%s.%s", GeoAppName, Camera12vName);
  
  _camera12v = 
    new PowerSwitchGui("camera12v", mgr2, itemName,
		       _camera12vLabel, 100, 50, 500, True);

  _camera12v->show();


  sprintf(namePtr, "%s.%s", GeoAppName, SciencePort24v0Name);
  
  _science24v0 = 
    new PowerSwitchGui("science24v0", mgr2, itemName,
		       _science24v0Label, 100, 50, 500, True);

  _science24v0->show();


  sprintf(namePtr, "%s.%s", GeoAppName, SciencePort24v1Name);
  
  _science24v1 = 
    new PowerSwitchGui("science24v1", mgr2, itemName,
		       _science24v1Label, 100, 50, 500, True);

  _science24v1->show();

  XtManageChild(mgr2);

}


GeologyPower::~GeologyPower()
{
  delete _incandLight;
  delete _manipulator;
  delete _valvePack;
  delete _camera1;
  delete _camera2;
  delete _camera12v;
  delete _science12v0;
  delete _science12v1;
  delete _science24v0;
  delete _science24v1;
}


void GeologyPower::statusCallback(VkCallbackObject *obj,
				  void *clientData,
				  void *callData)
{
  Boolean debug = ((TiburonApp *)theApplication)->debug();
  
  dprintf(stderr, "GeologyPower::statusCallback()\n");

  switchStatus status = (switchStatus )callData;

  if (obj == _valvePack)
  {
    dprintf(stderr, "GeologyPower::statusCallback() - valvePack status\n");

    switch (status)
    {
      case SWITCH_ON:
      case SWITCH_ON_CASCADE:
      XtSetSensitive(_geologyGui->valveFunctions->baseWidget(), True);
      break;
      
      default:
      XtSetSensitive(_geologyGui->valveFunctions->baseWidget(), False);
    }
  }
}



GeologyGui::GeologyGui(const char *name, Widget parent,
		       const char *platformName)
{
  _baseWidget = XtVaCreateWidget(name, xmRowColumnWidgetClass, parent, 
				 XmNorientation, XmVERTICAL, NULL);
  
  installDestroyHandler();

  Widget label, title;

  title = 
    XtVaCreateManagedWidget("geologyLabel", xmLabelWidgetClass, _baseWidget,
			    NULL);

  _dmItems = new GeoDm(platformName);

  hydraulicSelect = new HydraulicSelect("hydraulicSelect", _baseWidget);
  
  hydraulicSelect->show();
  
  Widget powerFrame, valveFrame;
  Widget mgr, mgr2;

  powerFrame =
    XtVaCreateManagedWidget("powerFrame", xmFrameWidgetClass, _baseWidget, 
			    NULL);

  power = new GeologyPower("power", powerFrame, this, platformName);
  power->show();
  
  valveFrame =
    XtVaCreateManagedWidget("valveFrame", xmFrameWidgetClass, _baseWidget, 
			    NULL);
  
  Widget valveMgr = XtVaCreateWidget("mgr", xmRowColumnWidgetClass, valveFrame,
				     XmNorientation, XmHORIZONTAL, 0);

  mgr = XtVaCreateWidget("mgr", xmRowColumnWidgetClass, valveMgr,
			 XmNorientation, XmVERTICAL,
			 NULL);

  char dmPrefix[MaxDmNameLen];
  DmObject::buildPrefix(dmPrefix, platformName, GeoAppName, 0);

  valveFunctions = new ValveFunctions("valveFunctions", mgr, 7, 1, 
				      dmPrefix, True);

  valveFunctions->show();

  // Build array of ValveControls to use in ValveSwitchMap
  int nValves = valveFunctions->nValves();
  
  if ((_valveControl = 
       (ValveControl **)malloc(nValves * sizeof(ValveControl *))) == NULL)
  {
    fprintf(stderr, 
	    "GeologyGui::GeologyGui() - malloc of _valveControl failed\n");
    exit(1);
  }
  
  for (int i = 0 ; i < nValves; i++)
    _valveControl[i] = valveFunctions->valves->valve[i];
  
  char dmName[MaxDmNameLen];
  DmObject::buildName(dmName, dmPrefix, MappedValveName, 0);
  
  _switchMap = new ValveSwitchMap("switchMap", mgr, 2,
				  dmName,
				  nValves,
				  _valveControl);
  
  _switchMap->show();

  XtManageChild(mgr);

  hpValveFunctions = new ValveFunctions("hpValveFunctions", valveMgr, 2, 9, 
				      dmPrefix, False);

  hpValveFunctions->show();

  XtManageChild(valveMgr);

  mgr = XtVaCreateWidget("mgr", xmRowColumnWidgetClass, baseWidget(),
			 XmNorientation, XmHORIZONTAL, 0);

  _digitalOutput0 = new DmBooleanSwitch("digitalOutput0", mgr, 
					_dmItems->spareDigitalOutput0);
  _digitalOutput0->show();


  _digitalOutput1 = new DmBooleanSwitch("digitalOutput1", mgr, 
					_dmItems->spareDigitalOutput1);
  _digitalOutput1->show();

  XtManageChild(mgr);

  mgr = XtVaCreateWidget("mgr", xmFormWidgetClass, baseWidget(),
			 XmNorientation, XmHORIZONTAL, 0);

  _digitalInput0 = new DmBooleanIndicator("digitalInput0", mgr,
					 _dmItems->spareDigitalInput0);

  XtVaSetValues(_digitalInput0->baseWidget(),
		XmNleftAttachment, XmATTACH_FORM,
		XmNtopAttachment, XmATTACH_FORM,
		NULL);

  _digitalInput0->show();

  label = 
    XtVaCreateManagedWidget("digitalInputLabel", xmLabelWidgetClass, mgr,
			    XmNleftAttachment, XmATTACH_WIDGET,
			    XmNleftWidget, _digitalInput0->baseWidget(),
			    XmNtopAttachment, XmATTACH_FORM,
			    NULL);

  XtManageChild(mgr);

  mgr = XtVaCreateWidget("mgr", xmRowColumnWidgetClass, baseWidget(),
			 XmNorientation, XmHORIZONTAL, 0);

  mgr2 = 
    XtVaCreateWidget("mgr2", xmRowColumnWidgetClass, mgr,
		     XmNorientation, XmVERTICAL, 0);

  _analogOutput0 = 
    new DmInt16Slider("analogOutput0", mgr2, _dmItems->spareAnalogOutput0,
		      AperiodicGuaranteed);

  _analogOutput0->show();

  XtVaCreateManagedWidget("analogOutput0Label", xmLabelWidgetClass, mgr2, 0);

  XtManageChild(mgr2);


  mgr2 = 
    XtVaCreateWidget("mgr2", xmRowColumnWidgetClass, mgr,
		     XmNorientation, XmVERTICAL, 0);

  _analogOutput1 = 
    new DmInt16Slider("analogOutput1", mgr2, _dmItems->spareAnalogOutput1,
		      AperiodicGuaranteed);

  _analogOutput1->show();

  XtVaCreateManagedWidget("analogOutput1Label", xmLabelWidgetClass, mgr2, 0);

  XtManageChild(mgr2);

  XtManageChild(mgr);

}


GeologyGui::~GeologyGui()
{
  delete hydraulicSelect;
  delete power;
  delete valveFunctions;
  delete _switchMap;
  delete _analogOutput0;
  delete _analogOutput1;
  delete _digitalOutput0;
  delete _digitalOutput1;
  delete _digitalInput0;
  free((void *)_valveControl);
}




