@@ -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+ }
0 commit comments