#ifndef FM_LOGGER_HH
#define FM_LOGGER_HH

#include "DataLogWriter.h"
#include "ssdbg.hh"

#define FMLogName "smartSampler_FrontMomentumLog"

/****************************************************************************
 *
 * Class for logging binary data.
 *
 ****************************************************************************/

class FMLogger :public DataLogWriter {
public:
  FMLogger():DataLogWriter(FMLogName, DataLog::BinaryFormat, AutoTimeStamp),
	     _delta(NULL),_est(NULL),_downmo(NULL),_upmo(NULL){
    ssdbg(DBG_LOAD)("creating FMLogger\n");
    addField(_delta =  new DoubleData("delta"));
    addField(_est =  new DoubleData("estimate"));
    addField(_downmo =  new DoubleData("downward momentum"));
    addField(_upmo =  new DoubleData("upward momentum"));
  };
  ~FMLogger(){
    ssdbg(DBG_CLEAN)("destroying FMLogger\n");
    if(NULL != _delta)delete _delta;
    if(NULL != _est)delete _est;
    if(NULL != _downmo)delete _downmo;
    if(NULL != _upmo)delete _upmo;
  };

  // call DataLogWriter::write() if there's new data.
  void callWrite(double delta, double est, double downmo, double upmo){
    if((delta!= _delta->value()) || (est != _est->value()) || 
       (downmo != _downmo->value()) || (upmo != _upmo->value())){
      ssdbg(DBG_LOG)("FMLogger -- Updating log file with delta=%.4f,est=%.4f,downmo=%.4f,upmo=%.4f.\n",
	    delta,est,downmo,upmo);
      _delta->setValue(delta);
      _est->setValue(est);
      _downmo->setValue(downmo);
      _upmo->setValue(upmo);
      write();
    }else{
      ssdbg(DBG_LOG)("FMLogger -- No new data, skip write.");
    }
  };

protected:
  void setFields(){}; // This is just a dummy, we set the fields in callWrite.

private:
  DoubleData *_delta,*_est,*_downmo,*_upmo;
}; // FMLogger


#endif // FM_LOGGER_HH
