merging ble changes

This commit is contained in:
Peli de Halleux 2016-10-18 21:55:02 -07:00
commit 28a8f21d40
18 changed files with 305 additions and 175 deletions

View File

@ -5,7 +5,8 @@
### Things to do ### Things to do
* **[Getting Started](/getting-started)** * **[Getting Started](/getting-started)**
* [Ten projects](/projects) * [Projects](/projects)
* [Lessons](/lessons)
### Micro:bit reference ### Micro:bit reference
@ -16,16 +17,15 @@
* [Blocks language](/blocks) * [Blocks language](/blocks)
* [JavaScript language](/javascript) * [JavaScript language](/javascript)
* [Streaming data](/streaming)
### More questions? ### More questions?
* [Frequently Asked Question](/faq) * [Frequently Asked Question](/faq)
* [Embedding project](/share)
* [Help Translate](/translate) * [Help Translate](/translate)
* [Release notes](/release-notes) * [Embedding project](/share)
### Developers ### Developers
* [Command Line Interface](/cli) * [Command Line Interface](/cli)
* Learn about [packages](/packages) * Learn about [packages](/packages)
* [Release notes](/release-notes)

View File

@ -2,6 +2,14 @@
Support for additional Bluetooth services. Support for additional Bluetooth services.
### ~hint
![](/static/bluetooth/Bluetooth_SIG.png)
For another device like a smartphone to use any of the Bluetooth "services" which the micro:bit has, it must first be [paired with the micro:bit](/reference/bluetooth/bluetooth-pairing). Once paired, the other device may connect to the micro:bit and exchange data relating to many of the micro:bit's features.
### ~
```cards ```cards
bluetooth.startAccelerometerService(); bluetooth.startAccelerometerService();
bluetooth.startButtonService(); bluetooth.startButtonService();
@ -9,20 +17,34 @@ bluetooth.startIOPinService();
bluetooth.startLEDService(); bluetooth.startLEDService();
bluetooth.startMagnetometerService(); bluetooth.startMagnetometerService();
bluetooth.startTemperatureService(); bluetooth.startTemperatureService();
bluetooth.uartRead(""); bluetooth.onBluetoothConnected(() => {});
bluetooth.uartWrite(""); bluetooth.onBluetoothDisconnected(() => {});
bluetooth.onBluetoothConnected(() => { ```
}); ## UART
bluetooth.onBluetoothDisconnected(() => {
```cards
}); bluetooth.startUartService();
bluetooth.uartReadUntil("");
bluetooth.uartWriteString("");
bluetooth.uartWriteNumber(0);
bluetooth.uartWriteValue("", 0);
``` ```
```package ```package
microbit-bluetooth microbit-bluetooth
``` ```
### Advanced
For more advanced information on the micro:bit Bluetooth UART service including information on using a smartphone, see the [Lancaster University micro:bit runtime technical documentation](http://lancaster-university.github.io/microbit-docs/ble/uart-service/)
### See Also ### See Also
[startAccelerometerService](/reference/bluetooth/start-accelerometer-service), [startButtonService](/reference/bluetooth/start-button-service), [startIOPinService](/reference/bluetooth/start-io-pin-service), [startLEDService](/reference/bluetooth/start-led-service), [startMagnetometerService](/reference/bluetooth/start-magnetometer-service), [startTemperatureService](/reference/bluetooth/start-temperature-service), [uartRead](/reference/bluetooth/uart-read), [uartWrite](/reference/bluetooth/uart-write), [onBluetoothConnected](/reference/bluetooth/on-bluetooth-connected), [onBluetoothDisconnected](/reference/bluetooth/on-bluetooth-disconnected) [startAccelerometerService](/reference/bluetooth/start-accelerometer-service), [startButtonService](/reference/bluetooth/start-button-service), [startIOPinService](/reference/bluetooth/start-io-pin-service), [startLEDService](/reference/bluetooth/start-led-service), [startMagnetometerService](/reference/bluetooth/start-magnetometer-service), [startTemperatureService](/reference/bluetooth/start-temperature-service),
[startUartService](/reference/bluetooth/start-uart-service),
[uartReadUntil](/reference/bluetooth/uart-read-until),
[uartWriteString](/reference/bluetooth/uart-write-string),
[uartWriteNumber](/reference/bluetooth/uart-write-number),
[uartWriteValue](/reference/bluetooth/uart-write-value),
[onBluetoothConnected](/reference/bluetooth/on-bluetooth-connected), [onBluetoothDisconnected](/reference/bluetooth/on-bluetooth-disconnected)

View File

@ -12,7 +12,7 @@ The [Bluetooth UART service](start-uart-service.md) allows another device such a
With the Bluetooth UART service running, this block allows a micro:bit to read data which has been received from a Bluetooth connected device, terminating reading and returning the value obtained as soon as a specified delimiter character is encountered. This means that connected devices can send data to the micro:bit and indicate that the complete message has been sent by appending the message with the delimiter character. With the Bluetooth UART service running, this block allows a micro:bit to read data which has been received from a Bluetooth connected device, terminating reading and returning the value obtained as soon as a specified delimiter character is encountered. This means that connected devices can send data to the micro:bit and indicate that the complete message has been sent by appending the message with the delimiter character.
```sig ```sig
bluetooth.uartRead(""); bluetooth.uartReadUntil("");
``` ```
### Example: Starting the Bluetooth UART service and then reading data received from another device which is terminated by ":" character and then displaying it ### Example: Starting the Bluetooth UART service and then reading data received from another device which is terminated by ":" character and then displaying it
@ -25,7 +25,7 @@ bluetooth.onBluetoothConnected(() => {
basic.showString("C"); basic.showString("C");
connected = 1; connected = 1;
while (connected == 1) { while (connected == 1) {
uartData = bluetooth.uartRead(":"); uartData = bluetooth.uartReadUntil(":");
basic.showString(uartData); basic.showString(uartData);
} }
}); });

