diff --git a/src/extensions/microbitMore/index.js b/src/extensions/microbitMore/index.js index cfca31a3ed..cbd6dec3da 100644 --- a/src/extensions/microbitMore/index.js +++ b/src/extensions/microbitMore/index.js @@ -273,8 +273,8 @@ const MbitMoreGestureName = */ const MbitMoreGestureID = { - 1: 'TILT_UP', - 2: 'TILT_DOWN', + 1: 'TILT_DOWN', + 2: 'TILT_UP', 3: 'TILT_LEFT', 4: 'TILT_RIGHT', 5: 'FACE_UP', @@ -1614,26 +1614,34 @@ class MbitMoreBlocks { }), value: 'MOVED' }, + { + text: formatMessage({ + id: 'mbitMore.gesturesMenu.tilted', + default: 'tilted any', + description: 'label for tilted any direction gesture in gesture picker for microbit more extension' + }), + value: 'TILTED' + }, { text: formatMessage({ id: 'mbitMore.gesturesMenu.tiltUp', - default: 'titl up', - description: 'label for tilt up gesture in gesture picker for microbit more extension' + default: 'tilt front', + description: 'label for tilt front gesture in gesture picker for microbit more extension' }), value: MbitMoreGestureName.TILT_UP }, { text: formatMessage({ id: 'mbitMore.gesturesMenu.tiltDown', - default: 'titl down', - description: 'label for tilt down gesture in gesture picker for microbit more extension' + default: 'tilt back', + description: 'label for tilt back gesture in gesture picker for microbit more extension' }), value: MbitMoreGestureName.TILT_DOWN }, { text: formatMessage({ id: 'mbitMore.gesturesMenu.tiltLeft', - default: 'titl left', + default: 'tilt left', description: 'label for tilt left gesture in gesture picker for microbit more extension' }), value: MbitMoreGestureName.TILT_LEFT @@ -1641,7 +1649,7 @@ class MbitMoreBlocks { { text: formatMessage({ id: 'mbitMore.gesturesMenu.tiltRight', - default: 'titl right', + default: 'tilt right', description: 'label for tilt right gesture in gesture picker for microbit more extension' }), value: MbitMoreGestureName.TILT_RIGHT @@ -1705,6 +1713,93 @@ class MbitMoreBlocks { ]; } + /** + * @return {array} - text and values for each tilt direction menu element + */ + get TILT_DIRECTION_MENU () { + return [ + { + text: formatMessage({ + id: 'mbitMore.tiltDirectionMenu.any', + default: 'any', + description: 'label for any direction element in tilt direction picker for Microbit More extension' + }), + value: 'ANY' + }, + { + text: formatMessage({ + id: 'mbitMore.tiltDirectionMenu.up', + default: 'front', + description: 'label for front element in tilt direction picker for Microbit More extension' + }), + value: MbitMoreGestureName.TILT_UP + }, + { + text: formatMessage({ + id: 'mbitMore.tiltDirectionMenu.down', + default: 'back', + description: 'label for back element in tilt direction picker for Microbit More extension' + }), + value: MbitMoreGestureName.TILT_DOWN + }, + { + text: formatMessage({ + id: 'mbitMore.tiltDirectionMenu.left', + default: 'left', + description: 'label for left element in tilt direction picker for Microbit More extension' + }), + value: MbitMoreGestureName.TILT_LEFT + }, + { + text: formatMessage({ + id: 'mbitMore.tiltDirectionMenu.right', + default: 'right', + description: 'label for right element in tilt direction picker for Microbit More extension' + }), + value: MbitMoreGestureName.TILT_RIGHT + } + ]; + } + + /** + * @return {array} - text and values for each tilt angle direction menu element + */ + get TILT_ANGLE_DIRECTION_MENU () { + return [ + { + text: formatMessage({ + id: 'mbitMore.tiltAngleDirectionMenu.front', + default: 'front', + description: 'label for front element in tilt angle direction picker for Microbit More extension' + }), + value: 'FRONT' + }, + { + text: formatMessage({ + id: 'mbitMore.tiltAngleDirectionMenu.back', + default: 'back', + description: 'label for back element in tilt angle direction picker for Microbit More extension' + }), + value: 'BACK' + }, + { + text: formatMessage({ + id: 'mbitMore.tiltAngleDirectionMenu.left', + default: 'left', + description: 'label for left element in tilt angle direction picker for Microbit More extension' + }), + value: 'LEFT' + }, + { + text: formatMessage({ + id: 'mbitMore.tiltAngleDirectionMenu.right', + default: 'right', + description: 'label for right element in tilt angle direction picker for Microbit More extension' + }), + value: 'RIGHT' + } + ]; + } /** * @return {array} - text and values for each buttons menu element @@ -1815,6 +1910,26 @@ class MbitMoreBlocks { ]; } + /** + * @return {array} - Menu items for touch pin selector (P0, P1, P2). + */ + get TOUCH_PIN_ID_MENU () { + return [ + { + text: '0', + value: MbitMoreButtonName.P0 + }, + { + text: '1', + value: MbitMoreButtonName.P1 + }, + { + text: '2', + value: MbitMoreButtonName.P2 + } + ]; + } + /** * @return {array} - Menu items for touch event selector. */ @@ -2198,23 +2313,6 @@ class MbitMoreBlocks { blockIconURI: blockIconURI, showStatusButton: true, blocks: [ - { - opcode: 'whenConnectionChanged', - text: formatMessage({ - id: 'mbitMore.whenConnectionChanged', - default: 'when micro:bit [STATE]', - description: 'when a micro:bit connection state changed' - }), - blockType: BlockType.HAT, - arguments: { - STATE: { - type: ArgumentType.STRING, - menu: 'connectionStateMenu', - defaultValue: 'connected' - } - } - }, - '---', { opcode: 'whenButtonEvent', text: formatMessage({ @@ -2252,43 +2350,6 @@ class MbitMoreBlocks { } } }, - { - opcode: 'whenTouchEvent', - text: formatMessage({ - id: 'mbitMore.whenTouchEvent', - default: 'when pin [NAME] is [EVENT]', - description: 'when the selected touch pin on the micro:bit is touched' - }), - blockType: BlockType.HAT, - arguments: { - NAME: { - type: ArgumentType.STRING, - menu: 'touchIDMenu', - defaultValue: MbitMoreButtonName.LOGO - }, - EVENT: { - type: ArgumentType.STRING, - menu: 'touchEventMenu', - defaultValue: MbitMoreButtonEventName.DOWN - } - } - }, - { - opcode: 'isPinTouched', - text: formatMessage({ - id: 'mbitMore.isPinTouched', - default: 'pin [NAME] is touched?', - description: 'is the selected pin is touched?' - }), - blockType: BlockType.BOOLEAN, - arguments: { - NAME: { - type: ArgumentType.STRING, - menu: 'touchIDMenu', - defaultValue: MbitMoreButtonName.LOGO - } - } - }, '---', { opcode: 'whenGesture', @@ -2337,6 +2398,121 @@ class MbitMoreBlocks { } } }, + { + opcode: 'displayClear', + text: formatMessage({ + id: 'mbitMore.clearDisplay', + default: 'clear display', + description: 'display nothing on the micro:bit display' + }), + blockType: BlockType.COMMAND + }, + '---', + { + opcode: 'isTilted', + text: formatMessage({ + id: 'mbitMore.isTilted', + default: 'tilted [DIRECTION] ?', + description: 'whether the micro:bit is tilted in a direction' + }), + blockType: BlockType.BOOLEAN, + arguments: { + DIRECTION: { + type: ArgumentType.STRING, + menu: 'tiltDirectionMenu', + defaultValue: 'ANY' + } + } + }, + { + opcode: 'getTiltAngle', + text: formatMessage({ + id: 'mbitMore.getTiltAngle', + default: 'tilt angle [DIRECTION]', + description: 'get the tilt angle in a direction' + }), + blockType: BlockType.REPORTER, + arguments: { + DIRECTION: { + type: ArgumentType.STRING, + menu: 'tiltAngleDirectionMenu', + defaultValue: 'FRONT' + } + } + }, + '---', + { + opcode: 'whenPinConnected', + text: formatMessage({ + id: 'mbitMore.whenPinConnected', + default: 'when pin [PIN] connected', + description: 'when the selected touch pin on the micro:bit is connected' + }), + blockType: BlockType.HAT, + arguments: { + PIN: { + type: ArgumentType.STRING, + menu: 'touchPinIDMenu', + defaultValue: '0' + } + } + }, + '---', + { + opcode: 'whenConnectionChanged', + text: formatMessage({ + id: 'mbitMore.whenConnectionChanged', + default: 'when micro:bit [STATE]', + description: 'when a micro:bit connection state changed' + }), + blockType: BlockType.HAT, + arguments: { + STATE: { + type: ArgumentType.STRING, + menu: 'connectionStateMenu', + defaultValue: 'connected' + } + } + }, + '---', + { + opcode: 'whenTouchEvent', + text: formatMessage({ + id: 'mbitMore.whenTouchEvent', + default: 'when pin [NAME] is [EVENT]', + description: 'when the selected touch pin on the micro:bit is touched' + }), + blockType: BlockType.HAT, + arguments: { + NAME: { + type: ArgumentType.STRING, + menu: 'touchIDMenu', + defaultValue: MbitMoreButtonName.LOGO + }, + EVENT: { + type: ArgumentType.STRING, + menu: 'touchEventMenu', + defaultValue: MbitMoreButtonEventName.DOWN + } + } + }, + { + opcode: 'isPinTouched', + text: formatMessage({ + id: 'mbitMore.isPinTouched', + default: 'pin [NAME] is touched?', + description: 'is the selected pin is touched?' + }), + blockType: BlockType.BOOLEAN, + arguments: { + NAME: { + type: ArgumentType.STRING, + menu: 'touchIDMenu', + defaultValue: MbitMoreButtonName.LOGO + } + } + }, + '---', { opcode: 'displayText', text: formatMessage({ @@ -2356,15 +2532,6 @@ class MbitMoreBlocks { } } }, - { - opcode: 'displayClear', - text: formatMessage({ - id: 'mbitMore.clearDisplay', - default: 'clear display', - description: 'display nothing on the micro:bit display' - }), - blockType: BlockType.COMMAND - }, '---', { opcode: 'getLightLevel', @@ -2733,6 +2900,10 @@ class MbitMoreBlocks { acceptReporters: false, items: this.TOUCH_ID_MENU }, + touchPinIDMenu: { + acceptReporters: false, + items: this.TOUCH_PIN_ID_MENU + }, touchEventMenu: { acceptReporters: false, items: this.TOUCH_EVENT_MENU @@ -2741,6 +2912,14 @@ class MbitMoreBlocks { acceptReporters: false, items: this.GESTURES_MENU }, + tiltDirectionMenu: { + acceptReporters: false, + items: this.TILT_DIRECTION_MENU + }, + tiltAngleDirectionMenu: { + acceptReporters: false, + items: this.TILT_ANGLE_DIRECTION_MENU + }, analogInPins: { acceptReporters: false, items: this.ANALOG_IN_PINS_MENU @@ -2832,7 +3011,21 @@ class MbitMoreBlocks { /** - * Test whether the touch event raised at the pin. + * Test whether the pin is connected (touched). + * @param {object} args - the block's arguments. + * @param {string} args.PIN - name of the pin. + * @param {object} util - utility object provided by the runtime. + * @return {boolean|Promise|undefined} - true if the event raised or promise that or undefinde if yield. + */ + whenPinConnected (args, util) { + return this.whenTouchEvent({ + NAME: args.PIN, + EVENT: MbitMoreButtonEventName.DOWN + }, util); + } + + /** + * Test whether the touch-pin event raised. * @param {object} args - the block's arguments. * @param {string} args.NAME - name of the pin to catch. * @param {string} args.EVENT - event to catch. @@ -2947,6 +3140,20 @@ class MbitMoreBlocks { return shouldFire; } + if (gestureName === 'TILTED') { + const tiltGestures = [ + MbitMoreGestureName.TILT_UP, + MbitMoreGestureName.TILT_DOWN, + MbitMoreGestureName.TILT_LEFT, + MbitMoreGestureName.TILT_RIGHT + ]; + return tiltGestures.some(name => { + const lastTimestamp = this._peripheral.getGestureEventTimestamp(name); + if (lastTimestamp === null) return false; + if (!this.prevGestureEvents[name]) return true; + return lastTimestamp !== this.prevGestureEvents[name]; + }); + } const lastTimestamp = this._peripheral.getGestureEventTimestamp(gestureName); if (lastTimestamp === null) return false; @@ -2954,6 +3161,56 @@ class MbitMoreBlocks { return lastTimestamp !== this.prevGestureEvents[gestureName]; } + /** + * Test whether the micro:bit is tilted in a direction. + * @param {object} args - the block's arguments. + * @param {string} args.DIRECTION - the direction to check. + * @return {boolean} - true if tilted within the time window. + */ + isTilted (args) { + if (args.DIRECTION === 'ANY') { + return ( + this.getTiltAngle({DIRECTION: 'FRONT'}) >= 15 || + this.getTiltAngle({DIRECTION: 'BACK'}) >= 15 || + this.getTiltAngle({DIRECTION: 'LEFT'}) >= 15 || + this.getTiltAngle({DIRECTION: 'RIGHT'}) >= 15 + ); + } + const directionMap = { + [MbitMoreGestureName.TILT_UP]: 'FRONT', + [MbitMoreGestureName.TILT_DOWN]: 'BACK', + [MbitMoreGestureName.TILT_LEFT]: 'LEFT', + [MbitMoreGestureName.TILT_RIGHT]: 'RIGHT' + }; + const direction = directionMap[args.DIRECTION]; + return this.getTiltAngle({DIRECTION: direction}) >= 15; + } + + /** + * Get the tilt angle in a direction. + * @param {object} args - the block's arguments. + * @param {string} args.DIRECTION - the direction to check (FRONT, BACK, LEFT, RIGHT). + * @return {number} - the tilt angle in degrees. + */ + getTiltAngle (args) { + const direction = args.DIRECTION; + const pitch = this._peripheral.readPitch(); + const roll = this._peripheral.readRoll(); + + switch (direction) { + case 'FRONT': + return -pitch; + case 'BACK': + return pitch; + case 'LEFT': + return -roll; + case 'RIGHT': + return roll; + default: + return 0; + } + } + /** * Display pixcel pattern on the 5x5 LED matrix with brightness and write mode. * @param {object} args - the block's arguments. diff --git a/src/extensions/microbitMore/translations.json b/src/extensions/microbitMore/translations.json index c8cf67e1b3..7af1ce123f 100644 --- a/src/extensions/microbitMore/translations.json +++ b/src/extensions/microbitMore/translations.json @@ -2,6 +2,7 @@ "de": { "mbitMore.name": "MicroBit More", "mbitMore.whenButtonEvent": "Wenn Taste [NAME] [EVENT] ist", + "mbitMore.whenPinConnected": "Wenn Pin [PIN] verbunden wird", "mbitMore.buttonIDMenu.a": "A", "mbitMore.buttonIDMenu.b": "B", "mbitMore.buttonEventMenu.down": "unten", @@ -90,6 +91,7 @@ "ja": { "mbitMore.name": "MicroBit More", "mbitMore.whenButtonEvent": "ボタン [NAME] が [EVENT] とき", + "mbitMore.whenPinConnected": "ピン [PIN] がつながったとき", "mbitMore.buttonIDMenu.a": "A", "mbitMore.buttonIDMenu.b": "B", "mbitMore.buttonEventMenu.down": "押された", @@ -109,10 +111,10 @@ "mbitMore.touchEventMenu.longTapped": "ロングタップされた", "mbitMore.touchEventMenu.doubleTapped": "ダブルタップされた", "mbitMore.whenGesture": "[GESTURE] とき", - "mbitMore.gesturesMenu.tiltUp": "上へ傾いた", - "mbitMore.gesturesMenu.tiltDown": "下へ傾いた", - "mbitMore.gesturesMenu.tiltLeft": "左へ傾いた", - "mbitMore.gesturesMenu.tiltRight": "右へ傾いた", + "mbitMore.gesturesMenu.tiltUp": "前に傾いた", + "mbitMore.gesturesMenu.tiltDown": "後ろに傾いた", + "mbitMore.gesturesMenu.tiltLeft": "左に傾いた", + "mbitMore.gesturesMenu.tiltRight": "右に傾いた", "mbitMore.gesturesMenu.faceUp": "表になった", "mbitMore.gesturesMenu.faceDown": "裏になった", "mbitMore.gesturesMenu.freefall": "落ちた", @@ -121,6 +123,18 @@ "mbitMore.gesturesMenu.g8": "8Gかかった", "mbitMore.gesturesMenu.shake": "ゆさぶられた", "mbitMore.gesturesMenu.moved": "動いた", + "mbitMore.gesturesMenu.tilted": "どれかの向きに傾いた", + "mbitMore.isTilted": "[DIRECTION] に傾いた", + "mbitMore.tiltDirectionMenu.any": "どれかの向き", + "mbitMore.tiltDirectionMenu.up": "前", + "mbitMore.tiltDirectionMenu.down": "後ろ", + "mbitMore.tiltDirectionMenu.left": "左", + "mbitMore.tiltDirectionMenu.right": "右", + "mbitMore.getTiltAngle": "[DIRECTION] 方向の傾き", + "mbitMore.tiltAngleDirectionMenu.front": "前", + "mbitMore.tiltAngleDirectionMenu.back": "後ろ", + "mbitMore.tiltAngleDirectionMenu.left": "左", + "mbitMore.tiltAngleDirectionMenu.right": "右", "mbitMore.displayMatrix": "[MATRIX] を表示する", "mbitMore.display": "[TEXT] を表示する", "mbitMore.displayText": "文字 [TEXT] を [DELAY] ミリ秒間隔で流す", @@ -180,6 +194,7 @@ "ja-Hira": { "mbitMore.name": "MicroBit More", "mbitMore.whenButtonEvent": "[NAME] ボタンが [EVENT] とき", + "mbitMore.whenPinConnected": "ピン [PIN] がつながったとき", "mbitMore.buttonIDMenu.a": "A", "mbitMore.buttonIDMenu.b": "B", "mbitMore.buttonEventMenu.down": "おされた", @@ -199,10 +214,10 @@ "mbitMore.touchEventMenu.longTapped": "ロングタップされた", "mbitMore.touchEventMenu.doubleTapped": "ダブルタップされた", "mbitMore.whenGesture": "[GESTURE] とき", - "mbitMore.gesturesMenu.tiltUp": "うえへかたむいた", - "mbitMore.gesturesMenu.tiltDown": "したへかたむいた", - "mbitMore.gesturesMenu.tiltLeft": "ひだりへかたむいた", - "mbitMore.gesturesMenu.tiltRight": "みぎへかたむいた", + "mbitMore.gesturesMenu.tiltUp": "まえにかたむいた", + "mbitMore.gesturesMenu.tiltDown": "うしろにかたむいた", + "mbitMore.gesturesMenu.tiltLeft": "ひだりにかたむいた", + "mbitMore.gesturesMenu.tiltRight": "みぎにかたむいた", "mbitMore.gesturesMenu.faceUp": "おもてになった", "mbitMore.gesturesMenu.faceDown": "うらになった", "mbitMore.gesturesMenu.freefall": "おちた", @@ -211,6 +226,18 @@ "mbitMore.gesturesMenu.g8": "8Gかかった", "mbitMore.gesturesMenu.shake": "ゆさぶられた", "mbitMore.gesturesMenu.moved": "うごいた", + "mbitMore.gesturesMenu.tilted": "どれかのむきにかたむいた", + "mbitMore.isTilted": "[DIRECTION] にかたむいた", + "mbitMore.tiltDirectionMenu.any": "どれかのむき", + "mbitMore.tiltDirectionMenu.up": "まえ", + "mbitMore.tiltDirectionMenu.down": "うしろ", + "mbitMore.tiltDirectionMenu.left": "ひだり", + "mbitMore.tiltDirectionMenu.right": "みぎ", + "mbitMore.getTiltAngle": "[DIRECTION] ほうこうのかたむき", + "mbitMore.tiltAngleDirectionMenu.front": "まえ", + "mbitMore.tiltAngleDirectionMenu.back": "うしろ", + "mbitMore.tiltAngleDirectionMenu.left": "ひだり", + "mbitMore.tiltAngleDirectionMenu.right": "みぎ", "mbitMore.displayMatrix": "[MATRIX] をひょうじする", "mbitMore.display": "[TEXT] をひょうじする", "mbitMore.displayText": "もじ [TEXT] を [DELAY] ミリびょうかんかくでながす",