#include <stdio.h>
#include <stdlib.h>
#include <Xm/Label.h>
#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/ScrollBar.h>
#include <Xm/PushB.h>
#include <Vk/VkApp.h>
#include <Vk/VkSimpleWindow.h>
#include <Vk/VkOptionMenu.h>
#include "TiburonApp.h"
#include "geoNames.h"
#include "PowerSwitchGui.h"
#include "powerDM.h"

#define dprintf if (debug) fprintf

class NmrWindow: public VkSimpleWindow 
{
  public:

  NmrWindow ( const char *name );
  
  ~NmrWindow ();
  
  virtual const char* className()
  {
    return "NmrWindow";
  }

};


class Nmr : public VkComponent {

public:

  Nmr(const char *name, Widget parent, const char *platformName);
  ~Nmr();

protected:

  PowerSwitchGui *_cartridge;
  PowerSwitchGui *_sonde;
  char *_cartridgeLabel;
  char *_sondeLabel;

  void powerInterlock(VkCallbackObject *obj,
		      void *clientData,
		      void *callData);
private:

  static XtResource _resources[];
};


NmrWindow::NmrWindow(const char *name) :
  VkSimpleWindow(name)
{
  TiburonApp *app = (TiburonApp *)theApplication;

  Nmr *nmr = new Nmr("nmr", mainWindowWidget(), app->platformName());
  nmr->show();
  addView(nmr->baseWidget());
}


NmrWindow::~NmrWindow ()
{
  // Empty
}


XtResource Nmr::_resources[] = 
{
  {
    "cartridgeLabel",
    "CartridgeLabel",
    XmRString,
    sizeof(char *),
    XtOffset(Nmr *, _cartridgeLabel),
    XmRImmediate, 
    "Cartridge"
  },
  {
    "sondeLabel",
    "SondeLabel",
    XmRString,
    sizeof(char *),
    XtOffset(Nmr *, _sondeLabel),
    XmRImmediate,
    "Sonde"
  }
};


Nmr::Nmr(const char *name, Widget parent, const char *platformName)
{
  _baseWidget = XtVaCreateWidget(name, xmRowColumnWidgetClass, parent, 
				 XmNorientation, XmVERTICAL, NULL);
  
  installDestroyHandler();

  getResources(_resources, XtNumber(_resources));

  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, SciencePort12v0Name);
  
  _cartridge = 
    new PowerSwitchGui("cartridge", mgr2, itemName,
		       _cartridgeLabel, 100, 50, 500, True);

  _cartridge->addCallback(PowerSwitchGui::statusChangeCallback, this,
			  (VkCallbackMethod )&Nmr::powerInterlock);

  _cartridge->show();

  sprintf(namePtr, "%s.%s", GeoAppName, SciencePort12v1Name);
  
  _sonde = 
    new PowerSwitchGui("sonde", mgr2, itemName,
		       _sondeLabel, 100, 50, 500, True);

  _sonde->addCallback(PowerSwitchGui::statusChangeCallback, this,
		      (VkCallbackMethod )&Nmr::powerInterlock);

  _sonde->show();

  XtManageChild(mgr2);

  powerInterlock(this, 0, 0);
}


Nmr::~Nmr()
{
}


void Nmr::powerInterlock(VkCallbackObject *obj,
			 void *clientData,
			 void *callData)
{
  // Can't turn sonde ON until cartridge is on
  if (_cartridge->status() == SWITCH_ON) {
    _sonde->setSensitive(True);
  }
  else {
    _sonde->setSensitive(False);
  }

  if (_sonde->status() == SWITCH_ON) {

    // Need to be able to turn sonde off
    _sonde->setSensitive(True); 

    // Can't turn cartridge OFF while sonde is on
    _cartridge->setSensitive(False); 
  }
  else {
    _cartridge->setSensitive(True); 
  }
}



void main ( int argc, char **argv )
{
  TiburonApp *app = new TiburonApp("nmrGui", &argc, argv);
	  
  NmrWindow *window = new NmrWindow("NMR");
	  
  window->show();
	  
  app->startTelemetryHandlers();
  
  app->run();
	  
}






