GT7 is compatible with motion rig ?

  • Thread starter poumpoum
  • 686 comments
  • 187,343 views
@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!
These two values are constant and directly written onto the packet, they are also no different in GT6-Sport-7.
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...
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.


It turns out "ticks" is really just a packet id.
I updated the tool with Water/Oil Temperature, Angular Velocity and Packet Id.
 
Last edited:
Hello, a friend of the simfeedback / sfx-100 motion community sent me this thread.
First of all thank all of you for this awesome finding and the massive work you already put into this.

I tried to modify the PDTools and created a motion telemetry provider for simfeedback.
Unfortunately i have to re-send the values via UDP to Simfeedback because of net framework incompatibilities...
https://github.com/ashupp/GranTurismoTelemetryProvider

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.
C#:
       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


Edit: Oh and hi to all - i just signed up for this :)
Edit2: Inserted part of changeset in which i convert and use values

Best regards, Alex
 

Attachments

  • 1658958769266.png
    1658958769266.png
    72.2 KB · Views: 95
Last edited:
Congratulations to all of you guys :bowdown:!

It went so fast, that now I have to orders at least 4 actuators :D, or perhaps 7 if you find a way of getting Pitch/Roll/Yaw + Heave/Surge/Sway from those rotations / angle speeds data :D :D :D

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.

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 ?
 
Last edited:
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 $$$$$
 
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.
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.
 
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 $$$$$
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)
 
I contacted the dev of SIM Dashboard a few days ago, today he replied that he has already got it working, a beta version is available!
https://www.stryder-it.de/simdashbo..._Gamers/Game_Configuration/Gran_Turismo_7.php

I haven't been able to sign up for the beta though, for some reason my google play store has been stuck on the "beta signup in progress" state for a while now.

Update:
The play store on my tablet is still stuck, but luckily I was able to push an install from the web play store and I have the beta version on my tablet. Tried it a bit after GT7 1.19 update, and it works! (This particular dash was made for ACC so some info was not available, will try to make a new one that's fully compatible with GT7.)
Screenshot_20220728-023710_SIM Dashboard.png
 
Last edited:
Congratulations to all of you guys :bowdown:!

It went so fast, that now I have to orders at least 4 actuators :D, or perhaps 7 if you find a way of getting Pitch/Roll/Yaw + Heave/Surge/Sway from those rotations / angle speeds data :D :D :D


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 ?
I used rotation xyz as well as velocity for heave, yaw and surge.
 
Last edited:
Anyone who has access to tyre temps, would be great if you could look into answering these questions:
  • How braking affect tyre temp with ABS default/weak/off?
  • How hard acceleration affect tyre temp with TC1-5/off?
  • How cold tyres get in grid starts online (especially Nations/Manu where you sit around for ages)? You lose around 30C in 1 minute.
  • 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? NOPE.
  • 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? YES.
  • In addition to above, are I/M/O temps available? Not as far as we can see.
  • 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...
Extra question - can you see anything funky in tyre/suspension data that causes sudden snap oversteer in high downforce cars when using too much steering angle in high speed corners (example - Peugeot 908 at Porsche Curves at Sarthe circuit experience, Super Formula at Fuji 100R corner).

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 :cheers: This community is better at developing the game than PD themselves :lol:

Edit: added answers based on posts below. Thanks guys!
 
Last edited:
@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.

Edit: looks like my assumption might be incorrect after all.
 
Last edited:
@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.
Thanks, although of course it's not the most graphical interface in the world, to say the least :D

As for the "Final Gear", I haven't been able to match it with the value in the settings in-game, so I'm not sure if it is the final gear. I've had a FG in-game at 4.300 which displayed as 2.086 (IIRC) and a 2.500 in-game that showed as 5.299 from the telemetry. So exactly how that works is beyond me. Feel free to educate me though! :D
 
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 :cheers: This community is better at developing the game than PD themselves :lol:

Here's a beginning of answer:
This is on Spa, car is stopped on grid (RCZ Gr3 - Racing Soft)
So you don't seem to lose all the temperature within a minute


1658997468227.png


And this is tyre temp, big spike is after the end of the straight after raidillon in spa, ABS weak

1658997694142.png
 
Braking temp with ABS default/weak/off.
As far as I can tell, there are no brake temps available at all.

In addition to above, are I/M/O temps available? (inside middle outside - usually for camber tuning)
Nope, just the single temp as far as we know.

Anything that might suggest tyre pressures are simulated? I saw a post mentioning tyre radius stays constant while driving, so I guess not...
Nothing that shows on telemetry at least.

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.

By the way, @otherApiDegenerates...
I noticed that the current position (0x84) of total positions (0x86) doesn't seem to work in all cases (I've yet to test everything), has anyone noticed when/where it works and where it doesn't? As far as I can tell so far, it showed the selected starting position (20/20) in a custom race BEFORE the race started, but went straight back to -1 for current position when the race started and didn't change after that. Come to think of it, I think the total number of cars was -1 as well... What gives?
 
  • 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?
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.
  • Do running on wetter parts on a drying track really cool down tyres more than running on dry line
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
 
