#include "Arduino.h"
#ifndef FT18e_STW_Init
#define FT18e_STW_Init

#define l 78     // test_led
#define led1 12  // PD8
#define led2 11  // PD7
#define led3 9   // PC21
#define led4 8   // PC22
#define led5 7   // PC23
#define led6 6   // PC24
#define led7 5   // PC25
#define led8 4   // PC26 und PA29
#define led9 3   // PC28
#define led10 2  // PB25
#define led11 10 // PC29 und PA28
#define led12 22 // PB26
#define led13 19 // PA10
#define led14 13 // PB27
#define led15 17 // PA12
#define led16 18 // PA11
#define enc1PinA 37
#define enc1PinB 38
#define enc1PinS 35
#define enc2PinA 40
#define enc2PinB 41
#define enc2PinS 39

constexpr int PIN_BUTTON_LL = 47;
constexpr int PIN_BUTTON_LR = 48;
constexpr int PIN_BUTTON_RL = 46;
constexpr int PIN_BUTTON_RR = 44;

constexpr int16_t RPM_THRESH_1 = 1000;
constexpr int16_t RPM_THRESH_2 = 4000;
constexpr int16_t RPM_THRESH_3 = 6000;
constexpr int16_t RPM_THRESH_4 = 8000;
constexpr int16_t RPM_THRESH_5 = 10000;
constexpr int16_t RPM_THRESH_6 = 12000;
constexpr int16_t RPM_THRESH_7 = 14000;
constexpr int16_t RPM_THRESH_8 = 16000;
constexpr int16_t RPM_THRESH_9 = 18000;
constexpr int16_t RPM_THRESH_10 = 20000;

constexpr int16_t LED_THRESH_T_MOT = 7000;  // 1/100°C
constexpr int16_t LED_THRESH_T_INV = 6000;  // 1/100°C
constexpr int16_t LED_THRESH_T_BAT = 5000;  // 1/100°C
constexpr uint16_t LED_THRESH_U_BATT = 350; // 1/100V

void set_pins(void);
void read_buttons(void);
void read_rotary(void); // read rotary switches

typedef struct {
  bool button_ll; // Left side, left button
  bool button_lr; // Left side, right button
  bool button_rl; // Right side, left button
  bool button_rr; // Right side, right button
  uint8_t mode;
  uint8_t displayindex; // index für Displayanzeige
  uint8_t error_type;   // Extrainfos über Error-LED

} stw_data_type;

struct InverterData {
  bool ready;
  bool derating;
  bool warning;
  bool error;
  bool on;
  bool precharge;
  bool ams_emerg;
  bool ts_active;
};

typedef struct {
  uint16_t u_cell_min; // Minimale Zellspannung
  uint16_t u_batt;     // Batteriespannung (pre-AIR-voltage)
  int16_t t_mot_l;     // Motor-Wasser-Temperatur Links
  int16_t t_mot_r;     // Motor-Wasser-Temperatur Rechts
  int16_t t_cell_max;  // Maximale Zelltemperatur
  int16_t t_inv;
  int16_t t_wat;
  int16_t p_wat;
  uint8_t speed;
  InverterData inverter;
  bool rev_lim;  // Drehzahllimit Bit
  int16_t revol; // Drehzahl
  int16_t wheel_speed;
} vehicle_data_type;

extern volatile stw_data_type Stw_data;
extern volatile vehicle_data_type Vehicle_data;

#endif