BLE HF2 log service (#1549)

* basic hf2 service

* service to send hf2 log messages

* use common console.log

* updated shims

* adding config

* adding simulator

* fix hf2 logging

* hide console blocks
This commit is contained in:
Peli de Halleux 2018-10-29 21:12:09 -07:00 committed by GitHub
parent 94c9ed8f5c
commit 0a708ef815
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 211 additions and 10 deletions

View File

@ -0,0 +1,50 @@
#include "MicroBitConfig.h"
#include "ble/UUID.h"
#include "BLEHF2Service.h"
#include "MicroBitEvent.h"
BLEHF2Service::BLEHF2Service(BLEDevice &_ble) :
ble(_ble)
{
GattCharacteristic txCharacteristic(BLEHF2TxCharacteristicUUID, (uint8_t *)&txCharacteristicMessage, 0,
sizeof(txCharacteristicMessage), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
// Initialise our characteristic values.
memset(&txCharacteristicMessage, 0, sizeof(txCharacteristicMessage));
// Set default security requirements
txCharacteristic.requireSecurity(SecurityManager::MICROBIT_BLE_SECURITY_LEVEL);
// setup GATT table
GattCharacteristic *characteristics[] = {&txCharacteristic};
GattService service(BLEHF2ServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));
ble.addService(service);
// retreive handles
txCharacteristicHandle = txCharacteristic.getValueHandle();
// initialize data
ble.gattServer().write(txCharacteristicHandle,(uint8_t *)&txCharacteristicMessage, sizeof(txCharacteristicMessage));
}
void BLEHF2Service::sendSerial(const char *data, int len, bool isError) {
if (ble.getGapState().connected)
{
int32_t sent = 0;
while(sent < len) {
int32_t n = min(BLEHF2_DATA_LENGTH, len - sent);
txCharacteristicMessage.command = (isError ? BLEHF2_FLAG_SERIAL_OUT : BLEHF2_FLAG_SERIAL_ERR) | n;
memcpy(&txCharacteristicMessage.data, data + sent, n);
ble.gattServer().notify(txCharacteristicHandle,(uint8_t *)&txCharacteristicMessage, sizeof(txCharacteristicMessage));
sent += n;
}
}
}
const uint8_t BLEHF2ServiceUUID[] = {
0xb1,0x12,0xf5,0xe6,0x26,0x79,0x30,0xda,0xa2,0x6e,0x02,0x73,0xb6,0x04,0x38,0x49
};
const uint8_t BLEHF2TxCharacteristicUUID[] = {
0xb1,0x12,0xf5,0xe6,0x26,0x79,0x30,0xda,0xa2,0x6e,0x02,0x73,0xb6,0x04,0x38,0x4a
};

View File

@ -0,0 +1,54 @@
#ifndef BLE_HF2_SERVICE_H
#define BLE_HF2_SERVICE_H
#include "MicroBitConfig.h"
#include "ble/BLE.h"
#include "MicroBitThermometer.h"
#include "EventModel.h"
#include "pxt.h"
#define HF2_ID 9501
#define BLEHF2_FLAG_SERIAL_OUT 0x80
#define BLEHF2_FLAG_SERIAL_ERR 0xC0
#define BLEHF2_DATA_LENGTH 19
// UUIDs for our service and characteristics
extern const uint8_t BLEHF2ServiceUUID[];
extern const uint8_t BLEHF2TxCharacteristicUUID[];
struct BLEHF2Packet {
uint8_t command;
uint8_t data[BLEHF2_DATA_LENGTH];
};
class BLEHF2Service
{
public:
/**
* Constructor.
* Create a representation of the TemperatureService
* @param _ble The instance of a BLE device that we're running on.
*/
BLEHF2Service(BLEDevice &_ble);
/**
* Sends text
*/
void sendSerial(const char *data, int len, bool isError);
private:
// Bluetooth stack we're running on.
BLEDevice &ble;
// memory for buffers.
BLEHF2Packet txCharacteristicMessage;
// Handles to access each characteristic when they are held by Soft Device.
GattAttribute::Handle_t txCharacteristicHandle;
};
#endif

View File

@ -1,6 +1,7 @@
#include "pxt.h" #include "pxt.h"
#include "MESEvents.h" #include "MESEvents.h"
#include "MicroBitUARTService.h" #include "MicroBitUARTService.h"
#include "BLEHF2Service.h"
using namespace pxt; using namespace pxt;
@ -10,6 +11,14 @@ using namespace pxt;
//% color=#0082FB weight=96 icon="\uf294" //% color=#0082FB weight=96 icon="\uf294"
namespace bluetooth { namespace bluetooth {
MicroBitUARTService *uart = NULL; MicroBitUARTService *uart = NULL;
BLEHF2Service* pHF2 = NULL;
//%
void __log(String msg) {
if (NULL == pHF2)
pHF2 = new BLEHF2Service(*uBit.ble);
pHF2->sendSerial(msg->data, msg->length, false);
}
/** /**
* Starts the Bluetooth accelerometer service * Starts the Bluetooth accelerometer service

View File

@ -1,8 +1,18 @@
/// <reference no-default-lib="true"/>
/** /**
* Support for additional Bluetooth services. * Support for additional Bluetooth services.
*/ */
//% color=#007EF4 weight=96 icon="\uf294" //% color=#007EF4 weight=96 icon="\uf294"
namespace bluetooth { namespace bluetooth {
/**
* Internal use
*/
//% shim=bluetooth::__log
export function __log(msg: string) {
return;
}
console.addListener(function (msg) { __log(msg) });
/** /**
* 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.
*/ */

View File

@ -6,7 +6,9 @@
"enums.d.ts", "enums.d.ts",
"shims.d.ts", "shims.d.ts",
"bluetooth.ts", "bluetooth.ts",
"bluetooth.cpp" "bluetooth.cpp",
"BLEHF2Service.h",
"BLEHF2Service.cpp"
], ],
"icon": "./static/packages/bluetooth/icon.png", "icon": "./static/packages/bluetooth/icon.png",
"public": true, "public": true,

View File

@ -205,6 +205,12 @@
"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.", "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.",
"basic.showString|param|interval": "how fast to shift characters; eg: 150, 100, 200, -100", "basic.showString|param|interval": "how fast to shift characters; eg: 150, 100, 200, -100",
"basic.showString|param|text": "the text to scroll on the screen, eg: \"Hello!\"", "basic.showString|param|text": "the text to scroll on the screen, eg: \"Hello!\"",
"console": "Reading and writing data to the console output.",
"console.addListener": "Adds a listener for the log messages",
"console.log": "Write a line of text to the console output.",
"console.logValue": "Write a name:value pair as a line of text to the console output.",
"console.logValue|param|name": "name of the value stream, eg: \"x\"",
"console.logValue|param|value": "to write",
"control": "Runtime and event utilities.", "control": "Runtime and event utilities.",
"control.assert": "If the condition is false, display msg on serial console, and panic with code 098.", "control.assert": "If the condition is false, display msg on serial console, and panic with code 098.",
"control.createBuffer": "Create a new zero-initialized buffer.", "control.createBuffer": "Create a new zero-initialized buffer.",

View File

@ -240,6 +240,7 @@
"basic.showNumber|block": "show|number %number", "basic.showNumber|block": "show|number %number",
"basic.showString|block": "show|string %text", "basic.showString|block": "show|string %text",
"basic|block": "basic", "basic|block": "basic",
"console|block": "console",
"control.deviceName|block": "device name", "control.deviceName|block": "device name",
"control.deviceSerialNumber|block": "device serial number", "control.deviceSerialNumber|block": "device serial number",
"control.eventSourceId|block": "%id", "control.eventSourceId|block": "%id",

View File

@ -228,8 +228,9 @@ void debuglog(const char *format, ...)
va_end(arg); va_end(arg);
} }
void sendSerial(const char *data, int len) {
logwriten(data, len);
}
} // namespace pxt } // namespace pxt

