source: trunk/platform/ixusizoom_sd30/kbd.c @ 711

Revision 711, 7.1 KB checked in by msl, 23 months ago (diff)

Neuer Tastatur-Befehl

  • Betrifft alle

+ neuer Befehl zur Tastatursteuerung: "shoot_full_only", nutzbar mit click, press und release
+ Mit diesem Befehl sind deutlich verbesserte Intervallaufnahmen mit kurzen Zeitabstaenden moeglich.
+ siehe http://chdk.setepontos.com/index.php?topic=1444.msg70223#msg70223
+ Danke fudgey

  • Betrifft A1100

+ Fehlerhafte Palettenangabe in rev705 in platform_camera.h korrigiert.

  • Veralteten Ordner "script" aus Repository entfernt.
  • Property svn:eol-style set to native
Line 
1#include "lolevel.h"
2#include "platform.h"
3#include "core.h"
4#include "keyboard.h"
5
6#define KEY_MASK 0x17FF
7
8#define NEW_SS (0x2000)
9#define SD_READONLY_FLAG (0x20000)
10
11typedef struct {
12    long hackkey;
13    long canonkey;
14} KeyMap;
15
16long kbd_new_state[3];
17long kbd_prev_state[3];
18long kbd_mod_state = KEY_MASK;
19long debug_kbd_state_diff;
20
21static KeyMap keymap[];
22static long last_kbd_key = 0;
23static int usb_power=0;
24static int remote_key=0;
25static int remote_count=0;
26
27#ifndef MALLOCD_STACK
28static char kbd_stack[NEW_SS];
29#endif
30
31long __attribute__((naked)) wrap_kbd_p1_f() ;
32
33static void __attribute__((noinline)) hook_kbd_task_proceed()
34{
35    while (physw_run){
36        _SleepTask(5);
37
38        if (wrap_kbd_p1_f() == 1) // Readout key state via camera function
39        {
40            _kbd_p2_f();
41        }
42
43    }
44}
45
46void __attribute__((naked,noinline)) mykbd_task()
47{
48   /* WARNING
49     * Stack pointer manipulation performed here!
50     * This means (but not limited to):
51     *  function arguments destroyed;
52     *  function CAN NOT return properly;
53     *  MUST NOT call or use stack variables before stack
54     *  is setup properly;
55     *
56     */
57
58    register int i;
59    register long *newstack;
60
61#ifndef MALLOCD_STACK
62    newstack = (void*)kbd_stack;
63#else
64    newstack = malloc(NEW_SS);
65#endif
66
67    for (i=0;i<NEW_SS/4;i++)
68        newstack[i]=0xdededede;
69
70    asm volatile (
71        "MOV    SP, %0"
72        :: "r"(((char*)newstack)+NEW_SS)
73        : "memory"
74    );
75
76    hook_kbd_task_proceed();
77
78    /* function can be modified to restore SP here...
79     */
80
81    _ExitTask();
82
83}
84
85long __attribute__((naked,noinline)) wrap_kbd_p1_f()    //OK
86{
87
88    asm volatile(
89                "STMFD   SP!, {R4-R7,LR}\n"
90                "SUB     SP, SP, #0xC\n"
91                "BL      _kbd_read_keys\n"
92                "BL      hook_kbd_handle_keys\n"
93                "B       _kbd_p1_f_cont\n"        // Continue original function execution
94    );
95    return 0; // shut up the compiler
96}
97
98#if CAM_FEATURE_FEATHER
99//extern int touch_keys_angle;
100#endif
101
102#define IN(base, value) ((value < base + 20) && (value > base - 20))
103
104/**
105 * Handles and forwards key settings to key processing routines
106 */
107void hook_kbd_handle_keys()
108{
109    kbd_prev_state[0] = kbd_new_state[0];
110    kbd_prev_state[1] = kbd_new_state[1];
111    kbd_prev_state[2] = kbd_new_state[2];
112
113    kbd_new_state[0] = physw_status[0];
114    kbd_new_state[1] = physw_status[1];
115    kbd_new_state[2] = physw_status[2];
116
117    static int taskFeatherID = 0;
118        extern int taskNameToId(char*);
119    if (taskFeatherID == 0) {
120        taskFeatherID = _taskNameToId("tFeather");
121        //printf("taskFeatherID:%x\n", taskFeatherID);
122    }
123   
124    if (kbd_process() == 0){
125        // leave it ...
126#if CAM_FEATURE_FEATHER
127        taskResume(taskFeatherID);
128#endif
129    } else {
130        physw_status[2] = (physw_status[2] & (~KEY_MASK)) | (kbd_mod_state & KEY_MASK);
131#if CAM_FEATURE_FEATHER
132        taskSuspend(taskFeatherID);
133
134        // We still need this sema when simulating key presses
135        if (kbd_mod_state != KEY_MASK) {
136            taskResume(taskFeatherID);
137        }
138
139#endif
140    }
141
142    // Drop SD readonly status
143    physw_status[2] = physw_status[2] & ~SD_READONLY_FLAG;
144
145}
146
147/****************/
148
149
150void kbd_key_press(long key)
151{
152    int i;
153    for (i=0;keymap[i].hackkey;i++){
154        if (keymap[i].hackkey == key){
155            kbd_mod_state &= ~keymap[i].canonkey;
156            return;
157        }
158    }
159}
160
161void kbd_key_release(long key)
162{
163    int i;
164    for (i=0;keymap[i].hackkey;i++){
165        if (keymap[i].hackkey == key){
166            kbd_mod_state |= keymap[i].canonkey;
167            return;
168        }
169    }
170}
171
172void kbd_key_release_all()
173{
174    kbd_mod_state |= KEY_MASK;
175}
176
177long kbd_is_key_pressed(long key)
178{
179    int i;
180    for (i=0;keymap[i].hackkey;i++){
181        if (keymap[i].hackkey == key){
182            return ((kbd_new_state[2] & keymap[i].canonkey) == 0) ? 1:0;
183        }
184    }
185    return 0;
186}
187
188long kbd_is_key_clicked(long key)
189{
190    int i;
191   
192    for (i=0;keymap[i].hackkey;i++){
193        if (keymap[i].hackkey == key){
194            return ((kbd_prev_state[2] & keymap[i].canonkey) != 0) &&
195                    ((kbd_new_state[2] & keymap[i].canonkey) == 0);
196        }
197    }
198    return 0;
199}
200
201long kbd_get_pressed_key()
202{
203    int i;
204    for (i=0;keymap[i].hackkey;i++){
205        if ((kbd_new_state[2] & keymap[i].canonkey) == 0){
206            return keymap[i].hackkey;
207        }
208    }
209    return 0;
210}
211
212long kbd_get_clicked_key()
213{
214    int i;
215    for (i=0;keymap[i].hackkey;i++){
216        if (((kbd_prev_state[2] & keymap[i].canonkey) != 0) &&
217            ((kbd_new_state[2] & keymap[i].canonkey) == 0)){
218            return keymap[i].hackkey;
219        }
220    }
221    return 0;
222}
223
224void kbd_reset_autoclicked_key() {
225    last_kbd_key = 0;
226}
227
228long kbd_get_autoclicked_key() {
229    static long last_kbd_time = 0, press_count = 0;
230    register long key, t;
231
232    key=kbd_get_clicked_key();
233    if (key) {
234        last_kbd_key = key;
235        press_count = 0;
236        last_kbd_time = get_tick_count();
237        return key;
238    } else {
239        if (last_kbd_key && kbd_is_key_pressed(last_kbd_key)) {
240            t = get_tick_count();
241            if (t-last_kbd_time > ( press_count ? KBD_REPEAT_DELAY : KBD_INITIAL_DELAY) ) {
242                ++press_count;
243                last_kbd_time = t;
244                return last_kbd_key;
245            } else {
246                return 0;
247            }
248        } else {
249            last_kbd_key = 0;
250            return 0;
251        }
252    }
253}
254
255long kbd_use_zoom_as_mf() {
256    static long v;
257    static long zoom_key_pressed = 0;
258
259    if (kbd_is_key_pressed(KEY_ZOOM_IN) && (mode_get()&MODE_MASK) == MODE_REC) {
260        get_property_case(12, &v, 4);
261        if (v) {
262            kbd_key_release_all();
263            kbd_key_press(KEY_RIGHT);
264            zoom_key_pressed = KEY_ZOOM_IN;
265            return 1;
266        }
267    } else {
268        if (zoom_key_pressed==KEY_ZOOM_IN) {
269            kbd_key_release(KEY_RIGHT);
270            zoom_key_pressed = 0;
271            return 1;
272        }
273    }
274    if (kbd_is_key_pressed(KEY_ZOOM_OUT) && (mode_get()&MODE_MASK) == MODE_REC) {
275        get_property_case(12, &v, 4);
276        if (v) {
277            kbd_key_release_all();
278            kbd_key_press(KEY_LEFT);
279            zoom_key_pressed = KEY_ZOOM_OUT;
280            return 1;
281        }
282    } else {
283        if (zoom_key_pressed==KEY_ZOOM_OUT) {
284            kbd_key_release(KEY_LEFT);
285            zoom_key_pressed = 0;
286            return 1;
287        }
288    }
289    return 0;
290}
291
292int get_usb_power(int edge)
293{
294        int x;
295
296        if (edge) return remote_key;
297        x = usb_power;
298        usb_power = 0;
299        return x;
300}
301
302static KeyMap keymap[] = {
303    /* tiny bug: key order matters. see kbd_get_pressed_key()
304     * for example
305     */
306        { KEY_UP        , 0x00000001 },
307        { KEY_DOWN      , 0x00000002 },
308        { KEY_LEFT      , 0x00000008 },
309        { KEY_RIGHT     , 0x00000004 },
310        { KEY_SET       , 0x00000100 },
311        { KEY_SHOOT_FULL, 0x00000030 }, // note 3 here!
312        { KEY_SHOOT_FULL_ONLY, 0x00000020 },
313        { KEY_SHOOT_HALF, 0x00000010 },
314        { KEY_ZOOM_IN   , 0x00000040 },
315        { KEY_ZOOM_OUT  , 0x00000080 },
316        { KEY_MENU      , 0x00000200 },
317        { KEY_DISPLAY   , 0x00000400 },
318        { KEY_PRINT     , 0x00001000 },
319//      { KEY_ERASE     , 0x00000800 },
320        { KEY_DUMMY     , 0x00001000 },
321        { 0, 0 }
322};
323
Note: See TracBrowser for help on using the repository browser.