/**
  * This file is part of the hoverboard-sideboard-hack project.
  *
  * Copyright (C) 2020-2021 Emanuel FERU <aerdronix@gmail.com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
  *
  * 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, see <http://www.gnu.org/licenses/>.
*/

// Define to prevent recursive inclusion
#ifndef CONFIG_H
#define CONFIG_H

/* ==================================== VARIANT SELECTION ==================================== */
// PlatformIO: uncomment desired variant in platformio.ini
// Keil uVision: select desired variant from the Target drop down menu (to the right of the Load button)
// Ubuntu: define the desired build variant here if you want to use make in console
// or use VARIANT environment variable for example like "make -e VARIANT=VARIANT_DEBUG". Select only one at a time.
#if !defined(PLATFORMIO)
  // #define VARIANT_DEBUG                    // Variant for debugging and checking the capabilities of the side-board
  // #define VARIANT_HOVERCAR                 // Variant for using the side-boards connected to the Hoverboard mainboard
  // #define VARIANT_HOVERBOARD               // Variant for using the side-boards connected to the Hoverboard mainboard
#endif

/* ==================================== DO NOT TOUCH SETTINGS ==================================== */
#define MPU6050                               // [-] Define IMU sensor type
#define MPU_GYRO_FSR              2000        // [deg/s] Set Gyroscope Full Scale Range: 250 deg/s, 500 deg/s, 1000 deg/s, 2000 deg/s. !! DMP sensor fusion works only with 2000 deg/s !!
#define MPU_ACCEL_FSR             2           // [g] Set Acceleromenter Full Scale Range: 2g, 4g, 8g, 16g. !! DMP sensor fusion works only with 2g !!
#define MPU_I2C_SPEED             400000      // [bit/s] Define I2C speed for communicating with the MPU6050
#define DELAY_IN_MAIN_LOOP        1           // [ms] Delay in the main loop
// #define PRINTF_FLOAT_SUPPORT                  // [-] Uncomment this for printf to support float on Serial Debug. It will increase code size! Better to avoid it!
/* =============================================================================================== */

/* ==================================== SETTINGS MPU-6050 ==================================== */
#define MPU_SENSOR_ENABLE                     // [-] Enable flag for MPU-6050 sensor. Comment-out this flag to Disable the MPU sensor and reduce code size.
#define MPU_DMP_ENABLE                        // [-] Enable flag for MPU-6050 DMP (Digital Motion Processing) functionality.
#define MPU_DEFAULT_HZ            20          // [Hz] Default MPU frequecy: must be between 1Hz and 200Hz.
#define TEMP_READ_MS              500         // [ms] Temperature read time interval
#define PEDO_READ_MS              1000        // [ms] Pedometer read time interval
// #define USE_CAL_HW_REGISTERS                  // [-] Uncommnent this to SAVE the sensor calibration to the MPU-6050 registers after the Self-test was run

// DMP Tap Detection Settings
#define DMP_TAP_AXES              TAP_XYZ     // [-] Set which axes will register a tap: TAP_XYZ, TAP_X, TAP_Y, TAP_Z
#define DMP_TAP_THRESH            250         // [mg/ms] Set tap threshold for the selected axis.
#define DMP_TAP_COUNT             1           // [-] Set minimum number of taps needed for an interrupt. Minimum consecutive taps: 1 to 4
#define DMP_TAP_TIME              100         // [ms] Set time length between valid taps.
#define DMP_TAP_TIME_MULTI        500         // [ms] Set max time between taps to register as a multi-tap.
#define DMP_SHAKE_REJECT_THRESH   200         // [deg/s] Set shake rejection threshold in degree per second (dps). If the DMP detects a gyro sample larger than the thresh, taps are rejected.
#define DMP_SHAKE_REJECT_TIME     40          // [ms] Set shake rejection time. Sets the length of time that the gyro must be outside of the DMP_SHAKE_REJECT_THRESH before taps are rejected. A mandatory 60 ms is added to this parameter.
#define DMP_SHAKE_REJECT_TIMEOUT  10          // [ms] Set shake rejection timeout. Sets the length of time after a shake rejection that the gyro must stay inside of the threshold before taps can be detected again. A mandatory 60 ms is added to this parameter.

