Переглянути джерело

bsp/stm32f10x: remove the last calibration.c

This also provide an example to show how to use calibration feature in
the RTGUI.
Grissiom 12 роки тому
батько
коміт
24649bfefe
3 змінених файлів з 23 додано та 285 видалено
  1. 1 1
      bsp/stm32f10x/SConscript
  2. 22 0
      bsp/stm32f10x/application.c
  3. 0 284
      bsp/stm32f10x/calibration.c

+ 1 - 1
bsp/stm32f10x/SConscript

@@ -15,7 +15,7 @@ if GetDepend('RT_USING_LWIP'):
 	src_drv += ['enc28j60.c'] + ['dm9000a.c']
 
 if GetDepend('RT_USING_RTGUI'):
-    src_drv += ['touch.c', 'calibration.c']
+    src_drv += ['touch.c']
 
 if GetDepend('RT_USING_RTGUI'):
 	if rtconfig.RT_USING_LCD_TYPE == 'FMT0371':

+ 22 - 0
bsp/stm32f10x/application.c

@@ -41,6 +41,7 @@
 #include <rtgui/rtgui_server.h>
 #include <rtgui/rtgui_system.h>
 #include <rtgui/driver.h>
+#include <rtgui/calibration.h>
 #endif
 
 #include "led.h"
@@ -73,6 +74,23 @@ static void led_thread_entry(void* parameter)
     }
 }
 
+#ifdef RT_USING_RTGUI
+rt_bool_t cali_setup(void)
+{
+    rt_kprintf("cali setup entered\n");
+    return RT_FALSE;
+}
+
+void cali_store(struct calibration_data *data)
+{
+    rt_kprintf("cali finished (%d, %d), (%d, %d)\n",
+            data->min_x,
+            data->max_x,
+            data->min_y,
+            data->max_y);
+}
+#endif
+
 void rt_init_thread_entry(void* parameter)
 {
 /* Filesystem Initialization */
@@ -149,6 +167,10 @@ void rt_init_thread_entry(void* parameter)
 
 		/* init rtgui system server */
 		rtgui_system_server_init();
+
+        calibration_set_restore(cali_setup);
+        calibration_set_after(cali_store);
+        calibration_init();
 	}
 #endif /* #ifdef RT_USING_RTGUI */
 }

+ 0 - 284
bsp/stm32f10x/calibration.c

