试着使用micro:bit v2 (makecode v3)来创建扩展功能
微型编程控制器Micro:bit在2020年11月末进行了升级。
因为以前做的某个扩展可能无法正常工作,所以我进行了一次大胆的升级。
https://github.com/pizayanz/pxt-linebeacon
(正在进行中)
我在 Qiita 上应该也写了关于扩展制作方法的文章,但是发现只是个中途而停的草稿。我真是个失败啊。
希望借此反省,我打算即使是中途而停的文章也公开出来,一边慢慢进行工作,一边进行增补。
无论记载内容如何变化,请您原谅。
无论是一直到未来永远,还是中途半端,请您原谅。
只要把卡在这里的地方上传,或许可以帮助到处于同样情况的人们…这是我的想法,请原谅我。
不仅仅使用TypeScript,也使用了C++(cpp),因此在技术层面上可能会更加深入,但是对于只想用TypeScript创建扩展的人来说,也有一些相同的障碍点,所以一部分内容可能对他们有参考价值。
轻松的触发点
截止到2020年11月。
micro:bit (基板自体) 是 v2 (Version 2)
makecode(一个在浏览器中运行的代码编辑器)现在已经升级到v3(第三版本)。
嗯,为了以防万一,让我们事先了解一下。
顺便提一下,MakeCode 经常会以 PXT 这个名称出现。
PXT 是 Microsoft 编程体验工具包的简称。
虽然有各种版本,但针对 micro:bit 的版本就是 pxt-microbit。
非常引人关注的焦点
在Typescript中定义扩展时,如果想要使用C++,也需要准备extension.cpp等代码文件。
这个区别是这样的,简单来说,ts 是用于 MakeCode 内的模拟器。
cpp 则用于 micro:bit 内运行的物体。
首先确认
关于空的函数
浏览这个网页,我们将开始创建积木:
https://makecode.com/defining-blocks
这不行。虽然不太明白,但是没有成功。
/**
* this is hoge
*/
//% blockId=hoge
//% block="Hoge"
//% block.loc.ja="ほげ"
//% weight=10 blockGap=8 shim=hogehoge::hoge
export function hoge(): void {
}
这些都还不错。
/**
* this is hoge
*/
//% blockId=hoge
//% block="Hoge"
//% block.loc.ja="ほげ"
//% weight=10 blockGap=8 shim=hogehoge::hoge
export function hoge(): void {
return;
}
※ねぶかい件
.cpp しかコードが必要がないときは、cpp 側にブロック定義をしかるべく定義すれば、
.ts 側は省略してもよいという仕様。
.ts 側は、ビルド時に、自動的に .cpp をなめて、shim.d.ts なる中間ファイルを自動生成してくれる。
そのときの自動生成が、export ついてないから、おかしかったりするのかなと思いつつ。調査しきっていない。
```typescript
/**
* this is hoge
*/
//% blockId=hoge
//% block="Hoge"
//% block.loc.ja="ほげ"
//% weight=10 blockGap=8 shim=hogehoge::hoge
function hoge(): void;
而且,如果使用MakeCode的话,可能会遇到找不到属性之类的错误,陷入困境。
无法读取未定义的属性’hoge’。
在模拟器中,特别是没有特定的操作需要执行时,只需在cpp端创建一个函数并在那里添加类似于“block修饰符”的注释即可,但在工作期间,可能会编写或删除一些小的调试代码。
在那个时候,有一种情况是如果空的函数保持不变,它会出现无法运行的情况,导致非常困扰。
错误 TS2384:重载的签名必须全部是环境声明或非环境声明的。
当在makecode的console.log中时,这些重复定义的地方感觉有些奇怪。(似乎在.ts中声明的函数与由.cpp自动生成的.ts发生了冲突)
另外一个重要的要点是。
在TypeScript中,我们可以通过在block修饰符前加上cpp来为其提供一个同名的Function,并且只需要使用//%来完成block修饰符的处理的情况是存在的。
在这种情况下,如果在cpp代码中仔细添加注释,就会出现无法运行的问题。代码可以成功编译,但使用makecode无法运行。
/**
* this is hoge
*/
//%
void hoge() {
...
}
这样就可以运行了。
//%
void hoge() {
...
}
我被最新版本的PXT生成器迷住了,尽管它可能存在一些bug,但请注意,因为我深深地被吸引了。
记录
北欧的SDK感觉已经集成了16版本的内容。
nrf52833: nrf52833
Softdevice分为S113(可能是适用于micro:bit v1的版本)和S140(适用于v2版本)。
https://files.seeedstudio.com/products/102991374/BBC-microbit-v2-datasheet-v1.2.pdf
不晓得为何,搜索了一下codal-microbit-nrf5sdk之类的东西,发现S140被引入了,但是却没有被使用的迹象。是否是在使用S113?需要确认一下。
https://github.com/microbit-foundation/codal-microbit-nrf5sdk
https://github.com/microbit-foundation/codal-microbit-nrf5sdk/commit/b2fe152660abf0e99ed4ec3281042003237283f9
以下是两个GitHub链接:
https://github.com/microbit-foundation/codal-microbit-nrf5sdk
https://github.com/microbit-foundation/codal-microbit-nrf5sdk/commit/b2fe152660abf0e99ed4ec3281042003237283f9
我很不明白,可就像个大疙瘩。
创建名为pxt的conda环境,使用Python 2.7版本。
激活pxt环境。
使用conda命令,通过conda-forge渠道安装nodejs。
pxt 所需的 Node 版本为 8.9.4 或更高版本,可以尝试与主要版本匹配,但还是推荐使用最新版本。目前最新版本为 15.3.0。您可以通过在 conda-forge 仓库中搜索 nodejs,来获取更多信息。
请卸载conda-forge上的nodejs:
conda uninstall -c conda-forge nodejs
使用conda安装Node.js
版本已更新为10.13.0
随后,由于怀疑v10系列存在问题,我决定切换到推荐使用的v8.9.4版本及更高版本。
conda卸载Node.js
做
请使用conda安装Node.js版本为8。
因此,直到8.9.3为止。
在中国本地只需要一种选项,请将以下内容用中文原生方式改述:“conda install -c conda-forge nodejs=8”。
那么,8.10.0
进展顺利。但是,npm安装时出现了一些可疑的msvs依赖问题。
可以尝试不同的版本,包括添加Microsoft Build Tools 2015等等。
安装与 webusb 相关的文件
进入 `pxt-microbit` 目录,使用命令 `pxt npminstallnative` 进行本地安装。
pxt隐藏了这个信息。
使用 yotta 构建引擎的目标是 microbit。
目标版本:v3.0.61,路径为 C:\Users\hisayan\Downloads\pxt-microbit。
pxt-core 版本:v6.0.35,路径为 C:\Users\hisayan\Downloads\pxt-microbit\node_modules\pxt-core。
加载”webusb”包失败,请运行“pxt npminstallnative”来安装本地依赖。
内部错误:TypeError: 无法读取未定义属性 ‘USBAdapter’。
PXT_USE_HID=9796990b 中 pxt hiddmesg
pxt-microbit/libs/core/dal.d.ts
MICROBIT_DMESG_LEVEL = MICROBIT_DMESG_LEVEL_DEBUG
pxt-microbit/libs/core/dal.d.ts
MICROBIT_DMESG_LEVEL is set to MICROBIT_DMESG_LEVEL_DEBUG.
最後来点宣传
不仅仅限于micro:bit,我擅长于完全改造scratch,制作Node-RED的模块等。如果有这样的项目,请随时与我进行详细的工作和咨询。