/* LICENSE:
  =========================================================================
    CMPack'03 Source Code Release for OPEN-R SDK v1.0
    Copyright (C) 2003 Multirobot Lab [Project Head: Manuela Veloso]
    School of Computer Science, Carnegie Mellon University
    All rights reserved.
  ========================================================================= */

#ifndef INCLUDED_Logger_h
#define INCLUDED_Logger_h

#include <OPENR/OObject.h>
#include <OPENR/OSubject.h>
#include <OPENR/OObserverVector.h>

class PacketMux;
class PacketStream;
class PacketStreamCollection;
class RobotDataPacket;

#include "def.h"
#include "entry.h"
#include "../headers/AperiosSharedMem.h"
#include "../headers/DogTypes.h"
#include "../headers/SharedMem.h"

class Logger : public OObject {
private:
public:
  OSubject*          subject[numOfSubject];
  OObserverVector*   observer[numOfObserver];
 
  Logger();
  ~Logger() {}

  //
  //  OPEN-R Method
  //
  virtual OStatus DoInit   (const OSystemEvent&);
  virtual OStatus DoStart  (const OSystemEvent&);
  virtual OStatus DoStop   (const OSystemEvent&);
  virtual OStatus DoDestroy(const OSystemEvent&);

  //
  // Inter Object Communication Method 
  //
  void ReadyRegisterRegion(const OReadyEvent &event);
  void ReadyRequestRegion (const OReadyEvent &event);
  void GotMemRegion(const ONotifyEvent &event);
  void ProcessBuffer(void *msg);

  void processControlStream();

  void sendOutputBuffer();
  void sendControlBuffer();

  void requestRegions();

private:
  // methods
  void logPacket(RobotDataPacket *packet);
  void writeLog(char *location);

  void startTimer();

  // data
  bool quickCheck;
  bool gotMessage;
  bool timerStarted;

  bool needToRegisterText;
  bool needToRegisterControl;
  SMMSharedMemRegion logTextRgn;
  SMMSharedMemRegion logControlRgn;
  PacketStream *logControlStream;
  int nextControlPacket;

  bool requestedRegion[MemoryId::NUM_MEMORY_IDS];
  SMMSharedMemRegion mainOutMemRgn;
  SMMSharedMemRegion motionOutMemRgn;
  PacketStreamCollection *mainOutPSC;
  PacketStreamCollection *motionOutPSC;
  PacketMux *mux;

  uchar *logBuffer;
  uchar *logBufferPos;
};

#endif
