本帖最后由 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是紧密的结合在一起的。
|