#include <Wire.h>
#include <U8g2lib.h>
#include <Arduino.h>

//Pin Rotate Encoder
#define RE_CLK_Pin 34
#define RE_DT_Pin 35
#define RE_SW_Pin 32
int RE_Counter = 0;
int RE_CLK_last;
int RE_CLK_current;
int RE_RT_current;
int RE_SW = 0;
int RE_Dir; // Left:1 Right=0
//Pin button
#define btn_Pin1 27
#define btn_Pin2 14
#define btn_Pin3 12
int btn1;
int btn2;
int btn3;
//Pin Rocker Bar
#define RB_VRX_Pin 26
#define RB_VRY_Pin 25
#define RB_SW_Pin 33
int RB_VRX;
int RB_VRY;
int RB_SW;
//Menu
uint8_t func_index=0;
void (*current_operation_index)();
void fun1();
void fun2();
void fun3();
void fun4();
void page_1_to_4();
typedef struct
{
	uint8_t current;
	uint8_t up;
	uint8_t down;
	uint8_t enter;
	void (*current_operation)();
}key_table;

key_table table[7]=
{
	{0,3,1,0,(*fun1)},
	{1,0,2,1,(*fun2)},
	{2,1,3,2,(*fun3)},
	{3,2,0,3,(*fun4)},
};
// OLED
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
//Settings
void setPins();
//Functions

//setup
void setup() {
  Serial.begin(9600);
  setPins();
  u8g2.begin();
  u8g2.enableUTF8Print();
  RE_CLK_last = digitalRead(RE_CLK_Pin);
}

void loop() {
  //Button
  btn1 = digitalRead(btn_Pin1);
  btn2 = digitalRead(btn_Pin2);
  btn3 = digitalRead(btn_Pin3);
  //Rocker Bar
  RB_VRX = analogRead(RB_VRX_Pin);
  RB_VRY = analogRead(RB_VRY_Pin);
  RB_SW = digitalRead(RB_SW_Pin);
  //Rotate Encoder
  RE_CLK_current = digitalRead(RE_CLK_Pin);
  RE_RT_current = digitalRead(RE_DT_Pin);
  int RE_RT_current = digitalRead(RE_DT_Pin);
  if(RE_CLK_current != RE_CLK_last && RE_CLK_current == 1)
  {
      if(RE_RT_current != RE_CLK_current)
      {RE_Counter--; RE_Dir = 1;}
      else 
      {RE_Counter++; RE_Dir = 0;}
  }
  RE_CLK_last = RE_CLK_current;
  RE_SW = digitalRead(RE_SW_Pin);
  //
  if((btn1==1)||(btn2==1)||(btn3==1))
	{
		if(btn1==1)
		{
			func_index=table[func_index].up; 
		}
		if(btn2==1)
  	{
    	func_index=table[func_index].down;
		}
    if(btn3==1)                     
		{                
		  func_index=table[func_index].enter; 
		}
	}
	current_operation_index=table[func_index].current_operation;
	(*current_operation_index)();//执行当前操作函数
}

void setPins()
{
  //Rotae Encoder
  pinMode(RE_CLK_Pin, INPUT);
  pinMode(RE_DT_Pin, INPUT);
  pinMode(RE_SW_Pin, INPUT_PULLUP);
  //Button
  pinMode(btn_Pin1, INPUT_PULLUP);
  pinMode(btn_Pin2, INPUT_PULLUP);
  pinMode(btn_Pin3, INPUT_PULLUP);
  //Rocker Bar
  pinMode(RB_VRX_Pin, INPUT);
  pinMode(RB_VRY_Pin, INPUT);
  pinMode(RB_SW_Pin, INPUT_PULLUP);
}

void fun1(){
  u8g2.clearBuffer();
  page_1_to_4();
  u8g2.setFont(u8g2_font_open_iconic_all_1x_t);
  u8g2.drawGlyph(5, 16*(1%4==0? 4:1%4)-4,118);
  u8g2.sendBuffer();
}
void fun2(){
  u8g2.clearBuffer();
  page_1_to_4();
  u8g2.setFont(u8g2_font_open_iconic_all_1x_t);
  u8g2.drawGlyph(5, 16*(2%4==0? 4:2%4)-4,118);
  u8g2.sendBuffer();
}
void fun3(){
  u8g2.clearBuffer();
  page_1_to_4();
  u8g2.setFont(u8g2_font_open_iconic_all_1x_t);
  u8g2.drawGlyph(5, 16*(3%4==0? 4:3%4)-4,118);
  u8g2.sendBuffer();
}
void fun4(){
  u8g2.clearBuffer();
  page_1_to_4();
  u8g2.setFont(u8g2_font_open_iconic_all_1x_t);
  u8g2.drawGlyph(5, 16*(4%4==0? 4:4%4)-4,118);
  u8g2.sendBuffer();
}
void page_1_to_4(){
  u8g2.setFont(u8g2_font_wqy14_t_gb2312a);
  u8g2.setCursor(20, 16*1-2);
  u8g2.print("Model");
  u8g2.setCursor(20, 16*2-2);
  u8g2.print("Link");
  u8g2.setCursor(20, 16*3-2);
  u8g2.print("Menu");
  u8g2.setCursor(20, 16*4-2);
  u8g2.print("Test");
}
esp:VIN
esp:GND.2
esp:D13
esp:D12
esp:D14
esp:D27
esp:D26
esp:D25
esp:D33
esp:D32
esp:D35
esp:D34
esp:VN
esp:VP
esp:EN
esp:3V3
esp:GND.1
esp:D15
esp:D2
esp:D4
esp:RX2
esp:TX2
esp:D5
esp:D18
esp:D19
esp:D21
esp:RX0
esp:TX0
esp:D22
esp:D23
oled1:GND
oled1:VCC
oled1:SCL
oled1:SDA
encoder1:CLK
encoder1:DT
encoder1:SW
encoder1:VCC
encoder1:GND
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
joystick1:VCC
joystick1:VERT
joystick1:HORZ
joystick1:SEL
joystick1:GND