/* LICENSE:
  =========================================================================
    CMPack'04 Source Code Release for OPEN-R SDK 1.1.5-r2 for ERS7
    Copyright (C) 2004 Multirobot Lab [Project Head: Manuela Veloso]
    School of Computer Science, Carnegie Mellon University
    All rights reserved.
  ========================================================================= */


#ifndef INCLUDED_SPOut_h
#define INCLUDED_SPOut_h

#include <OPENR/OObject.h>
#include <OPENR/OSubject.h>
#include <OPENR/OObserverVector.h>

class PacketMux;
class PacketStreamCollection;
class RobotDataPacket;

#include "def.h"
#include "../headers/AperiosSharedMem.h"
#include "../headers/DogTypes.h"
#include "../headers/SharedMem.h"
#include "../headers/SPOutEncoder.h"

static const int spout_buffer_size=8192;

class SPOut : public OObject {
private:
public:
  OSubject*          subject[numOfSubject];
  OObserverVector*   observer[numOfObserver];
 
  SPOut();
  ~SPOut() {}

  //
  //  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 ReadyRequestRegion(const OReadyEvent &event);
  void GotMemRegion(const ONotifyEvent &event);

  void ProcessBuffer(void *msg);
  void requestRegions();

private:
  // methods

  void sendByte(uchar byte) {
    cout << SPOutEncoder::armorData(byte);
  }

  void sendHeader(RobotDataPacket *packet);
  void sendTextData(uchar *data, int length);
  void sendBinaryData(uchar *data, int length);
  void sendPacket(RobotDataPacket *packet);

  void startTimer();

  // data
  bool quickCheck;
  bool gotMessage;
  bool timerStarted;
  bool needToSendBuffer;
  bool requestedRegion[MemoryId::NUM_MEMORY_IDS];
  SMMSharedMemRegion mainOutMemRgn;
  SMMSharedMemRegion motionOutMemRgn;
  SMMSharedMemRegion loggerOutMemRgn;
  SMMSharedMemRegion wlOutMemRgn;
  PacketStreamCollection *mainOutPSC;
  PacketStreamCollection *motionOutPSC;
  PacketStreamCollection *loggerOutPSC;
  PacketStreamCollection *wlOutPSC;
  PacketMux *mux;
  void *baseAddr;
};

#endif
