#ifndef _BENTHICBIOAPP_H
#define _BENTHICBIOAPP_H
#include "benthicBioNames.h"
#include "BenthicBioDm.h"
#include "IbcApp.h"
#include "Sio32Interface.h"
#include "powerDM.h"
#include "powerAlloc.h"
#include "DmError.h"

#define Boolean MBool

extern "C" 
{
#ifdef UNIX
#else
#include "tiburon.h"
#include "rovPriority.h"
#include "logLib.h"
#include "applic.h"
#include "microcmd.h"
#include "timer.h"
#include "ibc_card.h"	 	    /* IBC Card Types                       */
#include "ibc_cmd.h"		    /* IBC Serial Commands                  */
#include "gf_board.h"	    	    /* GF/5V Controller Board Definitions   */
#include "low_pwr.h"		    /* Low Power Switch Board Definitions   */
#include "vicor.h"		    /* Dual Vicor Board Definitions         */
#include "bbsled.h"      	    /* Toolsled Dcon Micro definitions      */
#include "ibc.h"
#include "lps.h"
#include "gf_5v.h"
#include "hps.h"
#include "vicorBoard.h"
#include "quadSerCmd.h"
#include "iso_io.h"
#endif
};


#define GF5V_BOARD_ADDR	    	    (Word) GROUND_FAULT_0_ADDR
#define SERIAL_BOARD_ADDR           (Word) QUAD_SERIAL_0_ADDR
#define ATOD_BOARD_ADDR	            (Word) QUAD_A_TO_D_0_ADDR
#define ISOLATED_IO_BOARD_ADDR      (Word) ISO_IO_0_ADDR

#define LPS_BOARDS	    3	    /* Number of LPS Board in Toolsled Dcon  */
#define HPS_BOARDS          2
#define ISO_IO_SWITCHES     8       /* Number of Isolated Io Switches       */

MLocal Word lpsBoardAddr[LPS_BOARDS] =  /* LPS Board Assignments            */
{
    LOW_PWR_SWITCH_12V_0_ADDR,
    LOW_PWR_SWITCH_24V_0_ADDR,
    LOW_PWR_SWITCH_24V_1_ADDR
};

MLocal Word hpsBoardAddr[HPS_BOARDS] =  /* HPS Board Assignments            */
{
    HIGH_PWR_SWITCH_0_ADDR,    
    HIGH_PWR_SWITCH_1_ADDR
};

#define PumpSpeedChannel                 0 /* Motor Speed Analog Output     */
#define SpareAnalogOutputChannel         1 /* Spare Analog Output Channel   */

#define SSIndexSenseBit               0x01 /* SS Index Sense Input Chan     */
#define CompLevelSenseBit             0x02 /* CompLevelSense Input Chan     */
#define SwingArmSenseBit              0x04 /* Swing Arm Sense Input Chan    */
#define SpareDigitalInputBit          0x08 /* Spare Digital Input Chan      */

#define SSPumpStopValue                127

#if 0   // Old task params
#define MainTaskStacksize      4000
#define MonitorTaskStacksize   4000
#define MonitorTaskPriority    66
#define SamplerTaskStacksize   3000
#define SamplerTaskPriority    65 
#endif

// New task params
// #define MainTaskStacksize      6000
#define MainTaskStacksize      10000
// #define MonitorTaskStacksize   6000
#define MonitorTaskStacksize   10000
#define MonitorTaskPriority    66
// #define SamplerTaskStacksize   4000
#define SamplerTaskStacksize   10000
#define SamplerTaskPriority    65 

// Quad Serial Channels
#define VspChannel0 0
#define VALVE_PACK_CHAN 3
#define VspChannel1 2

class ECUBoard;

/*
CLASS 
BenthicBioApp

DESCRIPTION
BenthicBioApp has the following responsibilities:

Create and initialize application specific data
Spawn subsidiary Benthic Biology Application tasks
Process Application specific SRQs

AUTHOR
Douglas Au
*/

class BenthicBioApp : public IbcApp
{
  public:
  
  ///////////////////////////////////////////////////////////////////
  // Constructor
  // [input] systemName:   (e.g. "TIBURON")
  // [input] device: Pointer to Sio32Interface  
  BenthicBioApp(const char *systemName, 
	      Sio32Interface *device);
  
  ~BenthicBioApp();
  ///////////////////////////////////////////////////////////////////  
  // Data 
  // Pointer to dm Item list
  BenthicBioDm    *dmItems; 
  
  ///////////////////////////////////////////////////////////////////
  // Pointer to High power Switch card Object
  // With application specific Functionality
  HpsCard       *ssPump;
  
  ///////////////////////////////////////////////////////////////////
  // Pointers to Low Power Switch card Channels
  // with Application specific Funtionality
  // Index Forward and Index Reverse are interlocked
  // Valve Pack must be powered on and Initialized
  SwitchChannel *indexFwd, *indexRev, *valvePack;

  ECUBoard *ecuBoard;

  protected:
  
  ///////////////////////////////////////////////////////////////////
  // Fill in TasksParams structure for DmMonitor and MicroSampler tasks
  virtual void setTaskParams();

  ///////////////////////////////////////////////////////////////////
  // Create MicroSampler subclass object
  virtual MicroSampler *createMicroSampler();

  ///////////////////////////////////////////////////////////////////
  // Create DmMonitor subclass object
  virtual DmMonitor *createDmMonitor();

  ///////////////////////////////////////////////////////////////////
  // Convert raw swing-arm A-to-D reading to degrees
  static Flt32 swingArmDegrees(Word rawBits);
  
};


#endif







