Fix spike detection bug causing stuck values
When a spike was detected in voltage, current, power, energy, or frequency, the code sent previous values but never updated the prev_* variables. This caused the system to get stuck reporting old values indefinitely after any significant measurement change. Now all prev_* variables are always updated after spike detection, ensuring values can change again after being filtered. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
19
modb_orno3.c
19
modb_orno3.c
@@ -614,14 +614,15 @@ int main(int argc, char *argv[])
|
|||||||
if (prev_voltage.U1 != 0 && (current_voltage.U1 > prev_voltage.U1 * 1.8 || current_voltage.U1 < prev_voltage.U1 * 0.2)) spike_U = 1;
|
if (prev_voltage.U1 != 0 && (current_voltage.U1 > prev_voltage.U1 * 1.8 || current_voltage.U1 < prev_voltage.U1 * 0.2)) spike_U = 1;
|
||||||
if (prev_voltage.U2 != 0 && (current_voltage.U2 > prev_voltage.U2 * 1.8 || current_voltage.U2 < prev_voltage.U2 * 0.2)) spike_U = 1;
|
if (prev_voltage.U2 != 0 && (current_voltage.U2 > prev_voltage.U2 * 1.8 || current_voltage.U2 < prev_voltage.U2 * 0.2)) spike_U = 1;
|
||||||
if (prev_voltage.U3 != 0 && (current_voltage.U3 > prev_voltage.U3 * 1.8 || current_voltage.U3 < prev_voltage.U3 * 0.2)) spike_U = 1;
|
if (prev_voltage.U3 != 0 && (current_voltage.U3 > prev_voltage.U3 * 1.8 || current_voltage.U3 < prev_voltage.U3 * 0.2)) spike_U = 1;
|
||||||
|
|
||||||
if(spike_U) {
|
if(spike_U) {
|
||||||
send_voltage = prev_voltage;
|
send_voltage = prev_voltage;
|
||||||
printf("ORNO: Voltage spike detected. Sending previous values.\n");
|
printf("ORNO: Voltage spike detected. Sending previous values.\n");
|
||||||
} else {
|
} else {
|
||||||
send_voltage = current_voltage;
|
send_voltage = current_voltage;
|
||||||
prev_voltage = current_voltage;
|
|
||||||
}
|
}
|
||||||
|
// Always update prev_voltage to prevent getting stuck on old values
|
||||||
|
prev_voltage = current_voltage;
|
||||||
|
|
||||||
// CURRENT check
|
// CURRENT check
|
||||||
int spike_I = 0;
|
int spike_I = 0;
|
||||||
@@ -634,20 +635,22 @@ int main(int argc, char *argv[])
|
|||||||
printf("ORNO: Current spike detected. Sending previous values.\n");
|
printf("ORNO: Current spike detected. Sending previous values.\n");
|
||||||
} else {
|
} else {
|
||||||
send_current = current_current;
|
send_current = current_current;
|
||||||
prev_current = current_current;
|
|
||||||
}
|
}
|
||||||
|
// Always update prev_current to prevent getting stuck on old values
|
||||||
|
prev_current = current_current;
|
||||||
|
|
||||||
// POWER check
|
// POWER check
|
||||||
int spike_P = 0;
|
int spike_P = 0;
|
||||||
if (prev_power.P_Tot != 0 && (fabs(current_power.P_Tot - prev_power.P_Tot) > fabs(prev_power.P_Tot) * 0.8)) spike_P = 1;
|
if (prev_power.P_Tot != 0 && (fabs(current_power.P_Tot - prev_power.P_Tot) > fabs(prev_power.P_Tot) * 0.8)) spike_P = 1;
|
||||||
|
|
||||||
if(spike_P) {
|
if(spike_P) {
|
||||||
send_power = prev_power;
|
send_power = prev_power;
|
||||||
printf("ORNO: Power spike detected. Sending previous values.\n");
|
printf("ORNO: Power spike detected. Sending previous values.\n");
|
||||||
} else {
|
} else {
|
||||||
send_power = current_power;
|
send_power = current_power;
|
||||||
prev_power = current_power;
|
|
||||||
}
|
}
|
||||||
|
// Always update prev_power to prevent getting stuck on old values
|
||||||
|
prev_power = current_power;
|
||||||
|
|
||||||
// ENERGY check (should only increase)
|
// ENERGY check (should only increase)
|
||||||
int spike_W = 0;
|
int spike_W = 0;
|
||||||
@@ -658,8 +661,9 @@ int main(int argc, char *argv[])
|
|||||||
printf("ORNO: Energy spike/drop detected. Sending previous values.\n");
|
printf("ORNO: Energy spike/drop detected. Sending previous values.\n");
|
||||||
} else {
|
} else {
|
||||||
send_energy = current_energy;
|
send_energy = current_energy;
|
||||||
prev_energy = current_energy;
|
|
||||||
}
|
}
|
||||||
|
// Always update prev_energy to prevent getting stuck on old values
|
||||||
|
prev_energy = current_energy;
|
||||||
|
|
||||||
// FREQUENCY check (5% threshold)
|
// FREQUENCY check (5% threshold)
|
||||||
int spike_F = 0;
|
int spike_F = 0;
|
||||||
@@ -670,8 +674,9 @@ int main(int argc, char *argv[])
|
|||||||
printf("ORNO: Frequency spike detected. Sending previous values.\n");
|
printf("ORNO: Frequency spike detected. Sending previous values.\n");
|
||||||
} else {
|
} else {
|
||||||
send_freq = current_freq;
|
send_freq = current_freq;
|
||||||
prev_freq = current_freq;
|
|
||||||
}
|
}
|
||||||
|
// Always update prev_freq to prevent getting stuck on old values
|
||||||
|
prev_freq = current_freq;
|
||||||
|
|
||||||
// --- Now send the selected values ---
|
// --- Now send the selected values ---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user