80 lines
2.0 KiB
C++
80 lines
2.0 KiB
C++
#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);
|
|
}
|