#ifndef _MIDWATERAPP_H
#define _MIDWATERAPP_H
#include <vxWorks.h>
#include "MidwaterDm.h"
#include "MicroApp.h"
#include "Sio32Interface.h"
#include "mwsledDcon.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 "microDm.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 "mwsled.h"                 /* Toolsled Dcon Micro definitions      */
#include "ibc.h"
#include "ibcDm.h"
#include "lps.h"
#include "lpsDm.h"
#include "gf_5v.h"
#include "gf_5vDm.h"
#include "hps.h"
#include "hpsDm.h"
#include "vicorBoard.h"
#include "vicorDm.h"
#include "quadSerCmd.h"
#include "quadSerDm.h"
#include "vspDm.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 VICOR_BOARD_ADDR            (Word) DUAL_VICOR_0_ADDR
#define ATOD_BOARD_ADDR             (Word) QUAD_A_TO_D_0_ADDR
#define ISOLATED_IO_BOARD_0_ADDR    (Word) ISO_IO_0_ADDR
#define ISOLATED_IO_BOARD_1_ADDR    (Word) ISO_IO_1_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_XXV_0_ADDR
};

MLocal Word hpsBoardAddr[HPS_BOARDS] =  /* HPS Board Assignments            */
{
    HIGH_PWR_SWITCH_0_ADDR,
    HIGH_PWR_SWITCH_1_ADDR
};

MLocal ibcCardConfig ibcCardSet =
{
    12,                              /* Number of IBC Cards Expected          */
    {
         CPU196,
         GF5V_BOARD_ADDR,
         LOW_PWR_SWITCH_12V_0_ADDR,
         LOW_PWR_SWITCH_24V_0_ADDR,
         LOW_PWR_SWITCH_XXV_0_ADDR,
         ISOLATED_IO_BOARD_0_ADDR,
         ISOLATED_IO_BOARD_1_ADDR,
         HIGH_PWR_SWITCH_0_ADDR,
         HIGH_PWR_SWITCH_1_ADDR,
         ATOD_BOARD_ADDR,
         VICOR_BOARD_ADDR,
         SERIAL_BOARD_ADDR
    }
};

#if 0
#define VSP_CHAN                         1
#endif

                                    /* LPS Channel Assignments              */
#define SS_INDEX_EXCITE_CHAN            0
#define SA_POT_EXCITE_CHAN              1
#define ACM_SWITCH_CHAN                 2
#define SPARE_12V_LPS_SWITCH_CHAN       3

#define SS_INDEX_FWD_SWITCH_CHAN        0
#define SS_INDEX_REV_SWITCH_CHAN        1
#define CAMERA_SWITCH_CHAN              2
#define SPARE_24V_LPS_SWITCH_CHAN       3

#define PORT_SA_DEPLOY_CHAN     0
#define PORT_SA_STOW_CHAN       1
#define STBD_SA_DEPLOY_CHAN     2
#define STBD_SA_STOW_CHAN       3



                                    /* Isolated IO Board  Assignments       */
#define SWITCH_0_CHAN                    0 /* Switch 0 On/Off channel       */
#define SWITCH_1_CHAN                    1 /* Switch 1 On/Off channel       */
#define SWITCH_2_CHAN                    2 /* Switch 2 On/Off channel       */
#define SWITCH_3_CHAN                    3 /* Switch 3 On/Off channel       */
#define SWITCH_4_CHAN                    4 /* Switch 4 On/Off channel       */
#define SWITCH_5_CHAN                    5 /* Switch 5 On/Off channel       */
#define SWITCH_6_CHAN                    6 /* Switch 6 On/Off channel       */
#define SWITCH_7_CHAN                    7 /* Switch 7 On/Off channel       */

#define MOTOR_SPEED_CHAN                 0 /* Motor Speed Analog Output     */
#define SS_INDEX_SENSE_BIT               1 /* SS Index Sense Input Chan     */

#define SA_LPS_CURRENT_WARN_THRESH      4000
#define SA_LPS_CURRENT_ALARM_THRESH    10000

#define SS_PUMP_STOP_VALUE              127


#define MID_WATER_SAMPLER_STACKSIZE  4000 // mwsled Dcon Input Task size & TCB
#define MID_WATER_MONITOR_STACKSIZE  4000 // mwsled Dcon Output Task size & TCB
#define MID_WATER_APP_STACKSIZE      4000

/*
CLASS
MwsledDconDmItems

DESCRIPTION
Contains all Dm Item lists For Ibc Cards in this Dcon
as well as water alarm and Ibc power Switch items.

AUTHOR
Douglas Au
*/
class MwsledDconDmItems : public MidwaterDm
{
  public:
  ////////////////////////////////////////////////////////////////////
  // Constructor
  // [input] name:  Name of application (e.g. "midwatersled")
  // [input] dmPrefix:  Application DM Prefix (e.g. "MWSLED")
  // [input] device: Pointer to Sio32Interface
  MwsledDconDmItems(const char *name, const char *dmPrefix,
                    Sio32Interface *device);

