aboutsummaryrefslogtreecommitdiff
path: root/sdk-modifications/libsrc/key
diff options
context:
space:
mode:
Diffstat (limited to 'sdk-modifications/libsrc/key')
-rwxr-xr-xsdk-modifications/libsrc/key/key.c145
-rwxr-xr-xsdk-modifications/libsrc/key/key.h31
-rwxr-xr-xsdk-modifications/libsrc/key/key.mk10
3 files changed, 186 insertions, 0 deletions
diff --git a/sdk-modifications/libsrc/key/key.c b/sdk-modifications/libsrc/key/key.c
new file mode 100755
index 0000000..8a6ad5f
--- /dev/null
+++ b/sdk-modifications/libsrc/key/key.c
@@ -0,0 +1,145 @@
+#include "ds2_timer.h"
+#include "ds2io.h"
+
+#define KEY_REPEAT_TIME 200 //5 times/second
+#define KEY_REPEAT_TIME_N (KEY_REPEAT_TIME*1000000/SYSTIME_UNIT)
+
+#define INPUT_REPEAT_TIME 100
+#define INPUT_REPEAT_TIME_N (INPUT_REPEAT_TIME*1000000/SYSTIME_UNIT)
+
+static unsigned int _last_key = 0;
+static unsigned int _last_key_timestamp = 0;
+
+/*
+* Function: only detect the key pressed or not
+*/
+unsigned int getKey(void)
+{
+ struct key_buf input;
+ unsigned int new_key, hold_key, ret_key, timestamp;
+ int flag;
+
+ ds2_getrawInput(&input);
+ timestamp = getSysTime();
+ flag = ((timestamp - _last_key_timestamp) >= KEY_REPEAT_TIME_N) ? 1 : 0;
+
+ input.key &= 0x3FFF;
+ new_key = (_last_key ^ input.key) & input.key;
+ hold_key = _last_key & input.key;
+
+ ret_key = 0;
+ if(hold_key) {
+ if(flag)
+ {
+ ret_key = hold_key;
+ _last_key_timestamp = timestamp;
+ }
+ }
+
+ if(new_key)
+ {
+ ret_key |= new_key;
+ _last_key_timestamp = timestamp;
+
+ _last_key = input.key;
+ }
+
+ return ret_key;
+}
+
+/*
+* Function: can get the detail information about key pressed, hold, or release
+*/
+unsigned int getKey1(void)
+{
+ struct key_buf input;
+ unsigned int new_key, hold_key, ret_key, timestamp;
+ int flag;
+
+ ds2_getrawInput(&input);
+ timestamp = getSysTime();
+ flag = ((timestamp - _last_key_timestamp) >= KEY_REPEAT_TIME_N) ? 1 : 0;
+
+ input.key &= 0x3FFF;
+ new_key = _last_key ^ input.key;
+ hold_key = _last_key & input.key;
+ //ret_key[31:16] = last key;
+ //ret_key[15:0] = new key;
+
+ ret_key = 0;
+ if(hold_key) {
+ if(flag)
+ {
+ ret_key = (hold_key << 16) | hold_key;
+ _last_key_timestamp = timestamp;
+ }
+ }
+
+ if(new_key)
+ {
+ unsigned int tmp_key;
+
+ //have new key pressed
+ if(new_key & input.key)
+ {
+ ret_key |= new_key & input.key;
+ _last_key_timestamp = timestamp;
+ }
+ else
+ {
+ ret_key |= (new_key & ~input.key) << 16;
+ }
+
+ _last_key = input.key;
+ }
+
+ return ret_key;
+}
+
+static unsigned int _last_input = 0;
+static unsigned int _last_input_timestamp = 0;
+
+/*
+* Function: only detect the key pressed or not and touch position
+*/
+unsigned int getInput(struct key_buf *input) {
+ struct key_buf rawin;
+ unsigned int timestamp, new, hold;
+ int flag, ret;
+
+ ds2_getrawInput(&rawin);
+ timestamp = getSysTime();
+ flag = ((timestamp - _last_input_timestamp) >= INPUT_REPEAT_TIME_N) ? 1 : 0;
+
+ rawin.key &= 0x3FFF;
+ new = (rawin.key ^ _last_input) & rawin.key;
+ hold = rawin.key & _last_input;
+
+ ret = 0;
+ if(hold && flag)
+ {
+ ret = hold;
+ input->x = rawin.x;
+ input->y = rawin.y;
+
+ _last_input_timestamp = timestamp;
+ }
+
+ if(new)
+ {
+ ret |= new;
+ input->x = rawin.x;
+ input->y = rawin.y;
+
+ _last_input_timestamp = timestamp;
+ _last_input = rawin.key;
+ }
+
+ input->key = ret;
+ return ret > 0;
+}
+
+
+
+
+
diff --git a/sdk-modifications/libsrc/key/key.h b/sdk-modifications/libsrc/key/key.h
new file mode 100755
index 0000000..21674ec
--- /dev/null
+++ b/sdk-modifications/libsrc/key/key.h
@@ -0,0 +1,31 @@
+#ifndef __KEY_H__
+#define __KEY_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define KEY_PRESS(key, key_id) (!(key & (key_id<<16)) && (key & key_id))
+#define KEY_HOLD(key, key_id) ((key & (key_id<<16)) && (key & key_id))
+#define KEY_RELEASE(key, key_id) ((key & (key_id<<16)) && !(key & key_id))
+
+/*
+* Function: only detect the key pressed or not
+*/
+unsigned int getKey(void);
+
+/*
+* Function: can get the detail information about key pressed, hold, or release
+*/
+unsigned int getKey1(void);
+
+/*
+* Function: detect the key pressed or not and touched position
+*/
+extern unsigned int getInput(struct key_buf *input);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //__KEY_H__
diff --git a/sdk-modifications/libsrc/key/key.mk b/sdk-modifications/libsrc/key/key.mk
new file mode 100755
index 0000000..fa08d7c
--- /dev/null
+++ b/sdk-modifications/libsrc/key/key.mk
@@ -0,0 +1,10 @@
+#key.mk
+
+SRC += $(KEY_DIR)/key.c
+
+SSRC +=
+
+INC += -I$(KEY_DIR)
+
+CFLAGS +=
+