Я создал 2 библиотеки для использования в своем коде Arduino. Одна — это библиотека HwSwitch, другая — библиотека HwServo, которая использует библиотеку HwSwitch.
Библиотека HwSwitch:
HwSwitch::HwSwitch(String switchName, int switchPort, int inputType, int pressedState)
{
Name = switchName;
SwitchPort = switchPort;
_pressedState = pressedState;
_lastCheckMillis = 0;
pinMode(switchPort, inputType);
_lastPinState = digitalRead(SwitchPort);
}
bool HwSwitch::IsPressed()
{
int currentPinState = GetPinState();
return currentPinState == _pressedState;
}
bool HwSwitch::SwitchStateChanged()
{
int currentPinState = GetPinState();
if (_lastPinState != currentPinState)
{
Serial.println("---");
Serial.println("1. Now: " + String(currentPinState) + " - Prev: " + String(_lastPinState));
_lastPinState = currentPinState;
Serial.println("2. Now: " + String(currentPinState) + " - Prev: " + String(_lastPinState));
return true;
}
return false;
}
int HwSwitch::GetPinState()
{
unsigned long ms = millis();
if ((ms - _lastCheckMillis) < 50)
{
return _lastPinState;
}
_lastCheckMillis = ms;
return digitalRead(SwitchPort);
}
Библиотека HwServo:
HwServo::HwServo(int servoPort, int zeroPoint, HwSwitch limitSwitch)
{
_servo.attach(servoPort);
_servo.write(zeroPoint);
ServoPort = servoPort;
ZeroPoint = zeroPoint;
LimitSwitch = limitSwitch;
}
void HwServo::RotateUp()
{
_servo.write(ZeroPoint + UP);
}
void HwServo::RotateDown()
{
if (!LimitSwitch.IsPressed())
{
_servo.write(ZeroPoint + DOWN);
}
}
void HwServo::Stop()
{
_servo.write(ZeroPoint);
}
И вот как я инициализировал его в коде Arduino:
HwServo HwServos[] = {
HwServo(9, 94, HwSwitch("S1", 14, INPUT_PULLUP, HIGH)),
HwServo(5, 90, HwSwitch("S2", 8, INPUT_PULLUP, HIGH)),
};
void setup() { }
void loop() {
for(int i = 0; i < 2; i++)
{
HwServo hwServo = HwServos[i];
if (hwServo.LimitSwitch.SwitchStateChanged())
{
SendSwitchStateUpdate(hwServo.LimitSwitch);
if (hwServo.LimitSwitch.IsPressed())
{
hwServo.Stop();
}
}
}
}
Теперь, наконец, к проблеме! Как видите, в библиотеке HwSwitch я вывожу некоторые данные с помощью Serial.println. Здесь я вижу, что _lastPinState успешно обновляется, но сбрасывается после каждого цикла. Однако, когда я создаю HwSwitch напрямую и использую его, _lastPinState не сбрасывается. Другими словами, сброс значения происходит только тогда, когда библиотека HwSwitch используется внутри библиотеки HwServo.
Видимо, это как-то связано с указателями? Вероятно, я неправильно инициализирую свои классы, но я понятия не имею, как это исправить. Кто-нибудь, кто может помочь с (и желательно объяснить) эту проблему?
LimitSwitch
указателем (т.е. в файле h напишитеHwSwitch *LimitSwitch;
). Затем передайте указатель на конструктор (поэтому конструктор становится..., HwSwitch *limitSwitch)
, а затем вы вызываете его с помощью...94, new HwSwitch("S1", 14...
). Наконец, вы должны изменить прямые вызовы (например,.SwitchStateChanged()
) на косвенные (так что->SwitchStateChanged()
). Это стандартный способ обработки объектов. И, если вы когда-нибудь планируете удалить объектHwServo
, создайте деструктор и удалите и этот объект. Попробуйте это и проверьте, решает ли это ваши проблемы. - person frarugi87   schedule 08.01.2017new
не используется и не происходит динамического выделения памяти, простое использование деструктора по умолчанию и вывод указателя за пределы области видимости должно работать нормально :) - person NonCreature0714   schedule 09.01.2017