RegisterSearchFAQMemberlistUsergroupsLog in
Reply to topic Page 1 of 1
setCANMask/setCANFilter
Author Message
Reply with quote
Post setCANMask/setCANFilter 
The documentation partially describes how to use setCANFilter and that it is dependent upon an undocumented setCANMask. If I'm looking at the source code correctly, setCANFilter is implemented but setCANMask is not. If that is the case, is the documentation incorrect and setCANFilter can be set to exclude everything but a supplied ID?

I am trying to write ISO mode $22 packet handling on a bus that is already saturated with RAW communication. I'm currently emulating setCANMask in my own script. When the ECU responds, I pass right through my software filter and process the full packet as expected. When the ECU does not respond, I'm stuck consuming RAW responses. I'm at the point where I have to find a timer to create a timeout condition on my filter when there is no response to my ID.

Here is an example of my filter in need of a timer/candidate to be replaced with setCANFilter/setCANMask:
Code:

repeat
  id, ext, frame = rxCAN(chan)
  if id == nil then
    return
  end
until id == ISO_RXID


View user's profile Send private message
Reply with quote
Post  
Based upon my research of the stm32, reading numerous posts trying to utilize CAN_FilterInit, my conclusion is setCANfilter ought to be able to provide the filtering I need. However, the posts reference a shift left of 3 or 5, sometimes set the value high or low, depending upon the filter type and data width.

Since setCANfilter forces 32-bit with IdMask mode, how does one manipulate the ID and MASK for the following:
11-bit 0x7e*
29-bit 0x18DA****

I've tried an impossible number of permutations. I can affect the filtering, but cannot explain a logical association between my ID/MASK and the output.
Here is an example of how I'd expect it to work:
setCANfilter(chan, 0, ISO_EXT, 0x18DA0000, 0x1FFF0000)
I believe it should read: 0x18DA0000 == (rxID & 0x1FFF0000) to determine if the rxID is allowed to pass or filtered away.

View user's profile Send private message
Reply with quote
Post  
Hey imstimpy,

Quote:
The documentation partially describes how to use setCANFilter and that it is dependent upon an undocumented setCANMask. If I'm looking at the source code correctly, setCANFilter is implemented but setCANMask is not. If that is the case, is the documentation incorrect and setCANFilter can be set to exclude everything but a supplied ID?


Dug into this. Indeed the documentation is incorrect. There is no setCANMask Lua method that I can see. So please ignore that and we will update it.

Quote:
Based upon my research of the stm32, reading numerous posts trying to utilize CAN_FilterInit, my conclusion is setCANfilter ought to be able to provide the filtering I need. However, the posts reference a shift left of 3 or 5, sometimes set the value high or low, depending upon the filter type and data width.

Since setCANfilter forces 32-bit with IdMask mode, how does one manipulate the ID and MASK for the following:
11-bit 0x7e*
29-bit 0x18DA****

I've tried an impossible number of permutations. I can affect the filtering, but cannot explain a logical association between my ID/MASK and the output.
Here is an example of how I'd expect it to work:
setCANfilter(chan, 0, ISO_EXT, 0x18DA0000, 0x1FFF0000)
I believe it should read: 0x18DA0000 == (rxID & 0x1FFF0000) to determine if the rxID is allowed to pass or filtered away.


This appears to be a logical conclusion. I'll ping Brent on this one since he wrote the original code. You may have found a bug with our implementation here. Stay tuned.


_________________
Andrew Stiegmann (Stieg)
Principal Engineer
Autosport Labs Inc.
View user's profile Send private message Send e-mail Visit poster's website
Reply with quote
Post  
Thanks Andrew. Let me know if there is anything further I can assist with. My project is at a standstill until we can get this resolved.

Frankly, I'm surprised any request/response communications (i.e. OBDII PIDs) work on networks with any significant RAW communication. The CAN API is so low-level, it is not currently possible to send a request and be guaranteed to read only that response. It gets even worse when handling multi-frame packets due to a lack of frame sequencing.

View user's profile Send private message
Reply with quote
Post  
Hi,

It looks like the main setCANFilter() sets both the CAN mask and filter as part of one call:

Parameters:

setCANfilter(CAN_channel, filter_id, extended_flag, filter, mask)

We'll continue to poke at this. Thanks!


_________________
Brent Picasso
CEO and Founder, Autosport Labs
Facebook | Twitter
View user's profile Send private message Send e-mail
Reply with quote
Post  
Hi, The Lua documentation for this function incorrectly referenced a setCANMask() function, but the mask itself is the last parameter in the function.

We'll do a round of testing again on the filtering capability, as soon as I link two RCPs together over CAN bus Smile


