Преглед изворни кода

bsp/stm32f10x: calibrate touch screen before starting GUI

If we do not calibrate the touch screen, GUI is unusable. This patch use a semaphore to block GUI thread until calibration finish.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1791 bbd45198-f89e-11dd-88c7-29a3b14d5316
chaos.proton@gmail.com пре 13 година
родитељ
комит
4e8d6639f0
2 измењених фајлова са 26 додато и 2 уклоњено
  1. 13 0
      bsp/stm32f10x/application.c
  2. 13 2
      bsp/stm32f10x/calibration.c

+ 13 - 0
bsp/stm32f10x/application.c

@@ -45,6 +45,8 @@
 
 #include "led.h"
 
+extern rt_sem_t touch_screen_calibrated;
+
 ALIGN(RT_ALIGN_SIZE)
 static rt_uint8_t led_stack[ 512 ];
 static struct rt_thread led_thread;
@@ -151,6 +153,17 @@ void rt_init_thread_entry(void* parameter)
 		/* set lcd device as rtgui graphic driver */
 		rtgui_graphic_set_device(lcd);
 
+		/* without calibration, the position we got from the touch screen is
+		 * useless raw value and the GUI is unusable. */
+		calibration_init();
+		if (touch_screen_calibrated != RT_NULL)
+		{
+			rt_sem_take(touch_screen_calibrated, RT_WAITING_FOREVER);
+			/* NOTE: no other thread use this semaphore, so we can delete it.
+			 * If this is not your case, comment this line. */
+			rt_sem_delete(touch_screen_calibrated);
+		}
+
 		/* startup rtgui */
 		rtgui_startup();
 	}

+ 13 - 2
bsp/stm32f10x/calibration.c

@@ -30,6 +30,9 @@ struct calibration_session
 };
 static struct calibration_session* calibration_ptr = RT_NULL;
 
+/* a semaphore that will become avaible when calibration finished. */
+rt_sem_t touch_screen_calibrated = RT_NULL;
+
 static void calibration_data_post(rt_uint16_t x, rt_uint16_t y)
 {
 	if (calibration_ptr != RT_NULL)
@@ -254,6 +257,8 @@ void calibration_entry(void* parameter)
 	/* release memory */
 	rt_free(calibration_ptr);
 	calibration_ptr = RT_NULL;
+	/* tell other thread that we finished calibration */
+	rt_sem_release(touch_screen_calibrated);
 }
 
 void calibration_init()
@@ -261,7 +266,12 @@ void calibration_init()
 	rt_device_t device;
 
 	device = rt_device_find("touch");
-	if (device == RT_NULL) return; /* no this device */
+	if (device == RT_NULL)
+		return; /* no such device */
+
+	touch_screen_calibrated = rt_sem_create("tc_cali", 0, RT_IPC_FLAG_FIFO);
+	if (touch_screen_calibrated == RT_NULL)
+		return;
 
 	calibration_ptr = (struct calibration_session*)rt_malloc(sizeof(struct calibration_session));
 	rt_memset(calibration_ptr, 0, sizeof(struct calibration_data));
@@ -271,7 +281,8 @@ void calibration_init()
 
 	calibration_ptr->tid = rt_thread_create("cali", calibration_entry, RT_NULL,
 		2048, 20, 5);
-	if (calibration_ptr->tid != RT_NULL) rt_thread_startup(calibration_ptr->tid);
+	if (calibration_ptr->tid != RT_NULL)
+		rt_thread_startup(calibration_ptr->tid);
 }
 
 #ifdef RT_USING_FINSH