/* ==================================== SETTINGS USART ==================================== */
#define SERIAL_START_FRAME        0xABCD      // [-] Start frame definition for reliable serial communication
#define SERIAL_BUFFER_SIZE        64          // [bytes] Size of Serial Rx buffer. Make sure it is always larger than the 'Feedback' structure size
#define SERIAL_TIMEOUT            600         // [-] Number of wrong received data for Serial timeout detection. Depends on DELAY_IN_MAIN_LOOP
#define USART_MAIN_BAUD           115200      // [bit/s] MAIN Serial Tx/Rx baud rate
#define USART_AUX_BAUD            115200      // [bit/s] AUX Serial Tx/Rx baud rate

/* ==================================== SETTINGS AUX ==================================== */
// #define AUX45_USE_GPIO                        // [-] Use AUX4, AUX5 as GPIO ports
// #define AUX45_USE_I2C                         // [-] Use AUX4, AUX5 as I2C port
#ifdef AUX45_USE_I2C
  #define AUX_I2C_SPEED           100000      // [bit/s] Define I2C speed for communicating via AUX45 wires
#endif



/* ==================================== VARIANT DEBUG ==================================== */
#ifdef VARIANT_DEBUG
  #define SERIAL_DEBUG                        // [-] Define for Serial Debug via the serial port
  #define SERIAL_AUX_RX                       // [-] Use AUX4, AUX5 as USART port
  // #define SERIAL_AUX_TX                       // [-] Use AUX4, AUX5 as USART port

  #define CONTROL_IBUS
  #define IBUS_NUM_CHANNELS   14              // Total number of IBUS channels to receive, even if they are not used.
  #define IBUS_LENGTH         0x20
  #define IBUS_COMMAND        0x40
#endif


/* ==================================== VARIANT HOVERCAR ==================================== */
#ifdef VARIANT_HOVERCAR
  #define SERIAL_CONTROL                      // [-] Define for Serial Control via the serial port
  #define SERIAL_FEEDBACK                     // [-] Define for Serial Feedback via the serial port
  #define SERIAL_AUX_RX                       // [-] Use AUX4, AUX5 as USART port
  // #define SERIAL_AUX_TX                       // [-] Use AUX4, AUX5 as USART port

  #define CONTROL_IBUS
  #define IBUS_NUM_CHANNELS   14              // Total number of IBUS channels to receive, even if they are not used.
  #define IBUS_LENGTH         0x20
  #define IBUS_COMMAND        0x40
#endif


/* ==================================== VARIANT HOVERBOARD ==================================== */
#ifdef VARIANT_HOVERBOARD
  #define SERIAL_CONTROL                      // [-] Define for Serial Control via the serial port
  #define SERIAL_FEEDBACK                     // [-] Define for Serial Feedback via the serial port
#endif



/* ==================================== VALIDATE SETTINGS ==================================== */
#if defined(SERIAL_DEBUG) && defined(SERIAL_CONTROL)
  #error SERIAL_DEBUG and SERIAL_CONTROL not allowed. It is on the same cable.
#endif

#if defined(SERIAL_DEBUG) && defined(SERIAL_FEEDBACK)
  #error SERIAL_DEBUG and SERIAL_FEEDBACK not allowed. It is on the same cable.
#endif

#if defined(AUX45_USE_GPIO) && (defined(SERIAL_AUX_RX) || defined(SERIAL_AUX_TX) || defined(AUX45_USE_I2C)) \
  || ((defined(SERIAL_AUX_RX) || defined(SERIAL_AUX_TX)) && defined(AUX45_USE_I2C))
  #error AUX45_USE_(GPIO,USART,I2C) not allowed in the same time. It is on the same cable.
#endif

#endif
