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