Shane, OvmsVehicle::PollSetPidList(m_can1, obdii_polls); OvmsVehicle::PollSetState(0); needs to be done in your vehicle init, i.e. the constructor after RegisterCanBus(). Please read the vehicle_obdii module source for a complete polling example. Regards, Michael Am 05.03.21 um 17:59 schrieb Shane @ Kilve Engineering:
Thanks Michael,
Had a try and ended up with this bit added but return anything
Where am I going wrong?
Shane
*******
#include "ovms_log.h" *static**const**char**TAG= "v-edeliver3";
#include "vehicle_edeliver3.h" #include "metrics_standard.h"
*namespace* {
*const*OvmsVehicle::poll_pid_tobdii_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
On 5 Mar 2021, at 12:37, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
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
On 15 Feb 2021, at 08:05, Michael Balzer <dexter@expeedo.de <mailto:dexter@expeedo.de>> wrote:
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 <mailto:OvmsDev@lists.openvehicles.com> http://lists.openvehicles.com/mailman/listinfo/ovmsdev
_______________________________________________ OvmsDev mailing list OvmsDev@lists.openvehicles.com http://lists.openvehicles.com/mailman/listinfo/ovmsdev
-- Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal Fon 02333 / 833 5735 * Handy 0176 / 206 989 26