/*

ARIA header files for use with ARNL 1.7.1

Copyright(C) 2004, 2005 ActivMedia Robotics, LLC. 
Copyright(C) 2006, 2007, 2008, 2009 MobileRobots Inc.
All rights reserved.

This copy of Aria was relicensed for use with Arnl and the Arnl
license by MobileRobots Inc.  If you wish to download a seperate
distribution of Aria licensed under the GPL or a commercial license go to
http://www.mobilerobots.com/SOFTWARE/aria.html or contact MobileRobots
Inc, at robots@mobilerobots.com or MobileRobots Inc,
10 Columbia Drive, Amherst, NH 03031; 800-639-9481

MobileRobots Inc hereby grants to other individuals or
organizations permission to use this software with Arnl and in
compliance with the Arnl license.  This software may not be
distributed to others except by MobileRobots Inc.

MobileRobots Inc does not make any representations about the
suitability of this software for any purpose.  It is provided "as is"
without express or implied warranty.

*/
#ifndef ARDATALOGGER_H
#define ARDATALOGGER_H

#include "ariaUtil.h"
#include "ArMutex.h"
#include "ArFunctor.h"
#include <vector>

class ArRobot;
class ArConfig;


/// This class will log data, but you have to use it through an ArConfig right now
/**
   This class doesn't log anything by default, but can be set up to
   log all sorts of data.  Note that if you do an addString after you
   do an addToConfig it'll automatically be enabled (since right now
   we don't want to change config after loading since the values would
   wind up wierd).
 **/
class ArDataLogger
{
public:
  /// Constructor
  AREXPORT ArDataLogger(ArRobot *robot, const char *fileName = NULL);
  /// Destructor
  AREXPORT ~ArDataLogger();
  /// Adds the data logger information to the config
  AREXPORT void addToConfig(ArConfig *config);
  /// Adds a string to the list of options in the raw format
  AREXPORT void addString(const char *name, ArTypes::UByte2 maxLen, 
			  ArFunctor2<char *, ArTypes::UByte2> *functor);

  /// Gets the functor for adding a string (for ArStringInfoGroup)
  ArFunctor3<const char *, ArTypes::UByte2,
				    ArFunctor2<char *, ArTypes::UByte2> *> *
                     getAddStringFunctor(void) { return &myAddStringFunctor; }

protected:
  AREXPORT void connectCallback(void);
  AREXPORT bool processFile(char *errorBuffer, size_t errorBufferLen);
  AREXPORT void userTask(void);
  ArRobot *myRobot;
  ArTime myLastLogged;
  ArConfig *myConfig;
  bool myAddToConfigAtConnect;
  bool myAddedToConfig;

  FILE *myFile;
  bool myConfigLogging;
  int myConfigLogInterval;
  char myOpenedFileName[512];
  char myConfigFileName[512];
  std::string myPermanentFileName;

  // for what we're logging
  bool myLogVoltage;
  bool myLogLeftVel;
  bool myLogRightVel;
  bool myLogTransVel;
  bool myLogRotVel;
  bool myLogLeftStalled;
  bool myLogRightStalled;
  bool myLogStallBits;
  bool myLogFlags;
  bool myLogFaultFlags;
  int myAnalogCount;
  bool *myAnalogEnabled;
  int myAnalogVoltageCount;
  bool *myAnalogVoltageEnabled;
  int myDigInCount;
  bool *myDigInEnabled;
  int myDigOutCount;
  bool *myDigOutEnabled;
  bool myLogPose;
  bool myLogEncoderPose;
  bool myLogCorrectedEncoderPose;
  bool myLogEncoders;
  bool myLogChargeState;
  int myStringsCount;
  std::vector<bool *> myStringsEnabled;
  ArMutex myMutex;

  std::vector<ArStringInfoHolder *> myStrings;
  ArTypes::UByte2 myMaxMaxLength;
  ArFunctor3C<ArDataLogger, const char *, ArTypes::UByte2,
		    ArFunctor2<char *, ArTypes::UByte2> *> myAddStringFunctor;
  

  ArFunctorC<ArDataLogger> myConnectCB;  
  ArRetFunctor2C<bool, ArDataLogger, char *, size_t> myProcessFileCB;
  ArFunctorC<ArDataLogger> myUserTaskCB;
};

#endif // ARDATALOGGER_H
