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