
static char TestSwitch_id[] = "$Header: TestSwitch.cc,v 1.2 97/05/07 18:08:22 oreilly Exp $";

/*
$Log:	TestSwitch.cc,v $
Revision 1.2  97/05/07  18:08:22  18:08:22  oreilly (Thomas C. O'Reilly)
Delete contained DmInputDetector in destructor.

Revision 1.1  96/10/28  09:12:41  09:12:41  oreilly (Thomas C. O'Reilly)
Initial revision

*/
#include <values.h>
#include <Xm/Form.h>
#include <Xm/PushB.h>
#include <Vk/VkApp.h>
#include "TestSwitch.h"
#include "powerDM.h"

#define dprintf if (debug) fprintf

TestSwitch::TestSwitch(const char *name, Widget parent, 
			 const char *switchName, int period) :
  DmGuiObject(name, parent)
{
  _baseWidget = XtVaCreateWidget(name, xmFormWidgetClass, parent, NULL);
  installDestroyHandler();

  _switchName = strdup(switchName);
  
  _button = new DynamicButton("button", _baseWidget, 100, 50);
  
  XtVaSetValues(_button->baseWidget(),
		XmNtopAttachment, XmATTACH_FORM,
		XmNbottomAttachment, XmATTACH_FORM,
		XmNleftAttachment, XmATTACH_FORM,
		NULL);

  _button->show();
  
  char itemName[MaxDmNameLen];
  char errorBuf[errorMsgSize];
  
  strcpy(itemName, POWER_DM_PREFIX);
  strcat(itemName, switchName);
  strcat(itemName, SWITCH_REQUEST);
  _dmRequest = new DmEnumObject(itemName);
  if (_dmRequest->error())
  {
    _dmRequest->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  if (addDmObject(_dmRequest, DmProvideFlag) == -1)
    return;

  strcpy(itemName, POWER_DM_PREFIX);
  strcat(itemName, switchName);
  strcat(itemName, SWITCH_STATUS);
  _dmStatus = new DmEnumObject(itemName);
  if (_dmStatus->error())
  {
    _dmStatus->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  _statusDetector = 
    new DmInputDetector("status", parent, _dmStatus, this);
  
  strcpy(itemName, POWER_DM_PREFIX);
  strcat(itemName, switchName);
  strcat(itemName, SWITCH_CURRENT);
  
  _dmCurrent = new DmInt16Object(itemName);
  if (_dmCurrent->error())
  {
    _dmCurrent->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  if (addDmObject(_dmCurrent, DmConsumeFlag) == -1)
    return;
  
  if (setConsumePeriod(period) == -1)
    return;

  _status = SWITCH_NO_POWER;
  _current = MAXSHORT;
  
  _switchName = strdup(switchName);

  updateGui();
  updateFromPeer(this, NULL);
}


TestSwitch::~TestSwitch()
{
  if (_statusDetector)
    delete _statusDetector;
}


void TestSwitch::updateFromPeer(DmGuiObject *peer, void *clientData)
{
  Boolean debug = True;
  dprintf(stderr, "TestSwitch::updateFromPeer()\n");

  DM_Time t;
  char errorBuf[errorMsgSize];
  
  // Read status
  if (_dmStatus->read(&_status, &t) != SUCCESS)
  {
    _dmStatus->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  
  if (_status == SWITCH_NO_POWER)
    XtSetSensitive(_button->baseWidget(), False);
  else
    XtSetSensitive(_button->baseWidget(), True);

}



void TestSwitch::updateGui(DM_Item handle)
{
  DM_Time t;
  char errorBuf[errorMsgSize];
  Int16 current;
  
  // Read current
  if (_dmCurrent->read(&current, &t) != SUCCESS)
  {
    _dmCurrent->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  if (current != _current)
  {
    char buf[100];
    sprintf(buf, "%s\n%4.1fA", _switchName, current / 1000.);
    _button->setText(buf);
    _current = current;
  }
}

