[Ovmsdev] Coding help

Shane @ Kilve Engineering shane at kilve-engineering.co.uk
Sat Mar 6 00:59:08 HKT 2021


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_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



> On 5 Mar 2021, at 12:37, Michael Balzer <dexter at expeedo.de> wrote:
> 
> Shane,
> 
> on OBD polling basics: http://lists.openvehicles.com/pipermail/ovmsdev/2020-December/014758.html <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 at expeedo.de <mailto:dexter at 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 at lists.openvehicles.com
> http://lists.openvehicles.com/mailman/listinfo/ovmsdev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openvehicles.com/pipermail/ovmsdev/attachments/20210305/ca65473c/attachment-0001.htm>


More information about the OvmsDev mailing list