#include "JoystickRangeIndicator.h"
#include <X11/Xc/Xc.h>
#include <X11/Xc/BarGraf.h>
#include "controlDM.h"
#include "DmErrno.h"

JoystickRangeIndicator::JoystickRangeIndicator(const char *name, 
					       Widget parent)
  : DmNat16BarGraph(name, parent, JOYSTICK_GAIN_DM, Aperiodic, NULL, 0, 100)
{
  char errorBuf[errorMsgSize];
  
  _dmSelectableRange = new DmBooleanObject(JOYSTICK_GAIN_SWITCH_DM);
  if (_dmSelectableRange->error())
  {
    _dmSelectableRange->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  if (addDmObject(_dmSelectableRange, DmConsumeFlag) == -1)
    return;

  if (setConsumePeriod(Aperiodic) == -1)
    return;
  
  updateGui();
}


JoystickRangeIndicator::~JoystickRangeIndicator()
{
}


void JoystickRangeIndicator::updateGui(DM_Item handle)
{
  
  MBool selectableRange;
  DM_Time t;
  
  if ((errno = _dmSelectableRange->read(&selectableRange, &t)) != SUCCESS)
  {
    char errorBuf[errorMsgSize];
    
    sprintDmError(errno, 
		  "JoystickSetup::updateGui(), reading selectable range", 
		  errorBuf);
    
    setError(errorBuf);
    return;
  }

  if (selectableRange)
  {
    // Reset _prevValue to ensure widget update
    _prevValue = MAXFLOAT;
    DmNat16BarGraph::updateGui(handle);
  }
  else
  {
    XcVType xcValue;
    xcValue.fval = 100.;
    XcBGUpdateValue(_barGraph, &xcValue);
  }
}
