diff options
| author | [email protected] <[email protected]> | 2011-11-08 09:33:18 +0000 |
|---|---|---|
| committer | [email protected] <[email protected]> | 2011-11-08 09:33:18 +0000 |
| commit | 4e8d6639f001bcf3939bfe8012943f287289d287 (patch) | |
| tree | 736613e9b23aa08f78330d05a6879f222a5e7216 | |
| parent | 065c3fb834f696b068922fff4a0e3a195bde5581 (diff) | |
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
| -rw-r--r-- | bsp/stm32f10x/application.c | 13 | ||||
| -rw-r--r-- | bsp/stm32f10x/calibration.c | 15 |
2 files changed, 26 insertions, 2 deletions
diff --git a/bsp/stm32f10x/application.c b/bsp/stm32f10x/application.c index 2518cb26f9..5da04d8830 100644 --- a/bsp/stm32f10x/application.c +++ b/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();
}
diff --git a/bsp/stm32f10x/calibration.c b/bsp/stm32f10x/calibration.c index 92bd10fe44..544866f3f0 100644 --- a/bsp/stm32f10x/calibration.c +++ b/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
|
