source: rtems/c/src/lib/libbsp/arm/nds/touchscreen/reco.c @ 311dfa6

4.104.114.95
Last change on this file since 311dfa6 was 311dfa6, checked in by Joel Sherrill <joel.sherrill@…>, on 04/16/08 at 18:37:33

2008-04-16 Matthieu Bucchianeri <mbucchia@…>

  • ChangeLog?, Makefile.am, README, bsp_specs, configure.ac, mk_libnds.sh, patch.libnds, preinstall.am, block/block.c, clock/clock.c, console/console.c, coproc/coproc.S, coproc/coproc.c, coproc/coproc.ld, dswifi/dswifi_license.txt, dswifi/makefile, dswifi/arm7/makefile, dswifi/arm7/source/wifi_arm7.c, dswifi/arm7/source/wifi_arm7.h, dswifi/arm9/makefile, dswifi/arm9/source/sgIP.c, dswifi/arm9/source/sgIP.h, dswifi/arm9/source/sgIP_ARP.c, dswifi/arm9/source/sgIP_ARP.h, dswifi/arm9/source/sgIP_Config.h, dswifi/arm9/source/sgIP_DHCP.c, dswifi/arm9/source/sgIP_DHCP.h, dswifi/arm9/source/sgIP_DNS.c, dswifi/arm9/source/sgIP_DNS.h, dswifi/arm9/source/sgIP_Hub.c, dswifi/arm9/source/sgIP_Hub.h, dswifi/arm9/source/sgIP_ICMP.c, dswifi/arm9/source/sgIP_ICMP.h, dswifi/arm9/source/sgIP_IP.c, dswifi/arm9/source/sgIP_IP.h, dswifi/arm9/source/sgIP_TCP.c, dswifi/arm9/source/sgIP_TCP.h, dswifi/arm9/source/sgIP_UDP.c, dswifi/arm9/source/sgIP_UDP.h, dswifi/arm9/source/sgIP_memblock.c, dswifi/arm9/source/sgIP_memblock.h, dswifi/arm9/source/sgIP_sockets.c, dswifi/arm9/source/sgIP_sockets.h, dswifi/arm9/source/wifi_arm9.c, dswifi/arm9/source/wifi_arm9.h, dswifi/common/source/dsregs.h, dswifi/common/source/spinlock.h, dswifi/common/source/spinlock.s, dswifi/common/source/wifi_shared.h, dswifi/include/dswifi7.h, dswifi/include/dswifi9.h, dswifi/include/dswifi_version.h, dswifi/include/netdb.h, dswifi/include/sgIP_errno.h, dswifi/include/netinet/in.h, fb/fb.c, fb/fb.h, include/bsp.h, include/my_ipc.h, include/tm27.h, include/types.h, include/sys/iosupport.h, irq/irq.c, irq/irq.h, libfat/gba/include/fat.h, libfat/include/fat.h, libfat/nds/include/fat.h, libfat/source/bit_ops.h, libfat/source/cache.c, libfat/source/cache.h, libfat/source/common.h, libfat/source/directory.c, libfat/source/directory.h, libfat/source/fatdir.c, libfat/source/fatdir.h, libfat/source/fatfile.c, libfat/source/fatfile.h, libfat/source/file_allocation_table.c, libfat/source/file_allocation_table.h, libfat/source/filetime.c, libfat/source/filetime.h, libfat/source/libfat.c, libfat/source/mem_allocate.h, libfat/source/partition.c, libfat/source/partition.h, libfat/source/disc_io/disc.c, libfat/source/disc_io/disc.h, libfat/source/disc_io/disc_io.h, libfat/source/disc_io/io_cf_common.c, libfat/source/disc_io/io_cf_common.h, libfat/source/disc_io/io_dldi.h, libfat/source/disc_io/io_dldi.s, libfat/source/disc_io/io_efa2.c, libfat/source/disc_io/io_efa2.h, libfat/source/disc_io/io_fcsr.c, libfat/source/disc_io/io_fcsr.h, libfat/source/disc_io/io_m3_common.c, libfat/source/disc_io/io_m3_common.h, libfat/source/disc_io/io_m3cf.c, libfat/source/disc_io/io_m3cf.h, libfat/source/disc_io/io_m3sd.c, libfat/source/disc_io/io_m3sd.h, libfat/source/disc_io/io_mpcf.c, libfat/source/disc_io/io_mpcf.h, libfat/source/disc_io/io_njsd.c, libfat/source/disc_io/io_njsd.h, libfat/source/disc_io/io_nmmc.c, libfat/source/disc_io/io_nmmc.h, libfat/source/disc_io/io_sc_common.c, libfat/source/disc_io/io_sc_common.h, libfat/source/disc_io/io_sccf.c, libfat/source/disc_io/io_sccf.h, libfat/source/disc_io/io_scsd.c, libfat/source/disc_io/io_scsd.h, libfat/source/disc_io/io_scsd_s.s, libfat/source/disc_io/io_sd_common.c, libfat/source/disc_io/io_sd_common.h, libnds/Makefile.arm7, libnds/Makefile.arm9, libnds/libnds_license.txt, libnds/basicARM7/source/defaultARM7.c, libnds/include/default_font_bin.h, libnds/include/gbfs.h, libnds/include/nds.h, libnds/include/nds/bios.h, libnds/include/nds/card.h, libnds/include/nds/dma.h, libnds/include/nds/interrupts.h, libnds/include/nds/ipc.h, libnds/include/nds/jtypes.h, libnds/include/nds/memory.h, libnds/include/nds/registers_alt.h, libnds/include/nds/reload.h, libnds/include/nds/system.h, libnds/include/nds/timers.h, libnds/include/nds/arm7/audio.h, libnds/include/nds/arm7/clock.h, libnds/include/nds/arm7/serial.h, libnds/include/nds/arm7/touch.h, libnds/include/nds/arm9/background.h, libnds/include/nds/arm9/boxtest.h, libnds/include/nds/arm9/cache.h, libnds/include/nds/arm9/console.h, libnds/include/nds/arm9/exceptions.h, libnds/include/nds/arm9/image.h, libnds/include/nds/arm9/input.h, libnds/include/nds/arm9/math.h, libnds/include/nds/arm9/ndsmotion.h, libnds/include/nds/arm9/pcx.h, libnds/include/nds/arm9/postest.h, libnds/include/nds/arm9/rumble.h, libnds/include/nds/arm9/sound.h, libnds/include/nds/arm9/sprite.h, libnds/include/nds/arm9/trig_lut.h, libnds/include/nds/arm9/video.h, libnds/include/nds/arm9/videoGL.h, libnds/source/arm7/audio.c, libnds/source/arm7/clock.c, libnds/source/arm7/microphone.c, libnds/source/arm7/spi.c, libnds/source/arm7/touch.c, libnds/source/arm7/userSettings.c, libnds/source/arm9/COS.bin, libnds/source/arm9/COS.s, libnds/source/arm9/SIN.bin, libnds/source/arm9/SIN.s, libnds/source/arm9/TAN.bin, libnds/source/arm9/TAN.s, libnds/source/arm9/boxtest.c, libnds/source/arm9/console.c, libnds/source/arm9/dcache.s, libnds/source/arm9/default_font.bin, libnds/source/arm9/default_font.s, libnds/source/arm9/exceptionHandler.S, libnds/source/arm9/exceptionHandler.s, libnds/source/arm9/exceptions.c, libnds/source/arm9/gurumeditation.c, libnds/source/arm9/icache.s, libnds/source/arm9/image.c, libnds/source/arm9/initSystem.c, libnds/source/arm9/keys.c, libnds/source/arm9/ndsmotion.c, libnds/source/arm9/pcx.c, libnds/source/arm9/rumble.c, libnds/source/arm9/sound.c, libnds/source/arm9/system.c, libnds/source/arm9/touch.c, libnds/source/arm9/video.c, libnds/source/arm9/videoGL.c, libnds/source/common/biosCalls.s, libnds/source/common/card.c, libnds/source/common/gbfs.c, libnds/source/common/interruptDispatcher.s, libnds/source/common/interrupts.c, rtc/rtc.c, sound/sound.c, sound/sound.h, start/start.S, startup/linkcmds, startup/start.c, timer/timer.c, tools/Makefile.am, tools/bin2s, tools/bin2s.c, tools/configure.ac, tools/runtest, tools/ndstool/include/arm7_sha1_homebrew.h, tools/ndstool/include/arm7_sha1_nintendo.h, tools/ndstool/include/banner.h, tools/ndstool/include/bigint.h, tools/ndstool/include/crc.h, tools/ndstool/include/default_icon.h, tools/ndstool/include/encryption.h, tools/ndstool/include/header.h, tools/ndstool/include/hook.h, tools/ndstool/include/little.h, tools/ndstool/include/loadme.h, tools/ndstool/include/logo.h, tools/ndstool/include/ndscreate.h, tools/ndstool/include/ndsextract.h, tools/ndstool/include/ndstool.h, tools/ndstool/include/ndstree.h, tools/ndstool/include/overlay.h, tools/ndstool/include/passme.h, tools/ndstool/include/passme_sram.h, tools/ndstool/include/passme_vhd1.h, tools/ndstool/include/passme_vhd2.h, tools/ndstool/include/raster.h, tools/ndstool/include/sha1.h, tools/ndstool/include/types.h, tools/ndstool/source/arm7_sha1_homebrew.c, tools/ndstool/source/arm7_sha1_nintendo.c, tools/ndstool/source/banner.cpp, tools/ndstool/source/bigint.cpp, tools/ndstool/source/compile_date.c, tools/ndstool/source/crc.cpp, tools/ndstool/source/default_icon.c, tools/ndstool/source/encryption.cpp, tools/ndstool/source/header.cpp, tools/ndstool/source/hook.cpp, tools/ndstool/source/loadme.c, tools/ndstool/source/logo.cpp, tools/ndstool/source/ndscodes.cpp, tools/ndstool/source/ndscreate.cpp, tools/ndstool/source/ndsextract.cpp, tools/ndstool/source/ndstool.cpp, tools/ndstool/source/ndstree.cpp, tools/ndstool/source/passme.cpp, tools/ndstool/source/passme_sram.c, tools/ndstool/source/raster.cpp, tools/ndstool/source/sha1.cpp, touchscreen/README.reco, touchscreen/parser.c, touchscreen/reco.c, touchscreen/reco.h, touchscreen/touchscreen.c, touchscreen/touchscreen.h, wifi/compat.c, wifi/compat.h, wifi/wifi.c: New files.
  • Property mode set to 100644
