SIMRacingApps
HTML5 Based Apps and Widgets, ReST Web Server, Java SDK.
=========================================================================================
What is SIMRacingApps?
- It's a Web Server used to host Apps and Widgets, accessible using any device with a modern browser.
- It comes with several Apps and Widgets free out of the box.
- It's a ReST interface for developers to access the SIM Data via an HTTP call.
- It's a HTML5 platform for other developers to write Apps and Widgets and share them with you.
- It's a Java SDK for developing your own Java Based Apps that can work with any supported SIM.
- And it is free, open source, released under the Apache 2.0 license.
- Like us on facebook SIMRacingApps to keep up with new releases and tips and tricks.
Here is a partial list of the Apps and Widgets that are included.
- CrewChief (Control your pit changes. Calculate fuel mileage, laps on tires, etc.)
- TrackMap (See where all the cars are overlaid on Satellite or Street Map images)
- Dashes (with fully working analog and bar gauges like Tach, Water Temp, Oil Temp, etc.)
- Standings (see pit time for all cars, best and last laps times, etc.)
- Relative (see who is near you)
- RaceAdministrator (Makes those pesky admin commands a touch or click of the mouse)
- Spectator/Broadcaster (Puts lots of information at your finger tips on one page with selectable driver)
- And there are more. Install the server and access them from the main page.
Want to try it out? It's simple.
On the same computer where the simulator is running:
- Download the latest version of SIMRacingAppsServer....exe from here and save it where you can find it later. It is not an installer.
- Execute SIMRacingAppsServer....exe.
- If you don't have Java 1.8 or better installed, it will direct you to the download page so you can install Java.
- Leave this window open while racing. You can minimize it, but note the HTTP://... address in the title of this window first. You will use the address to connect to the server from the client.
Clients can be from any device connected to your home network (including the SIM computer):
- Open the browser (Chrome, FireFox, IE10, EDGE, Safari) and enter the HTTP address of the server.
- Click on an App or Widget and start racing. Clicking the icon will get help for that App or Widget.
- In addition to using browsers, I have provided packages for using Atom/Electron and Overwolf Apps platforms as clients for SIMRacingApps. Each platform has different features that might meet your specific needs. Refer to the readme files provided with each package to get a better idea on which one would be best for you.
- More documentation is also available from the main menu.
There is more...
If you are a developer, you can develop your own Apps and Widgets. Detailed documentation is available from the main page. Full source is available on GitHub at SIMRacingApps. By making the source available, I hope others will join in and help develop this farther. Just fork the source, make your changes and submit a pull request.
But, you do not have to be a Github expert to help out. You can simply develop your App or Widget in your personal folder and SIMRacingApps will scan for it and add it to the main page. See below for details on creating your own App or Widget. You can also share your App or Widget by creating a .SRA file that can be uploaded from the main page using the form at the bottom of the page. .SRA files are simply .ZIP files renamed. They are intended to be uploaded on the main menu. Each file in the archive will be extracted to the users personal folder located at Documents/SIMRacingApps.
The simulation data can be challenging to use. Therefore, I have created an API layer above the SIM data to make using the SIM data simpler. This layer is available directly from the SIMRacingApps Java SDK as well as the ReST Web Server. This layer is designed to be used with any simulator that we develop a plug-in for. This layer does many of the calculations that the simulator doesn't provide directly for you. But don't worry, if needed, the raw SIM data is available to you as well. For full API documentation, install the server, connect to the main page and scroll down to the documentation section.
On the browser side, I have based this design on the AngularJS framework. AngularJS framework supports the "Single Page Application" (SPA) design pattern. This is where only one page is fetched from the server and AJAX calls are used to retrieve smaller amounts of data from the server as needed. I provide an AngularJS service to call the SIMRacingApps server and get the data and feed it to Angular $scope.data variable so directives can bind or set watches on the data. The way AngularJS binds the DOM elements to JavaScript objects, makes it a perfect match for this type of application.
In SIMRacingApps, I have provided several predefined Widgets for building Apps. Widgets are Angular "directives", which allows them to be placed in the HTML file using a declarative syntax. Through a generic App called WidgetLoader, any widget can also be a stand alone App. Multiple widgets are designed to be used together to form an App.
An App is simply an HTML page that declares what Widgets you want to use as an HTML tag. Tags can have properties to control the Widget's behavior. These are fully styleable using CSS, you can size and position these as needed. All widgets will resize themselves simply by providing "width" and "font-size" styles to the DOM element. For a step by step guide to build an application, see the SIMRacingApps - Overview for Creating an App documentation.
Widgets define an AngularJS Directive and must confirm to that specification. For a step by step guide to build a widget, see the SIMRacingApps - Overview for Creating a Widget documentation.
Below are the currently supported paths to the Generic SIM API. Using this API your application will possibly run across all supported SIMs if the SIM exports the data your are using. Following the links will take you to the Java Documentation that this path is mapped to. Here you will find details on how the path works and what options you have. For all the possible values supported for the CARIDENTIFIER, click here.
Generic API paths supported by the server
To access the data via the server, prefix these URLs with your server's IP address, optional port number and the data path.
Example(s):
- http://Your.Server.IP.Address:Port/SIMRacingApps/Data/...
- http://192.168.1.61:80/SIMRacingApps/Data/Track/Description
Returns a JSON structure by default that looks like this:
{ "Type": "STRING", "UOM": "", "Format": "", "StatePercent": "0.0", "State": "NORMAL", "Value": "Charlotte Motor Speedway", "UOMAbbr": "", "UOMDesc": "", "Lang": "en", "ValueFormatted": "Charlotte Motor Speedway", "Name": "/Track/Description" }
You can also add the "output" parameter to the URL to just get the value you need. For example, this URL only returns the ValueFormatted. You can use "localhost" when your browser is running on the same computer as the server.
- http://localhost/SIMRacingApps/Data/Track/Description?output=valueformatted
/SIMPluginCallback/DataPublisher/Post/MaxTires
/SIMPluginCallback/DataPublisher/Post/Results
/SIMPluginCallback/Sounds/PitCountDown/Volume
/SIMPluginCallback/Sounds/PitCountDown/setVolume/(PERCENTAGE)
/SIMPluginCallback/Sounds/PitSpeedLimit/Volume
/SIMPluginCallback/Sounds/PitSpeedLimit/setVolume/(PERCENTAGE)
/SIMPluginCallback/Sounds/Shift/Volume
/SIMPluginCallback/Sounds/Shift/setVolume/(PERCENTAGE)
/Car/(CARIDENTIFIER)/Bearing/(UOM)
/Car/(CARIDENTIFIER)/Cautions
/Car/(CARIDENTIFIER)/ClassColor
/Car/(CARIDENTIFIER)/ClassName
/Car/(CARIDENTIFIER)/Color
/Car/(CARIDENTIFIER)/ColorNumber
/Car/(CARIDENTIFIER)/ColorNumberBackground
/Car/(CARIDENTIFIER)/ColorNumberOutline
/Car/(CARIDENTIFIER)/Description
/Car/(CARIDENTIFIER)/Discontinuality
/Car/(CARIDENTIFIER)/ClubName
/Car/(CARIDENTIFIER)/DriverDivisionName
/Car/(CARIDENTIFIER)/DriverInitials
/Car/(CARIDENTIFIER)/DriverLicenseColor
/Car/(CARIDENTIFIER)/Driver/LicenseColorText
/Car/(CARIDENTIFIER)/DriverName
/Car/(CARIDENTIFIER)/DriverNameShort
/Car/(CARIDENTIFIER)/DriverRating
/Car/(CARIDENTIFIER)/DriverRatingDelta
/Car/(CARIDENTIFIER)/FuelLaps/(LAPSTOAVERAGE)
/Car/(CARIDENTIFIER)/FuelLapsMaximum/(LAPSTOAVERAGE)
/Car/(CARIDENTIFIER)/FuelLevelAtStartFinish/(UOM)
/Car/(CARIDENTIFIER)/FuelLevelNeeded/(LAPSTOAVERAGE)/(LAPS)/(UOM)
/Car/(CARIDENTIFIER)/FuelLevelPerLap/(LAPSTOAVERAGE)/(UOM)
/Car/(CARIDENTIFIER)/FuelLevelToFinish/(LAPSTOAVERAGE)/(LAPS)/(UOM)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)
/Car/(CARIDENTIFIER)/HasAutomaticPitCommands
/Car/(CARIDENTIFIER)/Id
/Car/(CARIDENTIFIER)/ImageUrl
/Car/(CARIDENTIFIER)/Incidents
/Car/(CARIDENTIFIER)/IncidentsTeam
/Car/(CARIDENTIFIER)/IsBelowMinimumSpeed
/Car/(CARIDENTIFIER)/IsBlackFlag
/Car/(CARIDENTIFIER)/IsBlueFlag
/Car/(CARIDENTIFIER)/IsDisqualifyFlag
/Car/(CARIDENTIFIER)/IsDriving
/Car/(CARIDENTIFIER)/IsEqual/(CARIDENTIFIER)
/Car/(CARIDENTIFIER)/IsFixedSetup
/Car/(CARIDENTIFIER)/IsOverSpeedLimit
/Car/(CARIDENTIFIER)/IsPaceCar
/Car/(CARIDENTIFIER)/IsPitSpeedLimiter
/Car/(CARIDENTIFIER)/IsPushToPassStatus
/Car/(CARIDENTIFIER)/IsSpectator
/Car/(CARIDENTIFIER)/IsUnderSpeedLimit
/Car/(CARIDENTIFIER)/IsYellowFlag
/Car/(CARIDENTIFIER)/Lap/(LAPTYPE)/(LAPSTOAVERAGE)
/Car/(CARIDENTIFIER)/LapInvalidFlags
/Car/(CARIDENTIFIER)/LapsToGo
/Car/(CARIDENTIFIER)/LapTime/(LAPTYPE)/(LAPSTOAVERAGE)
/Car/(CARIDENTIFIER)/LapTimeDelta/(LAPTYPE)
/Car/(CARIDENTIFIER)/LapTimeDeltaPercent/(LAPTYPE)
/Car/(CARIDENTIFIER)/LapTimeDeltaReference/(LAPTYPE)
/Car/(CARIDENTIFIER)/LapTimeProjected
/Car/(CARIDENTIFIER)/LapTimes
/Car/(CARIDENTIFIER)/Latitude/(UOM)
/Car/(CARIDENTIFIER)/LatitudeAcceration/(UOM)
/Car/(CARIDENTIFIER)/Longitude/(UOM)
/Car/(CARIDENTIFIER)/LongitudeAcceration/(UOM)
/Car/(CARIDENTIFIER)/ManufacturerLogo
/Car/(CARIDENTIFIER)/MaxTires
1.2
/Car/(CARIDENTIFIER)/MergePoint
/Car/(CARIDENTIFIER)/MergePointLatitude
/Car/(CARIDENTIFIER)/MergePointLongitude
/Car/(CARIDENTIFIER)/Messages
/Car/(CARIDENTIFIER)/Name
/Car/(CARIDENTIFIER)/Number
/Car/(CARIDENTIFIER)/NumberFont
/Car/(CARIDENTIFIER)/NumberSlant
/Car/(CARIDENTIFIER)/PitLocation
/Car/(CARIDENTIFIER)/PitSpeedLimit/(UOM)
/Car/(CARIDENTIFIER)/PitStopsRemaining/{LAPSTOAVERAGE}
/Car/(CARIDENTIFIER)/PitTime
/Car/(CARIDENTIFIER)/PitTimes
/Car/(CARIDENTIFIER)/Position
/Car/(CARIDENTIFIER)/PositionClass
/Car/(CARIDENTIFIER)/PositionClassDelta
/Car/(CARIDENTIFIER)/PositionClassQualifying
/Car/(CARIDENTIFIER)/PositionDelta
/Car/(CARIDENTIFIER)/PositionHighest
/Car/(CARIDENTIFIER)/PositionHighestClass
/Car/(CARIDENTIFIER)/PositionLowest
/Car/(CARIDENTIFIER)/PositionLowestClass
/Car/(CARIDENTIFIER)/PositionQualifying
/Car/(CARIDENTIFIER)/Positions
/Car/(CARIDENTIFIER)/PositionsClass
/Car/(CARIDENTIFIER)/PushToPassRemaining
/Car/(CARIDENTIFIER)/RadioChannel
/Car/(CARIDENTIFIER)/RadioChannelName
/Car/(CARIDENTIFIER)/RepairTime
/Car/(CARIDENTIFIER)/RepairTimeOptional
/Car/(CARIDENTIFIER)/RPMPitRoadSpeed
/Car/(CARIDENTIFIER)/Sector
/Car/(CARIDENTIFIER)/SpotterMessage
/Car/(CARIDENTIFIER)/StartFinishTimes
/Car/(CARIDENTIFIER)/Status
/Car/(CARIDENTIFIER)/StatusClass
/Car/(CARIDENTIFIER)/TeamName
/Car/(CARIDENTIFIER)/Warnings
/Car/(CARIDENTIFIER)/setAdminFlag/(Y/N)
/Car/(CARIDENTIFIER)/setBlackFlag/(SECONDS/LAPS)/(UOM)
/Car/(CARIDENTIFIER)/setCamera/CameraName
/Car/(CARIDENTIFIER)/setChat/(TEXT)
/Car/(CARIDENTIFIER)/setChatFlag/(Y/N)
/Car/(CARIDENTIFIER)/setClearPenaltiesFlag
/Car/(CARIDENTIFIER)/setDisqualifyFlag
/Car/(CARIDENTIFIER)/setEndOfLineFlag
/Session/setReloadPaint
/Car/(CARIDENDIFIER)/setRemoveFlag
/Car/(CARIDENTIFIER)/setRPMPitRoadSpeed/(RPM)
/Car/(CARIDENTIFIER)/setWaveAroundFlag
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/decrementValueNext/(UOM)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/CapacityIncrement/(UOM)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/CapacityMaximum/(UOM)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/CapacityMinimum/(UOM)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/ChangeFlag
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/Count
1.2
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/IsChangeable
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/IsDirty
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/IsFixed
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/LapChanged
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/Laps/(CURRENTLAP)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/LapsHistorical
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/MajorIncrement/(UOM)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/MaxCount
1.13
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/Maximum/(UOM)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/Minimum/(UOM)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/MinorIncrement/(UOM)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/Multiplier
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/Name
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/OnResetChange
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/Type
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/TypeName
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/UOM
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/Value/(VALUE)/(UOM)/(GEAR)/(ENGINEPOWER)
1.22
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/ValueCurrent/(UOM)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/ValueHistorical/(UOM)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/ValueNext/(UOM)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/incrementValueNext/(UOM)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/setChangeFlag/(FLAG)
/Car/(CARIDENTIFIER)/Gauge/(GAUGETYPE)/setValueNext/(VALUE)/(UOM)
/Session/Camera
/Session/CameraFocus
/Session/Cameras
/Session/Cars
/Session/CautionLaps
/Session/Cautions
/Session/ClassNames
/Session/DataVersion
/Session/DiffCars/(CARIDENTIFIER1)/(CARIDENTIFIER2)
/Session/DiffCarsRelative/(CARIDENTIFIER1)/(CARIDENTIFIER2)
/Session/Id
1.2
/Session/IncidentLimit
/Session/IsAppsHidden
/Session/IsCautionFlag
/Session/IsCheckeredFlag
/Session/IsCrossedFlag
/Session/IsGarageVisible
/Session/IsGreenFlag
/Session/IsPitRoadOpen
/Session/IsRedFlag
/Session/IsReplay
/Session/IsReplayLive
/Session/IsWhiteFlag
/Session/Lap
/Session/Laps/(SESSIONTYPE)
/Session/LapsToGo
/Session/LeagueId
1.2
/Session/Messages
/Session/Name/(session)
/Session/NumberOfCarClasses
/Session/RadioChannelActive
/Session/RadioChannelIsDeletable/(CHANNELNUMBER)
/Session/RadioChannelIsListenOnly/(CHANNELNUMBER)
/Session/RadioChannelIsMutable/(CHANNELNUMBER)
/Session/RadioChannelIsMuted/(CHANNELNUMBER)
/Session/RadioChannelIsScanable/(CHANNELNUMBER)
/Session/RadioChannelName/(CHANNELNUMBER)
/Session/RadioChannels
/Session/RadioScan
/Session/ReferenceCar
/Session/Replay
/Session/Restart
/Session/SpotterPitCountDown
/Session/StartTime
/Session/Status
1.12
/Session/StrengthOfField
/Session/Time
/Session/TimeElapsed
/Session/TimeRemaining
/Session/TimeString
/Session/Type
/Session/setAdvanceFlag
/Session/setAppsHidden
/Session/setCamera/(CAMERA)/(FOCUSON)/(CARIDENTIFIER)
/Session/setCamera/(FOCUSON)/(CARIDENTIFIER)
/Session/setCautionFlag
/Session/setCautionLaps/(LAPS)
/Session/setCautionLapsAdjust/(LAPS)
/Session/setChat/(TEXT)
/Session/setChatFlag/(Y/N)
/Session/setChatReply/(TEXT)
/Session/setPitClose
/Session/setPitOpen
/Session/setRadioChannel/(CHANNELNUMBER)
/Session/setRadioChannelDelete/(CHANNELNUMBER)
/Session/setRadioChannelMute/(CHANNELNUMBER)/(Y/N)
/Session/setRadioChannelName/(CHANNELNAME)
/Session/setRadioScan/(Y/N)
/Session/setReferenceCar/(CARIDENTIFIER)
/Session/setReloadPaint
/Session/setReplay/(COMMAND)
/Session/setReplayPosition/(COMMAND)
/Session/setRestart/(COMMAND)
/SIMName
/Version
/Volume
/Volume/(PERCENTAGE)
/Track/Bearing/(LOCATION)/(PERCENTAGE)/(UOM)
/Track/Category
/Track/City
/Track/Condition
/Track/Configuration
/Track/Country
/Track/Description
/Track/getFinishLineRotation/(UOM)
/Track/Image/(type)
/Track/Latitude/(LOCATION)/(PERCENTAGE)/(UOM)
/Track/Length/(UOM)
/Track/Longitude/(LOCATION)/(PERCENTAGE)/(UOM)
/Track/Name
/Track/Path
/Track/North/(UOM)
/Track/PitSpeedLimit/(UOM)
/Track/Sectors/(SECTORTYPE)/(UOM)
/Track/Temp/(UOM)
/Track/Type
/Track/WeatherFogLevel
/Track/WeatherRelativeHumidity
/Track/WeatherSkies
/Track/WeatherTemp/(UOM)
/Track/WeatherWindDirection/(UOM)
/Track/WeatherWindSpeed/(UOM)