Библиотека Arduino IDE, способная распознавать, включены ли другие библиотеки - PullRequest
0 голосов
/ 28 апреля 2019

введите описание изображения здесь Буду очень признателен за вашу помощь. Я студент, работающий над проектом "Ball on Beam Shield" в Arduino (IDE), но я застрял прямо сейчас.

У меня есть библиотека сэмплирования, которая полностью функциональна в смысле кода (прерывания и т. Д.), Она также может распознавать архитектуру описания изображений archenteron и, следовательно, изменять используемый таймер.

Но мне нужно отрегулировать его, - КОГДА БИБЛИОТЕКА Sampling3 ВЫХОДИТ, ЧТО СЕРВОБИБЛИОТЕКА ВКЛЮЧЕНА с AVR arch., Она распознает его и устанавливает себя на таймер 2, потому что серво использует таймер 1.

Для дальнейшего понимания темы, вот некоторая информация о том, как работает компиляция (дайте мне знать, если я ошибаюсь):

- Заголовки (.h) скомпилированы все вместе и обмениваются информацией, если включены друг в друга, чем они скомпилированы в объект - поэтому заголовок знает, что включен другой заголовок. -Все файлы .cpp в папке библиотеки скомпилированы отдельно, и все скомпилированы в функциональные объекты !!! См. Рис.1 - я добавил в 3 из .cpps в предложениях предупреждения библиотеки Servo (предупреждения на словацком языке) - все они скомпилированы: введите описание изображения здесь

IDE разработала макросы препроцессора (ARDUINO_ARCH_XXX). Они отличаются от токенов и могут быть распознаны даже из файлов .cpp. Именно так библиотека Servo способна активировать только один файл .cpp из множества включенных в папку. благодаря условию ifdef (см. рис.2) введите описание изображения здесь

Я пытался использовать ту же логику, работая только с токенами. Вот мои папки библиотеки: (фото 4 5 6) введите описание изображения здесь и код основного заголовка:

#include "Arduino.h"
#ifndef SAMPLING3_H_
#define SAMPLING3_H_
#if defined(ARDUINO_ARCH_AVR) && defined(Servo_h)
#include "avr_servo3/Sampli[enter image description here][4]ngTimers3.h"
#elif defined(ARDUINO_ARCH_AVR) && !defined(Servo_h)
#include "avr3/SamplingTimers3.h"
#else
#error "This library only supports boards with an AVR, SAM or SAMD             
processor."
#endif

typedef void (*p_to_void_func)(); /*define a term p_to_void_func for pointer     
to function, which 
                              has a return type void and has no input     
parameters*/
class SamplingClass{

  public:

SamplingClass();
void period(unsigned long microseconds); 
void interrupt(p_to_void_func interruptCallback);
p_to_void_func getInterruptCallback ();
float getSamplingPeriod();  

private:

static void defaultInterrupt();
p_to_void_func interruptCallback;
 #if defined(ARDUINO_ARCH_AVR) && !defined(Servo_h)
    // Default: Timer1
    const unsigned long timerResolution = 65536;                    // AVR     
Timer 1 is 16bit            
    const unsigned char cpuFrequency = 16;                          // CPU 
frequency in micro Hertz
    #warning "sampling is running on timer 1"
#elif defined(ARDUINO_ARCH_AVR) && defined(Servo_h)
           // Default: Timer2
    const unsigned long timerResolution = 256;                  // AVR Timer 
2 is 8bit            
    const unsigned char cpuFrequency = 16;                          // CPU 
frequency in micro Hertz
    #warning "sampling is running on timer 2"   
#endif  
float samplingPeriod;                   // Sampling period in seconds  
bool setSamplingPeriod(unsigned long microseconds);
};
extern SamplingClass Sampling; 


#endif

Архитектура Сам и сказал, что там еще нет, не обращайте на это внимания.

Проблема заключается в распознавании библиотечного токена (Servo_h) из серво-библиотеки внутри библиотеки Sampling. Вот что происходит: Первый шаг: Файл .Ino компилируется (включая Servo.h) и вызывает Sampling.h, который распознает инсайдерские токены Servo и устанавливает значение timmer 2 (просто упрощенное). Шаг второй: Файл .cpp (все они в папке библиотеки) компилируется, и каждый из них работает по своему таймеру .... см. на рис. 3 введите описание изображения здесь

Поэтому токены совершенно бесполезны в том, чего я хочу достичь. Пожалуйста, какие-нибудь идеи о том, как заставить это работать ???

...