/* 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_SPIn_h
#define INCLUDED_SPIn_h

#include <OPENR/OObject.h>
#include <OPENR/OSubject.h>
#include <OPENR/OObserverVector.h>

#include "def.h"
#include "../headers/AperiosSharedMem.h"
#include "../headers/SharedMem.h"
#include "../headers/SPInBufferIDs.h"

class SPIn : public OObject {
private:
public:
  OSubject*          subject[numOfSubject];
  OObserverVector*   observer[numOfObserver];
 
  SPIn();
  ~SPIn() {}

  //
  //  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 ReadyInputBuffer(const OReadyEvent &event);

  void ProcessBuffer(void *msg);
  void ReadyRequestRegion(const OReadyEvent &event);
  void GotMemRegion      (const ONotifyEvent &event);

  void requestRegions();

private:
  // methods
  void sendInputBuffer();

  void startTimer();

  // data
  bool timerStarted;
  bool needToSendBuffer;
  SMMSharedMemRegion inRgn;
  void *baseAddr;
  //CircularBufferPtr circularBuf[SPIn_NumBuffers];
  bool inited;  

  // output data
  bool requestedRegion[MemoryId::NUM_MEMORY_IDS];
  SMMSharedMemRegion outputMemRgn;
};

#endif
