support for is-gesture (#1873)

* support for is-gesture

* updated shims

* activate shake button

* refactor

* refactor shake button
This commit is contained in:
Peli de Halleux
2019-03-21 07:40:23 -07:00
committed by GitHub
parent 8890614325
commit d640dc5eed
9 changed files with 96 additions and 11 deletions

View File

@ -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
}
}
}

View File

@ -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;