support for is-gesture (#1873)
* support for is-gesture * updated shims * activate shake button * refactor * refactor shake button
This commit is contained in:
		@@ -1,30 +1,39 @@
 | 
			
		||||
namespace pxsim.input {
 | 
			
		||||
    export function onGesture(gesture: number, handler: RefAction) {
 | 
			
		||||
    function accForGesture(gesture: number) {
 | 
			
		||||
        let b = board().accelerometerState;
 | 
			
		||||
        b.accelerometer.activate();
 | 
			
		||||
 | 
			
		||||
        if (gesture == 11 && !b.useShake) { // SAKE
 | 
			
		||||
        if (gesture == 11 && !b.useShake) { // SHAKE
 | 
			
		||||
            b.useShake = true;
 | 
			
		||||
            runtime.queueDisplayUpdate();
 | 
			
		||||
        }
 | 
			
		||||
        return b;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export function onGesture(gesture: number, handler: RefAction) {
 | 
			
		||||
        const b = accForGesture(gesture);
 | 
			
		||||
        pxtcore.registerWithDal(DAL.MICROBIT_ID_GESTURE, gesture, handler);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export function isGesture(gesture: number): boolean {
 | 
			
		||||
        const b = accForGesture(gesture);
 | 
			
		||||
        return b.accelerometer.getGesture() == gesture;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    export function acceleration(dimension: number): number {
 | 
			
		||||
        let b = board().accelerometerState;
 | 
			
		||||
        let acc = b.accelerometer;
 | 
			
		||||
        switch (dimension) {
 | 
			
		||||
            case 0: 
 | 
			
		||||
            case 0:
 | 
			
		||||
                acc.activate(AccelerometerFlag.X);
 | 
			
		||||
                return acc.getX();
 | 
			
		||||
            case 1: 
 | 
			
		||||
            case 1:
 | 
			
		||||
                acc.activate(AccelerometerFlag.Y);
 | 
			
		||||
                return acc.getY();
 | 
			
		||||
            case 2:             
 | 
			
		||||
            case 2:
 | 
			
		||||
                acc.activate(AccelerometerFlag.Z);
 | 
			
		||||
                return acc.getZ();
 | 
			
		||||
            default: 
 | 
			
		||||
                acc.activate();            
 | 
			
		||||
            default:
 | 
			
		||||
                acc.activate();
 | 
			
		||||
                return Math.floor(Math.sqrt(acc.instantaneousAccelerationSquared()));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -249,7 +258,10 @@ namespace pxsim {
 | 
			
		||||
        updateGesture() {
 | 
			
		||||
            // Determine what it looks like we're doing based on the latest sample...
 | 
			
		||||
            let g = this.instantaneousPosture();
 | 
			
		||||
            this.setGesture(g);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private setGesture(g: number) {
 | 
			
		||||
            // Perform some low pass filtering to reduce jitter from any detected effects
 | 
			
		||||
            if (g == this.currentGesture) {
 | 
			
		||||
                if (this.sigma < DAL.MICROBIT_ACCELEROMETER_GESTURE_DAMPING)
 | 
			
		||||
@@ -267,6 +279,11 @@ namespace pxsim {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        forceGesture(g: number) {
 | 
			
		||||
            this.sigma = DAL.MICROBIT_ACCELEROMETER_GESTURE_DAMPING + 1;
 | 
			
		||||
            this.setGesture(g);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
          * Reads the X axis value of the latest update from the accelerometer.
 | 
			
		||||
          * @param system The coordinate system to use. By default, a simple cartesian system is provided.
 | 
			
		||||
@@ -378,6 +395,10 @@ namespace pxsim {
 | 
			
		||||
            return this.roll;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        getGesture(): number {
 | 
			
		||||
            return this.lastGesture;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * Recalculate roll and pitch values for the current sample.
 | 
			
		||||
         * We only do this at most once per sample, as the necessary trigonemteric functions are rather
 | 
			
		||||
@@ -401,5 +422,9 @@ namespace pxsim {
 | 
			
		||||
        constructor(runtime: Runtime) {
 | 
			
		||||
            this.accelerometer = new Accelerometer(runtime);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        shake() {
 | 
			
		||||
            this.accelerometer.forceGesture(DAL.MICROBIT_ACCELEROMETER_EVT_SHAKE); // SHAKE == 11
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -433,10 +433,10 @@ path.sim-board {
 | 
			
		||||
                this.shakeButton.addEventListener(pointerEvents.up, ev => {
 | 
			
		||||
                    let state = this.board;
 | 
			
		||||
                    svg.fill(this.shakeButton, this.props.theme.virtualButtonUp);
 | 
			
		||||
                    this.board.bus.queue(DAL.MICROBIT_ID_GESTURE, 11); // GESTURE_SHAKE
 | 
			
		||||
                    this.board.accelerometerState.shake();
 | 
			
		||||
                })
 | 
			
		||||
                accessibility.enableKeyboardInteraction(this.shakeButton, undefined, () => {
 | 
			
		||||
                    this.board.bus.queue(DAL.MICROBIT_ID_GESTURE, 11);
 | 
			
		||||
                    this.board.accelerometerState.shake();
 | 
			
		||||
                });
 | 
			
		||||
                accessibility.setAria(this.shakeButton, "button", "Shake the board");
 | 
			
		||||
                this.shakeText = svg.child(this.g, "text", { x: 400, y: 110, class: "sim-text" }) as SVGTextElement;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user