#ifndef _XPORT_GPIO_H_
#define _XPORT_GPIO_H_

/** \file XPortGPIO.h 
    Defines implementation of the XPort GPIO API.
*/
/****************************************************************************/
/* Copyright (c) 2008 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : XPortGPIO.h                                                   */
/* Author   : K Headley                                                     */
/* Project  : Benthic Imaging AUV                                           */
/* Created  : 04/01/2008                                                    */
/****************************************************************************/
/* Modification History:                                                    */
/*  $Id: XPortGPIO.h,v 1.2 2009/04/10 08:45:15 headley Exp $   */
/*  $Name: FastSim $ */
/****************************************************************************/

#include <signal.h>
#include <errno.h>
#include "XPort.h"
#include "NMEA.h"
#include "Utils.h"
#include "qnx_port.h"
#include "BicamConsts.h"
/* 
   Function Declarations
*/

/** Manipulate the Lantronix XPort GPIO pins.
    Uses an XPort object to activate and deactivate the GPIO pins.

    Replaces BicamTrigger for trigger the BIAUV camera.

    BicamGPS synthesizes NMEA GPS strings and uses the XPort serial port 
    to send the GPS strings to the camera's GPS input port.

    @see XPort
    @see BicamGPS
    @see NMEA
    
*/
class XPortGPIO{
 private:
 protected:
  /** Lantronix XPort single port terminal server w/ GPIO */
  XPort *xport;
  /** GPIO mask indicating which XPort GPIO pins to use */
  unsigned int _selectMask;
  /** GPIO mask indicating which XPort GPIO pins are inputs/outputs */
  unsigned int _directionMask;
  /** GPIO mask indicating which XPort GPIO pins are active HI/inactive LO */
  unsigned int _activeLevelMask;
  /** GPIO mask indicating which XPort GPIO pins are in active/inactive state*/
  unsigned int _stateMask;

 public:
  XPortGPIO();
  XPortGPIO(XPort *pXPort,
	    unsigned int selMask, 
	    unsigned int dirMask, 
	    unsigned int levMask,
	    unsigned int staMask
	    );
 
  XPortGPIO(unsigned int selMask,
	    unsigned int dirMask, 
	    unsigned int levMask,
	    unsigned int staMask
	    );

  ~XPortGPIO();
  XPort *connect(char *host,
		 int gpioIPPort, 
		 unsigned int dirMask,
		 unsigned int dirValues,
		 unsigned int levelMask,
		 unsigned int levelValues);
 
  int configure(unsigned int selMask,
		unsigned int dirMask, 
		unsigned int levMask,
		unsigned int staMask); 

  int configure(XPort *pXPort,
		unsigned int selMask,
		unsigned int dirMask, 
		unsigned int levMask,
		unsigned int staMask); 
  XPort *getXPort();
  void setXPort(XPort *);
  int setActive();
  int setInactive();
  int pulse();
  unsigned int getSelectMask();
  unsigned int getDirectionMask();
  unsigned int getActiveLevelMask();
  unsigned int getStateMask();
  void setSelectMask(unsigned int mask);
  void setDirectionMask(unsigned int mask);
  void setActiveLevelMask(unsigned int mask);
  void setStateMask(unsigned int mask);
  int setCurrentState(unsigned int values,XPortResponse *response);
  int setActiveLevel(unsigned int values,XPortResponse *response);
  int setDirection(unsigned int values,XPortResponse *response);
  int setCurrentState(unsigned int mask, unsigned int values, XPortResponse *response);
  int setActiveLevel(unsigned int mask, unsigned int values, XPortResponse *response);
  int setDirection(unsigned int mask, unsigned int values, XPortResponse *response);
};

#endif /*_XPORT_GPIO_H_*/
