Как правильно настроить отображение контактов библиотеки?

8

Я работаю с некоторыми библиотеками, которые предоставляют API для взаимодействия с конкретными аппаратными чипами (что делает эти драйверы?). Однако на разных пользовательских платах или щитах микросхема будет отображаться на разных выводах, поэтому библиотеку необходимо модифицировать для каждого случая. Необходимость изменения библиотеки плохо работает с Arduino IDE Library Manager.

Существуют ли предпочтительные / рекомендуемые шаблоны для предоставления этой конфигурации, чтобы не нужно было каждый раз изменять саму библиотеку?

Вот пример, где задокументировано, какую часть нужно изменить, чтобы она соответствовала расположению выводов вашей платы.

vossad01
источник
Многие из обычных библиотек Arduino уже делают это - начните с ознакомления с этим методом даже с точки зрения пользователя.
Крис Страттон

Ответы:

6

Метод, который я использую, заключается в предоставлении выводов в качестве параметров для конструктора. Эти номера выводов хранятся в переменных для последующего использования в .begin()функции и в других местах.

Большую часть времени я использую списки инициализации для простоты. Например:

class Something {
    uint8_t _cs;
    uint8_t _dc;

    Something(uint8_t cs, uint8_t dc) : _cs(cs), _dc(dc) {}
    void begin();
};

void Something::begin() {
    pinMode(_cs, OUTPUT);
    pinMode(_dc, OUTPUT);
}

Something mySomething(10, 8);
Маженко
источник
6

Я бы использовал одну из следующих двух возможностей:

Используйте (класс) переменные и установите их в конструкторе.

Преимущества:

  • Всегда инициализирован
  • Простота в использовании (настройка конструктора и выводов одновременно)

Используйте отдельный (например, Init) метод.

Преимущества:

  • Может быть динамически изменен

замечания

Для настройки выводов используются в основном статические цепи, поэтому первый подход, вероятно, лучше.

Для настроек в основном лучше второй способ.

Если задействовано много выводов (маловероятно), используйте структуру или отдельный класс настроек выводов.

макрос

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

Мишель Кейзерс
источник
2

в зависимости от вашего подхода.

1) если вы просто предоставите бинарные файлы + заголовочные файлы, вам придется сделать переменные pins.

2) если вы предоставляете исходный код и ожидаете, что пользователь перекомпилирует исходный код, используйте макросы.

dannyf
источник
2

Если вы не хотите использовать конструктор C ++, который в Arduino является излишним, вы можете использовать #defines (объектно-подобные макросы).

Вот так:

#define PIN_ONE 1
#define PIN_TWO 2

Препроцессор легко заменит PIN_ONEномер 1 и PIN_TWO2, предполагая, что эти определения находятся в заголовочном .hфайле библиотеки . Это, скорее всего, займет меньше всего ресурсов по сравнению с другими возможными решениями.

Avamander
источник
Проблема заключается в том, что они должны находиться в месте, где к ним могут получить как файл .ino, так и исходный код библиотеки. Обычно это означает отдельный заголовочный файл со всем, что требуется.
Игнасио Васкес-Абрамс
Ты уверен? Я уверен, что я могу сделать переключатели #define в .ino, и они используются в библиотеках, но я могу ошибаться.
Авамандер
1
Он может работать, если код библиотеки находится строго в заголовке, но не в том случае, если он вообще находится в другом модуле компиляции.
Игнасио Васкес-Абрамс
Да, это имеет смысл, я не знал точных ограничений, добавил этот отказ от ответственности.
Авамандер