#include "valve.h" Valve::Valve() { } void Valve::loop() { if (millis() - this->loopLastMillis < this->loopDelay) return; this->loopLastMillis = millis(); for (uint8_t i = 0; i < this->valveCount; i++) { uint8_t minutesOn = (millis() - this->valves[i].startTime) / 1000; if (minutesOn >= this->valves[i].duration) this->close(i); } } void Valve::addShiftRegister(ShiftRegister *shiftRegister) { this->shiftRegister = shiftRegister; } void Valve::add(uint8_t pinNum, bool shiftRegister) { if (this->valveCount == MAX_VALVES) return; ValveData newValve; newValve.pin = pinNum; newValve.shiftRegister = shiftRegister; this->valves[this->valveCount] = newValve; this->valveCount++; } void Valve::open(uint8_t valveNumber, uint8_t minutes) { if (valveNumber >= this->valveCount) return; this->valves[valveNumber].duration = minutes; this->valves[valveNumber].startTime = millis(); this->setValve(valveNumber, true); } void Valve::close(uint8_t valveNumber) { if (valveNumber >= this->valveCount) return; this->valves[valveNumber].duration = 0; this->setValve(valveNumber, false); } void Valve::closeAll() { for (uint8_t i = 0; i < this->valveCount; i++) { this->valves[i].duration = 0; this->setValve(i, false); } } uint8_t Valve::getNumOfOpen() { uint8_t res = 0; for (uint8_t i = 0; i < this->valveCount; i++) if (this->valves[i].duration) res++; return res; } uint8_t Valve::getTimeLeft(uint8_t valveNumber) { if (valveNumber >= this->valveCount) return -1; uint32_t millisOn = millis() - this->valves[valveNumber].startTime; return this->valves[valveNumber].duration - (millisOn / 1000); } void Valve::setValve(uint8_t valveNumber, bool state) { if (this->valves[valveNumber].shiftRegister && this->shiftRegister) this->shiftRegister->writePin(this->valves[valveNumber].pin, state); else digitalWrite(this->valves[valveNumber].pin, state); }