#pragma once
//
//    FILE: AverageAngle.h
//  AUTHOR: Rob Tillaart
// VERSION: 0.2.2
//    DATE: 2017-11-21
// PURPOSE: Arduino library to calculate correctly the average of multiple angles.
//     URL: https://github.com/RobTillaart/AverageAngle


#include "math.h"
#include "Arduino.h"

#define AVERAGE_ANGLE_LIB_VERSION             (F("0.2.2"))

#define GRAD_TO_RAD                           (PI / 200.0)
#define RAD_TO_GRAD                           (200.0 / PI)


#define AVERAGE_ANGLE_OK                       0
#define AVERAGE_ANGLE_OVERFLOW                -10
#define AVERAGE_ANGLE_SINGULARITY             -20


class AverageAngle
{
public:
  enum AngleType { DEGREES = 0, RADIANS = 1, GRADIANS = 2 };

  AverageAngle(const enum AngleType type = DEGREES);

  uint32_t add(float alpha, float length = 1.0);
  void     reset();
  uint32_t count();

  //  if there are no angles added (count == 0) or
  //  if the sum == (0,0) there is a singularity ==> no angle. NAN
  float    getAverage();

  //  if count == 0  total length == 0.
  float    getTotalLength();
  //  if count == 0  average length == 0.
  float    getAverageLength();
  float    getSumX();
  float    getSumY();

  AngleType type();
  bool      setType(AngleType type);

  int       lastError();

private:
  AngleType _type;
  float     _sumx;
  float     _sumy;
  uint32_t  _count;
  int       _error;
};


//  -- END OF FILE --