_________________
Brent Picasso
CEO and Founder, Autosport Labs
Facebook | Twitter
View user's profile Send private message Send e-mail
Reply with quote
Post  
brentp wrote:
Hi,

It looks like the main setCANFilter() sets both the CAN mask and filter as part of one call:

Parameters:

setCANfilter(CAN_channel, filter_id, extended_flag, filter, mask)

We'll continue to poke at this. Thanks!


Yes, that is correct. I confirmed it through source code, tracing it all the way down to the utilization of stm32's CAN_FilterInit. However, there is lots of discussion surrounding how the filter and mask should be defined and none of it was working.

I'd love to see functional examples of both 11-bit and 29-bit filter/mask pairs. I could not get the desired behavior for 0x136, any 0x13*, any 0x*1, 0x18DAF110, any 0x18DA, or any 0x*10. I can provide specific examples of the filter/mask pairs, but the behavior I saw made no sense as it related to my pairs.

View user's profile Send private message
Reply with quote
Post  
So just read up on this since I was unfamiliar with this functionality. This was a useful read for me: http://www.cse.dmu.ac.uk/~eg/tele/CanbusIDandMask.html

Quote:
Since setCANfilter forces 32-bit with IdMask mode, how does one manipulate the ID and MASK for the following:
11-bit 0x7e*
29-bit 0x18DA****


Based on what I read it should be the following

11 bit
Mask: 0xFFFFFFF0
Filter: 0x7E0

That should allow messages 0x7E0 - 0x7EF in (16 in total)

29 bit
Mask: 0xFFFF0000
Filter: 0x18DA0000

That should allow messages 0x18DA0000 - 0x18DAFFFF through (65536 in total).

The latter looks very similar to what you provided above. What was the value of ISO_EXT? Should be 1 for 29 bit addresses


_________________
Andrew Stiegmann (Stieg)
Principal Engineer
Autosport Labs Inc.
View user's profile Send private message Send e-mail Visit poster's website
Reply with quote
Post  
Stieg, that is all correct except that it doesn't work on the RCP. The only difference between 0x1FFF and 0xFFFF is the upper three bits aren't valid for 29-bit and become ignored.

At first glance, it ought to be that simple, and it is that simple on other hardware. However, the stm32 API appears to require different shifts based upon the filtering mode and filter/mask width. A 29-bit ID of 0x18DA0000, according to some posts, ought to be left-shifted by 3 bits and RCR and something else is masked into the lowest 3 bits resulting in 0xC6D00004 (which also doesn't work). A 16-bit list mode requires a left-shifted by 5, according to a German forum, but the RCP firmware always forces 32-bit ID/mask.

ISO_EXT is 1, however that variable is unused within the RCP firmware.

View user's profile Send private message
Reply with quote
Post  
Filed https://github.com/autosportlabs/RaceCapture-Pro_firmware/issues/737 to track checking and validating CAN filters. Will you tell us more about how you have things setup. CAN 0 or 1? Address lengths you are trying to use? All of that information may be important in debugging the issue. TIA.


_________________
Andrew Stiegmann (Stieg)
Principal Engineer
Autosport Labs Inc.
View user's profile Send private message Send e-mail Visit poster's website
Reply with quote
Post  
initCAN(0, 500000)

I'm sending on ISO_TXID = 0x18DA10F1 and looking to receive on ISO_RXID = 0x18DAF110, both 29-bit Honda addressing. I was also experimenting with reading a single RAW_RXID = 0x136.

Attached is my test script for further detail.

View user's profile Send private message
Reply with quote
Post  
Which firmware release is the fix scheduled for? I'm also curious if you managed to get a good test case. I believe I attempted to replicate the values that would have otherwise been set with the shifts, however they did not work.

View user's profile Send private message
Reply with quote
Post  
Just did merge in the fix 5 minutes ago. Will be part of the next RC for 2.10.0 when that goes out the door. Tested it locally with the script in the linked ticket and got expected output.


_________________
Andrew Stiegmann (Stieg)
Principal Engineer
Autosport Labs Inc.
View user's profile Send private message Send e-mail Visit poster's website
Reply with quote
Post  
stieg wrote:
Just did merge in the fix 5 minutes ago. Will be part of the next RC for 2.10.0 when that goes out the door. Tested it locally with the script in the linked ticket and got expected output.


Good News!

I was struggling with this, specifically with the formatting of the Mask and Filter.
Looking to mask Byte 2 and 3 with 0FFF...

Wont thread jack, ill start another with my specific details, but subbed to this in the mean time.

Ill keep an eye out for 2.10, and hopefully updated documentation?

Thanks!

View user's profile Send private message
Display posts from previous:
Reply to topic Page 1 of 1
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You cannot download files in this forum