From d7466797c4c008f7f5d773505ad3280ab012c9ec Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 18 Mar 2016 14:54:27 -0700 Subject: [PATCH] simulation of shake --- sim/enums.ts | 1 + sim/libmbit.ts | 39 +++++++++++++++++++++++++-------------- sim/simsvg.ts | 30 +++++++++++++++++++++++++++++- sim/state.ts | 3 +++ 4 files changed, 58 insertions(+), 15 deletions(-) diff --git a/sim/enums.ts b/sim/enums.ts index a83c547f..8a76a2c3 100644 --- a/sim/enums.ts +++ b/sim/enums.ts @@ -77,5 +77,6 @@ namespace ks.rt.micro_bit { MES_BROADCAST_GENERAL_ID: number; MICROBIT_ID_RADIO: number; MICROBIT_RADIO_EVT_DATAGRAM: number; + MICROBIT_ID_GESTURE: number; } } \ No newline at end of file diff --git a/sim/libmbit.ts b/sim/libmbit.ts index 8dd45886..d77ada4e 100644 --- a/sim/libmbit.ts +++ b/sim/libmbit.ts @@ -216,24 +216,35 @@ namespace ks.rt.micro_bit { let b = board(); if (button == ens.MICROBIT_ID_BUTTON_AB && !board().usesButtonAB) { b.usesButtonAB = true; - b.updateView(); + runtime.queueDisplayUpdate(); } b.bus.listen(button, ens.MICROBIT_BUTTON_EVT_CLICK, handler); } export function isButtonPressed(button: number): boolean { - var ens = enums(); + let ens = enums(); let b = board(); if (button == ens.MICROBIT_ID_BUTTON_AB && !board().usesButtonAB) { b.usesButtonAB = true; - b.updateView(); + runtime.queueDisplayUpdate(); } - var bts = b.buttons; + let bts = b.buttons; if (button == ens.MICROBIT_ID_BUTTON_A) return bts[0].pressed; if (button == ens.MICROBIT_ID_BUTTON_B) return bts[1].pressed; return bts[2].pressed || (bts[0].pressed && bts[1].pressed); } + export function onGesture(gesture: number, handler: RefAction) { + let ens = enums(); + let b = board(); + + if (gesture == 11 && !b.useShake) { // SAKE + b.useShake = true; + runtime.queueDisplayUpdate(); + } + b.bus.listen(ens.MICROBIT_ID_GESTURE, gesture, handler); + } + export function onPinPressed(pin: Pin, handler: RefAction) { pin.isTouched(); onButtonPressed(pin.id, handler); @@ -267,7 +278,7 @@ namespace ks.rt.micro_bit { var b = board(); if (!b.usesHeading) { b.usesHeading = true; - b.updateView(); + runtime.queueDisplayUpdate(); } return b.heading; } @@ -276,7 +287,7 @@ namespace ks.rt.micro_bit { var b = board(); if (!b.usesTemperature) { b.usesTemperature = true; - b.updateView(); + runtime.queueDisplayUpdate(); } return b.temperature; } @@ -285,7 +296,7 @@ namespace ks.rt.micro_bit { let b = board(); if (!b.usesAcceleration) { b.usesAcceleration = true; - b.updateView(); + runtime.queueDisplayUpdate(); } let acc = b.acceleration; switch (dimension) { @@ -299,14 +310,14 @@ namespace ks.rt.micro_bit { export function setAccelerometerRange(range : number) { let b = board(); b.accelerometerRange = Math.max(1, Math.min(8, range)); - b.updateView(); + runtime.queueDisplayUpdate(); } export function lightLevel(): number { let b = board(); if (!b.usesLightLevel) { b.usesLightLevel = true; - b.updateView(); + runtime.queueDisplayUpdate(); } return b.lightLevel; } @@ -329,7 +340,7 @@ namespace ks.rt.micro_bit { export function digitalWritePin(pin : Pin, value: number) { pin.mode = PinMode.Digital | PinMode.Output; pin.value = value > 0 ? 1023 : 0; - board().updateView(); + runtime.queueDisplayUpdate(); } export function analogReadPin(pin : Pin) : number { @@ -340,13 +351,13 @@ namespace ks.rt.micro_bit { export function analogWritePin(pin : Pin, value: number) { pin.mode = PinMode.Analog | PinMode.Output; pin.value = value ? 1 : 0; - board().updateView(); + runtime.queueDisplayUpdate(); } export function setAnalogPeriodUs(pin: Pin, micros:number) { pin.mode = PinMode.Analog | PinMode.Output; pin.period = micros; - board().updateView(); + runtime.queueDisplayUpdate(); } export function servoWritePin(pin: Pin, value: number) { @@ -425,7 +436,7 @@ namespace ks.rt.micro_bit { pin.value = 512; pin.period = 1000000/frequency; } - board().updateView(); + runtime.queueDisplayUpdate(); let cb = getResume(); AudioContextManager.tone(frequency, 1); @@ -436,7 +447,7 @@ namespace ks.rt.micro_bit { pin.value = 0; pin.period = 0; pin.mode = PinMode.Unused; - board().updateView(); + runtime.queueDisplayUpdate(); cb() }, ms); } diff --git a/sim/simsvg.ts b/sim/simsvg.ts index 27df9a3c..737fe65a 100644 --- a/sim/simsvg.ts +++ b/sim/simsvg.ts @@ -182,6 +182,8 @@ namespace ks.rt.micro_bit { private thermometerGradient : SVGLinearGradientElement; private thermometer: SVGRectElement; private thermometerText: SVGTextElement; + private shakeButton: SVGCircleElement; + private shakeText: SVGTextElement; public board: rt.micro_bit.Board; constructor(public props: IBoardProps) { @@ -204,6 +206,7 @@ namespace ks.rt.micro_bit { Svg.fill(this.buttonsOuter[2], theme.virtualButtonOuter); Svg.fill(this.buttons[2], theme.virtualButtonUp); Svg.fills(this.logos, theme.accent); + if (this.shakeButton) Svg.fill(this.shakeButton, theme.virtualButtonUp); this.pinGradients.forEach(lg => Svg.setGradientColors(lg, theme.pin, theme.pinActive)); Svg.setGradientColors(this.lightLevelGradient, theme.lightLevelOn, theme.lightLevelOff); @@ -231,7 +234,32 @@ namespace ks.rt.micro_bit { this.updateHeading(); this.updateLightLevel(); this.updateTemperature(); - this.updateButtonAB(); + this.updateButtonAB(); + this.updateGestures(); + } + + private updateGestures() { + let state = this.board; + if (state.useShake && !this.shakeButton) { + this.shakeButton = Svg.child(this.g, "circle", {cx:380, cy:100, r:16.5}) as SVGCircleElement; + Svg.fill(this.shakeButton, this.props.theme.virtualButtonUp) + this.shakeButton.addEventListener("mousedown", ev => { + let state = this.board; + Svg.fill(this.shakeButton, this.props.theme.buttonDown); + }) + this.shakeButton.addEventListener("mouseleave", ev => { + let state = this.board; + Svg.fill(this.shakeButton, this.props.theme.virtualButtonUp); + }) + this.shakeButton.addEventListener("mouseup", ev => { + let state = this.board; + Svg.fill(this.shakeButton, this.props.theme.virtualButtonUp); + let ens = enums(); + this.board.bus.queue(ens.MICROBIT_ID_GESTURE, 11); // GESTURE_SHAKE + }) + this.shakeText = Svg.child(this.g, "text", {x:400, y:110, class:'sim-text'}) as SVGTextElement; + this.shakeText.textContent = "SHAKE" + } } private updateButtonAB() { diff --git a/sim/state.ts b/sim/state.ts index a2d73fe3..e4c5a767 100644 --- a/sim/state.ts +++ b/sim/state.ts @@ -168,6 +168,9 @@ namespace ks.rt.micro_bit { usesAcceleration = false; acceleration = [0, 0, -1023]; accelerometerRange = 2; + + // gestures + useShake = false; usesHeading = false; heading = 90;