#include "stdio.h"
#include "stdlib.h"
#include "stdint.h"
#include "unistd.h"
#include "io.h"
#include "sys/alt_alarm.h"
#include "alt_types.h"
#include "TFT_API.h"
#include "touch_spi.h"
#include "DSO.h"
#include "sample.h"
#include "altera_avalon_pio_regs.h"
#include "touchpad.h"

unsigned char control_state = LEVEL_STATE; //ϵͳ״̬
unsigned char control_state_pre = LEVEL_STATE; //ϵͳ״̬
unsigned char channel_sel = 0; //ͨѡ

unsigned char trig_mode = AUTO; //ͨѡ

extern unsigned char run_state; //״̬
volatile int8_t Trig_voltage = 50;

TOUCH_HANDLE hTouch;


static alt_alarm myalarm; // API 涨ı

alt_u32 my_alarm_callback(void* context)
{
	touch_screen_app();
	return 1;
}

void touchpad_init()
{
	hTouch = Touch_Init(TOUCH_SPI_0_BASE, TOUCH_PEN_BASE, TOUCH_PEN_IRQ);
	alt_alarm_start(&myalarm, 1, my_alarm_callback, NULL);
}

volatile short Y1_Offset, Y2_Offset;

int is_run_stop_key(int y_pos) {
	if ((y_pos > 350) && (y_pos < 378))
		return 1;
	else
		return 0;
}

int is_level_key(int y_pos) {
	if ((y_pos > 143) && (y_pos < 163))
		return 1;
	else
		return 0;
}

int is_channel_key(int y_pos) {
	if ((y_pos > 62) && (y_pos < 82))
		return 1;
	else
		return 0;
}

int is_Yoffset_key(int y_pos) {
	if ((y_pos > 196) && (y_pos < 224))
		return 1;
	else
		return 0;
}

int is_Time_key(int y_pos) {
	if ((y_pos > 245) && (y_pos < 277))
		return 1;
	else
		return 0;
}

int is_Voltage_key(int y_pos) {
	if ((y_pos > 296) && (y_pos < 329))
		return 1;
	else
		return 0;
}

int is_Trigger_key(int y_pos) {
	if ((y_pos > 146) && (y_pos < 175))
		return 1;
	else
		return 0;
}

int is_INC_key(int y_pos) {
	if ((y_pos > 90) && (y_pos < 105))
		return 1;
	else
		return 0;
}

int is_DEC_key(int y_pos) {
	if ((y_pos > 55) && (y_pos < 68))
		return 1;
	else
		return 0;
}

int Get_Key_Info(int y_pos) {
	if (is_Voltage_key(y_pos)) {
		return VOLT_STATE; //Voltage
	}

	else if (is_Time_key(y_pos)) {
		return TIME_STATE; //TIME
	}

	else if (is_level_key(y_pos)) //LEVEL
			{
		return LEVEL_STATE;
	}

	else if (is_Yoffset_key(y_pos)) //OFFSET
			{
		return OFFSET_STATE;
	}

	else if (is_Trigger_key(y_pos)) {
		return TRIG_STATE; //Trigger
	} else
		return 0;
}


