Qual é a maneira correta de configurar os mapeamentos de pinos da biblioteca?

8

Estou trabalhando com algumas bibliotecas que fornecem APIs para interagir com chips de hardware específicos (que fazem esses drivers?). No entanto, placas ou protetores personalizados diferentes terão o chip mapeado para pinos diferentes, o que significa que a biblioteca precisa ser modificada para cada caso. A necessidade de modificar a biblioteca não funciona bem com o Gerenciador de Biblioteca IDE do Arduino.

Existem padrões preferidos / recomendados para expor essa configuração para que a própria biblioteca não precise ser modificada todas as vezes?

Aqui está um exemplo em que está documentada qual parte precisa ser alterada para corresponder ao layout dos pinos da sua placa.

vossad01
fonte
Muitas das bibliotecas normais do Arduino já fazem isso - comece familiarizando-se com esse método, mesmo da perspectiva do usuário.
Chris Stratton

Respostas:

6

O método que eu uso é fornecer os pinos como parâmetros para o construtor. Esses números de pinos são armazenados em variáveis ​​para serem usados ​​posteriormente na .begin()função e em outros lugares.

Na maioria das vezes, uso listas de inicialização para simplificar as coisas. Por exemplo:

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);
Majenko
fonte
6

Eu usaria uma das duas possibilidades a seguir:

Use variáveis ​​(de classe) e defina-as no construtor.

Vantagens:

  • Sempre inicializado
  • Fácil de usar (construtor e configuração de pinos de uma só vez)

Use um método separado (por exemplo, Init).

Vantagens:

  • Pode ser alterado dinamicamente

Observações

Para configurações de pinos, a maioria dos circuitos estáticos é usada, portanto a primeira abordagem é provavelmente melhor.

Para configurações, principalmente o segundo método é melhor.

Se muitos pinos estiverem envolvidos (não é provável), use uma estrutura ou uma classe de configurações de pinos separada.

Macros

O que eu não aconselho são macros. Quando os usuários precisam alterar o código-fonte e instalar novas versões, eles precisam mesclar ou refazer as alterações novamente. As vantagens são um código um pouco menor (de máquina), provavelmente um pouco mais rápido e um pouco menos de uso de memória, mas todos os três aspectos são mínimos.

Michel Keijzers
fonte
2

dependendo da sua abordagem.

1) se você apenas fornecer os arquivos binários + de cabeçalho, terá que fazer as variáveis ​​de pinos.

2) se você fornecer o código-fonte e esperar que o usuário recompile o código-fonte, use macros.

dannyf
fonte
2

Caso você evite o material do construtor C ++, que geralmente é um exagero no Arduino, você pode usar #defineas macros do tipo objeto.

Igual a:

#define PIN_ONE 1
#define PIN_TWO 2

O pré-processador substituirá perfeitamente PIN_ONEo número 1 e PIN_TWO2, assumindo que essas definições estão no .harquivo de cabeçalho da biblioteca . Provavelmente, isso requer a menor quantidade de recursos em comparação com as outras soluções possíveis.

Avamander
fonte
O problema é que eles precisam estar em um local onde o arquivo .ino e a fonte da biblioteca possam acessá-los. Isso geralmente significa um arquivo de cabeçalho separado com tudo o que é necessário.
Ignacio Vazquez-Abrams
Você tem certeza? Tenho certeza de que posso fazer #define switches em .ino e eles são usados ​​em bibliotecas, mas posso estar errado.
Avamander
11
Pode funcionar se o código da biblioteca estiver estritamente no cabeçalho, mas não se estiver em uma unidade de compilação completamente diferente.
Ignacio Vazquez-Abrams
Sim, isso faz sentido, não sabia as limitações exatas, acrescentou esse aviso.
Avamander