aboutsummaryrefslogtreecommitdiff
path: root/sdk-modifications/libsrc/key/key.c
diff options
context:
space:
mode:
Diffstat (limited to 'sdk-modifications/libsrc/key/key.c')
-rwxr-xr-xsdk-modifications/libsrc/key/key.c145
1 files changed, 145 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;
+}
+
+
+
+
+