RegisterSearchFAQMemberlistUsergroupsLog in
Reply to topic Page 1 of 1
Questions about various lap time values and sending over CAN
Author Message
Reply with quote
Post Questions about various lap time values and sending over CAN 
I have a RCP/MK2 integrated with an AEM CD-7. I have two routes I can go

1) The AEM dash can calculate all of the timing stuff on its own via GPS data. I can simulate AEM's GPS unit (already partially done -- https://gist.github.com/thoraxe/37b7e3c1316929cc3e3f29d8917b12d4#file-sc300-lua-L3-L67 ) but I have to add "course" which I think is really just direction. Need to check with them

2) I can use the RCP lap data and send it over CAN and then display it on the CD-7. While this is easier, the CD-7 supports more lap functions than the RCP.

https://wiki.autosportlabs.com/RaceCapturePro_Lua_Scripting#Lap_Statistics

Here are the RCP lap functions:
4.7.1 getLapCount()
4.7.2 getLapTime()
4.7.3 getPredTime()
4.7.4 getAtStartFinish()
4.7.5 resetLapStats()

Here's what the dash supports:
* previous lap time
* predicted lap time
* lap count
* fastest lap time
* current running lap time (elapsed time in the present lap)
* last lap's delta against fastest lap
* +/- prediction bar

It looks like some of these align with existing functions, but some do not. All would need to be sent over CAN. The question is whether or not it makes sense to just calculate the current course/heading (to use the built-in AEM functions) or to do it via the RCP (which will require a lot more scripting).

Let's go through the above:

previous lap time
getLapTime()

predicted lap time
getPredTime()

lap count
getLapCount()

That's it for the builtins...

fastest lap time
RCP doesn't calculate this according to the Lua guide. So a variable would need to be created and then a small scriptlet (is getLapTime() < fastest_lap_var) to maintain this value

current running lap time (elapsed time in the present lap)
this one seems like it'd be complex. you'd have to use getAtStartFinish() as a conditional to then mark the current time in terms of when the start/finish was crossed (and hope that you actually caught the start/finish) and then you'd have to calculate the elapsed lap time from the start/finish time.

197MPH (theoretical gearing top speed of my car - never gonna happen) rounded up to 200MPH is 293ft/s. At a tick rate of 20 (20 samples per second) that means the vehicle moves ~15ft per tick. What is the "window" through which getAtStartFinish is calculated? Would this require a higher tick?

Last lap's delta against fastest lap
Once you have fastest lap you can calculate this

* +/- prediction bar
Once you have the fastest lap you could do math against the predicted lap to calculate a delta for this

Is it worth it to write all these scripts/calculations?

View user's profile Send private message Visit poster's website
Reply with quote
Post  
Building on my own question, here's the AEMnet CAN protocol document:

https://www.aemelectronics.com/files/pdf/AEMNet%20170116_Public.pdf

GPS_Course is a 16-bit unsigned integer whose value represents 0.01deg/bit

That being said, I'm not sure if I need to be sending these values in the raw format AEM expects the VDM to output or not.

So, the real question here is to calculate the direction of travel of the vehicle as far as the RCP is concerned, but then that likely needs to be "converted" into whatever the AEM dash is expecting. For example, I don't know if those degrees are calculated in reference to true north or in reference to the orientation of the device or what. Gotta wait for a response from AEM on that.

View user's profile Send private message Visit poster's website
Reply with quote
Post  
Still waiting for answers to some of my questions. I can use defined track start/stop points on my street to make a hillclimb-type course (Different start/finish) but I have no idea how or even if that will work for predictive timing -- it would require that the RCP remember time across power cycles...

Code:

function sendLapData()
  -- build lap data
  local lapcount = getLapCount()
  local lastlap = getLapTime()
  local predlap = getPredTime()

  -- calculate if last lap is better than best lap
  if lastlap < bestlap then
    bestlap = lastlap
  end

  -- delta between predlap and bestlap in seconds
  local lapdelta = bestlap - predlap

  -- current elapsed lap time in miliseconds
  local elapsedtime = getUptime() - lapstarttime

  -- scale values by 1000 to make integers, scale down in AEM CD-7
  local lastscale1,lastscale2 = split16(lastlap * 1000)
  local predscale1,predscale2 = split16(predlap * 1000)
  local bestscale1,bestscale2 = split16(bestlap * 1000)
  local deltascale1,deltascale2 = split16(lapdelta * 1000)
  local elapsed1,elapsed2 = split16(elapsedtime)

  -- send data
  sendcan(2, 1430, {lastscale1, lastscale2, predscale1, predscale2, bestscale1, bestscale2, deltascale1, deltascale2})
  sendcan(2, 1431, {lapcount, elapsed1, elapsed2})
end

bestlap = 0
lapstarttime = 0

function onTick()
 
  -- check whether or not we are moving and then enable logging
  setLogging()

  -- send GPS data to AEM CD7
  sendGPS()
  sendImu()

  -- check if we're at start finish to build lap runtime
  if getAtStartFinish() then
    -- start time is current time in miliseconds
    lapstarttime = getUptime()
  end

  -- send the lap data to the AEM CD7
  sendLapData()

end


Looks better in a gist:
https://gist.github.com/thoraxe/dc2f28d789e47ab323846082cc40786b

View user's profile Send private message Visit poster's website
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