/* 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_summarize_h
#define INCLUDED_summarize_h

// This file contains EventProcessors which summarize various pieces of information

#include <vector>

#include "../Main/Events.h"
#include "../Motion/MotionInterface.h"

class MotionUpdateSource;

class MotionUpdateSummary : public EventProcessor {
private:
  MotionUpdateSource *update_source;

  ulong timestamp;
  std::vector<Motion::MotionLocalizationUpdate> updates;

  ulong last_queue_timestamp;
  int last_idx;

public:
  static std::string name;

  static EventProcessor *create() {return new MotionUpdateSummary;}
  MotionUpdateSummary();
  virtual ~MotionUpdateSummary();

  virtual bool initConnections();
  virtual bool update(ulong time,const EventList *events);

  const std::vector<Motion::MotionLocalizationUpdate> *get(ulong time);
};

class MotionUpdateHeadSummary : public EventProcessor {
private:
  MotionUpdateSource *update_source;

  ulong timestamp;
  std::vector<Motion::MotionLocalizationUpdate> updates;

  ulong last_queue_timestamp;
  int last_idx;

  void modifyMoveToHeadCoords(Motion::MotionLocalizationUpdate *move);

public:
  static std::string name;

  static EventProcessor *create() {return new MotionUpdateHeadSummary;}
  MotionUpdateHeadSummary();
  virtual ~MotionUpdateHeadSummary();

  virtual bool initConnections();
  virtual bool update(ulong time,const EventList *events);

  const std::vector<Motion::MotionLocalizationUpdate> *get(ulong time);
};

class MotionUpdateVelocitySummary : public EventProcessor {
private:
  MotionUpdateSource *updateSource;

  EventCacheTracker cacheTracker;
  vector3d velocity;

  ulong lastQueueTimestamp;
  int lastIdx;

public:
  static std::string name;

  static EventProcessor *create() {return new MotionUpdateVelocitySummary;}
  MotionUpdateVelocitySummary();
  virtual ~MotionUpdateVelocitySummary();

  virtual bool initConnections();
  virtual bool update(ulong time,const EventList *events);

  // x,y,a velocity
  vector3d get(ulong time);
};

#endif
