我为设备创建了一个 Arduino 库,通常可以通过多种方式对其进行配置。例如使用中断或轮询它。从其他示例中,我为库创建了以下文件:foo.h、fooConfig.h 和 foo.cpp,如下所示。其中 fooConfig.h 包含如何使用屏蔽的配置。例如有或没有中断等......
在这样做时,我希望主草图的 INO 文件能够覆盖默认设置,这些设置已使用#define 声明。包括在图书馆的实例中。结果表明确实如此。至少我是这样做的。
下面的代码是一个有问题的简化示例:
定义测试.ino
#define BAR USE_POLL
#include <foo.h>
foo test;
void setup() {
Serial.begin(115200);
delay(1000);
Serial.print(F("setup's defined BAR was "));
Serial.println(BAR);
Serial.print(F("inside foo.begin defined BAR was "));
Serial.println(test.begin());
}
void loop() {
}
foo.h
#ifndef FOO_h
#define FOO_h
#include "FOOConfig.h"
class foo {
public:
int begin();
};
#endif // FOO_h
FooConfig.h
#ifndef FOOCONFIG_h
#define FOOCONFIG_h
#define USE_INT 1
#define USE_POLL 2
#ifndef BAR
//default to using interrupts
#define BAR USE_INT
#endif // BAR
#endif // FOOCONFIG_h
foo.cpp
#include <foo.h>
int foo::begin() {
#if defined(BAR) && BAR == USE_INT
Timer1.attachInterrupt( isr ); // error here, because of the define...
return 1;
#elif defined(BAR) && BAR == USE_POLL
return 2;
#endif
return 0;
}
产生以下串行输出:
setup's defined BAR was 2
inside foo.begin defined BAR was 1
如果希望 foo.begin 中的 BAR 等于 2,而不是 1。请注意,希望让预编译器决定是否忽略 attachInterrupt。不想要库的资源在不使用的情况下的依赖和消耗。只是希望它是一个高级选项。
我知道这可能最好用 make 文件或 eclipse 来处理,但我正在尝试为目前 1.0.3 的 Arduino IDE 发布这个库。
任何帮助表示赞赏。
仅供参考,真实的完整代码在这里。 https://github.com/mpflaga/Sparkfun-MP3-Player-Shield-Arduino-Library/tree/master/SFEMP3Shield