/*****************************************************************************
Copyright 1998 MBARI                                                      
******************************************************************************
Summary  : Integrated viewing routines
Filename : Iview.h
Author   : Michael B. Matthews                                                
Project  : New ROV                                                        
Version  : 4.0                                                         
Created  : 8.5.98    
Modified :                                                 
Notes    : 
****************************************************************************/

#ifndef iview_h
#define iview_h

#include <stdioLib.h>        
#include <mbariTypes.h>
#include "Device.h"


#define IVIEW_DIRECTORY 	"/usr/tiburon/config/iview/"
// #define IVIEW_DIRECTORY 	"/usr/tiburon/vw/iview/V4.0/"
#define IVIEW_CONFIG_FILE	IVIEW_DIRECTORY "iview.cfg"
#define IVIEW_LOG_DIRECTORY 	"/usr/tiburon/vw/iview/log/"
#define IVIEW_DM_PREFIX	       	"TIBURON.IVIEW."

#define IVIEW_DM_PERIOD		50000 	// viewing data update period 10Hz  
#define DT 			0.05	// 20Hz control sampling period	    
#define IO_BUFFER_SIZE		20 * 10 // size of logging buffer



/******************************************************************************
Class   : I V I E W   C L A S S                                              
Purpose : Wrapper class around iView initialization and polling loop 
Notes   : 
******************************************************************************/

class IView 
{
 public:
  MBool loop;
  MBool print;
  MBool logging;
  MBool panoramicMode;

  Flt32 A[2][2];		// joystick dynamics model parameters
  Flt32 B[2];

  SEM_ID wakeupSem;
  DmGroup* dmGroup;

  Controller* portCtlr;
  Controller* stbdCtlr;
  ControlSourceInterface* controlSource[MAX_NUMBER_CONTROL_SOURCES];

  IView();
  ~IView();

  Void Log()     { portCtlr->Log(); stbdCtlr->Log(); }
  Void Exit()    { loop = FALSE; }
  Void Standby() { portCtlr->Standby(); stbdCtlr->Standby(); } 
  Void Enable()  { portCtlr->enableControl(); stbdCtlr->enableControl(); }
  Void Disable() { portCtlr->disableControl(); stbdCtlr->disableControl(); }
  Void Start()   { portCtlr->Start(); stbdCtlr->Start(); }
  Void Resume()  { portCtlr->Resume(); stbdCtlr->Resume(); }

  MBool aperiodicRequestCheck(); 
  MBool CtlrStatus() { return portCtlr->Status() | stbdCtlr->Status(); }
  Flt32 getParameter(FILE* fp, char* s);
  STATUS Run();
  STATUS Panoramic(Flt32, Flt32);
  STATUS ConfigFile(DeviceConfig*, DeviceConfig*, 
		    DeviceConfig*, DeviceConfig*, 
		    char* file);
};


Void logCtlrs();
Void exitIView();
Void resumeCtlrs();
Void enableCtlrs();
Void standbyCtlrs();
Void disableCtlrs();
Void enablePrint();
Void disablePrint();

#endif
