#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++) { if (this->valves[i].duration == 0) continue; uint8_t minutesOn = (millis() - this->valves[i].startTime) / 1000 / 60; 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); Serial.print(F("Opened valve: ")); Serial.println(valveNumber); } void Valve::close(uint8_t valveNumber) { if (valveNumber >= this->valveCount) return; this->valves[valveNumber].duration = 0; this->setValve(valveNumber, false); Serial.print(F("Closed valve: ")); Serial.println(valveNumber); } void Valve::closeAll() { for (uint8_t i = 0; i < this->valveCount; i++) this->close(i); } 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; } uint16_t Valve::getTimeLeft(uint8_t valveNumber) { if (valveNumber >= this->valveCount) return -1; if (this->valves[valveNumber].duration == 0) return 0; uint32_t millisOn = millis() - this->valves[valveNumber].startTime; return this->valves[valveNumber].duration * 60 - (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); }