diff --git a/res/app/components/stf/control/control-service.js b/res/app/components/stf/control/control-service.js index df964dc9..ffa861ae 100644 --- a/res/app/components/stf/control/control-service.js +++ b/res/app/components/stf/control/control-service.js @@ -81,6 +81,11 @@ module.exports = function ControlServiceFactory( this.keyDown = keySender('input.keyDown') this.keyUp = keySender('input.keyUp') this.keyPress = keySender('input.keyPress') + this.rawKeyPress = function (fixedKey) { + return sendOneWay('input.keyPress', { + key: fixedKey + }) + } this.home = keySender('input.keyPress', 3) this.menu = keySender('input.keyPress', 93) diff --git a/res/app/components/stf/keycodes/android/index.json b/res/app/components/stf/keycodes/android/index.json new file mode 100644 index 00000000..26011c09 --- /dev/null +++ b/res/app/components/stf/keycodes/android/index.json @@ -0,0 +1,222 @@ +{ + "KEYCODE_0": 7, + "KEYCODE_1": 8, + "KEYCODE_2": 9, + "KEYCODE_3": 10, + "KEYCODE_3D_MODE": 206, + "KEYCODE_4": 11, + "KEYCODE_5": 12, + "KEYCODE_6": 13, + "KEYCODE_7": 14, + "KEYCODE_8": 15, + "KEYCODE_9": 16, + "KEYCODE_A": 29, + "KEYCODE_ALT_LEFT": 57, + "KEYCODE_ALT_RIGHT": 58, + "KEYCODE_APOSTROPHE": 75, + "KEYCODE_APP_SWITCH": 187, + "KEYCODE_ASSIST": 219, + "KEYCODE_AT": 77, + "KEYCODE_AVR_INPUT": 182, + "KEYCODE_AVR_POWER": 181, + "KEYCODE_B": 30, + "KEYCODE_BACK": 4, + "KEYCODE_BACKSLASH": 73, + "KEYCODE_BOOKMARK": 174, + "KEYCODE_BREAK": 121, + "KEYCODE_BUTTON_1": 188, + "KEYCODE_BUTTON_10": 197, + "KEYCODE_BUTTON_11": 198, + "KEYCODE_BUTTON_12": 199, + "KEYCODE_BUTTON_13": 200, + "KEYCODE_BUTTON_14": 201, + "KEYCODE_BUTTON_15": 202, + "KEYCODE_BUTTON_16": 203, + "KEYCODE_BUTTON_2": 189, + "KEYCODE_BUTTON_3": 190, + "KEYCODE_BUTTON_4": 191, + "KEYCODE_BUTTON_5": 192, + "KEYCODE_BUTTON_6": 193, + "KEYCODE_BUTTON_7": 194, + "KEYCODE_BUTTON_8": 195, + "KEYCODE_BUTTON_9": 196, + "KEYCODE_BUTTON_A": 96, + "KEYCODE_BUTTON_B": 97, + "KEYCODE_BUTTON_C": 98, + "KEYCODE_BUTTON_L1": 102, + "KEYCODE_BUTTON_L2": 104, + "KEYCODE_BUTTON_MODE": 110, + "KEYCODE_BUTTON_R1": 103, + "KEYCODE_BUTTON_R2": 105, + "KEYCODE_BUTTON_SELECT": 109, + "KEYCODE_BUTTON_START": 108, + "KEYCODE_BUTTON_THUMBL": 106, + "KEYCODE_BUTTON_THUMBR": 107, + "KEYCODE_BUTTON_X": 99, + "KEYCODE_BUTTON_Y": 100, + "KEYCODE_BUTTON_Z": 101, + "KEYCODE_C": 31, + "KEYCODE_CALCULATOR": 210, + "KEYCODE_CALENDAR": 208, + "KEYCODE_CALL": 5, + "KEYCODE_CAMERA": 27, + "KEYCODE_CAPS_LOCK": 115, + "KEYCODE_CAPTIONS": 175, + "KEYCODE_CHANNEL_DOWN": 167, + "KEYCODE_CHANNEL_UP": 166, + "KEYCODE_CLEAR": 28, + "KEYCODE_COMMA": 55, + "KEYCODE_CONTACTS": 207, + "KEYCODE_CTRL_LEFT": 113, + "KEYCODE_CTRL_RIGHT": 114, + "KEYCODE_D": 32, + "KEYCODE_DEL": 67, + "KEYCODE_DPAD_CENTER": 23, + "KEYCODE_DPAD_DOWN": 20, + "KEYCODE_DPAD_LEFT": 21, + "KEYCODE_DPAD_RIGHT": 22, + "KEYCODE_DPAD_UP": 19, + "KEYCODE_DVR": 173, + "KEYCODE_E": 33, + "KEYCODE_EISU": 212, + "KEYCODE_ENDCALL": 6, + "KEYCODE_ENTER": 66, + "KEYCODE_ENVELOPE": 65, + "KEYCODE_EQUALS": 70, + "KEYCODE_ESCAPE": 111, + "KEYCODE_EXPLORER": 64, + "KEYCODE_F": 34, + "KEYCODE_F1": 131, + "KEYCODE_F10": 140, + "KEYCODE_F11": 141, + "KEYCODE_F12": 142, + "KEYCODE_F2": 132, + "KEYCODE_F3": 133, + "KEYCODE_F4": 134, + "KEYCODE_F5": 135, + "KEYCODE_F6": 136, + "KEYCODE_F7": 137, + "KEYCODE_F8": 138, + "KEYCODE_F9": 139, + "KEYCODE_FOCUS": 80, + "KEYCODE_FORWARD": 125, + "KEYCODE_FORWARD_DEL": 112, + "KEYCODE_FUNCTION": 119, + "KEYCODE_G": 35, + "KEYCODE_GRAVE": 68, + "KEYCODE_GUIDE": 172, + "KEYCODE_H": 36, + "KEYCODE_HEADSETHOOK": 79, + "KEYCODE_HENKAN": 214, + "KEYCODE_HOME": 3, + "KEYCODE_I": 37, + "KEYCODE_INFO": 165, + "KEYCODE_INSERT": 124, + "KEYCODE_J": 38, + "KEYCODE_K": 39, + "KEYCODE_KANA": 218, + "KEYCODE_KATAKANA_HIRAGANA": 215, + "KEYCODE_L": 40, + "KEYCODE_LANGUAGE_SWITCH": 204, + "KEYCODE_LEFT_BRACKET": 71, + "KEYCODE_M": 41, + "KEYCODE_MANNER_MODE": 205, + "KEYCODE_MEDIA_CLOSE": 128, + "KEYCODE_MEDIA_EJECT": 129, + "KEYCODE_MEDIA_FAST_FORWARD": 90, + "KEYCODE_MEDIA_NEXT": 87, + "KEYCODE_MEDIA_PAUSE": 127, + "KEYCODE_MEDIA_PLAY": 126, + "KEYCODE_MEDIA_PLAY_PAUSE": 85, + "KEYCODE_MEDIA_PREVIOUS": 88, + "KEYCODE_MEDIA_RECORD": 130, + "KEYCODE_MEDIA_REWIND": 89, + "KEYCODE_MEDIA_STOP": 86, + "KEYCODE_MENU": 82, + "KEYCODE_META_LEFT": 117, + "KEYCODE_META_RIGHT": 118, + "KEYCODE_MINUS": 69, + "KEYCODE_MOVE_END": 123, + "KEYCODE_MOVE_HOME": 122, + "KEYCODE_MUHENKAN": 213, + "KEYCODE_MUSIC": 209, + "KEYCODE_MUTE": 91, + "KEYCODE_N": 42, + "KEYCODE_NOTIFICATION": 83, + "KEYCODE_NUM": 78, + "KEYCODE_NUMPAD_0": 144, + "KEYCODE_NUMPAD_1": 145, + "KEYCODE_NUMPAD_2": 146, + "KEYCODE_NUMPAD_3": 147, + "KEYCODE_NUMPAD_4": 148, + "KEYCODE_NUMPAD_5": 149, + "KEYCODE_NUMPAD_6": 150, + "KEYCODE_NUMPAD_7": 151, + "KEYCODE_NUMPAD_8": 152, + "KEYCODE_NUMPAD_9": 153, + "KEYCODE_NUMPAD_ADD": 157, + "KEYCODE_NUMPAD_COMMA": 159, + "KEYCODE_NUMPAD_DIVIDE": 154, + "KEYCODE_NUMPAD_DOT": 158, + "KEYCODE_NUMPAD_ENTER": 160, + "KEYCODE_NUMPAD_EQUALS": 161, + "KEYCODE_NUMPAD_LEFT_PAREN": 162, + "KEYCODE_NUMPAD_MULTIPLY": 155, + "KEYCODE_NUMPAD_RIGHT_PAREN": 163, + "KEYCODE_NUMPAD_SUBTRACT": 156, + "KEYCODE_NUM_LOCK": 143, + "KEYCODE_O": 43, + "KEYCODE_P": 44, + "KEYCODE_PAGE_DOWN": 93, + "KEYCODE_PAGE_UP": 92, + "KEYCODE_PERIOD": 56, + "KEYCODE_PICTSYMBOLS": 94, + "KEYCODE_PLUS": 81, + "KEYCODE_POUND": 18, + "KEYCODE_POWER": 26, + "KEYCODE_PROG_BLUE": 186, + "KEYCODE_PROG_GREEN": 184, + "KEYCODE_PROG_RED": 183, + "KEYCODE_PROG_YELLOW": 185, + "KEYCODE_Q": 45, + "KEYCODE_R": 46, + "KEYCODE_RIGHT_BRACKET": 72, + "KEYCODE_RO": 217, + "KEYCODE_S": 47, + "KEYCODE_SCROLL_LOCK": 116, + "KEYCODE_SEARCH": 84, + "KEYCODE_SEMICOLON": 74, + "KEYCODE_SETTINGS": 176, + "KEYCODE_SHIFT_LEFT": 59, + "KEYCODE_SHIFT_RIGHT": 60, + "KEYCODE_SLASH": 76, + "KEYCODE_SOFT_LEFT": 1, + "KEYCODE_SOFT_RIGHT": 2, + "KEYCODE_SPACE": 62, + "KEYCODE_STAR": 17, + "KEYCODE_STB_INPUT": 180, + "KEYCODE_STB_POWER": 179, + "KEYCODE_SWITCH_CHARSET": 95, + "KEYCODE_SYM": 63, + "KEYCODE_SYSRQ": 120, + "KEYCODE_T": 48, + "KEYCODE_TAB": 61, + "KEYCODE_TV": 170, + "KEYCODE_TV_INPUT": 178, + "KEYCODE_TV_POWER": 177, + "KEYCODE_U": 49, + "KEYCODE_UNKNOWN": 0, + "KEYCODE_V": 50, + "KEYCODE_VOLUME_DOWN": 25, + "KEYCODE_VOLUME_MUTE": 164, + "KEYCODE_VOLUME_UP": 24, + "KEYCODE_W": 51, + "KEYCODE_WINDOW": 171, + "KEYCODE_X": 52, + "KEYCODE_Y": 53, + "KEYCODE_YEN": 216, + "KEYCODE_Z": 54, + "KEYCODE_ZENKAKU_HANKAKU": 211, + "KEYCODE_ZOOM_IN": 168, + "KEYCODE_ZOOM_OUT": 169 +} diff --git a/res/app/components/stf/keycodes/index.js b/res/app/components/stf/keycodes/index.js new file mode 100644 index 00000000..a6bcb4a5 --- /dev/null +++ b/res/app/components/stf/keycodes/index.js @@ -0,0 +1,10 @@ +module.exports = angular.module('stf.keycodes', [ + +]) + .factory('KeycodesAndroid', function () { + return require('./android/index.json') + }) + .factory('KeycodesJS', function () { + return require('./android/index.json') + }) + .factory('KeycodesService', require('./keycodes-service')) diff --git a/res/app/components/stf/keycodes/js/index.json b/res/app/components/stf/keycodes/js/index.json new file mode 100644 index 00000000..e08b497c --- /dev/null +++ b/res/app/components/stf/keycodes/js/index.json @@ -0,0 +1,103 @@ +{ + "0": 48, + "1": 49, + "2": 50, + "3": 51, + "4": 52, + "5": 53, + "6": 54, + "7": 55, + "8": 56, + "9": 57, + "A": 65, + "ADD": 107, + "ALT": 18, + "ALT_RIGHT": 17, + "B": 66, + "BACKSLASH": 220, + "BACKSPACE": 8, + "C": 67, + "CAPS_LOCK": 20, + "CLOSE_BRACKET": 221, + "COMMA": 188, + "CTRL": 17, + "CTRL_RIGHT": 18, + "D": 68, + "DASH": 189, + "DECIMAL_POINT": 110, + "DELETE": 46, + "DIVIDE": 111, + "DOWN": 40, + "E": 69, + "END": 35, + "ENTER": 13, + "EQUAL_SIGN": 187, + "ESCAPE": 27, + "F": 70, + "F1": 112, + "F10": 121, + "F11": 122, + "F12": 123, + "F2": 113, + "F3": 114, + "F4": 115, + "F5": 116, + "F6": 117, + "F7": 118, + "F8": 119, + "F9": 120, + "G": 71, + "GRAVE_ACCENT": 192, + "H": 72, + "HOME": 36, + "I": 73, + "INSERT": 45, + "J": 74, + "K": 75, + "L": 76, + "LEFT": 37, + "LEFT_WINDOW": 91, + "M": 77, + "MULTIPLY": 106, + "N": 78, + "NUMPAD_0": 96, + "NUMPAD_1": 97, + "NUMPAD_2": 98, + "NUMPAD_3": 99, + "NUMPAD_4": 100, + "NUMPAD_5": 101, + "NUMPAD_6": 102, + "NUMPAD_7": 103, + "NUMPAD_8": 104, + "NUMPAD_9": 105, + "NUM_LOCK": 144, + "O": 79, + "OPEN_BRACKET": 219, + "P": 80, + "PAGE_DOWN": 34, + "PAGE_UP": 33, + "PAUSE_BREAK": 19, + "PERIOD": 190, + "Q": 81, + "R": 82, + "RIGHT": 39, + "RIGHT_WINDOW": 92, + "S": 83, + "SCROLL_LOCK": 145, + "SELECT_KEY": 93, + "SEMICOLON": 186, + "SHIFT": 16, + "SINGLE_QUOTE": 222, + "SLASH": 191, + "SPACE": 32, + "SUBTRACT": 109, + "T": 84, + "TAB": 9, + "U": 85, + "UP": 38, + "V": 86, + "W": 87, + "X": 88, + "Y": 89, + "Z": 90 +} diff --git a/res/app/components/stf/keycodes/keycodes-service.js b/res/app/components/stf/keycodes/keycodes-service.js new file mode 100644 index 00000000..895bb043 --- /dev/null +++ b/res/app/components/stf/keycodes/keycodes-service.js @@ -0,0 +1,83 @@ +module.exports = function KeycodesServiceFactory(KeycodesAndroid, KeycodesJS) { + var service = {} + + var a = KeycodesAndroid + var j = KeycodesJS + var androidMap = [ + [j.ENTER, a.KEYCODE_ENTER], + [j.SPACE, a.KEYCODE_SPACE], + [j.DELETE, a.KEYCODE_DEL], + [j.ESCAPE, a.KEYCODE_ESCAPE], + [j.BACKSPACE, a.KEYCODE_DEL], + [j.TAB, a.KEYCODE_TAB], + [j.SHIFT, a.KEYCODE_SHIFT_LEFT], + [j.CAPS_LOCK, a.KEYCODE_CAPS_LOCK], + [j.SLASH, a.KEYCODE_SLASH], + [j.BACKSLASH, a.KEYCODE_BACKSLASH], + [j.COMMA, a.KEYCODE_COMMA], + [j.PERIOD, a.KEYCODE_PERIOD], + [j.SEMICOLON, a.KEYCODE_SEMICOLON], + [j.PAGE_UP, a.KEYCODE_PAGE_UP], + [j.PAGE_DOWN, a.KEYCODE_PAGE_DOWN], + // [j.LEFT_WINDOW, a.KEYCODE_RO], + // [j.SELECT_KEY, a.KEYCODE_KANA], + [j.HOME, a.KEYCODE_MOVE_HOME], + [j.END, a.KEYCODE_MOVE_END], + [j.UP, a.KEYCODE_DPAD_UP], + [j.DOWN, a.KEYCODE_DPAD_DOWN], + [j.LEFT, a.KEYCODE_DPAD_LEFT], + [j.RIGHT, a.KEYCODE_DPAD_RIGHT], + [j.F3, a.KEYCODE_POWER], + [j.F7, a.KEYCODE_MEDIA_PREVIOUS], + [j.F8, a.KEYCODE_MEDIA_PLAY_PAUSE], + [j.F9, a.KEYCODE_MEDIA_NEXT], + [j.F10, a.KEYCODE_VOLUME_MUTE], + [j.F11, a.KEYCODE_VOLUME_DOWN], + [j.F12, a.KEYCODE_VOLUME_UP], + [j.NUMPAD_0, a.KEYCODE_NUMPAD_0], + [j.NUMPAD_1, a.KEYCODE_NUMPAD_1], + [j.NUMPAD_2, a.KEYCODE_NUMPAD_2], + [j.NUMPAD_3, a.KEYCODE_NUMPAD_3], + [j.NUMPAD_4, a.KEYCODE_NUMPAD_4], + [j.NUMPAD_5, a.KEYCODE_NUMPAD_5], + [j.NUMPAD_6, a.KEYCODE_NUMPAD_6], + [j.NUMPAD_7, a.KEYCODE_NUMPAD_7], + [j.NUMPAD_8, a.KEYCODE_NUMPAD_8], + [j.NUMPAD_9, a.KEYCODE_NUMPAD_9], + [j.MULTIPLY, a.KEYCODE_NUMPAD_MULTIPLY], + [j.ADD, a.KEYCODE_NUMPAD_ADD], + [j.SUBTRACT, a.KEYCODE_NUMPAD_SUBTRACT], + [j.DECIMAL_POINT, a.KEYCODE_NUMPAD_DOT], + [j.DIVIDE, a.KEYCODE_NUMPAD_DIVIDE], + [j.EQUAL_SIGN, a.KEYCODE_EQUALS], + [j.DASH, a.KEYCODE_MINUS], + [j.GRAVE_ACCENT, a.KEYCODE_GRAVE], + [j.OPEN_BRACKET, a.KEYCODE_LEFT_BRACKET], + [j.CLOSE_BRACKET, a.KEYCODE_RIGHT_BRACKET], + [j.SINGLE_QUOTE, a.KEYCODE_APOSTROPHE] + ] + + service.mapToDevice = function (keyCode) { + return service.mapToAndroid(keyCode) + } + + service.mapToAndroid = function (key) { + // All special keys + for (var i = 0; i < androidMap.length; ++i) { + if (androidMap[i][0] === key) { + return androidMap[i][1] + } + } + // Range of numbers and letters + if (key >= j['0'] && key <= j['9']) { + return key - 41 // 0-9 range + } + else if (key >= j.A && key <= j.Z) { + return key - 36 // a-z range + } + // Key not mapped + return -1 + } + + return service +} diff --git a/res/app/components/stf/keycodes/keycodes-spec.js b/res/app/components/stf/keycodes/keycodes-spec.js new file mode 100644 index 00000000..61a9c370 --- /dev/null +++ b/res/app/components/stf/keycodes/keycodes-spec.js @@ -0,0 +1,11 @@ +describe('KeycodesService', function() { + + beforeEach(module('stf.keycodes')); + + it('should ...', inject(function(KeycodesService) { + + //expect(KeycodesService.doSomething()).toEqual('something'); + + })); + +}) \ No newline at end of file diff --git a/res/app/control-panes/advanced/input/index.js b/res/app/control-panes/advanced/input/index.js index 7c254ea6..fcf2b799 100644 --- a/res/app/control-panes/advanced/input/index.js +++ b/res/app/control-panes/advanced/input/index.js @@ -1,7 +1,7 @@ require('./input.css') module.exports = angular.module('stf.advanced.input', [ - + require('stf/keycodes').name ]) .run(["$templateCache", function ($templateCache) { $templateCache.put('control-panes/advanced/input/input.jade', diff --git a/res/app/control-panes/advanced/input/input-controller.js b/res/app/control-panes/advanced/input/input-controller.js index 7a51866f..8e5400a6 100644 --- a/res/app/control-panes/advanced/input/input-controller.js +++ b/res/app/control-panes/advanced/input/input-controller.js @@ -1,3 +1,12 @@ -module.exports = function InputCtrl($scope) { +module.exports = function InputCtrl($scope, KeycodesAndroid) { + $scope.press = function (key) { + console.log(key) + var mapped = KeycodesAndroid[key] + if (mapped) { + $scope.control.rawKeyPress(mapped) + } else { + console.error(key + ' is not mapped') + } + } } diff --git a/res/app/control-panes/device-control/device-control.css b/res/app/control-panes/device-control/device-control.css index ddd94ce2..57a8650a 100644 --- a/res/app/control-panes/device-control/device-control.css +++ b/res/app/control-panes/device-control/device-control.css @@ -23,6 +23,7 @@ device-screen { position: relative; display: block; overflow: hidden; + /*cursor: pointer;*/ -webkit-touch-callout: none; -webkit-user-select: none;