1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
14:
15: 16: 17: 18: 19: 20:
21:
22: #include <tk/tkernel.h>
23: #include <device/lowkbpd.h>
24: #include <device/kbpd.h>
25: #include <device/keycode.h>
26: #include <device/devconf.h>
27: #include <device/sdrvif.h>
28: #include <sys/util.h>
29: #include <tk/util.h>
30: #include <sys/queue.h>
31: #include <libstr.h>
32: #include <sys/debug.h>
33:
34: #define InvalidID (0)
35: #define InvalidHNO (0)
36: #define InvalidDevID (-1)
37: #define InvalidKeytop (-1)
38: #define InvalidKeycode (0)
39:
40: #define DefaultPriority 30
41: #define DefaultStkSize 3072
42:
43: #define MAX_KID 0x7f
44:
45: 46: 47:
48: #define MaxCmd 4
49:
50: 51: 52:
53: typedef union {
54: UW w;
55: struct {
56: UW rsv:8;
57: UW tenkey:1;
58: UW kid:7;
59: UW kcode:16;
60: } u;
61: } KeyTop;
62:
63: 64: 65: 66: 67: 68: 69:
70: typedef enum {
71: NormalKey = 0,
72: IK_CC_U = -1,
73: IK_CC_D = -2,
74: IK_CC_R = -3,
75: IK_CC_L = -4
76: } InKeyKind;
77:
78: 79: 80:
81: typedef enum {
82: NoShift = 0x00,
83: SK_SHIFT_L = 0x01,
84: SK_SHIFT_R = 0x02,
85: SK_EXPANSION = 0x04,
86: SK_COMMAND = 0x08,
87: SK_ALL = 0x0f
88: } ShiftKeyKind;
89:
90: 91: 92:
93: typedef enum {
94: BK_MAIN = 0x01,
95: BK_SUB = 0x02,
96: BK_ALL = BK_MAIN | BK_SUB
97: } ButtonKind;
98:
99: #define NumOfPdBut (2)
100:
101: #define PdButKind(i) ((ButtonKind)(BK_MAIN << (i)))
102:
103: 104: 105: 106: 107: 108:
109:
110: 111: 112: 113:
114: typedef union {
115: MetaBut o;
116:
117: struct _MetaBut {
118: #if BIGENDIAN
119: UW rsv1:8;
120: UW pdsim:2;
121: UW nodsp:1;
122: UW rsv2:3;
123: UW kbsel:1;
124: UW han:1;
125:
126: UW tmpShift:4;
127: UW shiftLock:4;
128: UW shift:4;
129:
130: UW mode:2;
131:
132: UW button:2;
133: #else
134: UW button:2;
135:
136: UW mode:2;
137:
138: UW shift:4;
139: UW shiftLock:4;
140: UW tmpShift:4;
141:
142: UW han:1;
143: UW kbsel:1;
144: UW rsv2:3;
145: UW nodsp:1;
146: UW pdsim:2;
147: UW rsv1:8;
148: #endif
149: } u;
150: } KpMetaBut;
151:
152: 153: 154: 155:
156: typedef union {
157: PdInStat o;
158:
159: struct _PdInStat {
160: UW read:1;
161: InputCmd cmd:7;
162: UW rsv1:4;
163: DevError err:4;
164:
165: UW nodsp:1;
166: UW rsv2:1;
167: UW onebut:1;
168: UW abs:1;
169: UW norel:1;
170: UW tmout:1;
171: UW butrev:1;
172: UW xyrev:1;
173:
174: #if BIGENDIAN
175: UW rsv3:3;
176: UW qpress:1;
177: UW inv:1;
178: UW vst:1;
179: UW button:2;
180: #else
181: UW button:2;
182: UW vst:1;
183: UW inv:1;
184: UW qpress:1;
185: UW rsv3:3;
186: #endif
187: } u;
188: } KpPdInStat;
189:
190:
191:
192: #include "devevt.h"
193: #include "innevt.h"
194: #include "statmach.h"
195:
196:
197:
198: 199: 200:
201: typedef struct {
202: W size;
203: KeyDef keyDef;
204: } KbDef;
205:
206: 207: 208:
209: typedef struct {
210: KbDef *kbDef[2][MAX_KID+1];
211: UW keyID;
212: UW defKeyID:2; 213:
214: KeyMap keyMap;
215: KeyMode keyMode;
216: } kbInfo;
217:
218: #define GetKbDef(i, kid) ( kpMgrInfo.kb.kbDef[i][kid] )
219: #define SetKbDef(i, kid, kbdef) ( kpMgrInfo.kb.kbDef[i][kid] = kbdef )
220:
221: 222: 223:
224: typedef struct {
225: PdMode pdMode;
226: PdRange pdRange;
227: W pdSimSpeed;
228: BOOL pdSimInh;
229: } pdInfo;
230:
231: 232: 233:
234: #define simStartTime() (50)
235: #define simIntervalTime() (50)
236:
237: 238: 239:
240: typedef struct {
241:
242: H x;
243: H y;
244: W rep;
245: } PdSimState;
246:
247: 248: 249:
250: typedef struct {
251: FastLock lock;
252:
253:
254: ID acceptPort;
255: ID eventMbf;
256: SDI Sdi;
257: BOOL suspended;
258:
259:
260: ID dataMbx;
261: ID cmdFlg[MaxCmd];
262:
263:
264: ID dataReceiveTask;
265:
266:
267: KPStat kpState;
268: kbInfo kb;
269: pdInfo pd;
270:
271:
272: StateMachine statMach;
273:
274:
275: ShiftKeyKind spress;
276: #if 0
277: H firstXpos;
278: H firstYpos;
279: #endif
280: PdSimState pdSimState;
281: } MgrInfo;
282: IMPORT MgrInfo kpMgrInfo;
283:
284:
285:
286: 287: 288:
289: #define isMetaKey(c) ( ((c) & 0xffe0) == 0x1000 || (c) == KC_HAN )
290: #define isShiftKey(c) ( (c) >= KC_SHT_R && (c) <= KC_CMD )
291: #define isLockKey(c) ( isMetaKey(c) && !isShiftKey(c) )
292: #define isMainCC(c) ( (c) >= KC_CC_U && (c) <= KC_CC_L )
293: #define isSubCC(c) ( (c) >= KC_SC_U && (c) <= KC_SC_L )
294: #define isCCKey(c) ( (c) >= KC_CC_U && (c) <= KC_SC_L )
295:
296: 297: 298:
299: #define max(a,b) (( (a) > (b) )? (a): (b))
300: #define min(a,b) (( (a) < (b) )? (a): (b))
301: #define SWAP(type,x,y) { type z = (x); (x) = (y); (y) = z; }
302:
303:
304:
305: 306: 307: 308:
309: #define ES_BUT 0x00000001
310: #define ES_BUT2 0x00000002
311: #define ES_ALPH 0x00000004
312: #define ES_KANA 0x00000008
313: #define ES_LSHFT 0x00000010
314: #define ES_RSHFT 0x00000020
315: #define ES_EXT 0x00000040
316: #define ES_CMD 0x00000080
317: #define ES_LLSHFT 0x00000100
318: #define ES_LRSHFT 0x00000200
319: #define ES_LEXT 0x00000400
320: #define ES_LCMD 0x00000800
321: #define ES_TLSHFT 0x00001000
322: #define ES_TRSHFT 0x00002000
323: #define ES_TEXT 0x00004000
324: #define ES_TCMD 0x00008000
325: #define ES_HAN 0x00010000
326: #define ES_KBSEL 0x00020000
327:
328: 329: 330:
331: #define ES_BASICBTN 0x00000003U
332: #define ES_META 0x001FFFFCU
333: #define ES_NODSP 0x00200000U
334: #define ES_PDSIM 0x00C00000U
335: #define ES_EXTBTN 0xFF000000U
336:
337: 338: 339: 340: 341:
342: #define IM_HIRA 0x0000
343: #define IM_ALPH (ES_ALPH)
344: #define IM_KATA (ES_KANA)
345: #define IM_CAPS (ES_ALPH | ES_KANA)
346: #define IM_MASK (ES_ALPH | ES_KANA)
347:
348: #define KIN_KANA 0x0000
349: #define KIN_ROMAN 0x0001
350:
351: 352: 353:
354: #define PD_WHEEL 0x4000
355: #define PD_QPRESS 0x2000
356: #define PD_REV 0x1000
357: #define PD_ACMSK 0x0e00
358: #define PD_ABS 0x0100
359: #define PD_REL 0x0000
360: #define PD_SCMSK 0x00f0
361: #define PD_SNMSK 0x000f
362:
363:
364:
365: #define IMPORT_DEFINE 1
366: #if IMPORT_DEFINE
367:
368: IMPORT INT kpReadFn( ID devid, INT datano, INT datacnt, void *buf, SDI sdi );
369: IMPORT INT kpWriteFn( ID devid, INT datano, INT datacnt, void *buf, SDI sdi );
370: IMPORT INT kpEventFn( INT evttyp, void *evtinf, SDI sdi );
371:
372: IMPORT ER kpSendDeviceCommand( UW cmd );
373: IMPORT ER kpChangeKbInputMode( InputMode mode );
374: IMPORT ER kpChangePdScanRate( W rate );
375: IMPORT ER kpChangePdSense( W sense );
376: IMPORT ER kpSendInitialDeviceCommand( ID flgid );
377: IMPORT ER kpSetAllDeviceStatus( void );
378:
379: IMPORT ER kpNotifyEvent( void *evt, W size );
380: IMPORT ER kpNotifyMetaEvent( void );
381: IMPORT ER kpNotifyPdEvent( TDEvtTyp devEvt, UW nodsp );
382: IMPORT UH kpToKeycode( KeyTop keytop, KpMetaBut *meta );
383: IMPORT W kpGetKeyKind( KeyTop keytop );
384: IMPORT BOOL kpChangeShiftLock( InnEvtType type, ShiftKeyKind skind );
385: IMPORT W kpKeyTopCode( KeyTop keytop, UW kbsel );
386: IMPORT void kpSetOrResetKeyMap( KeyTop keytop, UW kbsel, UW press );
387: IMPORT void kpAllResetKeyMap( void );
388: IMPORT void kpPdPreProcess( PdInput *msg );
389: IMPORT BOOL kpMovePointer( W xpos, W ypos );
390: IMPORT ER kpMovePointerAndNotify( H xpos, H ypos );
391: IMPORT TDEvtTyp kpPdMoveEvent( InnerEvent *evt );
392: IMPORT TDEvtTyp kpPdButEvent( InnerEvent *evt );
393:
394: IMPORT void kpExecKeyStateMachine( KeyState *ks, InnerEvent *evt, ReceiveData *msg );
395:
396: IMPORT void kpInnerEventProcess( InnerEvent *evt, TMO *tmout );
397:
398: IMPORT MgrInfo kpMgrInfo;
399: IMPORT ER KbPdDrv ( INT ac, UB *av[] );
400: IMPORT ER main( INT ac, UB *av[] );
401:
402: IMPORT void kpExecPdButStateMachine( InnerEvent *evt, ReceiveData *msg, ButtonKind button );
403:
404: IMPORT BOOL kpExecPdSimKeyDown( InnerEvent *evt, UH code, TMO *tmout );
405: IMPORT BOOL kpExecPdSimKeyUp( InnerEvent *evt, UH code, TMO *tmout );
406: IMPORT void kpExecPdSimRepeat( TMO *tmout );
407:
408: IMPORT void kpDataReceiveTask( void );
409: IMPORT ER kpStartDataReceiveTask( PRI pri );
410: IMPORT void kpStopDataReceiveTask( void );
411:
412: IMPORT ER kpSendPseudoMsg( T_MSG *msg );
413: IMPORT ER kpSetAlarm( AlarmState *alm, MSEC offsetTime );
414: IMPORT BOOL kpChkAlarm( AlarmState *alm, TimeoutMsg *msg );
415: IMPORT ER kpInitializeStateMachine( void );
416: IMPORT void kpFinishStateMachine( void );
417: IMPORT void kpReleaseKey( KeyState *ks );
418: IMPORT BOOL kpExecStateMachine( InnerEvent *evt, ReceiveData *msg );
419: IMPORT ER kpKeyAndButtonForceUp( void );
420: #endif