本帖最后由 jinyi7016 于 2016-7-9 22:21 编辑
上一篇使用了grove
中的LED
例程,体验了UPM
库中的Grove
类的使用。
程序是很简单,但也要了解其运行的机理。
首先我们看一下这个完整的LED
程序。
- #include
- #include
- #include "grove.hpp"
- int
- main(int argc, char **argv)
- {
- upm::GroveLed* led = new upm::GroveLed(2);
- std::cout << led->name() << std::endl;
- for (int i=0; i < 10; i++) {
- led->on();
- sleep(1);
- led->off();
- sleep(1);
- }
- delete led;
- return 0;
- }
复制代码
头文件这里有三个。
unistd.h
:系统API
的访问功能的头文件
iostream
:C++
输入输出流头文件
grove.hpp
:grove
库的头文件,这个是要从下载的upm
的库是复制到工程目录下的,还要在工程中指写它的路径,这在之前的帖子已经说过了。
使用new
创建类对象,名为led,
这里有参数“2
”实际上是调用了mraa
库中的GPIO
初始化函数,对第二个pin
进行初始化。如下的程序。
- GroveLed::GroveLed(int pin)
- {
- if ( !(m_gpio = mraa_gpio_init(pin)) ) {
- throw std::invalid_argument(std::string(__FUNCtiON__) +
- ": mraa_gpio_init() failed, invalid pin?");
- return;
- }
- mraa_gpio_dir(m_gpio, MRAA_GPIO_OUT);
- m_name = "LED Socket";
- }
复制代码
std::cout << led->name()<< std::endl;
输出对象的名字,并添加一个回车。
Name 方法是继承自类Grove,其中只有一个方法和一个变量,就是name()与m_name。
- class Grove {
- public:
- virtual ~Grove() {}
- std::string name()
- {
- return m_name;
- }
- protected:
- std::string m_name;
- };
复制代码
那么
接下来就是
led
的部分了。
这里使用了一个
for
循环,使
LED
闪烁
10
次。
LED的亮灭使用的是
led->on();与
led->off();
从下面的程序可以看出,实际上还是调用了mraa库的
mraa_gpio_write函数。
- mraa_result_t GroveLed::write(int value)
- {
- if (value >= 1) {
- return mraa_gpio_write(m_gpio, 1);
- }
- return mraa_gpio_write(m_gpio, 0);
- }
- mraa_result_t GroveLed::on()
- {
- return write(1);
- }
- mraa_result_t GroveLed::off()
- {
- return write(0);
- }
复制代码
从上面和程序可以看出,
mraa
与
upm
是紧密的结合在一起的。
|