void update_button()
{
	switch(control_state)
	{
	case VOLT_STATE:
		{
			BUTTON_VOLTAGE.back_color = ~0x8C;
			draw_Rectangle_button(&BUTTON_VOLTAGE);
		}break;

	case TIME_STATE:
		{
			BUTTON_TIME.back_color = ~0x8C;
			draw_Rectangle_button(&BUTTON_TIME);
		}break;

	case LEVEL_STATE:
		{
			BUTTON_LEVEL.back_color = ~0x8C;
			draw_Rectangle_button(&BUTTON_LEVEL);
		}break;

	case OFFSET_STATE:
		{
			BUTTON_OFFSET.back_color = ~0x8C;
			draw_Rectangle_button(&BUTTON_OFFSET);
		}break;

	case TRIG_STATE:
		{
			BUTTON_TRIGGER.back_color = ~0x8C;
			draw_Rectangle_button(&BUTTON_TRIGGER);
		}break;
	default:break;
	}

	if(control_state_pre == control_state)
	{

	}else
	{
		switch(control_state_pre)
		{
		case VOLT_STATE:
			{
				BUTTON_VOLTAGE.back_color = 0x8C;
				draw_Rectangle_button(&BUTTON_VOLTAGE);
			}break;

		case TIME_STATE:
			{
				BUTTON_TIME.back_color = 0x8C;
				draw_Rectangle_button(&BUTTON_TIME);
			}break;

		case LEVEL_STATE:
			{
				BUTTON_LEVEL.back_color = 0x8C;
				draw_Rectangle_button(&BUTTON_LEVEL);
			}break;

		case OFFSET_STATE:
			{
				BUTTON_OFFSET.back_color = 0x8C;
				draw_Rectangle_button(&BUTTON_OFFSET);
			}break;

		case TRIG_STATE:
			{
				BUTTON_TRIGGER.back_color = 0x8C;
				draw_Rectangle_button(&BUTTON_TRIGGER);
			}break;

		default:break;
		}
	}
}