Last edited:
@Nenkai

Is it possible to get a version of the .exe that will spit out specified values, with a user-specified seperator, to a file?

Like: program.exe ip=x.x.x.x values=LocX,LocY,LocZ seperator="," output=path/file.txt

I'd do it myself but my last attempt at "proper" programming was 21 years ago, and that was on the Amiga using ARexx, to search multiple plain-text CD-ROM indices (from magazine cover CDs, public domain collection CDs, etc) via a nice simple GUI which spat out the results as dynamically created "interactive" AmigaGuide.

Edit: still works though! :lol: :
1659002961008.png


Wait...

Aging Jamie Lee Curtis GIF
 
Last edited:
21 years ago, and that was on the Amiga using ARexx
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 it :D

@Nenkai, I was wondering if bit 3 in the flags ("HasThrottleControlMaybe") is the "On Track" flag rather than bit 0. Bit 0 seems to be more of a "Entered race" flag.

Edit: Seeing as bit 3 changes to 0 when you enter the pits during a race.
 
Last edited:
As far as I can tell, there are no brake temps available at all.

Sorry, I should've been clearer. I mean are the tyre temp spikes different when braking with ABS default/weak/off.

Not surprised brake temps aren't simulated. I've never felt brake fade in GT.
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.
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.

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
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).

I had a hunch driving on wetter parts of the track doesn't do anything. During my time grinding the Tokyo WTC600 race I did some experiments, and my inters last the same amount whether I "cool" it on the wetter parts or not. Probably the inter/wets are programmed to degrade at a set amount for a given "average" of track wetness and not based on "local" wetness.

As usual with PD, they prioritise graphics over actual physics.
 
Last edited:
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.

Kaz is going to shut this **** down so fast lol. Although it wasn't your intention, as this is clearly a labor of love. You've embarrassed him and PD by creating what should have been made many years ago. I'm in favor of anything that shames them for half-assed (putting it kindly) efforts.
 
Hey, a fellow old Amigan!
Woah, someone who even knows what an Amiga is! :lol:

Friends Hug GIF by MOODMAN



Dunno what platform you're on, but Python ain't half bad for stuff like this.
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!" lol

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 :D
I think you may be over-estimating my abilities to begin with...

Here's the code for the program in the screenshot... Lots of quietly using CLI commands to get directory content listings and extracting .lha archives because the Internet wasn't so common and I didn't have the means to check if there were better ways of doing said things! Its just generally a mess too! :lol:

Code:
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
 
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.
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.

That said, I wouldn't be so sure that they will shut the telemetry down. Sure, they could make special versions of the game for any partnerships they want to create with car brands and similar in the future (for motion rigs or whatever reason), but the data sent from the game doesn't in any way or form contain any user data whatsoever. Sure, if there was a way to extract PSN ids, country of origin and such of people you play with, I'm sure they would put a lid on it pretty fast. But this is pretty harmless, and for most use cases not anything most players will ever touch. But I'm sure we will see if it's removed by the next patch or not.

I think you may be over-estimating my abilities to begin with...
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 am traveling on vacation but I could not wait to get back home!!! Here is the python script that collects data from the GT and sends to SimRacingstudio (http://www.simracingstudio.com)!!!


We can now finally use Wind Simulators, Shakers, Leds, Rumble and Motion platforms from DOFReality (http://www.dofreality.com), ProSimu, PT-Actuator, SFX-100 (With Thanos Controller) and YawVR.

All the credits go to Nenkai to that was able to figure out how to decrypt the telemetry packets from the game: https://github.com/Nenkai/PDTools/tree/master/PDTools.SimulatorInterface I encourage you to donate for him!

Please note that I am not affiliated to SimRacingStudio and I am not responsible for any damage that this could case to you or your equipment

Keep in mind that this is an undocumented API from Grand Turismo Series, the game developer might patch the game and close the door in the future.

@poumpoum can you please give it a try?

Enjoy!
 
Last edited:
For those who don't fear python, I may share few snippets (dirty) to have save telemetry in file and plot them

Here we have tyres temp - speed - Throttle/Brake for one lap around Monza.

EDIT: files missings
 

Attachments

  • monza_gt3.svg
    110.3 KB · Views: 52
Last edited:
I'm very old too... ;-) and I wish that the Amiga was still around...(damn incompetent Commodore management :-( )

I wrote my Masters (of Computer Science) thesis on an Amiga [A1200] in 1995... All the C code (it was a 3D graphics program with a MUI based GUI), and the thesis document itself was written and output on it too (to Postscript, so it could be bound into a book )...

Back on topic, I also have a python version working, which runs the data logging in a background task.
It can be started/stopped, the collected data reset, and now has functionality to save the (decrypted, but un-parsed) data packets to memory, write them to a binary file, and (re)load them...

The actual screen output needs cleaning up (and adding the newly discovered variables over the past few days), and then I can share if anyone's interested...
 

Latest Posts

Back