@@ -1,284 +0,0 @@
-#include <rtgui/rtgui.h>
-#include <rtgui/dc.h>
-#include <rtgui/rtgui_system.h>
-#include <rtgui/widgets/window.h>
-
-#include "touch.h"
-
-#define CALIBRATION_STEP_LEFTTOP		0
-#define CALIBRATION_STEP_RIGHTTOP		1
-#define CALIBRATION_STEP_RIGHTBOTTOM	2
-#define CALIBRATION_STEP_LEFTBOTTOM		3
-#define CALIBRATION_STEP_CENTER			4
-
-#define TOUCH_WIN_UPDATE				1
-#define TOUCH_WIN_CLOSE					2
-
-#define CALIBRATION_WIDTH				15
-#define CALIBRATION_HEIGHT				15
-
-struct calibration_session
-{
-	rt_uint8_t step;
-
-	struct calibration_data data;
-
-	rt_uint16_t width; rt_uint16_t height;
-
-	rt_device_t device;
-	rt_thread_t tid;
-};
-static struct calibration_session* calibration_ptr = RT_NULL;
-
-static void calibration_data_post(rt_uint16_t x, rt_uint16_t y)
-{
-	if (calibration_ptr != RT_NULL)
-	{
-		switch (calibration_ptr->step)
-		{
-		case CALIBRATION_STEP_LEFTTOP:
-			calibration_ptr->data.min_x = x;
-			calibration_ptr->data.min_y = y;
-			break;
-
-		case CALIBRATION_STEP_RIGHTTOP:
-			calibration_ptr->data.max_x = x;
-			calibration_ptr->data.min_y = (calibration_ptr->data.min_y + y)/2;
-			break;
-
-		case CALIBRATION_STEP_LEFTBOTTOM:
-			calibration_ptr->data.min_x = (calibration_ptr->data.min_x + x)/2;
-			calibration_ptr->data.max_y = y;
-			break;
-
-		case CALIBRATION_STEP_RIGHTBOTTOM:
-			calibration_ptr->data.max_x = (calibration_ptr->data.max_x + x)/2;
-			calibration_ptr->data.max_y = (calibration_ptr->data.max_y + y)/2;
-			break;
-
-		case CALIBRATION_STEP_CENTER:
-			/* calibration done */
-			{
-				rt_uint16_t w, h;
-
-				struct rtgui_event_command ecmd;
-				RTGUI_EVENT_COMMAND_INIT(&ecmd);
-				ecmd.command_id = TOUCH_WIN_CLOSE;
-
-				/* calculate calibrated data */
-				if (calibration_ptr->data.max_x > calibration_ptr->data.min_x)
-					w = calibration_ptr->data.max_x - calibration_ptr->data.min_x;
-				else
-					w = calibration_ptr->data.min_x - calibration_ptr->data.max_x;
-				w = (w/(calibration_ptr->width - 2 * CALIBRATION_WIDTH)) * CALIBRATION_WIDTH;
-
-				if (calibration_ptr->data.max_y > calibration_ptr->data.min_y)
-					h = calibration_ptr->data.max_y - calibration_ptr->data.min_y;
-				else
-					h = calibration_ptr->data.min_y - calibration_ptr->data.max_y;
-				h = (h/(calibration_ptr->height - 2 * CALIBRATION_HEIGHT)) * CALIBRATION_HEIGHT;
-
-				rt_kprintf("w: %d, h: %d\n", w, h);
-
-				if (calibration_ptr->data.max_x > calibration_ptr->data.min_x)
-				{
-					calibration_ptr->data.min_x -= w;
-					calibration_ptr->data.max_x += w;
-				}
-				else
-				{
-					calibration_ptr->data.min_x += w;
-					calibration_ptr->data.max_x -= w;
-				}
-
-				if (calibration_ptr->data.max_y > calibration_ptr->data.min_y)
-				{
-					calibration_ptr->data.min_y -= h;
-					calibration_ptr->data.max_y += h;
-				}
-				else
-				{
-					calibration_ptr->data.min_y += h;
-					calibration_ptr->data.max_y -= h;
-				}
-
-				rt_kprintf("calibration data: (%d, %d), (%d, %d)\n",
-					calibration_ptr->data.min_x,
-					calibration_ptr->data.max_x,
-					calibration_ptr->data.min_y,
-					calibration_ptr->data.max_y);
-				rtgui_thread_send(calibration_ptr->tid, &ecmd.parent, sizeof(struct rtgui_event_command));
-			}
-			return;
-		}
-
-		calibration_ptr->step ++;
-
-		/* post command event */
-		{
-			struct rtgui_event_command ecmd;
-			RTGUI_EVENT_COMMAND_INIT(&ecmd);
-			ecmd.command_id = TOUCH_WIN_UPDATE;
-
-			rtgui_thread_send(calibration_ptr->tid, &ecmd.parent, sizeof(struct rtgui_event_command));
-		}
-	}
-}
-
-rt_bool_t calibration_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
-{
-	switch (event->type)
-	{
-	case RTGUI_EVENT_PAINT:
-	{
-		struct rtgui_dc* dc;
-		struct rtgui_rect rect;
-
-		dc = rtgui_dc_begin_drawing(widget);
-		if (dc == RT_NULL) break;
-
-		/* get rect information */
-		rtgui_widget_get_rect(widget, &rect);
-
-		/* clear whole window */
-		RTGUI_WIDGET_BACKGROUND(widget) = white;
-		rtgui_dc_fill_rect(dc, &rect);
-
-		/* reset color */
-		RTGUI_WIDGET_BACKGROUND(widget) = green;
-		RTGUI_WIDGET_FOREGROUND(widget) = black;
-
-		switch (calibration_ptr->step)
-		{
-			case CALIBRATION_STEP_LEFTTOP:
-				rtgui_dc_draw_hline(dc, 0, 2 * CALIBRATION_WIDTH, CALIBRATION_HEIGHT);
-				rtgui_dc_draw_vline(dc, CALIBRATION_WIDTH, 0, 2 * CALIBRATION_HEIGHT);
-				RTGUI_WIDGET_FOREGROUND(widget) = red;
-				rtgui_dc_fill_circle(dc, CALIBRATION_WIDTH, CALIBRATION_HEIGHT, 4);
-				break;
-
-			case CALIBRATION_STEP_RIGHTTOP:
-				rtgui_dc_draw_hline(dc, calibration_ptr->width - 2 * CALIBRATION_WIDTH,
-					calibration_ptr->width, CALIBRATION_HEIGHT);
-				rtgui_dc_draw_vline(dc, calibration_ptr->width - CALIBRATION_WIDTH, 0, 2 * CALIBRATION_HEIGHT);
-				RTGUI_WIDGET_FOREGROUND(widget) = red;
-				rtgui_dc_fill_circle(dc, calibration_ptr->width - CALIBRATION_WIDTH, CALIBRATION_HEIGHT, 4);
-				break;
-
-			case CALIBRATION_STEP_LEFTBOTTOM:
-				rtgui_dc_draw_hline(dc, 0, 2 * CALIBRATION_WIDTH, calibration_ptr->height - CALIBRATION_HEIGHT);
-				rtgui_dc_draw_vline(dc, CALIBRATION_WIDTH, calibration_ptr->height - 2 * CALIBRATION_HEIGHT, calibration_ptr->height);
-				RTGUI_WIDGET_FOREGROUND(widget) = red;
-				rtgui_dc_fill_circle(dc, CALIBRATION_WIDTH, calibration_ptr->height - CALIBRATION_HEIGHT, 4);
-				break;
-
-			case CALIBRATION_STEP_RIGHTBOTTOM:
-				rtgui_dc_draw_hline(dc, calibration_ptr->width - 2 * CALIBRATION_WIDTH,
-					calibration_ptr->width, calibration_ptr->height - CALIBRATION_HEIGHT);
-				rtgui_dc_draw_vline(dc, calibration_ptr->width - CALIBRATION_WIDTH, calibration_ptr->height - 2 * CALIBRATION_HEIGHT, calibration_ptr->height);
-				RTGUI_WIDGET_FOREGROUND(widget) = red;
-				rtgui_dc_fill_circle(dc, calibration_ptr->width - CALIBRATION_WIDTH, calibration_ptr->height - CALIBRATION_HEIGHT, 4);
-				break;
-
-			case CALIBRATION_STEP_CENTER:
-				rtgui_dc_draw_hline(dc, calibration_ptr->width/2 - CALIBRATION_WIDTH, calibration_ptr->width/2 + CALIBRATION_WIDTH, calibration_ptr->height/2);
-				rtgui_dc_draw_vline(dc, calibration_ptr->width/2, calibration_ptr->height/2 - CALIBRATION_HEIGHT, calibration_ptr->height/2 + CALIBRATION_HEIGHT);
-				RTGUI_WIDGET_FOREGROUND(widget) = red;
-				rtgui_dc_fill_circle(dc, calibration_ptr->width/2, calibration_ptr->height/2, 4);
-				break;
-		}
-		rtgui_dc_end_drawing(dc);
-	}
-		break;
-
-	case RTGUI_EVENT_COMMAND:
-		{
-			struct rtgui_event_command* ecmd = (struct rtgui_event_command*)event;
-
-			switch (ecmd->command_id)
-			{
-			case TOUCH_WIN_UPDATE:
-				rtgui_widget_update(widget);
-				break;
-			case TOUCH_WIN_CLOSE:
-				rtgui_win_close(RTGUI_WIN(widget));
-				break;
-			}
-		}
-		return RT_TRUE;
-
-	default:
-		rtgui_win_event_handler(widget, event);
-	}
-
-	return RT_FALSE;
-}
-
-void calibration_entry(void* parameter)
-{
-	rt_mq_t mq;
-	rtgui_win_t* win;
-	struct rtgui_rect rect;
-
-	mq = rt_mq_create("cali", 40, 8, RT_IPC_FLAG_FIFO);
-	if (mq == RT_NULL) return;
-
-	rtgui_thread_register(rt_thread_self(), mq);
-
-	rtgui_graphic_driver_get_rect(rtgui_graphic_driver_get_default(), &rect);
-
-	/* set screen rect */
-	calibration_ptr->width = rect.x2;
-	calibration_ptr->height = rect.y2;
-
-	/* create calibration window */
-	win = rtgui_win_create(RT_NULL,
-		"calibration", &rect, RTGUI_WIN_STYLE_NO_TITLE | RTGUI_WIN_STYLE_NO_BORDER);
-	rtgui_widget_set_event_handler(RTGUI_WIDGET(win), calibration_event_handler);
-	if (win != RT_NULL)
-	{
-		rtgui_win_show(win, RT_FALSE);
-		// rtgui_widget_update(RTGUI_WIDGET(win));
-		rtgui_win_event_loop(win);
-	}
-
-	rtgui_thread_deregister(rt_thread_self());
-	rt_mq_delete(mq);
-
-	/* set calibration data */
-	rt_device_control(calibration_ptr->device, RT_TOUCH_CALIBRATION_DATA, &calibration_ptr->data);
-
-	/* recover to normal */
-	rt_device_control(calibration_ptr->device, RT_TOUCH_NORMAL, RT_NULL);
-
-	/* release memory */
-	rt_free(calibration_ptr);
-	calibration_ptr = RT_NULL;
-}
-
-void calibration_init()
-{
-	rt_device_t device;
-
-	device = rt_device_find("touch");
-	if (device == RT_NULL) return; /* no this device */
-
-	calibration_ptr = (struct calibration_session*)rt_malloc(sizeof(struct calibration_session));
-	rt_memset(calibration_ptr, 0, sizeof(struct calibration_data));
-	calibration_ptr->device = device;
-
-	rt_device_control(calibration_ptr->device, RT_TOUCH_CALIBRATION, (void*)calibration_data_post);
-
-	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);
-}
-
-#ifdef RT_USING_FINSH
-#include <finsh.h>
-void calibration()
-{
-	calibration_init();
-}
-FINSH_FUNCTION_EXPORT(calibration, perform touch calibration);
-#endif