Skip to content

Commit dc396e2

Browse files
committed
VW e-Up: improve trip distance resolution
1 parent 5a19e47 commit dc396e2

File tree

4 files changed

+43
-15
lines changed

4 files changed

+43
-15
lines changed

vehicle/OVMS.V3/components/vehicle_vweup/src/vehicle_vweup.cpp

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
#include <string>
3030
static const char *TAG = "v-vweup";
3131

32-
#define VERSION "0.21.1"
32+
#define VERSION "0.22.1"
3333

3434
#include <stdio.h>
3535
#include <string>
@@ -105,6 +105,10 @@ OvmsVehicleVWeUp::OvmsVehicleVWeUp()
105105

106106
m_chg_ctp_car = -1;
107107

108+
m_odo_trip = 0;
109+
m_tripfrac_reftime = 0;
110+
m_tripfrac_refspeed = 0;
111+
108112
// Init metrics:
109113
m_version = MyMetrics.InitString("xvu.m.version", 0, VERSION " " __DATE__ " " __TIME__);
110114

@@ -366,7 +370,7 @@ void OvmsVehicleVWeUp::MetricModified(OvmsMetric* metric)
366370
if (soh_new)
367371
SetSOH(soh_new);
368372
}
369-
373+
370374
// Pass update on to standard handler:
371375
OvmsVehicle::MetricModified(metric);
372376
}
@@ -566,6 +570,10 @@ void OvmsVehicleVWeUp::ResetTripCounters()
566570
{
567571
// Clear per trip counters:
568572
StdMetrics.ms_v_pos_trip->SetValue(0);
573+
m_odo_trip = 0;
574+
m_tripfrac_reftime = esp_log_timestamp();
575+
m_tripfrac_refspeed = StdMetrics.ms_v_pos_speed->AsFloat();
576+
569577
StdMetrics.ms_v_bat_energy_recd->SetValue(0);
570578
StdMetrics.ms_v_bat_energy_used->SetValue(0);
571579
StdMetrics.ms_v_bat_coulomb_recd->SetValue(0);
@@ -576,19 +584,42 @@ void OvmsVehicleVWeUp::ResetTripCounters()
576584
if (IsOBDReady()) {
577585
m_soc_abs_start = BatMgmtSoCAbs->AsFloat();
578586
}
579-
m_odo_start = StdMetrics.ms_v_pos_odometer->AsFloat();
580587
m_soc_norm_start = StdMetrics.ms_v_bat_soc->AsFloat();
581588
m_energy_recd_start = StdMetrics.ms_v_bat_energy_recd_total->AsFloat();
582589
m_energy_used_start = StdMetrics.ms_v_bat_energy_used_total->AsFloat();
583590
m_coulomb_recd_start = StdMetrics.ms_v_bat_coulomb_recd_total->AsFloat();
584591
m_coulomb_used_start = StdMetrics.ms_v_bat_coulomb_used_total->AsFloat();
585592

586-
ESP_LOGD(TAG, "Trip start ref: socnrm=%f socabs=%f odo=%f, er=%f, eu=%f, cr=%f, cu=%f",
587-
m_soc_norm_start, m_soc_abs_start, m_odo_start,
593+
ESP_LOGD(TAG, "Trip start ref: socnrm=%f socabs=%f, er=%f, eu=%f, cr=%f, cu=%f",
594+
m_soc_norm_start, m_soc_abs_start,
588595
m_energy_recd_start, m_energy_used_start, m_coulomb_recd_start, m_coulomb_used_start);
589596
}
590597

591598

599+
/**
600+
* UpdateTripOdo: odometer resolution is only 1 km, so trip distances lack
601+
* precision. To compensate, this method derives trip distance from speed.
602+
*/
603+
void OvmsVehicleVWeUp::UpdateTripOdo()
604+
{
605+
// Process speed update:
606+
uint32_t now = esp_log_timestamp();
607+
float speed = StdMetrics.ms_v_pos_speed->AsFloat();
608+
609+
if (m_tripfrac_reftime && now > m_tripfrac_reftime)
610+
{
611+
float speed_avg = ABS(speed + m_tripfrac_refspeed) / 2;
612+
uint32_t time_ms = now - m_tripfrac_reftime;
613+
double meters = speed_avg / 3.6 * time_ms / 1000;
614+
m_odo_trip += meters / 1000;
615+
StdMetrics.ms_v_pos_trip->SetValue(TRUNCPREC(m_odo_trip,3));
616+
}
617+
618+
m_tripfrac_reftime = now;
619+
m_tripfrac_refspeed = speed;
620+
}
621+
622+
592623
/**
593624
* ResetChargeCounters: call at charge start to set reference points
594625
* Called by the connector subsystem detecting vehicle state changes,

vehicle/OVMS.V3/components/vehicle_vweup/src/vehicle_vweup.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ class OvmsVehicleVWeUp : public OvmsVehicle
142142

143143
protected:
144144
void ResetTripCounters();
145+
void UpdateTripOdo();
145146
void ResetChargeCounters();
146147
void SetChargeType(chg_type_t chgtype);
147148
void SetChargeState(bool charging);
@@ -199,7 +200,9 @@ class OvmsVehicleVWeUp : public OvmsVehicle
199200

200201
private:
201202
use_phase_t m_use_phase;
202-
float m_odo_start;
203+
double m_odo_trip;
204+
uint32_t m_tripfrac_reftime;
205+
float m_tripfrac_refspeed;
203206
float m_soc_norm_start;
204207
float m_soc_abs_start;
205208
float m_energy_recd_start;

vehicle/OVMS.V3/components/vehicle_vweup/src/vweup_obd.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,8 +1144,9 @@ void OvmsVehicleVWeUp::IncomingPollReply(canbus *bus, uint16_t type, uint16_t pi
11441144
break;
11451145

11461146
case VWUP_MOT_ELEC_SPEED:
1147-
if (PollReply.FromUint8("VWUP_MOT_ELEC_SPEED", value)) {
1147+
if (PollReply.FromUint8("VWUP_MOT_ELEC_SPEED", value) && value < 250) {
11481148
StdMetrics.ms_v_pos_speed->SetValue(value);
1149+
UpdateTripOdo();
11491150
VALUE_LOG(TAG, "VWUP_MOT_ELEC_SPEED=%f", value);
11501151
}
11511152
break;
@@ -1195,10 +1196,6 @@ void OvmsVehicleVWeUp::IncomingPollReply(canbus *bus, uint16_t type, uint16_t pi
11951196
case VWUP_BAT_MGMT_ODOMETER:
11961197
if (PollReply.FromUint24("VWUP_BAT_MGMT_ODOMETER", value, 1) && value < 10000000) {
11971198
StdMetrics.ms_v_pos_odometer->SetValue(value);
1198-
// Set trip reference / difference:
1199-
if (m_odo_start <= 0)
1200-
m_odo_start = value;
1201-
StdMetrics.ms_v_pos_trip->SetValue(value - m_odo_start);
12021199
VALUE_LOG(TAG, "VWUP_BAT_MGMT_ODOMETER=%f", value);
12031200
}
12041201
break;

vehicle/OVMS.V3/components/vehicle_vweup/src/vweup_t26.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -385,15 +385,12 @@ void OvmsVehicleVWeUp::IncomingFrameCan3(CAN_frame_t *p_frame)
385385
case 0x65D: { // ODO
386386
float odo = (float) (((uint32_t)(d[3] & 0xf) << 12) | ((UINT)d[2] << 8) | d[1]);
387387
StandardMetrics.ms_v_pos_odometer->SetValue(odo);
388-
// so far we don't know where to get trip distance directly:
389-
if (m_odo_start <= 0)
390-
m_odo_start = odo;
391-
StandardMetrics.ms_v_pos_trip->SetValue(odo - m_odo_start);
392388
break;
393389
}
394390

395391
case 0x320: // Speed
396392
StandardMetrics.ms_v_pos_speed->SetValue(((d[4] << 8) + d[3] - 1) / 190);
393+
UpdateTripOdo();
397394
CalculateAcceleration(); // only necessary until we find acceleration on T26
398395
break;
399396

0 commit comments

Comments
 (0)