为Intel Edison编写自己的UPM模块
UPM (Useful Packages and Modules)相当于第三方厂商基于MRAA为Intel Edison、树莓派等开发板做的电子模块库。
以下是在Intel Edison开发UPM模块的详细步骤。
* 安装和设置Git
第一次启动Edison,先执行 “configure_edison –setup”
添加opkg更新源,修改文件 “/etc/opkg/base-feeds.conf”
src/gz all http://repo.opkg.net/edison/repo/all src/gz edison http://repo.opkg.net/edison/repo/edison src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32
执行
opkg update opkg install git
* 编译UPM
如果mraa版本太低,先执行 opkg install mraa
cd ~ git clone https://github.com/intel-iot-devkit/upm cd upm
设置环境变量
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:.../mraa/build/lib/pkgconfig
执行
mkdir build cd build cmake ..
编译过程比较漫长,至少1个小时
make make install
* 创建模块必需资源
cd ../src mkdir mymodule cd mymodule
CMakeLists.txt
set (libname "mymodule") set (libdescription "Test UPM module for my learning") set (module_src mymodule.cxx) set (module_h mymodule.h) upm_module_init()
javaupm_mymodule.i(SWIG 接口文件 for Java)
%module javaupm_mymodule %include "../upm.i" %include "typemaps.i" %{ #include "mymodule.h" %} %include "mymodule.h" %pragma(java) jniclasscode=%{ static { try { System.loadLibrary("javaupm_mymodule"); } catch (UnsatisfiedLinkError e) { System.err.println("Native code library failed to load. \n" + e); System.exit(1); } } %}
jsupm_mymodule.i(SWIG 接口文件 for Javascript)
%module jsupm_mymodule %include "../upm.i" %include "mymodule.h" %{ #include "mymodule.h" %}
pyupm_mymodule.i(SWIG 接口文件 for Python)
%include "pyupm_doxy2swig.i" %module pyupm_mymodule %include "../upm.i" %feature("autodoc", "3"); %include "mymodule.h" %{ #include "mymodule.h" %}
模块源文件
mymodule.h
#pragma once #include <stdio.h> #include <mraa/aio.h> #include <mraa/gpio.h> #define HIGH 1 #define LOW 0 namespace upm { class MyModule { public: MyModule(); ~MyModule (); void test(); private: bool m_doWork; mraa_gpio_context m_pinCtx; }; }
mymodule.cxx
#include "mymodule.h" #include <iostream> #include <unistd.h> #include <stdlib.h> #include <functional> using namespace upm; MyModule::MyModule() { mraa_init(); m_doWork = false; // setup pin m_pinCtx = mraa_gpio_init(13); if (m_pinCtx == NULL) { fprintf (stderr, "Are you sure that pin%d you requested is valid on your platform?", 13); exit (1); } mraa_gpio_dir(m_pinCtx, MRAA_GPIO_OUT); } MyModule::~MyModule () { mraa_gpio_close (m_pinCtx); } void MyModule::test() { m_doWork = !m_doWork; mraa_gpio_write(m_pinCtx, m_doWork?HIGH:LOW); }
所有文件都准备就绪
-
mymodule
- CMakeLists.txt
- jsupm_mymodule.i
- pyupm_mymodule.i
- javaupm_mymodule.i
- mymodule.cxx
- mymodule.h
* 编译和安装自定义模块,如果make install报错,尝试执行make clean
cd ../../build cmake .. make mymodule cd src/mymodule make install
* NodeJS测试程序,test.js
var module = require('jsupm_mymodule'); var mod = new module.MyModule(); function loop(){ mod.test(); setTimeout(loop,500); } loop();
设置环境变量,NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules/
执行node test.js
原文来自:http://shawnhymel.com/756/writing-your-own-upm-module-getting-started/
hi 北京浮生记 是你做的吗?希望能联系下。谢谢