181 lines
3.9 KiB
C++
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);
|
|
}
|
|
}
|