Как использовать внешнюю библиотеку в моей собственной библиотеке Arduino? - PullRequest
0 голосов
/ 27 июня 2018

Добрый вечер!

Я пишу библиотеку Arduino. Внутри я хочу создать экземпляр объекта из другой библиотеки, в конструктор которой необходимо передать параметр, но я не хочу жестко программировать такой параметр. Мне нужно некоторое руководство о том, как это сделать.

Вот соответствующая часть моего кода:

HSBC_CAN.h:

class HSBC_CAN {

    public:
        HSBC_CAN(uint8_t, uint8_t);

    private:
        uint8_t _int_pin;

};

HSBC_CAN.cpp:

#include <HSBC_CAN.h>
#include <mcp_can.h>

extern MCP_CAN *canbus_esc;

HSBC_CAN::HSBC_CAN(uint8_t int_pin, uint8_t cs_pin) {

    _int_pin = int_pin;
    canbus_esc = new MCP_CAN(cs_pin);

}

Для ясности, способ создания объекта из класса MCP_CAN - MCP_CAN foo(int bar), где bar - номер контакта выбора микросхемы для протокола SPI. Я хочу, чтобы моя библиотека создавала объект класса MCP_CAN, но мне нужно иметь возможность передавать номер контакта выбора микросхемы при создании объекта из моего нового класса HSBC_CAN. Это ошибка, которую я получаю с кодом выше:

error: request for member 'begin' in 'canbus_esc', which is of pointer type 'MCP_CAN*' (maybe you meant to use '->' ?)

Возможно, то, что я сделал в моем примере кода, совершенно неверно (с ключевым словом extern и оператором new), но это только то, что пришло мне на ум, банкомат.

Спасибо за время.

1 Ответ

0 голосов
/ 27 июня 2018

Сообщение об ошибке от компилятора очень полезно, и если вы последуете его совету заменить . на ->, это, вероятно, решит вашу непосредственную проблему. Поскольку canbus_esc является указателем, вы должны разыменовать его перед доступом к его элементам или функциям. Так что если у него есть функция с именем begin, которая может быть вызвана с нулевыми аргументами, вы можете написать:

canbus_esc->begin();

Эта строка эквивалентна:

(*canbus_esc).begin();

Кроме того, избавьтесь от слова extern в строке, которая определяла canbus_esc, иначе вы получите неопределенную ошибку ссылки для него.

Однако у меня есть две проблемы с кодом, который вы представили: во-первых, вы используете new, который выполняет динамическое распределение памяти. Это хорошая идея, если вы можете избежать динамического выделения памяти на небольших устройствах, таких как AVR, поскольку вы никогда не знаете, произойдет ли сбой этих распределений, пока вы на самом деле не запустите программу (возможно, вы используете слишком много памяти в других частях вашей программы). ). Во-вторых, вы определили свой canbus_esc в области видимости файла, поэтому может быть только один из них. Это означает, что вы не можете создать несколько HSBC_CAN объектов; второй перезапишет canbus_esc, созданный первым. Хотя это может подойти для вашего приложения, это кажется ненужным ограничением.

Я бы предложил вместо этого написать код:

Заголовочный файл:

#include <mcp_can.h>
class HSBC_CAN {
public:
  HSBC_CAN(uint8_t int_pin, uint8_t cs_pin);
  void begin();
private:
  uint8_t _int_pin;
  MCP_CAN can;
};

Исходный файл:

#include <HSBC_CAN.h>

HSBC_CAN::HSBC_CAN(uint8_t int_pin, uint8_t cs_pin)
  : can(cs_pin)  // This line constructs the MCP_CAN object
{
  _int_pin = int_pin;
}

HSBC_CAN::begin()
{
  can.begin(42, 42, 42);  // TODO: fix arguments
}

Другая идея, которая могла бы быть лучше, состояла бы в том, чтобы ваш объект HSBC_CAN взял указатель на объект MBC_CAN и сохранил указатель как переменную-член в классе HSBC_CAN. Эта опция имеет большой смысл, если на шине CAN есть несколько устройств, с которыми вы хотите общаться, используя этот объект MBC_CAN. Вы можете иметь несколько классов, используя один объект MBC_CAN через указатели.

...