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

const u8 sanlian[] U8X8_PROGMEM  = 
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0xE0,
0x07,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,
0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0xFC,
0x7F,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,
0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x01,0x00,0x00,0x00,0xF8,0x01,0x00,
0x00,0x00,0x7F,0x00,0x00,0x00,0xC0,0xFF,
0xFF,0x03,0x00,0x00,0x00,0xF8,0x03,0x00,
0x00,0x00,0x7F,0x00,0x00,0x00,0xE0,0xFF,
0xFF,0x07,0x00,0x00,0x00,0xFC,0x03,0x00,
0x00,0x00,0x7F,0x00,0x00,0x00,0xF0,0xFF,
0xFF,0x1F,0x00,0x00,0x00,0xFC,0x03,0x00,
0x00,0x80,0x7F,0x00,0x00,0x00,0xF8,0x01,
0x00,0x1F,0x00,0x00,0x00,0xFC,0x07,0x00,
0x00,0x80,0x7F,0x00,0x00,0x00,0xFC,0x00,
0x00,0x3F,0x00,0x00,0x00,0xFE,0x0F,0x00,
0x00,0xC0,0x7F,0x00,0x00,0x00,0xFC,0x00,
0x00,0x7F,0x00,0x00,0x00,0xFF,0x1F,0x00,
0x00,0xE0,0x7F,0x00,0x00,0x00,0xFE,0x7F,
0xFC,0x7F,0x00,0x00,0xC0,0xFF,0x3F,0x00,
0x00,0xF8,0x7F,0x00,0x00,0x00,0xFE,0x7F,
0xFC,0xFF,0x00,0x00,0xFE,0xFF,0xFF,0x0F,
0xF0,0xF8,0xFF,0xFF,0x01,0x00,0xFE,0x1F,
0xF0,0xFF,0x00,0xC0,0xFF,0xFF,0xFF,0x7F,
0xFC,0xF8,0xFF,0xFF,0x07,0x00,0xFF,0x07,
0xC0,0xFF,0x00,0xE0,0xFF,0xFF,0xFF,0x7F,
0xFC,0xF8,0xFF,0xFF,0x07,0x00,0xFF,0x01,
0x80,0xFF,0x01,0xC0,0xFF,0xFF,0xFF,0x7F,
0xFE,0xF8,0xFF,0xFF,0x07,0x00,0xFF,0x41,
0x00,0xFF,0x01,0xC0,0xFF,0xFF,0xFF,0x3F,
0xFE,0xF8,0xFF,0xFF,0x07,0x00,0xFF,0x70,
0x0C,0xFE,0x01,0x80,0xFF,0xFF,0xFF,0x1F,
0xFE,0xF8,0xFF,0xFF,0x07,0x00,0x7F,0x78,
0x3C,0xFE,0x01,0x00,0xFF,0xFF,0xFF,0x0F,
0xFE,0xF8,0xFF,0xFF,0x07,0x00,0x7F,0x7C,
0x3C,0xFC,0x01,0x00,0xFE,0xFF,0xFF,0x07,
0xFE,0xF8,0xFF,0xFF,0x07,0x00,0x7F,0x7C,
0x3C,0xFC,0x01,0x00,0xFC,0xFF,0xFF,0x03,
0xFE,0xF8,0xFF,0xFF,0x03,0x00,0x7F,0x7C,
0x7C,0xFC,0x01,0x00,0xF8,0xFF,0xFF,0x03,
0xFE,0xF8,0xFF,0xFF,0x03,0x00,0x7F,0x7C,
0x7C,0xFC,0x01,0x00,0xF0,0xFF,0xFF,0x01,
0xFE,0xF8,0xFF,0xFF,0x03,0x00,0x7F,0x7C,
0x7C,0xFC,0x00,0x00,0xF0,0xFF,0xFF,0x01,
0xFE,0xF8,0xFF,0xFF,0x03,0x00,0x7E,0x7C,
0x7C,0xFC,0x00,0x00,0xF0,0xFF,0xFF,0x00,
0xFE,0xF8,0xFF,0xFF,0x01,0x00,0xFE,0x7F,
0xFC,0xFF,0x00,0x00,0xF0,0xFF,0xFF,0x00,
0xFE,0xF8,0xFF,0xFF,0x01,0x00,0xFE,0x7F,
0xFC,0x7F,0x00,0x00,0xF0,0xFF,0xFF,0x00,
0xFE,0xF8,0xFF,0xFF,0x01,0x00,0xFC,0x7F,
0xFC,0x7F,0x00,0x00,0xF0,0xFF,0xFF,0x00,
0xFE,0xF8,0xFF,0xFF,0x01,0x00,0xFC,0x7F,
0xFC,0x3F,0x00,0x00,0xF0,0xFF,0xFF,0x00,
0xFE,0xF8,0xFF,0xFF,0x00,0x00,0xF8,0x7F,
0xFC,0x1F,0x00,0x00,0xF0,0xFF,0xFF,0x01,
0xFE,0xF8,0xFF,0xFF,0x00,0x00,0xF0,0xFF,
0xFF,0x1F,0x00,0x00,0xF0,0xFF,0xFF,0x01,
0xFC,0xF8,0xFF,0x7F,0x00,0x00,0xE0,0xFF,
0xFF,0x0F,0x00,0x00,0xF8,0x0F,0xFF,0x01,
0xFC,0xF8,0xFF,0x3F,0x00,0x00,0xC0,0xFF,
0xFF,0x03,0x00,0x00,0xF8,0x03,0xFC,0x01,
0xF8,0xF8,0xFF,0x1F,0x00,0x00,0x00,0xFF,
0xFF,0x01,0x00,0x00,0xF8,0x01,0xF0,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,
0x7F,0x00,0x00,0x00,0x70,0x00,0xC0,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,
0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"C:\Users\ROG\Desktop\无标题.bmp",0*/
/* (128 X 36 )*/
};

