/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : SailDevice.h                                                  */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#ifndef _SAILDEVICE_H
#define _SAILDEVICE_H

#include <stdio.h>
#include "SerialDevice.h"
#include "Exception.h"

// Default SAIL timeout in millisec
#define SailTimeout 2500

/*
CLASS 
SailDevice

DESCRIPTION
Methods and utilities for a SAIL-networked device.
A SailDevice object contains the SerialDevice object for the SAIL network.

AUTHOR
Tom O'Reilly

*/
class SailDevice {

public:

  ///////////////////////////////////////////////////////////////////
  // Status codes for device
  enum Status {
    Ok, NotSelected, NotConnected, NotInitialized, SerialError,
    NoSignals, Sail1CommsError, IndexFailed, ForkFailed, Unknown
  };

  ///////////////////////////////////////////////////////////////////
  // Constructor
  // [input] name: Name of device
  // [input] serialDevice: SAIL network SerialDevice object
  // [input] endOfRecord: End-of-record character for device
  SailDevice(const char *name, SerialDevice *serialDevice, 
	     unsigned char endOfRecord);

  ~SailDevice();

  ///////////////////////////////////////////////////////////////////
  // Name of device
  const char *name();

  ///////////////////////////////////////////////////////////////////
  // Current status of device
  Status status();

  ///////////////////////////////////////////////////////////////////
  // Write command
  int write(char *buf, int nBytes);

  ///////////////////////////////////////////////////////////////////
  // Read data
  int read(char *buf, int maxBytes, int timeoutMillisec = SailTimeout);

  ///////////////////////////////////////////////////////////////////
  // Wait for data from device
  int confirm(char *echo, int timeoutMillisec = SailTimeout);

  ///////////////////////////////////////////////////////////////////
  // SAIL network SerialDevice object
  SerialDevice *serialDevice();

  ///////////////////////////////////////////////////////////////////
  // reads characters into buffer until string is received from device
  int readUntil(char *buf, int maxBytes, char *term, 
		int timeout = SailTimeout);

  ///////////////////////////////////////////////////////////////////
  // Confirm that a string was received from device
  int readUntil(char *term, int timeout = SailTimeout);

protected:
  
  const char *_name;
  SerialDevice *_serialDevice;
  unsigned char _endOfRecord;
  Status _status;
};


#endif
