Files
CCU4-firmware/valveUnit.ino
2023-09-11 18:04:36 +02:00

181 lines
3.9 KiB
C++

PAR_BYTE vu[13] = {0};
PAR_BYTE vuCmd[13] = {0};
#define VUDEBUG 0
long booststart[13];
void VuInit() {
byte pin, v;
for (v = 1; v <= 12; v++) {
pin = VuPin(v);
pinMode(pin, INPUT_PULLUP); // sense/boost pin
pinMode(pin + 1, INPUT); // hold pin
ParArraySet(vu, v, no_valve);
}
}
void VuParCmd(byte v) {
switch (ARRAY(vuCmd,v)) {
case valve_on: VuSet(v, valve_boost); break;
case valve_off: VuSet(v, valve_off); break;
}
}
void VuPars() {
ParEnumArray("v", vu, 1, 12, valve_text);
ParEnumArrayCmd("vc", vuCmd, 1, 12, valve_text, VuParCmd);
}
void VuSet(byte v, byte valveState) {
byte pin = VuPin(v);
switch (valveState) {
case valve_off:
case no_valve:
if (VUDEBUG) { Serial.print(v); Serial.println(" NO"); };
pinMode(pin, INPUT_PULLUP);
pinMode(pin+1, INPUT);
break;
case valve_boost:
ARRAY(booststart,v) = now;
if (VUDEBUG) { Serial.print(v); Serial.println(" BOOST"); };
digitalWrite(pin, LOW);
digitalWrite(pin+1, HIGH);
pinMode(pin, OUTPUT);
pinMode(pin+1, OUTPUT);
break;
case valve_on:
if (VUDEBUG) { Serial.print(v); Serial.println(" ON"); };
digitalWrite(pin+1, HIGH);
pinMode(pin+1, OUTPUT);
pinMode(pin, INPUT_PULLUP);
break;
default:
if (VUDEBUG) { Serial.print(v); Serial.println(" ELSE"); };
}
ParArraySet(vu, v, valveState);
//ParNrSet(p_vu0 + v, ARRAY(vu,v), valveState);
}
byte VuPin(byte v) {
if (v <= 4) {
return v * 2 + (io_ext4 - 1 * 2);
} else if (v <= 8) {
return v * 2 + (io_ext3 - 5 * 2);
} else if (v <= 12) {
return v * 2 + (io_ext2 - 9 * 2);
}
return 99; // illegal pin
}
char *VuText(char result[8], byte v) {
byte pos=0;
result[0] = 'v';
if (v >= 10) {
result[1] = '0' + v / 10;
result[2] = '0' + v % 10;
pos = 3;
} else {
result[1] = '0' + v;
pos = 2;
}
result[pos ++]=' ';
if (ARRAY(vu,v) == valve_on) {
result[pos ++] = 'x';
} else if (ARRAY(vu,v) == valve_boost) {
result[pos ++] = '*';
} else if (ARRAY(vu,v) == valve_off) {
result[pos ++] = '_';
}
result[pos ++] = 0;
return result;
}
void VuDispShort() {
byte v;
byte va;
char res1[8], res2[8];
va = 0;
for (v = 1; v <= 12; v++) {
if (ARRAY(vu,v) != no_valve) {
if (va == 0) {
va = v;
} else {
DispText2(VuText(res1, va), VuText(res2, v));
va = 0;
}
}
}
if (va != 0) {
DispText2(VuText(res1, va), "");
}
}
void VuButtons(byte top) {
DispButton(6, m_menu, m_ext, "*Valv");
}
void VuDisp() {
byte v;
byte pos = 2;
char res1[8];
//VuDispShort();
for (v = 1; v <= 12; v++) {
if (ARRAY(vu,v) != no_valve) {
DispButton(pos, m_ext, v, VuText(res1, v));
pos++;
}
}
DispButton(0, m_menu, m_menu, "menu");
DispButton(1, m_menu, m_home, "home");
}
void VuHandler() {
byte pin;
byte v;
byte state;
static byte cnt[13]={0};
for (v = 1; v <= 12; v++) {
if (ARRAY(vu,v) == valve_boost) {
if (time_ge(now, ARRAY(booststart,v) + boostdelay)) {
VuSet(v, valve_on);
}
} else {
pin = VuPin(v);
if (digitalRead(pin)) { // valve seems to be disconnected
if (ARRAY(cnt,v) >= 100) {
if (ARRAY(vu,v) == valve_off) {
VuSet(v, no_valve);
}
} else {
ARRAY(cnt,v)++;
}
} else {
if (ARRAY(cnt,v) > 0) {
if (ARRAY(vu,v) == no_valve) {
VuSet(v, valve_off);
}
} else {
ARRAY(cnt,v)--;
}
}
}
}
}
void VuCmd(byte v) {
if (ARRAY(vu,v) == valve_off) {
//ParNrSet(p_vuCmd0 + v, ARRAY(vuCmd,v), valve_on);
ParArraySet(vuCmd, v, valve_on);
VuSet(v, valve_boost);
} else if (ARRAY(vu,v) == valve_on || ARRAY(vu,v) == valve_boost) {
//ParNrSet(p_vuCmd0 + v, ARRAY(vuCmd,v), valve_off);
ParArraySet(vuCmd, v, valve_off);
VuSet(v, valve_off);
}
}