#ifndef _DEVICEDRIVER_H
#include <malloc.h>
#include "DeviceIF.h"

class DeviceDriver {
  
public:

  DeviceDriver();

  ~DeviceDriver();

  ////////////////////////////////////////////////////////////////////
  // Send data request to device. DeviceDriver::requestData() does
  // nothing; subclass can override.
  virtual DeviceIF::Status requestData();

  ////////////////////////////////////////////////////////////////////
  // Read data record from device
  virtual DeviceIF::Status readData() = 0;

  ////////////////////////////////////////////////////////////////////
  // Initialize device
  virtual DeviceIF::Status initialize() = 0;


  ////////////////////////////////////////////////////////////////////
  // Process device data
  virtual DeviceIF::Status processRecord(unsigned char *record, 
					 int nRecordBytes) = 0;


  struct Options {

    Options() {
      portName = 0;
      configFileName = 0;
    }

    ~Options() {
      free((void *)portName);
      free((void *)configFileName);
    }

    char *portName;
    char *configFileName;

  };

  static int getOptions(int argc, char **argv, Options *options);


protected:

  DeviceIF::Status _state;

  const unsigned char *_recordTerminator;
  unsigned char *_record;
  unsigned _maxRecordBytes;

};


#endif
