MCPcopy Create free account
hub / github.com/dalathegreat/Battery-Emulator / update_calculated_values

Function update_calculated_values

Software/Software.cpp:149–380  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

147}
148
149void update_calculated_values(unsigned long currentMillis) {
150 /* Update CPU temperature*/
151 union {
152 float temp;
153 uint32_t hex;
154 } temp = {.temp = temperatureRead()};
155 if (temp.hex != 0x42555555) {
156 // Ignoring erroneous temperature value that ESP32 sometimes returns
157 datalayer.system.info.CPU_temperature = temp.temp;
158 }
159
160 /*Update free heap*/
161 datalayer.system.info.CPU_free_heap = ESP.getFreeHeap();
162
163 /* Check is remote set limits have timed out */
164 if (currentMillis > datalayer.battery.settings.remote_set_timestamp + datalayer.battery.settings.remote_set_timeout) {
165 datalayer.battery.settings.remote_settings_limit_charge = false;
166 datalayer.battery.settings.remote_settings_limit_discharge = false;
167 datalayer.battery.settings.max_remote_set_charge_dA = 0;
168 datalayer.battery.settings.max_remote_set_discharge_dA = 0;
169 }
170
171 /* Calculate allowed charge/discharge currents*/
172 if (datalayer.battery.status.voltage_dV > 10) {
173 // Only update value when we have voltage available to avoid div0. TODO: This should be based on nominal voltage
174 int32_t target_charge = ((datalayer.battery.status.max_charge_power_W * 100) / datalayer.battery.status.voltage_dV);
175 int32_t target_discharge =
176 ((datalayer.battery.status.max_discharge_power_W * 100) / datalayer.battery.status.voltage_dV);
177
178 // Low pass filter only when increasing values (10% new, 90% old)
179 if (inverter_low_pass_filter) {
180 if (datalayer.battery.status.max_charge_current_dA == 0) {
181 datalayer.battery.status.max_charge_current_dA = target_charge; // Initialize immediately if 0
182 } else if (target_charge > datalayer.battery.status.max_charge_current_dA) {
183 datalayer.battery.status.max_charge_current_dA =
184 (target_charge * 10 + datalayer.battery.status.max_charge_current_dA * 90) / 100;
185 } else {
186 datalayer.battery.status.max_charge_current_dA = target_charge;
187 }
188
189 if (datalayer.battery.status.max_discharge_current_dA == 0) {
190 datalayer.battery.status.max_discharge_current_dA = target_discharge; // Initialize immediately if 0
191 } else if (target_discharge > datalayer.battery.status.max_discharge_current_dA) {
192 datalayer.battery.status.max_discharge_current_dA =
193 (target_discharge * 10 + datalayer.battery.status.max_discharge_current_dA * 90) / 100;
194 } else {
195 datalayer.battery.status.max_discharge_current_dA = target_discharge;
196 }
197 } else {
198 datalayer.battery.status.max_charge_current_dA = target_charge;
199 datalayer.battery.status.max_discharge_current_dA = target_discharge;
200 }
201 }
202
203 /* Apply remote restrictions if set*/
204 if (datalayer.battery.settings.remote_settings_limit_charge) {
205 if (datalayer.battery.status.max_charge_current_dA > datalayer.battery.settings.max_remote_set_charge_dA) {
206 datalayer.battery.status.max_charge_current_dA = datalayer.battery.settings.max_remote_set_charge_dA;

Callers 1

core_loopFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected