/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
 * Copyright (c) 2006, 2007 INRIA
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation;
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Author: 
 */
#ifndef SPRING_MOBILITY_MODEL_H
#define SPRING_MOBILITY_MODEL_H

#include "ns3/mobility-model.h"
#include "ns3/nstime.h"
#include "ns3/event-id.h"

namespace ns3 {

/**
 * \ingroup mobility
 *
 * \brief 
 */
class SpringMobilityModel : public MobilityModel 
{
public:
  static TypeId GetTypeId (void);

  /**
   * Create a position located at coordinates (0,0,0) with velocity (0,0,0)
   */
  SpringMobilityModel ();
  virtual ~SpringMobilityModel ();

  /**
   * \brief Attach node by a spring
   * \param node MobilityModel layer of the attaching node
   */
  void
  AddSpring (Ptr<MobilityModel> node);

private:
  // from Object
  virtual void
  DoStart ();

  // from MobilityModel
  virtual Vector 
  DoGetPosition (void) const;

  virtual void 
  DoSetPosition (const Vector &position);

  virtual Vector 
  DoGetVelocity (void) const;

  // Updating positions
  void 
  Update (void) const;

private:
  double m_epsilon;

  double m_nodeMass;
  double m_nodeCharge;
  double m_springNormalLength;
  double m_springConstant;
  double m_dampingFactor;

  static double m_totalKineticEnergy;  
  
  mutable Vector m_position;
  mutable Vector m_velocity;
  mutable bool m_stable;
  mutable Time m_lastTime;

  EventId m_updateEvent;

  std::list<Ptr<MobilityModel> > m_springs;
};

} // namespace ns3

#endif // SPRING_MOBILITY_MODEL_H