void touch_screen_app(void) {

	char tmp[30] = { 0 };
	int state;
	int rc;

	int x_pos, y_pos;

	if (Touch_GetXY(hTouch, &x_pos, &y_pos)) {
		//Mѹ
		//sprintf(tmp, "x:%d y:%d", x_pos, y_pos);
		//textbox7.str = tmp;
		//draw_Rectangle_textbox(&textbox7);

		if (y_pos > 120) {
			if ((x_pos > 710) && (x_pos < SCREEN_LENGTH)) {
				if (is_run_stop_key(y_pos)) //RUN/STOP
						{
					if (run_state) {
						run_state = 0;
//						BUTTON_RUN.back_color = RED;
//						BUTTON_RUN.text_color = YELLOW;
//						BUTTON_RUN.str = " STOP";
//						draw_Rectangle_button(&BUTTON_RUN);
					} else {
						run_state = 1;
//						BUTTON_RUN.back_color = GREEN;
//						BUTTON_RUN.text_color = RED;
//						BUTTON_RUN.str = " RUN";
//						draw_Rectangle_button(&BUTTON_RUN);
					}
				} else if (is_channel_key(y_pos)) //CH
						{
					if (channel_sel) {
						channel_sel = 0;
//						BUTTON_CHANNEL.back_color = YELLOW;
//						BUTTON_CHANNEL.text_color = ~YELLOW;
//						BUTTON_CHANNEL.str = " CH0";
//						draw_Rectangle_button(&BUTTON_CHANNEL);
					} else {
						channel_sel = 1;
//						BUTTON_CHANNEL.back_color = GREEN;
//						BUTTON_CHANNEL.text_color = ~GREEN;
//						BUTTON_CHANNEL.str = " CH1";
//						draw_Rectangle_button(&BUTTON_CHANNEL);
					}
				} else {
					state = Get_Key_Info(y_pos);
					if (state)
					{
						control_state_pre = control_state;
						control_state = state;
						//update_button();
					}
				}
			}
		} else if ((x_pos > 680) && (x_pos < SCREEN_LENGTH)) {
			if (is_DEC_key(y_pos)) {
				switch (control_state) {
				case VOLT_STATE:
					if (!channel_sel) {
						if (CH1_WAVE.VOLT_factor == 1)
							CH1_WAVE.VOLT_factor = 1;
						else
							CH1_WAVE.VOLT_factor = CH1_WAVE.VOLT_factor >> 1;
					} else {
						if (CH2_WAVE.VOLT_factor == 1)
							CH2_WAVE.VOLT_factor = 1;
						else
							CH2_WAVE.VOLT_factor = CH2_WAVE.VOLT_factor >> 1;
					}
					break;

				case TIME_STATE:
				{
					rc = change_speed(0);
					//ʱTime
					if(rc >= 1000000)
					{
						rc = rc/1000000;
						sprintf(tmp, "Time:%dMHz", rc);
					}
					else if(rc >= 1000)
					{
						rc = rc/1000;
						sprintf(tmp, "Time:%dKHz", rc);
					}
					else
					{
						sprintf(tmp, "Time:%dHz", rc);
					}

					textbox6.str = tmp;
					draw_Rectangle_textbox(&textbox6);
				}
					break;

				case LEVEL_STATE:
					if (!channel_sel) {
						if (CH1_WAVE.Y_Offset <= -255)
							CH1_WAVE.Y_Offset = -255;
						else
							CH1_WAVE.Y_Offset = CH1_WAVE.Y_Offset - 5;
					} else {
						if (CH2_WAVE.Y_Offset <= -255)
							CH2_WAVE.Y_Offset = -255;
						else
							CH2_WAVE.Y_Offset = CH2_WAVE.Y_Offset - 5;
					}
					break;


				case TRIG_STATE:
						LCD_Fill(0, WAVE_AREA_YM + Trig_voltage - 1, 3, WAVE_AREA_YM + Trig_voltage + 1,BLACK);
						if (Trig_voltage <= -108)
							Trig_voltage = -108;
						else
							Trig_voltage = Trig_voltage - 2;
						LCD_Fill(0, WAVE_AREA_YM + Trig_voltage - 1, 3, WAVE_AREA_YM + Trig_voltage + 1,RED);
					break;

				default:
					break;

				}

			} else if (is_INC_key(y_pos)) {
				switch (control_state) {
				case VOLT_STATE:
					if (!channel_sel) {
						if (CH1_WAVE.VOLT_factor == 128)
							CH1_WAVE.VOLT_factor = 128;
						else
							CH1_WAVE.VOLT_factor = CH1_WAVE.VOLT_factor << 1;
					} else {
						if (CH2_WAVE.VOLT_factor == 128)
							CH2_WAVE.VOLT_factor = 128;
						else
							CH2_WAVE.VOLT_factor = CH2_WAVE.VOLT_factor << 1;
					}
					break;

				case TIME_STATE:
					{
						rc = change_speed(1);
						//ʱTime
						if(rc >= 1000000)
						{
							rc = rc/1000000;
							sprintf(tmp, "Time:%dMHz", rc);
						}
						else if(rc >= 1000)
						{
							rc = rc/1000;
							sprintf(tmp, "Time:%dKHz", rc);
						}
						else
						{
							sprintf(tmp, "Time:%dHz", rc);
						}

						textbox6.str = tmp;
						draw_Rectangle_textbox(&textbox6);
					}

					break;

				case LEVEL_STATE:
					if (!channel_sel) {
						if (CH1_WAVE.Y_Offset >= 255)
							CH1_WAVE.Y_Offset = 255;
						else
							CH1_WAVE.Y_Offset = CH1_WAVE.Y_Offset + 5;
					} else {
						if (CH2_WAVE.Y_Offset >= 255)
							CH2_WAVE.Y_Offset = 255;
						else
							CH2_WAVE.Y_Offset = CH2_WAVE.Y_Offset + 5;
					}
					break;

				case TRIG_STATE:

						LCD_Fill(0, WAVE_AREA_YM + Trig_voltage-1, 3, WAVE_AREA_YM + Trig_voltage + 1,BLACK);
						if (Trig_voltage >= 107)
							Trig_voltage = 107;
						else
							Trig_voltage = Trig_voltage + 2;
						LCD_Fill(0, WAVE_AREA_YM + Trig_voltage-1, 3, WAVE_AREA_YM + Trig_voltage + 1,RED);
					break;

				default:
					break;
				}
			}
		}

		if(trig_mode == NOMAL)
		{
			set_trig_level(Trig_voltage - CH1_WAVE.Y_Offset);
		}

	}
}


