Skip to content

Commit edb29d1

Browse files
authored
Merge pull request #1383 from zorgms/header_adc
Refactor smartEQ class layout and defaults
2 parents 8a4fadd + 995fbb3 commit edb29d1

10 files changed

Lines changed: 368 additions & 267 deletions

File tree

vehicle/OVMS.V3/components/vehicle_smarteq/src/eq_can.cpp

Lines changed: 71 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -53,28 +53,26 @@ void OvmsVehicleSmartEQ::IncomingFrameCan1(CAN_frame_t* p_frame) {
5353
REQ_DLC(7); // logic by vehicle.cpp events
5454
switch(CAN_BYTE(6)) {
5555
case 0x00: // Parking
56-
m_gear = 0;
56+
can_gear = 0;
5757
break;
5858
case 0x10: // Rear
59-
m_gear = -1;
59+
can_gear = -1;
6060
break;
6161
case 0x20: // Neutral
62-
m_gear = 0;
62+
can_gear = 0;
6363
break;
6464
case 0x70: // Drive
65-
m_gear = 1;
65+
can_gear = 1;
6666
break;
6767
}
6868
break;
6969
}
7070
case 0x350:
7171
{
7272
REQ_DLC(7);
73-
bool awake = (CAN_BYTE(0) > 0xc0);
74-
bool locked = (CAN_BYTE(6) == 0x96) || (mt_driver_door_locked->AsBool(false) && !DoorOpen());
75-
StdMetrics.ms_v_env_locked->SetValue(locked);
76-
StdMetrics.ms_v_env_awake->SetValue(awake);
77-
if (awake && !mt_bus_awake->AsBool())
73+
can_awake = (CAN_BYTE(0) > 0xc0);
74+
can_locked = (CAN_BYTE(6) == 0x96) || (mt_driver_door_locked->AsBool(false) && !DoorOpen());
75+
if (can_awake && !mt_bus_awake->AsBool())
7876
{
7977
ESP_LOGI(TAG,"Car has woken (CAN bus activity)");
8078
mt_bus_awake->SetValue(true);
@@ -103,11 +101,10 @@ void OvmsVehicleSmartEQ::IncomingFrameCan1(CAN_frame_t* p_frame) {
103101
case 0x392:
104102
{
105103
REQ_DLC(6);
106-
bool hvac_on = (CAN_BYTE(1) & 0x40) > 0;
107-
StdMetrics.ms_v_env_hvac->SetValue(hvac_on);
108-
if (hvac_on)
104+
can_hvac = (CAN_BYTE(1) & 0x40) > 0;
105+
if (can_hvac || IsOnEQ())
109106
{
110-
StdMetrics.ms_v_env_cabintemp->SetValue(CAN_BYTE(5) - 40.0f);
107+
can_cabintemp = CAN_BYTE(5) - 40.0f;
111108
}
112109
break;
113110
}
@@ -120,33 +117,33 @@ void OvmsVehicleSmartEQ::IncomingFrameCan1(CAN_frame_t* p_frame) {
120117
// Ignore invalid sensor reading (0x7F = 127 → 87°C after offset)
121118
if (raw_temp != 0x7F)
122119
{
123-
StdMetrics.ms_v_bat_temp->SetValue(_temp);
120+
can_bat_temp = _temp;
124121
}
125122

126-
StdMetrics.ms_v_bat_voltage->SetValue((float)((CAN_UINT(3) >> 5) & 0x3ff) / 2.0f);
127-
StdMetrics.ms_v_charge_climit->SetValue((c >> 20) & 0x3Fu);
123+
can_bat_voltage = (float)((CAN_UINT(3) >> 5) & 0x3ff) / 2.0f;
124+
can_charge_climit = (c >> 20) & 0x3Fu;
128125

129126
break;
130127
}
131128
case 0x4F8:
132129
REQ_DLC(3);
133-
StdMetrics.ms_v_env_handbrake->SetValue((CAN_BYTE(0) & 0x08) > 0);
134-
//StdMetrics.ms_v_env_awake->SetValue((CAN_BYTE(0) & 0x40) > 0); // Ignition on
130+
can_handbrake = (CAN_BYTE(0) & 0x08) > 0;
131+
//can_awake = (CAN_BYTE(0) & 0x40) > 0; // Ignition on
135132
break;
136133
case 0x5D7: // Speed, ODO
137134
REQ_DLC(6);
138-
StdMetrics.ms_v_pos_speed->SetValue((float) CAN_UINT(0) / 100.0f);
139-
StdMetrics.ms_v_pos_odometer->SetValue((float) (CAN_UINT32(2)>>4) / 100.0f);
135+
can_speed = (float) CAN_UINT(0) / 100.0f;
136+
can_odometer = (float) (CAN_UINT32(2)>>4) / 100.0f;
140137
mt_pos_odometer_trip->SetValue((float) (CAN_UINT(4)>>4) / 100.0f);
141138
break;
142139
case 0x5de:
143140
REQ_DLC(8);
144-
StdMetrics.ms_v_env_headlights->SetValue((CAN_BYTE(0) & 0x04) > 0);
145-
StdMetrics.ms_v_door_fl->SetValue((CAN_BYTE(1) & 0x08) > 0);
146-
StdMetrics.ms_v_door_fr->SetValue((CAN_BYTE(1) & 0x02) > 0);
147-
StdMetrics.ms_v_door_rl->SetValue((CAN_BYTE(2) & 0x40) > 0);
148-
StdMetrics.ms_v_door_rr->SetValue((CAN_BYTE(2) & 0x10) > 0);
149-
StdMetrics.ms_v_door_trunk->SetValue((CAN_BYTE(7) & 0x10) > 0);
141+
can_headlights = (CAN_BYTE(0) & 0x04) > 0;
142+
can_door_fl = (CAN_BYTE(1) & 0x08) > 0;
143+
can_door_fr = (CAN_BYTE(1) & 0x02) > 0;
144+
can_door_rl = (CAN_BYTE(2) & 0x40) > 0;
145+
can_door_rr = (CAN_BYTE(2) & 0x10) > 0;
146+
can_door_trunk = (CAN_BYTE(7) & 0x10) > 0;
150147
break;
151148
case 0x62d:
152149
REQ_DLC(3);
@@ -161,7 +158,7 @@ void OvmsVehicleSmartEQ::IncomingFrameCan1(CAN_frame_t* p_frame) {
161158
mt_worst_consumption->SetValue(worst_consumption);
162159
mt_best_consumption->SetValue(best_consumption);
163160
mt_bcb_power_mains->SetValue(bcb_power_mains);
164-
StdMetrics.ms_v_bat_consumption->SetValue(best_consumption * 10.0f); // convert to Wh/km
161+
can_bat_consumption = best_consumption * 10.0f; // convert to Wh/km
165162
break;
166163
}
167164
case 0x637:
@@ -193,45 +190,33 @@ void OvmsVehicleSmartEQ::IncomingFrameCan1(CAN_frame_t* p_frame) {
193190
if(trip_energy < 0x7FFF)
194191
mt_reset_energy->SetValue((float)trip_energy * 0.1f);
195192
mt_reset_speed->SetValue((float)avg_speed * 0.1f);
196-
if(m_bcvalue){
197-
StdMetrics.ms_v_gen_kwh_grid_total->SetValue((float)rest_consumption); // not the best idea at the moment
198-
} else {
199-
StdMetrics.ms_v_gen_kwh_grid_total->SetValue(0.0f);
200-
}
193+
can_kwh_grid_total = m_bcvalue ? (float)rest_consumption : 0.0f;
201194
break;
202195
}
203196
case 0x654: // SOC / charge port status
204197
{
205198
REQ_DLC(4);
206199
float _soc = (float) CAN_BYTE(3);
207-
if (_soc <= 100.0f) StdMetrics.ms_v_bat_soc->SetValue(_soc); // SOC
208-
StdMetrics.ms_v_door_chargeport->SetValue((CAN_BYTE(0) & 0x20) != 0); // ChargingPlugConnected
200+
if (_soc <= 100.0f) can_soc = _soc; // SOC
201+
can_chargeport = (CAN_BYTE(0) & 0x20) != 0; // ChargingPlugConnected
209202
int _duration_full = (((c >> 22) & 0x3ffu) < 0x3ff) ? (c >> 22) & 0x3ffu : 0;
210203
mt_obd_duration->SetValue((int)(_duration_full), Minutes);
211204
float _range_est = ((c >> 12) & 0x3FFu); // VehicleAutonomy
212-
float _bat_temp = StdMetrics.ms_v_bat_temp->AsFloat(0) - 20.0;
205+
float _bat_temp = can_bat_temp - 20.0;
213206
float _full_km = m_full_km;
214207
float _range_cac = _full_km + (_bat_temp); // temperature compensation +/- range
215208
if (_range_est != 1023.0f)
216209
{
217-
StdMetrics.ms_v_bat_range_est->SetValue(_range_est);
210+
can_range_est = _range_est;
218211

219212
if (_soc > 0.1f) // prevent div/0
220213
{
221-
StdMetrics.ms_v_bat_range_full->SetValue((_range_est / _soc) * 100.0f);
222-
StdMetrics.ms_v_bat_range_ideal->SetValue((_range_cac * _soc) / 100.0f);
214+
can_range_full = (_range_est / _soc) * 100.0f;
215+
can_range_ideal = (_range_cac * _soc) / 100.0f;
223216
}
224217
}
225218
break;
226219
}
227-
case 0x656:
228-
{
229-
REQ_DLC(7);
230-
float _env_temp = (float) CAN_BYTE(6) - 40.0f;
231-
if (_env_temp > -40.0f && _env_temp < 85.0f)
232-
StdMetrics.ms_v_env_temp->SetValue(_env_temp);
233-
break;
234-
}
235220
case 0x658:
236221
{
237222
REQ_DLC(6);
@@ -246,24 +231,24 @@ void OvmsVehicleSmartEQ::IncomingFrameCan1(CAN_frame_t* p_frame) {
246231
last_bat_serial = bat_serial;
247232
}
248233
float _soh = (float)(CAN_BYTE(4) & 0x7Fu);
249-
if (_soh <= 100.0f) StdMetrics.ms_v_bat_soh->SetValue(_soh); // SOH
250-
StdMetrics.ms_v_bat_health->SetValue(
234+
if (_soh <= 100.0f) can_soh = _soh; // SOH
235+
can_bat_health =
251236
(_soh >= 95.0f) ? "excellent"
252237
: (_soh >= 85.0f) ? "good"
253238
: (_soh >= 75.0f) ? "average"
254239
: (_soh >= 65.0f) ? "poor"
255-
: "consider replacement");
256-
StdMetrics.ms_v_charge_inprogress->SetValue(CAN_BYTE(5) & 0x20);
240+
: "consider replacement";
241+
can_charge_inprogress = (CAN_BYTE(5) & 0x20) != 0;
257242
break;
258243
}
259244
case 0x668:
260245
REQ_DLC(1);
261-
StdMetrics.ms_v_env_on->SetValue((CAN_BYTE(0) & 0x40) > 0); // Drive Ready
246+
can_env_on = (CAN_BYTE(0) & 0x40) > 0; // Drive Ready
262247
break;
263248
case 0x673:
264249
{
265250
// TPMS pressure values only used, when CAN write is disabled, otherwise utilize PollReply_TPMS_InputCapt
266-
if ((!m_enable_write && !m_enable_write_caron) || !m_obdii_745_tpms)
251+
if (!IsCANwrite() || !m_obdii_745_tpms)
267252
{
268253
REQ_DLC(6);
269254
// Read TPMS pressure values:
@@ -275,7 +260,7 @@ void OvmsVehicleSmartEQ::IncomingFrameCan1(CAN_frame_t* p_frame) {
275260
if (m_tpms_temp_enable)
276261
{
277262
// Dummy value to indicate valid temp reading, actual temp value is not available in this frame, but can be read via PollReply_TPMS_InputCapt when CAN write is enabled
278-
m_tpms_temperature[i] = StdMetrics.ms_v_env_temp->AsFloat(1.1f);
263+
m_tpms_temperature[i] = StdMetrics.ms_v_env_temp->AsFloat(0.0f); // use ambient temp as dummy value for valid reading, since actual temp is not available in this frame
279264
}
280265
// Prevent warnings when readings are valid if the data is not read via OBDII.
281266
m_tpms_lowbatt[i] = 0;
@@ -290,3 +275,36 @@ void OvmsVehicleSmartEQ::IncomingFrameCan1(CAN_frame_t* p_frame) {
290275
break;
291276
}
292277
}
278+
279+
// Sync CAN datapoints to OVMS metrics, called by Ticker1, because CAN refresh rate is too high
280+
void OvmsVehicleSmartEQ::smartCAN2Metrics()
281+
{
282+
StdMetrics.ms_v_env_gear->SetValue(can_gear);
283+
StdMetrics.ms_v_env_locked->SetValue(can_locked);
284+
StdMetrics.ms_v_env_awake->SetValue(can_awake);
285+
StdMetrics.ms_v_env_hvac->SetValue(can_hvac);
286+
StdMetrics.ms_v_env_cabintemp->SetValue(can_cabintemp);
287+
StdMetrics.ms_v_bat_temp->SetValue(can_bat_temp);
288+
StdMetrics.ms_v_bat_voltage->SetValue(can_bat_voltage);
289+
StdMetrics.ms_v_charge_climit->SetValue(can_charge_climit);
290+
StdMetrics.ms_v_env_handbrake->SetValue(can_handbrake);
291+
StdMetrics.ms_v_pos_speed->SetValue(can_speed);
292+
StdMetrics.ms_v_pos_odometer->SetValue(can_odometer);
293+
StdMetrics.ms_v_env_headlights->SetValue(can_headlights);
294+
StdMetrics.ms_v_door_fl->SetValue(can_door_fl);
295+
StdMetrics.ms_v_door_fr->SetValue(can_door_fr);
296+
StdMetrics.ms_v_door_rl->SetValue(can_door_rl);
297+
StdMetrics.ms_v_door_rr->SetValue(can_door_rr);
298+
StdMetrics.ms_v_door_trunk->SetValue(can_door_trunk);
299+
StdMetrics.ms_v_bat_consumption->SetValue(can_bat_consumption);
300+
StdMetrics.ms_v_gen_kwh_grid_total->SetValue(can_kwh_grid_total);
301+
StdMetrics.ms_v_bat_soc->SetValue(can_soc);
302+
StdMetrics.ms_v_door_chargeport->SetValue(can_chargeport);
303+
StdMetrics.ms_v_bat_range_est->SetValue(can_range_est);
304+
StdMetrics.ms_v_bat_range_full->SetValue(can_range_full);
305+
StdMetrics.ms_v_bat_range_ideal->SetValue(can_range_ideal);
306+
StdMetrics.ms_v_bat_soh->SetValue(can_soh);
307+
StdMetrics.ms_v_bat_health->SetValue(can_bat_health);
308+
StdMetrics.ms_v_charge_inprogress->SetValue(can_charge_inprogress);
309+
StdMetrics.ms_v_env_on->SetValue(can_env_on);
310+
}

vehicle/OVMS.V3/components/vehicle_smarteq/src/eq_cmds_override.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ OvmsVehicle::vehicle_command_t OvmsVehicleSmartEQ::CommandClimateControl(bool en
6565
return Success;
6666
}
6767
// force enable write access for sending the command, even when user has not enabled it (can be required for some vehicles to wake up the car)
68-
bool force = !m_enable_write && !m_enable_write_caron ? true : false;
68+
bool force = !IsCANwrite() ? true : false;
6969
if(force)
7070
{
7171
m_enable_write_caron = true;
@@ -201,7 +201,7 @@ OvmsVehicle::vehicle_command_t OvmsVehicleSmartEQ::CommandHomelink(int button, i
201201
}
202202

203203
OvmsVehicle::vehicle_command_t OvmsVehicleSmartEQ::CommandWakeup() {
204-
if(!m_enable_write && !m_enable_write_caron)
204+
if(!IsCANwrite())
205205
{
206206
ESP_LOGE(TAG, "CommandWakeup failed: no write access!");
207207
return Fail;
@@ -245,7 +245,7 @@ OvmsVehicle::vehicle_command_t OvmsVehicleSmartEQ::CommandWakeup() {
245245
}
246246

247247
OvmsVehicle::vehicle_command_t OvmsVehicleSmartEQ::CommandWakeup2() {
248-
if(!m_enable_write && !m_enable_write_caron)
248+
if(!IsCANwrite())
249249
{
250250
ESP_LOGE(TAG, "CommandWakeup2 failed: no write access!");
251251
return Fail;
@@ -289,7 +289,7 @@ OvmsVehicle::vehicle_command_t OvmsVehicleSmartEQ::CommandWakeup2() {
289289

290290
// lock: can can1 tx st 745 04 30 01 00 00
291291
OvmsVehicle::vehicle_command_t OvmsVehicleSmartEQ::CommandLock(const char* pin) {
292-
if(!m_enable_write && !m_enable_write_caron)
292+
if(!IsCANwrite())
293293
{
294294
ESP_LOGE(TAG, "CommandLock failed / no write access");
295295
return Fail;
@@ -326,7 +326,7 @@ OvmsVehicle::vehicle_command_t OvmsVehicleSmartEQ::CommandLock(const char* pin)
326326
// unlock: can can1 tx st 745 04 30 01 00 01
327327
OvmsVehicle::vehicle_command_t OvmsVehicleSmartEQ::CommandUnlock(const char* pin) {
328328

329-
if(!m_enable_write && !m_enable_write_caron)
329+
if(!IsCANwrite())
330330
{
331331
ESP_LOGE(TAG, "CommandUnlock failed / no write access");
332332
return Fail;

vehicle/OVMS.V3/components/vehicle_smarteq/src/eq_commands.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ static const char *TAG = "v-smarteq";
3636

3737
// CommandCanVector(txid, rxid, hexbytes = {"30010000","30082002"}, reset CAN = true/false, CommandWakeup = true/ CommandWakeup2 = false)
3838
OvmsVehicle::vehicle_command_t OvmsVehicleSmartEQ::CommandCanVector(uint32_t txid,uint32_t rxid, std::vector<std::string> hexbytes,bool reset,bool wakeup) {
39-
if(!m_enable_write && !m_enable_write_caron)
39+
if(!IsCANwrite())
4040
{
4141
ESP_LOGE(TAG, "CommandCanVector failed / no write access");
4242
return Fail;
@@ -184,7 +184,7 @@ void OvmsVehicleSmartEQ::xsq_canwrite(int verbosity, OvmsWriter* writer, OvmsCom
184184
if (!smarteq)
185185
return;
186186

187-
if(!smarteq->m_ddt4all || !smarteq->m_enable_write) {
187+
if(!smarteq->m_ddt4all || !smarteq->IsCANwrite()) {
188188
ESP_LOGE(TAG, "DDT4all failed / no Canbus write access or DDT4all not enabled");
189189
writer->puts("DDT4all failed / no Canbus write access or DDT4all not enabled");
190190
return;
@@ -574,7 +574,8 @@ OvmsVehicle::vehicle_command_t OvmsVehicleSmartEQ::CommandPreset(int verbosity,
574574
"obdii_79b",
575575
"obdii_7e4",
576576
"obdii_7e4_modify",
577-
"basic_tpms"
577+
"basic_tpms",
578+
"calc.adcfactor.samples"
578579
};
579580

580581
int removed_count = 0;

vehicle/OVMS.V3/components/vehicle_smarteq/src/eq_ddt4all.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ OvmsVehicle::vehicle_command_t OvmsVehicleSmartEQ::CommandDDT4all(int number, Ov
6363
return Success;
6464
}
6565

66-
if((!m_ddt4all || !m_enable_write) && number > 9) {
66+
if((!m_ddt4all || !IsCANwrite()) && number > 9) {
6767
ESP_LOGE(TAG, "DDT4all failed / no Canbus write access or DDT4all not enabled");
6868
writer->printf("DDT4all failed / no Canbus write access or DDT4all not enabled");
6969
return Fail;

vehicle/OVMS.V3/components/vehicle_smarteq/src/eq_features.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ void OvmsVehicleSmartEQ::ReCalcADCfactor(float can12V, OvmsWriter* writer) {
380380
mt_adc_factor_history->SetElemValues(0, n, hist);
381381
mt_adc_factor->SetValue(adc_factor_new);
382382
MyConfig.SetParamValueFloat("system.adc", "factor12v", adc_factor_new);
383+
MyConfig.SetParamValueBool("xsq", "calc.adcfactor", false);
383384
if (writer) writer->printf("New ADC factor stored: %.3f (prev %.3f, history size %u)\n", adc_factor_new, adc_factor_prev, (unsigned)n);
384385
#else
385386
ESP_LOGD(TAG, "ADC support not enabled");
@@ -470,7 +471,7 @@ void OvmsVehicleSmartEQ::smartOn()
470471
// reset idle ticker when vehicle turned on to prevent trigger every 60 sec.
471472
m_idle_ticker = 15 * 60;
472473
// canwrite enable write access, only when car is on
473-
if(m_enable_write || m_enable_write_caron)
474+
if(IsCANwrite())
474475
{
475476
smartCANmode(true);
476477
}
@@ -517,11 +518,11 @@ void OvmsVehicleSmartEQ::smartChargeStart()
517518
// trigger ADC factor recalculation when HV charging started
518519
if(m_enable_calcADCfactor && !m_ADCfactor_recalc)
519520
{
520-
m_ADCfactor_recalc_timer = 4; // wait at least 4 min. before recalculation
521+
m_ADCfactor_recalc_timer = 2; // wait at least 2 min. before recalculation
521522
m_ADCfactor_recalc = true; // recalculate ADC factor when HV charging
522523
}
523524
// canwrite enable write access, only when car is on
524-
if(m_enable_write || m_enable_write_caron)
525+
if(IsCANwrite())
525526
{
526527
m_poll_on_charge = true;
527528
smartCANmode(true);
@@ -553,7 +554,7 @@ void OvmsVehicleSmartEQ::smartChargeStop()
553554
StdMetrics.ms_v_charge_substate->SetValue("onrequest");
554555
}
555556
// stop recalculation when HV charging stopped
556-
m_ADCfactor_recalc_timer = 0;
557+
m_ADCfactor_recalc_timer = 2;
557558
m_ADCfactor_recalc = false;
558559
ESP_LOGD(TAG, "smartChargeStop()");
559560
}
@@ -563,7 +564,7 @@ void OvmsVehicleSmartEQ::smartChargePrepare()
563564
if (m_charge_finished) ResetChargingValues();
564565
if (m_resettrip) ResetTripCounters();
565566
// canwrite enable write access, only when car is on
566-
if(m_enable_write || m_enable_write_caron)
567+
if(IsCANwrite())
567568
{
568569
m_poll_on_charge = true;
569570
smartCANmode(true);
@@ -581,7 +582,7 @@ void OvmsVehicleSmartEQ::smartChargeFinish()
581582

582583
void OvmsVehicleSmartEQ::smartCANmode(bool activate)
583584
{
584-
if(!m_enable_write && !m_enable_write_caron)
585+
if(!IsCANwrite())
585586
{
586587
m_can1->Stop();
587588
vTaskDelay(200 / portTICK_PERIOD_MS);

vehicle/OVMS.V3/components/vehicle_smarteq/src/eq_handle.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void OvmsVehicleSmartEQ::HandlePollState() {
3939

4040
static const char* state_names[] = {"Off", "Awake", "Running", "Charging"};
4141
static const char* state_disabled = "Pollstate Off (write disabled)";
42-
if (!m_enable_write && !m_enable_write_caron)
42+
if (!IsCANwrite())
4343
{
4444
if (m_poll_state != POLLSTATE_OFF)
4545
{

0 commit comments

Comments
 (0)