úÎ8È5è/      !"#$%&'()*+,-.None!"_ ŸThe global communications channel to read broadcasts from other vehicles. The port for each vehicle is the index into the map (ports start at 3001 in TORCS)nCarState is everything the controller can observe in the world. See the TORCS manual for full description ( https://arxiv.org/pdf/1304.1672)NB;: CarState uses prime version of identical DriveState field length 4 NB;: CarState uses prime version of identical DriveState fieldnon-native to TORCSnon-native to TORCSnon-native to TORCS?Broadcast messages are strings, but might be Text in the future¡The DriveState dictates how the controller actuators behave and, by extension, how the car moves around the world. See the TORCS manual for full description ( https://arxiv.org/pdf/1304.1672) "(0=continue) or (1=end simulation)#non-native to torcs$=A driver observes the environment and changes the drive state'  !"#$%& $%&'$ !"#% &   !"#$%&None!"/ the parser reads a s-expressions to a CarState and writes a DriveState to a s-expression TORCS sends all data as doubles, or lists of doubles, none nested/01/01/01None)TThis IO action will run at every step of the simulation and post the output the X field of the CarState. This is to allow for use of Runtime Monitoring tools such as  *https://dl.acm.org/citation.cfm?id=1069573g For now, in order to change this, you need to change Haskell-TORCS itself and recompile the library))))None\27A small wrapper to keep track of how long each lap took234234234NoneT\*SThe low level interface for connecting to TORCS. Usually, you should prefer to use  TORCS.Connect.5€action will do two things separately first, send the drive instructions second, broadcast the message to the other threads6•sensing will try to read from all the mvars, and add this info to CarState this only writes to the lapTimes part of CarState (not native to TORCS)*Should we start the GUI for you$Shared gloabl communications channelthe controller to startDthe delay to allow TORCS to load before sending connection messages the port, should be in [3001..]756***756None+nThis is the will boot TORCS and run the simulation saved in the practice config. this is probably saved in $~/.torcs/config/raceman/practice.xml›, but should be changed via the TORCS GUI. If the config file is elsewhere, you will need to change this library and recompile Haskell-TORCS from source,\start a single driver as in startDriver, but dont get the final state of the car at the end.-”Use this if you want to watch the car drive in TORCS. Requires booting up TORCS manually and starting a track to the screen where TORCS says: %...Initializing Driver scr_server1....ÿ~This allows you to run simulate multiple vehicles on the same track. This will automatically connect the broadcast in DriveState to the communications in CarState for all other cars. Platooning simulation will implement controllers that utilize this comm channel between all vehicles. Each car's channel is addressable with their cooresponding TORCS port (starting at 3001)+,-.+,-.,+-.+,-.None $%&+,-.8       !!"#$%&'()*+,-./0123456789:;<=>$TORCS-0.1.0.1-4UxL5r4h8ny2LM43Pq2e6J TORCS.Types TORCS.MonitorTORCS.Connect.Runner TORCS.Connect TORCS.ParserTORCS.Connect.UtilTORCSCommunicationsCarState$sel:z:CarState$sel:angle:CarState$sel:gear':CarState$sel:trackPos:CarState$sel:speedY:CarState$sel:distRaced:CarState$sel:speedZ:CarState$sel:damage:CarState$sel:wheelSpinVel:CarState$sel:focus':CarState$sel:track:CarState$sel:curLapTime:CarState$sel:speedX:CarState$sel:racePos:CarState$sel:fuel:CarState$sel:distFromStart:CarState$sel:opponents:CarState$sel:rpm:CarState$sel:lastLapTime:CarState$sel:lapTimes:CarState$sel:communications:CarState$sel:monitor:CarStateMessage DriveState$sel:gear:DriveState$sel:clutch:DriveState$sel:focus:DriveState$sel:accel:DriveState$sel:meta:DriveState$sel:brakes:DriveState$sel:steer:DriveState$sel:broadcast:DriveStateDriverdefaultDriveStatedefaultCarState$fShowDriveState$fShowCarStatemonitorWrapperstartDriverWithPort startDriver startDriver_startGUIDriver startDrivers toByteStringfromByteString readAsDouble countLapstimediff mySwapMVaractionsense yampaRunner