#ifndef BSP_Q7S_DEVICES_DEVICEDEFINITIONS_STARTRACKERJSONCOMMANDS_H_
#define BSP_Q7S_DEVICES_DEVICEDEFINITIONS_STARTRACKERJSONCOMMANDS_H_

/**
 * @brief   This file defines a few helper classes to generate commands by means of the parameters
 *          defined in the arcsec json files.
 *  @author J. Meier
 */

#include <string>

#include "ArcsecJsonParamBase.h"
#include "fsfw/serviceinterface/ServiceInterface.h"

/**
 * @brief   Generates command to set the limit parameters
 *
 */
class Limits : public ArcsecJsonParamBase {
 public:
  Limits();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 43;

  virtual ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to configure the tracking algorithm.
 *
 */
class Tracking : public ArcsecJsonParamBase {
 public:
  Tracking();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 15;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to set the mounting quaternion
 *
 */
class Mounting : public ArcsecJsonParamBase {
 public:
  Mounting();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 18;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to set the mounting quaternion
 *
 */
class Camera : public ArcsecJsonParamBase {
 public:
  Camera();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 43;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to configure the blob algorithm
 *
 */
class Blob : public ArcsecJsonParamBase {
 public:
  Blob();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 24;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to configure the centroiding algorithm
 *
 */
class Centroiding : public ArcsecJsonParamBase {
 public:
  Centroiding();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 47;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to configure the LISA (lost in space algorithm)
 *
 */
class Lisa : public ArcsecJsonParamBase {
 public:
  Lisa();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 48;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to configure the matching algorithm
 *
 */
class Matching : public ArcsecJsonParamBase {
 public:
  Matching();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 10;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to configure the validation parameters
 *
 */
class Validation : public ArcsecJsonParamBase {
 public:
  Validation();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 12;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates command to configure the mechanism of automatically switching between the
 *          LISA and other algorithms.
 *
 */
class Algo : public ArcsecJsonParamBase {
 public:
  Algo();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 13;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

#endif /* BSP_Q7S_DEVICES_DEVICEDEFINITIONS_STARTRACKERJSONCOMMANDS_H_ */