#ifndef ACS_CONTROL_DETUMBLE_H_
#define ACS_CONTROL_DETUMBLE_H_

#include <fsfw/returnvalues/returnvalue.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

#include "../AcsParameters.h"
#include "../SensorValues.h"
#include "eive/resultClassIds.h"

class Detumble {
 public:
  Detumble(AcsParameters *acsParameters_);
  virtual ~Detumble();

  static const uint8_t INTERFACE_ID = CLASS_ID::ACS_DETUMBLE;
  static const ReturnValue_t DETUMBLE_NO_SENSORDATA = MAKE_RETURN_CODE(0x01);

  /* @brief: Load AcsParameters for this class
   * @param: acsParameters_ Pointer to object which defines the ACS configuration parameters
   */
  void loadAcsParameters(AcsParameters *acsParameters_);

  ReturnValue_t bDotLaw(const double *magRate, const bool magRateValid, const double *magField,
                        const bool magFieldValid, double *magMom);

  ReturnValue_t bangbangLaw(const double *magRate, const bool magRateValid, double *magMom);

  ReturnValue_t bangbangLaw(const double *magRate, const bool *magRateValid, double *magMom);

  ReturnValue_t bDotLawGyro(const double *satRate, const bool *satRateValid, const double *magField,
                            const bool *magFieldValid, double *magMom);

 private:
  AcsParameters::DetumbleParameter *detumbleParameter;
  AcsParameters::MagnetorquesParameter *magnetorquesParameter;
};

#endif /*ACS_CONTROL_DETUMBLE_H_*/