/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : Crossbow.h                                                    */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
/*-----------------------------------------------------------------------*
  CLASS: Crossbow

  DESCRIPTION: Device interface for Crossbow DMU-AHRS.

  AUTHOR: Aaron Marsh

  $Id: Crossbow.h,v 1.12 2001/06/04 12:53:36 hthomas Exp $
 *-----------------------------------------------------------------------*/

#ifndef _CROSSBOW_H
#define _CROSSBOW_H

#include "PeriodicTask.h"
#include "SerialDevice.h"
#include "CrossbowOutput.h"
#include "CrossbowCommand.h"
#include "CrossbowLog.h"

#include "AHRSOutput.h"

#define CrossbowTaskName "crossbow"

const int defaultTFactor = 50;

const int anglePacketLen = 30;

class Crossbow : public PeriodicTask {

  friend class CrossbowLog;

public:
  Crossbow( SerialDevice *device );
  
  virtual ~Crossbow();
  
  virtual int initialize( void );
  
  virtual void log(int millisec);

  virtual void status(char *str);

  virtual void currentData(char *str);

  void crossbowDebugMode( Boolean newMode );
  Boolean setHexDump( Boolean );

protected:

  CrossbowLog *_log;

  SerialDevice *_device;

  CrossbowOutput _output;
  CrossbowCommand _command;

private:

  void loadConfig( const char *configFile );

  void crossbowCallback( void );

  int requestData( void );
  int readData( void );

  long _crossbowPeriod;
  
  Boolean _crossbowDebugMode;
  Boolean _dumpHex;

  enum CrossbowDataMode { POLLED, CONTINUOUS } DataMode;
  enum CrossbowDataFormat { VOLTAGE, SCALED, ANGLE } DataFormat;

  inline int setDataMode( enum CrossbowDataMode NewMode ) {
       switch( NewMode ) {
	    case POLLED: return setPolledMode();
	    case CONTINUOUS: return setContinuousMode();
       }
       return OK;
  };
  int setPolledMode( void );
  int setContinuousMode( void ); 

  int setAngleMode( void );

  int getSerialNumber( void );
  int setZero( int samples );

  int setTFactor( int newFactor );

  void clearCommand( void ); 

  struct rawAnglePacket {
       unsigned char Header;
       signed short Roll, Pitch, Yaw, RollRate, PitchRate, YawRate;
       signed short AccelX, AccelY, AccelZ, MagX, MagY, MagZ;
       unsigned short Temp, Time;
       unsigned char Checksum;
  };

  int checkChecksum( struct rawAnglePacket *testPacket );

  int reverseByteOrder( struct rawAnglePacket *work );

  int scaleRawAnglePacket( struct rawAnglePacket *in );


};


#endif
