NuMaker emWin HMI

Committer:
csyang2
Date:
Mon Mar 04 15:47:41 2024 +0800
Revision:
10:c8165817d92a
Parent:
9:1286ec7f3230
Support NuMaker-IoT-M467

Who changed what in which revision?

UserRevisionLine numberNew contents of line
csyang2 1:c0f972361605 1 /*
csyang2 1:c0f972361605 2 * tslib/src/ts_getxy.c
csyang2 1:c0f972361605 3 *
csyang2 1:c0f972361605 4 * Copyright (C) 2001 Russell King.
csyang2 1:c0f972361605 5 *
csyang2 1:c0f972361605 6 * This file is placed under the GPL. Please see the file
csyang2 1:c0f972361605 7 * COPYING for more details.
csyang2 1:c0f972361605 8 *
csyang2 1:c0f972361605 9 * $Id: testutils.c,v 1.2 2004/10/19 22:01:27 dlowder Exp $
csyang2 1:c0f972361605 10 *
csyang2 1:c0f972361605 11 * Waits for the screen to be touched, averages x and y sample
csyang2 1:c0f972361605 12 * coordinates until the end of contact
csyang2 1:c0f972361605 13 */
csyang2 9:1286ec7f3230 14 #if 0
csyang2 1:c0f972361605 15 //#include "config.h"
csyang2 1:c0f972361605 16 #include <stdio.h>
csyang2 1:c0f972361605 17 #include <stdlib.h>
csyang2 1:c0f972361605 18 //#include <unistd.h>
csyang2 1:c0f972361605 19 //#include <sys/time.h>
csyang2 1:c0f972361605 20 //#include "wbio.h"
csyang2 1:c0f972361605 21 //#include "wbtypes.h"
csyang2 1:c0f972361605 22 //#include "wblib.h"
csyang2 1:c0f972361605 23 #include "tslib.h"
csyang2 1:c0f972361605 24 #include "fbutils.h"
csyang2 6:d15151941247 25 #include "TouchPanel.h"
csyang2 1:c0f972361605 26 #include "GUI.h"
csyang2 1:c0f972361605 27
csyang2 1:c0f972361605 28 static int sort_by_x(const void* a, const void *b)
csyang2 1:c0f972361605 29 {
csyang2 1:c0f972361605 30 return (((struct ts_sample *)a)->x - ((struct ts_sample *)b)->x);
csyang2 1:c0f972361605 31 }
csyang2 1:c0f972361605 32
csyang2 1:c0f972361605 33 static int sort_by_y(const void* a, const void *b)
csyang2 1:c0f972361605 34 {
csyang2 1:c0f972361605 35 return (((struct ts_sample *)a)->y - ((struct ts_sample *)b)->y);
csyang2 1:c0f972361605 36 }
csyang2 1:c0f972361605 37
csyang2 1:c0f972361605 38 void getxy(int *x, int *y)
csyang2 1:c0f972361605 39 {
csyang2 1:c0f972361605 40 #define MAX_SAMPLES 128
csyang2 1:c0f972361605 41 struct ts_sample samp[MAX_SAMPLES];
csyang2 1:c0f972361605 42 int index, middle;
csyang2 1:c0f972361605 43 int sumx, sumy;
csyang2 1:c0f972361605 44
csyang2 1:c0f972361605 45 printf("getxy\n");
csyang2 1:c0f972361605 46 again:
csyang2 1:c0f972361605 47 do
csyang2 1:c0f972361605 48 {
csyang2 1:c0f972361605 49 if ( Read_TouchPanel(&sumx, &sumy) > 0 )
csyang2 1:c0f972361605 50 {
csyang2 1:c0f972361605 51 if ( (sumx < 0) || ( sumy < 0 ) )
csyang2 1:c0f972361605 52 continue;
csyang2 1:c0f972361605 53 break;
csyang2 1:c0f972361605 54 }
csyang2 1:c0f972361605 55 }
csyang2 1:c0f972361605 56 while (1);
csyang2 1:c0f972361605 57
csyang2 1:c0f972361605 58 /* Now collect up to MAX_SAMPLES touches into the samp array. */
csyang2 1:c0f972361605 59 index = 0;
csyang2 1:c0f972361605 60 do
csyang2 1:c0f972361605 61 {
csyang2 1:c0f972361605 62 if (index < MAX_SAMPLES-1)
csyang2 1:c0f972361605 63 index++;
csyang2 1:c0f972361605 64 if ( Read_TouchPanel(&sumx, &sumy) > 0)
csyang2 1:c0f972361605 65 {
csyang2 1:c0f972361605 66 samp[index].x = sumx;
csyang2 1:c0f972361605 67 samp[index].y = sumy;
csyang2 1:c0f972361605 68 samp[index].pressure = 1000;
csyang2 1:c0f972361605 69 }
csyang2 1:c0f972361605 70 else
csyang2 1:c0f972361605 71 {
csyang2 1:c0f972361605 72 samp[index].x = samp[index-1].x;
csyang2 1:c0f972361605 73 samp[index].y = samp[index-1].y;
csyang2 1:c0f972361605 74 samp[index].pressure = 0;
csyang2 1:c0f972361605 75 }
csyang2 1:c0f972361605 76
csyang2 1:c0f972361605 77 // printf("%d %d %d\n", samp[index].x, samp[index].y , samp[index].pressure);
csyang2 1:c0f972361605 78 }
csyang2 1:c0f972361605 79 while (samp[index].pressure > 0);
csyang2 1:c0f972361605 80 //printf("Took %d samples...\n",index);
csyang2 1:c0f972361605 81
csyang2 1:c0f972361605 82 /*
csyang2 1:c0f972361605 83 * At this point, we have samples in indices zero to (index-1)
csyang2 1:c0f972361605 84 * which means that we have (index) number of samples. We want
csyang2 1:c0f972361605 85 * to calculate the median of the samples so that wild outliers
csyang2 1:c0f972361605 86 * don't skew the result. First off, let's assume that arrays
csyang2 1:c0f972361605 87 * are one-based instead of zero-based. If this were the case
csyang2 1:c0f972361605 88 * and index was odd, we would need sample number ((index+1)/2)
csyang2 1:c0f972361605 89 * of a sorted array; if index was even, we would need the
csyang2 1:c0f972361605 90 * average of sample number (index/2) and sample number
csyang2 1:c0f972361605 91 * ((index/2)+1). To turn this into something useful for the
csyang2 1:c0f972361605 92 * real world, we just need to subtract one off of the sample
csyang2 1:c0f972361605 93 * numbers. So for when index is odd, we need sample number
csyang2 1:c0f972361605 94 * (((index+1)/2)-1). Due to integer division truncation, we
csyang2 1:c0f972361605 95 * can simplify this to just (index/2). When index is even, we
csyang2 1:c0f972361605 96 * need the average of sample number ((index/2)-1) and sample
csyang2 1:c0f972361605 97 * number (index/2). Calculate (index/2) now and we'll handle
csyang2 1:c0f972361605 98 * the even odd stuff after we sort.
csyang2 1:c0f972361605 99 */
csyang2 1:c0f972361605 100 middle = index/2;
csyang2 1:c0f972361605 101 if (x)
csyang2 1:c0f972361605 102 {
csyang2 1:c0f972361605 103 qsort(samp, index, sizeof(struct ts_sample), sort_by_x);
csyang2 1:c0f972361605 104 if (index & 1)
csyang2 1:c0f972361605 105 *x = samp[middle].x;
csyang2 1:c0f972361605 106 else
csyang2 1:c0f972361605 107 *x = (samp[middle-1].x + samp[middle].x) / 2;
csyang2 1:c0f972361605 108 }
csyang2 1:c0f972361605 109 if (y)
csyang2 1:c0f972361605 110 {
csyang2 1:c0f972361605 111 qsort(samp, index, sizeof(struct ts_sample), sort_by_y);
csyang2 1:c0f972361605 112 if (index & 1)
csyang2 1:c0f972361605 113 *y = samp[middle].y;
csyang2 1:c0f972361605 114 else
csyang2 1:c0f972361605 115 *y = (samp[middle-1].y + samp[middle].y) / 2;
csyang2 1:c0f972361605 116 }
csyang2 1:c0f972361605 117 if ( (index <= 3) || ( *x < 0) || ( *y < 0 ) )
csyang2 1:c0f972361605 118 goto again;
csyang2 1:c0f972361605 119 }
csyang2 1:c0f972361605 120
csyang2 1:c0f972361605 121 extern int ts_phy2log(int *sumx, int *sumy);
csyang2 1:c0f972361605 122
csyang2 1:c0f972361605 123 static int palette [] =
csyang2 1:c0f972361605 124 {
csyang2 1:c0f972361605 125 /*0x000000, 0xffe080, 0xffffff, 0xe0c0a0, 0x304050, 0x80b8c0*/
csyang2 1:c0f972361605 126 GUI_MAKE_COLOR(0x000000), GUI_MAKE_COLOR(0x80e0ff), GUI_MAKE_COLOR(0xffffff), GUI_MAKE_COLOR(0xa0c0e0), GUI_MAKE_COLOR(0x504030), GUI_MAKE_COLOR(0xc0b880),
csyang2 1:c0f972361605 127 GUI_MAKE_COLOR(0x7F1F00), GUI_MAKE_COLOR(0x20201F), GUI_MAKE_COLOR(0x5F3F1F), GUI_MAKE_COLOR(0xAFBFCF), GUI_MAKE_COLOR(0xF080D0), GUI_MAKE_COLOR(0x3F477F),
csyang2 1:c0f972361605 128 GUI_MAKE_COLOR(0x207820)
csyang2 1:c0f972361605 129 };
csyang2 1:c0f972361605 130 #define NR_COLORS (sizeof (palette) / sizeof (palette [0]))
csyang2 1:c0f972361605 131
csyang2 1:c0f972361605 132 #define NR_BUTTONS 3
csyang2 1:c0f972361605 133 struct ts_button
csyang2 1:c0f972361605 134 {
csyang2 1:c0f972361605 135 int x, y, w, h;
csyang2 1:c0f972361605 136 char *text;
csyang2 1:c0f972361605 137 int flags;
csyang2 1:c0f972361605 138 #define BUTTON_ACTIVE 0x00000001
csyang2 1:c0f972361605 139 };
csyang2 1:c0f972361605 140 static struct ts_button buttons [NR_BUTTONS];
csyang2 1:c0f972361605 141
csyang2 1:c0f972361605 142 /* [inactive] border fill text [active] border fill text */
csyang2 1:c0f972361605 143 static int button_palette [6] =
csyang2 1:c0f972361605 144 {
csyang2 1:c0f972361605 145 1, 4, 2,
csyang2 1:c0f972361605 146 1, 5, 0
csyang2 1:c0f972361605 147 };
csyang2 1:c0f972361605 148
csyang2 1:c0f972361605 149 void button_draw (struct ts_button *button)
csyang2 1:c0f972361605 150 {
csyang2 1:c0f972361605 151 int s = (button->flags & BUTTON_ACTIVE) ? 3 : 0;
csyang2 1:c0f972361605 152
csyang2 1:c0f972361605 153 rect(button->x, button->y, button->x + button->w,
csyang2 1:c0f972361605 154 button->y + button->h, button_palette [s]);
csyang2 1:c0f972361605 155 fillrect(button->x + 1, button->y + 1,
csyang2 1:c0f972361605 156 button->x + button->w - 2,
csyang2 1:c0f972361605 157 button->y + button->h - 2, button_palette [s + 1]);
csyang2 1:c0f972361605 158 // put_string_center(button->x + button->w / 2,
csyang2 1:c0f972361605 159 // button->y + button->h / 2,
csyang2 1:c0f972361605 160 // button->text, button_palette [s + 2]);
csyang2 1:c0f972361605 161
csyang2 1:c0f972361605 162 GUI_SetColor(palette[button_palette [s + 2]]);
csyang2 1:c0f972361605 163 GUI_DispStringHCenterAt(button->text, button->x + button->w / 2, button->y + button->h / 2);
csyang2 1:c0f972361605 164 }
csyang2 1:c0f972361605 165
csyang2 1:c0f972361605 166 int button_handle (struct ts_button *button, int x, int y, unsigned int p)
csyang2 1:c0f972361605 167 {
csyang2 1:c0f972361605 168 int inside = (x >= button->x) && (y >= button->y) &&
csyang2 1:c0f972361605 169 (x < button->x + button->w) &&
csyang2 1:c0f972361605 170 (y < button->y + button->h);
csyang2 1:c0f972361605 171
csyang2 1:c0f972361605 172 if (p > 0)
csyang2 1:c0f972361605 173 {
csyang2 1:c0f972361605 174 if (inside)
csyang2 1:c0f972361605 175 {
csyang2 1:c0f972361605 176 if (!(button->flags & BUTTON_ACTIVE))
csyang2 1:c0f972361605 177 {
csyang2 1:c0f972361605 178 button->flags |= BUTTON_ACTIVE;
csyang2 1:c0f972361605 179 button_draw (button);
csyang2 1:c0f972361605 180 }
csyang2 1:c0f972361605 181 }
csyang2 1:c0f972361605 182 else if (button->flags & BUTTON_ACTIVE)
csyang2 1:c0f972361605 183 {
csyang2 1:c0f972361605 184 button->flags &= ~BUTTON_ACTIVE;
csyang2 1:c0f972361605 185 button_draw (button);
csyang2 1:c0f972361605 186 }
csyang2 1:c0f972361605 187 }
csyang2 1:c0f972361605 188 else if (button->flags & BUTTON_ACTIVE)
csyang2 1:c0f972361605 189 {
csyang2 1:c0f972361605 190 button->flags &= ~BUTTON_ACTIVE;
csyang2 1:c0f972361605 191 button_draw (button);
csyang2 1:c0f972361605 192 return 1;
csyang2 1:c0f972361605 193 }
csyang2 1:c0f972361605 194
csyang2 1:c0f972361605 195 return 0;
csyang2 1:c0f972361605 196 }
csyang2 1:c0f972361605 197
csyang2 1:c0f972361605 198 static void refresh_screen(void)
csyang2 1:c0f972361605 199 {
csyang2 1:c0f972361605 200 int i;
csyang2 1:c0f972361605 201
csyang2 1:c0f972361605 202 // fillrect (0, 0, xres - 1, yres - 1, 0);
csyang2 1:c0f972361605 203 GUI_Clear();
csyang2 1:c0f972361605 204 // put_string_center (xres/2, yres/4, "Touchscreen test program", 1);
csyang2 1:c0f972361605 205 // put_string_center (xres/2, yres/4+20,"Touch screen to move crosshair", 2);
csyang2 1:c0f972361605 206
csyang2 1:c0f972361605 207 GUI_SetColor(palette[1]);
csyang2 1:c0f972361605 208 GUI_DispStringHCenterAt("Touchscreen test program", xres / 2, yres / 4);
csyang2 1:c0f972361605 209
csyang2 1:c0f972361605 210 GUI_SetColor(palette[2]);
csyang2 1:c0f972361605 211 GUI_DispStringHCenterAt("Touch screen to move crosshair", xres / 2, yres / 4 + 20);
csyang2 1:c0f972361605 212
csyang2 1:c0f972361605 213 for (i = 0; i < NR_BUTTONS; i++)
csyang2 1:c0f972361605 214 button_draw (&buttons [i]);
csyang2 1:c0f972361605 215 }
csyang2 1:c0f972361605 216
csyang2 1:c0f972361605 217 int ts_test(int xsize, int ysize)
csyang2 1:c0f972361605 218 {
csyang2 1:c0f972361605 219 int sumx, sumy;
csyang2 1:c0f972361605 220 int x, y;
csyang2 1:c0f972361605 221 unsigned int i;
csyang2 1:c0f972361605 222 unsigned int mode = 0;
csyang2 1:c0f972361605 223 int quit_pressed = 0;
csyang2 1:c0f972361605 224
csyang2 1:c0f972361605 225 xres = xsize;
csyang2 1:c0f972361605 226 yres = ysize;
csyang2 1:c0f972361605 227
csyang2 1:c0f972361605 228 x = xres/2;
csyang2 1:c0f972361605 229 y = yres/2;
csyang2 1:c0f972361605 230
csyang2 1:c0f972361605 231 for (i = 0; i < NR_COLORS; i++)
csyang2 1:c0f972361605 232 setcolor (i, palette [i]);
csyang2 1:c0f972361605 233
csyang2 1:c0f972361605 234 /* Initialize buttons */
csyang2 1:c0f972361605 235 //memset (&buttons, 0, sizeof (buttons));
csyang2 1:c0f972361605 236 buttons [0].w = buttons [1].w = buttons [2].w = xres / 4;
csyang2 1:c0f972361605 237 buttons [0].h = buttons [1].h = buttons [2].h = 20;
csyang2 1:c0f972361605 238 buttons [0].x = 0;
csyang2 1:c0f972361605 239 buttons [1].x = (3 * xres) / 8;
csyang2 1:c0f972361605 240 buttons [2].x = (3 * xres) / 4 - 1;
csyang2 1:c0f972361605 241 buttons [0].y = buttons [1].y = buttons [2].y = 10;
csyang2 1:c0f972361605 242 buttons [0].text = "Drag";
csyang2 1:c0f972361605 243 buttons [1].text = "Draw";
csyang2 1:c0f972361605 244 buttons [2].text = "Quit";
csyang2 1:c0f972361605 245
csyang2 1:c0f972361605 246 refresh_screen ();
csyang2 1:c0f972361605 247
csyang2 1:c0f972361605 248 while (1)
csyang2 1:c0f972361605 249 {
csyang2 1:c0f972361605 250 struct ts_sample samp;
csyang2 1:c0f972361605 251
csyang2 1:c0f972361605 252 /* Show the cross */
csyang2 1:c0f972361605 253 if ((mode & 15) != 1)
csyang2 1:c0f972361605 254 put_cross(x, y, 2 | XORMODE);
csyang2 1:c0f972361605 255
csyang2 1:c0f972361605 256 if ( Read_TouchPanel(&sumx, &sumy) > 0)
csyang2 1:c0f972361605 257 {
csyang2 1:c0f972361605 258 ts_phy2log(&sumx, &sumy);
csyang2 1:c0f972361605 259 samp.x = sumx;
csyang2 1:c0f972361605 260 samp.y = sumy;
csyang2 1:c0f972361605 261 samp.pressure = 1000;
csyang2 1:c0f972361605 262 }
csyang2 1:c0f972361605 263 else
csyang2 1:c0f972361605 264 {
csyang2 1:c0f972361605 265 samp.x = x;
csyang2 1:c0f972361605 266 samp.y = y;
csyang2 1:c0f972361605 267 samp.pressure = 0;
csyang2 1:c0f972361605 268 }
csyang2 1:c0f972361605 269 GUI_Delay(30);
csyang2 1:c0f972361605 270
csyang2 1:c0f972361605 271 /* Hide it */
csyang2 1:c0f972361605 272 if ((mode & 15) != 1)
csyang2 1:c0f972361605 273 put_cross(x, y, 2 | XORMODE);
csyang2 1:c0f972361605 274
csyang2 1:c0f972361605 275 for (i = 0; i < NR_BUTTONS; i++)
csyang2 1:c0f972361605 276 if (button_handle(&buttons [i], samp.x, samp.y, samp.pressure))
csyang2 1:c0f972361605 277 switch (i)
csyang2 1:c0f972361605 278 {
csyang2 1:c0f972361605 279 case 0:
csyang2 1:c0f972361605 280 mode = 0;
csyang2 1:c0f972361605 281 refresh_screen ();
csyang2 1:c0f972361605 282 break;
csyang2 1:c0f972361605 283 case 1:
csyang2 1:c0f972361605 284 mode = 1;
csyang2 1:c0f972361605 285 refresh_screen ();
csyang2 1:c0f972361605 286 break;
csyang2 1:c0f972361605 287 case 2:
csyang2 1:c0f972361605 288 quit_pressed = 1;
csyang2 1:c0f972361605 289 }
csyang2 1:c0f972361605 290
csyang2 1:c0f972361605 291 if (samp.pressure > 0)
csyang2 1:c0f972361605 292 {
csyang2 1:c0f972361605 293 if (mode == 0x80000001)
csyang2 1:c0f972361605 294 line (x, y, samp.x, samp.y, 2);
csyang2 1:c0f972361605 295 //pixel(x, y, 2);
csyang2 1:c0f972361605 296 x = samp.x;
csyang2 1:c0f972361605 297 y = samp.y;
csyang2 1:c0f972361605 298 mode |= 0x80000000;
csyang2 1:c0f972361605 299 }
csyang2 1:c0f972361605 300 else
csyang2 1:c0f972361605 301 mode &= ~0x80000000;
csyang2 1:c0f972361605 302 if (quit_pressed)
csyang2 1:c0f972361605 303 break;
csyang2 1:c0f972361605 304 }
csyang2 1:c0f972361605 305 // fillrect(0, 0, xres - 1, yres - 1, 0);
csyang2 1:c0f972361605 306 GUI_Clear();
csyang2 1:c0f972361605 307
csyang2 1:c0f972361605 308 return 0;
csyang2 1:c0f972361605 309 }
csyang2 9:1286ec7f3230 310 #endif