#include "Arduino.h"
#include "FT18e_STW_INIT.h"
#include "Bounce2.h"
#include "RotaryEncoder.h"

volatile stw_data_type Stw_data = {0};		   //alles mit 0 initialisieren
volatile vehicle_data_type Vehicle_data = {0}; //alles mit 0 initialisieren
bool enc1PinALast, enc1PinANow, enc2PinALast, enc2PinANow;
int led[] = {led1, led2, led3, led4, led5, led6, led7, led8, led9, led10, led11, led12, led13, led14, led15, led16};
bool entprell;
int buttons[] = {PIN_BUTTON_LL, PIN_BUTTON_LR, PIN_BUTTON_RL, PIN_BUTTON_RR, enc1PinS, enc2PinS};
Bounce debouncer[8];
double val = 0;
double val2 = 0;
RotaryEncoder encoder(enc1PinA, enc1PinB, 1, 1, 50);
RotaryEncoder encoder2(enc2PinA, enc2PinB, 1, 1, 50);
///////////////////////////////////////////////////
// functions
///////////////////////////////////////////////////

void set_pins()
{
	for (int thisLed = 0; thisLed < sizeof(led) / sizeof(int); thisLed++)
	{
		pinMode(led[thisLed], OUTPUT);
	}
	pinMode(l, OUTPUT);
	/*pinMode(button1, INPUT);
	pinMode(button2, INPUT);
	pinMode(button3, INPUT);
	pinMode(button4, INPUT);
	pinMode(button5, INPUT);
	pinMode(button6, INPUT);*/
	pinMode(enc1PinA, INPUT);
	pinMode(enc1PinB, INPUT);
	//pinMode(enc1PinS, INPUT);
	pinMode(enc2PinA, INPUT);
	pinMode(enc2PinB, INPUT);
	//pinMode(enc2PinS, INPUT);
	//Stw_data.i=0;
	enc1PinALast = LOW;
	enc1PinANow = LOW;
	enc2PinALast = LOW;
	enc2PinANow = LOW;
	for (int i = 0; i < sizeof(buttons) / sizeof(*buttons); i++)
	{
		pinMode(buttons[i], INPUT);
		debouncer[i].attach(buttons[i]);
		debouncer[i].interval(10);
	}
}

void read_buttons()
{
	Stw_data.button_ll = digitalRead(PIN_BUTTON_LL);
	Stw_data.button_lr = digitalRead(PIN_BUTTON_LR);
	Stw_data.button_rl = digitalRead(PIN_BUTTON_RL);
	Stw_data.button_rr = digitalRead(PIN_BUTTON_RR);
}

void read_rotary()
{
	int enc2 = encoder2.readEncoder();
	if (enc2 != 0)
	{
		val2 = val2 + 0.5 * enc2;
		if (val2 == 1 or val2 == -1)
		{
			if ((Stw_data.mode == 1 or Stw_data.mode == 0) and enc2 < 0)
			{
				Stw_data.mode = 5;
			}
			else if (Stw_data.mode == 5 and enc2 > 0)
			{
				Stw_data.mode = 1;
			}
			else
			{
				Stw_data.mode = Stw_data.mode + enc2;
			}
			val2 = 0;
		}
	}
}