/****************************************************************************/
/* Copyright (c) 2012 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : Multibeamer.cc                                                */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 09/17/2012                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#include <unistd.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/uio.h>
#include <fcntl.h>
#include <errno.h>
#include <iostream.h>

#include "TimeP.h"
#include "Multibeamer.h"
#include "Syslog.h"
#include "Reson7K.h"

Multibeamer::Multibeamer()
  : Task(MultibeamerTaskName)
{
  Syslog::write("Multibeamer: constructing...\n");
  _input = new MultibeamerInput();
  _output = new MultibeamerOutput();

  try {
  _log = new MultibeamerLog( this, DataLog::BinaryFormat );
  }
  catch ( ... ) {
    throw Exception("Multibeamer::Multibeamer() - MultibeamerLog contructor failed\n");
  }

  initialize();
}


Multibeamer::~Multibeamer()
{
  delete _input;
  delete _output;
  delete _reson7k;
}


DeviceIF::Status Multibeamer::initialize(void)
{
  Syslog::write("Multibeamer: initializing...\n");

  // Setup socket to receive the reson data
  _reson7k = new Reson7K("134.89.33.76");

   Syslog::write("reson socket ready"); 

  // Subscribe to reson messages
  U32 subscriptionRequest[2];
  subscriptionRequest[0] = 1; //the number of records
  subscriptionRequest[1] = 7006; //7k bathymetric data
  _reson7k->MB_RemoteCommand(7500, 1051,
			     (char *)subscriptionRequest,
			     sizeof(subscriptionRequest)); 
  return DeviceIF::Ok;
} 


void Multibeamer::run()
{

  _output->data.range = 30.;
  _output->data.goodComms = True;
  _output->data.ready = True;
 
  char buffer[2048];
 
  while (1)
  {
    // Check for reson message
    //
    _reson7k->_mbDataSocket->receiveDatagram(buffer, 2048);
    printf("got a message\n");      
    // Decode and process the record
    //
    Time::gettime(&_output->data.updateTime);
    
    // Post data to output
    _output->write();
  }

  return;
}



