micro:bitにおけるC++の呼び出し(型変換)
C++の実装時に、型につまづくので、( ..)φメモメモ。
ヒントはここにあります
数値(Numberとint)
Numberとintとは、そのまま相互運用が可能。
数値(Numberとdoubleやfloat)
typescriptのNumberはdoubleの精度を持つ。
Numberは、TNumberに対応しており、double toDouble(TNumber)やfloat toFloat(TNumber)でC++の型に変換し、
TNumber fromDouble(double)やTNumber fromFloat(float)でNumber型に変換する。
typescriptでのテクニック:値が整数であるかどうか
value === (value | 0)
export function sendValue(name: string, value: number) {
let packet: RadioPacket;
if (value === (value | 0)) {
packet = RadioPacket.mkPacket(PACKET_TYPE_VALUE);
}
else {
packet = RadioPacket.mkPacket(PACKET_TYPE_DOUBLE_VALUE);
}
packet.numberPayload = value;
packet.stringPayload = name;
sendPacket(packet);
}
文字列型の相互変換(StringとManagedString)
StringとManagedStringとを相互に変換するために、MSTR()やPSTR()が使われています。
MSTR() - StringからManagedStringへ変換
PSTR() - ManagedStringからStringへ変換
引数のかず
関数の引数が多すぎると、コンパイルエラーとなる。
error TS9200: Assertion failed
例えば、引数が6個の関数を呼び出すとエラー。
custom.buildErr(1, 2, 3, 4, 5, 6)
//% block
//% shim=custom::buildErr
export function buildErr(p1: number, p2: number, p3: number, p4: number, p5: number, p6: number): void {
// nop
}
//%
void buildErr(TNumber p1, TNumber p2, TNumber p3, TNumber p4, TNumber p5, TNumber p6)
{
// nop
}
マクロの定義(ptx.json)
定数マクロをptx.jsonで定義できる。
Setting C++ constants for DAL config - yotta
pxt.jsonを記述しただけでは、v2(codal)のビルド時にしか、CUSTOM_DEFINE_VALUE
が定義されない。
"yotta": {
"config": {
"CUSTOM": 123
}
}
YOTTA_CFG_
を接頭辞につける。
#define DEFAULT_CUSTOM 9
#ifndef CUSTOM
#ifdef YOTTA_CFG_CUSTOM
#define CUSTOM YOTTA_CFG_CUSTOM
#else
#define CUSTOM DEFAULT_CUSTOM
#endif