- 9,676
- Portland, OR
- Jump_Ace
- JUMPxACE
Thank you very much!
A-Maze-Ing stuff. Keep up the great work everyone, what a community we have here at GTP ❤️
Jerome
Thank you very much!
These two values are constant and directly written onto the packet, they are also no different in GT6-Sport-7.@tarnheld 0x58 is water temperature, 0x5C is oil temperature, could vary depending on the car, but that's roughly what you'd expect for a GT3-class car. You can confirm this by jumping into say Mazda RX-VISION GT3 or a Porsche 911 RSR and looking at the values on the cockpit dash. Other cars with detailed cockpit displays can be useful for figuring out these values too. Like some of the LMP1 cars.
Trying out cars with electric or hybrid drivetrains can also potentially uncover more values, like battery level, discharge / recharge rates. Super Formula - to observe boost behavior and so on.
Appreciate the effort by the way!
There is actually, but it's not public and requires modding to get it enabled. The simulator interface is the only available service by default.Admittedly, Python is NOT my language of choice, but if you feel up to sharing your code; drop me a DM.
Also, wanted to just throw it out there; is there any way to get OTHER data (other cars' lap times and such) than the telemetry? I was gonna look into what those PDTools could do, but got stuck on something completely different.
For the time being, just a fun thing to play around with, but it sure opens up for other things. Oh, how I wish PD would open up with things like APIs and such...
var sendString = "pitch=" + (Math.Asin(tmpPacket.Rotation.X) * 360 / Math.PI).ToString("F5") + Environment.NewLine + // ok
"roll=" + LoopAngle(Math.Asin(tmpPacket.Rotation.Z) * 360 / Math.PI, 180).ToString("F5") + Environment.NewLine + // ok
"surge=" + (tmpPacket.Velocity.X * 0.10197162129779).ToString("F5") + Environment.NewLine + // test
"yaw=" + tmpPacket.Velocity.Z.ToString("F5") + Environment.NewLine + // test
"heave=" + (tmpPacket.Velocity.Y * 0.10197162129779).ToString("F5") + Environment.NewLine + // ok
"rpm=" + tmpPacket.EngineRPM.ToString("F0") + Environment.NewLine + // ok
"speed=" + (tmpPacket.MetersPerSecond * 3.6).ToString("F0") + Environment.NewLine; // ok
Yeah, I could add support for .NET Framework down the line. It's pretty old at this point but I understand that a lot of tools are still built on it.Unfortunately i have to re-send the values via UDP to Simfeedback because of net framework incompatibilities...
But hell - at this early stage it already feels great. I was able to drive some laps. See the Video i recorded:
I converted some of the values to degrees and to g-forces. See lower part of this changeset to see calculations and which values i used for pitch, roll, heave.
Shame really, would be a REALLY nice addition just to be able to read that info with polling once per second even. What modding are we talking about here? I assume access to the debug menu or some such? Would be proper gold for league racing.There is actually, but it's not public and requires modding to get it enabled. The simulator interface is the only available service by default.
Done. That should run on both runtimes now. If something needs to be fixed or improved upon do let me know.Yeah, I could add support for .NET Framework down the line. It's pretty old at this point but I understand that a lot of tools are still built on it.
Any already build that work with other sims ? Maybe I could reformat the packet we have into a other structure (more or less) and have it work like if it was telemetry from another game (everything won't work but could considered as a poc)Do you guys know which dashboard apps for iPhone/Android are actively working on this?
Lots of them must be working insanely fast on this. First one available in the market surely will $$$$$
I used rotation xyz as well as velocity for heave, yaw and surge.Congratulations to all of you guys !
It went so fast, that now I have to orders at least 4 actuators , or perhaps 7 if you find a way of getting Pitch/Roll/Yaw + Heave/Surge/Sway from those rotations / angle speeds data
Did you only used the "Rotation X,Y,Z" information ? If yes how did you get the heave effect to work ? Don't you need a speed or acceleration data for Heave ?
@marcelomanzo Do you agree with that ?
Thanks, although of course it's not the most graphical interface in the world, to say the least@Bornhall kudos for nicely lined-up columns! Shame I don't have my PS4 atm to sink my teeth into this. That 'Gear ???' you have there is what's known as Final Drive.
Anyone who has access to tyre temps, would be great if you could look into answering these questions:
- Braking temp with ABS default/weak/off.
- Acceleration temp with TC1-5/off.
- How cold tyres get in grid starts online (especially Nations/Manu where you sit around for ages)?
- How cold tyres are when you leave pits (and whether any difference between compounds)?
- Do ambient/track temp influence above 2 points?
- Any heating up due to constant high speed running (e.g. Tomahawk at SSRX)?
- Do running on wetter parts on a drying track really cool down tyres more than running on dry line?
- How do dirt tyres behave?
- Effects of extreme toe and camber on temps (test this on SSRX so cornering doesn't come into effect).
- I notice the temps go up and down very quickly with braking/wheelspin, so this is probably just surface flash temp. Are there any other data that might suggest core tyre temps (which change more gradually) are simulated?
- In addition to above, are I/M/O temps available? (inside middle outside - usually for camber tuning)
- Do worn tyres stay cooler (the tread is thinner so there's less rubber flexing and less heat retention)?
- Anything that might suggest tyre pressures are simulated? I saw a post mentioning tyre radius stays constant while driving, so I guess not...
I would do it myself but I have no idea how to set up the program manually. I downloaded the app 2 posts above but GT7 is beta only for now and I can't find the sign up page.
Would be great if eventually we can get something close to GT6's Data Logger feature. Really don't understand why PD removed this feature, especially in a more competitive based game like Sport/7.
Keep up the good work everyone This community is better at developing the game than PD themselves
As far as I can tell, there are no brake temps available at all.Braking temp with ABS default/weak/off.
Nope, just the single temp as far as we know.In addition to above, are I/M/O temps available? (inside middle outside - usually for camber tuning)
Nothing that shows on telemetry at least.Anything that might suggest tyre pressures are simulated? I saw a post mentioning tyre radius stays constant while driving, so I guess not...
Right, the telemetry shows the surface temperature. But the internal temperature is also there, you can see it even from the temperature drop. After a few minutes of burnouts, my temperature did not go below 100 degrees.
- I notice the temps go up and down very quickly with braking/wheelspin, so this is probably just surface flash temp. Are there any other data that might suggest core tyre temps (which change more gradually) are simulated?
There is absolutely no effect on the cooling of the rubber, it cools down at a constant rate on any surface. Dry, wet, grass, puddles, no different
- Do running on wetter parts on a drying track really cool down tyres more than running on dry line
Hey, a fellow old Amigan! Dunno what platform you're on, but Python ain't half bad for stuff like this. Haven't touched ARexx in 20+ years myself, but it was a great tool. If you were up for it at the time, chances are you still got it21 years ago, and that was on the Amiga using ARexx
As far as I can tell, there are no brake temps available at all.
Yes I'm waiting for someone to make a noob-friendly app or program. The android app in post #131 looks pretty good, just have to wait for it to come out of beta.As for most of your other points, it's basically just testing and analyzing the data to get the answers you're looking for. Given the ease with which the data is accessible (programmatically), someone is probably/hopefully already working on a logger of some sort. Saving the telemetry data is simply outputting it in a suitable format to a file instead of to the screen (anyone with decent knowledge of Python could modify my own modified script to do that). Parsing, analyzing and displaying the data can then be done in more or less any spreadsheet program.
Yeah I noticed in the very first Nenkai video, the rear tyres do stay warmer than the fronts (being an RWD car). So it would suggest that core temps are simulated somewhere. The annoying part is why they chose to output the surface temp instead (which is not as useful to analyze).Right, the telemetry shows the surface temperature. But the internal temperature is also there, you can see it even from the temperature drop. After a few minutes of burnouts, my temperature did not go below 100 degrees.
There is absolutely no effect on the cooling of the rubber, it cools down at a constant rate on any surface. Dry, wet, grass, puddles, no different
Woah, someone who even knows what an Amiga is!Hey, a fellow old Amigan!
Windows. I had a brief look at Python with ideas about doing some scripting stuff for Blender 3D, I think it took me about 30 minutes before I closed the browser and basically said to myself "stuff this, I'll do it the long way!" lolDunno what platform you're on, but Python ain't half bad for stuff like this.
I think you may be over-estimating my abilities to begin with...Haven't touched ARexx in 20+ years myself, but it was a great tool. If you were up for it at the time, chances are you still got it
ADDRESS COMMAND
if ~exists('libs:bgui.library') then do
say 'This program requires bgui.library (v41.10+)'
exit
end
if ~show('l','rexxbgui.library') then do
if ~addlib('rexxbgui.library',0,-30) then do
say 'This program requires rexxbgui.library (2.0+)'
exit
end
end
long.0 = 'Amiga Active CD'
long.1 = 'Amiga Format CD'
long.2 = 'CU Amiga CD'
long.3 = 'Aminet CD'
long.4 = 'Aminet CD Set'
long.5 = 'Aminet Online'
long.6 = 'Amiga Active Issue'
long.7 = 'Amiga Format Issue'
long.8 = 'CU Amiga Issue'
short.0 = 'AACD'
short.1 = 'AFCD'
short.2 = 'CUCD'
short.3 = 'ANCD'
short.4 = 'ANST'
short.5 = 'AMIN'
short.6 = 'AACT'
short.7 = 'AFCT'
short.8 = 'CUCT'
names = 8
/************************************************************/
/* INITIALISATION */
/************************************************************/
'c:list >ram:t/FileList RHIndices: files nohead'
n = 0
call open(infile,'ram:t/FileList','R')
do while ~EOF(infile)
temp = readln(infile)
if right(temp,5) ~= '.info' then do
parse var temp files.n " " .
n = n + 1
end
end
call close(infile)
fileCount = n - 2
ArcCount = 0
do i = 0 to fileCount
if right(files.i,3) = 'lha' then do
'lha >ram:arc.tmp v RHIndices:'||files.i
call open(infile,'ram:arc.tmp','R')
do t = 0 to 6
call readln(infile)
end
z = 0
do while ~EOF(infile)
arcedfiles.z = readln(infile)
z = z + 1
end
z = 0
do while left(arcedfiles.z,4) ~= '----'
InArchive.arccount = right(arcedfiles.z,6)||' '||files.i
arccount = arccount + 1
z = z + 1
end
call close(infile)
'c:delete ram:arc.tmp QUIET'
end
end
call open(outfile,'ram:files','W')
do i = 0 to fileCount
if right(files.i,3) ~= 'lha' then do
parse var files.i filez" ".
call writeln(outfile,filez||' '||files.i)
end
end
do i = 0 to arcCount - 1
call writeln(outfile,InArchive.i)
end
call close(outfile)
'c:sort ram:files ram:files_s'
i = 0
call open(infile,'ram:files_s','R')
do while ~EOF(infile)
files.i = readln(infile)
parse var files.i indice.i " " path.i
if left(indice.i,4) = 'AMIN' then do
ListText.i = 'Aminet Online Index'
end; else do
do z = 0 to names
if left(indice.i,4) = short.z then do
ListText.i = long.z||' 'right(indice.i,2)
end
end
end
i = i + 1
end
call close(infile)
indice.count = i - 1
/*
Length = 0
do i = 0 to indice.count
if length(ListText.i) > length then do ; length = length(ListText.i) ; end
end
do i = 0 to indice.count
spaces = ''
do z = 0 to ((length-1) - length(ListText.i))
spaces = spaces||' '
end
ListText.i = ListText.i || spaces
end
*/
ListText.count = indice.count
'c:delete ram:files ram:files_s QUIET'
/***********************************************************/
/* GUI */
/***********************************************************/
call bguiopen()
signal on syntax
signal on halt
signal on break_c
esc='1B'x
lf='0A'x
grspace.narrow=-1
grspace.normal=-2
grspace.wide=-3
FixMinWidth=bguilayout(LGO_FixMinWidth,1)
g=bguivgroup(,
bguivgroup(,
bguimx('switcher',,bguilist('pnames','Cover CDs','Aminet','Magazines'),'T')||bguilayout(LGO_FixMinHeight,1)||,
bguipages('pages',,
bguivgroup(,
bguilistview('list_cds',,ListText,'M'),
)||,
bguivgroup(,
bguilistview('list_aminet',,ListText,'M'),
)||,
bguivgroup(,
bguilistview('list_mag',,ListText,'M'),
),
),
)||bguilayout(LGO_FixHeight,100)||,
bguivgroup(,
bguistring('str_keyword','Keyword',,50)||,
bguiinfo('info_status','Status','Waiting...')||,
bguihgroup(,
bguiprogress('prog_1','Progress',0,100)||,
bguiindicator('indi_1',,0,100,0,'C','%ld%%')||FixMinWidth,
)||,
bguihgroup(,
bguibutton('but_search','_Search')||,
bguivarspace(50)||,
bguibutton('but_Abort','_Abort'),
,/*spc*/,/*offs*/,/*title*/,'W')||bguilayout(LGO_FixMinHeight,1),
,),
,,grspace.normal)
call bguiset(obj.list_cds,,LISTV_MultiSelect,1)
call bguiaddmap(obj.prog_1,obj.indi_1,PROGRESS_Done,INDIC_Level)
call bguiaddmap(obj.switcher,obj.pages,MX_Active,PAGE_Active)
a=bguiwindow('ResourceHunter v0.1b © 2001, [ME]. All Rights Reserved.',g,'20','-0','Win_Main',arg(1),,menu)
if bguiwinopen(a)=0 then bguierror(12)
id=0
do while bguiwinwaitevent(a,'ID')~=id.winclose
select
when id=id.winactive then nop
when id=id.wininactive then nop
when id=id.about then call bguireq('ResourceHunter © 2001 [ME]','*_OK',,a)
when id=id.but_search then call search()
when id=id.but_select then call bguiset(obj.list_cds,a,LISTV_SelectMulti,-8)
when id=id.but_cancel then leave
when id=id.winclose then nop
otherwise
end
end
rc=0
call bguiclose()
exit
/*********************************************************/
/* SEARCH AND REPORT */
/*********************************************************/
search:
call bguiwinbusy(a)
keyword = bguiget(obj.str_keyword,STRINGA_TextVal)
if keyword = ' ' then do
call bguiwinready(a)
return
end
if words(keyword) > 1 then do
call bguireq('Sorry! ResourceHunter only supports'lf'single word keywords at the moment!','*_Okay',,a)
call bguiwinready(a)
return
end
if bguilistvgetentries(obj.list_cds,'SearchThese','S') > 0 then do
do i = 0 for SearchThese.count
do z = 0 to indice.count
if ListText.z = searchthese.i then searchthese.i = z
end
say SearchThese.i
end
end
SearchTotal = searchThese.count - 1
foundTotal = 0
do i = 0 to SearchTotal
temp = searchThese.i
searchPath = 'RHIndices:'||path.temp
say 'Now searching indice '||temp
if right(path.temp,3) = 'lha' then do
call bguiset(obj.info_status,a,INFO_TextFormat,'Extracting '||ListText.temp)
'lha x >nil: RHIndices:'||path.temp||' '||indice.temp||' ram:t/'
searchPath = 'ram:t/'||indice.temp
first = 1 / (searchTotal + 1)
half = (first / 2)
percentage = half * 100
parse var percentage percentage "." .
new = bguiget(obj.prog_1,PROGRESS_Done) + percentage
call bguiset(obj.prog_1,a,PROGRESS_Done,new)
end
call bguiset(obj.info_status,a,INFO_TextFormat,'Searching '||ListText.temp)
'c:flashfind >ram:'||indice.temp||' '||searchPath||' '||keyword||' NH'
if rc ~=5 then do
found.temp = 1
foundTotal = foundTotal + 1
end
if right(path.temp,3) = 'lha' then 'c:delete '||searchPath||' QUIET'
first = (i+1)/(searchtotal+1)
percentage = first * 100
parse var percentage percentage "." .
call bguiset(obj.prog_1,a,PROGRESS_Done,percentage)
end
if foundTotal ~= 0 then do
call bguiset(obj.info_status,a,INFO_TextFormat,'Processing results...')
call bguiset(obj.prog_1,a,PROGRESS_Done,'0')
n = 0
do i = 0 to SearchTotal
temp = searchThese.i
if found.temp = 1 then do
call open(outfile,'ram:'||indice.temp||'.guide','W')
call writeln(outfile,'@database '||name.temp)
call writeln(outfile,'@node main "ResourceHunter : Search results for '||ListText.temp||'"')
call writeln(outfile,'Search results for @{fg highlight}'||ListText.temp||'@{fg text}')
call writeln(outfile,'Keyword: "@{fg highlight}'||keyword||'@{fg text}"')
call writeln(outfile,'----------------------------------------------------------------------------')
call writeln(outfile,'')
call open(infile,'ram:'||indice.temp,'R')
do while ~EOF(infile)
line = readln(infile)
if left(indice.temp,4) = 'AMIN' then do
parse var line AmName " " dir"/"sub " " info
lineout = '@{"'AmName'" SYSTEM "rx s:RHDownload.rexx 'server'/'strip(dir)'/'strip(sub)'/'AmName'"} 'dir'/'sub' 'info
end
if left(indice.temp,4) ~= 'AMIN' then do
lineout = line
end
if right(lineout,2) ~= '/ ' then call writeln(outfile,lineout)
end
call close(infile)
call writeln(outfile,'@endnode')
call close(outfile)
perc = (n+1)/foundtotal
perc = perc * 100
parse var perc perc "." .
call bguiset(obj.prog_1,a,PROGRESS_Done,perc)
n = n + 1
end
'c:delete ram:'||indice.temp||' QUIET'
end
call open(outfile,'ram:index.guide','W')
call writeln(outfile,'@database RH')
call writeln(outfile,'@node main "ResourceHunter : Index"')
call writeln(outfile,'')
call writeln(outfile,'The following resources contain matches for keyword "@{fg highlight}'keyword'@{fg text}"')
call writeln(outfile,'----------------------------------------------------------------------------')
call writeln(outfile,'')
if foundtotal ~= 0 then do
Length = 0
do i = 0 to searchtotal
temp = searchthese.i
if found.temp = 1 then do
if length(ListText.temp) > length then do ; length = length(ListText.temp) ; end
end
end
do i = 0 to searchtotal
temp = searchthese.i
if found.temp = 1 then do
spaces = ''
do z = 0 to ((length-1) - length(ListText.temp))
spaces = spaces||' '
end
LinkText.temp = ListText.temp || spaces
end
end
do i = 0 to SearchTotal
temp = SearchThese.i
if found.temp = 1 then call writeln(outfile,' @{"'LinkText.temp'" link 'indice.temp'.guide/main}')
end
end
call writeln(outfile,'')
call writeln(outfile,'----------------------------------------------------------------------------')
call writeln(outfile,'Created by ResourceHunter (v0.1b) © 2001, [ME]. All Rights Reserved.')
call writeln(outfile,'@endnode')
call close(outfile)
call bguiset(obj.info_status,a,INFO_TextFormat,'Displaying results...')
call bguiset(obj.prog_1,a,PROGRESS_Done,'0')
'multiview ram:index.guide'
'c:delete ram:index.guide QUIET'
end
call bguiset(obj.info_status,a,INFO_TextFormat,'Waiting...')
call bguiset(obj.prog_1,a,PROGRESS_Done,'0')
if foundTotal = 0 then call bguireq('Keyword: 'esc'd'3||keyword||esc'd'2||lf'Sorry, no matches found!','*_Okay',,a)
do i = 0 to SearchTotal
temp = SearchThese.i
/*if found.temp = 1 then do*/
say 'deleting ram:'||indice.temp
'c:delete ram:'||indice.temp||'.guide QUIET'
found.temp = 0
/*end*/
end
call bguiwinready(a)
return
syntax:
if rc ~= 0 then say '+++ ['rc']' errortext(rc) 'at line' sigl
call bguiclose()
exit 0
break_c:
halt:
rc = 0
say '+++ Break at line' sigl
signal syntax
Well, going by your posting history (pretty much all of it, honestly), it's kind of sad to see the rancor you seem to have for GT7. Now, I'll be first in line to stand by that GT7 is very far from perfect, but they seem to be getting there. Slowly. This is PD – they have a well known history of taking their sweet time getting anywhere (track editor GT6 is a good example). I also have a whole bunch of opinions and suggestions I could drag up, but judging from past history, it's seemingly futile. It's a one-way street of communication, if any.I thoroughly enjoyed reading this thread and the associated articles. It's great seeing the enthusiasm, love and dedication you all have for the genre and the game.
Hey, BGUI library in ARexx! Loved that library, IMO much cleaner than MUI. Wrote a Caller ID software using BGUI way back, but that was in SAS/C. But yeah, I can understand if the years have "dulled the blade" a bit. Myself I've been programming more or less my entire life, from BASIC on MSX through C on the Amiga, assembly on DOS then front- and backend stuff for the web along with scripting.I think you may be over-estimating my abilities to begin with...
I think you may have just won some kind of award for diplomacy!"dulled the blade"
I hope you're right and I'd love to see this effort mature. I have a small amount of optimism after this discovery that better times lie ahead.That said, I wouldn't be so sure that they will shut the telemetry down.
Very!
I'm very old too... ;-) and I wish that the Amiga was still around...(damn incompetent Commodore management :-( )Very!