Shane
*******
#include "ovms_log.h"
static const char *TAG = "v-edeliver3";
#include "vehicle_edeliver3.h"
#include "metrics_standard.h"
namespace {
const OvmsVehicle::poll_pid_t obdii_polls[] =
{
{ 0x7e3,
0x7eb,
VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xf194, { 10, 10, 10, 10 }, 0,
ISOTP_STD }, //VIN
{ 0x7e3,
0x7eb,
VEHICLE_POLL_TYPE_OBDIIEXTENDED, 0xe003, {
10, 10, 10, 10 }, 0,
ISOTP_STD }, //SOH
POLL_LIST_END
};
};
OvmsVehicleEdeliver3::OvmsVehicleEdeliver3()
{
ESP_LOGI(TAG, "Start eDeliver3 vehicle
module");
RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS);
}
OvmsVehicleEdeliver3::~OvmsVehicleEdeliver3()
{
ESP_LOGI(TAG, "Stop eDeliver3 vehicle
module");
memset(m_vin, 0, sizeof(m_vin));
}
//testing polls
void OvmsVehicleEdeliver3::IncomingPollReply(
canbus* bus, uint16_t type, uint16_t pid, uint8_t*
data, uint8_t length, uint16_t mlremain)
{
string& rxbuf = med_obd_rxbuf;
OvmsVehicle::PollSetPidList(m_can1, obdii_polls);
OvmsVehicle::PollSetState(0);
//
init / fill rx buffer:
if
(m_poll_ml_frame == 0) {
rxbuf.clear();
rxbuf.reserve(length + mlremain);
}
rxbuf.append((char*)data, length);
if
(mlremain)
return;
//
complete:
switch
(pid) {
case
0xe003:
{
unsigned
int
soh_raw = ((unsigned int)rxbuf[0] <<
8) | (unsigned
int)rxbuf[1];
float
soh = soh_raw / 10;
StdMetrics.ms_v_bat_soh->SetValue(soh);
break;
}
}
}
// end testing polls
Shane,
on OBD polling basics:
http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html
Regards,
Michael
Am 04.03.21 um
19:45 schrieb Shane @ Kilve Engineering:
Good evening Michael,
Or any one that has the time
to help,
Ive now successfully retrieved
as much info as I can without polling any
info for the maxus, but I have have now
found an ecu that responds to pid
requests.
For example if I use the obdii
pid scanner I get the loads of data back
and I’ve decoded some of it, just need a
bit of guidance how to write the code to
get the same info
A part of a scan is as follows
Scan
complete (7e3 e000-e100)
Scan
started : 2021-03-04 18:32:36 GMT
Last
response: 2021-03-04 18:32:39 GMT
7e3[7eb]:e000
00
7e3[7eb]:e001
64
7e3[7eb]:e002
4b
7e3[7eb]:e003
26 bc
7e3[7eb]:e004
00 07
7e3[7eb]:e005
2f
7e3[7eb]:e006
2e
7e3[7eb]:e007
02 00
7e3[7eb]:e008
01 ff
7e3[7eb]:e009
02 00
7e3[7eb]:e010
02 00
I
know that e003 is SOH = 26bc = 9916
/100 = 99.16% SOH
And
e002 is a temp 4b = 75 / 10 = 7.5
degrees
So
if some one can help me with an
example of how to correctly code this
one I can work out the rest,
Ive
looked through various vehicles but
everyone uses different methods and I
can’t seem to get one to work for me.
Any
help much appreciated
Shane
Shane,
I forgot to mention: if you're
working on a new vehicle module,
you'll also need to start the bus
somewhere in your initialization
code. Example:
RegisterCanBus(1,
CAN_MODE_ACTIVE,
CAN_SPEED_500KBPS);
Regards,
Michael
Am 15.02.21 um 08:36 schrieb
Michael Balzer:
Shane,
Am 14.02.21 um 16:42 schrieb
Shane @ Kilve Engineering:
can
any one help me with a bit of
code to retrieve ve some data
from ecu can1/6f2 00 4c 00 00
01 97 bc 00 as i cant poll
this ecu it just broadcasts
when its active, ive tried
polling it but does not
respond, i need to choose one
byte and allocate it to a PID.
I don't know what you mean by
"allocating a byte to a PID",
but if you want to process
frames received directly, simply
override IncomingFrameCan1() (or
…2/3/4 depending on your bus).
Reduced example:
void
OvmsVehicleXYZ::IncomingFrameCan1(CAN_frame_t
*p_frame)
{
uint8_t *d =
p_frame->data.u8;
switch (p_frame->MsgID)
{
case 0x6f2:
// for example, assuming
the SOC is in byte 1:
StdMetrics.ms_v_bat_soc->SetValue(d[1]);
break;
}
}
If you're outside a vehicle
context, you can register your
own CAN receiver by creating a
queue and calling
MyCan.RegisterListener(). See
the vehicle module for an
example.
Regards,
Michael
--
Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
_______________________________________________
OvmsDev mailing list
OvmsDev@lists.openvehicles.com
http://lists.openvehicles.com/mailman/listinfo/ovmsdev