53
libs/core/console.ts Normal file
View File

@ -0,0 +1,53 @@
/// <reference no-default-lib="true"/>
/**
* Reading and writing data to the console output.
*/
//% weight=12 color=#002050 icon="\uf120"
//% advanced=true
namespace console {
type Listener = (text: string) => void;
//% whenUsed
let listeners: Listener[] = undefined;
/**
* Write a line of text to the console output.
* @param value to send
*/
//% weight=90
//% help=console/log blockGap=8
//% text.shadowOptions.toString=true
export function log(text: string): void {
// pad text on the 32byte boundar
text += "\r\n";
control.__log(text);
// send to listeners
if (listeners)
for (let i = 0; i < listeners.length; ++i)
listeners[i](text);
}
/**
* Write a name:value pair as a line of text to the console output.
* @param name name of the value stream, eg: "x"
* @param value to write
*/
//% weight=88 blockGap=8
//% help=console/log-value
export function logValue(name: string, value: number): void {
log(name ? `${name}: ${value}` : `${value}`)
}
/**
* Adds a listener for the log messages
* @param listener
*/
//%
export function addListener(listener: (text: string) => void) {
if (!listener) return;
if (!listener)
listeners = [];
listeners.push(listener);
}
}

View File

@ -311,4 +311,13 @@ namespace control {
void __midiSend(Buffer buffer) { void __midiSend(Buffer buffer) {
// this is a stub to support the simulator // this is a stub to support the simulator
} }
/**
*
*/
//%
void __log(String text) {
if (NULL == text) return;
pxt::sendSerial(text->data, text->length);
}
} }

View File

@ -1,10 +1,3 @@
namespace console {
export function log(msg: string) {
serial.writeString(msg);
serial.writeString("\r\n");
}
}
namespace Math { namespace Math {
/** /**
* Generates a `true` or `false` value randomly, just like flipping a coin. * Generates a `true` or `false` value randomly, just like flipping a coin.

View File

@ -29,6 +29,7 @@
"gestures.jres", "gestures.jres",
"control.ts", "control.ts",
"control.cpp", "control.cpp",
"console.ts",
"game.ts", "game.ts",
"led.cpp", "led.cpp",
"led.ts", "led.ts",

View File

@ -440,6 +440,12 @@ declare namespace control {
*/ */
//% part=midioutput blockHidden=1 shim=control::__midiSend //% part=midioutput blockHidden=1 shim=control::__midiSend
function __midiSend(buffer: Buffer): void; function __midiSend(buffer: Buffer): void;
/**
*
*/
//% shim=control::__log
function __log(text: string): void;
} }

View File

@ -28,6 +28,12 @@ namespace pxsim {
} }
} }
namespace pxsim.control {
export function __log(s: string) {
board().writeSerial(s + "\r\n");
}
}
namespace pxsim.serial { namespace pxsim.serial {
export function writeString(s: string) { export function writeString(s: string) {
board().writeSerial(s); board().writeSerial(s);