File size: 6.1 KB
Line 
1
2#include <nds.h>
3#include "reco.h"
4
5PA_StylusPosition PA_StylusPos[20000];
6
7PA_RecoValues PA_Reco;
8
9char PA_RecoShape[16];
10
11u8 PA_UseGraffiti = true;
12
13u8 PA_CustomReco = 0; // number of custom shapes
14PA_FormType PA_CustomShape[200];
15
16PA_RecoInfos PA_RecoInfo;
17
18PA_FormType PA_Graffiti[PA_RECOTESTS] = {
19  {' ', "AAAAAAAAAAAAAAA"},
20  {'a', "FGGGGGFB;:;;;;;"},
21  {'b', "JJJJJIGC>:8=<62"},
22  {'c', "01234689;<>?@BC"},
23  {'d', "=995KJIFB?=;853"},
24  {'e', "1236;>@136;=?@A"},
25  {'f', "121111399998779"},
26  {'g', "235689;=@CFIJEA"},
27  {'h', "8999999;HFEA><:"},
28  {'i', "999999999999999"},
29  {'j', "999999998653100"},
30  {'k', "654320NIDCA?==="},
31  {'l', "999999988<AA@@@"},
32  {'m', "HGGEA<;EFDA=;99"},
33  {'n', "HHHIE<;;;<GIHHH"},
34  {'o', "4689;<?BDFHKMO0"},
35  {'p', "<KJIIIHGEB>;853"},
36  {'q', "4679<?CDFHKMJBA"},
37  {'r', "999IIIIGC?:53<="},
38  {'s', "0235:>?>>;73100"},
39  {'t', "AAAA@@@;8999999"},
40  {'u', "899:;<>ACEGHHIH"},
41  {'v', ";;:::::?FGGHHGF"},
42  {'w', "::;=BA<<@CDEFGH"},
43  {'x', ";;;;;;;;;;;;;;;"},
44  {'y', ">;=AFF899974OIF"},
45  {'z', ">A@@>843348?@AA"},
46  {'0', "35789;=AEGHIJKM"},
47  {'1', "CDEFFE988889999"},
48  {'2', "GDB@>:6546>AAAA"},
49  {'3', "CA>833A@=953210"},
50  {'4', "55558>@A@>97778"},
51  {'5', "00037:@@=;7310O"},
52  {'6', "346779;>@CFKN02"},
53  {'7', "AAAAAA@>9655556"},
54  {'8', "37;=;71MIECCGM1"},
55  {'9', "8<@CGL28<<;6311"},
56  {PA_BACKSPACE, "000000000000000"},
57  {PA_ENTER, "555555555555555"},
58  //    {'?', "FCA@><8655799::"},
59  {'.', "LLLLLLLLLLLLLLL"}
60};
61
62
63
64void PA_AddStylusPos(u8 x, u8 y){
65  if (!((x == PA_StylusPos[PA_Reco.nvalues-1].x) && (y == PA_StylusPos[PA_Reco.nvalues-1].y))){
66    PA_StylusPos[PA_Reco.nvalues].x = x;
67    PA_StylusPos[PA_Reco.nvalues].y = y;
68    PA_Reco.nvalues++;
69  }
70}
71
72
73void PA_StylusLine(u8 x1, u8 y1, u8 x2, u8 y2){
74  int i,dx,dy,sdx,sdy,dxabs,dyabs,x,y,px,py;
75
76  dx=x2-x1;      /* the horizontal distance of the line */
77  dy=y2-y1;      /* the vertical distance of the line */
78  dxabs = dx;
79  sdx = 1;
80  if (dx < 0) {
81    dxabs = -dx;
82    sdx = -1;
83  }
84  dyabs = dy;
85  sdy = 1;
86  if (dy < 0) {
87    dyabs = -dy;
88    sdy = -1;
89  }
90
91  x=dyabs>>1;
92  y=dxabs>>1;
93  px=x1;
94  py=y1;
95
96  PA_AddStylusPos(px, py);
97
98
99  if (dxabs>=dyabs) {
100    for(i=0;i<dxabs;i++)  {
101      y+=dyabs;
102      if (y>=dxabs)  {
103        y-=dxabs;
104        py+=sdy;
105      }
106      px+=sdx;
107      PA_AddStylusPos(px, py);
108    }
109  }
110  else {
111    for(i=0;i<dyabs;i++) {
112      x+=dxabs;
113      if (x>=dyabs)  {
114        x-=dyabs;
115        px+=sdx;
116      }
117      py+=sdy;
118      PA_AddStylusPos(px, py);
119    }
120  }
121}
122
123
124#define PA_ShapeAddPoint(i, value){                                     \
125    points[i] = PA_StylusPos[value];                                    \
126    if (points[i].x < PA_RecoInfo.minX) PA_RecoInfo.minX = points[i].x; \
127    else if (points[i].x > PA_RecoInfo.maxX) PA_RecoInfo.maxX = points[i].x; \
128    if (points[i].y < PA_RecoInfo.minY) PA_RecoInfo.minY = points[i].y; \
129    else if (points[i].y > PA_RecoInfo.maxY) PA_RecoInfo.maxY = points[i].y;    }
130
131
132
133
134char PA_AnalyzeShape(void){
135  s32 i;
136  //  for (i = 0; i < 32; i++) PA_OutputSimpleText(1, 0, i, "             ");
137
138  PA_StylusPosition points[17];
139  for (i = 0; i < 16; i++){
140    PA_ShapeAddPoint(i, (PA_Reco.nvalues*i)>>4)
141      }
142  PA_ShapeAddPoint(16, PA_Reco.nvalues-1)
143    //points[16] = PA_StylusPos[PA_Reco.nvalues-1];
144    PA_RecoInfo.endX = PA_StylusPos[PA_Reco.nvalues-1].x; // last values
145  PA_RecoInfo.endY = PA_StylusPos[PA_Reco.nvalues-1].y; // last values
146  PA_RecoInfo.Length = PA_Reco.nvalues; // Total length
147  PA_RecoInfo.Angle = PA_GetAngle(points[0].x, points[0].y, points[16].x, points[16].y);
148
149  //Better values
150  if (PA_RecoInfo.minX > 1) PA_RecoInfo.minX-=2;
151  if (PA_RecoInfo.maxX <254) PA_RecoInfo.maxX+=2;
152  if (PA_RecoInfo.minY > 1) PA_RecoInfo.minY-=2;
153  if (PA_RecoInfo.maxY <190) PA_RecoInfo.maxY+=2;
154
155  u16 angles[15];
156  for (i = 0; i < 15; i++) angles[i] = PA_GetAngle(points[i+2].x, points[i+2].y, points[i].x, points[i].y);
157
158  for (i = 0; i < 15; i++) PA_RecoShape[i] = '0' + (((angles[i]+16)&511)>>4);
159  PA_RecoShape[15] = 0;
160  //  printk("%s\n", PA_RecoShape);
161
162  u8 letter = 0; // 0 par défaut
163  s32 diff = 65000; // Diff max par défaut
164
165  u8 j;
166
167  if(PA_UseGraffiti){
168    for (j = 0; j < PA_RECOTESTS; j++){
169      s32 tempvalue = 0;
170      s32 tempdiff = 0;
171      for (i = 0; i < 15; i++) {
172        tempvalue = (PA_RecoShape[i]-PA_Graffiti[j].code[i])&31;
173        tempvalue -= (tempvalue >> 4)<<5; // normalise
174        if (tempvalue < 0) tempvalue = -tempvalue;
175        tempdiff += tempvalue; // value
176      }
177
178      if (tempdiff < diff){ // Nouvelle lettre !
179        diff = tempdiff;
180        letter = PA_Graffiti[j].letter;
181      }
182    }
183  }
184  if (PA_CustomReco > 0){
185    for (j = 0; j < PA_CustomReco; j++){
186      s32 tempvalue = 0;
187      s32 tempdiff = 0;
188      for (i = 0; i < 15; i++) {
189        tempvalue = (PA_RecoShape[i]-PA_CustomShape[j].code[i])&31;
190        tempvalue -= (tempvalue >> 4)<<5; // normalise
191        if (tempvalue < 0) tempvalue = -tempvalue;
192        tempdiff += tempvalue; // value
193      }
194
195      if (tempdiff < diff){ // Nouvelle lettre !
196        diff = tempdiff;
197        letter = PA_CustomShape[j].letter;
198      }
199    }
200
201  }
202  PA_RecoInfo.Difference = diff; // Difference to perfect shape
203  PA_RecoInfo.Shape = letter;
204
205  return letter;
206}
207
208int old_down = 0;
209
210char PA_CheckLetter(int down, int x, int y){
211  if(!old_down && down){
212    PA_Reco.nvalues = 0; // Start over again
213    PA_Reco.oldn = 0;
214    PA_Reco.veryold = 0;
215
216    PA_RecoInfo.startX = PA_StylusPos[PA_Reco.nvalues].x = x; // start values
217    PA_RecoInfo.startY = PA_StylusPos[PA_Reco.nvalues].y = y;
218    PA_RecoInfo.minX = PA_RecoInfo.maxX = PA_RecoInfo.startX;
219    PA_RecoInfo.minY = PA_RecoInfo.maxY = PA_RecoInfo.startY;
220    PA_Reco.nvalues++;
221  }
222  else if(old_down && down) {
223    PA_StylusLine(PA_StylusPos[PA_Reco.nvalues-1].x, PA_StylusPos[PA_Reco.nvalues-1].y, x, y);
224
225  }
226
227
228  if(old_down && !down){ // Start analyzing...
229    PA_Reco.nvalues = PA_Reco.veryold;
230    old_down = down;
231    return PA_AnalyzeShape();
232  }
233  PA_Reco.veryold = PA_Reco.oldn;
234  PA_Reco.oldn = PA_Reco.nvalues;
235  old_down = down;
236  return 0;
237}
238
239
Note: See TracBrowser for help on using the repository browser.