#c #arduino
#c #arduino
Вопрос:
Я подключил сдвиговый регистр к своему Ardunio и создал для него собственный класс. Из основного файла я создаю объект, подобный этому
ShiftRegister myRegister;
//myRegister.begin(int arduinoPin, int state);
myRegister.begin(int 8, int LOW);
myRegister.write(1, HIGH);
До сих пор это работает нормально. Вызывая метод begin(), я получаю свой объект сдвигового регистра с 8 собственными выводами. Я могу напрямую переключать выходные данные моего сдвигового регистра с помощью метода write() (в данном случае вывод 1 сдвигового регистра).
Теперь у вас есть устройство, подключенное к регистру сдвига. Я создаю его из основного файла через
Device myDevice;
myDevice.switchOn();
Мне нужно будет сообщить устройству, к какому выводу сдвигового регистра оно подключено. Что — то вроде
myDevice.begin(5);
После этого я хотел бы только вызвать функцию myDevice.switchOn(), чтобы включить устройство. Поэтому я не хочу делать это напрямую с помощью myRegister.write(5, HIGH), а скорее из класса устройства.
Как мне заставить class Device сделать это? Пока этот класс ничего не знает о регистре сдвига. По указателям? Каким был бы конкретный способ?
Я совсем новичок в C / Arduino, поэтому простите меня, если это может быть довольно тривиальным вопросом. Кроме того, я пока не слишком разбираюсь в объектно-ориентированном программировании…
Комментарии:
1. Является ли изменение вашего
ShiftRegister
предполагаемого немедленного распространения на всеDevice
ы, которые подключены к этомуShiftRegister
, и, таким образом, влияет на всеDevice
s контакты — или вы должны вручную пройти через всеDevice
s вызовыswitchOn()
? Кстати,switchOn
это плохое название, так как вы не знаете, включится оно или выключится, поскольку оно хранится вShiftRegister
. Кроме того, должны ли дваDevice
s быть подключены к одному и тому же контакту при использовании одного и того жеShiftRegister
или это должно быть обнаружено и отклонено?2. Вы отказались от этого вопроса? Если ни один из ответов не отвечает на ваш вопрос, задайте дополнительные вопросы к ответам или уточните свой вопрос. Одним из разъяснений может быть ответ на вопрос, который я задал выше почти неделю назад.
Ответ №1:
Я не знаком с компонентами Arduino, но..
Вы можете расширить класс устройства:
class DeviceWithShiftReference: public Device{
private: ShiftRegister * myShiftReference;
public: DeviceWithShiftReference(ShiftRegister* reg) {
myShiftReference = reg
}
public: doSomething() {
// here you can perform stuff with the shift register inside your device
}
};
void main(void){
ShiftRegister myRegister;
DeviceWithShiftReference myDevice(amp;myRegister);
myDevice.doSomething();
}
Таким образом, вы сохраняете ссылку на свой регистр внутри своего класса, из doSomething() вы можете использовать myShiftReference и выполнять действия с:
myShiftRegister->begin( ... )
Комментарии:
1. @TedLyngmo что вы имеете в виду, говоря «не работает»? Ошибки компиляции?
2. Да, это недопустимый C .
private: <all private members>
иpublic: <all public members>
все же будет работать. Обычно вам нужен только одинprivate:
и onepublic:
. Кроме того, вашим функциям-членам нужны типы.3. @TedLyngmo Ах да, извините, это опечатка, моя ошибка. Я отредактирую ответ
4. @TedLyngmo отметьте это как правильное, если это решит вашу проблему;)
5. @TedLyngmo с помощью этого метода вы можете реализовать функцию doSomething (например, switchOn()), в которой вы выполняете действия с регистром сдвига прямо внутри класса DeviceWithShiftReference. Я не знаю, является ли Device реализованным вами классом или это часть платформы arduino, поэтому я предложил наследование. Вы можете переопределить устройство, если сможете, с помощью метода pointer to register и добиться того же результата
Ответ №2:
Вы могли бы добавить пару параметров в конструктор класса вашего устройства, один параметр является указателем на ваш объект ShiftRegister, а другой — на какой вывод он включен. Эти два параметра сохраняются внутри объекта.
class Device
{
public:
Device(ShiftRegister *pReg, int iPin)
{
reg = pReg;
pin = iPin;
}
private:
int pin;
ShiftRegister *reg;
}
Затем вы можете сделать
ShiftRegister myRegister;
myRegister.initStuff(...);
Device myDevice(amp;myRegister, 5);
.
.
myDevice.switchOff(); // Uses the saved pin value
myDevice.switchOn();
Комментарии:
1. Я предлагаю:
Device(ShiftRegister *pReg, int iPin) : reg(pReg), pin(iPin) {}
и переключить порядок переменных-членов. Кроме того, предоставлениеShiftRegister
становится необязательным, если конструктор принимает его в качестве указателя. Я предлагаю вам взять его по ссылке, а затем просто сохранить вместо этого указатель.Device(ShiftRegisteramp; rReg, int iPin) : reg(amp;rReg), pin(iPin) {}