From b4bc985068a4deb35711b5c16eedc2a318756e88 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 12 May 2016 12:35:40 -0700 Subject: [PATCH 001/135] upgraded to lancaster 2.0.0.rc3 (core 0.1.9) added radio.send/receive string --- libs/microbit-radio/radio.cpp | 34 ++++++++++++++++-- libs/microbit-radio/shims.d.ts | 20 +++++++++-- libs/microbit/dal.d.ts | 28 +++++++-------- libs/microbit/enums.d.ts | 18 +++++----- libs/microbit/input.cpp | 16 ++++----- libs/microbit/pxt.json | 3 +- libs/microbit/shims.d.ts | 33 ----------------- libs/microbit/storage.cpp | 43 ---------------------- pxtarget.json | 2 +- sim/libmbit.ts | 20 +++++++++-- sim/state.ts | 66 ++++++++++++++-------------------- 11 files changed, 125 insertions(+), 158 deletions(-) delete mode 100644 libs/microbit/storage.cpp diff --git a/libs/microbit-radio/radio.cpp b/libs/microbit-radio/radio.cpp index f1731994..ab682448 100644 --- a/libs/microbit-radio/radio.cpp +++ b/libs/microbit-radio/radio.cpp @@ -43,7 +43,7 @@ namespace radio { */ //% help=radio/send-number //% weight=60 - //% blockId=radio_datagram_send block="send number %MESSAGE" blockGap=8 + //% blockId=radio_datagram_send block="send number %value" blockGap=8 void sendNumber(int value) { if (radioEnable() != MICROBIT_OK) return; uint32_t t = system_timer_current_time(); @@ -60,7 +60,7 @@ namespace radio { */ //% help=radio/send-value //% weight=59 - //% blockId=radio_datagram_send_value block="send|value %name|= %value" + //% blockId=radio_datagram_send_value block="send|value %name|= %value" blockGap=8 void sendValue(StringData* name, int value) { if (radioEnable() != MICROBIT_OK) return; @@ -81,6 +81,22 @@ namespace radio { uBit.radio.datagram.send(buf, 13 + len); } + /** + * Broadcasts a number over radio to any connected micro:bit in the group. + */ + //% help=radio/send-string + //% weight=58 + //% blockId=radio_datagram_send_string block="send string %msg" + void sendString(StringData* msg) { + if (radioEnable() != MICROBIT_OK) return; + + ManagedString s(msg); + if (s.length() > MICROBIT_RADIO_MAX_PACKET_SIZE) + s = s.substring(0, MICROBIT_RADIO_MAX_PACKET_SIZE); + + uBit.radio.datagram.send(s); + } + /** * Reads a value sent with `stream value` and writes it * to the serial stream as JSON @@ -159,7 +175,19 @@ namespace radio { packet = uBit.radio.datagram.recv(); return receivedNumberAt(0); } - + + /** + * Reads the next packet as a string and returns it. + */ + //% blockId=radio_datagram_receive_string block="receive string" blockGap=8 + //% weight=44 + //% help=radio/receive-string + StringData* receiveString() { + if (radioEnable() != MICROBIT_OK) return ManagedString().leakData(); + packet = uBit.radio.datagram.recv(); + return ManagedString(packet).leakData(); + } + /** * Gets the received signal strength indicator (RSSI) from the packet received by ``receive number``. Not supported in simulator. * namespace=radio diff --git a/libs/microbit-radio/shims.d.ts b/libs/microbit-radio/shims.d.ts index 2887f967..4e65dd5b 100644 --- a/libs/microbit-radio/shims.d.ts +++ b/libs/microbit-radio/shims.d.ts @@ -10,7 +10,7 @@ declare namespace radio { */ //% help=radio/send-number //% weight=60 - //% blockId=radio_datagram_send block="send number %MESSAGE" blockGap=8 shim=radio::sendNumber + //% blockId=radio_datagram_send block="send number %value" blockGap=8 shim=radio::sendNumber function sendNumber(value: number): void; /** @@ -21,9 +21,17 @@ declare namespace radio { */ //% help=radio/send-value //% weight=59 - //% blockId=radio_datagram_send_value block="send|value %name|= %value" shim=radio::sendValue + //% blockId=radio_datagram_send_value block="send|value %name|= %value" blockGap=8 shim=radio::sendValue function sendValue(name: string, value: number): void; + /** + * Broadcasts a number over radio to any connected micro:bit in the group. + */ + //% help=radio/send-string + //% weight=58 + //% blockId=radio_datagram_send_string block="send string %msg" shim=radio::sendString + function sendString(msg: string): void; + /** * Reads a value sent with `stream value` and writes it * to the serial stream as JSON @@ -58,6 +66,14 @@ declare namespace radio { //% blockId=radio_datagram_receive block="receive number" blockGap=8 shim=radio::receiveNumber function receiveNumber(): number; + /** + * Reads the next packet as a string and returns it. + */ + //% blockId=radio_datagram_receive_string block="receive string" blockGap=8 + //% weight=44 + //% help=radio/receive-string shim=radio::receiveString + function receiveString(): string; + /** * Gets the received signal strength indicator (RSSI) from the packet received by ``receive number``. Not supported in simulator. * namespace=radio diff --git a/libs/microbit/dal.d.ts b/libs/microbit/dal.d.ts index bf7467a7..6c924ba1 100644 --- a/libs/microbit/dal.d.ts +++ b/libs/microbit/dal.d.ts @@ -86,7 +86,7 @@ declare const enum DAL { MICROBIT_DFU_HISTOGRAM_HEIGHT = 5, // built/yt/yotta_modules/microbit-dal/inc//bluetooth/MicroBitEventService.h // built/yt/yotta_modules/microbit-dal/inc//bluetooth/MicroBitIOPinService.h - MICROBIT_IO_PIN_SERVICE_PINCOUNT = 20, + MICROBIT_IO_PIN_SERVICE_PINCOUNT = 19, MICROBIT_IO_PIN_SERVICE_DATA_SIZE = 10, // built/yt/yotta_modules/microbit-dal/inc//bluetooth/MicroBitLEDService.h MICROBIT_BLE_MAXIMUM_SCROLLTEXT = 20, @@ -208,6 +208,7 @@ declare const enum DAL { MMA8653_SAMPLE_RANGES = 3, MMA8653_SAMPLE_RATES = 8, MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE = 1, + MICROBIT_ACCELEROMETER_EVT_NONE = 0, MICROBIT_ACCELEROMETER_EVT_TILT_UP = 1, MICROBIT_ACCELEROMETER_EVT_TILT_DOWN = 2, MICROBIT_ACCELEROMETER_EVT_TILT_LEFT = 3, @@ -229,18 +230,6 @@ declare const enum DAL { MICROBIT_ACCELEROMETER_GESTURE_DAMPING = 10, MICROBIT_ACCELEROMETER_SHAKE_DAMPING = 10, MICROBIT_ACCELEROMETER_SHAKE_COUNT_THRESHOLD = 4, - GESTURE_NONE = 0, - GESTURE_UP = 1, - GESTURE_DOWN = 2, - GESTURE_LEFT = 3, - GESTURE_RIGHT = 4, - GESTURE_FACE_UP = 5, - GESTURE_FACE_DOWN = 6, - GESTURE_FREEFALL = 7, - GESTURE_3G = 8, - GESTURE_6G = 9, - GESTURE_8G = 10, - GESTURE_SHAKE = 11, // built/yt/yotta_modules/microbit-dal/inc//drivers/MicroBitButton.h MICROBIT_BUTTON_EVT_DOWN = 1, MICROBIT_BUTTON_EVT_UP = 2, @@ -343,14 +332,22 @@ declare const enum DAL { IO_STATUS_ANALOG_IN = 0x04, IO_STATUS_ANALOG_OUT = 0x08, IO_STATUS_TOUCH_IN = 0x10, - IO_STATUS_EVENTBUS_ENABLED = 0x80, + IO_STATUS_EVENT_ON_EDGE = 0x20, + IO_STATUS_EVENT_PULSE_ON_EDGE = 0x40, MICROBIT_PIN_MAX_OUTPUT = 1023, MICROBIT_PIN_MAX_SERVO_RANGE = 180, MICROBIT_PIN_DEFAULT_SERVO_RANGE = 2000, MICROBIT_PIN_DEFAULT_SERVO_CENTER = 1500, + MICROBIT_PIN_EVENT_NONE = 0, + MICROBIT_PIN_EVENT_ON_EDGE = 1, + MICROBIT_PIN_EVENT_ON_PULSE = 2, + MICROBIT_PIN_EVENT_ON_TOUCH = 3, + MICROBIT_PIN_EVT_RISE = 2, + MICROBIT_PIN_EVT_FALL = 3, + MICROBIT_PIN_EVT_PULSE_HI = 4, + MICROBIT_PIN_EVT_PULSE_LO = 5, PIN_CAPABILITY_DIGITAL = 0x01, PIN_CAPABILITY_ANALOG = 0x02, - PIN_CAPABILITY_TOUCH = 0x04, // built/yt/yotta_modules/microbit-dal/inc//drivers/MicroBitRadio.h MICROBIT_RADIO_STATUS_INITIALISED = 0x0001, MICROBIT_RADIO_BASE_ADDRESS = 0x75626974, @@ -388,6 +385,7 @@ declare const enum DAL { MICROBIT_THERMOMETER_PERIOD = 1000, MICROBIT_THERMOMETER_EVT_UPDATE = 1, MICROBIT_THERMOMETER_ADDED_TO_IDLE = 2, + // built/yt/yotta_modules/microbit-dal/inc//drivers/TimedInterruptIn.h // built/yt/yotta_modules/microbit-dal/inc//platform/yotta_cfg_mappings.h // built/yt/yotta_modules/microbit-dal/inc//types/ManagedString.h // built/yt/yotta_modules/microbit-dal/inc//types/ManagedType.h diff --git a/libs/microbit/enums.d.ts b/libs/microbit/enums.d.ts index fadecb8f..55fcee26 100644 --- a/libs/microbit/enums.d.ts +++ b/libs/microbit/enums.d.ts @@ -69,42 +69,42 @@ declare namespace basic { * Raised when shaken */ //% block=shake - Shake = 11, // GESTURE_SHAKE + Shake = 11, // MICROBIT_ACCELEROMETER_EVT_SHAKE /** * Raised when the logo is upward and the screen is vertical */ //% block="logo up" - LogoUp = 1, // GESTURE_UP + LogoUp = 1, // MICROBIT_ACCELEROMETER_EVT_TILT_UP /** * Raised when the logo is downward and the screen is vertical */ //% block="logo down" - LogoDown = 2, // GESTURE_DOWN + LogoDown = 2, // MICROBIT_ACCELEROMETER_EVT_TILT_DOWN /** * Raised when the screen is pointing down and the board is horizontal */ //% block="screen up" - ScreenUp = 5, // GESTURE_FACE_UP + ScreenUp = 5, // MICROBIT_ACCELEROMETER_EVT_FACE_UP /** * Raised when the screen is pointing up and the board is horizontal */ //% block="screen down" - ScreenDown = 6, // GESTURE_FACE_DOWN + ScreenDown = 6, // MICROBIT_ACCELEROMETER_EVT_FACE_DOWN /** * Raised when the screen is pointing left */ //% block="tilt left" - TiltLeft = 3, // GESTURE_LEFT + TiltLeft = 3, // MICROBIT_ACCELEROMETER_EVT_TILT_LEFT /** * Raised when the screen is pointing right */ //% block="tilt right" - TiltRight = 4, // GESTURE_RIGHT + TiltRight = 4, // MICROBIT_ACCELEROMETER_EVT_TILT_RIGHT /** * Raised when the board is falling! */ //% block="free fall" - FreeFall = 7, // GESTURE_FREEFALL + FreeFall = 7, // MICROBIT_ACCELEROMETER_EVT_FREEFALL } declare namespace input { } @@ -281,7 +281,5 @@ declare namespace serial { Int32BE = 10, // UInt32, } -declare namespace storage { -} // Auto-generated. Do not edit. Really. diff --git a/libs/microbit/input.cpp b/libs/microbit/input.cpp index 600e3a8b..803510df 100644 --- a/libs/microbit/input.cpp +++ b/libs/microbit/input.cpp @@ -59,42 +59,42 @@ enum class Gesture { * Raised when shaken */ //% block=shake - Shake = GESTURE_SHAKE, + Shake = MICROBIT_ACCELEROMETER_EVT_SHAKE, /** * Raised when the logo is upward and the screen is vertical */ //% block="logo up" - LogoUp = GESTURE_UP, + LogoUp = MICROBIT_ACCELEROMETER_EVT_TILT_UP, /** * Raised when the logo is downward and the screen is vertical */ //% block="logo down" - LogoDown = GESTURE_DOWN, + LogoDown = MICROBIT_ACCELEROMETER_EVT_TILT_DOWN, /** * Raised when the screen is pointing down and the board is horizontal */ //% block="screen up" - ScreenUp = GESTURE_FACE_UP, + ScreenUp = MICROBIT_ACCELEROMETER_EVT_FACE_UP, /** * Raised when the screen is pointing up and the board is horizontal */ //% block="screen down" - ScreenDown = GESTURE_FACE_DOWN, + ScreenDown = MICROBIT_ACCELEROMETER_EVT_FACE_DOWN, /** * Raised when the screen is pointing left */ //% block="tilt left" - TiltLeft = GESTURE_LEFT, + TiltLeft = MICROBIT_ACCELEROMETER_EVT_TILT_LEFT, /** * Raised when the screen is pointing right */ //% block="tilt right" - TiltRight = GESTURE_RIGHT, + TiltRight = MICROBIT_ACCELEROMETER_EVT_TILT_RIGHT, /** * Raised when the board is falling! */ //% block="free fall" - FreeFall = GESTURE_FREEFALL + FreeFall = MICROBIT_ACCELEROMETER_EVT_FREEFALL }; //% color=300 weight=99 diff --git a/libs/microbit/pxt.json b/libs/microbit/pxt.json index 47522623..4f54f145 100644 --- a/libs/microbit/pxt.json +++ b/libs/microbit/pxt.json @@ -26,8 +26,7 @@ "pins.ts", "serial.cpp", "serial.ts", - "buffer.cpp", - "storage.cpp" + "buffer.cpp" ], "public": true, "dependencies": {}, diff --git a/libs/microbit/shims.d.ts b/libs/microbit/shims.d.ts index c5fb8383..aecbd407 100644 --- a/libs/microbit/shims.d.ts +++ b/libs/microbit/shims.d.ts @@ -597,37 +597,4 @@ declare interface Buffer { write(dstOffset: number, src: Buffer): void; } - - /** - * This allows reading and writing of small blocks of data to FLASH memory. - */ - //% weight=10 color=#cc6600 -declare namespace storage { - - /** - * Writes the key and buffer pair into FLASH. This operation is rather costly as all the key/value pairs - * have to be rewritten as well. - */ - //% shim=storage::putBuffer - function putBuffer(key: string, buffer: Buffer): void; - - /** - * Gets the buffer at the given key if any. If no key is available, empty buffer is returned. - */ - //% shim=storage::getBuffer - function getBuffer(key: string): Buffer; - - /** - * Removes an entry identified by the key. - */ - //% shim=storage::remove - function remove(key: string): void; - - /** - * The number of entries in the key value store - */ - //% shim=storage::size - function size(): number; -} - // Auto-generated. Do not edit. Really. diff --git a/libs/microbit/storage.cpp b/libs/microbit/storage.cpp deleted file mode 100644 index ef270df5..00000000 --- a/libs/microbit/storage.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include "ksbit.h" - -/** -* This allows reading and writing of small blocks of data to FLASH memory. -*/ -//% weight=10 color=#cc6600 -namespace storage { - /** - * Writes the key and buffer pair into FLASH. This operation is rather costly as all the key/value pairs - * have to be rewritten as well. - */ - //% - void putBuffer(StringData* key, Buffer buffer) { - uBit.storage.put(ManagedString(key), ManagedBuffer(buffer).getBytes()); - } - - /** - * Gets the buffer at the given key if any. If no key is available, empty buffer is returned. - */ - //% - Buffer getBuffer(StringData* key) { - KeyValuePair* pv = uBit.storage.get(ManagedString(key)); - if (pv == NULL) return ManagedBuffer().leakData(); - - return ManagedBuffer(pv->value, sizeof(pv->value)).leakData(); - } - - /** - * Removes an entry identified by the key. - */ - //% - void remove(StringData * key) { - uBit.storage.remove(ManagedString(key)); - } - - /** - * The number of entries in the key value store - */ - //% - int size() { - return uBit.storage.size(); - } -} \ No newline at end of file diff --git a/pxtarget.json b/pxtarget.json index 6020ad55..84cb1434 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -63,7 +63,7 @@ "aspectRatio": 1.22 }, "compileService": { - "gittag": "v0.1.8", + "gittag": "v0.1.9", "serviceId": "ws" }, "serial": { diff --git a/sim/libmbit.ts b/sim/libmbit.ts index d0d7d19c..445dbfdb 100644 --- a/sim/libmbit.ts +++ b/sim/libmbit.ts @@ -457,6 +457,10 @@ namespace pxsim.radio { board().radio.datagram.send([value]); } + export function sendString(msg: string): void { + board().radio.datagram.send(msg); + } + export function writeValueToSerial(): void { let b = board(); let v = b.radio.datagram.recv().data[0]; @@ -468,11 +472,23 @@ namespace pxsim.radio { } export function receiveNumber(): number { - return board().radio.datagram.recv().data[0]; + let buffer = board().radio.datagram.recv().data; + if (buffer instanceof Array) return buffer[0]; + + return 0; + } + + export function receiveString(): string { + let buffer = board().radio.datagram.recv().data; + if (typeof buffer === "string") return buffer; + return ""; } export function receivedNumberAt(index: number): number { - return board().radio.datagram.lastReceived.data[index] || 0; + let buffer = board().radio.datagram.recv().data; + if (buffer instanceof Array) return buffer[index] || 0; + + return 0; } export function receivedSignalStrength(): number { diff --git a/sim/state.ts b/sim/state.ts index e1452e48..c6ef006c 100644 --- a/sim/state.ts +++ b/sim/state.ts @@ -56,7 +56,7 @@ namespace pxsim { } export interface PacketBuffer { - data: number[]; + data: number[] | string; rssi?: number; } @@ -77,10 +77,13 @@ namespace pxsim { } } - send(buffer: number[]) { + send(buffer: number[] | string) { + if (buffer instanceof String) buffer = buffer.slice(0, 32); + else buffer = buffer.slice(0, 8); + Runtime.postMessage({ - type: 'radiopacket', - data: buffer.slice(0, 8) + type: "radiopacket", + data: buffer }) } @@ -128,21 +131,6 @@ namespace pxsim { } } - export enum BasicGesture { - GESTURE_NONE, - GESTURE_UP, - GESTURE_DOWN, - GESTURE_LEFT, - GESTURE_RIGHT, - GESTURE_FACE_UP, - GESTURE_FACE_DOWN, - GESTURE_FREEFALL, - GESTURE_3G, - GESTURE_6G, - GESTURE_8G, - GESTURE_SHAKE - }; - interface AccelerometerSample { x: number; y: number; @@ -196,8 +184,8 @@ namespace pxsim { export class Accelerometer { private sigma: number = 0; // the number of ticks that the instantaneous gesture has been stable. - private lastGesture: BasicGesture = BasicGesture.GESTURE_NONE; // the last, stable gesture recorded. - private currentGesture: BasicGesture = BasicGesture.GESTURE_NONE; // the instantaneous, unfiltered gesture detected. + private lastGesture: number = 0; // the last, stable gesture recorded. + private currentGesture: number = 0 // the instantaneous, unfiltered gesture detected. private sample: AccelerometerSample = { x: 0, y: 0, z: -1023 } private shake: ShakeHistory = { x: false, y: false, z: false, count: 0, shaken: 0, timer: 0 }; // State information needed to detect shake events. private pitch: number; @@ -250,7 +238,7 @@ namespace pxsim { * * @return A best guess of the current posture of the device, based on instantaneous data. */ - private instantaneousPosture(): BasicGesture { + private instantaneousPosture(): number { let force = this.instantaneousAccelerationSquared(); let shakeDetected = false; @@ -287,42 +275,42 @@ namespace pxsim { } if (this.shake.shaken) - return BasicGesture.GESTURE_SHAKE; + return DAL.MICROBIT_ACCELEROMETER_EVT_SHAKE; let sq = (n: number) => n * n if (force < sq(DAL.MICROBIT_ACCELEROMETER_FREEFALL_TOLERANCE)) - return BasicGesture.GESTURE_FREEFALL; + return DAL.MICROBIT_ACCELEROMETER_EVT_FREEFALL; if (force > sq(DAL.MICROBIT_ACCELEROMETER_3G_TOLERANCE)) - return BasicGesture.GESTURE_3G; + return DAL.MICROBIT_ACCELEROMETER_EVT_3G; if (force > sq(DAL.MICROBIT_ACCELEROMETER_6G_TOLERANCE)) - return BasicGesture.GESTURE_6G; + return DAL.MICROBIT_ACCELEROMETER_EVT_6G; if (force > sq(DAL.MICROBIT_ACCELEROMETER_8G_TOLERANCE)) - return BasicGesture.GESTURE_8G; + return DAL.MICROBIT_ACCELEROMETER_EVT_8G; // Determine our posture. if (this.getX() < (-1000 + DAL.MICROBIT_ACCELEROMETER_TILT_TOLERANCE)) - return BasicGesture.GESTURE_LEFT; + return DAL.MICROBIT_ACCELEROMETER_EVT_TILT_LEFT; if (this.getX() > (1000 - DAL.MICROBIT_ACCELEROMETER_TILT_TOLERANCE)) - return BasicGesture.GESTURE_RIGHT; + return DAL.MICROBIT_ACCELEROMETER_EVT_TILT_RIGHT; if (this.getY() < (-1000 + DAL.MICROBIT_ACCELEROMETER_TILT_TOLERANCE)) - return BasicGesture.GESTURE_DOWN; + return DAL.MICROBIT_ACCELEROMETER_EVT_TILT_DOWN; if (this.getY() > (1000 - DAL.MICROBIT_ACCELEROMETER_TILT_TOLERANCE)) - return BasicGesture.GESTURE_UP; + return DAL.MICROBIT_ACCELEROMETER_EVT_TILT_UP; if (this.getZ() < (-1000 + DAL.MICROBIT_ACCELEROMETER_TILT_TOLERANCE)) - return BasicGesture.GESTURE_FACE_UP; + return DAL.MICROBIT_ACCELEROMETER_EVT_FACE_UP; if (this.getZ() > (1000 - DAL.MICROBIT_ACCELEROMETER_TILT_TOLERANCE)) - return BasicGesture.GESTURE_FACE_DOWN; + return DAL.MICROBIT_ACCELEROMETER_EVT_FACE_DOWN; - return BasicGesture.GESTURE_NONE; + return 0; } updateGesture() { @@ -578,16 +566,16 @@ namespace pxsim { if (!runtime || runtime.dead) return; switch (msg.type || "") { - case 'eventbus': + case "eventbus": let ev = msg; this.bus.queue(ev.id, ev.eventid, ev.value); break; - case 'serial': - this.serialIn.push((msg).data || ''); + case "serial": + this.serialIn.push((msg).data || ""); break; - case 'radiopacket': + case "radiopacket": let packet = msg; - this.radio.datagram.queue({ data: packet.data || [], rssi: packet.rssi || 0 }) + this.radio.datagram.queue({ data: packet.data, rssi: packet.rssi || 0 }) break; } } From 0a60b0ee373a973c73324733c587da44028ded3b Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 12 May 2016 12:37:57 -0700 Subject: [PATCH 002/135] 0.2.114 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19255ff5..bb90f842 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.113", + "version": "0.2.114", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From ea10cde3eb1f61ffcc710c373e8c50707c5b6d70 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 12 May 2016 13:41:15 -0700 Subject: [PATCH 003/135] added camp --- docs/camp.md | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 docs/camp.md diff --git a/docs/camp.md b/docs/camp.md new file mode 100644 index 00000000..2bf207e4 --- /dev/null +++ b/docs/camp.md @@ -0,0 +1,158 @@ +# Camp + +Are you ready to build cool BBC micro:bit programs? For each challenge, reorder the blocks to recreate the program. + +## Basic + +### Show your name + +Reorder the blocks below to make the micro:bit show your name. +```shuffle +basic.showString('Hello!') +``` + +### Repeat Forever + +Instead of showing your name once, we will repeat it forever! + +Reorder the blocks to make the micro:bit show the name continuously. +```shuffle +basic.forever(() => { + basic.showString('Hello!') +}); +``` + +### Show leds + +Use the blocks below to draw a figure on the screen. You can redo the smiley face or try something else! + +```shuffle +basic.showLeds(` + . . . . . + . # . # . + . . . . . + # . . . # + . # # # . + `) +``` + +### Show an animation + +To create animation, you can draw multiple drawing using ``show led`` and repeat it. This is just like cartoons in movies. + +Unsuffle the blocks to create a happy, unhappy animation.... or changes the image to make it your own! +```shuffle +basic.forever(() => { + basic.showLeds(` + . . . . . + . # . # . + . . . . . + # . . . # + . # # # . + `) + basic.showLeds(` + . . . . . + . # . # . + . . . . . + . # # # . + # . . . # + `) +}); +``` + +### Your turn now! + +Use the blocks and create your own custom awesome animation! + +## Inputs + +### Button A and B + +Unshuffle the blocks so that the micro:bit shows "YES" when button A is pressed, and "NO" when B is pressed. +The key idea is that all the blocks nested under `on button ... pressed` will run when that button is pressed. + +```blocks +input.onButtonPressed(Button.A, () => { + basic.showString("AAAAA"); +}); +``` + +Try to unshuffle those blocks: +```shuffle +input.onButtonPressed(Button.A, () => { + basic.showString("YES"); +}); +input.onButtonPressed(Button.B, () => { + basic.showString("NO"); +}); +``` + +### Shake + +Using the data from the **accelerometer**, it is possible to detect that the BBC micro:bit is being shaken. + +Unshuffle the code to display a frownie when shaken. +```shuffle +input.onGesture(Gesture.Shake, () => { + basic.showLeds(` +. . . . . +. # . # . +. . . . . +. # # # . +# . . . #`); +}); +``` + +### Tilting + +Aside from shake, it is also possible to detect tilt left and right, logo up and down or face up and down. +Let's build a rock paper scissors game where you turn the micro:bit left to display paper, right to display scissors and down to display rock. + +Unshuffle and try this code on the micro:bit itself! +```shuffle +input.onGesture(Gesture.TiltLeft, () => { + basic.showLeds(` +# # # # # +# . . . # +# . . . # +# . . . # +# # # # #`); +}); +input.onGesture(Gesture.LogoDown, () => { + basic.showLeds(` +. . . . . +. # # # . +. # # # . +. # # # . +. . . . .`); +}); +input.onGesture(Gesture.TiltRight, () => { + basic.showLeds(` +# # . . # +# # . # . +. . # . . +# # . # . +# # . . #`); +}); +``` + +### Pins + +It is possible to use the pins (big metal bar at the bottom of the board) as button. Hold the ``GND`` button with one hand and press the ``0`` pin +(called ``P0``) with the other hand to trigger a pin pressed. + +Unshuffle the blocks to display a smiley when pin ``P0`` is pressed. +```shuffle +input.onPinPressed(TouchPin.P0, () => { + basic.showLeds(` +. . . . . +. # . # . +. . . . . +# . . . # +. # # # .`); +}); +``` + +### Your turn now! + +Use the scree, buttons, gestures, pins to create a fun game using the micro:bit. \ No newline at end of file From da79f643dc183fc2982fc76e15432b45561d6a2d Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 12 May 2016 13:41:34 -0700 Subject: [PATCH 004/135] 0.2.115 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bb90f842..f1e47009 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.114", + "version": "0.2.115", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 7e7dc9194716595418b61105e1ff2d907a57b6d2 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 12 May 2016 13:50:27 -0700 Subject: [PATCH 005/135] updated camp --- docs/camp.md | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/docs/camp.md b/docs/camp.md index 2bf207e4..66ac4d3a 100644 --- a/docs/camp.md +++ b/docs/camp.md @@ -11,16 +11,6 @@ Reorder the blocks below to make the micro:bit show your name. basic.showString('Hello!') ``` -### Repeat Forever - -Instead of showing your name once, we will repeat it forever! - -Reorder the blocks to make the micro:bit show the name continuously. -```shuffle -basic.forever(() => { - basic.showString('Hello!') -}); -``` ### Show leds @@ -36,9 +26,32 @@ basic.showLeds(` `) ``` -### Show an animation -To create animation, you can draw multiple drawing using ``show led`` and repeat it. This is just like cartoons in movies. +### Show animation Forever + +Show one image after the other to create an animation., + +Reorder the blocks to make the micro:bit show a happy, then unhappy face. +```shuffle + basic.showLeds(` + . . . . . + . # . # . + . . . . . + # . . . # + . # # # . + `) + basic.showLeds(` + . . . . . + . # . # . + . . . . . + . # # # . + # . . . # + `) +``` + +### Repeat forever + +Use the ``forever`` block to repeat your code and have a continuous animation. Unsuffle the blocks to create a happy, unhappy animation.... or changes the image to make it your own! ```shuffle From 18bf35f1792be86bf921f304f9bf993f29fa7cc3 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 12 May 2016 13:56:03 -0700 Subject: [PATCH 006/135] updated camp --- docs/camp.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/camp.md b/docs/camp.md index 66ac4d3a..bdda80be 100644 --- a/docs/camp.md +++ b/docs/camp.md @@ -1,17 +1,11 @@ -# Camp +# Getting started Are you ready to build cool BBC micro:bit programs? For each challenge, reorder the blocks to recreate the program. +* If you haven't done so, open [https://m.pxt.io](/) and create a new **Blocks Editor** project + ## Basic -### Show your name - -Reorder the blocks below to make the micro:bit show your name. -```shuffle -basic.showString('Hello!') -``` - - ### Show leds Use the blocks below to draw a figure on the screen. You can redo the smiley face or try something else! @@ -26,6 +20,11 @@ basic.showLeds(` `) ``` +To transfer your code to the BBC micro:bit, +* connect your micro:bit to the computer using the USB cable +* click on **Download** +* drag&drop the **.hex** file into the **MICROBIT** drive +* wait till the yellow light is done blinking! ### Show animation Forever @@ -75,7 +74,8 @@ basic.forever(() => { ### Your turn now! -Use the blocks and create your own custom awesome animation! +Use the blocks ``show leds`` and ``forever`` +to create your own custom awesome animation! ## Inputs From c084bff334df4d066c64cebf57fb3b064290a167 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 12 May 2016 21:56:22 -0700 Subject: [PATCH 007/135] remove logo in simulator --- sim/simsvg.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/sim/simsvg.ts b/sim/simsvg.ts index ffe1ca4b..7fa59e8c 100644 --- a/sim/simsvg.ts +++ b/sim/simsvg.ts @@ -452,6 +452,9 @@ svg.sim.grayscale { animation-duration: 0.4s; animation-timing-function: ease-in; } +.sim-button-label { + fill:#fff; +} @keyframes sim-flash-stroke-animation { from { stroke: yellow; } @@ -478,11 +481,11 @@ svg.sim.grayscale { this.display = svg.path(this.g, "sim-display", "M333.8,310.3H165.9c-8.3,0-15-6.7-15-15V127.5c0-8.3,6.7-15,15-15h167.8c8.3,0,15,6.7,15,15v167.8C348.8,303.6,342.1,310.3,333.8,310.3z"); this.logos = []; - this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "115,56.7 173.1,0 115,0" })); - this.logos.push(svg.path(this.g, "sim-theme", "M114.2,0H25.9C12.1,2.1,0,13.3,0,27.7v83.9L114.2,0z")); - this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "173,27.9 202.5,0 173,0" })); - this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "54.1,242.4 54.1,274.1 22.4,274.1" })); - this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "446.2,164.6 446.2,132.8 477.9,132.8" })); + //this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "115,56.7 173.1,0 115,0" })); + //this.logos.push(svg.path(this.g, "sim-theme", "M114.2,0H25.9C12.1,2.1,0,13.3,0,27.7v83.9L114.2,0z")); + //this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "173,27.9 202.5,0 173,0" })); + //this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "54.1,242.4 54.1,274.1 22.4,274.1" })); + //this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "446.2,164.6 446.2,132.8 477.9,132.8" })); // leds this.leds = []; @@ -502,8 +505,8 @@ svg.sim.grayscale { this.head = svg.child(this.g, "g", {}); svg.child(this.head, "circle", { cx: 258, cy: 75, r: 100, fill: "transparent" }) this.logos.push(svg.path(this.head, "sim-theme", "M269.9,50.2L269.9,50.2l-39.5,0v0c-14.1,0.1-24.6,10.7-24.6,24.8c0,13.9,10.4,24.4,24.3,24.7v0h39.6c14.2,0,24.8-10.6,24.8-24.7C294.5,61,284,50.3,269.9,50.2 M269.7,89.2L269.7,89.2l-39.3,0c-7.7-0.1-14-6.4-14-14.2c0-7.8,6.4-14.2,14.2-14.2h39.1c7.8,0,14.2,6.4,14.2,14.2C283.9,82.9,277.5,89.2,269.7,89.2")); - this.logos.push(svg.path(this.head, "sim-theme", "M230.6,69.7c-2.9,0-5.3,2.4-5.3,5.3c0,2.9,2.4,5.3,5.3,5.3c2.9,0,5.3-2.4,5.3-5.3C235.9,72.1,233.5,69.7,230.6,69.7")); - this.logos.push(svg.path(this.head, "sim-theme", "M269.7,80.3c2.9,0,5.3-2.4,5.3-5.3c0-2.9-2.4-5.3-5.3-5.3c-2.9,0-5.3,2.4-5.3,5.3C264.4,77.9,266.8,80.3,269.7,80.3")); + //this.logos.push(svg.path(this.head, "sim-theme", "M230.6,69.7c-2.9,0-5.3,2.4-5.3,5.3c0,2.9,2.4,5.3,5.3,5.3c2.9,0,5.3-2.4,5.3-5.3C235.9,72.1,233.5,69.7,230.6,69.7")); + //this.logos.push(svg.path(this.head, "sim-theme", "M269.7,80.3c2.9,0,5.3-2.4,5.3-5.3c0-2.9-2.4-5.3-5.3-5.3c-2.9,0-5.3,2.4-5.3,5.3C264.4,77.9,266.8,80.3,269.7,80.3")); this.headText = svg.child(this.g, "text", { x: 310, y: 100, class: "sim-text" }) // https://www.microbit.co.uk/device/pins @@ -567,9 +570,10 @@ svg.sim.grayscale { svg.path(this.g, "sim-label", "M35.7,376.4c0-2.8,2.1-5.1,5.5-5.1c3.3,0,5.5,2.4,5.5,5.1v4.7c0,2.8-2.2,5.1-5.5,5.1c-3.3,0-5.5-2.4-5.5-5.1V376.4zM43.3,376.4c0-1.3-0.8-2.3-2.2-2.3c-1.3,0-2.1,1.1-2.1,2.3v4.7c0,1.2,0.8,2.3,2.1,2.3c1.3,0,2.2-1.1,2.2-2.3V376.4z"); svg.path(this.g, "sim-label", "M136.2,374.1c2.8,0,3.4-0.8,3.4-2.5h2.9v14.3h-3.4v-9.5h-3V374.1z"); svg.path(this.g, "sim-label", "M248.6,378.5c1.7-1,3-1.7,3-3.1c0-1.1-0.7-1.6-1.6-1.6c-1,0-1.8,0.6-1.8,2.1h-3.3c0-2.6,1.8-4.6,5.1-4.6c2.6,0,4.9,1.3,4.9,4.3c0,2.4-2.3,3.9-3.8,4.7c-2,1.3-2.5,1.8-2.5,2.9h6.1v2.7h-10C244.8,381.2,246.4,379.9,248.6,378.5z"); - svg.path(this.g, "sim-label", "M48.1,270.9l-0.6-1.7h-5.1l-0.6,1.7h-3.5l5.1-14.3h3.1l5.2,14.3H48.1z M45,260.7l-1.8,5.9h3.5L45,260.7z"); - - svg.path(this.g, "sim-label", "M449.1,135.8h5.9c3.9,0,4.7,2.4,4.7,3.9c0,1.8-1.4,2.9-2.5,3.2c0.9,0,2.6,1.1,2.6,3.3c0,1.5-0.8,4-4.7,4h-6V135.8zM454.4,141.7c1.6,0,2-1,2-1.7c0-0.6-0.3-1.7-2-1.7h-2v3.4H454.4z M452.4,144.1v3.5h2.1c1.6,0,2-1,2-1.8c0-0.7-0.4-1.8-2-1.8H452.4z") + + svg.path(this.g, "sim-button-label", "M48.1,270.9l-0.6-1.7h-5.1l-0.6,1.7h-3.5l5.1-14.3h3.1l5.2,14.3H48.1z M45,260.7l-1.8,5.9h3.5L45,260.7z"); + svg.path(this.g, "sim-button-label", "M449.1,135.8h5.9c3.9,0,4.7,2.4,4.7,3.9c0,1.8-1.4,2.9-2.5,3.2c0.9,0,2.6,1.1,2.6,3.3c0,1.5-0.8,4-4.7,4h-6V135.8zM454.4,141.7c1.6,0,2-1,2-1.7c0-0.6-0.3-1.7-2-1.7h-2v3.4H454.4z M452.4,144.1v3.5h2.1c1.6,0,2-1,2-1.8c0-0.7-0.4-1.8-2-1.8H452.4z") + svg.path(this.g, "sim-label", "M352.1,381.1c0,1.6,0.9,2.5,2.2,2.5c1.2,0,1.9-0.9,1.9-1.9c0-1.2-0.6-2-2.1-2h-1.3v-2.6h1.3c1.5,0,1.9-0.7,1.9-1.8c0-1.1-0.7-1.6-1.6-1.6c-1.4,0-1.8,0.8-1.8,2.1h-3.3c0-2.4,1.5-4.6,5.1-4.6c2.6,0,5,1.3,5,4c0,1.6-1,2.8-2.1,3.2c1.3,0.5,2.3,1.6,2.3,3.5c0,2.7-2.4,4.3-5.2,4.3c-3.5,0-5.5-2.1-5.5-5.1H352.1z") svg.path(this.g, "sim-label", "M368.5,385.9h-3.1l-5.1-14.3h3.5l3.1,10.1l3.1-10.1h3.6L368.5,385.9z") svg.path(this.g, "sim-label", "M444.4,378.3h7.4v2.5h-1.5c-0.6,3.3-3,5.5-7.1,5.5c-4.8,0-7.5-3.5-7.5-7.5c0-3.9,2.8-7.5,7.5-7.5c3.8,0,6.4,2.3,6.6,5h-3.5c-0.2-1.1-1.4-2.2-3.1-2.2c-2.7,0-4.1,2.3-4.1,4.7c0,2.5,1.4,4.7,4.4,4.7c2,0,3.2-1.2,3.4-2.7h-2.5V378.3z") From 801117d6b029aaac026e26297634b60c21e75bcc Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 12 May 2016 22:23:23 -0700 Subject: [PATCH 008/135] remove head from simulator --- sim/simsvg.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sim/simsvg.ts b/sim/simsvg.ts index 7fa59e8c..9945c3ab 100644 --- a/sim/simsvg.ts +++ b/sim/simsvg.ts @@ -244,8 +244,9 @@ namespace pxsim.micro_bit { let state = this.board; if (!state || !state.usesHeading) return; if (!this.headInitialized) { - let p = this.head.firstChild.nextSibling as SVGPathElement; - p.setAttribute("d", "m269.9,50.134647l0,0l-39.5,0l0,0c-14.1,0.1 -24.6,10.7 -24.6,24.8c0,13.9 10.4,24.4 24.3,24.7l0,0l39.6,0c14.2,0 40.36034,-22.97069 40.36034,-24.85394c0,-1.88326 -26.06034,-24.54606 -40.16034,-24.64606m-0.2,39l0,0l-39.3,0c-7.7,-0.1 -14,-6.4 -14,-14.2c0,-7.8 6.4,-14.2 14.2,-14.2l39.1,0c7.8,0 14.2,6.4 14.2,14.2c0,7.9 -6.4,14.2 -14.2,14.2l0,0l0,0z"); + let p = svg.path(this.head, "sim-theme", "m269.9,50.134647l0,0l-39.5,0l0,0c-14.1,0.1 -24.6,10.7 -24.6,24.8c0,13.9 10.4,24.4 24.3,24.7l0,0l39.6,0c14.2,0 40.36034,-22.97069 40.36034,-24.85394c0,-1.88326 -26.06034,-24.54606 -40.16034,-24.64606m-0.2,39l0,0l-39.3,0c-7.7,-0.1 -14,-6.4 -14,-14.2c0,-7.8 6.4,-14.2 14.2,-14.2l39.1,0c7.8,0 14.2,6.4 14.2,14.2c0,7.9 -6.4,14.2 -14.2,14.2l0,0l0,0z"); + this.logos.push(p); + this.updateTheme(); let pt = this.element.createSVGPoint(); svg.buttonEvents( this.head, @@ -253,13 +254,12 @@ namespace pxsim.micro_bit { let cur = svg.cursorPoint(pt, this.element, ev); state.heading = Math.floor(Math.atan2(cur.y - yc, cur.x - xc) * 180 / Math.PI + 90); if (state.heading < 0) state.heading += 360; - console.log('heading: ' + state.heading) this.updateHeading(); }); this.headInitialized = true; } - let txt = state.heading.toString() + '°'; + let txt = state.heading.toString() + "°"; if (txt != this.headText.textContent) { svg.rotateElement(this.head, xc, yc, state.heading + 180); this.headText.textContent = txt; @@ -273,7 +273,7 @@ namespace pxsim.micro_bit { let now = Date.now(); if (now - this.lastFlashTime > 150) { this.lastFlashTime = now; - svg.animate(this.systemLed, 'sim-flash') + svg.animate(this.systemLed, "sim-flash") } } @@ -504,7 +504,7 @@ svg.sim.grayscale { // head this.head = svg.child(this.g, "g", {}); svg.child(this.head, "circle", { cx: 258, cy: 75, r: 100, fill: "transparent" }) - this.logos.push(svg.path(this.head, "sim-theme", "M269.9,50.2L269.9,50.2l-39.5,0v0c-14.1,0.1-24.6,10.7-24.6,24.8c0,13.9,10.4,24.4,24.3,24.7v0h39.6c14.2,0,24.8-10.6,24.8-24.7C294.5,61,284,50.3,269.9,50.2 M269.7,89.2L269.7,89.2l-39.3,0c-7.7-0.1-14-6.4-14-14.2c0-7.8,6.4-14.2,14.2-14.2h39.1c7.8,0,14.2,6.4,14.2,14.2C283.9,82.9,277.5,89.2,269.7,89.2")); + //this.logos.push(svg.path(this.head, "sim-theme", "M269.9,50.2L269.9,50.2l-39.5,0v0c-14.1,0.1-24.6,10.7-24.6,24.8c0,13.9,10.4,24.4,24.3,24.7v0h39.6c14.2,0,24.8-10.6,24.8-24.7C294.5,61,284,50.3,269.9,50.2 M269.7,89.2L269.7,89.2l-39.3,0c-7.7-0.1-14-6.4-14-14.2c0-7.8,6.4-14.2,14.2-14.2h39.1c7.8,0,14.2,6.4,14.2,14.2C283.9,82.9,277.5,89.2,269.7,89.2")); //this.logos.push(svg.path(this.head, "sim-theme", "M230.6,69.7c-2.9,0-5.3,2.4-5.3,5.3c0,2.9,2.4,5.3,5.3,5.3c2.9,0,5.3-2.4,5.3-5.3C235.9,72.1,233.5,69.7,230.6,69.7")); //this.logos.push(svg.path(this.head, "sim-theme", "M269.7,80.3c2.9,0,5.3-2.4,5.3-5.3c0-2.9-2.4-5.3-5.3-5.3c-2.9,0-5.3,2.4-5.3,5.3C264.4,77.9,266.8,80.3,269.7,80.3")); this.headText = svg.child(this.g, "text", { x: 310, y: 100, class: "sim-text" }) @@ -570,10 +570,10 @@ svg.sim.grayscale { svg.path(this.g, "sim-label", "M35.7,376.4c0-2.8,2.1-5.1,5.5-5.1c3.3,0,5.5,2.4,5.5,5.1v4.7c0,2.8-2.2,5.1-5.5,5.1c-3.3,0-5.5-2.4-5.5-5.1V376.4zM43.3,376.4c0-1.3-0.8-2.3-2.2-2.3c-1.3,0-2.1,1.1-2.1,2.3v4.7c0,1.2,0.8,2.3,2.1,2.3c1.3,0,2.2-1.1,2.2-2.3V376.4z"); svg.path(this.g, "sim-label", "M136.2,374.1c2.8,0,3.4-0.8,3.4-2.5h2.9v14.3h-3.4v-9.5h-3V374.1z"); svg.path(this.g, "sim-label", "M248.6,378.5c1.7-1,3-1.7,3-3.1c0-1.1-0.7-1.6-1.6-1.6c-1,0-1.8,0.6-1.8,2.1h-3.3c0-2.6,1.8-4.6,5.1-4.6c2.6,0,4.9,1.3,4.9,4.3c0,2.4-2.3,3.9-3.8,4.7c-2,1.3-2.5,1.8-2.5,2.9h6.1v2.7h-10C244.8,381.2,246.4,379.9,248.6,378.5z"); - + svg.path(this.g, "sim-button-label", "M48.1,270.9l-0.6-1.7h-5.1l-0.6,1.7h-3.5l5.1-14.3h3.1l5.2,14.3H48.1z M45,260.7l-1.8,5.9h3.5L45,260.7z"); svg.path(this.g, "sim-button-label", "M449.1,135.8h5.9c3.9,0,4.7,2.4,4.7,3.9c0,1.8-1.4,2.9-2.5,3.2c0.9,0,2.6,1.1,2.6,3.3c0,1.5-0.8,4-4.7,4h-6V135.8zM454.4,141.7c1.6,0,2-1,2-1.7c0-0.6-0.3-1.7-2-1.7h-2v3.4H454.4z M452.4,144.1v3.5h2.1c1.6,0,2-1,2-1.8c0-0.7-0.4-1.8-2-1.8H452.4z") - + svg.path(this.g, "sim-label", "M352.1,381.1c0,1.6,0.9,2.5,2.2,2.5c1.2,0,1.9-0.9,1.9-1.9c0-1.2-0.6-2-2.1-2h-1.3v-2.6h1.3c1.5,0,1.9-0.7,1.9-1.8c0-1.1-0.7-1.6-1.6-1.6c-1.4,0-1.8,0.8-1.8,2.1h-3.3c0-2.4,1.5-4.6,5.1-4.6c2.6,0,5,1.3,5,4c0,1.6-1,2.8-2.1,3.2c1.3,0.5,2.3,1.6,2.3,3.5c0,2.7-2.4,4.3-5.2,4.3c-3.5,0-5.5-2.1-5.5-5.1H352.1z") svg.path(this.g, "sim-label", "M368.5,385.9h-3.1l-5.1-14.3h3.5l3.1,10.1l3.1-10.1h3.6L368.5,385.9z") svg.path(this.g, "sim-label", "M444.4,378.3h7.4v2.5h-1.5c-0.6,3.3-3,5.5-7.1,5.5c-4.8,0-7.5-3.5-7.5-7.5c0-3.9,2.8-7.5,7.5-7.5c3.8,0,6.4,2.3,6.6,5h-3.5c-0.2-1.1-1.4-2.2-3.1-2.2c-2.7,0-4.1,2.3-4.1,4.7c0,2.5,1.4,4.7,4.4,4.7c2,0,3.2-1.2,3.4-2.7h-2.5V378.3z") From 9656c1159a12dd8dec8ca8e568b9a1c695fd2d1b Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 12 May 2016 22:23:45 -0700 Subject: [PATCH 009/135] Bump pxt-core to 0.2.125 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f1e47009..a34c50ac 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.124" + "pxt-core": "0.2.125" } } From 7a9c2e0fe46eb85abe7da2e816a0c553f861e949 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 12 May 2016 22:23:46 -0700 Subject: [PATCH 010/135] 0.2.116 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a34c50ac..b2f15b21 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.115", + "version": "0.2.116", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 879a85bdbb7d90c1ce23847767d65d29ff38658a Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 13 May 2016 03:38:52 -0700 Subject: [PATCH 011/135] exposing i2c blocks in pins --- libs/microbit/pins.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libs/microbit/pins.ts b/libs/microbit/pins.ts index 53da784f..1f171df6 100644 --- a/libs/microbit/pins.ts +++ b/libs/microbit/pins.ts @@ -11,7 +11,7 @@ namespace pins { * @param toLow the lower bound of the value's target range * @param toHigh the upper bound of the value's target range, eg: 4 */ - //% help=pins/map weight=15 + //% help=pins/map weight=3 //% blockId=math_map block="map %value|from low %fromLow|from high %fromHigh|to low %toLow|to high %toHigh" export function map(value: number, fromLow: number, fromHigh: number, toLow: number, toHigh: number): number { return ((value - fromLow) * (toHigh - toLow)) / (fromHigh - fromLow) + toLow; @@ -20,6 +20,8 @@ namespace pins { /** * Read one number from 7-bit I2C address. */ + //% help=pins/i2c-read-number + //% blockId=pins_i2c_readnumber block="i2c read number|at address %address|of format %format=i2c_sizeof" weight=7 export function i2cReadNumber(address: number, format: NumberFormat): number { let buf = pins.i2cReadBuffer(address, pins.sizeOf(format)) return buf.getNumber(format, 0) @@ -28,6 +30,8 @@ namespace pins { /** * Write one number to a 7-bit I2C address. */ + //% help=pins/i2c-write-number + //% blockId=i2c_writenumber block="i2c write number|at address %address|with value %value|of format %format=i2c_sizeof" weight=6 export function i2cWriteNumber(address: number, value: number, format: NumberFormat): void { let buf = createBuffer(pins.sizeOf(format)) buf.setNumber(format, 0, value) @@ -37,6 +41,7 @@ namespace pins { /** * Get the size in bytes of specified number format. */ + //% export function sizeOf(format: NumberFormat) { switch (format) { case NumberFormat.Int8LE: From f0c089373be82122f5653c8a19ce647770f20115 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 13 May 2016 04:55:28 -0700 Subject: [PATCH 012/135] updated mobile icons --- docs/static/favicon.png | Bin 0 -> 9497 bytes docs/static/icons/android-chrome-144x144.png | Bin 0 -> 1011 bytes docs/static/icons/android-chrome-192x192.png | Bin 0 -> 1381 bytes docs/static/icons/android-chrome-36x36.png | Bin 0 -> 352 bytes docs/static/icons/android-chrome-48x48.png | Bin 0 -> 450 bytes docs/static/icons/android-chrome-72x72.png | Bin 0 -> 565 bytes docs/static/icons/android-chrome-96x96.png | Bin 0 -> 724 bytes .../static/icons/apple-touch-icon-114x114.png | Bin 0 -> 757 bytes .../static/icons/apple-touch-icon-120x120.png | Bin 0 -> 752 bytes .../static/icons/apple-touch-icon-144x144.png | Bin 0 -> 917 bytes .../static/icons/apple-touch-icon-152x152.png | Bin 0 -> 958 bytes .../static/icons/apple-touch-icon-180x180.png | Bin 0 -> 1063 bytes docs/static/icons/apple-touch-icon-57x57.png | Bin 0 -> 429 bytes docs/static/icons/apple-touch-icon-60x60.png | Bin 0 -> 480 bytes docs/static/icons/apple-touch-icon-72x72.png | Bin 0 -> 543 bytes docs/static/icons/apple-touch-icon-76x76.png | Bin 0 -> 557 bytes .../icons/apple-touch-icon-precomposed.png | Bin 0 -> 1333 bytes docs/static/icons/apple-touch-icon.png | Bin 0 -> 1063 bytes docs/static/icons/browserconfig.xml | 12 ++++ docs/static/icons/favicon-16x16.png | Bin 0 -> 274 bytes docs/static/icons/favicon-32x32.png | Bin 0 -> 382 bytes docs/static/icons/favicon-96x96.png | Bin 0 -> 724 bytes docs/static/icons/favicon.ico | Bin 0 -> 10734 bytes docs/static/icons/mstile-144x144.png | Bin 0 -> 1011 bytes docs/static/icons/mstile-150x150.png | Bin 0 -> 918 bytes docs/static/icons/mstile-310x150.png | Bin 0 -> 971 bytes docs/static/icons/mstile-310x310.png | Bin 0 -> 2036 bytes docs/static/icons/mstile-70x70.png | Bin 0 -> 682 bytes docs/static/icons/safari-pinned-tab.svg | 59 ++++++++++++++++++ 29 files changed, 71 insertions(+) create mode 100644 docs/static/favicon.png create mode 100644 docs/static/icons/android-chrome-144x144.png create mode 100644 docs/static/icons/android-chrome-192x192.png create mode 100644 docs/static/icons/android-chrome-36x36.png create mode 100644 docs/static/icons/android-chrome-48x48.png create mode 100644 docs/static/icons/android-chrome-72x72.png create mode 100644 docs/static/icons/android-chrome-96x96.png create mode 100644 docs/static/icons/apple-touch-icon-114x114.png create mode 100644 docs/static/icons/apple-touch-icon-120x120.png create mode 100644 docs/static/icons/apple-touch-icon-144x144.png create mode 100644 docs/static/icons/apple-touch-icon-152x152.png create mode 100644 docs/static/icons/apple-touch-icon-180x180.png create mode 100644 docs/static/icons/apple-touch-icon-57x57.png create mode 100644 docs/static/icons/apple-touch-icon-60x60.png create mode 100644 docs/static/icons/apple-touch-icon-72x72.png create mode 100644 docs/static/icons/apple-touch-icon-76x76.png create mode 100644 docs/static/icons/apple-touch-icon-precomposed.png create mode 100644 docs/static/icons/apple-touch-icon.png create mode 100644 docs/static/icons/browserconfig.xml create mode 100644 docs/static/icons/favicon-16x16.png create mode 100644 docs/static/icons/favicon-32x32.png create mode 100644 docs/static/icons/favicon-96x96.png create mode 100644 docs/static/icons/favicon.ico create mode 100644 docs/static/icons/mstile-144x144.png create mode 100644 docs/static/icons/mstile-150x150.png create mode 100644 docs/static/icons/mstile-310x150.png create mode 100644 docs/static/icons/mstile-310x310.png create mode 100644 docs/static/icons/mstile-70x70.png create mode 100644 docs/static/icons/safari-pinned-tab.svg diff --git a/docs/static/favicon.png b/docs/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1bbdb910904d89aa93fe7cfd66e1253298620b65 GIT binary patch literal 9497 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 literal 0 HcmV?d00001 diff --git a/docs/static/icons/android-chrome-192x192.png b/docs/static/icons/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..38841bac18dd454389370bc1a27938e3880eebe0 GIT binary patch literal 1381 zcmZWmeKga182|n@Y%{VYL#3kvXq3%*! zO+s0{Ludz3IsmN=nc}nyQp|fBC?b(a4a2vJw{RRB0s{j%kw*3;OisdP#%_ZV9`F8v z1Hw$paymUWHkQ@+xhr_0cfo#II5~RwEme!+FR{69ake&b3U2Box=JD zq!P`baeS9W!aGF4yE{GE&+B&t-vpV>X7lsAz7~F%IOV+GLNzu7M=27IjDjINz=7#_ z3>;>`(HzY6A2tmnR+t(#hrtT*c&YhEvgQ1g{y-lPZqiT%`wYs=ygF)e>bYj@8ohq; zq6Q3ciBbSBRtSNHL{1Zo72Or@@n+=q)6}w|huXX%scBAjHgErdqFeH~KQw=ZHG#Xl~&)Ut;OLF6QJBTTEXTAe*d-qqU=3K?h{xYS+8Zu|W^c z2R7|n)-l)9uOTI8eQb4@8Q|63v$ZC1rCK1R(F$~AX0#+jB2@GRub2fvnb8#ip8B%{ zWdAYE+(0_nap!FS+%%MD{pG`X@!C;Ch%9%=6zQGj!gTRewAzej2lJE>>1>;obR zayg~0QR)$v)6-ege606z*yZqH%0!KumzFh3`L<^Z-JH6843}s;KwUTMWsqp0cw(6d ziL8KLAQ0uof~^caA`kuTkIh(#gODmGzpmEj1#BiN8!Mq0q&!3?_Rud)K_-&pBm#XS zJUGm_WCP5G^A$hQ5F##Wuo|U$RGzACe{n(3G4g5DR&0cgFn?U-2GK3#^SOH`JaJkc z-}J;GH6Xx-Pe&KJ7d7+tX0RgoA%_J-UNZM+9EVNhr}NmvI3E890BPdU89j7TxQ$Im zkg}8ZR|r6ou;e3HLy{rAcmvXq=nYez#2`txSVZN(OGRsEE1?yog#9G`WH7l2&!6#h QDqTH^=ELxodPZmc3x94iZU6uP literal 0 HcmV?d00001 diff --git a/docs/static/icons/android-chrome-36x36.png b/docs/static/icons/android-chrome-36x36.png new file mode 100644 index 0000000000000000000000000000000000000000..7bbbdd15415bc4053bd4bf5e0ad538697657cf71 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB10X`wFKADB*R~xPD)&L4z-C**+p<%|18UD)3Dk7|3fkMnBL4Lsu#}542 zRJIJrE%9`54AD5BoS-0XAibE8nJt;eL49FDa&oXw=(84+SxlyE%^Z82GNdkFI z!?r{P@!1o&*%X301Y=zq--xg?XkIVvh}o?l2DCrCDkP#LD6w3jpeR2rGbdG{q_QAY zA+w+)nSr5V&f`x!9ED*T8mIhEpYePe#K5e~t(VL#tSsz3S%g_w!KK0Ea0;{X<`9L` pH?EvGa^{H45%$v!9t*tm7+#4BmV9zDoeH#q!PC{xWt~$(699LCaLoV! literal 0 HcmV?d00001 diff --git a/docs/static/icons/android-chrome-48x48.png b/docs/static/icons/android-chrome-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..bc7def5b66bba5882d35cb4018a702623b6058f9 GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)ISkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sm`2Ka=y`eYUYnGkSwgUO5;Gyc`rZEwh3>;Y!Sn0O>5X7p}kVrEO0N!Z{$ zqp>3;NX298VIG#rjc!W?wG$aP?U`wD+S%E8p5jGPIz!c@8JQ12@DL0z2^>Zd}0OiTXPx#Do{*RMNDaN0002hur!#MnE!x)Ry7-VI5;RA2$y{# zqEAm}XJ@yUD|B8L-f(aWq9rc?0004WQchCqN77fLy43NSb_ss;Q~1VB_&7T2+0koxDGQr*v7%hroa}3zbyUr z?(@v-dc87HFG5g6M`7sXfIt$ehgyS%X7jz!WA{II4TLUDQwyf|9!eBRa4TEl#Q#}EZ=O9aP>bqoMP=^{M1Iv24 zCa6eP7A`t7do7_~vqSM(s!dlyTidq=?b_pENEBzCe&$+JhtR(`#N5iaT#6H9>8FcL zLCllQgqa<4%I23`-Mg#Jlu0}GLCjr4Gdd1KW1=wB|6mb)0oCQfiT<9r+yDRoS9(-f zbW&k=AaHVTW@&6?Aar?fWguyAbYlPjc%0+%3K74o@Px#JWxzjMNDaN)vz>}n3(^7fYYur00000001i(4FCWD z)~_>{eIn4TGi7CEzMU;hD;i%;5qV=7%w=VRK0fMob&WEM`Tzg`3UpFVQvm<}|02u( z{(n`7%Drm<00F&8L_t(&-tC#&lENSihQaQDOXXmF|99P%bAYO~rOwVI7m9yFJ`Mph zQ$otx);XC19~d`svHxc1wCFa?GH1Rwwb{{}D&L#1#8oC;u7G|n+iPXRoJ zhi|E<@M^br0AliFjXM++0{Q~*97Mn++1`LGduxey0O~AiZSsfbz^%n)%Ry^Z z6-OMjr`Iaq0JtUF3n)WvExcX=_EvUTqtA6c#5w~DuWtcDRe^x-0WeJwum%|EZ18>` zsS&jFmQ)C;OO*;kN1&J`o=5;`tRLvaD`_r8Y-~}+w~v6Uv>!YIXy)ln*HY6j{?aRc zBaB^>EX>4U6ba`-PAZc)PV*mhnoa6Eg2ys>@D9TUE%t_@^00ScnE@KN5 zBNI!L6ay0=M1VBIWCJ6!R3OXP)X2ol#2my2%YaCrN-hBE7ZG&wLN%2D0000Px#Fi=cXMF0Q*)vz@G|NoennE!x)&#N-Bk|~aKA8t+` zIUy3RR#x0?ZB9;3)VW-Nestm7%f+&NUjP6C07*naR9M69*u75zF%$ssS3lrRjb2Uo zaM1WMn-HB`jKeK%I%phO-C%HV!^w|{!5Gkmfr-h%Nf#3S0yqB-{{q|B*TR8Z?iv#l zXcNlg-TO6n?NP|Vwrv9^ot!=iY1gL2bamMkQo1Sg$z(q4u~6fA`G zNtSO~`k}iMew`fb!WO{dy9nmOTo)0auboekKBS3y3?{0C*xZ0U|0@b zXRH)OOA&bp%L!!(U%#&kwuhFEI#C(7p8cJ=T^ru1lSZ-u<%4UKlBlUz)r})w0s3xMoJVR#i&+@)9zb&*(C$%+S^AkyO@5 zuc8mC%F2k$jFa-ytvTE5fP5lZF=sm}3rdPJWhA+HxLY)WL#T5h1+vXHANcP-?% zdYbi>TCV6PXrC$Nx_dh5q?5_p54$O*N5orXF8}}lS9(-fbW&k=AaHVTW@&6?Aar?f zWguyAbYlPjc%0+%3K74o@Px#Fi=cXMb)r000030|NoennE!x)CL0V^KNU_+PIovs ziEtjTkSS+pXPHV$;&E|@hlk?a$iM=EJ^%m#`$FZ=}u@B z48%VVV2}_8Cz6^tIEW~-O_ZIb%W_ow%B5ev*JQS zX5}C=?q8^G)&_feA-J_OY(5U?>l!u3jeTyMoOarw0Pl-8Q! zD&0hJR~-EjyH9k}iyq=-F--Ek1e_2FICj~KaV3V&Fn&#oYZ$j?kMkltcaqFqG1B8g zkOI$Is}gYfh3;4I+||{tlB>93>xk`>{wlB!LwP8YVmxqlUW8DkTTu)EvH`{_#V9v$ z)E9WxHIUO7k&}rk)Kn=;km`s$f;%cjj>2QCs@ghbdoR=-$;T;&e*|{4aKzaqmY3m0 zYDPSb;F8A0;WRD{751A`IC|zJtZV#m8BEhVh3T+eiBX^p5)TEU*cFWegTS2-M%V*H z1{)l3$ZQw@3q(4FO`dO&xr2D>5{RJFVOX>aOhaP2QCNj5_7-QuIflQ?@CL*CX847_ zx-`S`jjIW^@3$?s_|M^QHxi)16%rMz00012dQ@0+Qek%>aB^>EX>4U6ba`-PAZc)P zV*mhnoa6Eg2ys>@D9TUE%t_@^00ScnE@KN5BNI!L6ay0=M1VBIWCJ6!R3OXP)X2ol i#2my2%YaCrN-hBE7ZG&wLN%2D0000Px#Fi=cXMF0Q*)vz@G|NoennE!x)W>XVnWMsslFOzv8 zH6Ig%XCbbSDqt=y#bRO@4F%rTzc$;ic>n+cph-kQRA}Dq+COU)K@i0{D-^LA!_w|g_QS=g`#B?TjhAc6?GR!}EoQ-{BrKo6Ny+%^z% z3=OTgLNhTGvJy^-m2hQ@tx9Oc9h#BQeS!!gh@k%nI^Ia?vw;H?1Q^;T=rSQ6k9|)o z`?^DF;)9K3mmQs``je?3S)QRfLFv$}3-s|IxkE1eKpXh*lvcJQw5Fn4Wb}=AP&g4% zb95|kuW#e}*z^~NzNfFF%Z5Tx6ovR=JqO8_f>2kVLJsKkBIx-Tw9bpUjOkZMAIe-uY0&tk<%ZVEfF7qokCDO zK^im{58BTC#FhaSfAlLIa=vFPh@RN41gd>42|5c1x-#hIPg>ao<%0&V(DA2tt!{&+ zl}0a7vh&S`MgWVZ(Ode0rKml^QnbI z`T62MkRXogv7UI``)x*U;Woxz^Up1vz7t6sLE`k-2mLitGb80C@0e5?J)8^@$nW8? zL#gQt^&6I3kzFfeZ5pZ!apzr8%n##i-iGRZc`*6;Y^aYr%kQjbLAw(ntFv5Do(-94 ztIPCr7PM%lM=TT@l1mC~sD+_D1Oe_GiDobm*pR4s8WM>Q8d`=X@U;Nofrv%~eV&X! zMGIiFrrQ9X0dTt&$)pMVbR*t&$3QX+BmzN6n}ozc4aIE){fp2i33c3|_#LD(v=l?j zuFxO-!q*Y1nm5NCH;DdmfFObhB4}d#1?>Hj#^CMeT>t<8S9(-fbW&k=AaHVTW@&6? zAar?fWguyAbYlPjc%0+%3K74o@g+ud00004XF*Lt006O% z3;baP00001b5ch_0Itp)=>Px#Fi=cXMF0Q*)vz@G|NoennE!x)X;2!Wi$i5)WFr;{ zw3REaSW8GW7TIiU%cwDka318)u+MnjUjP6C$w@>(RA}Dq+CNX*KokJ*7m_q-3~C-y zX(N;fx^!#=11p24sskC)q3m>QDx|W8Z;))Ast)avE<_!>Fmz-9HnyZ6pc3DpzJI=F z$03PxghqN#!shwz{d~c9i2=h4hXIT+#u#IaEe31De32#CycWPph;70Av12d?7Ch0| zOBWbuY|9C@qp+3}Y(-(f7-Nhv#@GX5zCSKuZ27R?Zz%SfSHN;&tNxkTd2*Zc$z5;G zKc5xL`TKTisd{}#?-*MmEFp@`HZP}p!m_(6>N5(uY5PmQUu zeT(J%ugUXlAy^%}G}s=%@hB#@vtz+8tKJA!Pl<)wI94E-*HpV-s$RT%mz0txOLR(X z+IhAZEb9sr`Ed%YZi*w=9{fzTHd}?sD?rD)?_je^Z&k}C-(qNHKmx);6 zL`7>xOqZR^a!)%JOLK$#KVp%$5I3Jr#U_6UKPWcl2Ai>^#7aG00gT-PR*dECyPIPe zB9_DBdHmbGB>hfnZ>zNK>dSD`X1dg3r=6fn*gQO=8F)2-$M#f^2~N}>gl8H+u^Pcp z_fa7VNp(it&<-tjWBSObh#nn+sY)|+?|^1Os}$`IOm;prjUw}&6D%Wtzzs7JHGH50 z1vm%?+NQYLcL~;q(e_LX>p)_2-)uvyksfQ9m*EbJjBKD^IO%8S##6C*)S)wjVDc|d zNHKBpBAVXv0->Fips&7e-V6_dF3m?UInP2&eA6dbS)9pY7+l!35Uc76jUhG=4~K{u z6tNNPZqP5=M; zvhxRil!r0K7-MWP*gt6O)(8!E!D;{i09SfcSaechcOY6Cgx@G{a;ABePT>%h=S&#LUDT g#0SfONT5nC0O}VJbn-$ql>h($07*qoM6N<$f*-1^Bme*a literal 0 HcmV?d00001 diff --git a/docs/static/icons/apple-touch-icon-180x180.png b/docs/static/icons/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..9f071c4ea2865d5a9e4e6abd54499931bd575deb GIT binary patch literal 1063 zcmV+?1laqDP)Px#El^BUMF0Q*)vz@G|NoennE!x))6>#cH62h;P-|8e zlX@X28Vt!}W3rSh#G)_h+_87?jdK7112suRK~!ko?b|}KS`~-lkVO5 zzjaDe^KOVD-MinN<#)#^DC|LIg%M3O(L@tXG|@LrAM}~6Qh27(_nFP|7}1ZI-GbL=63ZqI22NuB0E@ry0>i6HPSHMBf71(>I&mCu?*$ zc&eQT!Dm}^J_ro@glM8~Ci!R$A^PTNIaTs9uk&K66bA#bY#TFaJvzX2eCiTS^jw;y zp=az$+Gn(e+)ldiIxg$}Axa4bojZ=p5eko&xG&SQOje6>kqArCGI7g6z<0q{BCpF+ zr%XEf`MlZqujmG^PD8)(X3*n9I(po+FqMu>FAd$0JxtO(APvo1=4R3t8vUXzjvvqP zq8cY3(^kM0=~c=?`ZyE%JUjYG9oD1y;HKwwKgzu{bR(G`izoVu^eStJEbic|cK&wI zv_&uVaF>qG2T!u2PuHNAdfJ^!r+bhldZLTdtaeXcyGh$gqUR>x3DHDv98D9QXrdMU zvfj}uOQWh8->aLOg%Vur7d~81(hfjf3jzRNZ?*$q_GSh-aR{Qf;k(zXprG&@V?*t8 zxb;4})O$07wxLsmnnCk`p8CASD8Q>|BaCW$UECQD+Eo{Z(ew7GuhA~AFR3v({Gt33 zIYl0_jfZUp@vhj8uhEWZv8TQcad*3>!`|WV%m{MCZ&jTZ?ZTv0P3#}h80Fv`M4Lgf zZm7{Mvz@OUP`8*igIemK=x{OJTTF-Q^JPREqi!1aT4YpllEz6>HG*XGkxq+hP)RI? zi0L2vI|H2QMo=_^geDzb(AZ9YAji9iWgdo~%2hl`ybvnx0p+*})Azy`B zh~5VXVK-XFzy(pdFm5(J@gXjIJ%G-52;d}_d?UyYqrP56AvH{kg6Oz4qIuD1{TL=8 zL~jIL$&S7&=|lVUo%lUf`}EK3==U-G+d7@RB)xB&zNg+Aw@v?1^x@Ddy@lVfF7 z004NL!lvI6;x#X;^) z4C~IxyaaMo0(?STf%Mf4CjbBcpD|;`|AvOt)YKGRU2R3~oJi5Bbtbzyyx%>)P$oOE z9H{Pyr;B5V#p&dLL(C!)ZA;cLG3zl*;ys{wnq^9=#Ia2}oC-~1o1W}G#hS8-*_n%Z zf{9I9m-!Zta)aXn#VkUTLp!EK_e@l21%8LK0> z1RnBipKfYm!XU<-XK?evg$qnQ7DbC)Wf~iqSvPUNm~o5MqEV-ejZqv>6_97%Z5;Bry3X>%|6^9z_@9o1PAlxiOo9oVR{Crq0da zF)um2Yhjl^&_Cf-ArU1(iRB6fMfqu&IjIUIl?AB^nFS@u3=9=>9)IHDC=AokIOTu( zjOWuJ24-b$y<~1-Wnu5hBFw@HE)6D!Q<#-EhbWxBaplC3Ge=~Ou%B-5Sm33{@Jd{; URG<|Mp00i_>zopr0Jdk9RsaA1 literal 0 HcmV?d00001 diff --git a/docs/static/icons/apple-touch-icon-60x60.png b/docs/static/icons/apple-touch-icon-60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..3a9a4eee78f6fd60d02651ce04ad67292cd258f6 GIT binary patch literal 480 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 z004NL + + + + + + + + #9f00a7 + + + diff --git a/docs/static/icons/favicon-16x16.png b/docs/static/icons/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..1a00843e294df35df077f502f5a363ed29e9d2ad GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFjLdqI|j zSA|5B1SOU$6cpvBW#*(RlvEa^Dr6RvBr`Bn%z6BYhodk|L*tbH=`)^BgBX~Vx%HB{ zg_VW9CyOu(E4Vb698O_Y-W;NE`o@(LN6s9PIl_Lr!DE4!9>Xhf!IDo-rc;4dFnGH9 KxvXNS%G}U;vjb? zhIQv;UIICa0X`wFKAD9;=G6@*GiJ>AS6}a>C^5NGu_Ru6?;PD*IXTUCc3F2-rhs&o z1o;IsI6S+N2IO>mx;TbtoKH?rkTu|1#K6erXyV|?DCp=IxJOHdm6bV=)rCdfs_W6E zq#Ta0jRi^pts4vj4hU#5TvF2E5p7`Hz~I4sK{mnoVAKM>VwD%uJ5_#!g$4w81_XEr z`iM4$c5plW4dZa(acXK3awuD*&=Qam5EOJNKq$y7C?qJvi>b(fbw&WI$cc_@1_x6O zEAOYjGl9+uuL_AM2}&$iC@9KL%gjktD5)$+RmdzTNoHWEnDh7(4@Y5`hQ=xX(`P)N z1~D)zbL%B@3o8qIPZnVoR&Z%BIh?|*yg5YS^o=Vgj+{9nbAPx#JWxzjMNDaN)vz>}n3(^7fYYur00000001i(4FCWD z)~_>{eIn4TGi7CEzMU;hD;i%;5qV=7%w=VRK0fMob&WEM`Tzg`3UpFVQvm<}|02u( z{(n`7%Drm<00F&8L_t(&-tC#&lENSihQaQDOXXmF|99P%bAYO~rOwVI7m9yFJ`Mph zQ$otx);XC19~d`svHxc1wCFa?GH1Rwwb{{}D&L#1#8oC;u7G|n+iPXRoJ zhi|E<@M^br0AliFjXM++0{Q~*97Mn++1`LGduxey0O~AiZSsfbz^%n)%Ry^Z z6-OMjr`Iaq0JtUF3n)WvExcX=_EvUTqtA6c#5w~DuWtcDRe^x-0WeJwum%|EZ18>` zsS&jFmQ)C;OO*;kN1&J`o=5;`tRLvaD`_r8Y-~}+w~v6Uv>!YIXy)ln*HY6j{?aRc zBaB^>EX>4U6ba`-PAZc)PV*mhnoa6Eg2ys>@D9TUE%t_@^00ScnE@KN5 zBNI!L6ay0=M1VBIWCJ6!R3OXP)X2ol#2my2%YaCrN-hBE7ZG&wLN%2D00003eO9(0?ELn6Zh?ExL&PAjsRH+h|l!(SfM2qP1 z2lxZ@G<1~w3XXYqUNkrCeb}-u9Ntm(W@qN@&fB>;=MtHyL3`9{wOH>{zd`hrh=L%o ze>RC;vu`*gjtBJlKGDm4qCR6I6kM*)fc}tlq+1N~XD}jv3kbWXvS zbD$1*j*Dt)>s6Fz@ccM+uky}d_p*CuVX-F$cxGX|KlwcHb-4LD@ZZf5MqTek-TBwG z?ses@d;Re6>aYISm`$CP|DPAR#wz=3Zkyom;sl@ORTih$ZQCx(%i<&-*Ewapia9vU zX0t!_cJTxcm%oU=?iZKs^2u`}t}!wW4)R^f#Z&S}9PdY2IJvjZ3tPThxwyI3XrIhs zdEg9o4lOa7e;!V*(|NTmu~~EQ!gHP#mt5pL3%^T#*_SxCtNvv$vgfL-pXTebT|UVX zagCAjZO(OGm+kUNPKaxajQjb`{~b})Jt)%$WiVCo)p^QrD}&MddV6=C0e`Rkz4kp& zX%BF@E6tbruD=EkaJO>GlTGfu&AmQa(q8)t>~aN??+o#S8%wsHqexr-7E}H2gssyL L9EHE&SX9^FsrL%R literal 0 HcmV?d00001 diff --git a/docs/static/icons/mstile-144x144.png b/docs/static/icons/mstile-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..544f4f49940571b76099f1608b5c57bf2a047313 GIT binary patch literal 1011 zcmVPx#KTu3mMNDaN)vz@GfPk2om@Fd&*041I001~H3;+NC z859JQc_6ZrDossI!=WxNAPa0*6G|Fdpt=qLkaX|dgzANS}b z@N<-*Jg2IPgM)*EgM(w2IG)5u!<}auQAC`A=PXKz(mXd&L7x7qiK3#I8+sC*N&^W7 zF^EA7Vi1EE#2^NJ3&^>2i~9iRaE;gP_5yLGW>5xHFJtcmyTkzl=w}(^ zI_dqipqdA#v-O@@TdLm=6!hXV#`U1>-@-EJHIV=C zrw;Q%PWW>fgNg*Xwrz_79ZH*J3}VpNflO)Bo+~wj81#i8_foTPt3eLBNId!K+aNuP z?wVz~J=b5(+X6^|GQvo@7pUPS4LzgfF7 z004NLt@9 literal 0 HcmV?d00001 diff --git a/docs/static/icons/mstile-150x150.png b/docs/static/icons/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..2293492c148ff1047a9caa25a9decabd6debd2c7 GIT binary patch literal 918 zcmeAS@N?(olHy`uVBq!ia0y~yVB`Z~7G|JG*Ze2bfD}u*qpu?a!^VE@KZ&eBK4Wo^ zyA#8@b22Z19Q6R75Lchf!U^RHn(~}LfrIn)faKK;CNpNt_*-9}=A^i5rjEbA|JKMz zk**~tfO4!QL4Lsu|NgemtJ-az$-uxg)6>N`hD;Bz4hM=o>uVr{r=1I zB`)gS-);KegECBjR>48ZUXD|h%VrmfOu2gPOohOd?`|8FZ?wf7+q>2(?s`(BiTE>( z6~_;;lw5FRmjx50FFEul9e!Nk#V%|5c1D_2Sj_g43xRh&s{5>;{^Hw@=G|FkcLdvB z{u3;%;d{AYaha_77rRaUcOUlMKlka{>FWyacU%1L@ z-P+T-)>;*HJ?3u>>JOHQ{yx6R`sRw{Py1s3+C8iBy?=S%UYi~FHg^9t`CWHEe*5LU z&m1(EduGX!#eJTg?tc@%Se)gvE;ahT za`t)YdlIt09zWl?(^BYe}3L|x*?i%RC4W$>X~ZQi*FQ)E!khHKUZbv=9$tv zSxZ)%2ECO?vHHa-+ufw~-A3}yblFL7H(cIQB>Q%W@~^m~vUSNX`rov8x|i(L*|d1( z`wjNjgWnlEe}7!|+iDfriy0H8fAa0VDVtT+Vfahw(nj`6;+B(JcD`SJqTJrd`UU^Q zEj{UtPt1k^tD9DV7+S<7{ze@O@JO>mFuL_AM2}&$iC@9KL%gjktD5)$+ zRmdzTNoHWEnDh7(4@Y5`hQ=xX(`P)N1~D)zbL%B@3o8qIPZnVoR&Z%BIh?|*yg5YS p^o=Vgj+{9nbANS%G}U z;vjb?hIQv;UIIDN0X`wFKADBPdn_gvssaUo;OYjG88c@5t*?)D(W~X)xd;?uDGBlm zX88B7{j1ia4?s(9d%8G=RNQ)d>%5DhOY zlj@H5%u~9nvwr@Sr`?BFB(q=oc%t#kefzkQi>~6a=)}#vrynibSG{e=HL&E&GnkQ{zSc4)UCJc#isM6Rhzc>-QNFV z(P_WfcV4I6kIx8M@3H4}YUaIvavxU4OlAA&^=0o~xw&EMUqnnVnydH9=hS<5?%0yf zT`|3C(PcBAo1ZM#e74JX`p;jfyZ&5!n*J$v-6tmB={I6`>TQ?T**&Lh=V`atmqqU_ zs#2!&)$BX7{cX|JUcKq3FP~n!E5-lay?yISZqJ!)XBlzt{iUOS^J;9JxBA7uE?R%u zw|w`Xx4)+M#>R**>DG(>+b0?8yUhE~-;9;r_xF}wd|J6n=2y+n>!Evgf&KDk;pu}8 z;=f_xQ&|~%Oflw)FmJo!FRr=0i%#=Cz8J{Sd}MdZ*J)5n4mt575>)mYf`r?O0 z6|tvcKZ$&Oqkrn>|Kcg)()^R&ZPGgD7XJCHzZd`Y>i?dFMZ4_0WB=%9O}Vdf=V{HA zJ^X&NJg@WfMJ-Ofk~*zqdghhX9SgndotJ(pPFv;8zPn|Ix82*x?7Kw%zmAxmm25QU zDdQ`>qg+?|-B+*j{=@06Qa=!y5 z!>d9fN`ey06$*;-(=u~X6-p`#QWY`_N|G5ED&{=?#KTb-rlE1l|MVHpr$G$N%G`R% z+``Jj-jhX`g%w;HOb(|oD{l@_IDO;Fi6du@$Q)rm-QcmnOON4|xM0aAC)24Q`#oL# KT-G@yGywpi@x$Bz literal 0 HcmV?d00001 diff --git a/docs/static/icons/mstile-310x310.png b/docs/static/icons/mstile-310x310.png new file mode 100644 index 0000000000000000000000000000000000000000..0741b6a1c4c029885d93157c82c7caffb264a1be GIT binary patch literal 2036 zcma)7c~Dd57LP@6K`fS995?jaLE+HWy64rzOO{eo-``%xEGv}N+zw?{#oH^&r_gy>e zMl@QwdMOTvGa|V-d*EzM&a1Y`>Tz>Of zsm|Ga_>kv;LyXX^<|`KKFSyBAz1;At*Xej&q`hEUT3XutrAt2Km5CANJQz=!-2kF@54fISUWj9qEyfLUmSH_o}h)wTEEBo>;q;@7b zrxl8=y&_ASy`xh-Us2l1cK_DUWJRKcLf4|QOTkS|Nzm{eOw!IGL5z+Ck7Ymw)D_rv zd8*_(`cewD<(eb`M?{{zR&NiOg3y;J+EH-*S~GDxCmEZbp8mL;&Hr)Td~9N;m@YSSoQggxf&aNBWw#v%B9>$TxE$}Q=dQW6*>%E=Ed6PBw7 z!i{8wtKObN*QQtx_t8e}CGV#Pk(cndT%TUFhw}2%@ES!J;i)(Qm(k_~nJNeTmcn^fTk^{7}^#cRkK6e|37A$8E{f$+(bap5db>vw|q&e*v z>r->9(&kaU5ya?Y_WBW{&R2`r?{A=A?>NZLc4b8p%DaDVoE<;nAdN;xMS6FpGAbn- z+&i$?v9aWzp7Ypc_V*B&^HQIBH+-8QJ>nkK0-D7 z1>J?p3P%?F!#pKHH&E38h@3~{S}{5?T>o&LH0fgE1x{y0JYVIMIDOY&AdE$(DMkMo ze~T7Ku6Kr~Cq_8`+^Oz<;A`eJ4qNUpMI6at{{OPkN`!_M+T9w#O!np-;Pzb6zOoWl zO}6peYAV+I*=s*?=#_C;usz-0GH=P&j3$Re!0pJbTh0UvJkcefX6$WjQP+?GTd*vK z6)@0iJaWd*Dtnr#J@S1a?T${fSF zrO#d_JkAe?Lr=(EA8n3{abvGlhb!$;WwlkyOo>lNn>0My5PX!aBmiGh$I`Qq07Aj~`DW z`fj`ygk4|y%be^oFN-O?g^U+wA5>S_oT3FYQ_AxO%RnX28!+D6UhU%KutN?bP~p0P zW(~)#yJDqyYfkzHQaL(Mdj0H#EuZZT``WA3H1OC_$@1;ht%DFBjapn^SA1Ny1<4}^ zRhEFejAW__e^^)wADLOggRPl6?M|m#4~uH~05!in4-cxBx!)->V|KDOX2lm4UGP=n zGvb$mZie{Wa9HkGUMkG(!R)-*t`3SYB%eIu2+jb~l8%BdY+HFgflWFOeGj&*Tp7fR zjj3uF?x7uC-`xL|^RNP~A z6*aB+H*-mhx-kOYyejqtY`ljPJ(pz-dFxOZ;uky?`lVoi;ot8b65tNAnG6pY@5NS= zccaBmMpV~Px#El^BUMNDaNKPMH{urmMv00000)vz>}n3(^7fM!V? zjB_5elqyS0OJ`?im`Y01XlT>fvE%>%00eYWPE!E=HhHc}-t+(f0jNntK~!ko?byFc z!$2Gd@Zg^Z5F$9ax%&tPf7jFsr9%#kb8&GEbQ6RI>8`tj9o&5c@d*THq2T5-c)z>L zpEh@G&QP)B_l0Y(zubM=UXLck^C%Pwg+f_Nw!tALz-2z1R_E_H0nivYt^mFpaMElE z2q2(cz-X+V!%=&ImhS_(Zn7l+{TX)Ne*ugYaF=W%5cqlxuoEJ%*NT16xx%R9{m;d9 z`&Liqa?tBaAj~!qwy^XoEC;STb%4MQsI~%l5rZtiums%ToLL$0H6R{p0M@J*5XatD z14H{7lzzq~K)ron{a1DdK9c%?@w~7IIGDAN(!AFZIy} zey@979%WO~tjMrt0;bSaqtC`L(X(RcJ!vX0M!mt(~v(?DJ;ifIHv zYyh|n6D{I-rg`ro@1>%}d_VwytN=%DK=n4zZc|{(2^e@5p(Ze(TaOe9g+lqS`2mh| zB?PE#?~(uj09SfcSaechcOY6Cgx@G{a;ABePT>%h=S&#LUDT#0SfONT5nC0O}VJbn-$q Ql>h($07*qoM6N<$f_Bguj{pDw literal 0 HcmV?d00001 diff --git a/docs/static/icons/safari-pinned-tab.svg b/docs/static/icons/safari-pinned-tab.svg new file mode 100644 index 00000000..90a14d4a --- /dev/null +++ b/docs/static/icons/safari-pinned-tab.svg @@ -0,0 +1,59 @@ + + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + + + + + + + + From 5e7351a481b1b2ee6b4f48c52b1e8f08b70d04e5 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 13 May 2016 05:08:05 -0700 Subject: [PATCH 013/135] Bump pxt-core to 0.2.127 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b2f15b21..6e90b8c7 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.125" + "pxt-core": "0.2.127" } } From 957c7ad848e2006403135364bb6a656ea5483b58 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 13 May 2016 05:08:07 -0700 Subject: [PATCH 014/135] 0.2.117 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6e90b8c7..5d732dad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.116", + "version": "0.2.117", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 1039dc560e0728e7898c6132ffbcbf580cc8c804 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 13 May 2016 05:44:46 -0700 Subject: [PATCH 015/135] Bump pxt-core to 0.2.129 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5d732dad..7b0c001a 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.127" + "pxt-core": "0.2.129" } } From c04538313def8c3277d903236afa6baeb1ca08f9 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 13 May 2016 05:44:48 -0700 Subject: [PATCH 016/135] 0.2.118 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7b0c001a..733cdfef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.117", + "version": "0.2.118", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From ada2583e17068eba3f7e94f5e8eae98f889a661f Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 13 May 2016 06:18:15 -0700 Subject: [PATCH 017/135] removing browserconfig.xml / favicon.ico until cloud supports it --- docs/static/icons/browserconfig.xml | 12 ------------ docs/static/icons/favicon.ico | Bin 10734 -> 0 bytes 2 files changed, 12 deletions(-) delete mode 100644 docs/static/icons/browserconfig.xml delete mode 100644 docs/static/icons/favicon.ico diff --git a/docs/static/icons/browserconfig.xml b/docs/static/icons/browserconfig.xml deleted file mode 100644 index 31f6085f..00000000 --- a/docs/static/icons/browserconfig.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - #9f00a7 - - - diff --git a/docs/static/icons/favicon.ico b/docs/static/icons/favicon.ico deleted file mode 100644 index 8c6fbb6830d83a8c6b1ec56133add7df2aba5afe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10734 zcmeHNJ#Q015FI<|XuP&1sL=Vshh>3eO9(0?ELn6Zh?ExL&PAjsRH+h|l!(SfM2qP1 z2lxZ@G<1~w3XXYqUNkrCeb}-u9Ntm(W@qN@&fB>;=MtHyL3`9{wOH>{zd`hrh=L%o ze>RC;vu`*gjtBJlKGDm4qCR6I6kM*)fc}tlq+1N~XD}jv3kbWXvS zbD$1*j*Dt)>s6Fz@ccM+uky}d_p*CuVX-F$cxGX|KlwcHb-4LD@ZZf5MqTek-TBwG z?ses@d;Re6>aYISm`$CP|DPAR#wz=3Zkyom;sl@ORTih$ZQCx(%i<&-*Ewapia9vU zX0t!_cJTxcm%oU=?iZKs^2u`}t}!wW4)R^f#Z&S}9PdY2IJvjZ3tPThxwyI3XrIhs zdEg9o4lOa7e;!V*(|NTmu~~EQ!gHP#mt5pL3%^T#*_SxCtNvv$vgfL-pXTebT|UVX zagCAjZO(OGm+kUNPKaxajQjb`{~b})Jt)%$WiVCo)p^QrD}&MddV6=C0e`Rkz4kp& zX%BF@E6tbruD=EkaJO>GlTGfu&AmQa(q8)t>~aN??+o#S8%wsHqexr-7E}H2gssyL L9EHE&SX9^FsrL%R From a667467bbd6c168d1828852ed064f78ace6c7e58 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 13 May 2016 06:25:57 -0700 Subject: [PATCH 018/135] 0.2.119 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 733cdfef..acc75d2e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.118", + "version": "0.2.119", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 89f09c7f350748b9348622632b9d3012a98caa8b Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Mon, 16 May 2016 16:24:44 -0700 Subject: [PATCH 019/135] added pins->on pulsed --- libs/microbit/control.cpp | 22 ++++++++++++++++++++-- libs/microbit/control.ts | 11 +++++------ libs/microbit/enums.d.ts | 6 ++++++ libs/microbit/input.cpp | 4 ++-- libs/microbit/led.ts | 24 ++++++++++++------------ libs/microbit/music.ts | 4 ++-- libs/microbit/pins.cpp | 29 ++++++++++++++++++++++++++++- libs/microbit/pins.ts | 2 +- libs/microbit/shims.d.ts | 37 +++++++++++++++++++++++++++++++++---- pxtarget.json | 2 +- sim/libmbit.ts | 7 +++++++ 11 files changed, 117 insertions(+), 31 deletions(-) diff --git a/libs/microbit/control.cpp b/libs/microbit/control.cpp index 051c512a..07fa9188 100644 --- a/libs/microbit/control.cpp +++ b/libs/microbit/control.cpp @@ -141,7 +141,7 @@ namespace control { * @param value Component specific code indicating the cause of the event. * @param mode optional definition of how the event should be processed after construction (default is CREATE_AND_FIRE). */ - //% weight=21 blockGap=12 blockId="control_raise_event" block="raise event|from source %src=control_event_source|with value %value=control_event_value" blockExternalInputs=1 + //% weight=21 blockGap=12 blockId="control_raise_event" block="raise event|from source %src=control_event_source_id|with value %value=control_event_value_id" blockExternalInputs=1 //% mode.defl=CREATE_AND_FIRE void raiseEvent(int src, int value, EventCreationMode mode) { MicroBitEvent evt(src, value, (MicroBitEventLaunchMode)mode); @@ -150,11 +150,29 @@ namespace control { /** * Raises an event in the event bus. */ - //% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src=control_event_source|with value %value=control_event_value" + //% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src=control_event_source_id|with value %value=control_event_value_id" //% blockExternalInputs=1 void onEvent(int src, int value, Action handler) { registerWithDal(src, value, handler); } + + /** + * Gets the value of the last event executed on the bus + */ + //% blockId=control_event_value" block="event value" + //% weight=18 + int eventValue() { + return pxt::lastEvent.value; + } + + /** + * Gets the timestamp of the last event executed on the bus + */ + //% blockId=control_event_timestamp" block="event timestamp" + //% weight=19 blockGap-8 + int eventTimestamp() { + return pxt::lastEvent.timestamp; + } /** * Gets a friendly name for the device derived from the its serial number diff --git a/libs/microbit/control.ts b/libs/microbit/control.ts index 7c479fe3..f2d4ec1a 100644 --- a/libs/microbit/control.ts +++ b/libs/microbit/control.ts @@ -7,15 +7,15 @@ namespace control { /** * Returns the value of a C++ runtime constant */ - //% weight=19 weight=19 blockId="control_event_source" block="%id" - export function eventSource(id: EventBusSource) : number { + //% weight=2 weight=19 blockId="control_event_source_id" block="%id" blockGap=8 + export function eventSourceId(id: EventBusSource): number { return id; } /** * Returns the value of a C++ runtime constant */ - //% weight=19 weight=19 blockId="control_event_value" block="%id" - export function eventValue(id: EventBusValue) : number { + //% weight=1 weight=19 blockId="control_event_value_id" block="%id" + export function eventValueId(id: EventBusValue): number { return id; } @@ -23,8 +23,7 @@ namespace control { * Display specified error code and stop the program. */ //% shim=pxtrt::panic - export function panic(code:number) - { + export function panic(code: number) { } /** diff --git a/libs/microbit/enums.d.ts b/libs/microbit/enums.d.ts index 55fcee26..731ace17 100644 --- a/libs/microbit/enums.d.ts +++ b/libs/microbit/enums.d.ts @@ -262,6 +262,12 @@ declare namespace led { P4 = 11, // MICROBIT_ID_IO_P4 P10 = 17, // MICROBIT_ID_IO_P10 } + + + declare enum PulseValue { + High = 4, // MICROBIT_PIN_EVT_PULSE_HI + Low = 5, // MICROBIT_PIN_EVT_PULSE_LO + } declare namespace pins { } declare namespace serial { diff --git a/libs/microbit/input.cpp b/libs/microbit/input.cpp index 803510df..b4148079 100644 --- a/libs/microbit/input.cpp +++ b/libs/microbit/input.cpp @@ -104,7 +104,7 @@ namespace input { * @param button TODO * @param body TODO */ - //% help=input/on-button-pressed weight=85 + //% help=input/on-button-pressed weight=85 blockGap=8 //% blockId=device_button_event block="on button|%NAME|pressed" icon="\uf192" void onButtonPressed(Button button, Action body) { registerWithDal((int)button, MICROBIT_BUTTON_EVT_CLICK, body); @@ -114,7 +114,7 @@ namespace input { * Attaches code to run when the screen is facing up. * @param body TODO */ - //% help=input/on-gesture weight=84 + //% help=input/on-gesture weight=84 blockGap=8 //% blockId=device_gesture_event block="on |%NAME" icon="\uf135" void onGesture(Gesture gesture, Action body) { registerWithDal(MICROBIT_ID_GESTURE, (int)gesture, body); diff --git a/libs/microbit/led.ts b/libs/microbit/led.ts index 0c556f5b..892c9e5c 100644 --- a/libs/microbit/led.ts +++ b/libs/microbit/led.ts @@ -8,7 +8,7 @@ namespace led { let barGraphHigh = 0; // when was the current high value recorded let barGraphHighLast = 0; - + /** * Displays a vertical bar graph based on the `value` and `high` value. * If `high` is 0, the chart gets adjusted automatically. @@ -17,35 +17,35 @@ namespace led { */ //% help=/led/plot-bar-graph weight=20 //% blockId=device_plot_bar_graph block="plot bar graph of %value |up to %high" icon="\uf080" blockExternalInputs=true - export function plotBarGraph(value: number, high: number): void { + export function plotBarGraph(value: number, high: number): void { let now = input.runningTime(); serial.writeString(value.toString() + "\r\n"); value = Math.abs(value); - + if (high != 0) barGraphHigh = high; else if (value > barGraphHigh || now - barGraphHighLast > 5000) { barGraphHigh = value; barGraphHighLast = now; } - + barGraphHigh = Math.max(barGraphHigh, 16); - + let v = (value * 15) / barGraphHigh; let k = 0; - for(let y = 4; y >= 0; --y) { + for (let y = 4; y >= 0; --y) { for (let x = 0; x < 3; ++x) { if (k > v) { - unplot(2-x,y); - unplot(2+x,y); + unplot(2 - x, y); + unplot(2 + x, y); } else { - plot(2-x, y); - plot(2+x, y); + plot(2 - x, y); + plot(2 + x, y); } ++k; } - } + } } - + /** * Toggles a particular pixel * @param x TODO diff --git a/libs/microbit/music.ts b/libs/microbit/music.ts index 1a7197e9..33e84ed8 100644 --- a/libs/microbit/music.ts +++ b/libs/microbit/music.ts @@ -77,9 +77,9 @@ enum BeatFraction { /** * Generation of music tones through pin ``P0``. */ -//% color=52 weight=33 +//% color=52 weight=98 namespace music { - var beatsPerMinute: number = 120; + let beatsPerMinute: number = 120; /** * Plays a tone through pin ``P0`` for the given duration. diff --git a/libs/microbit/pins.cpp b/libs/microbit/pins.cpp index 20023570..3fc32ea7 100644 --- a/libs/microbit/pins.cpp +++ b/libs/microbit/pins.cpp @@ -31,6 +31,11 @@ enum class AnalogPin { P10 = MICROBIT_ID_IO_P10, }; +enum class PulseValue { + High = MICROBIT_PIN_EVT_PULSE_HI, + Low = MICROBIT_PIN_EVT_PULSE_LO +}; + MicroBitPin *getPin(int id) { switch (id) { case MICROBIT_ID_IO_P0: return &uBit.io.P0; @@ -75,7 +80,6 @@ namespace pins { return getPin(id); } - /** * Read the specified pin or connector as either 0 or 1 * @param name pin to read from @@ -129,6 +133,29 @@ namespace pins { void analogSetPeriod(AnalogPin name, int micros) { PINOP(setAnalogPeriodUs(micros)); } + + /** + * Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``. + */ + //% help=pins/on-pulsed weight=22 blockGap=8 + //% blockId=pins_on_pulsed block="on|pin %pin|pulsed %pulse" + void onPulsed(DigitalPin name, PulseValue pulse, Action body) { + MicroBitPin* pin = getPin((int)name); + if (!pin) return; + + pin->eventOn(MICROBIT_PIN_EVENT_ON_PULSE); + registerWithDal((int)name, (int)pulse, body); + } + + /** + * Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulse`` handler. + */ + //% help=pins/pulse-micros + //% blockId=pins_pulse_duration block="pulse duration (us)" + //% weight=21 + int pulseDuration() { + return pxt::lastEvent.timestamp; + } /** * Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement). diff --git a/libs/microbit/pins.ts b/libs/microbit/pins.ts index 1f171df6..59da3495 100644 --- a/libs/microbit/pins.ts +++ b/libs/microbit/pins.ts @@ -20,7 +20,7 @@ namespace pins { /** * Read one number from 7-bit I2C address. */ - //% help=pins/i2c-read-number + //% help=pins/i2c-read-number blockGap=8 //% blockId=pins_i2c_readnumber block="i2c read number|at address %address|of format %format=i2c_sizeof" weight=7 export function i2cReadNumber(address: number, format: NumberFormat): number { let buf = pins.i2cReadBuffer(address, pins.sizeOf(format)) diff --git a/libs/microbit/shims.d.ts b/libs/microbit/shims.d.ts index aecbd407..0a89784a 100644 --- a/libs/microbit/shims.d.ts +++ b/libs/microbit/shims.d.ts @@ -200,7 +200,7 @@ declare namespace input { * @param button TODO * @param body TODO */ - //% help=input/on-button-pressed weight=85 + //% help=input/on-button-pressed weight=85 blockGap=8 //% blockId=device_button_event block="on button|%NAME|pressed" icon="\uf192" shim=input::onButtonPressed function onButtonPressed(button: Button, body: () => void): void; @@ -208,7 +208,7 @@ declare namespace input { * Attaches code to run when the screen is facing up. * @param body TODO */ - //% help=input/on-gesture weight=84 + //% help=input/on-gesture weight=84 blockGap=8 //% blockId=device_gesture_event block="on |%NAME" icon="\uf135" shim=input::onGesture function onGesture(gesture: Gesture, body: () => void): void; @@ -332,17 +332,31 @@ declare namespace control { * @param value Component specific code indicating the cause of the event. * @param mode optional definition of how the event should be processed after construction (default is CREATE_AND_FIRE). */ - //% weight=21 blockGap=12 blockId="control_raise_event" block="raise event|from source %src=control_event_source|with value %value=control_event_value" blockExternalInputs=1 + //% weight=21 blockGap=12 blockId="control_raise_event" block="raise event|from source %src=control_event_source_id|with value %value=control_event_value_id" blockExternalInputs=1 //% mode.defl=1 shim=control::raiseEvent function raiseEvent(src: number, value: number, mode?: EventCreationMode): void; /** * Raises an event in the event bus. */ - //% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src=control_event_source|with value %value=control_event_value" + //% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src=control_event_source_id|with value %value=control_event_value_id" //% blockExternalInputs=1 shim=control::onEvent function onEvent(src: number, value: number, handler: () => void): void; + /** + * Gets the value of the last event executed on the bus + */ + //% blockId=control_event_value" block="event value" + //% weight=18 shim=control::eventValue + function eventValue(): number; + + /** + * Gets the timestamp of the last event executed on the bus + */ + //% blockId=control_event_timestamp" block="event timestamp" + //% weight=19 blockGap-8 shim=control::eventTimestamp + function eventTimestamp(): number; + /** * Gets a friendly name for the device derived from the its serial number */ @@ -473,6 +487,21 @@ declare namespace pins { //% blockId=device_set_analog_period block="analog set period|pin %pin|to (µs)%micros" shim=pins::analogSetPeriod function analogSetPeriod(name: AnalogPin, micros: number): void; + /** + * Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``. + */ + //% help=pins/on-pulsed weight=22 blockGap=8 + //% blockId=pins_on_pulsed block="on|pin %pin|pulsed %pulse" shim=pins::onPulsed + function onPulsed(name: DigitalPin, pulse: PulseValue, body: () => void): void; + + /** + * Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulse`` handler. + */ + //% help=pins/pulse-micros + //% blockId=pins_pulse_duration block="pulse duration (us)" + //% weight=21 shim=pins::pulseDuration + function pulseDuration(): number; + /** * Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement). * @param name pin to write to diff --git a/pxtarget.json b/pxtarget.json index 84cb1434..ca3beb1d 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -63,7 +63,7 @@ "aspectRatio": 1.22 }, "compileService": { - "gittag": "v0.1.9", + "gittag": "v0.1.10", "serviceId": "ws" }, "serial": { diff --git a/sim/libmbit.ts b/sim/libmbit.ts index 445dbfdb..3c11352d 100644 --- a/sim/libmbit.ts +++ b/sim/libmbit.ts @@ -501,6 +501,13 @@ namespace pxsim.radio { } namespace pxsim.pins { + export function onPulse(name: number, pulse: number, body: RefAction) { + } + + export function pulseDuration(): number { + return 0; + } + export function digitalReadPin(pinId: number): number { let pin = getPin(pinId); if (!pin) return; From af38071c6a3b2dae37f55677fa5a081b2c1a776e Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Mon, 16 May 2016 16:25:04 -0700 Subject: [PATCH 020/135] 0.2.120 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index acc75d2e..cdde5c6a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.119", + "version": "0.2.120", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 2f8b61998b803f3196d9b844c138e902f712de66 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Mon, 16 May 2016 21:48:54 -0700 Subject: [PATCH 021/135] bringing back triangles / logo on simulator --- sim/simsvg.ts | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/sim/simsvg.ts b/sim/simsvg.ts index 9945c3ab..ac4463d3 100644 --- a/sim/simsvg.ts +++ b/sim/simsvg.ts @@ -234,8 +234,8 @@ namespace pxsim.micro_bit { let t = Math.max(tmin, Math.min(tmax, state.temperature)) let per = Math.floor((state.temperature - tmin) / (tmax - tmin) * 100) - svg.setGradientValue(this.thermometerGradient, 100 - per + '%'); - this.thermometerText.textContent = t + '°C'; + svg.setGradientValue(this.thermometerGradient, 100 - per + "%"); + this.thermometerText.textContent = t + "°C"; } private updateHeading() { @@ -244,8 +244,8 @@ namespace pxsim.micro_bit { let state = this.board; if (!state || !state.usesHeading) return; if (!this.headInitialized) { - let p = svg.path(this.head, "sim-theme", "m269.9,50.134647l0,0l-39.5,0l0,0c-14.1,0.1 -24.6,10.7 -24.6,24.8c0,13.9 10.4,24.4 24.3,24.7l0,0l39.6,0c14.2,0 40.36034,-22.97069 40.36034,-24.85394c0,-1.88326 -26.06034,-24.54606 -40.16034,-24.64606m-0.2,39l0,0l-39.3,0c-7.7,-0.1 -14,-6.4 -14,-14.2c0,-7.8 6.4,-14.2 14.2,-14.2l39.1,0c7.8,0 14.2,6.4 14.2,14.2c0,7.9 -6.4,14.2 -14.2,14.2l0,0l0,0z"); - this.logos.push(p); + let p = this.head.firstChild.nextSibling as SVGPathElement; + p.setAttribute("d", "m269.9,50.134647l0,0l-39.5,0l0,0c-14.1,0.1 -24.6,10.7 -24.6,24.8c0,13.9 10.4,24.4 24.3,24.7l0,0l39.6,0c14.2,0 40.36034,-22.97069 40.36034,-24.85394c0,-1.88326 -26.06034,-24.54606 -40.16034,-24.64606m-0.2,39l0,0l-39.3,0c-7.7,-0.1 -14,-6.4 -14,-14.2c0,-7.8 6.4,-14.2 14.2,-14.2l39.1,0c7.8,0 14.2,6.4 14.2,14.2c0,7.9 -6.4,14.2 -14.2,14.2l0,0l0,0z"); this.updateTheme(); let pt = this.element.createSVGPoint(); svg.buttonEvents( @@ -437,6 +437,18 @@ svg.sim.grayscale { } /* animations */ +.sim-theme-glow { + animation-name: sim-theme-glow-animation; + animation-timing-function: ease-in-out; + animation-direction: alternate; + animation-iteration-count: infinite; + animation-duration: 1.25s; +} +@keyframes sim-theme-glow-animation { + from { opacity: 1; } + to { opacity: 0.8; } +} + .sim-flash { animation-name: sim-flash-animation; animation-duration: 0.1s; @@ -452,9 +464,6 @@ svg.sim.grayscale { animation-duration: 0.4s; animation-timing-function: ease-in; } -.sim-button-label { - fill:#fff; -} @keyframes sim-flash-stroke-animation { from { stroke: yellow; } @@ -481,11 +490,11 @@ svg.sim.grayscale { this.display = svg.path(this.g, "sim-display", "M333.8,310.3H165.9c-8.3,0-15-6.7-15-15V127.5c0-8.3,6.7-15,15-15h167.8c8.3,0,15,6.7,15,15v167.8C348.8,303.6,342.1,310.3,333.8,310.3z"); this.logos = []; - //this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "115,56.7 173.1,0 115,0" })); - //this.logos.push(svg.path(this.g, "sim-theme", "M114.2,0H25.9C12.1,2.1,0,13.3,0,27.7v83.9L114.2,0z")); - //this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "173,27.9 202.5,0 173,0" })); - //this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "54.1,242.4 54.1,274.1 22.4,274.1" })); - //this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "446.2,164.6 446.2,132.8 477.9,132.8" })); + this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "115,56.7 173.1,0 115,0" })); + this.logos.push(svg.path(this.g, "sim-theme", "M114.2,0H25.9C12.1,2.1,0,13.3,0,27.7v83.9L114.2,0z")); + this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "173,27.9 202.5,0 173,0" })); + this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "54.1,242.4 54.1,274.1 22.4,274.1" })); + this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "446.2,164.6 446.2,132.8 477.9,132.8" })); // leds this.leds = []; @@ -504,9 +513,9 @@ svg.sim.grayscale { // head this.head = svg.child(this.g, "g", {}); svg.child(this.head, "circle", { cx: 258, cy: 75, r: 100, fill: "transparent" }) - //this.logos.push(svg.path(this.head, "sim-theme", "M269.9,50.2L269.9,50.2l-39.5,0v0c-14.1,0.1-24.6,10.7-24.6,24.8c0,13.9,10.4,24.4,24.3,24.7v0h39.6c14.2,0,24.8-10.6,24.8-24.7C294.5,61,284,50.3,269.9,50.2 M269.7,89.2L269.7,89.2l-39.3,0c-7.7-0.1-14-6.4-14-14.2c0-7.8,6.4-14.2,14.2-14.2h39.1c7.8,0,14.2,6.4,14.2,14.2C283.9,82.9,277.5,89.2,269.7,89.2")); - //this.logos.push(svg.path(this.head, "sim-theme", "M230.6,69.7c-2.9,0-5.3,2.4-5.3,5.3c0,2.9,2.4,5.3,5.3,5.3c2.9,0,5.3-2.4,5.3-5.3C235.9,72.1,233.5,69.7,230.6,69.7")); - //this.logos.push(svg.path(this.head, "sim-theme", "M269.7,80.3c2.9,0,5.3-2.4,5.3-5.3c0-2.9-2.4-5.3-5.3-5.3c-2.9,0-5.3,2.4-5.3,5.3C264.4,77.9,266.8,80.3,269.7,80.3")); + this.logos.push(svg.path(this.head, "sim-theme sim-theme-glow", "M269.9,50.2L269.9,50.2l-39.5,0v0c-14.1,0.1-24.6,10.7-24.6,24.8c0,13.9,10.4,24.4,24.3,24.7v0h39.6c14.2,0,24.8-10.6,24.8-24.7C294.5,61,284,50.3,269.9,50.2 M269.7,89.2L269.7,89.2l-39.3,0c-7.7-0.1-14-6.4-14-14.2c0-7.8,6.4-14.2,14.2-14.2h39.1c7.8,0,14.2,6.4,14.2,14.2C283.9,82.9,277.5,89.2,269.7,89.2")); + this.logos.push(svg.path(this.head, "sim-theme sim-theme-glow", "M230.6,69.7c-2.9,0-5.3,2.4-5.3,5.3c0,2.9,2.4,5.3,5.3,5.3c2.9,0,5.3-2.4,5.3-5.3C235.9,72.1,233.5,69.7,230.6,69.7")); + this.logos.push(svg.path(this.head, "sim-theme sim-theme-glow", "M269.7,80.3c2.9,0,5.3-2.4,5.3-5.3c0-2.9-2.4-5.3-5.3-5.3c-2.9,0-5.3,2.4-5.3,5.3C264.4,77.9,266.8,80.3,269.7,80.3")); this.headText = svg.child(this.g, "text", { x: 310, y: 100, class: "sim-text" }) // https://www.microbit.co.uk/device/pins From 24420a2cc4b182ad94a6857cad319d0ebfd51d51 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Mon, 16 May 2016 21:52:35 -0700 Subject: [PATCH 022/135] 0.2.121 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cdde5c6a..7c219ded 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.120", + "version": "0.2.121", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 1cf070d6492f359e3e82b80f0c212cb67614e86f Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Mon, 16 May 2016 22:04:41 -0700 Subject: [PATCH 023/135] changed starting template --- pxtarget.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pxtarget.json b/pxtarget.json index ca3beb1d..5fe46093 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -26,7 +26,7 @@ ] }, "files": { - "main.blocks": "Hello!", + "main.blocks": "FALSEFALSEFALSEFALSEFALSEFALSETRUEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSETRUEFALSETRUETRUETRUEFALSE", "main.ts": "\n" } }, @@ -44,7 +44,7 @@ ] }, "files": { - "main.ts": "basic.showString('Hello!')\n" + "main.ts": "basic.showLeds(`\r\n . . . . .\r\n . # . # .\r\n . . . . .\r\n # . . . #\r\n . # # # .\r\n `);" } }, "compile": { From 845d7a004cd96e4bca4fda1caadc89ca84154aea Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Mon, 16 May 2016 22:18:58 -0700 Subject: [PATCH 024/135] updated docs --- docs/microbit-reference.md | 23 ----- docs/reference/pins.md | 6 ++ docs/reference/radio.md | 6 +- .../_locales/microbit-radio-strings.json | 98 +++++++++++++++++++ libs/microbit/_locales/microbit-strings.json | 4 + 5 files changed, 113 insertions(+), 24 deletions(-) delete mode 100644 docs/microbit-reference.md create mode 100644 libs/microbit-radio/_locales/microbit-radio-strings.json diff --git a/docs/microbit-reference.md b/docs/microbit-reference.md deleted file mode 100644 index 2feeb623..00000000 --- a/docs/microbit-reference.md +++ /dev/null @@ -1,23 +0,0 @@ -# microbit Reference - -```namespaces -basic.showNumber(0); -input.onButtonPressed(Button.A, () => { - -}); -led.plot(0, 0); -music.playTone(0, 0); -game.addScore(1); -images.createImage(` -. . . . . -. . . . . -. . # . . -. . . . . -. . . . . -`); -pins.digitalReadPin(DigitalPin.P0); -serial.writeValue(x, 0); -control.inBackground(() => { - -}); -``` diff --git a/docs/reference/pins.md b/docs/reference/pins.md index 7f7f2c36..5b041392 100644 --- a/docs/reference/pins.md +++ b/docs/reference/pins.md @@ -8,8 +8,14 @@ pins.digitalWritePin(DigitalPin.P0, 0); pins.analogReadPin(AnalogPin.P0); pins.analogWritePin(AnalogPin.P0, 1023); pins.analogSetPeriod(AnalogPin.P0, 20000); +pins.onPulsed(DigitalPin.P0, PulseValue.High, () => { + +}); +pins.pulseDuration(); pins.servoWritePin(AnalogPin.P0, 180); pins.servoSetPulse(AnalogPin.P0, 1500); +pins.i2cReadNumber(0, NumberFormat.Int8LE); +pins.i2cWriteNumber(0, 0, NumberFormat.Int8LE); pins.map(0, 0, 1023, 0, 4); pins.analogPitch(0, 0); pins.analogSetPitchPin(AnalogPin.P0); diff --git a/docs/reference/radio.md b/docs/reference/radio.md index 27773d86..27f23b08 100644 --- a/docs/reference/radio.md +++ b/docs/reference/radio.md @@ -4,13 +4,17 @@ Communicate data using radio packets ```cards radio.sendNumber(0); -radio.sendNumbers(0, 0, 0, 0); +radio.sendValue("data", 0); +radio.sendString(""); radio.onDataReceived(() => { }); radio.receiveNumber(); radio.receivedNumberAt(0); +radio.receiveString(); radio.receivedSignalStrength(); radio.setGroup(0); radio.setTransmitPower(0); +radio.writeValueToSerial(); +radio.setTransmitSerialNumber(◊); ``` diff --git a/libs/microbit-radio/_locales/microbit-radio-strings.json b/libs/microbit-radio/_locales/microbit-radio-strings.json new file mode 100644 index 00000000..11c6bc47 --- /dev/null +++ b/libs/microbit-radio/_locales/microbit-radio-strings.json @@ -0,0 +1,98 @@ +{ + "basic": "Provides access to basic micro:bit functionality.", + "basic.clearScreen": "Turn off all LEDs", + "basic.forever": "Repeats the code forever in the background. On each iteration, allows other codes to run.", + "basic.pause": "Pause for the specified time in milliseconds", + "basic.plotLeds": "Draws an image on the LED screen.", + "basic.showAnimation": "Shows a sequence of LED screens as an animation.", + "basic.showLeds": "Draws an image on the LED screen.", + "basic.showNumber": "Scroll a number on the screen. If the number fits on the screen (i.e. is a single digit), do not scroll.", + "basic.showString": "Display text on the display, one character at a time. If the string fits on the screen (i.e. is one letter), does not scroll.", + "control": "Runtime and event utilities.", + "control.inBackground": "Schedules code that run in the background.", + "control.reset": "Resets the BBC micro:bit.", + "game": "A single-LED sprite game engine", + "game.addScore": "Adds points to the current score", + "game.gameOver": "Displays a game over animation.", + "game.score": "Gets the current score", + "game.setScore": "Sets the current score value", + "game.startCountdown": "Starts a game countdown timer", + "images": "Creation, manipulation and display of LED images.", + "images.createBigImage": "Creates an image with 2 frames.", + "images.createImage": "Creates an image that fits on the LED screen.", + "input": "Events and data from sensors", + "input.acceleration": "Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)", + "input.buttonIsPressed": "Get the button state (pressed or not) for ``A`` and ``B``.", + "input.calibrate": "Obsolete, compass calibration is automatic.", + "input.compassHeading": "Get the current compass compass heading in degrees.", + "input.lightLevel": "Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.", + "input.magneticForce": "Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.", + "input.onButtonPressed": "Do something when a button (``A``, ``B`` or both ``A+B``) is pressed", + "input.onGesture": "Attaches code to run when the screen is facing up.", + "input.onLogoDown": "Attaches code to run when the logo is oriented downwards and the board is vertical.", + "input.onLogoUp": "Attaches code to run when the logo is oriented upwards and the board is vertical.", + "input.onPinPressed": "Do something when a pin(``P0``, ``P1`` or both ``P2``) is pressed.", + "input.onScreenDown": "Attaches code to run when the screen is facing down.", + "input.onScreenUp": "Attaches code to run when the screen is facing up.", + "input.onShake": "Attaches code to run when the device is shaken.", + "input.pinIsPressed": "Get the pin state (pressed or not). Requires to hold the ground to close the circuit.", + "input.rotation": "The pitch of the device, rotation along the ``x-axis``, in degrees.", + "input.runningTime": "Gets the number of milliseconds elapsed since power on.", + "input.setAccelerometerRange": "Sets the accelerometer sample range in gravities.", + "input.temperature": "Gets the temperature in Celsius degrees (°C).", + "led": "Control of the LED screen.", + "led.brightness": "Get the screen brightness from 0 (off) to 255 (full bright).", + "led.fadeIn": "Fades in the screen display.", + "led.fadeOut": "Fades out the screen brightness.", + "led.plot": "Turn on the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.", + "led.plotAll": "Turns all LEDS on", + "led.plotBarGraph": "Displays a vertical bar graph based on the `value` and `high` value.\nIf `high` is 0, the chart gets adjusted automatically.", + "led.point": "Get the on/off state of the specified LED using x, y coordinates. (0,0) is upper left.", + "led.screenshot": "Takes a screenshot of the LED screen and returns an image.", + "led.setBrightness": "Set the screen brightness from 0 (off) to 255 (full bright).", + "led.setDisplayMode": "Sets the display mode between black and white and greyscale for rendering LEDs.", + "led.stopAnimation": "Cancels the current animation and clears other pending animations.", + "led.toggle": "Toggles a particular pixel", + "led.toggleAll": "Inverts the current LED display", + "led.unplot": "Turn off the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.", + "music": "Generation of music tones through pin ``P0``.", + "music.beat": "Returns the duration of a beat in milli-seconds", + "music.changeTempoBy": "Change the tempo by the specified amount", + "music.noteFrequency": "Gets the frequency of a note.", + "music.playTone": "Plays a tone through pin ``P0`` for the given duration.", + "music.rest": "Rests (plays nothing) for a specified time through pin ``P0``.", + "music.ringTone": "Plays a tone through pin ``P0``.", + "music.setTempo": "Sets the tempo to the specified amount", + "music.tempo": "Returns the tempo in beats per minute. Tempo is the speed (bpm = beats per minute) at which notes play. The larger the tempo value, the faster the notes will play.", + "pins": "Control currents in Pins for analog/digital signals, servos, i2c, ...", + "pins.analogPitch": "Emits a Pulse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin.", + "pins.analogReadPin": "Read the connector value as analog, that is, as a value comprised between 0 and 1023.", + "pins.analogSetPeriod": "Configures the Pulse-width modulation (PWM) of the analog output to the given value in **microseconds** or `1/1000` milliseconds.\nIf this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.", + "pins.analogSetPitchPin": "Sets the pin used when using `pins->analog pitch`.", + "pins.analogWritePin": "Set the connector value as analog. Value must be comprised between 0 and 1023.", + "pins.digitalReadPin": "Read the specified pin or connector as either 0 or 1", + "pins.digitalWritePin": "Set a pin or connector value to either 0 or 1.", + "pins.i2cReadNumber": "Read one number from 7-bit I2C address.", + "pins.i2cWriteNumber": "Write one number to a 7-bit I2C address.", + "pins.map": "Re-maps a number from one range to another. That is, a value of ``from low`` would get mapped to ``to low``, a value of ``from high`` to ``to high``, values in-between to values in-between, etc.", + "pins.onPulsed": "Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``.", + "pins.pulseDuration": "Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulse`` handler.", + "pins.servoSetPulse": "Configures this IO pin as an analog/pwm output, configures the period to be 20 ms, and sets the pulse width, based on the value it is given **microseconds** or `1/1000` milliseconds.", + "pins.servoWritePin": "Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).", + "radio": "Communicate data using radio packets", + "radio.onDataReceived": "Registers code to run when a packet is received over radio.", + "radio.receiveNumber": "Reads the next packet as a number from the radio queue.", + "radio.receiveString": "Reads the next packet as a string and returns it.", + "radio.receivedNumberAt": "Reads a number at a given index, between ``0`` and ``3``, from the packet received by ``receive number``. Not supported in simulator.", + "radio.receivedSignalStrength": "Gets the received signal strength indicator (RSSI) from the packet received by ``receive number``. Not supported in simulator.\nnamespace=radio", + "radio.sendNumber": "Broadcasts a number over radio to any connected micro:bit in the group.", + "radio.sendString": "Broadcasts a number over radio to any connected micro:bit in the group.", + "radio.sendValue": "Broadcasts a name / value pair along with the device serial number\nand running time to any connected BBC micro:bit in the group.", + "radio.setGroup": "Sets the group id for radio communications. A micro:bit can only listen to one group ID at any time.\n@ param id the group id between ``0`` and ``255``, 1 eg", + "radio.setTransmitPower": "Change the output power level of the transmitter to the given value.", + "radio.setTransmitSerialNumber": "Set the radio to transmit the serial number in each message.", + "radio.writeValueToSerial": "Reads a value sent with `stream value` and writes it\nto the serial stream as JSON", + "serial": "Reading and writing data over a serial connection.", + "serial.writeLine": "Prints a line of text to the serial", + "serial.writeValue": "Writes a ``name: value`` pair line to the serial." +} \ No newline at end of file diff --git a/libs/microbit/_locales/microbit-strings.json b/libs/microbit/_locales/microbit-strings.json index 3851926c..96bb32ba 100644 --- a/libs/microbit/_locales/microbit-strings.json +++ b/libs/microbit/_locales/microbit-strings.json @@ -72,7 +72,11 @@ "pins.analogWritePin": "Set the connector value as analog. Value must be comprised between 0 and 1023.", "pins.digitalReadPin": "Read the specified pin or connector as either 0 or 1", "pins.digitalWritePin": "Set a pin or connector value to either 0 or 1.", + "pins.i2cReadNumber": "Read one number from 7-bit I2C address.", + "pins.i2cWriteNumber": "Write one number to a 7-bit I2C address.", "pins.map": "Re-maps a number from one range to another. That is, a value of ``from low`` would get mapped to ``to low``, a value of ``from high`` to ``to high``, values in-between to values in-between, etc.", + "pins.onPulsed": "Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``.", + "pins.pulseDuration": "Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulse`` handler.", "pins.servoSetPulse": "Configures this IO pin as an analog/pwm output, configures the period to be 20 ms, and sets the pulse width, based on the value it is given **microseconds** or `1/1000` milliseconds.", "pins.servoWritePin": "Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).", "serial": "Reading and writing data over a serial connection.", From 7704ad9f8d5f9aff86b3fa3bb2448c5e7a3cc2e7 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 17 May 2016 09:35:55 -0700 Subject: [PATCH 025/135] doc updates --- docs/docs.md | 31 ++++++++++++++++++++++++++-- docs/{camp.md => getting-started.md} | 8 +++---- docs/open-source.md | 9 ++++++++ docs/{libraries.md => packages.md} | 0 docs/release-notes.md | 11 ++++++++++ 5 files changed, 53 insertions(+), 6 deletions(-) rename docs/{camp.md => getting-started.md} (93%) create mode 100644 docs/open-source.md rename docs/{libraries.md => packages.md} (100%) create mode 100644 docs/release-notes.md diff --git a/docs/docs.md b/docs/docs.md index 4cbce65c..78937dc3 100644 --- a/docs/docs.md +++ b/docs/docs.md @@ -1,8 +1,35 @@ # Documentation -Welcome to the documentation. +```sim +basic.forever(() => { + basic.showString("DOCS "); +}) +input.onButtonPressed(Button.A, () => { + led.stopAnimation(); + basic.showLeds(` +. . . . . +. # . # . +. . . . . +# . . . # +. # # # .`); +}); +input.onButtonPressed(Button.B, () => { + led.stopAnimation(); + basic.showLeds(` +. # . # . +# . # . # +# . . . # +. # . # . +. . # . .`); +}); +``` +* **[getting started](/getting-started)** * Browse the [API reference](/reference) * Learn more about the [device](/device) * Get started with [lessons](/lessons) -* Learn about [libraries](/libraries) (possibly using C++) +* Follow up with the [release notes](/release-notes) + +### Developers + +* Learn about [packages](/packages) (possibly using C++ or ARM thumb) diff --git a/docs/camp.md b/docs/getting-started.md similarity index 93% rename from docs/camp.md rename to docs/getting-started.md index bdda80be..b212da8a 100644 --- a/docs/camp.md +++ b/docs/getting-started.md @@ -2,7 +2,7 @@ Are you ready to build cool BBC micro:bit programs? For each challenge, reorder the blocks to recreate the program. -* If you haven't done so, open [https://m.pxt.io](/) and create a new **Blocks Editor** project +## Open [https://m.pxt.io](/) and create a new **Blocks Editor** project ## Basic @@ -28,10 +28,9 @@ To transfer your code to the BBC micro:bit, ### Show animation Forever -Show one image after the other to create an animation., +Show one image after the other to create an animation by snapping them together. -Reorder the blocks to make the micro:bit show a happy, then unhappy face. -```shuffle +```blocks basic.showLeds(` . . . . . . # . # . @@ -48,6 +47,7 @@ Reorder the blocks to make the micro:bit show a happy, then unhappy face. `) ``` + ### Repeat forever Use the ``forever`` block to repeat your code and have a continuous animation. diff --git a/docs/open-source.md b/docs/open-source.md new file mode 100644 index 00000000..62868f47 --- /dev/null +++ b/docs/open-source.md @@ -0,0 +1,9 @@ +# Open Source + +The editor is open source on GitHub under the MIT license. Contributions are welcome, please check our GitHub repos. + +### Repos + +* [microbit/pxt](https://github.com/Microsoft/pxt), programming experience toolkit (PXT) +* [microsoft/pxt-microbit](https://github.com/Microsoft/pxt-microbit), PXT target for BBC micro:bit +* [microsoft/pxt-microbit-core](https://github.com/Microsoft/pxt-microbit-core), Yotta module used to build the BBC micro:bit runtime diff --git a/docs/libraries.md b/docs/packages.md similarity index 100% rename from docs/libraries.md rename to docs/packages.md diff --git a/docs/release-notes.md b/docs/release-notes.md new file mode 100644 index 00000000..f9bc423a --- /dev/null +++ b/docs/release-notes.md @@ -0,0 +1,11 @@ +# Release notes + +```sim +basic.forever(() => { basic.showString("RELEASE NOTES"); }); +``` + +### May 2017 + +We're happy to announce [m.pxt.io](https://m.pxt.io), an Blocks/JavaScript editor for the [BBC micro:bit](https://www.microbit.co.uk). + +The editor is [open source](/open-source) on GitHub. Send us your PR! \ No newline at end of file From 2e3d875b7d22f73b7609248a5536eab159968e94 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 17 May 2016 09:36:01 -0700 Subject: [PATCH 026/135] added serial events --- libs/microbit/control.cpp | 2 +- libs/microbit/serial.cpp | 23 +++++++++++++++++++---- libs/microbit/serial.ts | 21 +++++++++++++++++---- libs/microbit/shims.d.ts | 20 ++++++++++++++++---- sim/libmbit.ts | 5 +++++ 5 files changed, 58 insertions(+), 13 deletions(-) diff --git a/libs/microbit/control.cpp b/libs/microbit/control.cpp index 07fa9188..ed8479a5 100644 --- a/libs/microbit/control.cpp +++ b/libs/microbit/control.cpp @@ -169,7 +169,7 @@ namespace control { * Gets the timestamp of the last event executed on the bus */ //% blockId=control_event_timestamp" block="event timestamp" - //% weight=19 blockGap-8 + //% weight=19 blockGap=8 int eventTimestamp() { return pxt::lastEvent.timestamp; } diff --git a/libs/microbit/serial.cpp b/libs/microbit/serial.cpp index bdd15adb..a891d36a 100644 --- a/libs/microbit/serial.cpp +++ b/libs/microbit/serial.cpp @@ -7,16 +7,31 @@ namespace serial { /** * Reads a line of text from the serial port. */ - //% - StringData* readString() { - return uBit.serial.readUntil(ManagedString("\r\n")).leakData(); + //% help=serial/read-line + //% blockId=serial_read_line block="serial read line" + //% weight=20 + StringData* readLine() { + return uBit.serial.readUntil(ManagedString("\n")).leakData(); } /** * Sends a piece of text through Serial connection. */ - //% blockId=serial_writestring block="serial write %text" + //% help=serial/write-string + //% weight=87 + //% blockId=serial_writestring block="serial write string %text" void writeString(StringData *text) { uBit.serial.send(ManagedString(text)); } + + /** + * Registers an event to be fired when one of the delimiter is matched + * @param delimiters the characters to match received characters against. eg:"\n" + */ + //% help=serial/on-data-received + //% weight=19 + void onDataReceived(StringData* delimiters, Action body) { + uBit.serial.eventOn(ManagedString(delimiters)); + registerWithDal(MICROBIT_ID_SERIAL, MICROBIT_SERIAL_EVT_DELIM_MATCH, body); + } } diff --git a/libs/microbit/serial.ts b/libs/microbit/serial.ts index 39e86ac2..53211ed2 100644 --- a/libs/microbit/serial.ts +++ b/libs/microbit/serial.ts @@ -7,7 +7,8 @@ namespace serial { * Prints a line of text to the serial * @param value to send over serial */ - //% help=serial/write-line + //% weight=90 + //% help=serial/write-line blockGap=8 //% blockId=serial_writeline block="serial|write line %text" export function writeLine(text: string): void { writeString(text); @@ -17,6 +18,8 @@ namespace serial { /** * Prints a numeric value to the serial */ + //% help=serial/write-number + //% weight=89 blockGap=8 //% blockId=serial_writenumber block="serial|write number %value" export function writeNumber(value: number): void { writeString(value.toString()); @@ -27,13 +30,23 @@ namespace serial { * @param name name of the value stream, eg: x * @param value to write */ - //% weight=80 + //% weight=88 blockGap=8 //% help=serial/write-value - //% blockId=serial_writevalue block="serial|write line %name|= %value" + //% blockId=serial_writevalue block="serial|write value %name|= %value" export function writeValue(name: string, value: number): void { writeString(name); - writeString(": "); + writeString(":"); writeNumber(value); writeLine(""); } + + /** + * Registers an event to be fired when a line has been received + */ + //% help=serial/on-line-received + //% blockId=serial_on_line_received block="serial on line received" + //% weight=21 blockGap=8 + export function onLineReceived(body: Action): void { + serial.onDataReceived("\n", body); + } } diff --git a/libs/microbit/shims.d.ts b/libs/microbit/shims.d.ts index 0a89784a..4b0d11bf 100644 --- a/libs/microbit/shims.d.ts +++ b/libs/microbit/shims.d.ts @@ -354,7 +354,7 @@ declare namespace control { * Gets the timestamp of the last event executed on the bus */ //% blockId=control_event_timestamp" block="event timestamp" - //% weight=19 blockGap-8 shim=control::eventTimestamp + //% weight=19 blockGap=8 shim=control::eventTimestamp function eventTimestamp(): number; /** @@ -563,14 +563,26 @@ declare namespace serial { /** * Reads a line of text from the serial port. */ - //% shim=serial::readString - function readString(): string; + //% help=serial/read-line + //% blockId=serial_read_line block="serial read line" + //% weight=20 shim=serial::readLine + function readLine(): string; /** * Sends a piece of text through Serial connection. */ - //% blockId=serial_writestring block="serial write %text" shim=serial::writeString + //% help=serial/write-string + //% weight=87 + //% blockId=serial_writestring block="serial write string %text" shim=serial::writeString function writeString(text: string): void; + + /** + * Registers an event to be fired when one of the delimiter is matched + * @param delimiters the characters to match received characters against. eg:"\n" + */ + //% help=serial/on-data-received + //% weight=19 shim=serial::onDataReceived + function onDataReceived(delimiters: string, body: () => void): void; } diff --git a/sim/libmbit.ts b/sim/libmbit.ts index 3c11352d..8075906d 100644 --- a/sim/libmbit.ts +++ b/sim/libmbit.ts @@ -429,6 +429,11 @@ namespace pxsim.serial { export function readString(): string { return board().readSerial(); } + + export function onDataReceived(delimiters: string, handler: RefAction) { + let b = board(); + b.bus.listen(DAL.MICROBIT_ID_SERIAL, DAL.MICROBIT_SERIAL_EVT_DELIM_MATCH, handler); + } } From 263cc256339da76a0b6e93d11ee84858d012c1c0 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 17 May 2016 09:58:51 -0700 Subject: [PATCH 027/135] updated docs --- docs/reference/offline.md | 2 +- docs/windows10.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/reference/offline.md b/docs/reference/offline.md index 2ff572c9..e40e9b46 100644 --- a/docs/reference/offline.md +++ b/docs/reference/offline.md @@ -4,7 +4,7 @@ The micro:bit pins. ## How to work offline -If you have loaded the web app at some time in the past (by clicking on "my scripts" from the home page), then if you later open the same browser (whether you are online or offline) and type in [https://codemicrobit.com/](https://codemicrobit.com/), you will be able to access all the features of the web app. Note that it is important to end the URL with "/". +If you have loaded the web app at some time in the past (by clicking on "my scripts" from the home page), then if you later open the same browser (whether you are online or offline) and type in [https://m.pxt.io/](https://m.pxt.io/), you will be able to access all the features of the web app. Note that it is important to end the URL with "/". ## Save and load code using files diff --git a/docs/windows10.md b/docs/windows10.md index fa1c09b9..dcb8d66b 100644 --- a/docs/windows10.md +++ b/docs/windows10.md @@ -2,7 +2,7 @@ ## Features -The Windows 10 App provides all the existing features of codemicrobit.com plus the following ones: +The Windows 10 App provides all the existing features of [m.pxt.io](https://m.pxt.io) plus the following ones: * **auto-upload**: the compiled .hex file is automatically deployed to all connected BBC micro:bits * **serial piping**: all serial data sent by connected BBC micro:bit is automatically imported and analyzed in the editor. @@ -12,7 +12,7 @@ The Windows 10 App provides all the existing features of codemicrobit.com plus t The following instructions allow to side-load the Windows 10 app. This is required until the app is in the store. * Search for “developer settings” in Windows 10 and put your computer in “Developer mode”. -* Download https://pxt.io/codemicrobit.appx and unzip it. **DO NOT try to install from a zipped folder.** +* Download https://m.pxt.io/codemicrobit.appx and unzip it. **DO NOT try to install from a zipped folder.** * Open the extracted folder, right-click on `Add-AppDevPackage.ps1` and click on `Run with PowerShell`. Follow the prompts… 4) In order to communicate with the micro:bit via serial, you need to install the [ARM mbed driver](https://developer.mbed.org/handbook/Windows-serial-configuration). From 52b2ee3f4ca28e051116a96952544c07702ecdba Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 17 May 2016 09:59:06 -0700 Subject: [PATCH 028/135] 0.2.122 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7c219ded..6a9aeb7c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.121", + "version": "0.2.122", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From b7c9bc7978a21c722d6e41826de0094e5432822e Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 17 May 2016 10:28:26 -0700 Subject: [PATCH 029/135] fixing test suite --- testconv.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/testconv.json b/testconv.json index 0ad55bff..ae8b3095 100644 --- a/testconv.json +++ b/testconv.json @@ -527,7 +527,6 @@ "tnvnko", "toqcgf", "tpdiyw", - "tpxxzl", "tqeddl", "tqhpqp", "tqwach", @@ -550,12 +549,10 @@ "vbcdot", "vbtmwf", "vcijrw", - "vcmhms", "vcoevo", "vcrvjm", "vcudrv", "vczceh", - "vezrot", "vfcwwr", "vftxlg", "vfusfw", From 28b3d823b2e04bb6601f9075da0c6560e61e2bcd Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 17 May 2016 10:28:46 -0700 Subject: [PATCH 030/135] 0.2.123 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6a9aeb7c..f0e89740 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.122", + "version": "0.2.123", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 5e024c6f239cae6a71a2f6686f250df7853f0d91 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 17 May 2016 10:42:44 -0700 Subject: [PATCH 031/135] added test package --- libs/test-snippets/README.md | 1 + libs/test-snippets/main.ts | 0 libs/test-snippets/pxt.json | 13 +++++++++++++ 3 files changed, 14 insertions(+) create mode 100644 libs/test-snippets/README.md create mode 100644 libs/test-snippets/main.ts create mode 100644 libs/test-snippets/pxt.json diff --git a/libs/test-snippets/README.md b/libs/test-snippets/README.md new file mode 100644 index 00000000..ce4dd16c --- /dev/null +++ b/libs/test-snippets/README.md @@ -0,0 +1 @@ +run ``pxt testdir ../../buit/docs/blocks`` from this folder \ No newline at end of file diff --git a/libs/test-snippets/main.ts b/libs/test-snippets/main.ts new file mode 100644 index 00000000..e69de29b diff --git a/libs/test-snippets/pxt.json b/libs/test-snippets/pxt.json new file mode 100644 index 00000000..ba1ffa7a --- /dev/null +++ b/libs/test-snippets/pxt.json @@ -0,0 +1,13 @@ +{ + "name": "test-snippets", + "description": "A test project for doc snippets", + "installedVersion": "file:.", + "files": [ + "main.ts" + ], + "public": true, + "dependencies": { + "microbit": "file:../microbit", + "microbit-radio": "file:../microbit-radio" + } +} From 2a46935f6287cce3cb4b1f2bc0cddfb93417753c Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 18 May 2016 09:18:14 -0700 Subject: [PATCH 032/135] better startup instructions --- README.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6071ca90..0ef8c20d 100644 --- a/README.md +++ b/README.md @@ -9,19 +9,29 @@ This target allow to program a [BBC micro:bit](https://www.microbit.co.uk/) usin # Getting started -Please follow instructions at https://github.com/Microsoft/pxt#running-a-target-from-localhost +The following commands are a 1-time setup after synching the repo on your machine. + +* install the PXT command line +``` +npm install -g pxt +``` +* install the dependencies +``` +npm install +``` + +After you're done, simple run this command to open a local web server: +``` +pxt serve +``` + +More instructions at https://github.com/Microsoft/pxt#running-a-target-from-localhost ## Universal Windows App The Windows 10 app is a [Universal Windows Hosted Web App](https://microsoftedge.github.io/WebAppsDocs/en-US/win10/CreateHWA.htm) that wraps m.pxt.io and provides additional features. -### Sideloading - -* Open Windows **settings** and search for **Developer options** -* Enable the developer mode. -* Find the latest build under ``win10/app/AppPackages/latest`` and run the ``Add-AppDevPackage.ps1`` PowerShell script (mouse right-click, then `run with PowerShell`) - ### Building * Install Visual Studio 2015 Update 2 or higher. Make sure the Windows 10 templates are installed. From df91bf234c53bb9b01a571c124cd6b46565bcd22 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 18 May 2016 11:15:00 -0700 Subject: [PATCH 033/135] adding side menu --- pxtarget.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pxtarget.json b/pxtarget.json index 5fe46093..a9721b9c 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -102,6 +102,20 @@ "name": "Device", "path": "/device" } + ], + "sideDocMenu": [ + { + "name": "Getting started", + "path": "/getting-started" + }, + { + "name": "Lessons", + "path": "/lessons" + }, + { + "name": "Reference", + "path": "/reference" + } ] } } \ No newline at end of file From d3509a62541cf17338849e5918926e19d72ba184 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Wed, 18 May 2016 11:28:15 -0700 Subject: [PATCH 034/135] Test docs tweak --- docs/about.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/about.md b/docs/about.md index f5164ac4..7bf880de 100644 --- a/docs/about.md +++ b/docs/about.md @@ -26,7 +26,7 @@ input.onButtonPressed(Button.B, () => { The [BBC micro:bit](https://www.microbit.co.uk) is a [pocket-size computer](/device) with a 5x5 display of 25 LEDs, Bluetooth and sensors that can be programmed by anyone. The BBC micro:bit was made possible by many [partners](https://www.microbit.co.uk/partners). -The micro:bit provides a fun introduction to programming and making – switch on, program it to do something fun – wear it, customize it. +The micro:bit provides an easy and fun introduction to programming and making – switch on, program it to do something fun – wear it, customize it. Just like Arduino, the micro:bit can be connected to and interact with sensors, displays, and other devices. ## Blocks or JavaScript From bfac2910dac5b591a0af8a401d9c29d1342aeb77 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 18 May 2016 11:57:10 -0700 Subject: [PATCH 035/135] tentative serial fix for #66 --- libs/microbit/serial.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/libs/microbit/serial.ts b/libs/microbit/serial.ts index 53211ed2..368b7ecb 100644 --- a/libs/microbit/serial.ts +++ b/libs/microbit/serial.ts @@ -11,8 +11,7 @@ namespace serial { //% help=serial/write-line blockGap=8 //% blockId=serial_writeline block="serial|write line %text" export function writeLine(text: string): void { - writeString(text); - writeString("\r\n"); + writeString(text + "\r\n"); } /** @@ -34,10 +33,7 @@ namespace serial { //% help=serial/write-value //% blockId=serial_writevalue block="serial|write value %name|= %value" export function writeValue(name: string, value: number): void { - writeString(name); - writeString(":"); - writeNumber(value); - writeLine(""); + writeString(name + ":" + value + "\r\n"); } /** From 217fce953d4b54360b30e19984e05ccb497cef47 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Wed, 18 May 2016 15:57:43 -0700 Subject: [PATCH 036/135] Table of contents proof of concept --- docs/reference/toc.md | 197 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 docs/reference/toc.md diff --git a/docs/reference/toc.md b/docs/reference/toc.md new file mode 100644 index 00000000..f5cbd987 --- /dev/null +++ b/docs/reference/toc.md @@ -0,0 +1,197 @@ +acceleration + +analog-pitch + +analog-read-pin + +analog-set-period + +analog-set-pitch-pin + +analog-write-pin + +assign + +boolean + +brightness + +button-is-pressed + +change + +change-score-by + +change-tempo + +change-var + +clear + +clear-screen + +compass-heading + +create-image + +digital-read-pin + +digital-write-pin + +fade-in + +fade-out + +for + +forever + +game-library + +game-over + +if + +image + +in-background + +light-level + +magnetic-force + +map + +math + +move + +number + +[on button pressed](/reference/input/on-button-pressed) + +on-data-received + +on-gamepad-button + +on-gesture + +on-pin-pressed + +on-signal-strength-changed + +pause + +pin-is-pressed + +pixel + +play-tone + +plot + +plot-all + +plot-bar-graph + +plot-frame + +plot-image + +plot-leds + +point + +position + +raise-alert-to + +receive-number + +receive-number + +repeat + +reports + +reset + +rest + +ring-tone + +rotation + +running-time + +score + +screenshot + +scroll-image + +send-number + +servo-set-pulse + +servo-write-pin + +set-brightness + +set-display-mode + +set-group + +set-pixel + +set-tempo + +show-animation + +show-frame + +show-image + +show-leds + +show-number + +show-string + +signal-strength + +start-countdown + +stop-animation + +string + +tell-camera-to + +tell-microphone-to + +tell-remote-control-to + +temperature + +tempo + +toggle + +toggle-all + +touching + +turn + +unplot + +var + +while + +width + +write-line + +write-value From 6e6a98559ccd2c6641195a2d22840d9e55ec7c0b Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 19 May 2016 10:34:24 -0700 Subject: [PATCH 037/135] updated setup instructions --- README.md | 12 ++++++++++-- pxtarget.json | 15 +-------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 0ef8c20d..1a77d75d 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,9 @@ This target allow to program a [BBC micro:bit](https://www.microbit.co.uk/) usin [![Build Status](https://travis-ci.org/Microsoft/pxt-microbit.svg?branch=master)](https://travis-ci.org/Microsoft/pxt-microbit) -# Getting started +## Local server + +### Setup The following commands are a 1-time setup after synching the repo on your machine. @@ -20,10 +22,16 @@ npm install -g pxt npm install ``` -After you're done, simple run this command to open a local web server: +### Running + +Run this command to open a local web server: ``` pxt serve ``` +To make sure you're running the latest tools, run +``` +npm update +``` More instructions at https://github.com/Microsoft/pxt#running-a-target-from-localhost diff --git a/pxtarget.json b/pxtarget.json index a9721b9c..495cadbd 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -103,19 +103,6 @@ "path": "/device" } ], - "sideDocMenu": [ - { - "name": "Getting started", - "path": "/getting-started" - }, - { - "name": "Lessons", - "path": "/lessons" - }, - { - "name": "Reference", - "path": "/reference" - } - ] + "sideDoc": "getting-started" } } \ No newline at end of file From f2bab5d1228972687700567b030ac1b7f27e8070 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 19 May 2016 10:53:48 -0700 Subject: [PATCH 038/135] missing async annotation on serial --- libs/microbit/serial.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libs/microbit/serial.cpp b/libs/microbit/serial.cpp index a891d36a..634edf8b 100644 --- a/libs/microbit/serial.cpp +++ b/libs/microbit/serial.cpp @@ -10,6 +10,7 @@ namespace serial { //% help=serial/read-line //% blockId=serial_read_line block="serial read line" //% weight=20 + //% async StringData* readLine() { return uBit.serial.readUntil(ManagedString("\n")).leakData(); } @@ -20,6 +21,7 @@ namespace serial { //% help=serial/write-string //% weight=87 //% blockId=serial_writestring block="serial write string %text" + //% async void writeString(StringData *text) { uBit.serial.send(ManagedString(text)); } From 0b226bc9aa78c4165cf185f94c7817e5f586c137 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 19 May 2016 11:59:57 -0700 Subject: [PATCH 039/135] updated category colors theme --- libs/microbit-radio/radio.ts | 2 +- libs/microbit/basic.cpp | 2 +- libs/microbit/game.ts | 46 ++++++++++++++++++------------------ libs/microbit/images.cpp | 2 +- libs/microbit/input.ts | 2 +- libs/microbit/led.ts | 4 ++-- libs/microbit/music.ts | 2 +- libs/microbit/pins.ts | 2 +- libs/microbit/serial.cpp | 2 -- libs/microbit/serial.ts | 2 +- libs/microbit/shims.d.ts | 4 ++-- pxtarget.json | 2 +- 12 files changed, 35 insertions(+), 37 deletions(-) diff --git a/libs/microbit-radio/radio.ts b/libs/microbit-radio/radio.ts index 942ca022..05f5c9ab 100644 --- a/libs/microbit-radio/radio.ts +++ b/libs/microbit-radio/radio.ts @@ -1,6 +1,6 @@ /** * Communicate data using radio packets */ -//% color=270 weight=34 +//% color=#E3008C weight=34 namespace radio { } diff --git a/libs/microbit/basic.cpp b/libs/microbit/basic.cpp index 15a4a97d..3711b948 100644 --- a/libs/microbit/basic.cpp +++ b/libs/microbit/basic.cpp @@ -4,7 +4,7 @@ /** * Provides access to basic micro:bit functionality. */ -//% color=190 weight=100 +//% color=#0078D7 weight=100 namespace basic { /** diff --git a/libs/microbit/game.ts b/libs/microbit/game.ts index 6fbd21cb..408316e6 100644 --- a/libs/microbit/game.ts +++ b/libs/microbit/game.ts @@ -21,19 +21,19 @@ enum LedSpriteProperty { /** * A single-LED sprite game engine */ -//% color=176 weight=32 +//% color=#008272 weight=32 namespace game { - var _score: number = 0; - var _life: number = 3; - var _startTime: number = 0; - var _endTime: number = 0; - var _isGameOver: boolean = false; - var _countdownPause: number = 0; - var _level: number = 1; - var _gameId: number = 0; - var img: Image; - var sprites: LedSprite[]; - + let _score: number = 0; + let _life: number = 3; + let _startTime: number = 0; + let _endTime: number = 0; + let _isGameOver: boolean = false; + let _countdownPause: number = 0; + let _level: number = 1; + let _gameId: number = 0; + let img: Image; + let sprites: LedSprite[]; + /** * Creates a new LED sprite pointing to the right. * @param x sprite horizontal coordinate, eg: 2 @@ -47,7 +47,7 @@ namespace game { sprites.push(p); plot(); return p; - } + } /** * Gets the current score @@ -394,7 +394,7 @@ namespace game { } plot(); } - + /** * Turn the sprite * @param this TODO @@ -403,7 +403,7 @@ namespace game { */ //% weight=49 //% blockId=game_turn_sprite block="%sprite|turn %direction|by (°) %degrees" - public turn(direction : Direction, degrees: number) { + public turn(direction: Direction, degrees: number) { if (direction == Direction.Right) this.setDirection(this._dir + degrees); else @@ -435,8 +435,8 @@ namespace game { */ //% weight=29 //% blockId=game_sprite_set_property block="%sprite|set %property|to %value" blockGap=8 - public set(property : LedSpriteProperty, value:number) { - switch(property) { + public set(property: LedSpriteProperty, value: number) { + switch (property) { case LedSpriteProperty.X: this.setX(value); break; case LedSpriteProperty.Y: this.setY(value); break; case LedSpriteProperty.Direction: this.setDirection(value); break; @@ -452,8 +452,8 @@ namespace game { */ //% weight=30 //% blockId=game_sprite_change_xy block="%sprite|change %property|by %value" blockGap=8 - public change(property : LedSpriteProperty, value:number) { - switch(property) { + public change(property: LedSpriteProperty, value: number) { + switch (property) { case LedSpriteProperty.X: this.changeXBy(value); break; case LedSpriteProperty.Y: this.changeYBy(value); break; case LedSpriteProperty.Direction: this.changeDirectionBy(value); break; @@ -461,15 +461,15 @@ namespace game { case LedSpriteProperty.Blink: this.changeBlinkBy(value); break; } } - + /** * Gets a property of the sprite * @param property the name of the property to change */ //% weight=28 //% blockId=game_sprite_property block="%sprite|%property" - public get(property : LedSpriteProperty) { - switch(property) { + public get(property: LedSpriteProperty) { + switch (property) { case LedSpriteProperty.X: return this.x(); case LedSpriteProperty.Y: return this.y(); case LedSpriteProperty.Direction: return this.direction() @@ -681,7 +681,7 @@ namespace game { function init(): void { if (img == null) { img = images.createImage( -`0 0 0 0 0 + `0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/libs/microbit/images.cpp b/libs/microbit/images.cpp index 707cd936..fc77dd10 100644 --- a/libs/microbit/images.cpp +++ b/libs/microbit/images.cpp @@ -3,7 +3,7 @@ /** * Creation, manipulation and display of LED images. */ -//% color=45 weight=31 +//% color=#5C2D91 weight=31 namespace images { /** * Creates an image that fits on the LED screen. diff --git a/libs/microbit/input.ts b/libs/microbit/input.ts index 35393132..d54aa37f 100644 --- a/libs/microbit/input.ts +++ b/libs/microbit/input.ts @@ -1,7 +1,7 @@ /** * Events and data from sensors */ -//% color=300 weight=99 +//% color=#B4009E weight=99 namespace input { /** * Attaches code to run when the screen is facing up. diff --git a/libs/microbit/led.ts b/libs/microbit/led.ts index 892c9e5c..901404b2 100644 --- a/libs/microbit/led.ts +++ b/libs/microbit/led.ts @@ -1,8 +1,8 @@ /** * Control of the LED screen. */ -//% color=3 weight=35 -namespace led { +//% color=#5C2D91 weight=35 + namespace led { // what's the current high value let barGraphHigh = 0; diff --git a/libs/microbit/music.ts b/libs/microbit/music.ts index 33e84ed8..58c3aabd 100644 --- a/libs/microbit/music.ts +++ b/libs/microbit/music.ts @@ -77,7 +77,7 @@ enum BeatFraction { /** * Generation of music tones through pin ``P0``. */ -//% color=52 weight=98 +//% color=#D83B01 weight=98 namespace music { let beatsPerMinute: number = 120; diff --git a/libs/microbit/pins.ts b/libs/microbit/pins.ts index 59da3495..2fb85ad5 100644 --- a/libs/microbit/pins.ts +++ b/libs/microbit/pins.ts @@ -1,7 +1,7 @@ /** * Control currents in Pins for analog/digital signals, servos, i2c, ... */ -//% color=351 weight=30 +//% color=#A80000 weight=30 namespace pins { /** * Re-maps a number from one range to another. That is, a value of ``from low`` would get mapped to ``to low``, a value of ``from high`` to ``to high``, values in-between to values in-between, etc. diff --git a/libs/microbit/serial.cpp b/libs/microbit/serial.cpp index 634edf8b..a891d36a 100644 --- a/libs/microbit/serial.cpp +++ b/libs/microbit/serial.cpp @@ -10,7 +10,6 @@ namespace serial { //% help=serial/read-line //% blockId=serial_read_line block="serial read line" //% weight=20 - //% async StringData* readLine() { return uBit.serial.readUntil(ManagedString("\n")).leakData(); } @@ -21,7 +20,6 @@ namespace serial { //% help=serial/write-string //% weight=87 //% blockId=serial_writestring block="serial write string %text" - //% async void writeString(StringData *text) { uBit.serial.send(ManagedString(text)); } diff --git a/libs/microbit/serial.ts b/libs/microbit/serial.ts index 368b7ecb..79ab1dc9 100644 --- a/libs/microbit/serial.ts +++ b/libs/microbit/serial.ts @@ -1,7 +1,7 @@ /** * Reading and writing data over a serial connection. */ -//% weight=2 color=30 +//% weight=2 color=#002050 namespace serial { /** * Prints a line of text to the serial diff --git a/libs/microbit/shims.d.ts b/libs/microbit/shims.d.ts index 4b0d11bf..bb7e23bb 100644 --- a/libs/microbit/shims.d.ts +++ b/libs/microbit/shims.d.ts @@ -4,7 +4,7 @@ /** * Creation, manipulation and display of LED images. */ - //% color=45 weight=31 + //% color=#5C2D91 weight=31 declare namespace images { /** @@ -113,7 +113,7 @@ declare interface Image { /** * Provides access to basic micro:bit functionality. */ - //% color=190 weight=100 + //% color=#0078D7 weight=100 declare namespace basic { /** diff --git a/pxtarget.json b/pxtarget.json index 495cadbd..99d44b27 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -72,7 +72,7 @@ "log": true }, "appTheme": { - "accentColor": "#5C2D91", + "accentColor": "#5C005C", "logoUrl": "https://m.pxt.io/about", "logo": "./static/microbit.simplified.svg", "docsLogo": "./static/microbit.simplified.svg", From 35d59da17e62aa30d0bd4466a85e3d58a83e6037 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 19 May 2016 12:37:52 -0700 Subject: [PATCH 040/135] Bump pxt-core to 0.2.130 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f0e89740..bad39536 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.129" + "pxt-core": "0.2.130" } } From 539357237ff99a133674adc7bbb658efb71fceb4 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 19 May 2016 12:37:54 -0700 Subject: [PATCH 041/135] 0.2.124 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bad39536..1df23553 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.123", + "version": "0.2.124", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 9a36a2fc053f4d426ecb5394ab99dd6519a28d27 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 19 May 2016 13:39:28 -0700 Subject: [PATCH 042/135] removing serial event (not supported in DAL) --- libs/microbit/serial.cpp | 4 ++-- libs/microbit/serial.ts | 8 ++++---- libs/microbit/shims.d.ts | 8 -------- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/libs/microbit/serial.cpp b/libs/microbit/serial.cpp index a891d36a..ff027c7e 100644 --- a/libs/microbit/serial.cpp +++ b/libs/microbit/serial.cpp @@ -28,8 +28,8 @@ namespace serial { * Registers an event to be fired when one of the delimiter is matched * @param delimiters the characters to match received characters against. eg:"\n" */ - //% help=serial/on-data-received - //% weight=19 + // help=serial/on-data-received + // weight=19 void onDataReceived(StringData* delimiters, Action body) { uBit.serial.eventOn(ManagedString(delimiters)); registerWithDal(MICROBIT_ID_SERIAL, MICROBIT_SERIAL_EVT_DELIM_MATCH, body); diff --git a/libs/microbit/serial.ts b/libs/microbit/serial.ts index 79ab1dc9..1e401af7 100644 --- a/libs/microbit/serial.ts +++ b/libs/microbit/serial.ts @@ -39,10 +39,10 @@ namespace serial { /** * Registers an event to be fired when a line has been received */ - //% help=serial/on-line-received - //% blockId=serial_on_line_received block="serial on line received" - //% weight=21 blockGap=8 + // help=serial/on-line-received + // blockId=serial_on_line_received block="serial on line received" + // weight=21 blockGap=8 export function onLineReceived(body: Action): void { - serial.onDataReceived("\n", body); + // serial.onDataReceived("\n", body); } } diff --git a/libs/microbit/shims.d.ts b/libs/microbit/shims.d.ts index bb7e23bb..e55f5d27 100644 --- a/libs/microbit/shims.d.ts +++ b/libs/microbit/shims.d.ts @@ -575,14 +575,6 @@ declare namespace serial { //% weight=87 //% blockId=serial_writestring block="serial write string %text" shim=serial::writeString function writeString(text: string): void; - - /** - * Registers an event to be fired when one of the delimiter is matched - * @param delimiters the characters to match received characters against. eg:"\n" - */ - //% help=serial/on-data-received - //% weight=19 shim=serial::onDataReceived - function onDataReceived(delimiters: string, body: () => void): void; } From d7250d54f80611d495b9f56cd629931c7aed7c66 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Thu, 19 May 2016 13:46:02 -0700 Subject: [PATCH 043/135] Simplified (but not oversimplified) show-string docs. Proposed new reference format. --- docs/reference/basic/show-number.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/reference/basic/show-number.md b/docs/reference/basic/show-number.md index 16cc8c6f..c6f46601 100644 --- a/docs/reference/basic/show-number.md +++ b/docs/reference/basic/show-number.md @@ -1,6 +1,6 @@ # Show Number -Show a number on the [LED screen](/device/screen), one digit at a time (scrolling from left to right) +Show a number on the [LED screen](/device/screen). It will slide left if it has more than one digit. ~~~~sig basic.showNumber(2, 150) @@ -8,18 +8,18 @@ basic.showNumber(2, 150) ### Parameters -* value - a [Number](/reference/types/number) -* (optional) interval (ms) - [Number](/reference/types/number); the time (in milliseconds) before scrolling by one LED; the larger the number, the slower the scroll +* **value** is a [Number](/reference/types/number). +* **interval (ms)** is an optional [Number](/reference/types/number). It means the number of milliseconds before sliding the **value** left by one LED each time. Bigger intervals make the sliding slower. -### ~ +### Examples: -To display the number 10: +To show the number 10: ~~~~blocks basic.showNumber(10) ~~~~ -To display the number stored in the `x` variable: +To show the number stored in the `x` variable: ~~~~blocks let x = 1 @@ -28,19 +28,19 @@ basic.showNumber(x) ### Example: count to 5 -This example uses a [for](/reference/loops/for) loop to show numbers ``1`` through ``5`` on the screen: +This example uses a [for](/reference/loops/for) loop to show numbers ``0`` through ``5`` on the screen: ~~~~blocks -for (let i = 0; i < 5; i++) { - basic.showNumber(i + 1) +for (let i = 0; i < 6; i++) { + basic.showNumber(i) basic.pause(200) } ~~~~ ### Other show functions -* use [show string](/reference/basic/show-string) to show a string on the screen -* use [show animation](/reference/basic/show-animation) to show a series of images on the screen +* use [show string](/reference/basic/show-string) to show a [String](/reference/types/string) with letters on the screen +* use [show animation](/reference/basic/show-animation) to show a group of pictures on the screen, one after another ### Lessons From c65bdb34afe50e464d501e497748e0eb9977f29e Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 19 May 2016 13:56:24 -0700 Subject: [PATCH 044/135] various docs updates --- docs/reference.md | 3 +- docs/reference/logic.md | 40 +++---------------- docs/reference/logic/if.md | 17 ++++---- docs/reference/loops.md | 22 +--------- docs/reference/loops/for.md | 10 ++--- docs/reference/loops/repeat.md | 2 - docs/reference/loops/while.md | 27 +++++-------- docs/reference/radio.md | 2 +- docs/reference/serial.md | 5 ++- .../_locales/microbit-radio-strings.json | 3 ++ 10 files changed, 41 insertions(+), 90 deletions(-) diff --git a/docs/reference.md b/docs/reference.md index 669ddf45..dfe1acaf 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -9,8 +9,9 @@ basic.showNumber(0); input.onButtonPressed(Button.A, () => { }); -led.plot(0, 0); music.playTone(0, 0); +led.plot(0, 0); +radio.sendNumber(0); game.addScore(1); images.createImage(` . . . . . diff --git a/docs/reference/logic.md b/docs/reference/logic.md index 9a81e7ea..2ff4f982 100644 --- a/docs/reference/logic.md +++ b/docs/reference/logic.md @@ -1,39 +1,9 @@ # Logic -[if](/reference/logic/if) - -```blocks -if(true) { -} -``` - -[Boolean](/reference/types/boolean) values: *true*; *false* - -```blocks -true -false -``` - -Boolean binary operators: *and* (conjunction); *or* (disjunction) - -```blocks +```cards +if(true) {} +true; true && false; -true || false; -``` - -Boolean negation operator - -```blocks -!true -``` - -Comparison operators (=, !=, <, >, <=, >=) - -```blocks -0 == 0; -1 !- 0; -0 < 1; -1 > 0; -0 <= 1; -1 >= 0; +!true; +1 != 0; ``` diff --git a/docs/reference/logic/if.md b/docs/reference/logic/if.md index 824be5ae..48b28778 100644 --- a/docs/reference/logic/if.md +++ b/docs/reference/logic/if.md @@ -1,23 +1,26 @@ # If -Run code based on a condition. - ### @parent blocks/language Conditionally run code depending on whether a [Boolean](/reference/types/boolean) condition is true or false. -### Block Editor - -![](/static/mb/hourofcode-0.png) +```blocks +if(true) { +} +``` In the Block Editor, click on the dark blue gear icon (see above) to add an *else* or *if* to the current block. ### Example: adjusting screen brightness -![](/static/mb/blocks/game-library/pic0.png) +```blocks +if(input.lightLevel()<100){ + led.setBrightness(255); +} +``` -If the screen [brightness](/reference/led/brightness) is `< 100`, this code sets the brightness to `255`: +If the [light level](/input/light-level) is `< 100`, this code sets the brightness to `255`: ### Lessons diff --git a/docs/reference/loops.md b/docs/reference/loops.md index b55a6b2f..e436293d 100644 --- a/docs/reference/loops.md +++ b/docs/reference/loops.md @@ -1,26 +1,8 @@ # Loops -Repeat code. - - -[for](/reference/loops/for) - -```blocks +```cards for(let i = 0;i<5;i++) {} -``` - -[repeat](/reference/loops/repeat) - -![](/static/mb/blocks/contents-0.png) - -[while](/reference/loops/while) - -```blocks +for(let i = 1;i<5;i++) {} while(true) {} -``` - -[forever](/reference/basic/forever) - -```blocks basic.forever(() => {}) ``` diff --git a/docs/reference/loops/for.md b/docs/reference/loops/for.md index cc89b948..b8ebe9cd 100644 --- a/docs/reference/loops/for.md +++ b/docs/reference/loops/for.md @@ -1,15 +1,13 @@ # For -Repeat code a preset number of times. - ### @parent blocks/language - Repeat code a fixed number of times. -### Block Editor - -![](/static/mb/events-0.png) +```blocks +for(let i = 0; i < 5; ++i) { +} +``` The Block Editor *for* loop is different than the Touch Develop *for* loop in an important way. The above for loop will iterate *five* times, with the loop variable *i* taking on values 0, 1, 2, 3, and 4. The Touch Develop for loop shown below will iterate four times: diff --git a/docs/reference/loops/repeat.md b/docs/reference/loops/repeat.md index 7706e6af..a15a1893 100644 --- a/docs/reference/loops/repeat.md +++ b/docs/reference/loops/repeat.md @@ -2,8 +2,6 @@ Repeat code a preset number of times. -Repeat code a fixed number of times. - ### Block Editor ![](/static/mb/blocks/contents-0.png) diff --git a/docs/reference/loops/while.md b/docs/reference/loops/while.md index 480ad647..e3e98159 100644 --- a/docs/reference/loops/while.md +++ b/docs/reference/loops/while.md @@ -1,23 +1,14 @@ # While -Repeat code in a loop while a condition is true. - ### @parent blocks/language Repeat code while a [Boolean](/reference/types/boolean) `condition` is true. -### ~hide - +```blocks +while(true) { +} ``` -let condition = false -``` - -### ~ - -### Block Editor - -![](/static/mb/string-0.png) The while loop has a *condition* that evaluates to a [Boolean](/reference/types/boolean) value. After the `do` keyword, add the code that you want to run while the `condition` is `true`. The while loop concludes with `end while`. @@ -27,11 +18,13 @@ The condition is tested before any code runs. Which means that if the condition The following example uses a while loop to make a diagonal line on the LED screen (points `0, 0`, `1, 1`, `2, 2`, `3, 3`, `4, 4`). -// index is set to 4 - -![](/static/mb/blocks/var-10.png) - -// subtract 1 from `index` each time through loop +```blocks +let index = 4; +while(index >= 0) { + led.plot(index, index); + index--; +} +``` ### Lessons diff --git a/docs/reference/radio.md b/docs/reference/radio.md index 27f23b08..36150d2c 100644 --- a/docs/reference/radio.md +++ b/docs/reference/radio.md @@ -16,5 +16,5 @@ radio.receivedSignalStrength(); radio.setGroup(0); radio.setTransmitPower(0); radio.writeValueToSerial(); -radio.setTransmitSerialNumber(◊); +radio.setTransmitSerialNumber(true); ``` diff --git a/docs/reference/serial.md b/docs/reference/serial.md index e4a373d0..bf72fd14 100644 --- a/docs/reference/serial.md +++ b/docs/reference/serial.md @@ -3,6 +3,9 @@ Reading and writing data over a serial connection. ```cards -serial.writeValue(x, 0); serial.writeLine(""); +serial.writeNumber(0); +serial.writeValue(x, 0); +serial.writeString(""); +serial.readLine(); ``` diff --git a/libs/microbit-radio/_locales/microbit-radio-strings.json b/libs/microbit-radio/_locales/microbit-radio-strings.json index 11c6bc47..9c61d0d4 100644 --- a/libs/microbit-radio/_locales/microbit-radio-strings.json +++ b/libs/microbit-radio/_locales/microbit-radio-strings.json @@ -93,6 +93,9 @@ "radio.setTransmitSerialNumber": "Set the radio to transmit the serial number in each message.", "radio.writeValueToSerial": "Reads a value sent with `stream value` and writes it\nto the serial stream as JSON", "serial": "Reading and writing data over a serial connection.", + "serial.readLine": "Reads a line of text from the serial port.", "serial.writeLine": "Prints a line of text to the serial", + "serial.writeNumber": "Prints a numeric value to the serial", + "serial.writeString": "Sends a piece of text through Serial connection.", "serial.writeValue": "Writes a ``name: value`` pair line to the serial." } \ No newline at end of file From 44688ee5d540e9b9e35c4b967352176a76eb45c6 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 19 May 2016 14:50:02 -0700 Subject: [PATCH 045/135] missing simulator function for serial --- sim/libmbit.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sim/libmbit.ts b/sim/libmbit.ts index 8075906d..916bdc3a 100644 --- a/sim/libmbit.ts +++ b/sim/libmbit.ts @@ -430,6 +430,10 @@ namespace pxsim.serial { return board().readSerial(); } + export function readLine(): string { + return board().readSerial(); + } + export function onDataReceived(delimiters: string, handler: RefAction) { let b = board(); b.bus.listen(DAL.MICROBIT_ID_SERIAL, DAL.MICROBIT_SERIAL_EVT_DELIM_MATCH, handler); From befbdd32cc09e78e1c4bccc933773eb3bbb07471 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Thu, 19 May 2016 16:50:02 -0700 Subject: [PATCH 046/135] Four rewrites of basic.* API pages in simple English. --- docs/reference/basic/show-animation.md | 24 ++++++++++++++++-------- docs/reference/basic/show-leds.md | 11 ++++++----- docs/reference/basic/show-number.md | 10 +++++----- docs/reference/basic/show-string.md | 14 +++++++------- 4 files changed, 34 insertions(+), 25 deletions(-) diff --git a/docs/reference/basic/show-animation.md b/docs/reference/basic/show-animation.md index 2b7bef83..3a099c7d 100644 --- a/docs/reference/basic/show-animation.md +++ b/docs/reference/basic/show-animation.md @@ -1,6 +1,6 @@ # Show Animation -Show a series of image frames on the [LED screen](/device/screen), pausing the specified time after each frame. +Show a group of image frames (pictures) one after another on the [LED screen](/device/screen). It pauses the amount of time you tell it after each frame. ```sig basic.showAnimation(` @@ -14,10 +14,14 @@ basic.showAnimation(` ### Parameters -* `leds` - [String](/reference/types/string); a series of LED on/off states -* `interval` - [Number](/reference/types/number); the number of milliseconds to pause after each image frame +* `leds` is a [String](/reference/types/string) that shows which LEDs are on and off, in groups one after another. +* `interval` is an optional [Number](/reference/types/number). It means the number of milliseconds to pause after each image frame. -### Show a series of image frames +### Example: Animating a group of image frames + +In this animation, each row is 15 spaces wide because +there are three frames in the animation, and each frame is +five spaces wide, just like the screen on the BBC micro:bit. ``` basic.showAnimation(` @@ -31,13 +35,17 @@ basic.showAnimation(` ### ~hint -If the series of images appear too fast, increase the value of the *interval* parameter. +If the animation is too fast, make `interval` bigger. ### ~ -### Example: animating frames +### Example: animating frames with a pause -The following example creates an image with six frames and then shows each frame o the screen, pausing 500 milliseconds after each frame: +This example shows six frames on the screen, pausing 500 milliseconds after each frame. + +In this animation, each row is 30 spaces wide because +there are six frames in the animation, and each frame is +five spaces wide, just like the screen. ``` basic.showAnimation(` @@ -51,7 +59,7 @@ basic.showAnimation(` ### ~hint -Use [forever](/reference/basic/forever) to continually repeat an animation +Use [forever](/reference/basic/forever) to show an animation over and over. ### ~ diff --git a/docs/reference/basic/show-leds.md b/docs/reference/basic/show-leds.md index 45a6d057..e5419057 100644 --- a/docs/reference/basic/show-leds.md +++ b/docs/reference/basic/show-leds.md @@ -15,12 +15,13 @@ basic.showLeds(` ### Parameters -* ``leds`` - a series of LED on/off states that form an image (see steps below) -* (optional) ``ms`` - [Number](/reference/types/number) - time to wait after displaying image. In blocks, ``ms`` is 400 by default. +* `leds` is a [String](/reference/types/string) that shows which LEDs are on and off. +* `ms` is an optional [Number](/reference/types/number) that shows how many milliseconds to wait after showing a picture. +If you are programming with blocks, `ms` starts out as 400 milliseconds. -### Example - Block Editor +### Example -1. Open the `basic` category and select the `show leds` blocks. +Open the `basic` card in the Block Editor and select the `show leds` blocks. ```blocks basic.showLeds(` @@ -33,7 +34,7 @@ basic.showLeds(` ) ``` -In JavaScript, the led off is represented by a `.` and the led on by a `#` character. +If you are programming in JavaScript, `#` means an LED that is turned on and `.` means an LED that is turned off. ### Lessons diff --git a/docs/reference/basic/show-number.md b/docs/reference/basic/show-number.md index c6f46601..68b18bab 100644 --- a/docs/reference/basic/show-number.md +++ b/docs/reference/basic/show-number.md @@ -8,8 +8,8 @@ basic.showNumber(2, 150) ### Parameters -* **value** is a [Number](/reference/types/number). -* **interval (ms)** is an optional [Number](/reference/types/number). It means the number of milliseconds before sliding the **value** left by one LED each time. Bigger intervals make the sliding slower. +* `value` is a [Number](/reference/types/number). +* `interval` is an optional [Number](/reference/types/number). It means the number of milliseconds before sliding the `value` left by one LED each time. Bigger intervals make the sliding slower. ### Examples: @@ -19,7 +19,7 @@ To show the number 10: basic.showNumber(10) ~~~~ -To show the number stored in the `x` variable: +To show the number stored in a variable: ~~~~blocks let x = 1 @@ -39,8 +39,8 @@ for (let i = 0; i < 6; i++) { ### Other show functions -* use [show string](/reference/basic/show-string) to show a [String](/reference/types/string) with letters on the screen -* use [show animation](/reference/basic/show-animation) to show a group of pictures on the screen, one after another +* Use [show string](/reference/basic/show-string) to show a [String](/reference/types/string) with letters on the screen. +* Use [show animation](/reference/basic/show-animation) to show a group of pictures on the screen, one after another. ### Lessons diff --git a/docs/reference/basic/show-string.md b/docs/reference/basic/show-string.md index c8ef05a5..74427656 100644 --- a/docs/reference/basic/show-string.md +++ b/docs/reference/basic/show-string.md @@ -1,6 +1,6 @@ # Show String -Show a string on the [LED screen](/device/screen) one character at a time (scrolling from left to right). +Show a number on the [LED screen](/device/screen). It will slide left if it is bigger than the screen. ```sig basic.showString("Hello!") @@ -8,18 +8,18 @@ basic.showString("Hello!") ### Parameters -* `text` - a [String](/reference/types/string) -* (optional) `ms` - [Number](/reference/types/number); the time (in milliseconds) before scrolling left by one LED; the larger the number, the slower the scroll +* `text` is a [String](/reference/types/string). It can contain letters, numbers, and punctuation. +* `ms` is an optional [Number](/reference/types/number). It means the number of milliseconds before sliding the [String](/reference/types/string) left by one LED each time. Bigger intervals make the sliding slower. ### Examples: -To display Hello: +To show the word **Hello**: ```blocks basic.showString("Hello") ``` -To display the content of a string variable: +To show what is stored in a [String](/reference/types/string) variable: ```blocks let s = "Hi" @@ -28,8 +28,8 @@ basic.showString(s) ### Other show functions -* use [show number](/reference/basic/show-number) to show a number on the screen -* use [show animation](/reference/basic/show-animation) to show a series of images on the screen +* Use [show number](/reference/basic/show-number) to show a number on the [LED screen](/device/screen). +* Use [show animation](/reference/basic/show-animation) to show a group of pictures on the screen, one after another. ### Lessons From 4f38658d74df91e6cc64e068ab518aee9c7fc845 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 19 May 2016 23:21:14 -0700 Subject: [PATCH 047/135] Bump pxt-core to 0.2.131 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1df23553..bea49c3a 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.130" + "pxt-core": "0.2.131" } } From 9c96591edd27bc694c0c4d52ee3b73b70a33ac70 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 19 May 2016 23:21:16 -0700 Subject: [PATCH 048/135] 0.2.125 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bea49c3a..3f896efe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.124", + "version": "0.2.125", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 7273354944b4f2b4d05f133de5bf68d9e0b6c907 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 20 May 2016 05:39:44 -0700 Subject: [PATCH 049/135] support for 3g/6g gestures --- libs/microbit/enums.d.ts | 10 ++++++++++ libs/microbit/input.cpp | 16 +++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/libs/microbit/enums.d.ts b/libs/microbit/enums.d.ts index 731ace17..c24c9e32 100644 --- a/libs/microbit/enums.d.ts +++ b/libs/microbit/enums.d.ts @@ -105,6 +105,16 @@ declare namespace basic { */ //% block="free fall" FreeFall = 7, // MICROBIT_ACCELEROMETER_EVT_FREEFALL + /** + * Raised when a 3G shock is detected + */ + //% block="3g" + ThreeG = 8, // MICROBIT_ACCELEROMETER_EVT_3G + /** + * Raised when a 6G shock is detected + */ + //% block="6g" + SixG = 9, // MICROBIT_ACCELEROMETER_EVT_6G } declare namespace input { } diff --git a/libs/microbit/input.cpp b/libs/microbit/input.cpp index b4148079..efdbc312 100644 --- a/libs/microbit/input.cpp +++ b/libs/microbit/input.cpp @@ -94,7 +94,17 @@ enum class Gesture { * Raised when the board is falling! */ //% block="free fall" - FreeFall = MICROBIT_ACCELEROMETER_EVT_FREEFALL + FreeFall = MICROBIT_ACCELEROMETER_EVT_FREEFALL, + /** + * Raised when a 3G shock is detected + */ + //% block="3g" + ThreeG = MICROBIT_ACCELEROMETER_EVT_3G, + /** + * Raised when a 6G shock is detected + */ + //% block="6g" + SixG = MICROBIT_ACCELEROMETER_EVT_6G }; //% color=300 weight=99 @@ -117,6 +127,10 @@ namespace input { //% help=input/on-gesture weight=84 blockGap=8 //% blockId=device_gesture_event block="on |%NAME" icon="\uf135" void onGesture(Gesture gesture, Action body) { + if ((int)gesture == MICROBIT_ACCELEROMETER_EVT_3G && uBit.accelerometer.getRange() < 3) + uBit.accelerometer.setRange(4); + else if ((int)gesture == MICROBIT_ACCELEROMETER_EVT_6G && uBit.accelerometer.getRange() < 6) + uBit.accelerometer.setRange(8); registerWithDal(MICROBIT_ID_GESTURE, (int)gesture, body); } From 4e56342e5238f30e0aee999e9f6ae1b0b4148457 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 20 May 2016 05:40:54 -0700 Subject: [PATCH 050/135] updated docs --- libs/microbit/music.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libs/microbit/music.ts b/libs/microbit/music.ts index 58c3aabd..779fa4b2 100644 --- a/libs/microbit/music.ts +++ b/libs/microbit/music.ts @@ -83,11 +83,11 @@ namespace music { /** * Plays a tone through pin ``P0`` for the given duration. - * @param frequency TODO - * @param ms TODO + * @param frequency pitch of the tone to play in Hertz (Hz) + * @param ms tone duration in milliseconds (ms) */ //% help=music/play-tone weight=90 - //% blockId=device_play_note block="play|tone (Hz) %note=device_note|for (ms) %duration=device_beat" icon="\uf025" blockGap=8 + //% blockId=device_play_note block="play|tone %note=device_note|for %duration=device_beat" icon="\uf025" blockGap=8 export function playTone(frequency: number, ms: number): void { pins.analogSetPitchPin(AnalogPin.P0); pins.analogPitch(frequency, ms); @@ -95,7 +95,7 @@ namespace music { /** * Plays a tone through pin ``P0``. - * @param frequency TODO + * @param frequency pitch of the tone to play in Hertz (Hz) */ //% help=music/ring-tone weight=80 //% blockId=device_ring block="ring tone (Hz)|%note=device_note" icon="\uf025" blockGap=8 @@ -106,7 +106,7 @@ namespace music { /** * Rests (plays nothing) for a specified time through pin ``P0``. - * @param ms TODO + * @param ms rest duration in milliseconds (ms) */ //% help=music/rest weight=79 //% blockId=device_rest block="rest(ms)|%duration=device_beat" @@ -117,16 +117,16 @@ namespace music { /** * Gets the frequency of a note. - * @param name TODO + * @param name the note name */ //% weight=50 help=music/note-frequency //% blockId=device_note block="%note" export function noteFrequency(name: Note): number { return name; } - + function init() { - if (beatsPerMinute <= 0) beatsPerMinute = 120; + if (beatsPerMinute <= 0) beatsPerMinute = 120; } /** From 21361708ec260f5fbd27d1a40d4affd01d3c12b2 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Fri, 20 May 2016 13:09:18 -0700 Subject: [PATCH 051/135] Rest of Basic in simple English. Reconsider some code samples? --- docs/reference/basic/forever.md | 18 +++++++++++++----- docs/reference/basic/pause.md | 9 ++++++--- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/docs/reference/basic/forever.md b/docs/reference/basic/forever.md index 9b4a0a24..c666badc 100644 --- a/docs/reference/basic/forever.md +++ b/docs/reference/basic/forever.md @@ -1,6 +1,7 @@ # Forever -Repeat code [in the background](/reference/control/in-background) forever. +Keep running part of a program +[in the background](/reference/control/in-background). ```sig basic.forever(() => { @@ -9,7 +10,9 @@ basic.forever(() => { ### Example: compass -The following example constantly checks the [compass heading](/reference/input/compass-heading) and updates the screen with the direction. +The following example constantly checks the +[compass heading](/reference/input/compass-heading) +and updates the screen with the direction. ```blocks basic.forever(() => { @@ -30,7 +33,9 @@ basic.forever(() => { ### Example: counter -The following example continually shows the current value of a global variable: +The following example keeps showing the [number](/reference/types/number) stored in a global variable. +When you press button `A`, the number gets bigger. +You can use a program like this to count things with your BBC micro:bit. ```blocks let num = 0 @@ -42,9 +47,12 @@ input.onButtonPressed(Button.A, () => { }) ``` -### Contention for the LED display +### Competing for the LED screen -If you have multiple processes that each show something on the LED screen, you may get unexpected results. Try, for example: +If different parts of a program are each trying +to show something on the LED screen at the same time, +you may get unexpected results. +Try this on your micro:bit: ```blocks basic.forever(() => { diff --git a/docs/reference/basic/pause.md b/docs/reference/basic/pause.md index 776be176..a6bb0d10 100644 --- a/docs/reference/basic/pause.md +++ b/docs/reference/basic/pause.md @@ -1,6 +1,7 @@ # Pause -Pause program execution for the specified number of milliseconds. This function is helpful when you need to slow down your program's execution. +Pause the program for the number of milliseconds you say. +You can use this function to slow your program down. ```sig basic.pause(400) @@ -8,11 +9,13 @@ basic.pause(400) ### Parameters -* ``ms`` - the number of milliseconds that you want to pause (100 = 1/10 second, 1000 milliseconds = 1 second) +* ``ms`` is the number of milliseconds that you want to pause (100 milliseconds = 1/10 second, and 1000 milliseconds = 1 second). ### Example: diagonal line -The following example code turns on LED `0, 0` thru `4, 4`, pausing 500 milliseconds after each LED. Without `pause`, the code would run so fast that you wouldn't see each individual LED turning on. +This example draws a diagonal line by turning on LED `0, 0` (top left) through LED `4, 4` (bottom right). +The program pauses 500 milliseconds after turning on each LED. +Without `pause`, the program would run so fast that you would not have time to see each LED turning on. ```blocks for (let i = 0; i < 5; i++) { From 4abdb28a59fcfc7cd87c41807331b48d1f2d689f Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Fri, 20 May 2016 13:24:27 -0700 Subject: [PATCH 052/135] More simple English docs. --- docs/reference/basic/clear-screen.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/basic/clear-screen.md b/docs/reference/basic/clear-screen.md index 0d03227c..eed059e8 100644 --- a/docs/reference/basic/clear-screen.md +++ b/docs/reference/basic/clear-screen.md @@ -8,7 +8,7 @@ basic.clearScreen() ### Example: vanishing heart -The following code displays a heart on the screen and then turns off all the LED lights using `clear screen`: +The following code shows a heart on the screen and then turns off all the LED lights using `clear screen`: ```blocks basic.showLeds(` From 919c8fdfcab85b1c668305102b17b699615a11c4 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Fri, 20 May 2016 15:33:15 -0700 Subject: [PATCH 053/135] Rewrite in simple English, debug the examples. --- docs/reference/input/on-button-pressed.md | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/docs/reference/input/on-button-pressed.md b/docs/reference/input/on-button-pressed.md index 8d262566..df0c22bc 100644 --- a/docs/reference/input/on-button-pressed.md +++ b/docs/reference/input/on-button-pressed.md @@ -1,6 +1,9 @@ # On Button Pressed -Register an [event handler](/reference/event-handler) that will execute whenever an input button (A, B, or A and B together) is pressed during program execution. When [running code](/device/simulator) with this function in a web browser, click an on-screen input button - labelled A or B. +Start an [event handler](/reference/event-handler) (part of the program that will run when something happens, like when a button is pressed). +This handler works when button `A` or `B` is pressed, or `A` and `B` together. +When you are using this function in a web browser, click the buttons on the screen instead of the ones +on the BBC micro:bit. ```sig input.onButtonPressed(Button.A, () => {}) @@ -8,7 +11,8 @@ input.onButtonPressed(Button.A, () => {}) ### Example: count button clicks -This example counts how many times the left or right input button is pressed. Each time a button is pressed, the global count variable is increased by 1 and displayed on the screen. +This example counts how many times you press the `A` button. +Each time you press the button, the [LED screen](/device/screen) shows the `count` variable getting bigger. ```blocks let count = 0 @@ -19,22 +23,29 @@ input.onButtonPressed(Button.A, () => { }) ``` -### Example: roll a dice +### Example: roll dice -This example generates a random number when you press the B input button, and then displays a random die image: +This example generates a number from 1 to 6 when you press the `B` button. Then it shows the number. ```blocks input.onButtonPressed(Button.B, () => { - let dice = Math.random(6) + let dice = Math.random(6) + 1 basic.showNumber(dice) }) ``` +### ~hint + +This program adds a `1` to `random(6)` so the numbers on the dice will come out right. +Otherwise, sometimes they would show a `0`. + +### ~ + ### Lessons [smiley](/lessons/smiley), [answering machine](/lessons/answering-machine), [screen wipe](/lessons/screen-wipe), [rotation animation](/lessons/rotation-animation) ### See also -[button is pressed](/reference/input/button-is-pressed), [forever](/reference/basic/forever) +[button is pressed](/reference/input/button-is-pressed), [forever](/reference/basic/forever), [random](/reference/math/math) From 86b35ae88d21ae6efea30396886ce480e71f798f Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Fri, 20 May 2016 15:36:37 -0700 Subject: [PATCH 054/135] Absolutely necessary tiny tweak. --- docs/reference/input/on-button-pressed.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/input/on-button-pressed.md b/docs/reference/input/on-button-pressed.md index df0c22bc..6fbf7583 100644 --- a/docs/reference/input/on-button-pressed.md +++ b/docs/reference/input/on-button-pressed.md @@ -25,7 +25,7 @@ input.onButtonPressed(Button.A, () => { ### Example: roll dice -This example generates a number from 1 to 6 when you press the `B` button. Then it shows the number. +This example shows a number from 1 to 6 when you press the `B` button. ```blocks input.onButtonPressed(Button.B, () => { From a67164d5e66cdb974ef186207923f9a88899f149 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Fri, 20 May 2016 16:05:45 -0700 Subject: [PATCH 055/135] Making another topic easier to understand. --- docs/reference/input/button-is-pressed.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/reference/input/button-is-pressed.md b/docs/reference/input/button-is-pressed.md index 6bb974cf..0f8e073e 100644 --- a/docs/reference/input/button-is-pressed.md +++ b/docs/reference/input/button-is-pressed.md @@ -1,6 +1,6 @@ # Button Is Pressed -Get the state of an input button. The micro:bit has two input buttons: A and B. +Check whether a button is pressed right now. The micro:bit has two buttons: button `A` and button `B`. ```sig input.buttonIsPressed(Button.A); @@ -8,24 +8,26 @@ input.buttonIsPressed(Button.A); ### Parameters -* name - [String](/reference/types/string); input button "A", "B", or "A+B" (both input buttons) +* ``name`` is a [String](/reference/types/string). You should store `A` in it to check the left button, `B` to check the right button, or `A+B` to check both at the same time. ### Returns -* [Boolean](/reference/types/boolean) - `true` if pressed, `false` if not pressed +* [Boolean](/reference/types/boolean) that is `true` if the button you are checking is pressed, `false` if it is not pressed. ### Example -The following code uses an [if](/reference/logic/if) statement to run code, depending on whether or not the A button is pressed: +This program uses an [if](/reference/logic/if) to run +one part of the program if the `A` button is pressed, and +another part if it is not pressed. ```blocks basic.forever(() => { let pressed = input.buttonIsPressed(Button.A) if (pressed) { - // this code runs if the A button is pressed + // this part runs if the A button is pressed basic.showNumber(1, 150) } else { - // this code runs if the A button is *not* pressed + // this part runs if the A button is *not* pressed basic.showNumber(0, 150) } }) From 28d28eb67f28108e9190e61bcd36487ecdc12a3a Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Fri, 20 May 2016 18:33:31 -0700 Subject: [PATCH 056/135] Rewrite text, code sample. --- docs/reference/loops/for.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/docs/reference/loops/for.md b/docs/reference/loops/for.md index b8ebe9cd..0ecc0d0c 100644 --- a/docs/reference/loops/for.md +++ b/docs/reference/loops/for.md @@ -2,17 +2,15 @@ ### @parent blocks/language -Repeat code a fixed number of times. +Run part of the program the number of times you say. + +### Example: Count to 4 + +This program will show the numbers 0, 1, 2, 3, and 4 one after another on the LED screen. ```blocks for(let i = 0; i < 5; ++i) { -} -``` - -The Block Editor *for* loop is different than the Touch Develop *for* loop in an important way. The above for loop will iterate *five* times, with the loop variable *i* taking on values 0, 1, 2, 3, and 4. The Touch Develop for loop shown below will iterate four times: - -``` -for (let k = 0; k < 4; k++) { +basic.showNumber(i) } ``` @@ -22,5 +20,5 @@ for (let k = 0; k < 4; k++) { ### See also -[while](/reference/loops/while), [if](/reference/logic/if) +[while](/reference/loops/while), [if](/reference/logic/if), [show number](/reference/basic/show-number) From 324fd45fb6037938f82fc13b1ef714a3565cfcf5 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Mon, 23 May 2016 11:50:08 -0700 Subject: [PATCH 057/135] Rewriting play-tone for correctness & clarity. --- docs/reference/music/play-tone.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/reference/music/play-tone.md b/docs/reference/music/play-tone.md index 57b06cf9..037c8140 100644 --- a/docs/reference/music/play-tone.md +++ b/docs/reference/music/play-tone.md @@ -1,10 +1,10 @@ # Play Tone -Plays a music tone through pin ``P0`` for the given duration. +Play a musical tone through pin ``P0`` of the micro:bit for as long as you say. ## Simulator -Simulation of this function is available in many, but not all browsers. +This function only works on the micro:bit and in some browsers. ```sig music.playTone(440, 120) @@ -12,11 +12,14 @@ music.playTone(440, 120) ### Parameters -* `frequency` : [Number](/reference/types/number) - the frequency of the note (in Herz) -* `ms`: [Number](/reference/types/number) - the duration of the note (milliseconds) +* `Hz` is the [Number](/reference/types/number) of Hertz (the frequency, how high or low the tone is). +* `ms` is the [Number](/reference/types/number) of milliseconds that the tone lasts. ## Example +This example stores the musical note C in the variable `freq`. +Next, it plays that note for 1000 milliseconds (one second). + ```blocks let freq = music.noteFrequency(Note.C) music.playTone(freq, 1000) From 3f1602f2c0ad8373d3980166648f82289ba5e63f Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Mon, 23 May 2016 12:45:14 -0700 Subject: [PATCH 058/135] Simpler language, more interesting example (running time was always 0). --- docs/reference/input/running-time.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/reference/input/running-time.md b/docs/reference/input/running-time.md index 282b7946..df0651b8 100644 --- a/docs/reference/input/running-time.md +++ b/docs/reference/input/running-time.md @@ -1,6 +1,6 @@ # Running Time -Get the number of milliseconds elapsed since the script began. 1,000 milliseconds = 1 second. +Find how long it has been since the program started. ```sig input.runningTime(); @@ -8,15 +8,20 @@ input.runningTime(); ### Returns -* [Number](/reference/types/number) +* the [Number](/reference/types/number) of milliseconds since the program started. +(One second is 1000 milliseconds.) ### Example: elapsed time -This code gets the elapsed time since the start of the program execution and displays it on the screen. +When you press button `B` on the microbit, this +program finds the number of milliseconds since the program started +and shows it on the [LED screen](/device/screen). ```blocks -let now = input.runningTime() -basic.showNumber(now) +input.onButtonPressed(Button.B, () => { + let now = input.runningTime() + basic.showNumber(now) +}) ``` ### Lessons From b48c11d38064fa14b2083e95564b618ec508a303 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Mon, 23 May 2016 13:41:01 -0700 Subject: [PATCH 059/135] Simpler language; added another (simpler) example. --- docs/reference/input/light-level.md | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/docs/reference/input/light-level.md b/docs/reference/input/light-level.md index 2b847283..f875f69f 100644 --- a/docs/reference/input/light-level.md +++ b/docs/reference/input/light-level.md @@ -1,8 +1,14 @@ # Light Level -Gets the light level from ``0`` (dark) to ``255`` (bright). The light is measured by using various LEDs from the screen. +Find the light level where you are. +The light level ``0`` means darkness and ``255`` means bright light. +The BBC micro:bit measures the light around it by using some of the +LEDs on the [LED screen](/device/screen). -This function will return ``0`` on the first call to this method, a light reading will be available after the display has activated the light sensor for the first time. +The first time you use it, this function will say ``0``. +After that, it will say the real light level. +This is because the light sensor (the part that can find the light level) +has to be turned on first. ```sig input.lightLevel(); @@ -10,11 +16,26 @@ input.lightLevel(); ### Returns -* [Number](/reference/types/number) - light level from ``0`` (dark) to ``255`` (bright). +* a [Number](/reference/types/number) that means a light level from ``0`` (dark) to ``255`` (bright). + +### Example: show light level + +When you press button `B` on the microbit, this +program shows the light level +on the [LED screen](/device/screen). + +```blocks +input.onButtonPressed(Button.B, () => { + let level = input.lightLevel() + basic.showNumber(level) +}) +``` ### Example: chart light level -Use `plot bar chart` to visual the influence of various light source on the light level. +This program shows the light level with a [bar chart](/reference/led/plot-bar-graph) on the micro:bit screen. +If you carry the micro:bit around to different places with different light levels, +the bar chart will change. ```blocks basic.forever(() => { From cc1ed10efb78a8091829483da6b6d0bcce33d13e Mon Sep 17 00:00:00 2001 From: Tom Ball Date: Mon, 23 May 2016 17:39:44 -0400 Subject: [PATCH 060/135] pics for the 10 activities --- docs/static/mb/activities/a1-display.png | Bin 0 -> 10664 bytes docs/static/mb/activities/a10-watch.png | Bin 0 -> 16808 bytes docs/static/mb/activities/a2-buttons.png | Bin 0 -> 10774 bytes docs/static/mb/activities/a3-pins.png | Bin 0 -> 20002 bytes docs/static/mb/activities/a4-motion.png | Bin 0 -> 11112 bytes docs/static/mb/activities/a5-compass.png | Bin 0 -> 12415 bytes docs/static/mb/activities/a6-music.png | Bin 0 -> 10825 bytes docs/static/mb/activities/a7-conductive.png | Bin 0 -> 10631 bytes docs/static/mb/activities/a8-network.png | Bin 0 -> 15733 bytes docs/static/mb/activities/a9-radio.png | Bin 0 -> 27749 bytes 10 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/static/mb/activities/a1-display.png create mode 100644 docs/static/mb/activities/a10-watch.png create mode 100644 docs/static/mb/activities/a2-buttons.png create mode 100644 docs/static/mb/activities/a3-pins.png create mode 100644 docs/static/mb/activities/a4-motion.png create mode 100644 docs/static/mb/activities/a5-compass.png create mode 100644 docs/static/mb/activities/a6-music.png create mode 100644 docs/static/mb/activities/a7-conductive.png create mode 100644 docs/static/mb/activities/a8-network.png create mode 100644 docs/static/mb/activities/a9-radio.png diff --git a/docs/static/mb/activities/a1-display.png b/docs/static/mb/activities/a1-display.png new file mode 100644 index 0000000000000000000000000000000000000000..58ec9d6e1881bb81bff2770df37f55d9deaa9bb0 GIT binary patch literal 10664 zcma)iWmHsu*e#%>gp$%Z)X?1_Aq>*ONK1DOND6{TmkbQuNOwp#5}T&CsipCn0FMd}4GoPzRYg$;4GmoZct3}O0X!3-zSROR z=pH(+U!hfv)9e8oPi^JZ<y;ky`h0-?_e)B{0pwNcY5q+9SGTcHjJN6nP8AdnP5a)OfVG#jZR|N;!=xK^j!B; z2_Y52i#i!b@i9?-dq-(;^EIsmw4E%i(aA+2@@5E52Hu{pG4I2qH`qRbpR23Qvxr$q zFd_pEuhcY8TUW}VpITeXZv)PCHz%vh%3D{OR*tV8?^i@Sr|g7!UV{w^aGw|=snlOi zLT2rHgY@f^Nw6B=!s&duhzisf^h&E(R(v~GiK)zj}LnfBg7y zetteRH8n7R6;Oe?j?k}@&Rw~=xd{#q-rn9`Utf2{v2$?P-`}UAqWatmg+fUppVC&N ztgtGrKq8`|Y;0_j5)v%?2$EQ3BSS+8Ny$_4?$TEap02L08(G4Vl9DnqG6Djyn=|Vr z*Smld(>9+|ra-y&Wg8ot#>U3om$9$yKt^ccEnQvo5-du7*!!Y1Frl+^b@Zn_{WCM9 zii^w3CQ#^W(ITwO^p%yBcU)m7Uo?u{gZ1m43(@XOkfwqHcF-&81;Td-KXtSXkIIAnoak@S}V0F#R+7wA9og zMX7_BxVX6fex=sBgW%^+(78<#d4Io%iH$|gIVPbXo!IH?RaHD?kQPNpN3e0gKmYzo z!ua@jTa>i?CQba{o`VqHW*a=uT(LNAF!?^Ou&`hB6LlQgQm_iktJN&&-xHb|8dKKx z6+@1oiShAUl1E>R^Y)q=xs)SeyGzClkDYN;$`-!Q#1zQk+h#R9JUqO#t~oa^FR!Dc zqqx}i{d=?zg#VH!9$-ZIL1Sa;t=RGJ3=Pl3UpDq5z|h@S!WL(5ktH;5)oFrHF7|(x z!#N19?QCqYto{7`8IOyKSc&eYe!un+&cNWsG-k{aeL_lhVE!+Hl(c)ki#B)JN$pG< z8E0*5V6d>d+SS>q!B+QV2|6?ZCL(8ZUnL0pjUj`Xg?g5LNq@j4<0oy%udjb$bA!C% z)Eq3IaFRM1OIogwc-TMP&w=LL674)LCGUK``h9;dWzsYd)2@3qIr;o2p(KMcEj6_o zYoaGP``qhAjb}Yo!<8g_}h@$uUo+_#Yps;_h_>FkZEF z)VWy~7Zr8hAJp>({=1tp;r(>JiCN_U^SZl}ZC{it^9}`7rX7%Q@xqVCohfP~Ek+*J--*_^BOMoi{nByDeEs_M!l9km znG#Y^Q1C591v?K<*x*RI#TSo{TOQ6@7qf!0>f?`3Obn?0{P}}pp-1yRN!!5Pd@fRb z$H{!N-;ym5YRycnFLce7^N-#TQ&?8k)pyP=`QnF@?%69O(n`nu!U@QOa`wf(xfY3? z7U#z7zNU!Q!4pn-aM?P(LLqSu3H=8zFCFa+MLfLL_@r^@j2rZ*a{2Kn=iq*Xv+WlW zsj9}m5oll@o6xQ$(5_#Gsl%}0pUC6ob#zJO_MN++@nWfvSN1ld>Vs$$G_E_CQ02)Z zCRyDRnmsj;^|4;|Hjl7E25YBV!_*{<3qF61-LV|tEY3Q&tAAVK-amsBN-sKx&@^@;A z*d+XAy9dZcC6G7}q^YSn{g)zSPRhvl@19w_hw!LoTfpVw)qstcx96Y*e=CHeIdp5w zT4GyXZ7G8u`%@3$7%a4ylr=&-+ zt^Tx6lP9V=JG04VgZRJ()`f~?@*15t-p2iqg*&}s?Tx*lYWcfSvc!4ppSBF|CC+5F z{I3?MmRlYwj~_;6T;DQbei$cL7Le|>ntMEveGHQ(%oV_7C??LfPMPGSZWg-p1R#C z&Z%R=xxKyJg<%Q_3-4(-DT^WSy9}*4U2SdI!2eD)v)9U!P|sgZqqnuVx2J>c9qhhN zXLyD!ITS*^!tj_&es(JW_!SrK@=cvo`D;P*UHo7)e3QD|%H$s3e*d{+R0KqT? zd#y6~P*R%NCVa*ajb=Y#YIbXWy2HUa|JUM|>$UsNC!4FGnoM@s#l9YA`sx=gB&Y5( zv4rh(Lh$N_0hHs;z}WTmLi$x-?) zp!n@Q z={dF_=~RDN)ZHgp`*i*gIH?bCt+pM@YMb9&w{F(trV{Mizv&}N8z>3e9baPH&1l6AXFTIS#BLMZC|xw#D&FO? z|K_caB%nj5O;f%-4#NK7@|Ce`tg%sqGiC4#1j%Wz{cb9<(l&5dk2aydeBxWU7yb;a zs-`rOifOXp9|QCqO6F#3G zJ%qgD&DjJHTd6S}2_1+nQFR0}2*6U|W*vXm!UrIh_C+T8S^ckDESUW7zq;`UEo+y^ z8XhV{{9TCU<>t=Qe&sB(68Np=xqRsz7d>2L;i$jMZS>m?7v|h2uZiPk|CD8hnuEv5 zEYmgZI*1uXhSCZ0cl3Yj0>R%B%pRe;Y}P?X)~H122iI-9*$~;VBj|2(^7ZwF!C(M7 zy^wumt7^AYv(DM6S!6AcqP17{gD-2EevEW^W6lM!?IVnba|`y03JK-DTsd#*x{$7# zdPnt97Uyg)zrZfX(i-8FLX#>o5*Kcz3-kn#*D;ORQfD8+(=uOMsBL2kE=r}6<6&d0 zRol^_zV-CC^f+Xjn^F7h_Eth#hu=wH^76vWU3dUnq2}QpB}>?yi|{XPSV|;Q$r<~{ ze1{psV*4)`ygl$czc~Dsf^adApd)Y{U1A=8nliWaRD>ZXuw2(XToIXE^?`+0p8aC$ zHNC<3?r>%gV-B~hu$lHoBvAhB?bRnJH+|{qGW3eq;%gQ*Y@abNRd6Z!ckK)LlNY7( z>|CFB>0;q9XtGQ#FRO2zA-=M=6c>lnm7+Di>vj1;gQL)We>$C|{9j`+rmP;druY?4 zNRIkDA8ThY4>W7*35ua<1ao6P>;|HeBtAmq`7_~#swzpXq-5QQ%3JMC+7P~TPYik)b@4jftcKLhPU(lFo zH{7^9udlTZWP!YL>glDi z^+rFxyCQOQ3_{$mZgOgi+nbwJ;&std424!tbdZjYj>#M^jEsz=bBiGMZo{M2_`m!?cBAi;-rIh^r+rkg)w_G^>36gK@hc|Y=J5(rD-98il=qvN> zpb&oOav1P<@2lB}S)2LI_fPe}^=%%v*Z>@i=G#@IUuRoVF|rn+$fTg4-~umOGm+aN z4r+dw{#S;ec|Q%&?@JCF!%$5Gpkj9L8lUj-ni@zx|c!~gldz+P_wHJD^4 z)LQrIZueKOK8sT@^Ztn9w)i9&zu%L(N}%k`wo&zGU*JuRjguwD zogZ6DOL4PVgQ9_HNsZo?ju(N?V8cG>(mfhPeehnTrm`|Nj)G5AbjK74q^*ueJTDE8 zdnU)N{)bAaLD96W!Tqm5iEO!dJYXPWeBInmmRdZ%@|X;|=orOWQ^g}Pndss-=zzxc zCOkzcSBkd!jk-DkEf*TES_POKCKX*0c?oGQx8N0Pnm zS)3p?EQzY^Ke;YqRH#9FFZrK6d*&Gwl$Xay>QS-Tf@gk2J!4;0Gc*tno#wX}8-HYm zRO`L18SIm3nH#--@iBBcfYXFZw{9!!DJPjStytJe4!6HKS1|nxx?>62`(0*cW|*xi z=%6-JZ$e}J9TFbJA&;0v+@{cEj=(y$7%;1yzeBf&sm zYXCDp*29Ayw!JAz6L^Zb^|>O~^!vS7BxI0Lx9+3sx&EC0a7A^sS?9+E*jf-%FnwrU z^zJEuUrNQ)uJ`uP(47KeEJ4(|mu|Tt9-&IC3nA-H=3l@ScEli$J8`kb8@z?wppoQ% z2s`VtCm1r(QjvJTy2o~nBPoJfsx$spAi0ial?I;YHL`Ty6S%;Xqhn(i=jRN31Al6Y zii!#fEPZ_5orc$(e|{(0YzZnpcCt})XMi-w)ASi^uxi(>kH1XzQlMFRB5FC8)ql^^ zcpb?i%L>$|=fkxm&(;?9BQ)5kV)HQysQjr*7D0CquaH8x0lzIoSs^$q1-KIVIH0sY z!SzRu^hsQrxjXNW)p(}QiJ=&fWNhSnd;3UfN2A=a+>OJKAsP(jFR3Qz#W*eS(v9Hi=+Xf0Vq)_*T zaDl4!DCD$b)JGb2gU8`cfbb|MYSc1j4$7@AFL#8&1P1G$VHzQmspWgXi#I2IlH8TX zTUrh05j;xqbtK?@bQ`e@;jIujXi*H^R;FF*GP|7bSm|z)el^*fqyEjdSHcx6FYC2r z@UAHPUeD)BtC0^$Konlxs!ef*=QBnK6Ch3p&!tHeFE`hiJyR(od|J*pSr@J*!5}rS zFBtp00tLub!s;xaAn=6KTJ=9_#Pi=yHQ0F{Zl5s`N9JOV`&}WP0Lx0f^25LY%E%Hs zrHzF6kJ%U{--{2ktZG=T9XbMUrl8>&>v-jeCc@fAN|8wB3!hCE*2u)4ZR=bF#|+cB4vn+Hl9=UW}PDpaG$?UWS5lFle2+BR@woUH_FTmcq-TdrY<9sdlMyUT)z?!H2 z=uD6DZ*EwndQ-MWo~W1F3m=dXPk!nxZ=dlNPI!l2ARb0;hS2YUyNki+`Y#1bGMCyk zJ;#pqW$gUoIk2#>O6WGFgQ0a>`T}!24y124Ohs?+lT8)y_0-wOa*og zobD;tUJqUbDS7LG=~OaV;--?hScVI&K1TIsRu=7uVoSb#&@b2mi#^@TY}Z>#JB(_p z$+@}L6Z%0=d!dFKdm@UX;vHLM6O*ir!ymojpCBvq^Qqa{as3w1YExQT+N{*n)T}JM z(J=5J%#nR2QqfQel{~^~z|`wjgOqPRl|x3nr64C)R#t9pYn#ZDoSU5NZj=w5j{YRb zLU_{M9W;_sZvE)@`%|)wv&$Qq82o!xCT=#m_yXZq^`2Y9h^nfp%gf7w0p*#?+1c5V z6yACoSm&BCKv2M(oDS}9{vJ)gSZ~TrlqhUzNgD^Djn!=!O#k{QqUyqo^;CgKrY|=( z*qAapI$Bp(*NyY;?has2^0m#+ER|V^gXMM=(+2b4r=9i=4*6h=BYnf##0i z35N7X0@H}0fP;g>e77MNdC2R{2`g{1LEN}n`}&V}2TihmXBdx;_XR8$Nf6uSc8Av0 z=FG*_)L^lt)A3P`L??b+Cu>^1F}?Hop1wUz^katGd3;69>^Gn~;}08T&F@`1G;lSN z@PEI|z$zRY8~b`RIvT^))hzf{03MycbqKXsocm;bKN7wE;ss)vZd0M)2*I_#9k7yo+oRxR=S zI!JgEz7|DBDazn!$-O7vO|r|t;-LSa=SDUu9TqZ=rQv_4d`<@CLWAvXdn)ZcJ-BT? zEDc+?4xRQl-lA|z6{%=Xg7-CL$g>fr=Gu2Lbd>`!03TH{y4qk&#(+zqr!z5fMdH1% z5h@a^krZ~9#m*w$zyQxPr6-S^x`IUDRtDyEkE@h^mzb-9=8=d9yN-%Kt1L4Hwh-)L4M1*TW86sz%c>-j;m z)Yl<7&}=*kAt9m3jhP7C7P$O>?HUI?IsGHhp2y>rEbScOB!;dfaq9kZpfI&#(*ZtY zTx^uI4rkbNG#90b1f6EK#v=*qYDIADgYC8G6gKiZ*|T2JZ@IHNFNOt z$DM3MnVv;ACymFCe7|xt){FBU@jYH}1xw$!RYkXj0+(V-P<{5-B697{D=C{hn zW>!i+PR_@3_by__>^V6*hgS4V#K9>jD7gLeUYf?r{g(1n<^bBRx5#9^I*J9Xqx1VB zt0hMK)JF;tjRDAtkB>lXeIh=$O5$Sob#Q>VJ2y2+&VpI5#(EetCsVDk?4ke^I9gaC zM`E#`^>b!MZYubQ?aBxVfX?#`)!-TF3GUX$#-da=da}6k&%c(aGii}DPFUIg%G0<) zA|g|wxOVpTr);H_JJ)5KJw5WbJ>R-d!}=5keTGj?_yWR{&N}W$=T;qbMN#)2%s!~; zf?>3bjEr+({f4F{Hey@}E{5xGRzDc`OH~DTHh&9{1{@3$kx6C`k+J@DfFs-RXia3e ze027%t-4pUQ&VxY?hg{-Kdm$OkZ3;q;3M_oPUYUiD3 z@u=8|+UibCbN?P;op}jz^f&Bzh-9)3J34wxvM-fNkw^nXPzar>h+Ih_{5bZBpK@QK z?!#i5-r4;8%jH&5sga8IO?@bo%%tL1K&Yv+FlQR=TJtG|dhnO82e6=(3*2a-hXyXE(h@wGy0Fj%rM%DO90}VJSIePHCbY^#{nW?~ zL30DhH-Y$)j*hG-8?wqxlM>BME4k6esTdUzPcV>uGGSf_ps_7;Eya@!Ss`iA_>^cw@&# z%f&ZP-qY;8)E9c^K4zSj^l-oH&dG-9I^ZLvAzQ`z#18aK-p;E02|hu}w*hK`{upi# z=qZ1{Grba4@vIeh=37&%b>yi=qBIBB?at&GI<{TGQ zyg(Xm%YP_{7e=qFQ8@!WAg32m+$h&sf33A3e7@X|;BJ7^uD`Dg9jUpwy!tfs&`+=H zUG_bu9`KTQ97KuhXgzQ4*x2UOu&2bvsI-E1k2R7BhU~;AyE`BabVuWH^HIBie)_q^4S5$v$3{T>QJDzxcp{K4q6Q`7N2WJ zDdGmj$PG+SPkTlL>Fg!IR-5P%SyhC!?CD70xTslo}>yu=51};Xi!ydj@GreS7aAVyJM%a zXmXDu$;i{JBPAdNL0nTSDHF!@8;_M=$}Xu{$L!9-|K< z*NRW;@n*s%rM9(uESx$kj)FYDlKIr|CU6Fz*I&Gv_KvW(vzy$zzzEiddA+2i1y!%K=7Lxmf{J ztPyQ&T$t!}z*&+rvD0od-_&I>)kfd8$_)s-0L5VZjVT`T>77qugk*d;C zMpXmzrYkjTlm(!Cm!pb+BMTHMEyPRsr~KUovO1ABs!X6 z;+|Tguja>-RVjPnvzcGNAZA6lKp2USjgM>i`%Btu40ql25dB;2Tir^!ABapmuSF9( zDK9TSw@zm$KxF=La&ls~Vf863wk^11EP!)+Yba%Cnib%R86wf&`}!JKORx>!ua>SZ z0oIn(7;ck4fb;^0uB&)txr$w>X!@02sr)Z|PdO2pYazxv6|owVpq3&KVWJ;_m?nA~wMCx|m_JXxhH_ zvp(zu=)NpU5=zA+IP`|dU`2QGVw{dY7T1#yLYDn{F?G};=}> z5z4A)2f}`7i|*m-%1c{~3z*h=l-;$4htAFfXe<8P41Vnn5qW|VrY*vyFhrWa_wzFZ z*>s8~=!y<80G_i#z?W;CEquc7Oci z$CqUHW)y^w5#YQ60|O6aPFlZ*{r!KN2LC_&g}GY-RI#k{U-N~j)ZK3O%l{G0Wx8Er USX;0H?n*ROB@M-@SMNXn54WPge*gdg literal 0 HcmV?d00001 diff --git a/docs/static/mb/activities/a10-watch.png b/docs/static/mb/activities/a10-watch.png new file mode 100644 index 0000000000000000000000000000000000000000..a27b18917cb7c2b5c5b083ee15c153e23c2b493e GIT binary patch literal 16808 zcmbt+bx_q`^ex>X5|V;+NrQBEUm67IZUH5vQ@Xp6?(PohymW(fEA^#($2afy_nSA* z8OGuAiE}=mbM{_)t+nrWRb?4WG-5Ou7#K`BSxGe*7}!kkgNp(OK8YHnGX?*_x~R#B z!&FU@9)VvFEX9<>U|?!v(4UME!SAR}vbruXFl3?seqdwvuFPRz#DwG|#WdVMon>Jw z>TCO4lzy5hn=)^#(A4Za~2mDmsq$sY3*)p zb-CcPJRe^ZSQF`vQN^3$b2)h7JMi-DcJVp*`a7EwqaOiT2sP~flIFgB@98uW3~Z@qy66wA2>cfK0G|^>FHTpBlR9&6AqG! z^60(4cXxJn{uB@r5)u`K$!JPw2<{?isISjVPfsDFFg-gfK8Uf)qytSos2P(Ti8nTl zx}svXF}8GZaapV~pf(+mEP#{^u)X+8O{mz}+gDas&xw$lSXhK`jl+ePyzak8CgApk z;X64!g-Umom6yMH^QM%-*3;9I3$=b{tC~%5(g^YgS(QsIowu;C(21m!S%4zWb=vIr zpFbXo|NCCTM%LD-uO&B(Bhd)%H9%?~G5Rk83V2VY$|gYk9+NKGIQ5B;uR%nA=j z10T=NYyQv27+6^Gv()g-i8f{k7()E9!M}fh27mJj{CA3USDpR{7dyKca-GxFj@18r zK48NBI>RhIJ-tL)I<-$SQuN~A+%XBb$!ltB#Y_?um6R~&hfxOo(sxe?2x%>AO8$cf zC&()(l=6Bfr=%Rw6EHF{mBwfMdxjMi(;|dJd^*r4F*!L@xoCeo$;#&DlxUN@_Vx_M zR`_wzr=X@^t&huImgdBBDndP;$L>gYW)-*fw zKKO`q5hqpX7Sin9doC_6RT`PN_rr@@Kei+5|J@H+%HGvAvCAb�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

PXeecB?EI`r74pQR1)2r1{Bwq;DAI%S~xT@vv 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 z zCgQxmHTCr?(5raZ>Xd>lzKcsBtd1aUc(26~^f9j9lvI>j{9g0Gry>boF(ZHr2HCJ9E8Ha>~q)03i zG}d^xsa!6qg@bvcMjEtl) zBZzkm>b}Q1#ey9cxtto?lRxB6oN8C+hQ|jJe_TMC8HofAfd|U(8S+P7DNW5JL$yLq zX>hGgHcrlj^EE3ZJUl#52OUt1rZ|IU&>>6E86Fm$HNDW_m;A5Q_4fAjK1X+d{?L6q z=xze+Jm@V1=o)k~0(ExIMycej;DRjm?A%;|CX8x7(5>6r+CY*48iws+mDr$DtQFU& z@w30bR1_)}cp8C%K!bHkj$i{<{QvlJfd9wu68N9PUjZYaZzB3TWv;1JSMco$Fmh7L Kl2zhH0sjkz1Qvb( literal 0 HcmV?d00001 diff --git a/docs/static/mb/activities/a2-buttons.png b/docs/static/mb/activities/a2-buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..cc4c2d7f6766bc4b81ce96b84b66f1addb31c9d9 GIT binary patch literal 10774 zcmd72XH-+q7dDDN3!(QeAR@hnDiA#n=j{rY}-Kb$#h_L{{9od4ciauszyzg(4>$0Ydv?#YpA!&NM3G!t-N)C7-l#*}2?$t2Zm&C0 zfA(w$2>6OLl%E@UTWqHW^jO&WbX!`jMmaFnKBA9){Pi=vgeU`lh8d-C2o(|MBP+^` zJK<*Qnc*1indk`KPbMfc%&S!crCyZqSE{<<-{H}`Oo=6YL~+k{C!Rejc7oPAN26Vb z2G@Mj#?t0?JO>;89W46{$_$;{wJi1-idvgIOS>>X@qBeMst({#&ieu+;ZW}WzoT5+ zJ>M#e61Myfl67Cjt_Lw#F#c-s^EzkXK-x1fRsD=$kyf3pbzu<_5^Bl7S0XJCXMZ;6 z!GIAqu~h=qz9{+QDf!%#&7Xwq4}Ud!IyL4{f~y13GQXEP!*luaWD%FA9-4SvgiP)~ z#D_p|=68j!n%-;I(SlL$zW@nAN8^UM9C0Qevwge>Hg}2d5O0!MSNx+JZ>3;N6iCJPdL1JRLAjIQdkQSD8akL6VfMfE_c{ zR#$ltWq1f$=9^&br?=9bM_ZF>EK<&*LxDQ!3i7`U02S&zn7hRzPR4{3Y$>i#iWkk& zZu8D*oOD)n934v|e(>B!E5jK|%a_YVCS^J|HL|f5X55LJJ<*(FLR-%Tr)3ew7biRE zu0lxDC%!INMiX2QuEb1Q*7tDzuxx@?+%}1MB535DK7f;MAO=YpuI3iOG**cvO_le1 z-v|NObTwC2iv6mT<RppV%bkYxm;9MQBF(

nF6%?5l2G{MsKtL6N1EH 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 QSH}{lA++K3FzZ+U3)p9r4FCWD literal 0 HcmV?d00001 diff --git a/docs/static/mb/activities/a5-compass.png b/docs/static/mb/activities/a5-compass.png new file mode 100644 index 0000000000000000000000000000000000000000..644008a9119e85e2d1fb7b201d2e131c7220361d GIT binary patch literal 12415 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ˑ`nmbt1#Z@D>@` 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 S%ESLOKmb$MRjUWvM*bgxB*0|= literal 0 HcmV?d00001 diff --git a/docs/static/mb/activities/a6-music.png b/docs/static/mb/activities/a6-music.png new file mode 100644 index 0000000000000000000000000000000000000000..2eaa244d206a7f48b3b4a09859ea0f78ac5e71d2 GIT binary patch literal 10825 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 literal 0 HcmV?d00001 diff --git a/docs/static/mb/activities/a8-network.png b/docs/static/mb/activities/a8-network.png new file mode 100644 index 0000000000000000000000000000000000000000..6849a27eb6dbb6d94a06fb2a8b34bfb05667efb1 GIT binary patch literal 15733 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 literal 0 HcmV?d00001 diff --git a/docs/static/mb/activities/a9-radio.png b/docs/static/mb/activities/a9-radio.png new file mode 100644 index 0000000000000000000000000000000000000000..22a863f1fb760fc3704a3b3d3b7f21a745f65688 GIT binary patch literal 27749 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 XtN`zI1Uqmw*nc!sbyX^rUWWZID7c>u literal 0 HcmV?d00001 From e99292d008b8920209ab2e24dfd4e68dbe833368 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Mon, 23 May 2016 14:46:11 -0700 Subject: [PATCH 061/135] Minor clarification --- docs/reference/input/light-level.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/input/light-level.md b/docs/reference/input/light-level.md index f875f69f..a45ef8d0 100644 --- a/docs/reference/input/light-level.md +++ b/docs/reference/input/light-level.md @@ -1,6 +1,6 @@ # Light Level -Find the light level where you are. +Find the light level (how bright or dark it is) where you are. The light level ``0`` means darkness and ``255`` means bright light. The BBC micro:bit measures the light around it by using some of the LEDs on the [LED screen](/device/screen). From 8721b54679e3ea77c0b1fb0814b91bc059e665a2 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Mon, 23 May 2016 16:21:08 -0700 Subject: [PATCH 062/135] Pretty thoroughly rewritten in simple language. --- docs/reference/led/plot-bar-graph.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/reference/led/plot-bar-graph.md b/docs/reference/led/plot-bar-graph.md index c4345c6a..5f3ea5fa 100644 --- a/docs/reference/led/plot-bar-graph.md +++ b/docs/reference/led/plot-bar-graph.md @@ -1,6 +1,7 @@ # Plot Bar Graph -Displays a vertical bar graph based on the value and high value. +Displays a bar graph of the numbers you say. +A bar graph is a kind of chart that shows numbers as lines with different lengths. ```sig led.plotBarGraph(2, 20); @@ -8,10 +9,18 @@ led.plotBarGraph(2, 20); ### Parameters -* value: [Number](/reference/types/number) , high : [Number](/reference/types/number) displays a vertical bar graph based on the value and high value +* `value` is a [Number](/reference/types/number) that means what you are measuring or trying to show. For example, if you are measuring the temperature of ice with the BBC micro:bit, `value` might be 0 because the temperature might be 0 degrees centigrade. +* `high` is a [Number](/reference/types/number) that means the highest possible number that the `value` parameter can be. This number is also the tallest that the lines in the bar chart can be. ### Example: chart acceleration +This program shows a bar graph of the [acceleration](/reference/input/acceleration) +in the `x` direction of the micro:bit. +The micro:bit's `x` direction is from left to right (or right to left). +The more you speed up moving the micro:bit in this direction, +the taller the lines in the bar graph will be, +until they are as tall as the parameter `high` says they can be. + ```blocks basic.forever(() => { let a = input.acceleration(Dimension.X); From 924d31a211da96997ddcc014ea44678e7a281ee3 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Mon, 23 May 2016 17:21:36 -0700 Subject: [PATCH 063/135] Simple language for short topic. --- docs/reference/music/tempo.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/reference/music/tempo.md b/docs/reference/music/tempo.md index 30f0bf61..830f14c3 100644 --- a/docs/reference/music/tempo.md +++ b/docs/reference/music/tempo.md @@ -1,16 +1,16 @@ # Tempo -Returns the tempo in beats per minute. +Finds the tempo (speed of a piece of music). ```sig music.tempo() ``` -### Parameters +### Returns -* Returns : [Number](/reference/types/number) - returns the tempo in beats per minute +* a [Number](/reference/types/number) that means the bpm (beats per minute, or number of beats in a minute of the music that the micro:bit is playing). ### See also -[play tone](/reference/music/play-tone), [ring tone](/reference/music/ring-tone) , [rest](/reference/music/rest), [set tempo](/reference/music/set-tempo), [change tempo by](/reference/music/change-tempo-by) +[play tone](/reference/music/play-tone), [ring tone](/reference/music/ring-tone), [rest](/reference/music/rest), [set tempo](/reference/music/set-tempo), [change tempo by](/reference/music/change-tempo-by) From 961e2cb6e9b5178298595fe3a2abe958974f907a Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Mon, 23 May 2016 18:02:40 -0700 Subject: [PATCH 064/135] Simple language rewrite. Needs new code example; legacy one broken. --- docs/reference/led/brightness.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/reference/led/brightness.md b/docs/reference/led/brightness.md index cb248b07..f6e2e4e1 100644 --- a/docs/reference/led/brightness.md +++ b/docs/reference/led/brightness.md @@ -1,6 +1,6 @@ # Brightness -Set the brightness of the [LED screen](/device/screen). +Find how bright the [LED screen](/device/screen) is. ```sig led.brightness(); @@ -8,11 +8,11 @@ led.brightness(); ### Returns -* [Number](/reference/types/number) - returns the LCD screen brightness as a number from 0 to 255. A return value of 255 means the screen brightness is at 100% and 127 is about 50% brightness. +* a [Number](/reference/types/number) that means how bright the screen is, from `0` (darkest) to `255` (brightest). For example, the number `127` means the screen is halfway bright. -### Example: maximum brightness +### Example: highest brightness -If the screen brightness is < 100%, the following code sets the brightness to 100% (255): +This program makes the screen completely bright if it is not that way already: ```blocks if (led.brightness() < 255) { From b69156a12e64a8f1d376bbe1d245f4ca26b33208 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 24 May 2016 09:46:33 -0700 Subject: [PATCH 065/135] adding target compile service configuration --- pxtarget.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pxtarget.json b/pxtarget.json index 99d44b27..bd26e02b 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -63,6 +63,9 @@ "aspectRatio": 1.22 }, "compileService": { + "yottaTarget": "bbc-microbit-classic-gcc", + "yottaCorePackage": "pxt-microbit-core", + "githubCorePackage": "microsoft/pxt-microbit-core", "gittag": "v0.1.10", "serviceId": "ws" }, From b05c8ebd568489b03f89991f46300f5a39467c58 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 24 May 2016 11:41:35 -0700 Subject: [PATCH 066/135] Bump pxt-core to 0.2.136 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3f896efe..548d10f6 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.131" + "pxt-core": "0.2.136" } } From 9d405afde01eb345e565d580d1fe00eabea7a17f Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 24 May 2016 11:41:37 -0700 Subject: [PATCH 067/135] 0.2.126 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 548d10f6..9dd8841a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.125", + "version": "0.2.126", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 67c8753315f832477a23de2ff9ef3864c68563be Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Tue, 24 May 2016 12:30:31 -0700 Subject: [PATCH 068/135] Updating loop docs --- docs/reference/loops/for.md | 2 +- docs/reference/loops/repeat.md | 13 +++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/docs/reference/loops/for.md b/docs/reference/loops/for.md index 0ecc0d0c..0f074456 100644 --- a/docs/reference/loops/for.md +++ b/docs/reference/loops/for.md @@ -20,5 +20,5 @@ basic.showNumber(i) ### See also -[while](/reference/loops/while), [if](/reference/logic/if), [show number](/reference/basic/show-number) +[repeat](/reference/loops/repeat), [while](/reference/loops/while), [if](/reference/logic/if), [show number](/reference/basic/show-number) diff --git a/docs/reference/loops/repeat.md b/docs/reference/loops/repeat.md index a15a1893..22065328 100644 --- a/docs/reference/loops/repeat.md +++ b/docs/reference/loops/repeat.md @@ -1,19 +1,16 @@ # Repeat -Repeat code a preset number of times. +Run part of the program the number of times you say. ### Block Editor ![](/static/mb/blocks/contents-0.png) -### Touch Develop +### Lessons -Touch Develop has no `repeat` loop. Instead you can used a for loop +[looper](/lessons/looper) -``` -for (let i = 0; i < 5; i++) { -} -``` +### See also -The loop above will repeat five (5) times. +[for](/reference/loops/for), [while](/reference/loops/while), [if](/reference/logic/if), [show number](/reference/basic/show-number) From 5fd691ef9222d7f8e5fd49210a0cd9d7934820b1 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 24 May 2016 13:03:04 -0700 Subject: [PATCH 069/135] Bump pxt-core to 0.2.137 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9dd8841a..5337ab1f 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.136" + "pxt-core": "0.2.137" } } From f25f295d0c1ca9285edbd4bd762ea879ded3a4b6 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 24 May 2016 13:03:06 -0700 Subject: [PATCH 070/135] 0.2.127 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5337ab1f..0c24238c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.126", + "version": "0.2.127", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From b2906923342f5fc618e2eb33f29c6071fdb28fbb Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 24 May 2016 14:06:25 -0700 Subject: [PATCH 071/135] using pxt constant to find binary .hex --- cmds/cmds.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cmds/cmds.ts b/cmds/cmds.ts index bb6e4b76..2bfd7e5d 100644 --- a/cmds/cmds.ts +++ b/cmds/cmds.ts @@ -1,8 +1,8 @@ /// -import * as fs from 'fs'; -import * as path from 'path'; -import * as child_process from 'child_process'; +import * as fs from "fs"; +import * as path from "path"; +import * as child_process from "child_process"; let writeFileAsync: any = Promise.promisify(fs.writeFile) let execAsync: (cmd: string, options?: { cwd?: string }) => Promise = Promise.promisify(child_process.exec) @@ -13,10 +13,10 @@ export function deployCoreAsync(res: ts.pxt.CompileResult) { if (drives.length == 0) { console.log("cannot find any drives to deploy to") } else { - console.log("copy microbit.hex to " + drives.join(", ")) + console.log(`copy ${ts.pxt.BINARY_HEX} to ` + drives.join(", ")) } return Promise.map(drives, d => - writeFileAsync(d + "microbit.hex", res.outfiles["microbit.hex"]) + writeFileAsync(d + ts.pxt.BINARY_HEX, res.outfiles[ts.pxt.BINARY_HEX]) .then(() => { console.log("wrote hex file to " + d) })) From daea493dcb505d05f1448d94f98cd9d2705ce72d Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 24 May 2016 14:32:11 -0700 Subject: [PATCH 072/135] Bump pxt-core to 0.2.138 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0c24238c..b7a7431b 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.137" + "pxt-core": "0.2.138" } } From 8de6605112443878fc39e11c56efcaefa9b71892 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 24 May 2016 14:32:27 -0700 Subject: [PATCH 073/135] 0.2.128 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b7a7431b..19329e28 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.127", + "version": "0.2.128", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 3b8ae69a6c8be193b5109410e855ab36a411a5ff Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Tue, 24 May 2016 15:36:04 -0700 Subject: [PATCH 074/135] Rewrite of text and examples. --- docs/reference/variables/assign.md | 32 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/reference/variables/assign.md b/docs/reference/variables/assign.md index de27860b..95f20dc6 100644 --- a/docs/reference/variables/assign.md +++ b/docs/reference/variables/assign.md @@ -1,34 +1,34 @@ # Assignment Operator -Set the value for local and global variables. +Use an equals sign to make a [variable](/reference/variables/var) store the [number](/reference/types/number) +or [string](/reference/types/string) you say. -### @parent blocks/operators +When you use the equals sign to store something in a variable, the equals sign is called +an *assignment operator*, and what you store is called a *value*. -Set or change the value of a variable +### Storing numbers in variables + +This program makes the variable `item` equal `5` and then shows it on the [LED screen](/device/screen). ````blocks -let item = 0 +let item = 5 +basic.showNumber(item) ```` -Use the assignment operator to set or change the value of a [variable](/reference/variables/var). +### Storing strings in variables -### Declare a variable - -Declare a new *local* variable using the [variable](/reference/variables/var) statement and the assignment operator. Like this: +This program makes the variable `name` equal `Joe` and then shows it on the [LED screen](/device/screen). ````blocks -let num1 = 42; -let name = "Joe"; +let name = "Joe" +basic.showString(name); ```` -The variable's name is on the left of the assignment operator and the variable's value is on the right: - -````blocks -let num1 = 42 -```` ### Notes -* You can use the assignment operator with variables of each of the supported [types](/reference/types). +You can use the assignment operator with variables of +every [type](/reference/types). A *type* is which kind of thing +a variable can store, like a number or string. ### Lessons From ab087b4afab07248d01220fbc2d1c9bde191e1ab Mon Sep 17 00:00:00 2001 From: gbaman Date: Wed, 25 May 2016 01:40:01 +0100 Subject: [PATCH 075/135] Add set-transmit-power documentation page --- docs/reference/radio/set-transmit-power.md | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 docs/reference/radio/set-transmit-power.md diff --git a/docs/reference/radio/set-transmit-power.md b/docs/reference/radio/set-transmit-power.md new file mode 100644 index 00000000..10c547dc --- /dev/null +++ b/docs/reference/radio/set-transmit-power.md @@ -0,0 +1,38 @@ +# Set Transmit Power + +Sets the transmitter power for ``radio`` communications. +The power can be set to a value between 0 (-30dbm) and 7 (+4dbm). + +## Range + +At power level 7, in an open area without significant interference (coming from WiFi networks or other devices operating on the 2.4 GHz range), you can get a **range of over 70m**. + +Indoors (or with additional interference), range will be significantly reduced. + +## Important Security Consideration + +The functions in the ``radio`` namespace allow the BBC micro:bit to communicate with other micro:bits. + +This API does not contain any form of encryption, authentication or authorization. It's purpose is solely for use as a teaching aid to demonstrate how simple communications operates, and to provide a sandpit through which learning can take place. + +For serious applications, BLE should be considered a substantially more secure alternative. + +```sig +radio.setTransmitPower(1) +``` + +### Parameters + +* ``power`` -- a [number](/reference/types/number) between ``0`` and ``7``. + +### Example + +Sets the transmitter power to full power at 7. + +```blocks +radio.setTransmitPower(7) +``` + +### See also + +[receive number](/reference/radio/receive-number), [send number](/reference/radio/send-number), [on data received](/reference/radio/on-data-received) From 525e59ae4f9a157d4877f53c897c961537580b5b Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Tue, 24 May 2016 17:51:10 -0700 Subject: [PATCH 076/135] Heavy rewrite; added Fahrenheit example too for US. --- docs/reference/input/temperature.md | 39 ++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/docs/reference/input/temperature.md b/docs/reference/input/temperature.md index d793d9cf..c0479b85 100644 --- a/docs/reference/input/temperature.md +++ b/docs/reference/input/temperature.md @@ -2,30 +2,57 @@ Get the ambient temperature (degree Celsius °C). The temperature is inferred from the the surface temperature of the various chips on the micro:bit. +Find the temperature where you are. The temperature is measured in Celsius (metric). +The micro:bit can find the temperature nearby by checking how hot its computer chips are. + ```sig input.temperature(); ``` ### Returns -* [Number](/reference/types/number) - temperature in degree Celsius °C. +* a [Number](/reference/types/number) that means the Celsius temperature. ### How does it work? -The BBC micro:bit does not have a dedicated temperature sensor. Instead, the temperature provided is actually the temperature of the silicon die on the main CPU. As the processor generally runs cold though (it is a high efficiency ARM core), the temperature is a good approximation of the ambient temperature... you might warm up if you give the processor a lot of work to do though, and don't [sleep](/reference/basic/pause)! - -The temperature sensor has a high precision, but isn't trimmed for accuracy. In other words, it can sense changes in temperature very well, but there may be (and probably is) base line offset. i.e. it might return 20 degrees when it's actually 17, but it would return 21 when it is 18 etc. +The BBC micro:bit checks how hot its CPU (main computer chip) is. +Because the micro:bit does not usually get very hot, the temperature of the CPU +is usually close to the temperature of wherever you are. +The micro:bit might warm up a little if you make it work hard, though! ### Example: micro:bit thermometer -The following example uses the `temperature` and the `show number` to display the room temperature. +The following example uses `temperature` and `show number` to show the temperature of the room. -```sig +```blocks basic.forever(() => { let temp = input.temperature() basic.showNumber(temp) }) ``` +### Example: Fahrenheit thermometer + +This program measures the temperature using Fahrenheit degrees. +Fahrenheit is a way of measuring temperature that is commonly used in the United States. +To make a Celsius temperature into a Fahrenheit one, multiply the Celsius temperature by +1.8 and add 32. + +```blocks +basic.forever(() => { + let c = input.temperature() + let f = (c * 1.8) + 32 + basic.showNumber(f) +}) +``` + +### ~hint + +Try comparing the temperature your micro:bit shows to a real thermometer in the same place. +You might be able to figure out how much to subtract from the number the micro:bit +shows to get the real temperature. Then you can change your program so the micro:bit is a +better thermometer. + +### ~ ### Lessons From 318ffde27ff3f5c2d334a8be9ccf46c8d6d429a3 Mon Sep 17 00:00:00 2001 From: gbaman Date: Wed, 25 May 2016 01:53:13 +0100 Subject: [PATCH 077/135] Add send-string documentation page --- docs/reference/radio/send-string.md | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 docs/reference/radio/send-string.md diff --git a/docs/reference/radio/send-string.md b/docs/reference/radio/send-string.md new file mode 100644 index 00000000..872c1d04 --- /dev/null +++ b/docs/reference/radio/send-string.md @@ -0,0 +1,33 @@ +# Send String + +Broadcasts a string data packet to other micro:bits connected via ``radio``. + +## Important Security Consideration + +The functions in the ``radio`` namespace allow the BBC micro:bit to communicate with other micro:bits. + +This API does not contain any form of encryption, authentication or authorization. It's purpose is solely for use as a teaching aid to demonstrate how simple communications operates, and to provide a sandpit through which learning can take place. + +For serious applications, BLE should be considered a substantially more secure alternative. + +```sig +radio.sendString("Hello world!") +``` + +### Parameters + +* msg - a string to be transmitted. + +### Examples + +Broadcasts the provided string to other micro:bits. + +```blocks +input.onButtonPressed(Button.A, () => { + radio.sendString("Mr. Watson, come here, I want to see you.") +}) +``` + +### See also + +[receive string](/reference/radio/receive-string), [on data received](/reference/radio/on-data-received) From 819ab9aa9ad59ad86f526e21e1194ce58c5c773a Mon Sep 17 00:00:00 2001 From: gbaman Date: Wed, 25 May 2016 02:23:33 +0100 Subject: [PATCH 078/135] Add receive-string documentation page --- docs/reference/radio/receive-string.md | 67 ++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 docs/reference/radio/receive-string.md diff --git a/docs/reference/radio/receive-string.md b/docs/reference/radio/receive-string.md new file mode 100644 index 00000000..5f4db239 --- /dev/null +++ b/docs/reference/radio/receive-string.md @@ -0,0 +1,67 @@ +# Receive String + +Reads the next radio packet if any and returns the first string. + +## Important Security Consideration + +The functions in the ``radio`` namespace allow the BBC micro:bit to communicate with other micro:bits. + +This API does not contain any form of encryption, authentication or authorization. It's purpose is solely for use as a teaching aid to demonstrate how simple communications operates, and to provide a sandpit through which learning can take place. + +For serious applications, BLE should be considered a substantially more secure alternative. + +```sig +radio.receiveString() +``` + +### Return value + +* the first [string](/reference/types/string) of the packet if any. ```""``` otherwise. + +### Examples + +Read the string broadcasted by other micro:bits and display it. + +```blocks +radio.onDataReceived(() => { + basic.showString(radio.receiveString()); +}); +``` + +A simple program to send whether you are happy, or sad over ```radio```, using the A or B button to select an emotion. + +```blocks +let data: string = ""; +input.onButtonPressed(Button.A, () => { + radio.sendString("H"); +}); +input.onButtonPressed(Button.B, () => { + radio.sendString("S"); +}); +radio.onDataReceived(() => { + data = radio.receiveString(); + if ("H" == data) { + basic.showLeds(` + . . . . . + . # . # . + . . . . . + # . . . # + . # # # . + `); + } else if ("S" == data) { + basic.showLeds(` + . . . . . + . # . # . + . . . . . + . # # # . + # . . . # + `); + } else { + basic.showString("?"); + } +}); +``` + +### See also + +[send string](/reference/input/send-string), [on data received](/reference/radio/on-data-received) From a67f16a860ab8194941de49bab8fcb6803c735a4 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Tue, 24 May 2016 18:27:14 -0700 Subject: [PATCH 079/135] Deleted redundant paragraph. --- docs/reference/input/temperature.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/reference/input/temperature.md b/docs/reference/input/temperature.md index c0479b85..45d61953 100644 --- a/docs/reference/input/temperature.md +++ b/docs/reference/input/temperature.md @@ -1,7 +1,5 @@ # Temperature -Get the ambient temperature (degree Celsius °C). The temperature is inferred from the the surface temperature of the various chips on the micro:bit. - Find the temperature where you are. The temperature is measured in Celsius (metric). The micro:bit can find the temperature nearby by checking how hot its computer chips are. From 2ede815535fce0cdc21296812acce2b239349121 Mon Sep 17 00:00:00 2001 From: gbaman Date: Wed, 25 May 2016 02:58:27 +0100 Subject: [PATCH 080/135] Add write-value-to-serial documentation --- docs/reference/radio/write-value-to-serial.md | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 docs/reference/radio/write-value-to-serial.md diff --git a/docs/reference/radio/write-value-to-serial.md b/docs/reference/radio/write-value-to-serial.md new file mode 100644 index 00000000..a618b2b7 --- /dev/null +++ b/docs/reference/radio/write-value-to-serial.md @@ -0,0 +1,45 @@ +# Write Value To Serial + +Writes the full data received data via ``radio`` to serial in JSON format. +**Note** - This method only works for [send number](/reference/radio/send-number) and [send value](/reference/radio/send-value). It does not work for [send string](/reference/radio/send-string) (although a string can be sent with [send value](/reference/radio/send-value)). + +## Data received format +The format for received data printed to serial is as follows +- [send number](/reference/radio/send-number) - ```{v:ValueSent,t:MicrobitTimeAlive,s:Unused}``` +- [send value](/reference/radio/send-number) - ```{v:Value,t:MicrobitTimeAlive,s:Unused,n:"Name"}``` +- [send string](/reference/radio/send-string) - ```{}``` (currently unavailable) + +## Important Security Consideration + +The functions in the ``radio`` namespace allow the BBC micro:bit to communicate with other micro:bits. + +This API does not contain any form of encryption, authentication or authorization. It's purpose is solely for use as a teaching aid to demonstrate how simple communications operates, and to provide a sandpit through which learning can take place. + +For serious applications, BLE should be considered a substantially more secure alternative. + +```sig +radio.writeValueToSerial() +``` + +### Parameters + +* None + +### Examples + +When ```radio``` data is received (after pressing A button on 2nd micro:bit), output temperature data to serial. + +```blocks +input.onButtonPressed(Button.A, () => { + radio.sendNumber(input.temperature()); +}); +radio.onDataReceived(() => { + radio.writeValueToSerial(); +}); +``` +Example output to serial when A button pressed: +```{v:27,t:323,s:0}``` + +### See also + +[send number](/reference/radio/send-number), [send value](/reference/radio/send-number), [on data received](/reference/radio/on-data-received) From 1c8fa5eab650110be75b5ba2065e0cb86c813e2f Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 24 May 2016 21:39:57 -0700 Subject: [PATCH 081/135] move pins->map up in block list --- libs/microbit/pins.cpp | 6 +++--- libs/microbit/pins.ts | 2 +- libs/microbit/shims.d.ts | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libs/microbit/pins.cpp b/libs/microbit/pins.cpp index 3fc32ea7..bf031523 100644 --- a/libs/microbit/pins.cpp +++ b/libs/microbit/pins.cpp @@ -128,7 +128,7 @@ namespace pins { * @param name analog pin to set period to * @param micros period in micro seconds. eg:20000 */ - //% help=pins/analog-set-period weight=23 + //% help=pins/analog-set-period weight=23 blockGap=8 //% blockId=device_set_analog_period block="analog set period|pin %pin|to (µs)%micros" void analogSetPeriod(AnalogPin name, int micros) { PINOP(setAnalogPeriodUs(micros)); @@ -148,10 +148,10 @@ namespace pins { } /** - * Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulse`` handler. + * Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulsed`` handler. */ //% help=pins/pulse-micros - //% blockId=pins_pulse_duration block="pulse duration (us)" + //% blockId=pins_pulse_duration block="pulse duration (µs)" //% weight=21 int pulseDuration() { return pxt::lastEvent.timestamp; diff --git a/libs/microbit/pins.ts b/libs/microbit/pins.ts index 2fb85ad5..3412b8e2 100644 --- a/libs/microbit/pins.ts +++ b/libs/microbit/pins.ts @@ -11,7 +11,7 @@ namespace pins { * @param toLow the lower bound of the value's target range * @param toHigh the upper bound of the value's target range, eg: 4 */ - //% help=pins/map weight=3 + //% help=pins/map weight=22 //% blockId=math_map block="map %value|from low %fromLow|from high %fromHigh|to low %toLow|to high %toHigh" export function map(value: number, fromLow: number, fromHigh: number, toLow: number, toHigh: number): number { return ((value - fromLow) * (toHigh - toLow)) / (fromHigh - fromLow) + toLow; diff --git a/libs/microbit/shims.d.ts b/libs/microbit/shims.d.ts index e55f5d27..523a9b98 100644 --- a/libs/microbit/shims.d.ts +++ b/libs/microbit/shims.d.ts @@ -483,7 +483,7 @@ declare namespace pins { * @param name analog pin to set period to * @param micros period in micro seconds. eg:20000 */ - //% help=pins/analog-set-period weight=23 + //% help=pins/analog-set-period weight=23 blockGap=8 //% blockId=device_set_analog_period block="analog set period|pin %pin|to (µs)%micros" shim=pins::analogSetPeriod function analogSetPeriod(name: AnalogPin, micros: number): void; @@ -495,10 +495,10 @@ declare namespace pins { function onPulsed(name: DigitalPin, pulse: PulseValue, body: () => void): void; /** - * Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulse`` handler. + * Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulsed`` handler. */ //% help=pins/pulse-micros - //% blockId=pins_pulse_duration block="pulse duration (us)" + //% blockId=pins_pulse_duration block="pulse duration (µs)" //% weight=21 shim=pins::pulseDuration function pulseDuration(): number; From d0a7df7f361d11c8f0e9d3ce1f3204037106837c Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 24 May 2016 21:57:47 -0700 Subject: [PATCH 082/135] 0.2.129 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19329e28..ba4b0c47 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.128", + "version": "0.2.129", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 87300be64868095d540658bd7ea92800a658b2a3 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Tue, 24 May 2016 22:18:33 -0700 Subject: [PATCH 083/135] updated starter template --- pxtarget.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pxtarget.json b/pxtarget.json index bd26e02b..81471718 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -26,8 +26,8 @@ ] }, "files": { - "main.blocks": "FALSEFALSEFALSEFALSEFALSEFALSETRUEFALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSETRUEFALSEFALSEFALSETRUEFALSETRUETRUETRUEFALSE", - "main.ts": "\n" + "main.blocks": "\n\n\n\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nTRUE\nFALSE\nTRUE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nTRUE\nFALSE\nFALSE\nFALSE\nTRUE\nFALSE\nTRUE\nTRUE\nTRUE\nFALSE\n\n\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\nFALSE\n\n\n\n\n\n", + "main.ts": "\r\n" } }, "tsprj": { From 53ab8651bd99c19064852b26943459746e53f1a9 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 25 May 2016 10:53:52 -0700 Subject: [PATCH 084/135] Bump pxt-core to 0.2.139 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ba4b0c47..17d0542d 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.138" + "pxt-core": "0.2.139" } } From 3f8fa4b05b8c5be66da60d9742c5661dc9941e3a Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 25 May 2016 10:53:55 -0700 Subject: [PATCH 085/135] 0.2.130 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 17d0542d..7061a101 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.129", + "version": "0.2.130", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 23a581c899061f9ea4ef775799efbb76faa92524 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 09:15:10 -0700 Subject: [PATCH 086/135] added rock-paper-scissors page --- .gitignore | 2 +- docs/projects.md | 15 +++ docs/projects/rock-paper-scissors.md | 162 +++++++++++++++++++++++++++ 3 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 docs/projects.md create mode 100644 docs/projects/rock-paper-scissors.md diff --git a/.gitignore b/.gitignore index 961ea959..0a4c2d25 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ built typings tmp temp -projects +projects/** win10/app/bin win10/app/bld win10/*.opendb diff --git a/docs/projects.md b/docs/projects.md new file mode 100644 index 00000000..8343f52a --- /dev/null +++ b/docs/projects.md @@ -0,0 +1,15 @@ +# Projects + + +### @short Projects + +### ~column + +## Beginner + +* [Rock Paper Scissors](/projects/rock-paper-scissors) + +### ~ + +### ~column + diff --git a/docs/projects/rock-paper-scissors.md b/docs/projects/rock-paper-scissors.md new file mode 100644 index 00000000..922ce503 --- /dev/null +++ b/docs/projects/rock-paper-scissors.md @@ -0,0 +1,162 @@ +# rock paper scissors + +### ~avatar avatar + +### @video td/videos/rock-paper-scissors-0 + +In this project, you will build a rock-paper-scissor game with the BBC micro:bit +### ~ + +## Materials needed + +* your BBC micro:bit, that's it! + +## 1 + +We want the micro:bit to choose rock, paper, or scissors when it is shaken. Let's begin by creating an on shake condition so the micro:bit will run code when it is shaken. + +```blocks +input.onGesture(Gesture.Shake, () => { + +}) +``` + +Next, create a variable and store pick random number from 0 to 2. On shake, a number will be randomly picked from 0-2. We will randomly display an image based on the random number returned. + +```blocks +input.onGesture(Gesture.Shake, () => { + let img = Math.random(3) +}) + +``` + +The micro:bit will look like it's showing 1 frame of the image by displaying the whole image when pick random is equal to 0. We can help the micro:bit randomly decide which image to use by pick random. +The micro:bit will randomly pick the image to display with show LEDs and the ``pick random`` block. + +```blocks +input.onGesture(Gesture.Shake, () => { + let img = Math.random(3) + if (img == 2) { + basic.showLeds(` + # # # # # + # . . . # + # . . . # + # . . . # + # # # # # + `) + + } +}) +``` + +## 2 + +The micro:bit will look like it's showing 1 frame of the image by displaying the whole image when pick random is equal to 1. +We can help the micro:bit randomly decide which image to use by pick random. +The micro:bit will randomly pick the image to display with show LEDs and the pick random function. + +### ~avatar avatar + +Click on the blue gearwheel to open the ``if`` editor. Drag and drop the ``else if`` block in the ``if`` block to add it. + +### ~ + +```blocks +input.onGesture(Gesture.Shake, () => { + let img = Math.random(3) + if (img == 0) { + basic.showLeds(` + # # # # # + # . . . # + # . . . # + # . . . # + # # # # # + `) + + } else if (img == 1) { + basic.showLeds(` + . . . . . + . # # # . + . # # # . + . # # # . + . . . . . + `) + } +}) +``` + +## 3 + +The micro:bit will look like it's showing 1 frame of the image by displaying the whole image when pick random is not equal to 0 and not equal to 1. +We can help the micro:bit randomly decide which image to use by pick random. The micro:bit will randomly pick the image to display with show LEDs and the pick random function. + +```blocks +input.onGesture(Gesture.Shake, () => { + let img = Math.random(3) + if (img == 0) { + basic.showLeds(` + # # # # # + # . . . # + # . . . # + # . . . # + # # # # # + `) + + } else if (img == 1) { + basic.showLeds(` + . . . . . + . # # # . + . # # # . + . # # # . + . . . . . + `) + } else { + basic.showLeds(` + . . . # # + # # . # . + . . # . . + # # . # . + . . . # # + `) + } +}) + +``` + +Your game is ready! + +## 4 + +When the button ``A`` is pressed, increment the score by 1. You can select ``Game`` drawer then add ``change score by 1``. + +```blocks +input.onButtonPressed(Button.A, () => { + game.addScore(1) +}) + +``` + +## 5 + +After incrementing the score, display the total number of wins you have. + +```blocks +input.onButtonPressed(Button.A, () => { + game.addScore(1) + basic.showString("WINS:") + basic.showNumber(game.score()) +}) +``` +## 6 + +You have successfully tracked and displayed the number of wins on the micro:bit! However, what about losses? +Use the Game drawer to change score by -1 when button `B` is pressed. Here are all the blocks you will need: + +```shuffle +input.onButtonPressed(Button.B, () => { + game.addScore(-1) + basic.showString("LOSSES:") + basic.showNumber(game.score()) +}) +``` + From 54439bba4d4072323a7c8fe5afca6da4c4bbc014 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 09:15:22 -0700 Subject: [PATCH 087/135] Bump pxt-core to 0.2.140 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7061a101..fe054381 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.139" + "pxt-core": "0.2.140" } } From ce9a83ff2869998a90c7cc4bfa16e4c998115b24 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 09:15:26 -0700 Subject: [PATCH 088/135] 0.2.131 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fe054381..9098ee18 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.130", + "version": "0.2.131", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 0648e80131f6e8098eb238a034e04852fae0f13f Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 11:07:09 -0700 Subject: [PATCH 089/135] added serial.redirect --- .gitignore | 2 ++ libs/microbit/enums.d.ts | 21 +++++++++++++++++++++ libs/microbit/serial.cpp | 36 +++++++++++++++++++++++++++++++++++- libs/microbit/shims.d.ts | 12 ++++++++++++ sim/libmbit.ts | 4 ++++ 5 files changed, 74 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0a4c2d25..46028121 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ node_modules +yotta_modules +yotta_targets built typings tmp diff --git a/libs/microbit/enums.d.ts b/libs/microbit/enums.d.ts index c24c9e32..c0b922f1 100644 --- a/libs/microbit/enums.d.ts +++ b/libs/microbit/enums.d.ts @@ -280,6 +280,27 @@ declare namespace led { } declare namespace pins { } + + + declare enum SerialPin { + P0 = 7, // MICROBIT_ID_IO_P0 + P1 = 8, // MICROBIT_ID_IO_P1 + P2 = 9, // MICROBIT_ID_IO_P2 + P8 = 15, // MICROBIT_ID_IO_P8 + P12 = 19, // MICROBIT_ID_IO_P12 + P13 = 20, // MICROBIT_ID_IO_P13 + P14 = 21, // MICROBIT_ID_IO_P14 + P15 = 22, // MICROBIT_ID_IO_P15 + P16 = 23, // MICROBIT_ID_IO_P16 + } + + + declare enum BaudRate { + //% block=115200 + BaudRate115200 = 115200, + //% block=9600 + BaudRate9600 = 9600, + } declare namespace serial { } diff --git a/libs/microbit/serial.cpp b/libs/microbit/serial.cpp index ff027c7e..e08e0b99 100644 --- a/libs/microbit/serial.cpp +++ b/libs/microbit/serial.cpp @@ -1,5 +1,24 @@ #include "ksbit.h" +enum class SerialPin { + P0 = MICROBIT_ID_IO_P0, + P1 = MICROBIT_ID_IO_P1, + P2 = MICROBIT_ID_IO_P2, + P8 = MICROBIT_ID_IO_P8, + P12 = MICROBIT_ID_IO_P12, + P13 = MICROBIT_ID_IO_P13, + P14 = MICROBIT_ID_IO_P14, + P15 = MICROBIT_ID_IO_P15, + P16 = MICROBIT_ID_IO_P16 +}; + +enum class BaudRate { + //% block=115200 + BaudRate115200 = 115200, + //% block=9600 + BaudRate9600 = 9600 +}; + //% weight=2 color=30 namespace serial { // note that at least one // followed by % is needed per declaration! @@ -34,4 +53,19 @@ namespace serial { uBit.serial.eventOn(ManagedString(delimiters)); registerWithDal(MICROBIT_ID_SERIAL, MICROBIT_SERIAL_EVT_DELIM_MATCH, body); } -} + + /** + * Dynamically configuring the serial instance to use pins other than USBTX and USBRX. + * @param tx the new transmission pins + * @param rx the new reception pin + * @param baud the new baud rate. eg: 115200 + */ + //% weight=10 + //% help=serial/redirect + //% blockId=serial_redirect block="serial redirect to|TX %tx|RX %rx|at baud rate %rate" + //% blockExternalInputs=1 + void redirect(SerialPin tx, SerialPin rx, BaudRate rate) { + uBit.serial.redirect((PinName)tx, (PinName)rx); + uBit.serial.baud((int)rate); + } +} \ No newline at end of file diff --git a/libs/microbit/shims.d.ts b/libs/microbit/shims.d.ts index 523a9b98..aff85e66 100644 --- a/libs/microbit/shims.d.ts +++ b/libs/microbit/shims.d.ts @@ -575,6 +575,18 @@ declare namespace serial { //% weight=87 //% blockId=serial_writestring block="serial write string %text" shim=serial::writeString function writeString(text: string): void; + + /** + * Dynamically configuring the serial instance to use pins other than USBTX and USBRX. + * @param tx the new transmission pins + * @param rx the new reception pin + * @param baud the new baud rate. eg: 115200 + */ + //% weight=10 + //% help=serial/redirect + //% blockId=serial_redirect block="serial redirect to|TX %tx|RX %rx|at baud rate %rate" + //% blockExternalInputs=1 shim=serial::redirect + function redirect(tx: SerialPin, rx: SerialPin, rate: BaudRate): void; } diff --git a/sim/libmbit.ts b/sim/libmbit.ts index 916bdc3a..0ddbecab 100644 --- a/sim/libmbit.ts +++ b/sim/libmbit.ts @@ -438,6 +438,10 @@ namespace pxsim.serial { let b = board(); b.bus.listen(DAL.MICROBIT_ID_SERIAL, DAL.MICROBIT_SERIAL_EVT_DELIM_MATCH, handler); } + + export function redirect(tx: number, rx: number, rate: number) { + // TODO? + } } From ed54ace797cb8af35c2ed01bc4f687c6f84e2a73 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 11:15:16 -0700 Subject: [PATCH 090/135] Bump pxt-core to 0.2.141 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9098ee18..3405ee53 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.140" + "pxt-core": "0.2.141" } } From f3bfe3d94e60ecd0dec555c625cdf54a306f3c88 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 11:15:56 -0700 Subject: [PATCH 091/135] 0.2.132 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3405ee53..bf32d4bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.131", + "version": "0.2.132", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 59f7d0b537fc418188649425298d6c1e1fa2e53a Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 12:27:05 -0700 Subject: [PATCH 092/135] update logo --- docs/static/microbit.simplified.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/static/microbit.simplified.svg b/docs/static/microbit.simplified.svg index d0936987..0db9abfd 100644 --- a/docs/static/microbit.simplified.svg +++ b/docs/static/microbit.simplified.svg @@ -1 +1 @@ -(1,0)(3,0)(0,1)(2,1)(4,1)(0,2)(4,2)(1,3)(3,3)(2,4)P0, ANALOG INP1, ANALOG INP2, ANALOG INP3, ANALOG IN, LED Col 1P4, ANALOG IN, LED Col 2P8P13, SPI - SCKP18, +3v3GND+3v3GNDAB(1,0)(1,0)(1,0)(1,0)(1,0)(1,0) \ No newline at end of file +(1,0)(3,0)(0,1)(2,1)(4,1)(0,2)(4,2)(1,3)(3,3)(2,4)P0, ANALOG INP1, ANALOG INP2, ANALOG INP3, ANALOG IN, LED Col 1P4, ANALOG IN, LED Col 2P5, BUTTON AP6, LED Col 9P7, LED Col 8P8P9, LED Col 7P10, ANALOG IN, LED Col 3P11, BUTTON BP12, RESERVED ACCESSIBILITYP13, SPI - SCKP14, SPI - MISOP15, SPI - MOSIP16, SPI - Chip SelectP17, +3v3P18, +3v3P19, I2C - SCLP20, I2C - SDAGNDGND+3v3GNDAB \ No newline at end of file From 43adfa198ff89c795ef4500795d08a49a061cfee Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 12:49:30 -0700 Subject: [PATCH 093/135] Bump pxt-core to 0.2.143 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bf32d4bc..c9403b18 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.141" + "pxt-core": "0.2.143" } } From 91b90bf70ebcfdb002115df7c5c7cd0da71b5e9a Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 12:49:32 -0700 Subject: [PATCH 094/135] 0.2.133 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c9403b18..1e0a97ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.132", + "version": "0.2.133", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 493f76eba742a1b8aa806c230e84665167ea4b6e Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 15:10:46 -0700 Subject: [PATCH 095/135] removed video from rps --- docs/projects/rock-paper-scissors.md | 35 +++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/docs/projects/rock-paper-scissors.md b/docs/projects/rock-paper-scissors.md index 922ce503..4cee241e 100644 --- a/docs/projects/rock-paper-scissors.md +++ b/docs/projects/rock-paper-scissors.md @@ -2,8 +2,37 @@ ### ~avatar avatar -### @video td/videos/rock-paper-scissors-0 +```sim +input.onGesture(Gesture.Shake, () => { + let img = Math.random(3) + if (img == 0) { + basic.showLeds(` + # # # # # + # . . . # + # . . . # + # . . . # + # # # # # + `) + } else if (img == 1) { + basic.showLeds(` + . . . . . + . # # # . + . # # # . + . # # # . + . . . . . + `) + } else { + basic.showLeds(` + # # . . # + # # . # . + . . # . . + # # . # . + # # . . # + `) + } +}) +``` In this project, you will build a rock-paper-scissor game with the BBC micro:bit ### ~ @@ -112,11 +141,11 @@ input.onGesture(Gesture.Shake, () => { `) } else { basic.showLeds(` - . . . # # + # # . . # # # . # . . . # . . # # . # . - . . . # # + # # . . # `) } }) From 5553fb93bb65feafddf64cd6b2891db7f840dbfa Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 15:24:10 -0700 Subject: [PATCH 096/135] removing videos from docs --- docs/lessons.md | 2 +- docs/lessons/answering-machine.md | 8 +------- docs/lessons/answering-machine/activity.md | 1 - docs/lessons/answering-machine/challenges.md | 4 ---- docs/lessons/beautiful-image.md | 4 +--- docs/lessons/beautiful-image/activity.md | 2 -- docs/lessons/beautiful-image/challenges.md | 2 -- docs/lessons/blink.md | 3 --- docs/lessons/blink/activity.md | 11 ++++++++-- docs/lessons/blink/challenges.md | 6 ------ docs/lessons/catch-the-egg-game.md | 2 -- docs/lessons/catch-the-egg-game/activity.md | 2 -- docs/lessons/compass.md | 2 -- docs/lessons/counter.md | 2 -- docs/lessons/counter/activity.md | 2 -- docs/lessons/counter/challenges.md | 3 --- docs/lessons/{die-roll.md => dice-roll.md} | 14 ++++++------- .../{die-roll => dice-roll}/activity.md | 20 +++++++++---------- .../{die-roll => dice-roll}/challenges.md | 10 +++++----- .../{die-roll => dice-roll}/quiz-answers.md | 6 +++--- docs/lessons/{die-roll => dice-roll}/quiz.md | 6 +++--- docs/lessons/digi-yoyo.md | 4 +--- docs/lessons/digi-yoyo/activity.md | 2 -- docs/lessons/digi-yoyo/challenges.md | 2 -- docs/lessons/flashing-heart.md | 2 -- docs/lessons/flashing-heart/activity.md | 2 -- docs/lessons/flashing-heart/challenges.md | 4 ---- docs/lessons/game-counter.md | 2 -- docs/lessons/game-counter/activity.md | 8 -------- docs/lessons/game-counter/challenges.md | 2 -- docs/lessons/guess-the-number.md | 2 -- docs/lessons/guess-the-number/activity.md | 2 -- docs/lessons/guess-the-number/challenges.md | 2 -- docs/lessons/guess-the-number/tutorial.md | 2 -- docs/lessons/looper.md | 2 -- docs/lessons/looper/activity.md | 8 -------- docs/lessons/looper/challenges.md | 8 -------- docs/lessons/love-meter.md | 4 +--- docs/lessons/love-meter/activity.md | 2 -- docs/lessons/love-meter/challenges.md | 2 -- docs/lessons/lucky-7.md | 4 +--- docs/lessons/lucky-7/activity.md | 2 -- docs/lessons/lucky-7/challenges.md | 2 -- docs/lessons/magic-logo.md | 2 +- docs/lessons/magic-logo/activity.md | 2 -- docs/lessons/magic-logo/challenges.md | 2 -- docs/lessons/night-light.md | 2 -- docs/lessons/night-light/activity.md | 2 -- docs/lessons/night-light/challenges.md | 2 +- docs/lessons/offset-image/activity.md | 2 +- docs/lessons/rock-paper-scissors.md | 2 +- docs/lessons/rock-paper-scissors/activity.md | 2 +- docs/lessons/rotation-animation/challenges.md | 2 +- docs/lessons/screen-wipe.md | 2 +- docs/lessons/screen-wipe/activity.md | 2 +- docs/lessons/screen-wipe/challenges.md | 2 +- docs/lessons/smiley.md | 2 +- docs/lessons/smiley/activity.md | 2 +- docs/lessons/smiley/challenges.md | 2 +- docs/lessons/snowflake-fall.md | 2 +- docs/lessons/snowflake-fall/activity.md | 2 +- docs/lessons/snowflake-fall/challenges.md | 2 +- docs/lessons/speed-button.md | 2 +- docs/lessons/speed-button/activity.md | 4 ++-- docs/lessons/spinner.md | 2 +- docs/lessons/spinner/activity.md | 2 +- docs/lessons/strobe-light.md | 2 +- docs/lessons/strobe-light/activity.md | 2 +- docs/lessons/strobe-light/challenges.md | 6 +++--- docs/lessons/teach.md | 2 +- docs/lessons/truth-or-dare.md | 2 +- docs/lessons/truth-or-dare/activity.md | 2 +- docs/lessons/truth-or-dare/tutorial.md | 2 +- docs/lessons/zoomer.md | 2 +- docs/lessons/zoomer/activity.md | 2 +- docs/lessons/zoomer/challenges.md | 2 +- olddocs/js/lessons/bounce-image.md | 2 -- olddocs/js/lessons/bounce-image/challenges.md | 6 +----- olddocs/js/lessons/digital-pet.md | 2 -- olddocs/js/lessons/digital-pet/challenges.md | 6 ------ .../js/lessons/flipping-bird/challenges.md | 2 -- .../js/lessons/glowing-mountain/challenges.md | 6 +----- olddocs/js/lessons/glowing-sword.md | 2 -- 83 files changed, 75 insertions(+), 205 deletions(-) rename docs/lessons/{die-roll.md => dice-roll.md} (81%) rename docs/lessons/{die-roll => dice-roll}/activity.md (81%) rename docs/lessons/{die-roll => dice-roll}/challenges.md (86%) rename docs/lessons/{die-roll => dice-roll}/quiz-answers.md (93%) rename docs/lessons/{die-roll => dice-roll}/quiz.md (84%) diff --git a/docs/lessons.md b/docs/lessons.md index f59dbb51..26da5a82 100644 --- a/docs/lessons.md +++ b/docs/lessons.md @@ -34,7 +34,7 @@ * [Rock Paper Scissors](/lessons/rock-paper-scissors), create the classic game of rock paper scissors with if statement * [Truth or Dare](/lessons/truth-or-dare), a game that forces each player to reveal a secret or do something funny with if statement * [Spinner](/lessons/spinner), spin the arrow with multiple if statements -* [Die Roll](/lessons/die-roll), spin with more if statements +* [Dice Roll](/lessons/dice-roll), spin with more if statements * [Looper](/lessons/looper), display a series of numbers with a for loop index * [Strobe Light](/lessons/strobe-light), develop shapes with a nested for loops * [Temperature](/lessons/temperature), get the ambient temperature (degree Celsius °C) diff --git a/docs/lessons/answering-machine.md b/docs/lessons/answering-machine.md index 9a520b44..51d47eab 100644 --- a/docs/lessons/answering-machine.md +++ b/docs/lessons/answering-machine.md @@ -1,8 +1,6 @@ # answering machine blocks lesson -create an answering machine on the BBC micro:bit #docs - -### @video td/videos/answering-machine-0 +Create an answering machine on the BBC micro:bit ## Topic @@ -25,12 +23,8 @@ Learn how to creating a message with a **string**, `show string` to write your m ```cards basic.showString('Hi!') input.onButtonPressed(Button.A, () => {}) - ``` - -* **on button pressed** : [read more...](/reference/input/on-button-pressed) - ## Objectives * learn how to show a string on the LED screen one character at a time diff --git a/docs/lessons/answering-machine/activity.md b/docs/lessons/answering-machine/activity.md index a40e1241..b41ea8c0 100644 --- a/docs/lessons/answering-machine/activity.md +++ b/docs/lessons/answering-machine/activity.md @@ -4,7 +4,6 @@ Learn to create an answering machine on the micro:bit ### ~avatar avatar -### @video td/videos/answering-machine-0 Let's learn how to create an answering machine! diff --git a/docs/lessons/answering-machine/challenges.md b/docs/lessons/answering-machine/challenges.md index 5116e590..0a03be08 100644 --- a/docs/lessons/answering-machine/challenges.md +++ b/docs/lessons/answering-machine/challenges.md @@ -12,8 +12,6 @@ basic.showString("ASK ME A QUESTION") ### Challenge 1 -### @video td/videos/answering-machine-1 - Now we need to reply after someone asks micro:bit a yes or no question. We want to respond `YES` when button `A` is pressed. Add a condition for button `A` and inside it show the string `YES`. ```blocks @@ -27,8 +25,6 @@ input.onButtonPressed(Button.A, () => { ### Challenge 2 -### @video td/videos/answering-machine-2 - What if micro:bit's answer to the question is no? Let's have `NO` be displayed when button `B` is pressed. Add a condition for button `B` and inside it show the string `NO`. ```blocks diff --git a/docs/lessons/beautiful-image.md b/docs/lessons/beautiful-image.md index 27973d03..8bb450d9 100644 --- a/docs/lessons/beautiful-image.md +++ b/docs/lessons/beautiful-image.md @@ -1,8 +1,6 @@ # beautiful image lesson -display beautiful images on the BBC micro:bit. - -### @video td/videos/beautiful-image-0 +Display beautiful images on the BBC micro:bit. ## Topic diff --git a/docs/lessons/beautiful-image/activity.md b/docs/lessons/beautiful-image/activity.md index d4d4524a..fcfc0e1a 100644 --- a/docs/lessons/beautiful-image/activity.md +++ b/docs/lessons/beautiful-image/activity.md @@ -4,8 +4,6 @@ Generate and show a beautiful image. ### ~avatar avatar -### @video td/videos/beautiful-image-0 - Let's learn how to show an image on the LED screen. ### ~ diff --git a/docs/lessons/beautiful-image/challenges.md b/docs/lessons/beautiful-image/challenges.md index 802c8c76..4a4a54b2 100644 --- a/docs/lessons/beautiful-image/challenges.md +++ b/docs/lessons/beautiful-image/challenges.md @@ -18,8 +18,6 @@ basic.showLeds(` ### Challenge 1 -### @video td/videos/beautiful-image-1-2 - Now show an new image that will display on the micro:bit. ```blocks diff --git a/docs/lessons/blink.md b/docs/lessons/blink.md index 74a96e27..7e4bd017 100644 --- a/docs/lessons/blink.md +++ b/docs/lessons/blink.md @@ -2,8 +2,6 @@ Learn how to create a blinking LED. -### @video td/videos/blink-0 - ## Topic Plot @@ -30,7 +28,6 @@ basic.pause(100) basic.forever(() => {}) ``` - ## Objectives * learn how to turn on LED lights on the LED screen diff --git a/docs/lessons/blink/activity.md b/docs/lessons/blink/activity.md index 647bfcef..b9ef94bb 100644 --- a/docs/lessons/blink/activity.md +++ b/docs/lessons/blink/activity.md @@ -4,7 +4,15 @@ Turn an LED on and off with forever ### ~avatar avatar -### @video td/videos/blink-0 +```sim +basic.forever(() => { + led.plot(2, 2) + basic.pause(500) + led.unplot(2, 2) + basic.pause(500) +}) +``` +Let's build a blinking light! ### ~ @@ -43,7 +51,6 @@ basic.forever(() => { led.unplot(2, 2) basic.pause(500) }) - ``` ### ~avatar boothing diff --git a/docs/lessons/blink/challenges.md b/docs/lessons/blink/challenges.md index 3baf3151..63bdb9ec 100644 --- a/docs/lessons/blink/challenges.md +++ b/docs/lessons/blink/challenges.md @@ -17,8 +17,6 @@ basic.forever(() => { ### Challenge 1 -### @video td/videos/blink-1 - Let's display a "smiley face" on the screen! We'll start by plotting the eyes. Add `plot(1,1)` and `plot(3,1)` under `plot(2,2)` ; then add `unplot(1,1)`, `unplot(3,1)` and `unplot(2,2)` after `pause`. When you're ready, don't forget to run your code to try it out! @@ -38,8 +36,6 @@ basic.forever(() => { ### Challenge 2 -### @video td/videos/blink-2 - Let's add the code to plot the mouth by using `plot` and `unplot` to the following coordinates: (1,4), (2,4) and (3,4). When you're ready, don't forget to run your code to try it out! ```blocks @@ -63,8 +59,6 @@ basic.forever(() => { ### Challenge 3 -### @video td/videos/blink-3 - Let's keep using `plot` to convert the mouth into a smiley face. ```` bitmatrix diff --git a/docs/lessons/catch-the-egg-game.md b/docs/lessons/catch-the-egg-game.md index 079b6df5..1e66afbc 100644 --- a/docs/lessons/catch-the-egg-game.md +++ b/docs/lessons/catch-the-egg-game.md @@ -2,8 +2,6 @@ A game to catch eggs in a basket. -### @video td/videos/catch-the-egg-game-0 - ## Topic Variables diff --git a/docs/lessons/catch-the-egg-game/activity.md b/docs/lessons/catch-the-egg-game/activity.md index e7479558..ea0f7b50 100644 --- a/docs/lessons/catch-the-egg-game/activity.md +++ b/docs/lessons/catch-the-egg-game/activity.md @@ -108,8 +108,6 @@ basic.forever(() => { ### Challenge 3 -### @video td/videos/catch-the-egg-game-4 - Let's make the egg fall faster by decreasing the amount of time it pauses in each position by decreasing **falling pause** by `25` every 5 catches. Now, instead of pausing for 300 milliseconds we can pause for the value of **falling pause**. ```blocks diff --git a/docs/lessons/compass.md b/docs/lessons/compass.md index 2278e2f6..6348e0e6 100644 --- a/docs/lessons/compass.md +++ b/docs/lessons/compass.md @@ -2,8 +2,6 @@ create a die on the BBC micro:bit. -### @video td/videos/compass-0 - ## Topic If (Conditionals) diff --git a/docs/lessons/counter.md b/docs/lessons/counter.md index 18afef28..7721de6a 100644 --- a/docs/lessons/counter.md +++ b/docs/lessons/counter.md @@ -2,8 +2,6 @@ Learn how to create a counter with with on button pressed. -### @video td/videos/counter-0 - ## Topic Variables diff --git a/docs/lessons/counter/activity.md b/docs/lessons/counter/activity.md index 50725090..e3e1d251 100644 --- a/docs/lessons/counter/activity.md +++ b/docs/lessons/counter/activity.md @@ -4,8 +4,6 @@ Display a number with a variable. ### ~avatar avatar -### @video td/videos/counter-0 - Welcome! This tutorial will teach you how to make a counter that increments when button A is pressed. Let's get started! ### ~ diff --git a/docs/lessons/counter/challenges.md b/docs/lessons/counter/challenges.md index 5dc0acab..8d478cb3 100644 --- a/docs/lessons/counter/challenges.md +++ b/docs/lessons/counter/challenges.md @@ -16,8 +16,6 @@ input.onButtonPressed(Button.A, () => { ### Challenge 1 -### @video td/videos/counter-1-2 - Let's add the code to `count` when `B` is pressed. Add an event handler with `on button pressed(B)` then add the code to `count`. @@ -33,7 +31,6 @@ input.onButtonPressed(Button.B, () => { }) ``` - ### Challenge 3 Now let's try to reset the counter when the micro:bit is shaken. You will need to register an event handler with `on shake`. diff --git a/docs/lessons/die-roll.md b/docs/lessons/dice-roll.md similarity index 81% rename from docs/lessons/die-roll.md rename to docs/lessons/dice-roll.md index 622292ea..c0f13b95 100644 --- a/docs/lessons/die-roll.md +++ b/docs/lessons/dice-roll.md @@ -1,8 +1,6 @@ -# die roll lesson +# dice roll lesson -create a die on the BBC micro:bit. - -### @video td/videos/die-roll-0 +Create a dice on the BBC micro:bit. ## Topic @@ -10,10 +8,10 @@ If (Conditionals) ## Quick Links -* [activity](/lessons/die-roll/activity) -* [challenges](/lessons/die-roll/challenges) -* [quiz](/lessons/die-roll/quiz) -* [quiz answers](/lessons/die-roll/quiz-answers) +* [activity](/lessons/dice-roll/activity) +* [challenges](/lessons/dice-roll/challenges) +* [quiz](/lessons/dice-roll/quiz) +* [quiz answers](/lessons/dice-roll/quiz-answers) ## Prior learning/place of lesson in scheme of work diff --git a/docs/lessons/die-roll/activity.md b/docs/lessons/dice-roll/activity.md similarity index 81% rename from docs/lessons/die-roll/activity.md rename to docs/lessons/dice-roll/activity.md index 3f6940fc..51d530fa 100644 --- a/docs/lessons/die-roll/activity.md +++ b/docs/lessons/dice-roll/activity.md @@ -1,12 +1,10 @@ -# die roll activity +# dice roll activity -Create a die on the micro:bit +Create a dice on the micro:bit ### ~avatar avatar -### @video td/videos/die-roll-0 - -Welcome! This tutorial will help you create a die. Let's get started! +Welcome! This tutorial will help you create a dice. Let's get started! ### ~ @@ -19,7 +17,7 @@ input.onGesture(Gesture.Shake, () => { }) ``` -We need to show a random value from 1 to 6 on our die. So let's make a local variable called **roll**. +We need to show a random value from 1 to 6 on our dice. So let's make a local variable called **roll**. ```blocks input.onGesture(Gesture.Shake, () => { @@ -27,7 +25,7 @@ input.onGesture(Gesture.Shake, () => { }) ``` -We need a condition for if **roll** is 5. We will show a `6` if **roll** is 5 because **roll** has a range from 0 to 5. We can use `show LEDs` to display the side of a die that shows 6. +We need a condition for if **roll** is 5. We will show a `6` if **roll** is 5 because **roll** has a range from 0 to 5. We can use `show LEDs` to display the side of a dice that shows 6. ```blocks @@ -45,7 +43,7 @@ input.onGesture(Gesture.Shake, () => { ``` -Let's use an `else if` condition for if **roll** is 4. If **roll** is 4 we can show 5 dots on the die. +Let's use an `else if` condition for if **roll** is 4. If **roll** is 4 we can show 5 dots on the dice. ```blocks @@ -72,7 +70,7 @@ input.onGesture(Gesture.Shake, ()=> { ``` -Now we need to repeat the same steps for if **roll** is 3. If **roll** is 3 we will show `4` on the die. +Now we need to repeat the same steps for if **roll** is 3. If **roll** is 3 we will show `4` on the dice. ```blocks @@ -106,7 +104,7 @@ input.onGesture(Gesture.Shake, () => { ``` -Let's also repeat these steps to show the 3, 2, and 1 on the die. We are almost done with our die! +Let's also repeat these steps to show the 3, 2, and 1 on the dice. We are almost done with our dice! ```blocks input.onGesture(Gesture.Shake, () => { @@ -165,7 +163,7 @@ input.onGesture(Gesture.Shake, () => { ### ~avatar avatar -Excellent, you're ready to continue with the [challenges](/lessons/die-roll/challenges)! +Excellent, you're ready to continue with the [challenges](/lessons/dice-roll/challenges)! ### ~ diff --git a/docs/lessons/die-roll/challenges.md b/docs/lessons/dice-roll/challenges.md similarity index 86% rename from docs/lessons/die-roll/challenges.md rename to docs/lessons/dice-roll/challenges.md index 8e29ba66..1a3d0bbd 100644 --- a/docs/lessons/die-roll/challenges.md +++ b/docs/lessons/dice-roll/challenges.md @@ -1,10 +1,10 @@ -# die roll challenges +# dice roll challenges -Create a die on the micro:bit. +Create a dice on the micro:bit. ## Before we get started -Complete the following [guided tutorial](/lessons/die-roll/activity), your code should look like this: +Complete the following [guided tutorial](/lessons/dice-roll/activity), your code should look like this: ```blocks input.onGesture(Gesture.Shake, () => { @@ -62,7 +62,7 @@ input.onGesture(Gesture.Shake, () => { ### Challenge 1 -Modify the line of code with `pick random` so that only number 1-4 can appear on the die. +Modify the line of code with `pick random` so that only number 1-4 can appear on the dice. ```blocks @@ -121,7 +121,7 @@ input.onGesture(Gesture.Shake, () => { ### Challenge 2 -Let's make a trick die! Modify the line of code with `pick random` so that only numbers 3-6 can appear on the die. Also note that we need to ensure `roll = 0` when only 1 dot is shown on the BBC micro:bit. +Let's make a trick dice! Modify the line of code with `pick random` so that only numbers 3-6 can appear on the dice. Also note that we need to ensure `roll = 0` when only 1 dot is shown on the BBC micro:bit. ```blocks input.onGesture(Gesture.Shake, () => { diff --git a/docs/lessons/die-roll/quiz-answers.md b/docs/lessons/dice-roll/quiz-answers.md similarity index 93% rename from docs/lessons/die-roll/quiz-answers.md rename to docs/lessons/dice-roll/quiz-answers.md index 758359dc..fa87d611 100644 --- a/docs/lessons/die-roll/quiz-answers.md +++ b/docs/lessons/dice-roll/quiz-answers.md @@ -1,8 +1,8 @@ -# die roll quiz answers +# dice roll quiz answers -Create a die when the BBC micro:bit is shaken +Create a dice when the BBC micro:bit is shaken -These are the answers to the [die roll quiz](/lessons/die-roll/quiz). +These are the answers to the [dice roll quiz](/lessons/dice-roll/quiz). ## 1. Create a variable named 'roll' that will be randomly assigned to a number between 0 and 5. diff --git a/docs/lessons/die-roll/quiz.md b/docs/lessons/dice-roll/quiz.md similarity index 84% rename from docs/lessons/die-roll/quiz.md rename to docs/lessons/dice-roll/quiz.md index bf796902..b4afaf28 100644 --- a/docs/lessons/die-roll/quiz.md +++ b/docs/lessons/dice-roll/quiz.md @@ -1,12 +1,12 @@ -# die roll quiz +# dice roll quiz -Create a die when the BBC micro:bit is shaken +Create a dice when the BBC micro:bit is shaken ## Name ## Directions -Use this activity document to guide your work in the [die roll tutorial](/lessons/die-roll/activity). +Use this activity document to guide your work in the [dice roll tutorial](/lessons/dice-roll/activity). Answer the questions while completing the tutorial. Pay attention to the dialogues! diff --git a/docs/lessons/digi-yoyo.md b/docs/lessons/digi-yoyo.md index 7a4ecb80..06643f82 100644 --- a/docs/lessons/digi-yoyo.md +++ b/docs/lessons/digi-yoyo.md @@ -1,8 +1,6 @@ # digi yoyo lesson -create a counter with a while loop. - -### @video td/videos/digi-yoyo-0 +Create a counter with a while loop. ## Topic diff --git a/docs/lessons/digi-yoyo/activity.md b/docs/lessons/digi-yoyo/activity.md index 86ad9043..c65c3a2a 100644 --- a/docs/lessons/digi-yoyo/activity.md +++ b/docs/lessons/digi-yoyo/activity.md @@ -4,8 +4,6 @@ Create a counter with a while loop. ### ~avatar avatar -### @video td/videos/digi-yoyo-0 - Welcome! This tutorial will teach how to create a counter with a while loop. Let's get started! ### ~ diff --git a/docs/lessons/digi-yoyo/challenges.md b/docs/lessons/digi-yoyo/challenges.md index 4665babf..78fc8674 100644 --- a/docs/lessons/digi-yoyo/challenges.md +++ b/docs/lessons/digi-yoyo/challenges.md @@ -40,8 +40,6 @@ while (count > 0) { ### Challenge 2 -### @video td/videos/digi-yoyo-1-2 - Inside of the while loop, let's add `pause->(1000)` so that we have a pause between each number as it's counting down. Also, let's show `count`! diff --git a/docs/lessons/flashing-heart.md b/docs/lessons/flashing-heart.md index eb711aae..6ca3c7e8 100644 --- a/docs/lessons/flashing-heart.md +++ b/docs/lessons/flashing-heart.md @@ -2,8 +2,6 @@ Learn how to create LED images with a global variable. -### @video td/videos/flashing-heart-0 - ## Topic Pause diff --git a/docs/lessons/flashing-heart/activity.md b/docs/lessons/flashing-heart/activity.md index c9c866e8..c1481c8b 100644 --- a/docs/lessons/flashing-heart/activity.md +++ b/docs/lessons/flashing-heart/activity.md @@ -4,8 +4,6 @@ Control images with a variable. ### ~avatar avatar -### @video td/videos/flashing-heart-0 - In this activity, you will learn how to blink an image on the LED screen. ### ~ diff --git a/docs/lessons/flashing-heart/challenges.md b/docs/lessons/flashing-heart/challenges.md index dab0bc4d..fdbdab21 100644 --- a/docs/lessons/flashing-heart/challenges.md +++ b/docs/lessons/flashing-heart/challenges.md @@ -25,8 +25,6 @@ basic.forever(() => { ### Challenge 1 -### @video td/videos/flashing-heart-1 - Let's plot a different image. Let's display a broken heart! To do this, you need to add a block between the last line and the end loop. Add a `show LEDs` block and then add a `pause` of 500 milliseconds. @@ -60,8 +58,6 @@ basic.forever(() => { ### Challenge 2 -### @video td/videos/flashing-heart-2 - Now let's alternate flashing the heart and the broken heart. To do this, we need to add a `clear screen` block and then add a `pause` block of 500 milliseconds under the new code we added in Challenge 1. diff --git a/docs/lessons/game-counter.md b/docs/lessons/game-counter.md index 29ea361a..04f6939d 100644 --- a/docs/lessons/game-counter.md +++ b/docs/lessons/game-counter.md @@ -2,8 +2,6 @@ Learn how to create a counter with with on button pressed. -### @video td/videos/counter-0 - ## Topic Game Library diff --git a/docs/lessons/game-counter/activity.md b/docs/lessons/game-counter/activity.md index 49305571..0c44cef8 100644 --- a/docs/lessons/game-counter/activity.md +++ b/docs/lessons/game-counter/activity.md @@ -1,13 +1,5 @@ # game counter activity -Turn an LED on and off with forever loop - -### ~avatar avatar - -### @video td/videos/counter-0 - -### ~ - Have you ever tried to create a game counter? The concept is fairly simply: increase the game `score` with `on button pressed` . Let's start by adding `on button (A) pressed` will run each time the user presses A. Let's add a line of code that increments `score` by `1`. diff --git a/docs/lessons/game-counter/challenges.md b/docs/lessons/game-counter/challenges.md index b472721d..25786cf4 100644 --- a/docs/lessons/game-counter/challenges.md +++ b/docs/lessons/game-counter/challenges.md @@ -15,8 +15,6 @@ input.onButtonPressed(Button.A, () => { ### Challenge 1 -### @video td/videos/counter-1-2 - Let's add the code to `score` when `B` is pressed. Add an event handler with `on button (B) pressed` then add the code to `score`. diff --git a/docs/lessons/guess-the-number.md b/docs/lessons/guess-the-number.md index 7b825d5a..37beeb7a 100644 --- a/docs/lessons/guess-the-number.md +++ b/docs/lessons/guess-the-number.md @@ -2,8 +2,6 @@ Learn to create a random number with input from button A. -### @video td/videos/guess-the-number-0 - ## Topic Math - Pick Random diff --git a/docs/lessons/guess-the-number/activity.md b/docs/lessons/guess-the-number/activity.md index d6846948..f6569481 100644 --- a/docs/lessons/guess-the-number/activity.md +++ b/docs/lessons/guess-the-number/activity.md @@ -4,8 +4,6 @@ Guess the number with math random. ### ~avatar avatar -### @video td/videos/guess-the-number-0 - Welcome! This tutorial will help you create a guess the number game! Let's get started! ### ~ diff --git a/docs/lessons/guess-the-number/challenges.md b/docs/lessons/guess-the-number/challenges.md index 3c6ec6af..8f466d53 100644 --- a/docs/lessons/guess-the-number/challenges.md +++ b/docs/lessons/guess-the-number/challenges.md @@ -15,8 +15,6 @@ input.onButtonPressed(Button.A, () => { ### Challenge 1 -### @video td/videos/guess-the-number-2 - When button `B` is pressed, we want to clear the screen. This will make it so users can play your game over and over again! Add an event handler to handle this case. ```blocks diff --git a/docs/lessons/guess-the-number/tutorial.md b/docs/lessons/guess-the-number/tutorial.md index 3994e00d..b9202c81 100644 --- a/docs/lessons/guess-the-number/tutorial.md +++ b/docs/lessons/guess-the-number/tutorial.md @@ -2,8 +2,6 @@ ### ~avatar avatar -### @video td/videos/guess-the-number-0 - This tutorial will help you create a guess the number game! Let's get started! ### ~ diff --git a/docs/lessons/looper.md b/docs/lessons/looper.md index 95ae0284..6785a183 100644 --- a/docs/lessons/looper.md +++ b/docs/lessons/looper.md @@ -2,8 +2,6 @@ Learn to control blinking LEDs. -### @video td/videos/looper-0 - ## Topic For Loop diff --git a/docs/lessons/looper/activity.md b/docs/lessons/looper/activity.md index eb973f8f..47bc47d6 100644 --- a/docs/lessons/looper/activity.md +++ b/docs/lessons/looper/activity.md @@ -1,13 +1,5 @@ # looper blocks activity -Display a series of numbers with a for loop. - -### ~avatar avatar - -### @video td/videos/looper-0 - -### ~ - Welcome! This activity will teach how to display a series of numbers for a for loop. Let's get started! Let's create a for loop where `0` is the loop's starting value, `i` is the index variable, and `5` is the ending value. The index variable `i` starts at 0 and increases by 1 each time through the loop. The loop ends when `i = 5`. diff --git a/docs/lessons/looper/challenges.md b/docs/lessons/looper/challenges.md index 7559e2d9..5bf0c3e0 100644 --- a/docs/lessons/looper/challenges.md +++ b/docs/lessons/looper/challenges.md @@ -20,8 +20,6 @@ for (let i = 0; i < 6; i++) { ### Challenge 1 -### @video td/videos/looper-1 - What if we want to count up to lucky number 7 instead? Let's do that by changing the ending value to `7` instead of `5`. @@ -37,8 +35,6 @@ for (let i = 0; i < 8; i++) { ### Challenge 2 -### @video td/videos/looper-2 - What about 9? Let's do that by changing the ending value to `9`. ```blocks @@ -55,8 +51,6 @@ for (let i = 0; i < 10; i++) { ### Challenge 3 -### @video td/videos/looper-3 - Now let's start counting from `3` instead! Our for loop will always start at `0` so we simply add `3` to the `i` variable when passing it to `show number`. ```blocks @@ -72,8 +66,6 @@ Run it on the simulator! ### Challenge 4 -### @video td/videos/looper-4 - Now, let's **count down from 9**. Change the line `show number(i + 2, 150)` to `show number(9 - i, 150)`. ```blocks diff --git a/docs/lessons/love-meter.md b/docs/lessons/love-meter.md index c24a770d..822b4205 100644 --- a/docs/lessons/love-meter.md +++ b/docs/lessons/love-meter.md @@ -1,8 +1,6 @@ # love meter blocks lesson -create a love meter with the BBC micro:bit. - -### @video td/videos/love-meter-0 +Create a love meter with the BBC micro:bit. ## Topic diff --git a/docs/lessons/love-meter/activity.md b/docs/lessons/love-meter/activity.md index b6704b21..687592a7 100644 --- a/docs/lessons/love-meter/activity.md +++ b/docs/lessons/love-meter/activity.md @@ -4,8 +4,6 @@ Create a love meter with the micro:bit ### ~avatar avatar -### @video td/videos/love-meter-0 - Welcome! This activity will help you create a love meter with the micro:bit. Let's get started! ### ~ diff --git a/docs/lessons/love-meter/challenges.md b/docs/lessons/love-meter/challenges.md index f2a4d7c0..ed3b3b73 100644 --- a/docs/lessons/love-meter/challenges.md +++ b/docs/lessons/love-meter/challenges.md @@ -45,8 +45,6 @@ input.onPinPressed(TouchPin.P0, () => { ### Challenge 3 -### @video td/videos/love-meter-3 - **If** the rating is between 4 and 7, display the text "MEDIOCRE!" **else** display the text "MATCHED!" ```blocks diff --git a/docs/lessons/lucky-7.md b/docs/lessons/lucky-7.md index 83074c6c..b670450e 100644 --- a/docs/lessons/lucky-7.md +++ b/docs/lessons/lucky-7.md @@ -1,8 +1,6 @@ # lucky 7 blocks lesson -show a number on the LED screen. - -### @video td/videos/lucky-7-0 +Show a number on the LED screen. ## Topic diff --git a/docs/lessons/lucky-7/activity.md b/docs/lessons/lucky-7/activity.md index f172296e..373f7c25 100644 --- a/docs/lessons/lucky-7/activity.md +++ b/docs/lessons/lucky-7/activity.md @@ -4,8 +4,6 @@ Show a number on the LED screen. ### ~avatar avatar -### @video td/videos/lucky-7-0 - Let's learn how to show the lucky number 7 on the LED screen. ### ~ diff --git a/docs/lessons/lucky-7/challenges.md b/docs/lessons/lucky-7/challenges.md index 2393c025..5c02261e 100644 --- a/docs/lessons/lucky-7/challenges.md +++ b/docs/lessons/lucky-7/challenges.md @@ -21,8 +21,6 @@ basic.pause(500) ### Challenge 2 -### @video td/videos/lucky-7-1-2 - What about other multiples of 7? Let's display the next multiple of 7 on the screen! ```blocks diff --git a/docs/lessons/magic-logo.md b/docs/lessons/magic-logo.md index 9100e302..999bd90a 100644 --- a/docs/lessons/magic-logo.md +++ b/docs/lessons/magic-logo.md @@ -2,7 +2,7 @@ show an image that points up when the logo is up. -### @video td/videos/magic-logo-0 + ## Topic diff --git a/docs/lessons/magic-logo/activity.md b/docs/lessons/magic-logo/activity.md index 005745f3..6a0da659 100644 --- a/docs/lessons/magic-logo/activity.md +++ b/docs/lessons/magic-logo/activity.md @@ -4,8 +4,6 @@ Show an image that points up when the logo is up. ### ~avatar avatar -### @video td/videos/magic-logo-0 - Welcome! This tutorial will help you display an arrow pointing toward the logo! Let's get started. ### ~ diff --git a/docs/lessons/magic-logo/challenges.md b/docs/lessons/magic-logo/challenges.md index dff322f0..131f0726 100644 --- a/docs/lessons/magic-logo/challenges.md +++ b/docs/lessons/magic-logo/challenges.md @@ -24,8 +24,6 @@ input.onLogoUp(() => { How about when the logo is down? We should display an arrow pointing downward! -### @video td/videos/magic-logo-1-2 - ```blocks input.onLogoUp(() => { basic.showLeds(` diff --git a/docs/lessons/night-light.md b/docs/lessons/night-light.md index 556cb205..9ee37f63 100644 --- a/docs/lessons/night-light.md +++ b/docs/lessons/night-light.md @@ -2,8 +2,6 @@ change the brightness of the BBC micro:bit. -### @video td/videos/night-light-0 - ## Topic Set Brightness diff --git a/docs/lessons/night-light/activity.md b/docs/lessons/night-light/activity.md index 30f049ae..96422b32 100644 --- a/docs/lessons/night-light/activity.md +++ b/docs/lessons/night-light/activity.md @@ -4,8 +4,6 @@ Change the brightness of the micro:bit. ### ~avatar avatar -### @video td/videos/night-light-0 - Welcome! This tutorial will teach you how to change the brightness of the micro:bit. Let's get started! ### ~ diff --git a/docs/lessons/night-light/challenges.md b/docs/lessons/night-light/challenges.md index 3187a914..c12fbe86 100644 --- a/docs/lessons/night-light/challenges.md +++ b/docs/lessons/night-light/challenges.md @@ -23,7 +23,7 @@ input.onButtonPressed(Button.A, () => { ``` ### Challenge 1 -### @video td/videos/night-light-2 + What if we want to turn off all the LEDs? Let's do this by setting the brightness to `0` when button `B` is pressed. Add an event handler with `on button pressed(B)` add `set brightness(0)` to turn off the LEDs. diff --git a/docs/lessons/offset-image/activity.md b/docs/lessons/offset-image/activity.md index 32a04179..de48f831 100644 --- a/docs/lessons/offset-image/activity.md +++ b/docs/lessons/offset-image/activity.md @@ -55,7 +55,7 @@ input.onButtonPressed(Button.B, () => { ### Challenge 2 -### @video td/videos/offset-image-2 + Now we want to make sure that the button does not go off the screen to the right. Add a new line that checks to see if offset = 5 after button `A` is pressed. diff --git a/docs/lessons/rock-paper-scissors.md b/docs/lessons/rock-paper-scissors.md index c3f8e03f..97ba0239 100644 --- a/docs/lessons/rock-paper-scissors.md +++ b/docs/lessons/rock-paper-scissors.md @@ -2,7 +2,7 @@ a game against the BBC micro:bit. -### @video td/videos/rock-paper-scissors-0 + ## Topic diff --git a/docs/lessons/rock-paper-scissors/activity.md b/docs/lessons/rock-paper-scissors/activity.md index 6e22c58e..d73ebe18 100644 --- a/docs/lessons/rock-paper-scissors/activity.md +++ b/docs/lessons/rock-paper-scissors/activity.md @@ -4,7 +4,7 @@ A classic game against the micro:bit. ### ~avatar avatar -### @video td/videos/rock-paper-scissors-0 + Welcome! This tutorial will help you create a game of rock paper scissors with the micro:bit. Let's get started! diff --git a/docs/lessons/rotation-animation/challenges.md b/docs/lessons/rotation-animation/challenges.md index 7a8eec24..5f6eab4e 100644 --- a/docs/lessons/rotation-animation/challenges.md +++ b/docs/lessons/rotation-animation/challenges.md @@ -93,7 +93,7 @@ input.onButtonPressed(Button.A, () => { ### Challenge 2 -### @video td/videos/rotation-animation-1-and-2 + Now that we have the on button pressed condition, let's make the animation stop rotating by setting the rotating global variable to false when button `A` is pressed. diff --git a/docs/lessons/screen-wipe.md b/docs/lessons/screen-wipe.md index 7e847bcc..02905d16 100644 --- a/docs/lessons/screen-wipe.md +++ b/docs/lessons/screen-wipe.md @@ -2,7 +2,7 @@ clear the screen by pressing button "A". -### @video td/videos/screen-wipe-0 + ## Topic diff --git a/docs/lessons/screen-wipe/activity.md b/docs/lessons/screen-wipe/activity.md index 9eea22ee..28a53a73 100644 --- a/docs/lessons/screen-wipe/activity.md +++ b/docs/lessons/screen-wipe/activity.md @@ -4,7 +4,7 @@ Clear the screen by pressing buttons on the micro:bit ### ~avatar avatar -### @video td/videos/screen-wipe-0 + This activity will teach how to clear the screen by pressing button A on the micro:bit. diff --git a/docs/lessons/screen-wipe/challenges.md b/docs/lessons/screen-wipe/challenges.md index 80a4f291..a00c5b47 100644 --- a/docs/lessons/screen-wipe/challenges.md +++ b/docs/lessons/screen-wipe/challenges.md @@ -85,7 +85,7 @@ input.onButtonPressed(Button.B, () => { ### Challenge 2 -### @video td/videos/screen-wipe-2 + Replay the animation when the "B" button is pressed placing the `show LEDs` block on the canvas. diff --git a/docs/lessons/smiley.md b/docs/lessons/smiley.md index 981f322a..f5b611b2 100644 --- a/docs/lessons/smiley.md +++ b/docs/lessons/smiley.md @@ -2,7 +2,7 @@ design a blinking image lesson #docs -### @video td/videos/smiley-0 + ## Topic diff --git a/docs/lessons/smiley/activity.md b/docs/lessons/smiley/activity.md index c1c43e7b..72db85eb 100644 --- a/docs/lessons/smiley/activity.md +++ b/docs/lessons/smiley/activity.md @@ -4,7 +4,7 @@ Learn to design a blinking image. ### ~avatar avatar -### @video td/videos/smiley-0 + Welcome! This tutorial will help you make a smiley face blink. Let's get started! diff --git a/docs/lessons/smiley/challenges.md b/docs/lessons/smiley/challenges.md index 37e0db18..9caf3479 100644 --- a/docs/lessons/smiley/challenges.md +++ b/docs/lessons/smiley/challenges.md @@ -54,7 +54,7 @@ input.onButtonPressed(Button.A, () => { ### Challenge 2 -### @video td/videos/smiley-2 + Now, we want to show a frowny face when this button is pressed. Let's show the LEDs. diff --git a/docs/lessons/snowflake-fall.md b/docs/lessons/snowflake-fall.md index c25c7d59..07969418 100644 --- a/docs/lessons/snowflake-fall.md +++ b/docs/lessons/snowflake-fall.md @@ -2,7 +2,7 @@ design a blinking rectangle animation. -### @video td/videos/snowflake-fall-0 + ## Topic diff --git a/docs/lessons/snowflake-fall/activity.md b/docs/lessons/snowflake-fall/activity.md index bee88370..f5cbc842 100644 --- a/docs/lessons/snowflake-fall/activity.md +++ b/docs/lessons/snowflake-fall/activity.md @@ -4,7 +4,7 @@ design a blinking rectangle animation. ### ~avatar avatar -### @video td/videos/snowflake-fall-0 + Welcome! This tutorial will teach how design a **snowfall animation**. Let's get started! diff --git a/docs/lessons/snowflake-fall/challenges.md b/docs/lessons/snowflake-fall/challenges.md index 99d3efe3..833e1a18 100644 --- a/docs/lessons/snowflake-fall/challenges.md +++ b/docs/lessons/snowflake-fall/challenges.md @@ -27,7 +27,7 @@ basic.forever(() => { ### Challenge 1 -### @video td/videos/snowflake-fall-1 + To finalize our snowflake fall, let's add a different snowflake pattern. diff --git a/docs/lessons/speed-button.md b/docs/lessons/speed-button.md index 638c09bb..c3304b83 100644 --- a/docs/lessons/speed-button.md +++ b/docs/lessons/speed-button.md @@ -2,7 +2,7 @@ code a speed game by declaring Booleans on the BBC micro:bit. -### @video td/videos/speed-button-3 + ## Topic diff --git a/docs/lessons/speed-button/activity.md b/docs/lessons/speed-button/activity.md index 8d87d6f5..810f20f7 100644 --- a/docs/lessons/speed-button/activity.md +++ b/docs/lessons/speed-button/activity.md @@ -63,7 +63,7 @@ input.onButtonPressed(Button.A, () => { ### Challenge 3 -### @video td/videos/speed-button-3 + Now let's display if the user won or lost. To do so, we need to check the status of `fastPress` when the game is finished, and then show the correct message. @@ -91,7 +91,7 @@ input.onButtonPressed(Button.A, () => { ### Challenge 4 -### @video td/videos/speed-button-4 + Modify the code to change the difficulty level. Increasing the time will make it easier, while decreasing the time will make it harder. For example, changing the 5000 milliseconds to 6000 milliseconds will make the difficulty easier. diff --git a/docs/lessons/spinner.md b/docs/lessons/spinner.md index 528d85ee..0ded84bc 100644 --- a/docs/lessons/spinner.md +++ b/docs/lessons/spinner.md @@ -2,7 +2,7 @@ a spin the BBC micro:bit game with the input on shake. -### @video td/videos/spinner-0 + ## Topic diff --git a/docs/lessons/spinner/activity.md b/docs/lessons/spinner/activity.md index 7626c77c..425612e4 100644 --- a/docs/lessons/spinner/activity.md +++ b/docs/lessons/spinner/activity.md @@ -4,7 +4,7 @@ Create an arrow that randomly points to a player. ### ~avatar avatar -### @video td/videos/spinner-0 + ### ~ diff --git a/docs/lessons/strobe-light.md b/docs/lessons/strobe-light.md index 04e8e35a..117d7182 100644 --- a/docs/lessons/strobe-light.md +++ b/docs/lessons/strobe-light.md @@ -2,7 +2,7 @@ Learn how to create a blinking LED script. -### @video td/videos/strobe-light-0 + ## Topic diff --git a/docs/lessons/strobe-light/activity.md b/docs/lessons/strobe-light/activity.md index 27f3e52e..2d70ba92 100644 --- a/docs/lessons/strobe-light/activity.md +++ b/docs/lessons/strobe-light/activity.md @@ -4,7 +4,7 @@ Develop shapes with a for loop. ### ~avatar avatar -### @video td/videos/strobe-light-0 + Welcome! This guided tutorial will teach how to develop shapes with a for loop. Let's get started! diff --git a/docs/lessons/strobe-light/challenges.md b/docs/lessons/strobe-light/challenges.md index 3afd932a..75d77a32 100644 --- a/docs/lessons/strobe-light/challenges.md +++ b/docs/lessons/strobe-light/challenges.md @@ -19,7 +19,7 @@ for (let i = 0; i < 5; i++) { ### Challenge 1 -### @video td/videos/strobe-light-1 + Make the LEDs light up faster by changing the **pause** from 200 to 100 milliseconds: @@ -36,7 +36,7 @@ for (let i = 0; i < 5; i++) { ### Challenge 2 -### @video td/videos/strobe-light-2 + Make the board light up by rows instead of by columns by swapping the `i` and `j` variables in `plot(i, j)`. @@ -53,7 +53,7 @@ for (let i = 0; i < 5; i++) { ### Challenge 3 -### @video td/videos/strobe-light-ultimate + Now that all the LEDs are lit up, let's make them turn off by reversing the strobe light pattern! You can use `unplot` to turn off a single LED. diff --git a/docs/lessons/teach.md b/docs/lessons/teach.md index 6cf87ed7..6b9d24ba 100644 --- a/docs/lessons/teach.md +++ b/docs/lessons/teach.md @@ -22,7 +22,7 @@ The lesson plan maps to the Progressions Pathways, Computing Curriculum, and Qui Expand your knowledge of programming with lots of great step-by-step activities. All the lessons come with instructions that will drive the students to a complete, functional code. These activities are very directive to make sure that students keep progressing. When the activities are over, additional challenges are given to advance code through printed instructions. An activity contains supporting videos as shown with the [blink activity](/lessons/blink/activity). -### @video td/videos/blink-0 + 3) Quiz diff --git a/docs/lessons/truth-or-dare.md b/docs/lessons/truth-or-dare.md index 88f728ea..25899676 100644 --- a/docs/lessons/truth-or-dare.md +++ b/docs/lessons/truth-or-dare.md @@ -2,7 +2,7 @@ create a love meter with the BBC micro:bit. -### @video td/videos/truth-or-dare-0 + ## Topic diff --git a/docs/lessons/truth-or-dare/activity.md b/docs/lessons/truth-or-dare/activity.md index 09b9bfb6..fba91d63 100644 --- a/docs/lessons/truth-or-dare/activity.md +++ b/docs/lessons/truth-or-dare/activity.md @@ -4,7 +4,7 @@ A multi-player game that forces each player to reveal a secret or something funn ### ~avatar avatar -### @video td/videos/truth-or-dare-0 + Welcome! This tutorial will teach how to program a game of truth or dare on the micro:bit. Let's get started! diff --git a/docs/lessons/truth-or-dare/tutorial.md b/docs/lessons/truth-or-dare/tutorial.md index ad2d993f..d58ea784 100644 --- a/docs/lessons/truth-or-dare/tutorial.md +++ b/docs/lessons/truth-or-dare/tutorial.md @@ -2,7 +2,7 @@ ### ~avatar avatar -### @video td/videos/truth-or-dare-0 + The *Truth or dare!* game works as follows: a player spins the BBC micro:bit on the table. When the micro:bit stops spinning, the player pointed by the arrow (displayed on screen) must press the button "A" diff --git a/docs/lessons/zoomer.md b/docs/lessons/zoomer.md index 3c592b37..a839b6a6 100644 --- a/docs/lessons/zoomer.md +++ b/docs/lessons/zoomer.md @@ -2,7 +2,7 @@ measure the acceleration on the micro:bit in the "z" direction. -### @video td/videos/zoomer-0 + ## Topic diff --git a/docs/lessons/zoomer/activity.md b/docs/lessons/zoomer/activity.md index ddfb663e..ad595a38 100644 --- a/docs/lessons/zoomer/activity.md +++ b/docs/lessons/zoomer/activity.md @@ -4,7 +4,7 @@ Measure the acceleration on the micro:bit in the "z" direction. ### ~avatar avatar -### @video td/videos/zoomer-0 + ### ~ diff --git a/docs/lessons/zoomer/challenges.md b/docs/lessons/zoomer/challenges.md index 6698ffb4..aa07bd0a 100644 --- a/docs/lessons/zoomer/challenges.md +++ b/docs/lessons/zoomer/challenges.md @@ -14,7 +14,7 @@ basic.forever(() => { ``` ### Challenge 1 -### @video td/videos/zoomer-2 + We'll modify the code to display the `x` acceleration if the `A` button is pressed. For that, we need to store `acceleration (x)` in a new variable `ax` and use a `button (A) is pressed` to detect if the button is pressed. diff --git a/olddocs/js/lessons/bounce-image.md b/olddocs/js/lessons/bounce-image.md index bc953445..3a772f2f 100644 --- a/olddocs/js/lessons/bounce-image.md +++ b/olddocs/js/lessons/bounce-image.md @@ -2,8 +2,6 @@ scroll an image across the screen. -### @video td/videos/bounce-image-0 - ## Topic Basic- Show Animation diff --git a/olddocs/js/lessons/bounce-image/challenges.md b/olddocs/js/lessons/bounce-image/challenges.md index 5c3b6ea9..5db6b044 100644 --- a/olddocs/js/lessons/bounce-image/challenges.md +++ b/olddocs/js/lessons/bounce-image/challenges.md @@ -24,8 +24,6 @@ basic.forever(() => { ### Challenge 1 -### @video td/videos/bounce-image-1 - Now, let's add frames to reverse the animation so it looks like the bar is bouncing off the right edge of the display. ``` @@ -60,9 +58,7 @@ input.onGesture(Gesture.Shake, () => { }) // *** ``` -**Challenge 3** - -### @video td/videos/bounce-image-2-3 +### Challenge 3 When the BBC micro:bit is shaken we want to show a new animation. Here is an example, but you can create your own. Be creative! diff --git a/olddocs/js/lessons/digital-pet.md b/olddocs/js/lessons/digital-pet.md index 19213a40..a31255c4 100644 --- a/olddocs/js/lessons/digital-pet.md +++ b/olddocs/js/lessons/digital-pet.md @@ -2,8 +2,6 @@ a display of pet images for the BBC micro:bit. -### @video td/videos/digital-pet-0 - ## Topic Functions diff --git a/olddocs/js/lessons/digital-pet/challenges.md b/olddocs/js/lessons/digital-pet/challenges.md index d81044d0..8b87cacc 100644 --- a/olddocs/js/lessons/digital-pet/challenges.md +++ b/olddocs/js/lessons/digital-pet/challenges.md @@ -41,8 +41,6 @@ basic.forever(() => { ### Challenge 2 -### @video td/videos/digital-pet-2 - Now we want to show your eating pet! Let's create a function called `set eat` that will do create an image. Store that image in a variable and then show it. ``` @@ -76,8 +74,6 @@ basic.forever(() => { ### Challenge 3 -### @video td/videos/digital-pet-3 - Have your pet tell you when it is going to sleep! Do this inside of the **IF** statement that checks if button `A` is pressed before you call the function `set sleep`. ``` @@ -97,8 +93,6 @@ basic.forever(() => { ### Challenge 4 -### @video td/videos/digital-pet-4 - Now, how about we keep track of how many times our pet eats? Add a global variable called `feed` that keeps track of how many times you feed your pet. If button `B` is pressed, increment `feed` by one. Add a condition `on shake` to check your total. ``` diff --git a/olddocs/js/lessons/flipping-bird/challenges.md b/olddocs/js/lessons/flipping-bird/challenges.md index 9735281e..0108fec6 100644 --- a/olddocs/js/lessons/flipping-bird/challenges.md +++ b/olddocs/js/lessons/flipping-bird/challenges.md @@ -50,8 +50,6 @@ input.onGesture(Gesture.Shake, () => { ### Challenge 2 -### @video td/videos/flipping-bird-2 - Inside of that `if` statement you created in challenge 1, add `basic->plot image()` and display an upside down flying bird. ``` diff --git a/olddocs/js/lessons/glowing-mountain/challenges.md b/olddocs/js/lessons/glowing-mountain/challenges.md index 1d51e651..da15ec76 100644 --- a/olddocs/js/lessons/glowing-mountain/challenges.md +++ b/olddocs/js/lessons/glowing-mountain/challenges.md @@ -4,8 +4,6 @@ These challenges will help you display a glowing image that fades in and out at **Challenge 0** -### @video vimeo/134649269 - [This guided tutorial](https://test.microbit.co.uk/td/lessons/glowing-mountain/tutorial) will teach you how to create a mountain that fades out. ``` @@ -37,9 +35,7 @@ basic.pause(1000) // *** * Run the code to see if it works as expected. -**Challenge 2** - -### @video vimeo/134674595 +### Challenge 2 After the pause, let's add `led->fade in(2000)` so that we can create a glowing effect. diff --git a/olddocs/js/lessons/glowing-sword.md b/olddocs/js/lessons/glowing-sword.md index 760bdd5f..bae73c16 100644 --- a/olddocs/js/lessons/glowing-sword.md +++ b/olddocs/js/lessons/glowing-sword.md @@ -2,8 +2,6 @@ make a glowing sword. -### @video td/videos/glowing-sword-0 - ## Topic Fade Out From 8af6d640d39b9a071b47ddf2ec923a59a5632ca5 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Thu, 26 May 2016 16:18:33 -0700 Subject: [PATCH 097/135] Exhaustive rewrite. Did not change code much. --- docs/projects/rock-paper-scissors.md | 162 +++++++++++++++++---------- 1 file changed, 103 insertions(+), 59 deletions(-) diff --git a/docs/projects/rock-paper-scissors.md b/docs/projects/rock-paper-scissors.md index 922ce503..9c4dc76a 100644 --- a/docs/projects/rock-paper-scissors.md +++ b/docs/projects/rock-paper-scissors.md @@ -4,16 +4,20 @@ ### @video td/videos/rock-paper-scissors-0 -In this project, you will build a rock-paper-scissor game with the BBC micro:bit +In this project, you will build a Rock Paper Scissors game with the BBC micro:bit. +You can play the game with a friend who has it on a micro:bit. +You can also play it with friends who are just using their hands. + ### ~ ## Materials needed -* your BBC micro:bit, that's it! +* Your BBC micro:bit -- that's it! -## 1 +## Step 1: Getting started -We want the micro:bit to choose rock, paper, or scissors when it is shaken. Let's begin by creating an on shake condition so the micro:bit will run code when it is shaken. +We want the micro:bit to choose rock, paper, or scissors when you shake it. +Try creating an ``on shake`` block so when you shake the micro:bit, it will run part of a program. ```blocks input.onGesture(Gesture.Shake, () => { @@ -21,50 +25,41 @@ input.onGesture(Gesture.Shake, () => { }) ``` -Next, create a variable and store pick random number from 0 to 2. On shake, a number will be randomly picked from 0-2. We will randomly display an image based on the random number returned. +Next, when you shake the micro:bit, it should pick a random number from `0` to `2` +and store it in the variable. + +Add a ``set`` block with a variable. Then add a ``pick random`` block, +and store the random number in the variable, +like this: ```blocks input.onGesture(Gesture.Shake, () => { - let img = Math.random(3) + let weapon = Math.random(3) }) ``` -The micro:bit will look like it's showing 1 frame of the image by displaying the whole image when pick random is equal to 0. We can help the micro:bit randomly decide which image to use by pick random. -The micro:bit will randomly pick the image to display with show LEDs and the ``pick random`` block. - -```blocks -input.onGesture(Gesture.Shake, () => { - let img = Math.random(3) - if (img == 2) { - basic.showLeds(` - # # # # # - # . . . # - # . . . # - # . . . # - # # # # # - `) - - } -}) -``` - -## 2 - -The micro:bit will look like it's showing 1 frame of the image by displaying the whole image when pick random is equal to 1. -We can help the micro:bit randomly decide which image to use by pick random. -The micro:bit will randomly pick the image to display with show LEDs and the pick random function. - -### ~avatar avatar - -Click on the blue gearwheel to open the ``if`` editor. Drag and drop the ``else if`` block in the ``if`` block to add it. - +### ~hint +No one can predict random numbers. That's what makes them great for Rock Paper Scissors! ### ~ +Each possible number these blocks can make (`0`, `1`, or `2`) means a different picture. +We will show the right picture for that number on the LED screen. + + +## Step 2: Picking paper + +Put an ``if`` block after the ``let`` block that checks whether +`weapon` is `0`. Make sure the ``if`` block has an ``else if`` part +and an ``else`` part. + +Next, add a ``show leds`` block that shows a +picture of a piece of paper: + ```blocks input.onGesture(Gesture.Shake, () => { - let img = Math.random(3) - if (img == 0) { + let weapon = Math.random(3) + if (weapon == 0) { basic.showLeds(` # # # # # # . . . # @@ -72,28 +67,26 @@ input.onGesture(Gesture.Shake, () => { # . . . # # # # # # `) + } else if (false) { + + } else { - } else if (img == 1) { - basic.showLeds(` - . . . . . - . # # # . - . # # # . - . # # # . - . . . . . - `) } }) ``` -## 3 +## Step 3: A random rock -The micro:bit will look like it's showing 1 frame of the image by displaying the whole image when pick random is not equal to 0 and not equal to 1. -We can help the micro:bit randomly decide which image to use by pick random. The micro:bit will randomly pick the image to display with show LEDs and the pick random function. +Now we are going to add a new picture for the micro:bit to show +when another random number comes up. + +Make the ``else if`` part check if the variable `weapon` is `1`. +Then add a ``show leds`` block with a picture of a rock. ```blocks input.onGesture(Gesture.Shake, () => { - let img = Math.random(3) - if (img == 0) { + let weapon = Math.random(3) + if (weapon == 0) { basic.showLeds(` # # # # # # . . . # @@ -102,7 +95,37 @@ input.onGesture(Gesture.Shake, () => { # # # # # `) - } else if (img == 1) { + } else if (weapon == 1) { + basic.showLeds(` + . . . . . + . # # # . + . # # # . + . # # # . + . . . . . + `) + } else { + + } +}) +``` + +## Step 4: Suddenly scissors + +Add a ``show leds`` block with a picture of scissors to the ``else`` part: + +```blocks +input.onGesture(Gesture.Shake, () => { + let weapon = Math.random(3) + if (weapon == 0) { + basic.showLeds(` + # # # # # + # . . . # + # . . . # + # . . . # + # # # # # + `) + + } else if (weapon == 1) { basic.showLeds(` . . . . . . # # # . @@ -121,13 +144,27 @@ input.onGesture(Gesture.Shake, () => { } }) + + ``` -Your game is ready! +### ~hint -## 4 +You don't need to check if `weapon` is `2` because `2` is the only number left out of `0`, `1`, and `2`. +That's why you can use an ``else`` instead of an ``else if``. -When the button ``A`` is pressed, increment the score by 1. You can select ``Game`` drawer then add ``change score by 1``. +### ~ + +Your game is ready! Have fun! + +## Step 5: Are you the greatest? + +Here is a way you can make your Rock Paper Scissors game better. +When button ``A`` is pressed, +the micro:bit will add `1` to your score. + +Open the ``Game`` drawer, and then add the block ``change score by 1`` to your program, +like this: ```blocks input.onButtonPressed(Button.A, () => { @@ -136,9 +173,9 @@ input.onButtonPressed(Button.A, () => { ``` -## 5 +## Step 6: Prove you're the greatest! -After incrementing the score, display the total number of wins you have. +After your micro:bit can add `1` to the score, show how many wins you have. ```blocks input.onButtonPressed(Button.A, () => { @@ -147,10 +184,13 @@ input.onButtonPressed(Button.A, () => { basic.showNumber(game.score()) }) ``` -## 6 +## Step 7: Staying honest -You have successfully tracked and displayed the number of wins on the micro:bit! However, what about losses? -Use the Game drawer to change score by -1 when button `B` is pressed. Here are all the blocks you will need: +Success! Your micro:bit can track wins! +But what about losses? +Use the ``Game`` drawer to subtract `1` from your score when you press button `B`. + +Here are all the blocks you will need: ```shuffle input.onButtonPressed(Button.B, () => { @@ -160,3 +200,7 @@ input.onButtonPressed(Button.B, () => { }) ``` +## Step 8: Hacking Rock Paper Scissors + +How else can you make your game better? +Ever hear of [Rock Paper Scissors Spock Lizard](https://en.wikipedia.org/wiki/Rock-paper-scissors#Additional_weapons)? From 433b2bb08d35e573f00b0929bbfd95f9cd4fc4d4 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 19:30:43 -0700 Subject: [PATCH 098/135] Bump pxt-core to 0.2.145 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1e0a97ae..5b45e345 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.143" + "pxt-core": "0.2.145" } } From 304ef89a1d6385864a5862820d989c54f8f0f82c Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 19:30:45 -0700 Subject: [PATCH 099/135] 0.2.134 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5b45e345..ee693350 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.133", + "version": "0.2.134", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 1a00fded98aa654b82cbd89c9ef9541b185daef4 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 19:33:26 -0700 Subject: [PATCH 100/135] final vidoe cleanup --- olddocs/js/lessons/glowing-sword/activity.md | 2 -- olddocs/js/lessons/glowing-sword/challenges.md | 2 -- olddocs/js/lessons/jailbreak.md | 4 +--- olddocs/js/lessons/line-of-fire.md | 4 +--- olddocs/js/lessons/logo-pointer/challenges.md | 8 ++------ olddocs/js/lessons/looper/challenges.md | 8 -------- olddocs/js/lessons/looper/lesson.md | 2 -- olddocs/js/lessons/minesweeper.md | 2 -- olddocs/js/lessons/on-shake/challenges.md | 2 -- olddocs/js/lessons/pong.md | 2 -- olddocs/js/lessons/pong/activity.md | 2 -- olddocs/js/lessons/rectangle-explosion/challenges.md | 6 ------ olddocs/js/lessons/screen-wipe/activity.md | 2 -- olddocs/js/lessons/screen-wipe/challenges.md | 2 -- olddocs/js/lessons/set-brightness/challenges.md | 4 ---- olddocs/js/lessons/timing-game.md | 2 -- olddocs/js/lessons/transformers.md | 2 -- olddocs/js/lessons/transformers/challenges.md | 2 -- olddocs/js/lessons/while-counting/challenges.md | 4 ---- olddocs/js/lessons/yes-no/challenges.md | 4 ---- 20 files changed, 4 insertions(+), 62 deletions(-) diff --git a/olddocs/js/lessons/glowing-sword/activity.md b/olddocs/js/lessons/glowing-sword/activity.md index d17c66ab..1f5bc850 100644 --- a/olddocs/js/lessons/glowing-sword/activity.md +++ b/olddocs/js/lessons/glowing-sword/activity.md @@ -4,8 +4,6 @@ Make glowing sword. ### ~avatar avatar -### @video td/videos/glowing-sword-0 - In this activity, we will learn how to fade in and out the screen to create a glowing animation. Let's get started! ### ~ diff --git a/olddocs/js/lessons/glowing-sword/challenges.md b/olddocs/js/lessons/glowing-sword/challenges.md index 6c2472ca..7fafb951 100644 --- a/olddocs/js/lessons/glowing-sword/challenges.md +++ b/olddocs/js/lessons/glowing-sword/challenges.md @@ -37,8 +37,6 @@ basic.pause(1000) // *** ### Challenge 2 -### @video td/videos/glowing-sword-2 - After the pause, let's add `led->fade in(2000)` so that we can create a glowing effect. ``` diff --git a/olddocs/js/lessons/jailbreak.md b/olddocs/js/lessons/jailbreak.md index 1ba45f2d..58040f0c 100644 --- a/olddocs/js/lessons/jailbreak.md +++ b/olddocs/js/lessons/jailbreak.md @@ -1,8 +1,6 @@ # jailbreak lesson -break out of a counting loop by pressing button "A". - -### @video td/videos/jailbreak-0 +Break out of a counting loop by pressing button "A". ## Topic diff --git a/olddocs/js/lessons/line-of-fire.md b/olddocs/js/lessons/line-of-fire.md index 730c5012..2eaa6eaa 100644 --- a/olddocs/js/lessons/line-of-fire.md +++ b/olddocs/js/lessons/line-of-fire.md @@ -1,8 +1,6 @@ # line of fire lesson -create a game that relies on precise instincts and timing reflexes #if #. - -### @video td/videos/timing-game-0 +Create a game that relies on precise instincts and timing reflexes #if #. ## Topic diff --git a/olddocs/js/lessons/logo-pointer/challenges.md b/olddocs/js/lessons/logo-pointer/challenges.md index e81c4602..2c3040dc 100644 --- a/olddocs/js/lessons/logo-pointer/challenges.md +++ b/olddocs/js/lessons/logo-pointer/challenges.md @@ -2,9 +2,7 @@ These challenges will help you show arrows that point which way the logo is pointing! #docs -**Challenge 0** - -### @video vimeo/134638098 +## Challenge 0 This [guided tutorial](/zysycw) will help you display an arrow pointing the direction the logo is oriented! @@ -42,9 +40,7 @@ input.onLogoDown(() => { }) // *** ``` -**Challenge 2** - -### @video vimeo/134639918 +## Challenge 2 Now we need to display the arrow! diff --git a/olddocs/js/lessons/looper/challenges.md b/olddocs/js/lessons/looper/challenges.md index b915deff..8836b5d4 100644 --- a/olddocs/js/lessons/looper/challenges.md +++ b/olddocs/js/lessons/looper/challenges.md @@ -19,8 +19,6 @@ for (let i = 0; i < 6; i++) { ### Challenge 1 -### @video td/videos/looper-1 - What if we want to count up to lucky number 7 instead? Let's do that by changing the ending value to `8` instead of `6`. ``` @@ -34,8 +32,6 @@ for (let i1 = 0; i1 < 8; i1++) { ### Challenge 2 -### @video td/videos/looper-2 - What about 9? Let's do that by changing the ending value to `10`. ``` @@ -49,8 +45,6 @@ for (let i2 = 0; i2 < 10; i2++) { ### Challenge 3 -### @video td/videos/looper-3 - Now let's start counting from `3` instead! Our for loop will always start at `0` so we simply add `3` to the `i` variable when passing it to `basic->show number`. ``` @@ -64,8 +58,6 @@ Run it on the simulator! ### Challenge 4 -### @video td/videos/looper-4 - Now, let's **count down from 9**. Change the line `basic->show number(i + 3, 150)` to `basic->show number(9 - i, 150)`. ``` diff --git a/olddocs/js/lessons/looper/lesson.md b/olddocs/js/lessons/looper/lesson.md index 6e99f25b..b9cb016c 100644 --- a/olddocs/js/lessons/looper/lesson.md +++ b/olddocs/js/lessons/looper/lesson.md @@ -2,8 +2,6 @@ Learn to control blinking LEDs. -### @video vimeo/134453504 - ## Topic For loop - Blinking LED diff --git a/olddocs/js/lessons/minesweeper.md b/olddocs/js/lessons/minesweeper.md index 2e8a6150..22df7175 100644 --- a/olddocs/js/lessons/minesweeper.md +++ b/olddocs/js/lessons/minesweeper.md @@ -2,8 +2,6 @@ A game that tests your memory for placing a LED mine then finding the hidden LED mine. -### @video td/videos/minesweeper-0 - ## Topic Global Variables diff --git a/olddocs/js/lessons/on-shake/challenges.md b/olddocs/js/lessons/on-shake/challenges.md index 30043a3e..868f510f 100644 --- a/olddocs/js/lessons/on-shake/challenges.md +++ b/olddocs/js/lessons/on-shake/challenges.md @@ -4,8 +4,6 @@ These challenges will allow you to create and display a flipping image of a bird ### Challenge 0 -### @video vimeo/134449611 - Greetings! This [guided tutorial](/lessons/flipping-bird/tutorial) will begin to show you how to flip a bird. ``` diff --git a/olddocs/js/lessons/pong.md b/olddocs/js/lessons/pong.md index 69af3a0b..95aec4c9 100644 --- a/olddocs/js/lessons/pong.md +++ b/olddocs/js/lessons/pong.md @@ -2,8 +2,6 @@ code your own game of Pong on the micro:bit. #. -### @video td/videos/pong-0 - ## Topic Functions diff --git a/olddocs/js/lessons/pong/activity.md b/olddocs/js/lessons/pong/activity.md index cce4f425..2f459fc6 100644 --- a/olddocs/js/lessons/pong/activity.md +++ b/olddocs/js/lessons/pong/activity.md @@ -4,8 +4,6 @@ Building a game of pong with sprites. ### ~avatar avatar -### @video td/videos/pong-0 - Welcome! This tutorial will teach you how to build a simple pong game using sprites. ### ~ diff --git a/olddocs/js/lessons/rectangle-explosion/challenges.md b/olddocs/js/lessons/rectangle-explosion/challenges.md index 3cb61522..d5f73b1d 100644 --- a/olddocs/js/lessons/rectangle-explosion/challenges.md +++ b/olddocs/js/lessons/rectangle-explosion/challenges.md @@ -4,8 +4,6 @@ These challenges will allow you to make an exploding rectangle. #docs **Challenge 0** -### @video vimeo/134649147 - This [guided tutorial](https://test.microbit.co.uk/td/lessons/rectangle-explosion/tutorial) will help you create a snowflake animation! ``` @@ -22,8 +20,6 @@ basic.forever(() => { **Challenge 1** -### @video vimeo/134649148 - Let's begin creating our falling effect by adding another snowflake with `show animation` that displays a different snowflake pattern after the first one. ``` @@ -47,8 +43,6 @@ basic.forever(() => { **Challenge 2** -### @video vimeo/134649149 - To finalize our snowflake fall, let's add a different snowflake pattern. ``` diff --git a/olddocs/js/lessons/screen-wipe/activity.md b/olddocs/js/lessons/screen-wipe/activity.md index 3f73bbdb..713886c7 100644 --- a/olddocs/js/lessons/screen-wipe/activity.md +++ b/olddocs/js/lessons/screen-wipe/activity.md @@ -4,8 +4,6 @@ Clear the screen by pressing buttons on the BBC micro:bit. ### ~avatar avatar -### @video td/videos/screen-wipe-0 - This activity will teach how to clear the screen by pressing button ``A`` on the BBC micro:bit. ### ~ diff --git a/olddocs/js/lessons/screen-wipe/challenges.md b/olddocs/js/lessons/screen-wipe/challenges.md index d2d643e0..1e7ba2c2 100644 --- a/olddocs/js/lessons/screen-wipe/challenges.md +++ b/olddocs/js/lessons/screen-wipe/challenges.md @@ -40,8 +40,6 @@ input.onButtonPressed(Button.B, () => { **Challenge 2** -### @video td/videos/screen-wipe-2 - Replay the animation when the "B" button is pressed by typing in `basic->show animation(..., 400)`. ``` diff --git a/olddocs/js/lessons/set-brightness/challenges.md b/olddocs/js/lessons/set-brightness/challenges.md index 8abaf14e..3f8597a8 100644 --- a/olddocs/js/lessons/set-brightness/challenges.md +++ b/olddocs/js/lessons/set-brightness/challenges.md @@ -4,8 +4,6 @@ These challenges will allow you to change the brightness of the micro:bit. docs **Challenge 0** -### @video vimeo/133782335 - [This tutorial](/lessons/set-brightness/tutorial) will show you how to set the brightness on the micro:bit. ``` @@ -18,8 +16,6 @@ input.onButtonPressed(Button.A, () => { **Challenge 1** -### @video vimeo/133782335 - What if we want to turn off all the LEDs? Let's do this by setting the brightness to `0` when button `B` is pressed. Add a condition for `input->on button pressed("B")`. ``` diff --git a/olddocs/js/lessons/timing-game.md b/olddocs/js/lessons/timing-game.md index aabfa45a..aa6a41a0 100644 --- a/olddocs/js/lessons/timing-game.md +++ b/olddocs/js/lessons/timing-game.md @@ -2,8 +2,6 @@ make a game to test hand-eye coordination. -### @video td/videos/timing-game-0 - Make a game to test hand-eye coordination * [tutorial](/lessons/timing-game/tutorial) diff --git a/olddocs/js/lessons/transformers.md b/olddocs/js/lessons/transformers.md index 86645eb9..7e82c8ab 100644 --- a/olddocs/js/lessons/transformers.md +++ b/olddocs/js/lessons/transformers.md @@ -2,8 +2,6 @@ use functions to return values. -### @video td/videos/transformers-0 - ## Topic Return diff --git a/olddocs/js/lessons/transformers/challenges.md b/olddocs/js/lessons/transformers/challenges.md index c1b9726f..7aa97d3d 100644 --- a/olddocs/js/lessons/transformers/challenges.md +++ b/olddocs/js/lessons/transformers/challenges.md @@ -34,8 +34,6 @@ export function square(n: number) : number { ### Challenge 2 -### @video td/videos/transformers-2 - Add a condition for when button `B` is pressed. We will use this condition in the last challenge. ``` diff --git a/olddocs/js/lessons/while-counting/challenges.md b/olddocs/js/lessons/while-counting/challenges.md index 5fce6712..92652f43 100644 --- a/olddocs/js/lessons/while-counting/challenges.md +++ b/olddocs/js/lessons/while-counting/challenges.md @@ -4,8 +4,6 @@ These challenges will teach you how to create a counter 10 to 1. #docs **Challenge 0** -### @video vimeo/134459911 - [This guided tutorial](/lessons/digi-yoyo/tutorial) will teach you how to make a counter from 0-9 using a while loop. ``` @@ -53,8 +51,6 @@ while (count > 0) { **Challenge 3** -### @video vimeo/134449661 - Now, we need `count` to decrease by one after the micro:bit has displayed the value of `count`. We can do this by adding this line: diff --git a/olddocs/js/lessons/yes-no/challenges.md b/olddocs/js/lessons/yes-no/challenges.md index 5b4a7467..9da5dd37 100644 --- a/olddocs/js/lessons/yes-no/challenges.md +++ b/olddocs/js/lessons/yes-no/challenges.md @@ -12,8 +12,6 @@ basic.showString("ASK ME A QUESTION", 150) **Challenge 1** -### @video vimeo/134142879 - Now we need to reply after someone asks Micro a yes or no question. We want to respond `YES` when button `A` is pressed. Add a condition for button `A` and inside it show the string `YES`. ``` @@ -27,8 +25,6 @@ input.onButtonPressed(Button.A, () => { **Challenge 2** -### @video vimeo/134142673 - What if Micro's answer to the question is no? Let's have `NO` be displayed when button `B` is pressed. Add a condition for button `B` and inside it show the string `NO`. ``` From 41c7053f3f4f25005b231d82d953bbf3196be268 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 19:49:38 -0700 Subject: [PATCH 101/135] added math.randomBoolean --- libs/microbit/helpers.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libs/microbit/helpers.ts b/libs/microbit/helpers.ts index 1e6bad4a..959c4ee5 100644 --- a/libs/microbit/helpers.ts +++ b/libs/microbit/helpers.ts @@ -4,3 +4,14 @@ namespace console { serial.writeString("\r\n"); } } + +namespace Math { + /** + * Generates a `true` or `false` value randomly, just like flipping a coin. + */ + //% blockId=logic_random block="pick random true or false" + //% help=math/random-boolean color=210 + export function randomBoolean(): boolean { + return Math.random(2) == 0; + } +} \ No newline at end of file From 21280f41bc8da69bbab0c188c2a260ef1a8ce8b6 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 19:55:25 -0700 Subject: [PATCH 102/135] updated random boolean color --- libs/microbit/helpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/microbit/helpers.ts b/libs/microbit/helpers.ts index 959c4ee5..a5276a9a 100644 --- a/libs/microbit/helpers.ts +++ b/libs/microbit/helpers.ts @@ -10,7 +10,7 @@ namespace Math { * Generates a `true` or `false` value randomly, just like flipping a coin. */ //% blockId=logic_random block="pick random true or false" - //% help=math/random-boolean color=210 + //% help=math/random-boolean color=230 export function randomBoolean(): boolean { return Math.random(2) == 0; } From f4afa773adca6c75c7950ce3e0dba2dc22e933ce Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 20:42:15 -0700 Subject: [PATCH 103/135] missing images blocks --- libs/microbit/images.cpp | 30 +++++++++++++++--------------- libs/microbit/shims.d.ts | 28 ++++++++++++++-------------- sim/libmbit.ts | 13 +++++++------ 3 files changed, 36 insertions(+), 35 deletions(-) diff --git a/libs/microbit/images.cpp b/libs/microbit/images.cpp index fc77dd10..7c3e3983 100644 --- a/libs/microbit/images.cpp +++ b/libs/microbit/images.cpp @@ -35,17 +35,17 @@ namespace ImageMethods { /** * Shows an frame from the image at offset ``x offset``. - * @param xOffset TODO + * @param xOffset column index to start displaying the image */ - //% help=images/show-image weight=80 async - //% BUGblockId=device_show_image_offset block="show image %sprite|at offset %offset" blockGap=8 - void showImage(Image i, int xOffset = 0) { - uBit.display.print(MicroBitImage(i), -xOffset, 0, 0); + //% help=images/show-image weight=80 blockNamespace=images + //% blockId=device_show_image_offset block="show image %sprite|at offset %offset" blockGap=8 + void showImage(Image sprite, int xOffset) { + uBit.display.print(MicroBitImage(sprite), -xOffset, 0, 0); } /** * Draws the ``index``-th frame of the image on the screen. - * @param xOffset TODO + * @param xOffset column index to start displaying the image */ //% help=images/plot-frame weight=80 void plotFrame(Image i, int xOffset) { @@ -58,9 +58,9 @@ namespace ImageMethods { * @param frameOffset x offset moved on each animation step, eg: 5, 1, -1 * @param interval time between each animation step in milli seconds, eg: 200 */ - //% help=images/show-image weight=79 async - //% BUGblockId=device_scroll_image block="scroll image %sprite|with offset %frameoffset|and interval (ms) %delay" blockGap=8 - void scrollImage(Image id, int frameOffset = 0, int interval = 200) { + //% help=images/show-image weight=79 async blockNamespace=images + //% blockId=device_scroll_image block="scroll image %sprite|with offset %frameoffset|and interval (ms) %delay" blockGap=8 + void scrollImage(Image id, int frameOffset, int interval) { MicroBitImage i(id); if (i.getWidth() <= 5) showImage(id, 0); @@ -80,7 +80,7 @@ namespace ImageMethods { /** * Sets a specific pixel brightness at a given position */ - //% help= + //% void setPixelBrightness(Image i, int x, int y, int value) { MicroBitImage(i).setPixelValue(x, y, value); } @@ -89,7 +89,7 @@ namespace ImageMethods { /** * Gets the pixel brightness ([0..255]) at a given position */ - //% help= + //% int pixelBrightness(Image i, int x, int y) { int pix = MicroBitImage(i).getPixelValue(x, y); if (pix < 0) return 0; @@ -108,7 +108,7 @@ namespace ImageMethods { /** * Gets the height in rows (always 5) */ - //% shim= + //% int height(Image i) { return i->height; } @@ -119,7 +119,7 @@ namespace ImageMethods { * @param y TODO * @param value TODO */ - //% help=functions/set-pixel + //% help=images/set-pixel void setPixel(Image i, int x, int y, bool value) { setPixelBrightness(i, x, y, value ? 255 : 0); } @@ -129,7 +129,7 @@ namespace ImageMethods { * @param x TODO * @param y TODO */ - //% help=functions/pixel + //% help=images/pixel bool pixel(Image i, int x, int y) { return pixelBrightness(i, x, y) > 0; } @@ -139,7 +139,7 @@ namespace ImageMethods { * Shows a particular frame of the image strip. * @param frame TODO */ - //% weight=70 help=functions/show-frame + //% weight=70 help=images/show-frame void showFrame(Image i, int frame) { showImage(i, frame * 5); } diff --git a/libs/microbit/shims.d.ts b/libs/microbit/shims.d.ts index aff85e66..63e42849 100644 --- a/libs/microbit/shims.d.ts +++ b/libs/microbit/shims.d.ts @@ -32,15 +32,15 @@ declare interface Image { /** * Shows an frame from the image at offset ``x offset``. - * @param xOffset TODO + * @param xOffset column index to start displaying the image */ - //% help=images/show-image weight=80 async - //% BUGblockId=device_show_image_offset block="show image %sprite|at offset %offset" blockGap=8 xOffset.defl=0 shim=ImageMethods::showImage - showImage(xOffset?: number): void; + //% help=images/show-image weight=80 blockNamespace=images + //% blockId=device_show_image_offset block="show image %sprite|at offset %offset" blockGap=8 shim=ImageMethods::showImage + showImage(xOffset: number): void; /** * Draws the ``index``-th frame of the image on the screen. - * @param xOffset TODO + * @param xOffset column index to start displaying the image */ //% help=images/plot-frame weight=80 shim=ImageMethods::plotFrame plotFrame(xOffset: number): void; @@ -50,9 +50,9 @@ declare interface Image { * @param frameOffset x offset moved on each animation step, eg: 5, 1, -1 * @param interval time between each animation step in milli seconds, eg: 200 */ - //% help=images/show-image weight=79 async - //% BUGblockId=device_scroll_image block="scroll image %sprite|with offset %frameoffset|and interval (ms) %delay" blockGap=8 frameOffset.defl=0 interval.defl=200 shim=ImageMethods::scrollImage - scrollImage(frameOffset?: number, interval?: number): void; + //% help=images/show-image weight=79 async blockNamespace=images + //% blockId=device_scroll_image block="scroll image %sprite|with offset %frameoffset|and interval (ms) %delay" blockGap=8 shim=ImageMethods::scrollImage + scrollImage(frameOffset: number, interval: number): void; /** * Sets all pixels off. @@ -63,13 +63,13 @@ declare interface Image { /** * Sets a specific pixel brightness at a given position */ - //% help= shim=ImageMethods::setPixelBrightness + //% shim=ImageMethods::setPixelBrightness setPixelBrightness(x: number, y: number, value: number): void; /** * Gets the pixel brightness ([0..255]) at a given position */ - //% help= shim=ImageMethods::pixelBrightness + //% shim=ImageMethods::pixelBrightness pixelBrightness(x: number, y: number): number; /** @@ -81,7 +81,7 @@ declare interface Image { /** * Gets the height in rows (always 5) */ - //% shim= shim=ImageMethods::height + //% shim=ImageMethods::height height(): number; /** @@ -90,7 +90,7 @@ declare interface Image { * @param y TODO * @param value TODO */ - //% help=functions/set-pixel shim=ImageMethods::setPixel + //% help=images/set-pixel shim=ImageMethods::setPixel setPixel(x: number, y: number, value: boolean): void; /** @@ -98,14 +98,14 @@ declare interface Image { * @param x TODO * @param y TODO */ - //% help=functions/pixel shim=ImageMethods::pixel + //% help=images/pixel shim=ImageMethods::pixel pixel(x: number, y: number): boolean; /** * Shows a particular frame of the image strip. * @param frame TODO */ - //% weight=70 help=functions/show-frame shim=ImageMethods::showFrame + //% weight=70 help=images/show-frame shim=ImageMethods::showFrame showFrame(frame: number): void; } diff --git a/sim/libmbit.ts b/sim/libmbit.ts index 0ddbecab..639dac66 100644 --- a/sim/libmbit.ts +++ b/sim/libmbit.ts @@ -187,7 +187,7 @@ namespace pxsim.basic { if (interval < 0) return; let leds = createImageFromString(x.toString()); - if (x < 0 || x >= 10) ImageMethods.scrollImage(leds, interval, 1); + if (x < 0 || x >= 10) ImageMethods.scrollImage(leds, 1, interval); else showLeds(leds, interval * 5); } @@ -198,7 +198,7 @@ namespace pxsim.basic { pause(interval * 5); } else { if (s.length == 1) showLeds(createImageFromString(s), interval * 5) - else ImageMethods.scrollImage(createImageFromString(s + " "), interval, 1); + else ImageMethods.scrollImage(createImageFromString(s + " "), 1, interval); } } @@ -211,8 +211,8 @@ namespace pxsim.basic { runtime.queueDisplayUpdate() } - export function showAnimation(leds: Image, interval: number = 400): void { - ImageMethods.scrollImage(leds, interval, 5); + export function showAnimation(leds: Image, interval: number): void { + ImageMethods.scrollImage(leds, 5, interval); } export function plotLeds(leds: Image): void { @@ -674,10 +674,11 @@ namespace pxsim.ImageMethods { return i.get(x, y); } - export function scrollImage(leds: Image, interval: number, stride: number): void { + export function scrollImage(leds: Image, stride: number, interval: number): void { if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE); + if (stride == 0) stride = 1; - let cb = getResume() + let cb = getResume(); let off = stride > 0 ? 0 : leds.width - 1; let display = board().image; From 466bda468f520ed5ed4ec3a933af3dcc2c9632b8 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Thu, 26 May 2016 21:38:11 -0700 Subject: [PATCH 104/135] update instructions --- README.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1a77d75d..0a1d099b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # micro:bit target for PXT This target allow to program a [BBC micro:bit](https://www.microbit.co.uk/) using -[Microsoft Programming Experience Toolkit](https://github.com/Microsoft/pxt). +PXT ([Microsoft Programming Experience Toolkit](https://github.com/Microsoft/pxt)). * [Try it live](https://m.pxt.io) @@ -28,17 +28,26 @@ Run this command to open a local web server: ``` pxt serve ``` +If the local server opens in the wrong browser, make sure to copy the URL containing the local token. +Otherwise, the editor will not be able to load the projects. + +If you need modify the `.cpp` files, turn on yotta compilation with the ``-yt`` flag: +``` +pxt serve -yt +``` + To make sure you're running the latest tools, run ``` npm update ``` + More instructions at https://github.com/Microsoft/pxt#running-a-target-from-localhost ## Universal Windows App The Windows 10 app is a [Universal Windows Hosted Web App](https://microsoftedge.github.io/WebAppsDocs/en-US/win10/CreateHWA.htm) -that wraps m.pxt.io and provides additional features. +that wraps ``m.pxt.io`` and provides additional features. ### Building From 74b333dee48e9872646342deda7a23de700c49ab Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 27 May 2016 07:06:24 -0700 Subject: [PATCH 105/135] various small updates to docs --- docs/getting-started.md | 2 +- docs/packages.md | 7 +++++++ docs/release-notes.md | 8 +++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/docs/getting-started.md b/docs/getting-started.md index b212da8a..3ba449c2 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -168,4 +168,4 @@ input.onPinPressed(TouchPin.P0, () => { ### Your turn now! -Use the scree, buttons, gestures, pins to create a fun game using the micro:bit. \ No newline at end of file +Use the screen, buttons, gestures, pins to create a fun game using the micro:bit. \ No newline at end of file diff --git a/docs/packages.md b/docs/packages.md index 7738fecd..4217e3fa 100644 --- a/docs/packages.md +++ b/docs/packages.md @@ -10,5 +10,12 @@ to a microbit. ## Finding libraries +From the editor, the user clicks on **More** then **Add Package** and searches for the package. + +To see the list of packages, click on **More** then **Show Files** to see the project file list. + +To remove a package, click on the garbage button in the file list next to the package. + ## Publishing libraries +Packages can be published from the pxt command line. We are still sorting out the details. \ No newline at end of file diff --git a/docs/release-notes.md b/docs/release-notes.md index f9bc423a..d6dd788f 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -4,8 +4,10 @@ basic.forever(() => { basic.showString("RELEASE NOTES"); }); ``` -### May 2017 +## May 2017 -We're happy to announce [m.pxt.io](https://m.pxt.io), an Blocks/JavaScript editor for the [BBC micro:bit](https://www.microbit.co.uk). +We're happy to announce [m.pxt.io](https://m.pxt.io), an Blocks/JavaScript editor for the [BBC micro:bit](https://www.microbit.co.uk). +The editor is [open source](/open-source) on GitHub. Send us your PR! -The editor is [open source](/open-source) on GitHub. Send us your PR! \ No newline at end of file +This release contains a Block/JavaScript editor, new simulator that supports multiple micro:bit instances, new documentation engine, +all the blocks from the Microsoft Block Editor in the BBC micro:bit web site. \ No newline at end of file From f39703e6f7d028b448b75a4eb87b4f00b1668df9 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 27 May 2016 08:55:40 -0700 Subject: [PATCH 106/135] refreshed docs --- docs/reference/String.md | 5 +++++ docs/reference/pins.md | 2 +- docs/reference/serial.md | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 docs/reference/String.md diff --git a/docs/reference/String.md b/docs/reference/String.md new file mode 100644 index 00000000..2e875b5f --- /dev/null +++ b/docs/reference/String.md @@ -0,0 +1,5 @@ +# String + +```cards +String.fromCharCode(0); +``` diff --git a/docs/reference/pins.md b/docs/reference/pins.md index 5b041392..7fece8ad 100644 --- a/docs/reference/pins.md +++ b/docs/reference/pins.md @@ -8,6 +8,7 @@ pins.digitalWritePin(DigitalPin.P0, 0); pins.analogReadPin(AnalogPin.P0); pins.analogWritePin(AnalogPin.P0, 1023); pins.analogSetPeriod(AnalogPin.P0, 20000); +pins.map(0, 0, 1023, 0, 4); pins.onPulsed(DigitalPin.P0, PulseValue.High, () => { }); @@ -16,7 +17,6 @@ pins.servoWritePin(AnalogPin.P0, 180); pins.servoSetPulse(AnalogPin.P0, 1500); pins.i2cReadNumber(0, NumberFormat.Int8LE); pins.i2cWriteNumber(0, 0, NumberFormat.Int8LE); -pins.map(0, 0, 1023, 0, 4); pins.analogPitch(0, 0); pins.analogSetPitchPin(AnalogPin.P0); ``` diff --git a/docs/reference/serial.md b/docs/reference/serial.md index bf72fd14..4fdec09d 100644 --- a/docs/reference/serial.md +++ b/docs/reference/serial.md @@ -8,4 +8,5 @@ serial.writeNumber(0); serial.writeValue(x, 0); serial.writeString(""); serial.readLine(); +serial.redirect(SerialPin.P0, SerialPin.P0, BaudRate.BaudRate115200); ``` From f3463b5961de311834b25bba22121f72599b9a4b Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 27 May 2016 09:23:47 -0700 Subject: [PATCH 107/135] refactor strings.json generation for packages --- libs/microbit/_locales/fr/strings.json | 3 +++ .../_locales/{microbit-strings.json => strings.json} | 8 +++++++- libs/microbit/pxt.json | 3 ++- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 libs/microbit/_locales/fr/strings.json rename libs/microbit/_locales/{microbit-strings.json => strings.json} (92%) diff --git a/libs/microbit/_locales/fr/strings.json b/libs/microbit/_locales/fr/strings.json new file mode 100644 index 00000000..a63599ad --- /dev/null +++ b/libs/microbit/_locales/fr/strings.json @@ -0,0 +1,3 @@ +{ + "basic.clearScreen": "Eteint toutes les diodes." +} \ No newline at end of file diff --git a/libs/microbit/_locales/microbit-strings.json b/libs/microbit/_locales/strings.json similarity index 92% rename from libs/microbit/_locales/microbit-strings.json rename to libs/microbit/_locales/strings.json index 96bb32ba..4e362f31 100644 --- a/libs/microbit/_locales/microbit-strings.json +++ b/libs/microbit/_locales/strings.json @@ -1,4 +1,6 @@ { + "Math.randomBoolean": "Generates a `true` or `false` value randomly, just like flipping a coin.", + "String.fromCharCode": "Make a string from the given ASCII character code.", "basic": "Provides access to basic micro:bit functionality.", "basic.clearScreen": "Turn off all LEDs", "basic.forever": "Repeats the code forever in the background. On each iteration, allows other codes to run.", @@ -76,10 +78,14 @@ "pins.i2cWriteNumber": "Write one number to a 7-bit I2C address.", "pins.map": "Re-maps a number from one range to another. That is, a value of ``from low`` would get mapped to ``to low``, a value of ``from high`` to ``to high``, values in-between to values in-between, etc.", "pins.onPulsed": "Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``.", - "pins.pulseDuration": "Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulse`` handler.", + "pins.pulseDuration": "Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulsed`` handler.", "pins.servoSetPulse": "Configures this IO pin as an analog/pwm output, configures the period to be 20 ms, and sets the pulse width, based on the value it is given **microseconds** or `1/1000` milliseconds.", "pins.servoWritePin": "Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).", "serial": "Reading and writing data over a serial connection.", + "serial.readLine": "Reads a line of text from the serial port.", + "serial.redirect": "Dynamically configuring the serial instance to use pins other than USBTX and USBRX.", "serial.writeLine": "Prints a line of text to the serial", + "serial.writeNumber": "Prints a numeric value to the serial", + "serial.writeString": "Sends a piece of text through Serial connection.", "serial.writeValue": "Writes a ``name: value`` pair line to the serial." } \ No newline at end of file diff --git a/libs/microbit/pxt.json b/libs/microbit/pxt.json index 4f54f145..9cd49852 100644 --- a/libs/microbit/pxt.json +++ b/libs/microbit/pxt.json @@ -26,7 +26,8 @@ "pins.ts", "serial.cpp", "serial.ts", - "buffer.cpp" + "buffer.cpp", + "_locales/fr/strings.json" ], "public": true, "dependencies": {}, From 4fb10faec2316ce44cea2d5cb8dcaf7c9ac7fd6a Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Fri, 27 May 2016 12:03:54 -0700 Subject: [PATCH 108/135] Radio send/receive string. Rewrote text. Updated examples. --- docs/reference/radio/receive-string.md | 47 ++++++++++++++++++-------- docs/reference/radio/send-string.md | 30 +++++++++------- 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/docs/reference/radio/receive-string.md b/docs/reference/radio/receive-string.md index 5f4db239..f28765e9 100644 --- a/docs/reference/radio/receive-string.md +++ b/docs/reference/radio/receive-string.md @@ -1,14 +1,6 @@ # Receive String -Reads the next radio packet if any and returns the first string. - -## Important Security Consideration - -The functions in the ``radio`` namespace allow the BBC micro:bit to communicate with other micro:bits. - -This API does not contain any form of encryption, authentication or authorization. It's purpose is solely for use as a teaching aid to demonstrate how simple communications operates, and to provide a sandpit through which learning can take place. - -For serious applications, BLE should be considered a substantially more secure alternative. +Find the next string sent by `radio` from another micro:bit. ```sig radio.receiveString() @@ -16,11 +8,11 @@ radio.receiveString() ### Return value -* the first [string](/reference/types/string) of the packet if any. ```""``` otherwise. +* the first [string](/reference/types/string) that was sent. If no string was sent, then this function returns an empty (blank) string. -### Examples +### Example: Simple receiver -Read the string broadcasted by other micro:bits and display it. +Show the string sent by another micro:bit. ```blocks radio.onDataReceived(() => { @@ -28,7 +20,34 @@ radio.onDataReceived(() => { }); ``` -A simple program to send whether you are happy, or sad over ```radio```, using the A or B button to select an emotion. +### Example: Two-way radio + +If you load this program onto two or more micro:bits, you can send a code word from one of them to the others by pressing button `A`. +The other micro:bits will receive the code word and then show it. + +```blocks +input.onButtonPressed(Button.A, () => { + radio.sendString("Codeword: TRIMARAN") + basic.showString("SENT"); +}) + +radio.onDataReceived(() => { + basic.showString(radio.receiveString()); +}); +``` + +### ~hint + +A radio that can both transmit and receive is called a _transceiver_. + +### ~ + +### Example: Mood radio + +This is a simple program to send whether you are happy or sad over ```radio```. +Use the `A` or `B` button to select an emotion. + +This program will also receive your friend's mood. ```blocks let data: string = ""; @@ -64,4 +83,4 @@ radio.onDataReceived(() => { ### See also -[send string](/reference/input/send-string), [on data received](/reference/radio/on-data-received) +[send string](/reference/radio/send-string), [on data received](/reference/radio/on-data-received) diff --git a/docs/reference/radio/send-string.md b/docs/reference/radio/send-string.md index 872c1d04..13320767 100644 --- a/docs/reference/radio/send-string.md +++ b/docs/reference/radio/send-string.md @@ -1,33 +1,39 @@ # Send String -Broadcasts a string data packet to other micro:bits connected via ``radio``. -## Important Security Consideration -The functions in the ``radio`` namespace allow the BBC micro:bit to communicate with other micro:bits. - -This API does not contain any form of encryption, authentication or authorization. It's purpose is solely for use as a teaching aid to demonstrate how simple communications operates, and to provide a sandpit through which learning can take place. - -For serious applications, BLE should be considered a substantially more secure alternative. +Sends a string to other micro:bits in the area connected by radio. ```sig -radio.sendString("Hello world!") +radio.sendString("Hello!") ``` ### Parameters -* msg - a string to be transmitted. +* `text` is a [String](/reference/types/string) to send by radio. -### Examples +### Example: Two-way radio -Broadcasts the provided string to other micro:bits. +If you load this program onto two or more micro:bits, you can send a code word from one of them to the others by pressing button `A`. +The other micro:bits will receive the code word and then show it. ```blocks input.onButtonPressed(Button.A, () => { - radio.sendString("Mr. Watson, come here, I want to see you.") + radio.sendString("Codeword: TRIMARAN") + basic.showString("SENT"); }) + +radio.onDataReceived(() => { + basic.showString(radio.receiveString()); +}); ``` +### ~hint + +A radio that can both transmit and receive is called a _transceiver_. + +### ~ + ### See also [receive string](/reference/radio/receive-string), [on data received](/reference/radio/on-data-received) From 7a0ad8e3ed9db2073ade12028cc6a7f1493d44bb Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 27 May 2016 14:16:47 -0700 Subject: [PATCH 109/135] disabling source maps --- cmds/tsconfig.json | 2 +- libs/tsconfig.json | 2 +- sim/tsconfig.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmds/tsconfig.json b/cmds/tsconfig.json index d439cadb..7d57cc95 100644 --- a/cmds/tsconfig.json +++ b/cmds/tsconfig.json @@ -8,6 +8,6 @@ "module": "commonjs", "rootDir": ".", "newLine": "LF", - "sourceMap": true + "sourceMap": false } } diff --git a/libs/tsconfig.json b/libs/tsconfig.json index 4a1a04d5..057a3b33 100644 --- a/libs/tsconfig.json +++ b/libs/tsconfig.json @@ -6,6 +6,6 @@ "outDir": "../built", "rootDir": ".", "newLine": "LF", - "sourceMap": true + "sourceMap": false } } diff --git a/sim/tsconfig.json b/sim/tsconfig.json index 761e4ba9..007366f2 100644 --- a/sim/tsconfig.json +++ b/sim/tsconfig.json @@ -7,6 +7,6 @@ "out": "../built/sim.js", "rootDir": ".", "newLine": "LF", - "sourceMap": true + "sourceMap": false } } From facea7d27d500955bed09842dbfb95b0899acdbf Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 27 May 2016 14:48:57 -0700 Subject: [PATCH 110/135] Bump pxt-core to 0.2.146 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ee693350..11a8dc06 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.145" + "pxt-core": "0.2.146" } } From 04c8221b41674af303efc2871db04d73ca34b6ed Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Fri, 27 May 2016 14:48:59 -0700 Subject: [PATCH 111/135] 0.2.135 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 11a8dc06..458bcb83 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.134", + "version": "0.2.135", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From a383060b4db607a43da4c5abb4346eeae29a86ca Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Fri, 27 May 2016 16:22:38 -0700 Subject: [PATCH 112/135] Improved examples; last one needs work. --- docs/reference/radio/send-number.md | 44 +++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/docs/reference/radio/send-number.md b/docs/reference/radio/send-number.md index 5236c969..71de3fb9 100644 --- a/docs/reference/radio/send-number.md +++ b/docs/reference/radio/send-number.md @@ -28,6 +28,50 @@ input.onButtonPressed(Button.A, () => { }) ``` +### Light level sender + +This example broadcasts the level of the light around it: + +```blocks +radio.setGroup(99) +basic.forever(() => { + let level = input.lightLevel() + radio.sendNumber(level) +}) +``` + +This example shows the light level from the sender (above): + +```blocks +radio.setGroup(99) +basic.forever(() => { + let level = radio.receiveNumber() + basic.showNumber(level) +}) +``` + +### Mailbot + +This example takes the signal from the light level sender (above) +and shows a text string if the light level becomes much brighter. +You can put the light level sender in your mailbox and it will +tell you when someone opens the box. You can try this with a normal +box too, like a present. + +```blocks +radio.setGroup(99) +let max = 0 +basic.forever(() => { + let level = radio.receiveNumber() + if (level > max) { + let max = level + } + if (max > 10) { + basic.showString("ALERT") + } +}) +``` + ### See also [receive number](/reference/radio/receive-number), [on data received](/reference/radio/on-data-received) From 7f9f14df18c9c6154ee10ac25de3f975b09ca399 Mon Sep 17 00:00:00 2001 From: Tom Ball Date: Fri, 27 May 2016 21:40:59 -0700 Subject: [PATCH 113/135] rename --- docs/projects/a1-display.md | 34 ++++++++++++++++++ .../{activities => projects}/a1-display.png | Bin .../mb/{activities => projects}/a10-watch.png | Bin .../{activities => projects}/a2-buttons.png | Bin .../mb/{activities => projects}/a3-pins.png | Bin .../mb/{activities => projects}/a4-motion.png | Bin .../{activities => projects}/a5-compass.png | Bin .../mb/{activities => projects}/a6-music.png | Bin .../a7-conductive.png | Bin .../{activities => projects}/a8-network.png | Bin .../mb/{activities => projects}/a9-radio.png | Bin 11 files changed, 34 insertions(+) create mode 100644 docs/projects/a1-display.md rename docs/static/mb/{activities => projects}/a1-display.png (100%) rename docs/static/mb/{activities => projects}/a10-watch.png (100%) rename docs/static/mb/{activities => projects}/a2-buttons.png (100%) rename docs/static/mb/{activities => projects}/a3-pins.png (100%) rename docs/static/mb/{activities => projects}/a4-motion.png (100%) rename docs/static/mb/{activities => projects}/a5-compass.png (100%) rename docs/static/mb/{activities => projects}/a6-music.png (100%) rename docs/static/mb/{activities => projects}/a7-conductive.png (100%) rename docs/static/mb/{activities => projects}/a8-network.png (100%) rename docs/static/mb/{activities => projects}/a9-radio.png (100%) diff --git a/docs/projects/a1-display.md b/docs/projects/a1-display.md new file mode 100644 index 00000000..67c37c08 --- /dev/null +++ b/docs/projects/a1-display.md @@ -0,0 +1,34 @@ +## Getting started + • Go to https://m.pxt.io/ + • To create a new project, click new Project +Tap or click Blocks. + +## Step 1 + +Use [show leds](/reference/basic/showLeds) and make your code look like this: + +```blocks +basic.showLeds(` +. # . # . +# # # # # +# # # # # +. # # # . +. . # . .`); +``` + +Once you are done coding, don't forget to run your code with the Play button. + +## Step 2 + +Add a [pause](/reference/basic/pause) to wait and [clear screen](/reference/basic/clearScreen) to turn off the LEDs. + +```blocks +basic.showLeds(` +. # . # . +# # # # # +# # # # # +. # # # . +. . # . .`); +basic.pause(500); +basic.clearScreen(); +``` \ No newline at end of file diff --git a/docs/static/mb/activities/a1-display.png b/docs/static/mb/projects/a1-display.png similarity index 100% rename from docs/static/mb/activities/a1-display.png rename to docs/static/mb/projects/a1-display.png diff --git a/docs/static/mb/activities/a10-watch.png b/docs/static/mb/projects/a10-watch.png similarity index 100% rename from docs/static/mb/activities/a10-watch.png rename to docs/static/mb/projects/a10-watch.png diff --git a/docs/static/mb/activities/a2-buttons.png b/docs/static/mb/projects/a2-buttons.png similarity index 100% rename from docs/static/mb/activities/a2-buttons.png rename to docs/static/mb/projects/a2-buttons.png diff --git a/docs/static/mb/activities/a3-pins.png b/docs/static/mb/projects/a3-pins.png similarity index 100% rename from docs/static/mb/activities/a3-pins.png rename to docs/static/mb/projects/a3-pins.png diff --git a/docs/static/mb/activities/a4-motion.png b/docs/static/mb/projects/a4-motion.png similarity index 100% rename from docs/static/mb/activities/a4-motion.png rename to docs/static/mb/projects/a4-motion.png diff --git a/docs/static/mb/activities/a5-compass.png b/docs/static/mb/projects/a5-compass.png similarity index 100% rename from docs/static/mb/activities/a5-compass.png rename to docs/static/mb/projects/a5-compass.png diff --git a/docs/static/mb/activities/a6-music.png b/docs/static/mb/projects/a6-music.png similarity index 100% rename from docs/static/mb/activities/a6-music.png rename to docs/static/mb/projects/a6-music.png diff --git a/docs/static/mb/activities/a7-conductive.png b/docs/static/mb/projects/a7-conductive.png similarity index 100% rename from docs/static/mb/activities/a7-conductive.png rename to docs/static/mb/projects/a7-conductive.png diff --git a/docs/static/mb/activities/a8-network.png b/docs/static/mb/projects/a8-network.png similarity index 100% rename from docs/static/mb/activities/a8-network.png rename to docs/static/mb/projects/a8-network.png diff --git a/docs/static/mb/activities/a9-radio.png b/docs/static/mb/projects/a9-radio.png similarity index 100% rename from docs/static/mb/activities/a9-radio.png rename to docs/static/mb/projects/a9-radio.png From f9409b5fb59c0f595ad37df9edc07fb2e1561449 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Tue, 31 May 2016 11:44:20 -0700 Subject: [PATCH 114/135] Mailbot example works now. --- docs/reference/radio/send-number.md | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/docs/reference/radio/send-number.md b/docs/reference/radio/send-number.md index 71de3fb9..9b0686cb 100644 --- a/docs/reference/radio/send-number.md +++ b/docs/reference/radio/send-number.md @@ -2,18 +2,6 @@ Broadcasts a number data packet to other micro:bits connected via ``radio``. -## Important Security Consideration - -The functions in the ``radio`` namespace allow the BBC micro:bit to communicate with other micro:bits. - -This API does not contain any form of encryption, authentication or authorization. It's purpose is solely for use as a teaching aid to demonstrate how simple communications operates, and to provide a sandpit through which learning can take place. - -For serious applications, BLE should be considered a substantially more secure alternative. - -```sig -radio.sendNumber(0) -``` - ### Parameters * packet - a number to be transmitted. @@ -64,7 +52,7 @@ let max = 0 basic.forever(() => { let level = radio.receiveNumber() if (level > max) { - let max = level + max = level } if (max > 10) { basic.showString("ALERT") From a9cfe83bdf26b88b945c5aa451a63a11bf5abba2 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Tue, 31 May 2016 12:06:03 -0700 Subject: [PATCH 115/135] Target=kids so removing all 'Important Security Considerations' for now. --- docs/reference/radio/on-data-received.md | 12 ------------ docs/reference/radio/receive-number.md | 12 ------------ docs/reference/radio/set-group.md | 12 ------------ 3 files changed, 36 deletions(-) diff --git a/docs/reference/radio/on-data-received.md b/docs/reference/radio/on-data-received.md index 61f2d6a2..b0095175 100644 --- a/docs/reference/radio/on-data-received.md +++ b/docs/reference/radio/on-data-received.md @@ -2,18 +2,6 @@ Registers code to run when a packet is received over ``radio``. -## Important Security Consideration - -The functions in the ``radio`` namespace allow the BBC micro:bit to communicate with other micro:bits. - -This API does not contain any form of encryption, authentication or authorization. It's purpose is solely for use as a teaching aid to demonstrate how simple communications operates, and to provide a sandpit through which learning can take place. - -For serious applications, BLE should be considered a substantially more secure alternative. - -```sig -radio.onDataReceived(() => {}) -``` - ### Parameters * body - is an action diff --git a/docs/reference/radio/receive-number.md b/docs/reference/radio/receive-number.md index 1d80eaff..85b45230 100644 --- a/docs/reference/radio/receive-number.md +++ b/docs/reference/radio/receive-number.md @@ -2,18 +2,6 @@ Reads the next radio packet if any and returns the first number. -## Important Security Consideration - -The functions in the ``radio`` namespace allow the BBC micro:bit to communicate with other micro:bits. - -This API does not contain any form of encryption, authentication or authorization. It's purpose is solely for use as a teaching aid to demonstrate how simple communications operates, and to provide a sandpit through which learning can take place. - -For serious applications, BLE should be considered a substantially more secure alternative. - -```sig -radio.receiveNumber() -``` - ### Return value * the first number [number](/reference/types/number) of the packet if any. `0` otherwise. diff --git a/docs/reference/radio/set-group.md b/docs/reference/radio/set-group.md index 161085d4..16c91118 100644 --- a/docs/reference/radio/set-group.md +++ b/docs/reference/radio/set-group.md @@ -4,18 +4,6 @@ Sets the group id for ``radio`` communications. A micro:bit can only listen to o Unless specified, the group id is automatically inferred from the script source. Every script with the same exact source code with start with the same group id. -## Important Security Consideration - -The functions in the ``radio`` namespace allow the BBC micro:bit to communicate with other micro:bits. - -This API does not contain any form of encryption, authentication or authorization. It's purpose is solely for use as a teaching aid to demonstrate how simple communications operates, and to provide a sandpit through which learning can take place. - -For serious applications, BLE should be considered a substantially more secure alternative. - -```sig -radio.setGroup(1) -``` - ### Parameters * ``id`` -- a [number](/reference/types/number) between ``0`` and ``255``. From 5650f7dc35c2c54e07a1eff10f01faac1ca480a1 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Tue, 31 May 2016 17:02:22 -0700 Subject: [PATCH 116/135] Finishing pass on send/receive number. Examples distributed more sensibly. --- docs/reference/radio/receive-number.md | 46 +++++++++++++++++++++++--- docs/reference/radio/send-number.md | 46 +++++--------------------- 2 files changed, 50 insertions(+), 42 deletions(-) diff --git a/docs/reference/radio/receive-number.md b/docs/reference/radio/receive-number.md index 85b45230..8b25e601 100644 --- a/docs/reference/radio/receive-number.md +++ b/docs/reference/radio/receive-number.md @@ -1,14 +1,15 @@ # Receive Number -Reads the next radio packet if any and returns the first number. +Receives the next number sent by a micro:bit in the same ``radio`` group. ### Return value -* the first number [number](/reference/types/number) of the packet if any. `0` otherwise. +* the first [number](/reference/types/number) that the micro:bit received. If it did not receive any numbers, this function will return `0`. -### Examples +### Example: Simple number receiver -Read the number broadcasted by other micro:bits. +This example receives the number broadcasted another micro:bit and shows it +as a bar graph. ```blocks radio.onDataReceived(() => { @@ -16,7 +17,42 @@ radio.onDataReceived(() => { }) ``` +### Example: Light level receiver + +This example shows the light level from the [light level sender example](/reference/input/send-number) +as a number. + +```blocks +radio.setGroup(99) +basic.forever(() => { + let level = radio.receiveNumber() + basic.showNumber(level) +}) +``` + +### Example: Mailbot + +This example receives the light level from the [light level sender example](/reference/input/send-number) +and shows a text string like **ALERT** if the light level becomes much brighter. +To find when the mail arrives, you can put the light level sender in your mailbox and it will +tell you when someone opens the box. You can try this with a normal +box too, like a present for a friend. + +```blocks +radio.setGroup(99) +let max = 0 +basic.forever(() => { + let level = radio.receiveNumber() + if (level > max) { + max = level + } + if (max > 10) { + basic.showString("ALERT") + } +}) +``` + ### See also -[receive number](/reference/input/receive-number), [on data received](/reference/radio/on-data-received) +[send number](/reference/input/send-number), [on data received](/reference/radio/on-data-received) diff --git a/docs/reference/radio/send-number.md b/docs/reference/radio/send-number.md index 9b0686cb..45f70cf5 100644 --- a/docs/reference/radio/send-number.md +++ b/docs/reference/radio/send-number.md @@ -1,14 +1,16 @@ # Send Number -Broadcasts a number data packet to other micro:bits connected via ``radio``. +Broadcast a number to other micro:bits connected via ``radio``. ### Parameters -* packet - a number to be transmitted. +* num - a number to send. -### Examples +### Example: Broadcasting acceleration -Broadcasts the value of ``acceleration`` x to other micro:bits. +This example broadcasts the value of your micro:bit's ``acceleration`` in the `x` direction +(left and right) to other micro:bits. +This kind of program might be useful in a model car or model rocket. ```blocks input.onButtonPressed(Button.A, () => { @@ -18,7 +20,9 @@ input.onButtonPressed(Button.A, () => { ### Light level sender -This example broadcasts the level of the light around it: +This example broadcasts the level of the light around it. +You can do some interesting things with it if you use it along with the +[Mailbot](/reference/radio/receive-number) example. ```blocks radio.setGroup(99) @@ -28,38 +32,6 @@ basic.forever(() => { }) ``` -This example shows the light level from the sender (above): - -```blocks -radio.setGroup(99) -basic.forever(() => { - let level = radio.receiveNumber() - basic.showNumber(level) -}) -``` - -### Mailbot - -This example takes the signal from the light level sender (above) -and shows a text string if the light level becomes much brighter. -You can put the light level sender in your mailbox and it will -tell you when someone opens the box. You can try this with a normal -box too, like a present. - -```blocks -radio.setGroup(99) -let max = 0 -basic.forever(() => { - let level = radio.receiveNumber() - if (level > max) { - max = level - } - if (max > 10) { - basic.showString("ALERT") - } -}) -``` - ### See also [receive number](/reference/radio/receive-number), [on data received](/reference/radio/on-data-received) From 6429b5708130e999da9d2f5a602c23673c1d856b Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Tue, 31 May 2016 17:17:36 -0700 Subject: [PATCH 117/135] Improve docs (terminology, hyperlinks). --- docs/projects/rock-paper-scissors.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/projects/rock-paper-scissors.md b/docs/projects/rock-paper-scissors.md index 88e1c605..df597ee4 100644 --- a/docs/projects/rock-paper-scissors.md +++ b/docs/projects/rock-paper-scissors.md @@ -55,7 +55,8 @@ input.onGesture(Gesture.Shake, () => { ``` Next, when you shake the micro:bit, it should pick a random number from `0` to `2` -and store it in the variable. +and store it in the variable `weapon`. (This variable is named `weapon` because +rock, paper, and scissors are the weapons you use to battle your friends!) Add a ``set`` block with a variable. Then add a ``pick random`` block, and store the random number in the variable, @@ -230,4 +231,4 @@ input.onButtonPressed(Button.B, () => { ## Step 8: Hacking Rock Paper Scissors How else can you make your game better? -Ever hear of [Rock Paper Scissors Spock Lizard](https://en.wikipedia.org/wiki/Rock-paper-scissors#Additional_weapons)? +Ever hear of [Rock Paper Scissors Spock Lizard](http://www.samkass.com/theories/RPSSL.html)? From fd02bd94071800e2a0b6043906fe16b8fe415d0b Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 07:42:03 -0700 Subject: [PATCH 118/135] updated docs menu --- docs/getting-started.md | 13 ++++++------- docs/packages.md | 29 ++++++++++++++++++++++++++++- pxtarget.json | 8 ++++++-- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/docs/getting-started.md b/docs/getting-started.md index 3ba449c2..099c3e65 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -2,10 +2,6 @@ Are you ready to build cool BBC micro:bit programs? For each challenge, reorder the blocks to recreate the program. -## Open [https://m.pxt.io](/) and create a new **Blocks Editor** project - -## Basic - ### Show leds Use the blocks below to draw a figure on the screen. You can redo the smiley face or try something else! @@ -22,7 +18,7 @@ basic.showLeds(` To transfer your code to the BBC micro:bit, * connect your micro:bit to the computer using the USB cable -* click on **Download** +* click on **Compile** * drag&drop the **.hex** file into the **MICROBIT** drive * wait till the yellow light is done blinking! @@ -47,6 +43,11 @@ Show one image after the other to create an animation by snapping them together. `) ``` +To transfer your code to the BBC micro:bit, +* connect your micro:bit to the computer using the USB cable +* click on **Compile** +* drag&drop the **.hex** file into the **MICROBIT** drive +* wait till the yellow light is done blinking! ### Repeat forever @@ -77,8 +78,6 @@ basic.forever(() => { Use the blocks ``show leds`` and ``forever`` to create your own custom awesome animation! -## Inputs - ### Button A and B Unshuffle the blocks so that the micro:bit shows "YES" when button A is pressed, and "NO" when B is pressed. diff --git a/docs/packages.md b/docs/packages.md index 4217e3fa..f1521f8e 100644 --- a/docs/packages.md +++ b/docs/packages.md @@ -18,4 +18,31 @@ To remove a package, click on the garbage button in the file list next to the pa ## Publishing libraries -Packages can be published from the pxt command line. We are still sorting out the details. \ No newline at end of file +Packages can be published from the pxt command line. We are still sorting out the details. + +## Localizing libraries + +It is possible to package localization strings for the **jsDoc** description associated to the API in the package. + +When compiling a package, the PXT compiler generates a `strings.json` file under the `_locales/` folder. +This file contains a map from the symbol name to the en + +``` +{ + ... + "basic": "Provides access to basic micro:bit functionality.", + ... +} +``` + +``` +{ + "basic.clearScreen": "Eteint toutes les diodes." +} +``` + +``` +_locales/ +_locales/fr/strings.json +_locales/pt-BR/strings.json +``` diff --git a/pxtarget.json b/pxtarget.json index 81471718..659adfea 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -94,13 +94,17 @@ "path": "/about" }, { - "name": "Lessons", - "path": "/lessons" + "name": "Getting Started", + "path": "/getting-started" }, { "name": "Reference", "path": "/reference" }, + { + "name": "Lessons", + "path": "/lessons" + }, { "name": "Device", "path": "/device" From 571ae8337ff1f6ac1b2bcff91b821382b7a4dc5b Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 07:42:39 -0700 Subject: [PATCH 119/135] Bump pxt-core to 0.2.147 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 458bcb83..8f4e60ac 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.146" + "pxt-core": "0.2.147" } } From 3b2729d9d8df030a8b59634dd0c022f7fe5257bb Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 07:42:41 -0700 Subject: [PATCH 120/135] 0.2.136 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8f4e60ac..70c8b830 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.135", + "version": "0.2.136", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 246d81ffd52fa9459e6ea35635be8817d64433e2 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 08:13:26 -0700 Subject: [PATCH 121/135] 0.2.137 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 70c8b830..b7ab1b31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.136", + "version": "0.2.137", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 9b1d2085ba833b4181abb85c4b3f809d92fa6819 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 08:52:20 -0700 Subject: [PATCH 122/135] Bump pxt-core to 0.2.148 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b7ab1b31..a27e322c 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.147" + "pxt-core": "0.2.148" } } From 230de475d1482e65cfa0b670333d3fd12f3e223f Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 08:52:21 -0700 Subject: [PATCH 123/135] 0.2.138 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a27e322c..13063bef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.137", + "version": "0.2.138", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 53922986b1df1091882466a79270d20e1696a6df Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 09:11:53 -0700 Subject: [PATCH 124/135] Bump pxt-core to 0.2.149 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 13063bef..49d4eefd 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.148" + "pxt-core": "0.2.149" } } From d74702353fc6924e3856d682eeeffdd35d92c039 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 09:11:55 -0700 Subject: [PATCH 125/135] 0.2.139 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 49d4eefd..695ec86b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.138", + "version": "0.2.139", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 1a6d47a1c958dd315f4de92612f3a9dc1864c8d1 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Wed, 1 Jun 2016 13:35:53 -0700 Subject: [PATCH 126/135] First edit pass. Please push to server. --- docs/getting-started.md | 106 +++++++++++++++++++++++++++------------- 1 file changed, 71 insertions(+), 35 deletions(-) diff --git a/docs/getting-started.md b/docs/getting-started.md index 099c3e65..f9b32acc 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -1,10 +1,14 @@ # Getting started -Are you ready to build cool BBC micro:bit programs? For each challenge, reorder the blocks to recreate the program. +Are you ready to build cool BBC micro:bit programs? -### Show leds +Here are some challenges for you. Unscramble the blocks in the editor +to make real programs that work! -Use the blocks below to draw a figure on the screen. You can redo the smiley face or try something else! +### Show LEDs + +Use the blocks below to draw something. You can draw another smiley +face, or try something else. ```shuffle basic.showLeds(` @@ -16,15 +20,16 @@ basic.showLeds(` `) ``` -To transfer your code to the BBC micro:bit, -* connect your micro:bit to the computer using the USB cable -* click on **Compile** -* drag&drop the **.hex** file into the **MICROBIT** drive -* wait till the yellow light is done blinking! +To move your program from your computer to the BBC micro:bit: +* Connect your micro:bit to the computer with the USB cable. +* Click **Compile**. +* Drag and drop the new file whose name ends in **.hex** into the **MICROBIT** window. +* Wait until the yellow light stops blinking! -### Show animation Forever +### Show Animation Forever -Show one image after the other to create an animation by snapping them together. +Show one image after another by snapping blocks together to create an +animation (like a cartoon)! ```blocks basic.showLeds(` @@ -43,17 +48,20 @@ Show one image after the other to create an animation by snapping them together. `) ``` -To transfer your code to the BBC micro:bit, -* connect your micro:bit to the computer using the USB cable -* click on **Compile** -* drag&drop the **.hex** file into the **MICROBIT** drive -* wait till the yellow light is done blinking! +To move your program from your computer to the BBC micro:bit: +* Connect your micro:bit to the computer with the USB cable. +* Click **Compile**. +* Drag and drop the new file whose name ends in **.hex** into the **MICROBIT** window. +* Wait until the yellow light stops blinking! -### Repeat forever +### Repeat Forever -Use the ``forever`` block to repeat your code and have a continuous animation. +Make an animation that never stops with the ``forever`` block. + +Unscramble these blocks in the editor to make an animation that first +shows a happy face, then an unhappy face, then a happy face, and never +stops. You can also change the pictures to make your own animation. -Unsuffle the blocks to create a happy, unhappy animation.... or changes the image to make it your own! ```shuffle basic.forever(() => { basic.showLeds(` @@ -75,21 +83,32 @@ basic.forever(() => { ### Your turn now! -Use the blocks ``show leds`` and ``forever`` -to create your own custom awesome animation! +Make your own awesome animation with the ``show leds`` and ``forever`` +blocks. + +#### ~hint + +You can make your animation longer if you use more than two pictures. + +#### ~ ### Button A and B -Unshuffle the blocks so that the micro:bit shows "YES" when button A is pressed, and "NO" when B is pressed. -The key idea is that all the blocks nested under `on button ... pressed` will run when that button is pressed. +In the editor, unscramble the blocks below so that the micro:bit shows +**YES** when you press button `A` and **NO** when when you press +button `B`. All of the blocks under `on button A pressed` or `on +button B pressed` should run when you press that button. For example, +this program will show the word `banana` on the LED screen when you +press `B`. ```blocks -input.onButtonPressed(Button.A, () => { - basic.showString("AAAAA"); +input.onButtonPressed(Button.B, () => { + basic.showString("banana"); }); ``` -Try to unshuffle those blocks: +Now try to unscramble these blocks in the editor: + ```shuffle input.onButtonPressed(Button.A, () => { basic.showString("YES"); @@ -101,9 +120,13 @@ input.onButtonPressed(Button.B, () => { ### Shake -Using the data from the **accelerometer**, it is possible to detect that the BBC micro:bit is being shaken. +You can find when someone is shaking the BBC micro:bit with the +**accelerometer** (it finds whether the micro:bit is speeding up or +slowing down). + +Unscramble these blocks in the editor to show a frownie +when someone shakes the micro:bit. -Unshuffle the code to display a frownie when shaken. ```shuffle input.onGesture(Gesture.Shake, () => { basic.showLeds(` @@ -115,12 +138,18 @@ input.onGesture(Gesture.Shake, () => { }); ``` -### Tilting +### Tilting with gestures -Aside from shake, it is also possible to detect tilt left and right, logo up and down or face up and down. -Let's build a rock paper scissors game where you turn the micro:bit left to display paper, right to display scissors and down to display rock. +You can also find when someone is tilting the micro:bit left or right, +face up or face down, and logo up or logo down (the logo is the yellow +oval picture at the top of the board). + +Try to build a Rock Paper Scissors game where you turn the micro:bit +left to show paper, right to show scissors, and down to show rock. + +Unscramble these blocks in the editor and try this program on the +micro:bit itself! -Unshuffle and try this code on the micro:bit itself! ```shuffle input.onGesture(Gesture.TiltLeft, () => { basic.showLeds(` @@ -150,10 +179,16 @@ input.onGesture(Gesture.TiltRight, () => { ### Pins -It is possible to use the pins (big metal bar at the bottom of the board) as button. Hold the ``GND`` button with one hand and press the ``0`` pin -(called ``P0``) with the other hand to trigger a pin pressed. +You can also use the pins as buttons. +(The pins are the holes in the big metal bar at the bottom +of the board.) + +Hold the ``GND`` button with one hand and touch the ``0`` pin (called +``P0``) with your other hand to tell the micro:bit you're pressing it. + +Unscramble the blocks in the editor to show a smiley when you press +pin ``P0``. -Unshuffle the blocks to display a smiley when pin ``P0`` is pressed. ```shuffle input.onPinPressed(TouchPin.P0, () => { basic.showLeds(` @@ -167,4 +202,5 @@ input.onPinPressed(TouchPin.P0, () => { ### Your turn now! -Use the screen, buttons, gestures, pins to create a fun game using the micro:bit. \ No newline at end of file +Use the screen, buttons, gestures, and pins to make your own fun game +with the BBC micro:bit! From 8417d10ad32ba6482bad4e325753b78d8bc1b9c9 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 13:36:56 -0700 Subject: [PATCH 127/135] Bump pxt-core to 0.2.152 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 695ec86b..cebbcd5f 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.149" + "pxt-core": "0.2.152" } } From fc97b59d0e175fad20928bf770affe625f32e30f Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 13:36:58 -0700 Subject: [PATCH 128/135] 0.2.140 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cebbcd5f..b074a653 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.139", + "version": "0.2.140", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From c5571c20c721316f7aa9bfa0453fbdca84995cfa Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 15:06:47 -0700 Subject: [PATCH 129/135] updated release notes --- docs/release-notes.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index d6dd788f..55bc15e6 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -4,7 +4,12 @@ basic.forever(() => { basic.showString("RELEASE NOTES"); }); ``` -## May 2017 +## June 2016 + +* It is now possible to stream data into the cloud (Azure) from the PXT editor. Simply click on the log view to get started. +* Documentation column pops up for large screen to avoid switching between docs and editor. + +## May 2016 We're happy to announce [m.pxt.io](https://m.pxt.io), an Blocks/JavaScript editor for the [BBC micro:bit](https://www.microbit.co.uk). The editor is [open source](/open-source) on GitHub. Send us your PR! From 7b74428275f8bdb25b8249f958967872d153a9c6 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 15:45:40 -0700 Subject: [PATCH 130/135] more glow / stop sound on player stop --- sim/simsvg.ts | 2 +- sim/state.ts | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/sim/simsvg.ts b/sim/simsvg.ts index ac4463d3..45110fa5 100644 --- a/sim/simsvg.ts +++ b/sim/simsvg.ts @@ -446,7 +446,7 @@ svg.sim.grayscale { } @keyframes sim-theme-glow-animation { from { opacity: 1; } - to { opacity: 0.8; } + to { opacity: 0.75; } } .sim-flash { diff --git a/sim/state.ts b/sim/state.ts index c6ef006c..1a4d3606 100644 --- a/sim/state.ts +++ b/sim/state.ts @@ -42,14 +42,14 @@ namespace pxsim { constructor(private runtime: Runtime) { } listen(id: number, evid: number, handler: RefAction) { - let k = id + ':' + evid; + let k = id + ":" + evid; let queue = this.queues[k]; if (!queue) queue = this.queues[k] = new EventQueue(this.runtime); queue.handler = handler; } queue(id: number, evid: number, value: number = 0) { - let k = id + ':' + evid; + let k = id + ":" + evid; let queue = this.queues[k]; if (queue) queue.push(value); } @@ -122,7 +122,7 @@ namespace pxsim { broadcast(msg: number) { Runtime.postMessage({ - type: 'eventbus', + type: "eventbus", id: DAL.MES_BROADCAST_GENERAL_ID, eventid: msg, power: this.power, @@ -551,12 +551,12 @@ namespace pxsim { default: theme = pxsim.micro_bit.randomTheme(); } - console.log('setting up microbit simulator') + console.log("setting up microbit simulator") let view = new pxsim.micro_bit.MicrobitBoardSvg({ theme: theme, runtime: runtime }) - document.body.innerHTML = ''; // clear children + document.body.innerHTML = ""; // clear children document.body.appendChild(view.element); return Promise.resolve(); @@ -581,22 +581,27 @@ namespace pxsim { } readSerial() { - let v = this.serialIn.shift() || ''; + let v = this.serialIn.shift() || ""; return v; } - serialOutBuffer: string = ''; + kill() { + super.kill(); + AudioContextManager.stop(); + } + + serialOutBuffer: string = ""; writeSerial(s: string) { for (let i = 0; i < s.length; ++i) { let c = s[i]; this.serialOutBuffer += c; - if (c == '\n') { + if (c == "\n") { Runtime.postMessage({ - type: 'serial', + type: "serial", data: this.serialOutBuffer, id: runtime.id }) - this.serialOutBuffer = '' + this.serialOutBuffer = "" break; } } From 28d522175baa372a08ec4a53ce8666c79a693b02 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Wed, 1 Jun 2016 16:02:22 -0700 Subject: [PATCH 131/135] Second edit pass. Needs better image examples? --- docs/getting-started.md | 44 ++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/docs/getting-started.md b/docs/getting-started.md index f9b32acc..0d880133 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -7,8 +7,8 @@ to make real programs that work! ### Show LEDs -Use the blocks below to draw something. You can draw another smiley -face, or try something else. +Draw something in the editor with this block. You can draw another +smiley face, or try something else. ```shuffle basic.showLeds(` @@ -26,9 +26,9 @@ To move your program from your computer to the BBC micro:bit: * Drag and drop the new file whose name ends in **.hex** into the **MICROBIT** window. * Wait until the yellow light stops blinking! -### Show Animation Forever +### Show animation forever -Show one image after another by snapping blocks together to create an +Show one picture after another by snapping blocks together to create an animation (like a cartoon)! ```blocks @@ -60,7 +60,7 @@ Make an animation that never stops with the ``forever`` block. Unscramble these blocks in the editor to make an animation that first shows a happy face, then an unhappy face, then a happy face, and never -stops. You can also change the pictures to make your own animation. +stops. ```shuffle basic.forever(() => { @@ -81,8 +81,9 @@ basic.forever(() => { }); ``` -### Your turn now! +### Your turn! +You can also change the pictures to make your own animation. Make your own awesome animation with the ``show leds`` and ``forever`` blocks. @@ -94,12 +95,8 @@ You can make your animation longer if you use more than two pictures. ### Button A and B -In the editor, unscramble the blocks below so that the micro:bit shows -**YES** when you press button `A` and **NO** when when you press -button `B`. All of the blocks under `on button A pressed` or `on -button B pressed` should run when you press that button. For example, -this program will show the word `banana` on the LED screen when you -press `B`. +This program will show the word `banana` on the LED +screen when you press button `B`. ```blocks input.onButtonPressed(Button.B, () => { @@ -107,7 +104,10 @@ input.onButtonPressed(Button.B, () => { }); ``` -Now try to unscramble these blocks in the editor: +Now try to unscramble these blocks in the editor so that the micro:bit +shows **YES** when you press button `A` and **NO** when when you press +button `B`. All of the blocks under `on button A pressed` or `on +button B pressed` should run when you press that button. ```shuffle input.onButtonPressed(Button.A, () => { @@ -120,12 +120,12 @@ input.onButtonPressed(Button.B, () => { ### Shake -You can find when someone is shaking the BBC micro:bit with the +You can find when someone is shaking the BBC micro:bit by checking its **accelerometer** (it finds whether the micro:bit is speeding up or slowing down). -Unscramble these blocks in the editor to show a frownie -when someone shakes the micro:bit. +Unscramble these blocks in the editor to show a frownie when someone +shakes the micro:bit. ```shuffle input.onGesture(Gesture.Shake, () => { @@ -144,7 +144,7 @@ You can also find when someone is tilting the micro:bit left or right, face up or face down, and logo up or logo down (the logo is the yellow oval picture at the top of the board). -Try to build a Rock Paper Scissors game where you turn the micro:bit +Try to build a Rock Paper Scissors game where you tilt the micro:bit left to show paper, right to show scissors, and down to show rock. Unscramble these blocks in the editor and try this program on the @@ -179,11 +179,9 @@ input.onGesture(Gesture.TiltRight, () => { ### Pins -You can also use the pins as buttons. -(The pins are the holes in the big metal bar at the bottom -of the board.) - -Hold the ``GND`` button with one hand and touch the ``0`` pin (called +You can also use the pins as buttons. (The pins are the holes in the +metal bar at the bottom of the micro:bit board.) For example, hold +the ``GND`` button with one hand and touch the ``0`` pin (called ``P0``) with your other hand to tell the micro:bit you're pressing it. Unscramble the blocks in the editor to show a smiley when you press @@ -200,7 +198,7 @@ input.onPinPressed(TouchPin.P0, () => { }); ``` -### Your turn now! +### Your turn! Use the screen, buttons, gestures, and pins to make your own fun game with the BBC micro:bit! From d59d7cb19fddc572aaaac8743985722756829bf7 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 16:13:14 -0700 Subject: [PATCH 132/135] Bump pxt-core to 0.2.153 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b074a653..1bbb5e1f 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.152" + "pxt-core": "0.2.153" } } From be284c5e52d436e57d457aba91dda52db466f2d5 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 1 Jun 2016 16:13:16 -0700 Subject: [PATCH 133/135] 0.2.141 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1bbb5e1f..78de90b3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.140", + "version": "0.2.141", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", From 985ed569848e5dacd2d7222444b064fcfaa611be Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Wed, 1 Jun 2016 16:29:43 -0700 Subject: [PATCH 134/135] Fixed typo. --- docs/getting-started.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/getting-started.md b/docs/getting-started.md index 0d880133..e160b0fd 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -106,8 +106,8 @@ input.onButtonPressed(Button.B, () => { Now try to unscramble these blocks in the editor so that the micro:bit shows **YES** when you press button `A` and **NO** when when you press -button `B`. All of the blocks under `on button A pressed` or `on -button B pressed` should run when you press that button. +button `B`. All of the blocks under `on button A pressed` or +`on button B pressed` should run when you press that button. ```shuffle input.onButtonPressed(Button.A, () => { From a3d559c7afa763776470cdd5dba6216390778950 Mon Sep 17 00:00:00 2001 From: Ron Hale-Evans Date: Wed, 1 Jun 2016 17:11:28 -0700 Subject: [PATCH 135/135] Rewrite for simplicity. --- docs/reference/radio/set-group.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/reference/radio/set-group.md b/docs/reference/radio/set-group.md index 16c91118..a76de54d 100644 --- a/docs/reference/radio/set-group.md +++ b/docs/reference/radio/set-group.md @@ -1,16 +1,22 @@ # Set Group -Sets the group id for ``radio`` communications. A micro:bit can only listen to one group ID at any time. +Make a program have the group ID you tell it for sending and receiving +with ``radio``. A group is like a cable channel (a micro:bit can only +send or receive in one group at a time). A group ID is like the cable +channel number. -Unless specified, the group id is automatically inferred from the script source. Every script with the same exact source code with start with the same group id. +If you do not tell your program which group ID to use with this +function, it will figure out its own group ID by itself. If you load +the very same program onto two different micro:bits, they will be able +to talk to each other because they will have the same group ID. ### Parameters -* ``id`` -- a [number](/reference/types/number) between ``0`` and ``255``. +* ``id`` is a [number](/reference/types/number) from ``0`` to ``255``. ### Example -Sets the group to 128. +This program makes the group ID equal 128. ```blocks radio.setGroup(128)