View File

@ -0,0 +1,28 @@
# UART Write Number
### ~hint
![](/static/bluetooth/Bluetooth_SIG.png)
For another device like a smartphone to use any of the Bluetooth "services" which the micro:bit has, it must first be [paired with the micro:bit](/reference/bluetooth/bluetooth-pairing). Once paired, the other device may connect to the micro:bit and exchange data relating to many of the micro:bit's features.
### ~
The [Bluetooth UART service](/reference/bluetooth/start-uart-service.md) allows another device such as a smartphone to exchange any data it wants to with the micro:bit, in small chunks.
With the Bluetooth UART service running, this block allows a micro:bit to send data to a Bluetooth connected device.
```sig
bluetooth.uartWriteNumber(42);
```
### Advanced
For more advanced information on the micro:bit Bluetooth UART service including information on using a smartphone, see the [Lancaster University micro:bit runtime technical documentation](http://lancaster-university.github.io/microbit-docs/ble/uart-service/)
### See also
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
microbit-bluetooth
```

View File

@ -1,4 +1,4 @@
# UART Write # UART Write String
### ~hint ### ~hint
![](/static/bluetooth/Bluetooth_SIG.png) ![](/static/bluetooth/Bluetooth_SIG.png)
@ -7,12 +7,12 @@ For another device like a smartphone to use any of the Bluetooth "services" whic
### ~ ### ~
The [Bluetooth UART service](start-uart-service.md) allows another device such as a smartphone to exchange any data it wants to with the micro:bit, in small chunks. The [Bluetooth UART service](/reference/bluetooth/start-uart-service.md) allows another device such as a smartphone to exchange any data it wants to with the micro:bit, in small chunks.
With the Bluetooth UART service running, this block allows a micro:bit to send data to a Bluetooth connected device. With the Bluetooth UART service running, this block allows a micro:bit to send data to a Bluetooth connected device.
```sig ```sig
bluetooth.uartWrite(""); bluetooth.uartWriteString("");
``` ```
### Example: Starting the Bluetooth UART service and then sending "HELLO" whenever button A is pressed and another device has connected over Bluetooth ### Example: Starting the Bluetooth UART service and then sending "HELLO" whenever button A is pressed and another device has connected over Bluetooth
@ -29,7 +29,7 @@ bluetooth.onBluetoothDisconnected(() => {
}); });
input.onButtonPressed(Button.A, () => { input.onButtonPressed(Button.A, () => {
if (connected == 1) { if (connected == 1) {
bluetooth.uartWrite("HELLO"); bluetooth.uartWriteString("HELLO");
} }
}); });
``` ```

View File

@ -0,0 +1,28 @@
# UART Write Value
### ~hint
![](/static/bluetooth/Bluetooth_SIG.png)
For another device like a smartphone to use any of the Bluetooth "services" which the micro:bit has, it must first be [paired with the micro:bit](/reference/bluetooth/bluetooth-pairing). Once paired, the other device may connect to the micro:bit and exchange data relating to many of the micro:bit's features.
### ~
The [Bluetooth UART service](/reference/bluetooth/start-uart-service.md) allows another device such as a smartphone to exchange any data it wants to with the micro:bit, in small chunks.
With the Bluetooth UART service running, this block allows a micro:bit to send data to a Bluetooth connected device.
```sig
bluetooth.uartWriteValue("x", 42);
```
### Advanced
For more advanced information on the micro:bit Bluetooth UART service including information on using a smartphone, see the [Lancaster University micro:bit runtime technical documentation](http://lancaster-university.github.io/microbit-docs/ble/uart-service/)
### See also
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
microbit-bluetooth
```

View File

@ -16,13 +16,9 @@ You will find two files in that project:
## Translating the blocks and reference documentation ## Translating the blocks and reference documentation
The project below contains the resources from the blocks and functions using in the https://codethemicrobit.com. You will find package files under ``/microbit`` , one for the block definition and one for the descriptions:
* [https://crowdin.com/project/pxt-microbit](https://crowdin.com/project/pxt-microbit) * ``core-strings.json``: contains the block definitions
* ``core-jsdoc-strings.json``: contains the descriptions
You will find two files for each package available in the micro:bit, one for the block definition and one for the descriptions:
* ``microbit-strings.json``: contains the block definitions
* ``microbit-jsdoc-strings.json``: contains the descriptions
The block definition should be carefully translated using the [block definition syntax](https://www.pxt.io/defining-blocks). The block definition should be carefully translated using the [block definition syntax](https://www.pxt.io/defining-blocks).

View File

@ -4,22 +4,6 @@
using namespace pxt; using namespace pxt;
enum Delimiters {
//% block="new line"
NewLine = 1,
//% block=","
Comma = 2,
//% block="$"
Dollar = 3,
//% block=":"
Colon = 4,
//% block="."
Fullstop = 5,
//% block="#"
Hash = 6,
};
/** /**
* Support for additional Bluetooth services. * Support for additional Bluetooth services.
*/ */
@ -27,12 +11,33 @@ enum Delimiters {
namespace bluetooth { namespace bluetooth {
MicroBitUARTService *uart = NULL; MicroBitUARTService *uart = NULL;
/**
* Starts the Bluetooth accelerometer service
*/
//% help=bluetooth/start-accelerometer-service
//% blockId=bluetooth_start_accelerometer_service block="bluetooth accelerometer service"
//% parts="bluetooth" weight=90 blockGap=8
void startAccelerometerService() {
new MicroBitAccelerometerService(*uBit.ble, uBit.accelerometer);
}
/**
* Starts the Bluetooth button service
*/
//% help=bluetooth/start-button-service
//% blockId=bluetooth_start_button_service block="bluetooth button service" blockGap=8
//% parts="bluetooth" weight=89
void startButtonService() {
new MicroBitButtonService(*uBit.ble);
}
/** /**
* Starts the Bluetooth IO pin service. * Starts the Bluetooth IO pin service.
*/ */
//% help=bluetooth/start-io-pin-service //% help=bluetooth/start-io-pin-service
//% blockId=bluetooth_start_io_pin_service block="bluetooth io pin service" blockGap=8 //% blockId=bluetooth_start_io_pin_service block="bluetooth io pin service" blockGap=8
//% parts="bluetooth" //% parts="bluetooth" weight=88
void startIOPinService() { void startIOPinService() {
new MicroBitIOPinService(*uBit.ble, uBit.io); new MicroBitIOPinService(*uBit.ble, uBit.io);
} }
@ -42,7 +47,7 @@ namespace bluetooth {
*/ */
//% help=bluetooth/start-led-service //% help=bluetooth/start-led-service
//% blockId=bluetooth_start_led_service block="bluetooth led service" blockGap=8 //% blockId=bluetooth_start_led_service block="bluetooth led service" blockGap=8
//% parts="bluetooth" //% parts="bluetooth" weight=87
void startLEDService() { void startLEDService() {
new MicroBitLEDService(*uBit.ble, uBit.display); new MicroBitLEDService(*uBit.ble, uBit.display);
} }
@ -52,7 +57,7 @@ namespace bluetooth {
*/ */
//% help=bluetooth/start-temperature-service //% help=bluetooth/start-temperature-service
//% blockId=bluetooth_start_temperature_service block="bluetooth temperature service" blockGap=8 //% blockId=bluetooth_start_temperature_service block="bluetooth temperature service" blockGap=8
//% parts="bluetooth" //% parts="bluetooth" weight=86
void startTemperatureService() { void startTemperatureService() {
new MicroBitTemperatureService(*uBit.ble, uBit.thermometer); new MicroBitTemperatureService(*uBit.ble, uBit.thermometer);
} }
@ -61,38 +66,19 @@ namespace bluetooth {
* Starts the Bluetooth magnetometer service * Starts the Bluetooth magnetometer service
*/ */
//% help=bluetooth/start-magnetometer-service //% help=bluetooth/start-magnetometer-service
//% blockId=bluetooth_start_magnetometer_service block="bluetooth magnetometer service" blockGap=8 //% blockId=bluetooth_start_magnetometer_service block="bluetooth magnetometer service"
//% parts="bluetooth" //% parts="bluetooth" weight=85
void startMagnetometerService() { void startMagnetometerService() {
new MicroBitMagnetometerService(*uBit.ble, uBit.compass); new MicroBitMagnetometerService(*uBit.ble, uBit.compass);
} }
/**
* Starts the Bluetooth accelerometer service
*/
//% help=bluetooth/start-accelerometer-service
//% blockId=bluetooth_start_accelerometer_service block="bluetooth accelerometer service" blockGap=8
//% parts="bluetooth"
void startAccelerometerService() {
new MicroBitAccelerometerService(*uBit.ble, uBit.accelerometer);
}
/**
* Starts the Bluetooth button service
*/
//% help=bluetooth/start-button-service
//% blockId=bluetooth_start_button_service block="bluetooth button service" blockGap=8
//% parts="bluetooth"
void startButtonService() {
new MicroBitButtonService(*uBit.ble);
}
/** /**
* Starts the Bluetooth UART service * Starts the Bluetooth UART service
*/ */
//% help=bluetooth/start-uart-service //% help=bluetooth/start-uart-service
//% blockId=bluetooth_start_uart_service block="bluetooth uart service" blockGap=8 //% blockId=bluetooth_start_uart_service block="bluetooth uart service"
//% parts="bluetooth" //% parts="bluetooth" advanced=true
void startUartService() { void startUartService() {
if (uart) return; if (uart) return;
// 61 octet buffer size is 3 x (MTU - 3) + 1 // 61 octet buffer size is 3 x (MTU - 3) + 1
@ -102,13 +88,13 @@ namespace bluetooth {
} }
//% //%
void uartWrite(StringData *data) { void uartWriteString(StringData *data) {
startUartService(); startUartService();
uart->send(ManagedString(data)); uart->send(ManagedString(data));
} }
//% //%
StringData* uartRead(StringData *del) { StringData* uartReadUntil(StringData *del) {
startUartService(); startUartService();
return uart->readUntil(ManagedString(del)).leakData(); return uart->readUntil(ManagedString(del)).leakData();
} }
@ -133,7 +119,5 @@ namespace bluetooth {
//% parts="bluetooth" //% parts="bluetooth"
void onBluetoothDisconnected(Action body) { void onBluetoothDisconnected(Action body) {
registerWithDal(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_DISCONNECTED, body); registerWithDal(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_DISCONNECTED, body);
} }
} }

View File

@ -1,42 +1,48 @@
/**
* Support for additional Bluetooth services.
*/
//% color=#0082FB weight=20
namespace bluetooth { namespace bluetooth {
/**
* Returns the delimiter corresponding string
*/
//% blockId="bluetooth_uart_delimiter_conv" block="%del"
//% weight=1 parts="bluetooth"
export function delimiters(del: Delimiters): string {
// even though it might not look like, this is more
// (memory) efficient than the C++ implementation, because the
// strings are statically allocated and take no RAM
switch (del) {
case Delimiters.NewLine: return "\n"
case Delimiters.Comma: return ","
case Delimiters.Dollar: return "$"
case Delimiters.Colon: return ":"
case Delimiters.Fullstop: return "."
case Delimiters.Hash: return "#"
default: return "\n"
}
}
/** /**
* Writes to the Bluetooth UART service buffer. From there the data is transmitted over Bluetooth to a connected device. * Writes to the Bluetooth UART service buffer. From there the data is transmitted over Bluetooth to a connected device.
*/ */
//% help=bluetooth/uart-write //% help=bluetooth/uart-write-string weight=80
//% blockId=bluetooth_uart_write block="bluetooth uart write %data" blockGap=8 //% blockId=bluetooth_uart_write block="bluetooth uart|write string %data" blockGap=8
//% parts="bluetooth" shim=bluetooth::uartWrite //% parts="bluetooth" shim=bluetooth::uartWriteString advanced=true
export function uartWrite(data: string): void { export function uartWriteString(data: string): void {
// dummy implementation for simulator // dummy implementation for simulator
console.log("UART Write: " + data) console.log("UART Write: " + data)
} }
/**
* Prints a numeric value to the serial
*/
//% help=bluetooth/uart-write-number weight=79
//% weight=89 blockGap=8 advanced=true
//% blockId=bluetooth_uart_writenumber block="bluetooth uart|write number %value"
export function uartWriteNumber(value: number): void {
uartWriteString(value.toString());
}
/**
* Writes a ``name: value`` pair line to the serial.
* @param name name of the value stream, eg: x
* @param value to write
*/
//% weight=88 weight=78
//% help=bluetooth/uart-write-value advanced=true
//% blockId=bluetooth_uart_writevalue block="bluetooth uart|write value %name|= %value"
export function uartWriteValue(name: string, value: number): void {
uartWriteString(name + ":" + value + "\r\n");
}
/** /**
* Reads from the Bluetooth UART service buffer, returning its contents when the specified delimiter character is encountered. * Reads from the Bluetooth UART service buffer, returning its contents when the specified delimiter character is encountered.
*/ */
//% help=bluetooth/uart-read //% help=bluetooth/uart-read-until weight=75
//% blockId=bluetooth_uart_read block="bluetooth uart read %del=bluetooth_uart_delimiter_conv" blockGap=8 //% blockId=bluetooth_uart_read block="bluetooth uart|read until %del=serial_delimiter_conv"
//% parts="bluetooth" shim=bluetooth::uartRead //% parts="bluetooth" shim=bluetooth::uartReadUntil advanced=true
export function uartRead(del: string): string { export function uartReadUntil(del: string): string {
// dummy implementation for simulator // dummy implementation for simulator
return "???" return "???"
} }

View File

@ -1,20 +1,4 @@
// Auto-generated. Do not edit. // Auto-generated. Do not edit.
declare enum Delimiters {
//% block="new line"
NewLine = 1,
//% block=","
Comma = 2,
//% block="$"
Dollar = 3,
//% block=":"
Colon = 4,
//% block="."
Fullstop = 5,
//% block="#"
Hash = 6,
}
declare namespace bluetooth { declare namespace bluetooth {
} }

View File

@ -7,44 +7,12 @@
//% color=#0082FB weight=20 //% color=#0082FB weight=20
declare namespace bluetooth { declare namespace bluetooth {
/**
* Starts the Bluetooth IO pin service.
*/
//% help=bluetooth/start-io-pin-service
//% blockId=bluetooth_start_io_pin_service block="bluetooth io pin service" blockGap=8
//% parts="bluetooth" shim=bluetooth::startIOPinService
function startIOPinService(): void;
/**
* Starts the Bluetooth LED service
*/
//% help=bluetooth/start-led-service
//% blockId=bluetooth_start_led_service block="bluetooth led service" blockGap=8
//% parts="bluetooth" shim=bluetooth::startLEDService
function startLEDService(): void;
/**
* Starts the Bluetooth temperature service
*/
//% help=bluetooth/start-temperature-service
//% blockId=bluetooth_start_temperature_service block="bluetooth temperature service" blockGap=8
//% parts="bluetooth" shim=bluetooth::startTemperatureService
function startTemperatureService(): void;
/**
* Starts the Bluetooth magnetometer service
*/
//% help=bluetooth/start-magnetometer-service
//% blockId=bluetooth_start_magnetometer_service block="bluetooth magnetometer service" blockGap=8
//% parts="bluetooth" shim=bluetooth::startMagnetometerService
function startMagnetometerService(): void;
/** /**
* Starts the Bluetooth accelerometer service * Starts the Bluetooth accelerometer service
*/ */
//% help=bluetooth/start-accelerometer-service //% help=bluetooth/start-accelerometer-service
//% blockId=bluetooth_start_accelerometer_service block="bluetooth accelerometer service" blockGap=8 //% blockId=bluetooth_start_accelerometer_service block="bluetooth accelerometer service"
//% parts="bluetooth" shim=bluetooth::startAccelerometerService //% parts="bluetooth" weight=90 blockGap=8 shim=bluetooth::startAccelerometerService
function startAccelerometerService(): void; function startAccelerometerService(): void;
/** /**
@ -52,15 +20,47 @@ declare namespace bluetooth {
*/ */
//% help=bluetooth/start-button-service //% help=bluetooth/start-button-service
//% blockId=bluetooth_start_button_service block="bluetooth button service" blockGap=8 //% blockId=bluetooth_start_button_service block="bluetooth button service" blockGap=8
//% parts="bluetooth" shim=bluetooth::startButtonService //% parts="bluetooth" weight=89 shim=bluetooth::startButtonService
function startButtonService(): void; function startButtonService(): void;
/**
* Starts the Bluetooth IO pin service.
*/
//% help=bluetooth/start-io-pin-service
//% blockId=bluetooth_start_io_pin_service block="bluetooth io pin service" blockGap=8
//% parts="bluetooth" weight=88 shim=bluetooth::startIOPinService
function startIOPinService(): void;
/**
* Starts the Bluetooth LED service
*/
//% help=bluetooth/start-led-service
//% blockId=bluetooth_start_led_service block="bluetooth led service" blockGap=8
//% parts="bluetooth" weight=87 shim=bluetooth::startLEDService
function startLEDService(): void;
/**
* Starts the Bluetooth temperature service
*/
//% help=bluetooth/start-temperature-service
//% blockId=bluetooth_start_temperature_service block="bluetooth temperature service" blockGap=8
//% parts="bluetooth" weight=86 shim=bluetooth::startTemperatureService
function startTemperatureService(): void;
/**
* Starts the Bluetooth magnetometer service
*/
//% help=bluetooth/start-magnetometer-service
//% blockId=bluetooth_start_magnetometer_service block="bluetooth magnetometer service"
//% parts="bluetooth" weight=85 shim=bluetooth::startMagnetometerService
function startMagnetometerService(): void;
/** /**
* Starts the Bluetooth UART service * Starts the Bluetooth UART service
*/ */
//% help=bluetooth/start-uart-service //% help=bluetooth/start-uart-service
//% blockId=bluetooth_start_uart_service block="bluetooth uart service" blockGap=8 //% blockId=bluetooth_start_uart_service block="bluetooth uart service"
//% parts="bluetooth" shim=bluetooth::startUartService //% parts="bluetooth" advanced=true shim=bluetooth::startUartService
function startUartService(): void; function startUartService(): void;
/** /**

16
libs/core/enums.d.ts vendored
View File

@ -311,6 +311,22 @@ declare namespace motors {
//% block=9600 //% block=9600
BaudRate9600 = 9600, BaudRate9600 = 9600,
} }
declare enum Delimiters {
//% block="new line"
NewLine = 1,
//% block=","
Comma = 2,
//% block="$"
Dollar = 3,
//% block=":"
Colon = 4,
//% block="."
Fullstop = 5,
//% block="#"
Hash = 6,
}
declare namespace serial { declare namespace serial {
} }

View File

@ -1,6 +1,6 @@
#include "ksbit.h" #include "ksbit.h"
enum class SerialPin { enum SerialPin {
P0 = MICROBIT_ID_IO_P0, P0 = MICROBIT_ID_IO_P0,
P1 = MICROBIT_ID_IO_P1, P1 = MICROBIT_ID_IO_P1,
P2 = MICROBIT_ID_IO_P2, P2 = MICROBIT_ID_IO_P2,
@ -12,36 +12,52 @@ enum class SerialPin {
//P16 = MICROBIT_ID_IO_P16 //P16 = MICROBIT_ID_IO_P16
}; };
enum class BaudRate { enum BaudRate {
//% block=115200 //% block=115200
BaudRate115200 = 115200, BaudRate115200 = 115200,
//% block=9600 //% block=9600
BaudRate9600 = 9600 BaudRate9600 = 9600
}; };
enum Delimiters {
//% block="new line"
NewLine = 1,
//% block=","
Comma = 2,
//% block="$"
Dollar = 3,
//% block=":"
Colon = 4,
//% block="."
Fullstop = 5,
//% block="#"
Hash = 6,
};
//% weight=2 color=30 //% weight=2 color=30
//% advanced=true //% advanced=true
namespace serial { namespace serial {
// note that at least one // followed by % is needed per declaration! // note that at least one // followed by % is needed per declaration!
/** /**
* Reads a line of text from the serial port. * Reads a line of text from the serial port and returns the buffer when the delimiter is met.
* @param delimiter text delimiter that separates each text chunk
*/ */
//% help=serial/read-line //% help=serial/read-until
//% blockId=serial_read_line block="serial read line" //% blockId=serial_read_until block="serial|read until %delimiter=serial_delimiter_conv"
//% weight=20 //% weight=19
StringData* readLine() { StringData* readUntil(StringData* delimiter) {
return uBit.serial.readUntil(ManagedString("\n")).leakData(); return uBit.serial.readUntil(ManagedString(delimiter)).leakData();
} }
/** /**
* Sends a piece of text through Serial connection. * Reads a line of text from the serial port.
*/ */
//% help=serial/write-string //% help=serial/read-line
//% weight=87 //% blockId=serial_read_line block="serial|read line"
//% blockId=serial_writestring block="serial write string %text" //% weight=20 blockGap=8
void writeString(StringData *text) { StringData* readLine() {
uBit.serial.send(ManagedString(text)); return readUntil(ManagedString("\n").leakData());
} }
/** /**
@ -49,12 +65,22 @@ namespace serial {
* @param delimiters the characters to match received characters against. eg:"\n" * @param delimiters the characters to match received characters against. eg:"\n"
*/ */
// help=serial/on-data-received // help=serial/on-data-received
// weight=19 // weight=18
void onDataReceived(StringData* delimiters, Action body) { void onDataReceived(StringData* delimiters, Action body) {
uBit.serial.eventOn(ManagedString(delimiters)); uBit.serial.eventOn(ManagedString(delimiters));
registerWithDal(MICROBIT_ID_SERIAL, MICROBIT_SERIAL_EVT_DELIM_MATCH, body); registerWithDal(MICROBIT_ID_SERIAL, MICROBIT_SERIAL_EVT_DELIM_MATCH, body);
} }
/**
* Sends a piece of text through Serial connection.
*/
//% help=serial/write-string
//% weight=87
//% blockId=serial_writestring block="serial|write string %text"
void writeString(StringData *text) {
uBit.serial.send(ManagedString(text));
}
/** /**
* Dynamically configuring the serial instance to use pins other than USBTX and USBRX. * Dynamically configuring the serial instance to use pins other than USBTX and USBRX.
* @param tx the new transmission pins * @param tx the new transmission pins
@ -63,7 +89,7 @@ namespace serial {
*/ */
//% weight=10 //% weight=10
//% help=serial/redirect-to //% help=serial/redirect-to
//% blockId=serial_redirect block="serial redirect to|TX %tx|RX %rx|at baud rate %rate" //% blockId=serial_redirect block="serial|redirect to|TX %tx|RX %rx|at baud rate %rate"
//% blockExternalInputs=1 //% blockExternalInputs=1
void redirect(SerialPin tx, SerialPin rx, BaudRate rate) { void redirect(SerialPin tx, SerialPin rx, BaudRate rate) {
uBit.serial.redirect((PinName)tx, (PinName)rx); uBit.serial.redirect((PinName)tx, (PinName)rx);

View File

@ -46,4 +46,24 @@ namespace serial {
export function onLineReceived(body: Action): void { export function onLineReceived(body: Action): void {
// serial.onDataReceived("\n", body); // serial.onDataReceived("\n", body);
} }
/**
* Returns the delimiter corresponding string
*/
//% blockId="serial_delimiter_conv" block="%del"
//% weight=1
export function delimiters(del: Delimiters): string {
// even though it might not look like, this is more
// (memory) efficient than the C++ implementation, because the
// strings are statically allocated and take no RAM
switch (del) {
case Delimiters.NewLine: return "\n"
case Delimiters.Comma: return ","
case Delimiters.Dollar: return "$"
case Delimiters.Colon: return ":"
case Delimiters.Fullstop: return "."
case Delimiters.Hash: return "#"
default: return "\n"
}
}
} }

17
libs/core/shims.d.ts vendored
View File

@ -671,12 +671,21 @@ declare namespace pins {
//% advanced=true //% advanced=true
declare namespace serial { declare namespace serial {
/**
* Reads a line of text from the serial port and returns the buffer when the delimiter is met.
* @param delimiter text delimiter that separates each text chunk
*/
//% help=serial/read-until
//% blockId=serial_read_until block="serial|read until %delimiter=serial_delimiter_conv"
//% weight=19 shim=serial::readUntil
function readUntil(delimiter: string): string;
/** /**
* Reads a line of text from the serial port. * Reads a line of text from the serial port.
*/ */
//% help=serial/read-line //% help=serial/read-line
//% blockId=serial_read_line block="serial read line" //% blockId=serial_read_line block="serial|read line"
//% weight=20 shim=serial::readLine //% weight=20 blockGap=8 shim=serial::readLine
function readLine(): string; function readLine(): string;
/** /**
@ -684,7 +693,7 @@ declare namespace serial {
*/ */
//% help=serial/write-string //% help=serial/write-string
//% weight=87 //% weight=87
//% blockId=serial_writestring block="serial write string %text" shim=serial::writeString //% blockId=serial_writestring block="serial|write string %text" shim=serial::writeString
function writeString(text: string): void; function writeString(text: string): void;
/** /**
@ -695,7 +704,7 @@ declare namespace serial {
*/ */
//% weight=10 //% weight=10
//% help=serial/redirect-to //% help=serial/redirect-to
//% blockId=serial_redirect block="serial redirect to|TX %tx|RX %rx|at baud rate %rate" //% blockId=serial_redirect block="serial|redirect to|TX %tx|RX %rx|at baud rate %rate"
//% blockExternalInputs=1 shim=serial::redirect //% blockExternalInputs=1 shim=serial::redirect
function redirect(tx: SerialPin, rx: SerialPin, rate: BaudRate): void; function redirect(tx: SerialPin, rx: SerialPin, rate: BaudRate): void;
} }

View File

@ -80,6 +80,13 @@
"microbit-pins": "", "microbit-pins": "",
"microbit-serial": "" "microbit-serial": ""
} }
},
{
"type": "api",
"map": {
"bluetooth\\.uartRead\\((.*?)\\)" : "bluetooth.uartReadUntil($1)",
"bluetooth\\.uartWrite\\((.*?)\\)" : "bluetooth.uartWriteUntil($1)"
}
} }
] ]
}, },

View File

@ -168,7 +168,7 @@ namespace pxsim.bluetooth {
export function uartWrite(s : string): void { export function uartWrite(s : string): void {
// TODO // TODO
} }
export function uartRead(): string { export function uartReadUntil(del: string): string {
// TODO // TODO
return "" return ""
} }

View File

@ -43,6 +43,10 @@ namespace pxsim.serial {
return board().serialState.readSerial(); return board().serialState.readSerial();
} }
export function readUntil(del: string): string {
return readLine();
}
export function onDataReceived(delimiters: string, handler: RefAction) { export function onDataReceived(delimiters: string, handler: RefAction) {
let b = board(); let b = board();
b.bus.listen(DAL.MICROBIT_ID_SERIAL, DAL.MICROBIT_SERIAL_EVT_DELIM_MATCH, handler); b.bus.listen(DAL.MICROBIT_ID_SERIAL, DAL.MICROBIT_SERIAL_EVT_DELIM_MATCH, handler);