diff --git a/sim/libmbit.ts b/sim/libmbit.ts
index 17554538..f63f3269 100644
--- a/sim/libmbit.ts
+++ b/sim/libmbit.ts
@@ -2,14 +2,12 @@
///
///
-namespace ks.rt.micro_bit {
- export function initCurrentRuntime() {
+namespace ks.rt {
+ ks.rt.initCurrentRuntime = () => {
U.assert(!runtime.board)
runtime.board = new Board()
}
- ks.rt.initCurrentRuntime = initCurrentRuntime;
-
export function board() {
return runtime.board as Board
}
@@ -85,89 +83,10 @@ namespace ks.rt.micro_bit {
throw new Error("PANIC " + code)
}
- /* leds */
- export function plot(x: number, y: number) {
- board().image.set(x, y, 255);
- runtime.queueDisplayUpdate()
- }
-
- export function unPlot(x: number, y: number) {
- board().image.set(x, y, 0);
- runtime.queueDisplayUpdate()
- }
-
- export function point(x: number, y: number): boolean {
- return !!board().image.get(x, y);
- }
-
- export function brightness(): number {
- return board().brigthness;
- }
-
- export function setBrightness(value: number): void {
- board().brigthness = value;
- runtime.queueDisplayUpdate()
- }
-
- export function stopAnimation(): void {
- board().animationQ.cancelAll();
- }
-
- export function plotLeds(leds: micro_bit.Image): void {
- leds.copyTo(0, 5, board().image, 0)
- runtime.queueDisplayUpdate()
- }
-
- export function setDisplayMode(mode: DisplayMode): void {
- board().displayMode = mode;
- runtime.queueDisplayUpdate()
- }
-
- /* serial */
- export function serialSendString(s: string) {
- board().writeSerial(s);
- }
-
- export function serialReadString(): string {
- return board().readSerial();
- }
-
- /* input */
- export function onButtonPressed(button: number, handler: RefAction): void {
- let b = board();
- if (button == DAL.MICROBIT_ID_BUTTON_AB && !board().usesButtonAB) {
- b.usesButtonAB = true;
- runtime.queueDisplayUpdate();
- }
- b.bus.listen(button, DAL.MICROBIT_BUTTON_EVT_CLICK, handler);
- }
-
- export function isButtonPressed(button: number): boolean {
- let b = board();
- if (button == DAL.MICROBIT_ID_BUTTON_AB && !board().usesButtonAB) {
- b.usesButtonAB = true;
- runtime.queueDisplayUpdate();
- }
- let bts = b.buttons;
- if (button == DAL.MICROBIT_ID_BUTTON_A) return bts[0].pressed;
- if (button == DAL.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 b = board();
- b.accelerometer.activate();
-
- if (gesture == 11 && !b.useShake) { // SAKE
- b.useShake = true;
- runtime.queueDisplayUpdate();
- }
- b.bus.listen(DAL.MICROBIT_ID_GESTURE, gesture, handler);
- }
export function onPinPressed(pin: Pin, handler: RefAction) {
pin.isTouched();
- onButtonPressed(pin.id, handler);
+ input.onButtonPressed(pin.id, handler);
}
export function ioP0() { return board().pins[0]; }
@@ -194,59 +113,6 @@ namespace ks.rt.micro_bit {
return pin.isTouched();
}
- export function compassHeading(): number {
- var b = board();
- if (!b.usesHeading) {
- b.usesHeading = true;
- runtime.queueDisplayUpdate();
- }
- return b.heading;
- }
-
- export function temperature(): number {
- var b = board();
- if (!b.usesTemperature) {
- b.usesTemperature = true;
- runtime.queueDisplayUpdate();
- }
- return b.temperature;
- }
-
- export function getAcceleration(dimension: number): number {
- let b = board();
- let acc = b.accelerometer;
- acc.activate();
- switch (dimension) {
- case 0: return acc.getX();
- case 1: return acc.getY();
- case 2: return acc.getZ();
- default: return Math.floor(Math.sqrt(acc.instantaneousAccelerationSquared()));
- }
- }
-
- export function setAccelerometerRange(range: number) {
- let b = board();
- b.accelerometer.setSampleRange(range);
- }
-
- export function lightLevel(): number {
- let b = board();
- if (!b.usesLightLevel) {
- b.usesLightLevel = true;
- runtime.queueDisplayUpdate();
- }
- return b.lightLevel;
- }
-
- export function getMagneticForce(): number {
- // TODO
- return 0;
- }
-
- export function getCurrentTime(): number {
- return runtime.runningTime();
- }
-
/* pins */
export function digitalReadPin(pin: Pin): number {
pin.mode = PinMode.Digital | PinMode.Input;
@@ -370,53 +236,15 @@ namespace ks.rt.micro_bit {
}
- /* radio */
- export function broadcastMessage(msg: number): void {
- board().radio.broadcast(msg);
- }
-
- export function onBroadcastMessageReceived(msg: number, handler: RefAction): void {
- board().bus.listen(DAL.MES_BROADCAST_GENERAL_ID, msg, handler);
- }
-
- export function setGroup(id: number): void {
- board().radio.setGroup(id);
- }
-
- export function setTransmitPower(power: number): void {
- board().radio.setTransmitPower(power);
- }
-
- export function datagramSendNumbers(value0: number, value1: number, value2: number, value3: number): void {
- board().radio.datagram.send([value0, value1, value2, value3]);
- }
-
- export function datagramReceiveNumber(): number {
- return board().radio.datagram.recv().data[0];
- }
-
- export function datagramGetNumber(index: number): number {
- return board().radio.datagram.lastReceived.data[index] || 0;
- }
-
- export function datagramGetRSSI(): number {
- return board().radio.datagram.lastReceived.rssi;
- }
-
- export function onDatagramReceived(handler: RefAction): void {
- board().bus.listen(DAL.MICROBIT_ID_RADIO, DAL.MICROBIT_RADIO_EVT_DATAGRAM, handler);
- }
}
namespace ks.rt.basic {
- var board = micro_bit.board;
-
export var pause = thread.pause;
export function showNumber(x: number, interval: number) {
if (interval < 0) return;
- let leds = micro_bit.createImageFromString(x.toString());
+ let leds = createImageFromString(x.toString());
if (x < 0 || x >= 10) scrollImage(leds, interval, 1);
else showLeds(leds, interval * 5);
}
@@ -427,13 +255,13 @@ namespace ks.rt.basic {
clearScreen();
pause(interval * 5);
} else {
- let leds = micro_bit.createImageFromString(s);
+ let leds = createImageFromString(s);
if (s.length == 1) showLeds(leds, interval * 5)
else scrollImage(leds, interval, 1);
}
}
- export function showLeds(leds: micro_bit.Image, delay: number): void {
+ export function showLeds(leds: Image, delay: number): void {
showAnimation(leds, delay);
}
@@ -442,7 +270,7 @@ namespace ks.rt.basic {
runtime.queueDisplayUpdate()
}
- function scrollImage(leds: micro_bit.Image, interval: number, stride: number): void {
+ function scrollImage(leds: Image, interval: number, stride: number): void {
let cb = getResume()
let off = stride > 0 ? 0 : leds.width - 1;
let display = board().image;
@@ -461,7 +289,7 @@ namespace ks.rt.basic {
})
}
- export function showAnimation(leds: micro_bit.Image, interval: number = 400): void {
+ export function showAnimation(leds: Image, interval: number = 400): void {
scrollImage(leds, interval, 5);
}
@@ -475,6 +303,11 @@ namespace ks.rt.basic {
incr(a)
loop()
}
+
+ export function plotLeds(leds: Image): void {
+ leds.copyTo(0, 5, board().image, 0)
+ runtime.queueDisplayUpdate()
+ }
}
namespace ks.rt.control {
@@ -484,3 +317,182 @@ namespace ks.rt.control {
U.userError("reset not implemented in simulator yet")
}
}
+
+namespace ks.rt.kindscript {
+ export function registerWithDal(id: number, evid: number, handler: RefAction) {
+ board().bus.listen(id, evid, handler);
+ }
+}
+
+namespace ks.rt.input {
+ export function onButtonPressed(button: number, handler: RefAction): void {
+ let b = board();
+ if (button == DAL.MICROBIT_ID_BUTTON_AB && !board().usesButtonAB) {
+ b.usesButtonAB = true;
+ runtime.queueDisplayUpdate();
+ }
+ b.bus.listen(button, DAL.MICROBIT_BUTTON_EVT_CLICK, handler);
+ }
+
+ export function buttonIsPressed(button: number): boolean {
+ let b = board();
+ if (button == DAL.MICROBIT_ID_BUTTON_AB && !board().usesButtonAB) {
+ b.usesButtonAB = true;
+ runtime.queueDisplayUpdate();
+ }
+ let bts = b.buttons;
+ if (button == DAL.MICROBIT_ID_BUTTON_A) return bts[0].pressed;
+ if (button == DAL.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 b = board();
+ b.accelerometer.activate();
+
+ if (gesture == 11 && !b.useShake) { // SAKE
+ b.useShake = true;
+ runtime.queueDisplayUpdate();
+ }
+ b.bus.listen(DAL.MICROBIT_ID_GESTURE, gesture, handler);
+ }
+
+ export function compassHeading(): number {
+ var b = board();
+ if (!b.usesHeading) {
+ b.usesHeading = true;
+ runtime.queueDisplayUpdate();
+ }
+ return b.heading;
+ }
+
+ export function temperature(): number {
+ var b = board();
+ if (!b.usesTemperature) {
+ b.usesTemperature = true;
+ runtime.queueDisplayUpdate();
+ }
+ return b.temperature;
+ }
+
+ export function acceleration(dimension: number): number {
+ let b = board();
+ let acc = b.accelerometer;
+ acc.activate();
+ switch (dimension) {
+ case 0: return acc.getX();
+ case 1: return acc.getY();
+ case 2: return acc.getZ();
+ default: return Math.floor(Math.sqrt(acc.instantaneousAccelerationSquared()));
+ }
+ }
+
+ export function setAccelerometerRange(range: number) {
+ let b = board();
+ b.accelerometer.setSampleRange(range);
+ }
+
+ export function lightLevel(): number {
+ let b = board();
+ if (!b.usesLightLevel) {
+ b.usesLightLevel = true;
+ runtime.queueDisplayUpdate();
+ }
+ return b.lightLevel;
+ }
+
+ export function magneticForce(): number {
+ // TODO
+ return 0;
+ }
+
+ export function runningTime(): number {
+ return runtime.runningTime();
+ }
+
+ export function calibrate() {
+ }
+}
+
+namespace ks.rt.led {
+ export function plot(x: number, y: number) {
+ board().image.set(x, y, 255);
+ runtime.queueDisplayUpdate()
+ }
+
+ export function unplot(x: number, y: number) {
+ board().image.set(x, y, 0);
+ runtime.queueDisplayUpdate()
+ }
+
+ export function point(x: number, y: number): boolean {
+ return !!board().image.get(x, y);
+ }
+
+ export function brightness(): number {
+ return board().brigthness;
+ }
+
+ export function setBrightness(value: number): void {
+ board().brigthness = value;
+ runtime.queueDisplayUpdate()
+ }
+
+ export function stopAnimation(): void {
+ board().animationQ.cancelAll();
+ }
+
+ export function setDisplayMode(mode: DisplayMode): void {
+ board().displayMode = mode;
+ runtime.queueDisplayUpdate()
+ }
+}
+
+namespace ks.rt.serial {
+ export function writeString(s: string) {
+ board().writeSerial(s);
+ }
+
+ export function readString(): string {
+ return board().readSerial();
+ }
+}
+
+
+namespace ks.rt.radio {
+ export function broadcastMessage(msg: number): void {
+ board().radio.broadcast(msg);
+ }
+
+ export function onBroadcastMessageReceived(msg: number, handler: RefAction): void {
+ board().bus.listen(DAL.MES_BROADCAST_GENERAL_ID, msg, handler);
+ }
+
+ export function setGroup(id: number): void {
+ board().radio.setGroup(id);
+ }
+
+ export function setTransmitPower(power: number): void {
+ board().radio.setTransmitPower(power);
+ }
+
+ export function sendNumbers(value0: number, value1: number, value2: number, value3: number): void {
+ board().radio.datagram.send([value0, value1, value2, value3]);
+ }
+
+ export function receiveNumber(): number {
+ return board().radio.datagram.recv().data[0];
+ }
+
+ export function receivedNumberAt(index: number): number {
+ return board().radio.datagram.lastReceived.data[index] || 0;
+ }
+
+ export function receivedSignalStrength(): number {
+ return board().radio.datagram.lastReceived.rssi;
+ }
+
+ export function onDataReceived(handler: RefAction): void {
+ board().bus.listen(DAL.MICROBIT_ID_RADIO, DAL.MICROBIT_RADIO_EVT_DATAGRAM, handler);
+ }
+}
\ No newline at end of file
diff --git a/sim/simsvg.ts b/sim/simsvg.ts
index 1154f4d0..e700ac82 100644
--- a/sim/simsvg.ts
+++ b/sim/simsvg.ts
@@ -188,10 +188,10 @@ namespace ks.rt.micro_bit {
private thermometerText: SVGTextElement;
private shakeButton: SVGCircleElement;
private shakeText: SVGTextElement;
- public board: rt.micro_bit.Board;
+ public board: rt.Board;
constructor(public props: IBoardProps) {
- this.board = this.props.runtime.board as rt.micro_bit.Board;
+ this.board = this.props.runtime.board as rt.Board;
this.board.updateView = () => this.updateState();
this.buildDom();
this.updateTheme();
@@ -227,7 +227,7 @@ namespace ks.rt.micro_bit {
Svg.fill(this.buttons[index], btn.pressed ? theme.buttonDown : theme.buttonUp);
});
- var bw = state.displayMode == rt.micro_bit.DisplayMode.bw
+ var bw = state.displayMode == rt.DisplayMode.bw
var img = state.image;
this.leds.forEach((led,i) => {
var sel = (led)
diff --git a/sim/state.ts b/sim/state.ts
index fc877c4c..04abf1ae 100644
--- a/sim/state.ts
+++ b/sim/state.ts
@@ -1,4 +1,4 @@
-namespace ks.rt.micro_bit {
+namespace ks.rt {
export interface RuntimeOptions {
theme: string;
}
@@ -468,21 +468,6 @@ namespace ks.rt.micro_bit {
}
- export interface SimulatorEventBusMessage extends SimulatorMessage {
- id: number;
- eventid: number;
- value?: number;
- }
-
- export interface SimulatorSerialMessage extends SimulatorMessage {
- id: string;
- data: string;
- }
-
- export interface SimulatorRadioPacketMessage extends SimulatorMessage {
- data: number[];
- rssi?: number;
- }
export class Board extends BaseBoard {
id: string;