Как использовать внешнюю библиотеку в моей собственной библиотеке Arduino?

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

Я пишу библиотеку 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 оператор) но это как раз то, что вышло у меня из головы банкомат.

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

0

Решение

Сообщение об ошибке от компилятора очень полезно, и если вы будете следовать его советам замены . с -> это, вероятно, решит вашу непосредственную проблему. поскольку 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 через указатели.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]