#include "stdarg.h"
#include "stdlib.h"
#include <stdint.h>
#include "unistd.h"
#include "TFT_API.h"

#define SCREEN_LENGTH 480	//Ļؿ
#define SCREEN_HIGHT 272	//Ļظ߶

#define WAVE_AREA_XL 0	//ʾΧ߽
#define WAVE_AREA_WIDTH (SCREEN_LENGTH - 50)	//ʾ
#define WAVE_AREA_XR (WAVE_AREA_XL + WAVE_AREA_WIDTH)	//ʾΧұ߽
#define WAVE_AREA_XM ((WAVE_AREA_XL + WAVE_AREA_XR)/2)	//ʾX

#define WAVE_AREA_YD 40		//ʾΧ±߽
#define WAVE_AREA_HIGHT (SCREEN_HIGHT - WAVE_AREA_YD - 16)	//ʾ߶
#define WAVE_AREA_YU (WAVE_AREA_YD + WAVE_AREA_HIGHT) 	//ʾΧϱ߽


#define WAVE_AREA_YM ((WAVE_AREA_YU+1 + WAVE_AREA_YD)/2)	//ʾY

#define Y_GIRD_NUM	8	//ֱդ
#define Y_GIRD_SIZE  ((WAVE_AREA_YU - WAVE_AREA_YD)/Y_GIRD_NUM)	//ÿդ߶ռ

#define X_GIRD_NUM	10	//ˮƽդ
#define X_GIRD_SIZE  ((WAVE_AREA_XR - WAVE_AREA_XL)/X_GIRD_NUM)	//ÿդռ

#define WAVE_SIZE 1024	//δ洢ռС

#define CH1_WAVE_COLOR YELLOW	//ͨ1ɫ
#define CH2_WAVE_COLOR GREEN		//ͨ2ɫ
#define WAVE_BACK_COLOR BLACK	//αɫ
#define GIRD_COLOR	GRAY		//դɫ
#define CURSOR_A_COLOR	WHITE	//Aɫ
#define CURSOR_B_COLOR	GREEN	//Bɫ

#define PRESSED 0	//
#define RELEASED 1	//ͷ

typedef struct{
	uint16_t Wave_Color;	//ɫ
	int16_t X_Offset_NOW;	//ˮƽƫ
	int16_t X_Offset_PRE;//һˮƽƫ
	int16_t X_Offset;//ˮƽƫ

	int16_t Y_Offset_NOW;	//δֱƫ
	int16_t Y_Offset_PRE;//һδֱƫ
	int16_t Y_Offset;	//ƫ

	int8_t TIME_factor_NOW; //Xεǰ,ʱ
	int8_t TIME_factor_PRE; //Xǰһ,ʱ
	int8_t TIME_factor; //X,ʱ

	uint8_t VOLT_factor_NOW; //Y,ѹ
	uint8_t VOLT_factor_PRE; //Yǰһ,ѹ
	uint8_t VOLT_factor; //Y,ѹ

	uint8_t *pre_data;	//һ֡ݴڴָ
	uint8_t *current_data;		//һ֡ݴڴָ
}wavetypedef;

typedef struct{
	uint16_t pos_x;	//ʼλX
	uint16_t pos_y;	//ʼλY
	uint16_t hight;	//߶
	uint16_t width;	//
	uint32_t back_color;	//ɫ
	uint32_t text_color;	//ɫ
	char char_size;			//ַߴ
	char button_state;		//״̬
	char *str;		//ʾ
}buttontypedef;

typedef struct{
	uint16_t pos_x;	//ıʼλX
	uint16_t pos_y;	//ıʼλY
	uint16_t hight;	//ı߶
	uint16_t width;	//ı
	uint32_t back_color;	//ı򱳾ɫ
	uint32_t text_color;	//ıɫ
	char char_size;			//ַߴ
	char *str;		//ʾ
}textboxtypedef;

volatile wavetypedef CH1_WAVE;
volatile wavetypedef CH2_WAVE;

extern buttontypedef button0;	//
extern buttontypedef button1;	//
extern buttontypedef button2;	//
extern buttontypedef button3;	//
extern buttontypedef button4;	//
extern buttontypedef button5;	//

extern buttontypedef button6;	//
extern buttontypedef button7;	//

extern buttontypedef BUTTON_RUN;	//	ɫrunɫstop
extern buttontypedef BUTTON_VOLTAGE;	//ѹ֮󣬿޸դĵѹС
extern buttontypedef BUTTON_TIME;	//ʱ״̬ͨ޸Ĳʣ޸ÿդʱ
extern buttontypedef BUTTON_LEVEL;	//ֱƫƵεĴֱλ
extern buttontypedef BUTTON_OFFSET;	//ˮƽλѡ
extern buttontypedef BUTTON_TRIGGER;	//ѹ
extern buttontypedef BUTTON_CHANNEL;	//ͨѡ

extern buttontypedef BUTTON_INC;	//	Ӽ
extern buttontypedef BUTTON_DEC;	//  С

extern textboxtypedef textbox0;	//
extern textboxtypedef textbox1;	//
extern textboxtypedef textbox2;	//
extern textboxtypedef textbox3;	//
extern textboxtypedef textbox4;	//
extern textboxtypedef textbox5;	//
extern textboxtypedef textbox6;	//
extern textboxtypedef textbox7;	//
extern textboxtypedef textbox8;	//
extern textboxtypedef textbox9;	//

extern uint8_t sample_rate;	//β
extern int wave_point_num;	//ÿʾʱҪʾĵʺʱ

void draw_wave(wavetypedef *CH_WAVE);
void draw_ch_wave(uint8_t *CH1_Buf, uint8_t *CH2_Buf, uint8_t CH_State);
void clear_ch_wave(int8_t *CH1_Buf, int8_t *CH2_Buf, uint8_t CH_State);
void draw_wave_area();

void draw_Rectangle_button(buttontypedef *button);//ֱǰť
void draw_circle_textbox(textboxtypedef *textbox);//Բı
void draw_Rectangle_textbox(textboxtypedef *textbox);//Ʒı

void creat_buttons(void);
void create_textbox(int num, uint16_t x,uint16_t y,uint16_t h,uint16_t w, uint32_t color, char *p);
void draw_gui();
void draw_image(int x,int y, int width, int hight, char *p);