typedef struct
{
  byte val;
  byte last_val;
}KEY_T;
typedef struct
{
  byte id;
  byte press;
  byte update_flag;
  byte res;
}KEY_MSG;

typedef struct
{
  char* str;
  byte len;
}SETTING_LIST;

SETTING_LIST list[] = 
{
  {"list",4},
  {"ab",2},
  {"abc",3},
  {"abcd",4},
};
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);//该驱动是1.3寸的OLED屏幕。---------U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);这是比较常用的0.9寸的OLED显示器的驱动
short x,x_trg; //x当前位置数值,x_trg 目标坐标值
short y = 20,y_trg = 20;

short frame_len,frame_len_trg;//框框的宽度
short frame_y,frame_y_trg;//框框的y

char ui_select = 0;

int state;
KEY_T key[2] = {0};
KEY_MSG key_msg = {0};

byte get_io_val(byte ch)
{
  if(ch == 0)
  {
    return digitalRead(2);
  }
  else
  {
    return digitalRead(3);
  }
}

void key_init(void)
{
  for(int i = 0;i<2;i++)
  {
    key[i].val = key[i].last_val = get_io_val(i);
  }
}

void key_scan(void)
{
  for(int i = 0;i<2;i++)
  {
    key[i].val =  get_io_val(i);
    if(key[i].val != key[i].last_val)
    {
      key[i].last_val = key[i].val;
      if(key[i].val == 0)
      {
        key_msg.id = i;
        key_msg.press = 1;
        key_msg.update_flag = 1;
      }
    }
  }
}

int ui_run(short *a,short *a_trg,u8 step,u8 slow_cnt)
{  
  u8 temp;

  temp = abs(*a_trg-*a) > slow_cnt ? step : 1;
  if(*a < *a_trg)
  {
    *a += temp;
  }
  else if( *a > *a_trg)
  {
    *a -= temp;  
  }
  else
  {
    return 0;
  }
  return 1;
}

void setup(void) 
{
 	pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  key_init();
  Serial.begin(9600);
  u8g2.begin();
  u8g2.setFont(u8g2_font_t0_22_mf ); //设置字体
}
short disapper_temp = 0;
short come_temp = 8;
u8 ui_disapper(void)
{
  int len = 8 * u8g2.getBufferTileHeight() * u8g2.getBufferTileWidth();
  u8 *p = u8g2.getBufferPtr();
  u8 return_flag = 0;
    //1 byte = 8 bit
    // 1111 1111
    // 1111 1111    &
    // 0000 0000
    // rand()%0xff = 0 ~ 0xff

  for( int i = 0;i< len ;i++)
  {
    p[i] = p[i] & (rand()%0xff) >> disapper_temp;
  }
  disapper_temp +=2;
  if(disapper_temp > 8)
  {
      return_flag = 1;
      disapper_temp = 0;
  }
  return return_flag ? 0 : 1;
}

u8 ui_come(void)
{
    int len = 8 * u8g2.getBufferTileHeight() * u8g2.getBufferTileWidth();
    u8 *p = u8g2.getBufferPtr();
    u8 return_flag = 0;
    for( int i = 0;i< len ;i++)
    {
        p[i] = p[i] & (rand()%0xff) >> come_temp;
    }
    come_temp -=2;
    if(come_temp < 0)
    {
        return_flag = 1;
        come_temp = 8;
    }
    return return_flag ? 0 : 1;
}

u8 flag = 0;
u8 stop_flag = 0;
void loop(void) 
{

  u8g2.clearBuffer();         // 清除内部缓冲区
  u8g2.drawXBMP(0,20,128,36,sanlian);  // 第一段输出位置   
  if(flag)
  {
    if(ui_disapper() == 0)
    {
      flag = 0;
    }
  }
  else
  {
    if(ui_come() == 0)
    {
      flag = 1;
      stop_flag = 1;
    }
  }
  u8g2.sendBuffer();          // transfer internal memory to the displa
  if(stop_flag == 1)
  {
    stop_flag = 0;
    delay(1000);
  }
}