#ifndef _IVIEWTEST_H
#define _IVIEWTEST_H

#include <mbari/types.h>
#include "DmControlSource.h"
#include "SList.h"

class DeviceRequestQueues;

class ControlSource
{
  public:
  ControlSource(int i, DeviceRequestQueues *queues);
  ~ControlSource();
  
  void grab(IviewDevice device);
  void relinquish(IviewDevice device);
  int processRequest();
  int dispatchUpdate();

  MBool changed()
  {
    return _update;
  }

  void printRequest();
  
  protected:
  void reset();
  MBool _update;
  MBool _inUse;
  unsigned short _requestDevices;
  unsigned short _actualDevices;
  int _requestId;
  DmControlSource::AperiodicRequest _request;
  DmControlSource::Message _msg;
  DmControlSource *_dmControlSource;
  DeviceRequestQueues *_queues;
  int _index;
  double _requestTime;

  MBool _relinquishEnabled;
};


// Maintain list of ControlSources who want to control devices
class DeviceRequestQueues
{
  public:
  
  DeviceRequestQueues();
  ~DeviceRequestQueues();  

  void grab(ControlSource *control, IviewDevice device);
  void relinquish(ControlSource *control, IviewDevice device);

  SListIter<ControlSource *> portLightSources;
  SListIter<ControlSource *> portCameraSources;
  SListIter<ControlSource *> stbdLightSources;
  SListIter<ControlSource *> stbdCameraSources;
  
  protected:
  IviewDevice _device;
  SList<ControlSource *> _portLightSourceList;
  SList<ControlSource *> _portCameraSourceList;
  SList<ControlSource *> _stbdLightSourceList;
  SList<ControlSource *> _stbdCameraSourceList;
};



class IviewTest
{
  public:
  IviewTest();
  ~IviewTest();
  
  int processControlSources();
  
  protected:
  ControlSource *_source[MaxControlSources];
  DeviceRequestQueues *_queues;
};

#endif
