#ifndef ACTUATORCMD_H_
#define ACTUATORCMD_H_

#include "MultiplicativeKalmanFilter.h"
#include "SensorProcessing.h"
#include "SensorValues.h"

class ActuatorCmd {
 public:
  ActuatorCmd();
  virtual ~ActuatorCmd();

  /*
   * @brief:	scalingTorqueRws()	scales the torque via maximum part in case this part is
   * higher then the maximum torque
   * @param:	rwTrq	 			given torque for reaction wheels which will be
   * scaled if needed to be
   */
  void scalingTorqueRws(double *rwTrq, double maxTorque);

  /*
   * @brief:	cmdSpeedToRws()		will set the maximum possible torque for the reaction
   * wheels, also will calculate the needed revolutions per minute for the RWs, which will be given
   * as Input to the RWs
   * @param:	rwTrqIn 			given torque from pointing controller
   * 			rwTrqNS				Nullspace torque
   * 			rwCmdSpeed			output revolutions per minute for every
   * reaction wheel
   */
  void cmdSpeedToRws(int32_t speedRw0, int32_t speedRw1, int32_t speedRw2, int32_t speedRw3,
                     const double *rwTorque, int32_t *rwCmdSpeed, double sampleTime,
                     int32_t maxRwSpeed, double inertiaWheel);

  /*
   * @brief:	cmdDipolMtq()		gives the commanded dipol moment for the magnetorques
   *
   * @param:	dipolMoment 		given dipol moment in spacecraft frame
   * 			dipolMomentActuator	resulting dipol moment in actuator reference frame
   */
  void cmdDipolMtq(const double *dipolMoment, int16_t *dipolMomentActuator,
                   const double *inverseAlignment, double maxDipol);

 protected:
 private:
};

#endif /* ACTUATORCMD_H_ */