  ~MwsledDconDmItems();

  ///////////////////////////////////////////////////////////////////
  // Pointer to the Dcon's Power switch
  DmEnumObject *powerSwitch;
  ///////////////////////////////////////////////////////////////////
  // IBC CPU Data Manager Items
  ibcCpuDmItems   ibcDm;
  ///////////////////////////////////////////////////////////////////
  // GF/5V Board Data Manager Items
  ibcGf5vDmItems  gf5vDm;
  ///////////////////////////////////////////////////////////////////
  // Dual Vicor Board Data Manager Items
  ibcVicorDmItems vicorDm;
  ///////////////////////////////////////////////////////////////////
  // LPS Board Data Manager Items
  ibcLpsDmItems  lpsDm[LPS_BOARDS];
  ///////////////////////////////////////////////////////////////////
  // HPS Board Data Manager Items
  ibcHpsDmItems  hpsDm[HPS_BOARDS];
  ///////////////////////////////////////////////////////////////////
  // Quad Serial Board Data Manager Items
  ibcQuadSerDmItems quadSerDm;
  ///////////////////////////////////////////////////////////////////
  // VSP Data Manager Items
  ibcVspDmItems   vspDm;
  ///////////////////////////////////////////////////////////////////
  // Update Water Alarm Dm Items
  // [input] sio32DataChan: Pointer to sio32Chan structure
  // [input] canWaterAlarmDm: Can WaterAlarm DM Item
  // [input] jboxWaterAlarmDm: JBox WaterAlarm DM Item
  STATUS updateWaterAlarmDm( sio32Chan *sio32DataChan,
            DM_Item canWaterAlarmDm, DM_Item jboxWaterAlarmDm );

};

/*
CLASS
MidWaterApp

DESCRIPTION
MidWaterApp has the following responsibilities:

Create and initialize application specific data.
Spawn subsidiary Midwater Application tasks.
Process Application specific SRQs.

AUTHOR
Douglas Au
*/
class MidWaterApp : public MicroApp
{
  public:
  ///////////////////////////////////////////////////////////////////
  // Constructor
  // [input] name:  Name of application (e.g. "MWSLED")
  // [input] device: Pointer to Sio32Interface
  MidWaterApp(const char *name,
          Sio32Interface *device);

  ~MidWaterApp();

  ///////////////////////////////////////////////////////////////////
  // Data
  // Pointer to dm Item list
  MwsledDconDmItems *dmItems;

  ///////////////////////////////////////////////////////////////////
  // Pointer to Sio32Interface
  Sio32Interface *sio32Interface;

  ///////////////////////////////////////////////////////////////////
  // Initialize Water Alarm Threshold Dm Item
  // [input] sio32DataChan: Pointer to sio32Chan structure
  // [input] waterAlarmThreshDm: Water Alarm Threshold DM Item
  STATUS initWaterAlarmThreshDm( sio32Chan *IBC_SerialChan,
                                 DM_Item waterAlarmThreshDm );
  ///////////////////////////////////////////////////////////////////
  // Write Water Alarm Threshold Dm Item
  // [input] sio32DataChan: Pointer to sio32Chan structure
  // [input] waterAlarmThreshDm: Water Alarm Threshold DM Item
  STATUS writeWaterAlarmThresh( sio32Chan *sio32DataChan,
                            DM_Item waterAlarmThreshDm);


  protected:
  ///////////////////////////////////////////////////////////////////
  // Handle Micro reset.  Overrides handleMicroReset() in microApp.
  virtual int handleMicroReset();

  ///////////////////////////////////////////////////////////////////
  // Fill in TasksParams structure for MidWaterMonitor and
  // MidWaterSampler tasks.  Overrides setTaskParams() in MicroApp
  virtual void setTaskParams();

  ///////////////////////////////////////////////////////////////////
  // Process Application Specific SRQ's.  Overrides processSRQ() in
  // microApp.  We do most of the work here for now.
  // [input] srqPacket: Pointer to SRQ Packet.
  // [input] nPacketBytes: Number of Bytes in SRQ Packet.
  virtual int processSRQ(Byte *srqPacket, int nPacketBytes);

  ///////////////////////////////////////////////////////////////////
  // Create MicroSampler subclass object
  virtual MicroSampler *createMicroSampler();

  ///////////////////////////////////////////////////////////////////
  // Create DmMonitor subclass object
  virtual DmMonitor *createDmMonitor();

};


#endif






