Ruff
Created 星期一 24 十月 2016
如果问起十月份我最开心的事情,大概有两件。一件事去江西武功山,徒步征服了海拔1900米的大山;另一件事就是上周末去厦门Google AdWords体验中心参加了首季的AHA分享。
活动有三个主节目,分别是《新硬件工坊》,《敏捷游戏坊--Pizza。Game》以及《敏捷变革--天下事有难易乎?》。这三个主节目是同时进行的,你只能报名参加其中的一个。
大学的时候我学习过微机原理,但是我几乎从来没有一次真正的将写好的汇编代码在机器上执行,一直有个遗憾在心里。而且,其实我对硬件还是很有兴趣,特别是智能硬件和物联网(IOT)。因此这次果断参加了《新硬件工坊》。
原来的讲师是黄凯明老师,但是不巧的是,因为台风的缘故,没法从深圳赶来。因此为我们做分享的是杨杰老师。杨老师是Ruff SDK负责人。拥有超过10年的linux软件开发经验(涉及芯片SOC,网络,和安全软件),2015年加入Ruff。杨老师之前在Nvidia担任senior system engineer,参于了多款Tegra SOC的bring up,(T114,T148,T124)。Nvidia之前,在IBM负责virtual switch。核心模块FE(forward engine)。他是也是Linux开源社区的积极参与者,向Linux kernel贡献了Atheros ethernel L1E和L1C的驱动。
Ruff Develop Kit
此次分享活动,我们是在Ruff开发套件上做的。一副Ruff开发套件包含的东西还是挺多的,一块开发板,十个外设(按钮,蜂鸣器,LCD显示器等)。
开发环境
Ruff有自己的SDK,安装过程十分简单。另外,值得一提的是,Ruff选择的编程语言是JavaScript。其他的硬件例如树莓派,大部分那都是用C语言进行开发,比起Ruff来说,学习曲线相对要陡峭一些。
而且Ruff SDK似乎是基于NodeJS的,或者说是兼容NodeJS的。基于Ruff SDK的编程体验十分类似NodeJS编程。
Getting Start
SDK安装好了以后,就可以开始编写代码了。Ruff SDK有自己的包管理工具——rap。初始化一个新的Ruff App的话,执行
rap init
即可。
Standard Directory Layout
| Folder | Description |
|:-------------|:-----------------------------------------------------------------------|
| .rap | 包管理工具rap的隐藏目录,当你运行rap layout --visual的时候,会下载一些硬件的图片资源在这个文件夹内;应该还有其他作用; |
| ruff_modules | Ruff 设备驱动模块 |
| src | Ruff App 源代码 |
| test | Ruff App 测试代码 |
| app.json | Ruff App 硬件信息 |
| package.json | Ruff App 软件信息,包依赖 |
app.json
先看看app.json都有那些内容:
{
"devices": [
{
"id": "button",
"model": "CK002",
"driver": "button-gpio",
"inputs": {
"gpio": {
"type": "gpio",
"args": {
"direction": "in",
"edge": "both"
}
}
}
}
]
}
是的,app.json就一个对象。这个文件记录着Ruff App的硬件布局。实际上,当你通过
rap device add <device_id>
来添加硬件的时候,包管理工具rap会在app.json写入对应的硬件的信息,更新package.json,往package.json添加硬件驱动依赖信息,最后下载硬件驱动模块到ruff_modules这个文件夹里。那么引用硬件驱动提供的JavaScript对象也很容易
$('#<device_id>').doSomeThing();
package.json
有在NodeJS做过编程大概都知道这个package.json的作用。Ruff的话,添加了一个ruff属性,紧接着上面的例子,我们看看package.json会是什么样的:
{
"name": "ruff-starter",
"version": "0.1.0",
"description": "this is a starter project",
"author": "milo.hou",
"main": "src/index.js",
"ruff": {
"boards": {
"ruff-mbd-v1": "^4.1.2",
"*": "*"
},
"dependencies": {
"button-gpio": "^2.0.4"
}
}
}
因为我们添加了一个button外设,因此我们必定依赖于这个button的驱动。
src
如果你使用 rap init
初始化一个Ruff App的话,默认在src文件夹下,是会有一个index.js文件的。当然你是可以重命名成其他的文件名,记得修改package.json里的main配置。
这个index.js文件是包含一些示例代码的:
'use strict';
$.ready(function (error) {
if (error) {
console.log(error);
return;
}
$('#led-r').turnOn();
});
$.end(function () {
$('#led-r').turnOff();
});
具体做开发的话就和编写NodeJS差不多。你可以编写若干个模块,然后require进来。
App部署
部署出乎意料的简单。硬件开发版默认提供一个WIFI热点,只要链接到这个WIFI热点,在命令行下输入
rap deploy -s
即可部署并且在开发板上立刻启动应用程序。
实际上你大概也猜到了,要启动开发板上部署的App,只要输入
rap start
反过来,要停止App的运行,你只要运行
rap stop
就好了。
调试
调试我想应该是比较困难的一个环节。首先,你要检查你硬件的连接是否正确。硬件的布局和连线,可以通过 rap layout
或者 rap layout --visual
提供的可视化信息来查看。
但这远远是不够的。有可能是你的代码出现异常了。通常我们需要写log来进行调试。这个时候,你可以运行 rap log
连接到开发板上,获取日志信息。
一点感想
整体来说,Ruff上手非常容易,开发,调试和部署也非常简单。我在想Ruff的应用场景应该会相当多的吧,比如用来快速做一个硬件产品的原型等。
也许远不止如此,比如跨界和农业结合,用硬件产品去收集一系列数据:土壤湿度,光照等,反过来使用计算机去自动灌溉以及控制光照;或者用收集一系列环境数据,分析对比看看环境是否变得更好了。
应该挺好玩的。