<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Programm verzögert]]></title><description><![CDATA[<p>Hallo,</p>
<p>Da ich neu bin weiß ich leider nicht, ob das hier im richtigen Bereich ist. Ich bitte um Verständnis.</p>
<p>Ich habe ein Programm geschrieben, welches Daten aus dem Spiel Project Cars ausliest, diese verarbeitet und dann an einen Arduino weiterleitet.<br />
Jetzt habe ich aber das Problem, dass nach dem das Programm eine Weile lief, die Ausgabe verzögert ist. Also kommt die Nachicht erst nach 1-2 Sekunden an.</p>
<p>Könnt ihr mir Tipps geben, wie ich das ganze verhindern kann?</p>
<p>Sorry das ich jetzt den ganzen Code hochgeladen habe, aber ich weiß nicht wo die Bremse ist.</p>
<p>PS: Ich habe die main.cpp geschrieben, die Restlichen habe ich nur inkludiert.</p>
<p>Main\1:</p>
<pre><code>// Used for memory-mapped functionality
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;conio.h&gt;
#include &quot;tserial.h&quot;
#include &quot;bot_control.h&quot;
#include &quot;sharedmemory.h&quot;
#include &lt;cmath&gt;

// Name of the pCars memory mapped file

#define MAP_OBJECT_NAME &quot;$pcars$&quot;

//Konstanten

const bool debug = true;
const unsigned char maxFPS = 100;
const unsigned char fuelWarn = 10;

char data; //To store the character to send
char lastFlag;

serial comm; //serial is a class type defined in these files, used for referring to the communication device

int main() {

	// Open the memory-mapped file
	HANDLE fileHandle = OpenFileMapping( PAGE_READONLY, FALSE, MAP_OBJECT_NAME );
	if (fileHandle == NULL)
	{
		printf( &quot;Could not open file mapping object (%d).\n&quot;, GetLastError() );
		Sleep(2000);
		return 1;
	}

	// Get the data structure
	const SharedMemory* sharedData = (SharedMemory*)MapViewOfFile( fileHandle, PAGE_READONLY, 0, 0, sizeof(SharedMemory) );
	if (sharedData == NULL)
	{
		printf( &quot;Could not map view of file (%d).\n&quot;, GetLastError() );

		CloseHandle( fileHandle );
		Sleep(2000);
		return 1;
	}

	// Ensure we're sync'd to the correct data version
	if ( sharedData-&gt;mVersion != SHARED_MEMORY_VERSION )
	{
		printf( &quot;Data version mismatch\n&quot;);
		Sleep(2000);
		return 1;
	}

	comm.startDevice(&quot;COM3&quot;, 9600);
	/* “COM 2” refers to the com port in which the USB to SERIAL port is attached. It is shown by right clicking on my computer, then going to properties and then device manager
	9600 is the baud-rate in bits per second */

	//------------------------------------------------------------------------------
	// Datensenden -- Schleife
	//------------------------------------------------------------------------------

	//printf( &quot;ESC TO EXIT\n\n&quot;, sharedData-&gt;mUnfilteredSteering );

	while (true)
	{
		if(debug)
		{
			printf( &quot;Flag: (%d)\n&quot;, sharedData-&gt;mHighestFlagColour );
			printf( &quot;RPMMax: (%d)\n&quot;, sharedData-&gt;mMaxRPM);
			printf( &quot;Data: (%d)\n&quot;,data);
			printf( &quot;lastFlag: (%d)\n&quot;,lastFlag);
			system(&quot;cls&quot;);
		}

		if(lastFlag != sharedData-&gt;mHighestFlagColour){
			data = sharedData-&gt;mHighestFlagColour;
			lastFlag = data;
		}

		comm.send_data(data); //The data is sent through the arduino

		if ( _kbhit() &amp;&amp; _getch() == 27 ) // check for escape
		{
			break;
		}

		Sleep(1000 / maxFPS);
	}

	// Cleanup
	UnmapViewOfFile( sharedData );
	CloseHandle( fileHandle );

	comm.stopDevice(); //The device is closed down
	getch();

	return 0;
}
</code></pre>
<pre><code>#include &quot;tserial.h&quot;

class serial{

  private:
        // private attributes
		Tserial *com;
  public:

	serial() {

		 }

	bool startDevice(char *port,int speed)
	{
		com = new Tserial();
		if (com!=0)
		{
			if(com-&gt;connect(port, speed, spNONE))
				printf(&quot;Not Connected...\n&quot;);
			else
				printf(&quot;Connected..\n&quot;);
			return TRUE;
		}
		else
			return FALSE; 
	}

	void stopDevice()
	{
		com-&gt;disconnect();
        // ------------------
        delete com;
        com = 0;
	}

	void send_data(unsigned char data)
	{
	//	unsigned char data = 0;

		com-&gt;sendChar(data);
		//printf(&quot;%c&quot;,data);

	}
};
</code></pre>
<pre><code>#ifndef TSERIAL_H
#define TSERIAL_H

#include &lt;stdio.h&gt;
#include &lt;windows.h&gt;

enum serial_parity  { spNONE,    spODD, spEVEN };

/* -------------------------------------------------------------------- */
/* -----------------------------  Tserial  ---------------------------- */
/* -------------------------------------------------------------------- */
class Tserial
{
    // -------------------------------------------------------- //
protected:
    char              port[10];                      // port name &quot;com1&quot;,...
    int               rate;                          // baudrate
    serial_parity     parityMode;
    HANDLE            serial_handle;                 // ...

    // ++++++++++++++++++++++++++++++++++++++++++++++
    // .................. EXTERNAL VIEW .............
    // ++++++++++++++++++++++++++++++++++++++++++++++
public:
                  Tserial();
                 ~Tserial();
    int           connect          (char *port_arg, int rate_arg,
                                    serial_parity parity_arg);
    void          sendChar         (char c);
    void          sendArray        (char *buffer, int len);
    char          getChar          (void);
    int           getArray         (char *buffer, int len);
    int           getNbrOfBytes    (void);
    void          disconnect       (void);
};
/* -------------------------------------------------------------------- */

#endif TSERIAL_H
</code></pre>
<pre><code>#define STRICT
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;process.h&gt;
#include &lt;conio.h&gt;
#include &lt;windows.h&gt;
//#include &lt;stdafx.h&gt;
#include &lt;windows.h&gt;

#include &quot;tserial.h&quot;

/* -------------------------------------------------------------------- */
/* -------------------------    Tserial   ----------------------------- */
/* -------------------------------------------------------------------- */
Tserial::Tserial()
{
    parityMode       = spNONE;
    port[0]          = 0;
    rate             = 0;
    serial_handle    = INVALID_HANDLE_VALUE;
}

/* -------------------------------------------------------------------- */
/* --------------------------    ~Tserial     ------------------------- */
/* -------------------------------------------------------------------- */
Tserial::~Tserial()
{
    if (serial_handle!=INVALID_HANDLE_VALUE)
        CloseHandle(serial_handle);
    serial_handle = INVALID_HANDLE_VALUE;
}
/* -------------------------------------------------------------------- */
/* --------------------------    disconnect   ------------------------- */
/* -------------------------------------------------------------------- */
void Tserial::disconnect(void)
{
    if (serial_handle!=INVALID_HANDLE_VALUE)
        CloseHandle(serial_handle);
    serial_handle = INVALID_HANDLE_VALUE;
}
/* -------------------------------------------------------------------- */
/* --------------------------    connect      ------------------------- */
/* -------------------------------------------------------------------- */
int  Tserial::connect          (char *port_arg, int rate_arg, serial_parity parity_arg)
{
    int erreur;
    DCB  dcb;
    COMMTIMEOUTS cto = { 0, 0, 0, 0, 0 };

    /* --------------------------------------------- */
    if (serial_handle!=INVALID_HANDLE_VALUE)
        CloseHandle(serial_handle);
    serial_handle = INVALID_HANDLE_VALUE;

    erreur = 0;

    if (port_arg!=0)
    {
        strncpy(port, port_arg, 10);
        rate      = rate_arg;
        parityMode= parity_arg;
        memset(&amp;dcb,0,sizeof(dcb));

        /* -------------------------------------------------------------------- */
        // set DCB to configure the serial port
        dcb.DCBlength       = sizeof(dcb);                   

        /* ---------- Serial Port Config ------- */
        dcb.BaudRate        = rate;

        switch(parityMode)
        {
            case spNONE:
                            dcb.Parity      = NOPARITY;
                            dcb.fParity     = 0;
                            break;
            case spEVEN:
                            dcb.Parity      = EVENPARITY;
                            dcb.fParity     = 1;
                            break;
            case spODD:
                            dcb.Parity      = ODDPARITY;
                            dcb.fParity     = 1;
                            break;
        }

        dcb.StopBits        = ONESTOPBIT;
        dcb.ByteSize        = 8;

        dcb.fOutxCtsFlow    = 0;
        dcb.fOutxDsrFlow    = 0;
        dcb.fDtrControl     = DTR_CONTROL_DISABLE;
        dcb.fDsrSensitivity = 0;
        dcb.fRtsControl     = RTS_CONTROL_DISABLE;
        dcb.fOutX           = 0;
        dcb.fInX            = 0;

        /* ----------------- misc parameters ----- */
        dcb.fErrorChar      = 0;
        dcb.fBinary         = 1;
        dcb.fNull           = 0;
        dcb.fAbortOnError   = 0;
        dcb.wReserved       = 0;
        dcb.XonLim          = 2;
        dcb.XoffLim         = 4;
        dcb.XonChar         = 0x13;
        dcb.XoffChar        = 0x19;
        dcb.EvtChar         = 0;

        /* -------------------------------------------------------------------- */
        serial_handle    = CreateFile(port, GENERIC_READ | GENERIC_WRITE,
                               0, NULL, OPEN_EXISTING,NULL,NULL);
                   // opening serial port

        if (serial_handle    != INVALID_HANDLE_VALUE)
        {
            if(!SetCommMask(serial_handle, 0))
                erreur = 1;

            // set timeouts
            if(!SetCommTimeouts(serial_handle,&amp;cto))
                erreur = 2;

            // set DCB
            if(!SetCommState(serial_handle,&amp;dcb))
                erreur = 4;
        }
        else
            erreur = 8;
    }
    else
        erreur = 16;

    /* --------------------------------------------- */
    if (erreur!=0)
    {
        CloseHandle(serial_handle);
        serial_handle = INVALID_HANDLE_VALUE;
    }
    return(erreur);
}

/* -------------------------------------------------------------------- */
/* --------------------------    sendChar     ------------------------- */
/* -------------------------------------------------------------------- */
void Tserial::sendChar(char data)
{
    sendArray(&amp;data, 1);
}

/* -------------------------------------------------------------------- */
/* --------------------------    sendArray    ------------------------- */
/* -------------------------------------------------------------------- */
void Tserial::sendArray(char *buffer, int len)
{
    unsigned long result;

    if (serial_handle!=INVALID_HANDLE_VALUE)
        WriteFile(serial_handle, buffer, len, &amp;result, NULL);
}

/* -------------------------------------------------------------------- */
/* --------------------------    getChar      ------------------------- */
/* -------------------------------------------------------------------- */
char Tserial::getChar(void)
{
    char c;
    getArray(&amp;c, 1);
    return(c);
}

/* -------------------------------------------------------------------- */
/* --------------------------    getArray     ------------------------- */
/* -------------------------------------------------------------------- */
int  Tserial::getArray         (char *buffer, int len)
{
    unsigned long read_nbr;

    read_nbr = 0;
    if (serial_handle!=INVALID_HANDLE_VALUE)
    {
        ReadFile(serial_handle, buffer, len, &amp;read_nbr, NULL);
    }
    return((int) read_nbr);
}
/* -------------------------------------------------------------------- */
/* --------------------------    getNbrOfBytes ------------------------ */
/* -------------------------------------------------------------------- */
int Tserial::getNbrOfBytes    (void)
{
    struct _COMSTAT status;
    int             n;
    unsigned long   etat;

    n = 0;

    if (serial_handle!=INVALID_HANDLE_VALUE)
    {
        ClearCommError(serial_handle, &amp;etat, &amp;status);
        n = status.cbInQue;
    }

    return(n);
}
</code></pre>
<pre><code>// *** Types ***

// Header version number to test against
enum
{
  SHARED_MEMORY_VERSION = 5
};

// Maximum allowed length of string
enum
{
  STRING_LENGTH_MAX = 64
};

// Maximum number of general participant information allowed to be stored in memory-mapped file
enum
{
  STORED_PARTICIPANTS_MAX = 64
};

// Tyres
enum 
{
  TYRE_FRONT_LEFT = 0,
  TYRE_FRONT_RIGHT,
  TYRE_REAR_LEFT,
  TYRE_REAR_RIGHT,
  //--------------
  TYRE_MAX
};

// Vector
enum
{
  VEC_X = 0,
  VEC_Y,
  VEC_Z,
  //-------------
  VEC_MAX
};

// (Type#1) GameState (to be used with 'mGameState')
enum
{
  GAME_EXITED = 0,
  GAME_FRONT_END,
  GAME_INGAME_PLAYING,
  GAME_INGAME_PAUSED,
  GAME_INGAME_RESTARTING,
  GAME_INGAME_REPLAY,
  GAME_FRONT_END_REPLAY,
  //-------------
  GAME_MAX
};

// (Type#2) Session state (to be used with 'mSessionState')
enum
{
  SESSION_INVALID = 0,
  SESSION_PRACTICE,
  SESSION_TEST,
  SESSION_QUALIFY,
  SESSION_FORMATION_LAP,
  SESSION_RACE,
  SESSION_TIME_ATTACK,
  //-------------
  SESSION_MAX
};

// (Type#3) RaceState (to be used with 'mRaceState')
enum
{
  RACESTATE_INVALID,
  RACESTATE_NOT_STARTED,
  RACESTATE_RACING,
  RACESTATE_FINISHED,
  RACESTATE_DISQUALIFIED,
  RACESTATE_RETIRED,
  RACESTATE_DNF,
  //-------------
  RACESTATE_MAX
};

// (Type#4) Current Sector (to be used with 'mCurrentSector')
enum
{
  SECTOR_INVALID = 0, 
  SECTOR_START,
  SECTOR_SECTOR1,
  SECTOR_SECTOR2,
  SECTOR_FINISH,
  SECTOR_STOP,
  //-------------
  SECTOR_MAX
};

// (Type#5) Flag Colours (to be used with 'mHighestFlagColour')
enum
{
  FLAG_COLOUR_NONE = 0,       // Not used for actual flags, only for some query functions
  FLAG_COLOUR_GREEN,          // End of danger zone, or race started
  FLAG_COLOUR_BLUE,           // Faster car wants to overtake the participant
  FLAG_COLOUR_WHITE,          // Approaching a slow car
  FLAG_COLOUR_YELLOW,         // Danger on the racing surface itself
  FLAG_COLOUR_DOUBLE_YELLOW,  // Danger that wholly or partly blocks the racing surface
  FLAG_COLOUR_BLACK,          // Participant disqualified
  FLAG_COLOUR_CHEQUERED,      // Chequered flag
  //-------------
  FLAG_COLOUR_MAX
};

// (Type#6) Flag Reason (to be used with 'mHighestFlagReason')
enum
{
  FLAG_REASON_NONE = 0,
  FLAG_REASON_SOLO_CRASH,
  FLAG_REASON_VEHICLE_CRASH,
  FLAG_REASON_VEHICLE_OBSTRUCTION,
  //-------------
  FLAG_REASON_MAX
};

// (Type#7) Pit Mode (to be used with 'mPitMode')
enum
{
  PIT_MODE_NONE = 0,
  PIT_MODE_DRIVING_INTO_PITS,
  PIT_MODE_IN_PIT,
  PIT_MODE_DRIVING_OUT_OF_PITS,
  PIT_MODE_IN_GARAGE,
  //-------------
  PIT_MODE_MAX
};

// (Type#8) Pit Stop Schedule (to be used with 'mPitSchedule')
enum
{
  PIT_SCHEDULE_NONE = 0,        // Nothing scheduled
  PIT_SCHEDULE_STANDARD,        // Used for standard pit sequence
  PIT_SCHEDULE_DRIVE_THROUGH,   // Used for drive-through penalty
  PIT_SCHEDULE_STOP_GO,         // Used for stop-go penalty
  //-------------
  PIT_SCHEDULE_MAX
};

// (Type#9) Car Flags (to be used with 'mCarFlags')
enum
{
  CAR_HEADLIGHT         = (1&lt;&lt;0),
  CAR_ENGINE_ACTIVE     = (1&lt;&lt;1),
  CAR_ENGINE_WARNING    = (1&lt;&lt;2),
  CAR_SPEED_LIMITER     = (1&lt;&lt;3),
  CAR_ABS               = (1&lt;&lt;4),
  CAR_HANDBRAKE         = (1&lt;&lt;5),
};

// (Type#10) Tyre Flags (to be used with 'mTyreFlags')
enum
{
  TYRE_ATTACHED         = (1&lt;&lt;0),
  TYRE_INFLATED         = (1&lt;&lt;1),
  TYRE_IS_ON_GROUND     = (1&lt;&lt;2),
};

// (Type#11) Terrain Materials (to be used with 'mTerrain')
enum
{
  TERRAIN_ROAD = 0,
  TERRAIN_LOW_GRIP_ROAD,
  TERRAIN_BUMPY_ROAD1,
  TERRAIN_BUMPY_ROAD2,
  TERRAIN_BUMPY_ROAD3,
  TERRAIN_MARBLES,
  TERRAIN_GRASSY_BERMS,
  TERRAIN_GRASS,
  TERRAIN_GRAVEL,
  TERRAIN_BUMPY_GRAVEL,
  TERRAIN_RUMBLE_STRIPS,
  TERRAIN_DRAINS,
  TERRAIN_TYREWALLS,
  TERRAIN_CEMENTWALLS,
  TERRAIN_GUARDRAILS,
  TERRAIN_SAND,
  TERRAIN_BUMPY_SAND,
  TERRAIN_DIRT,
  TERRAIN_BUMPY_DIRT,
  TERRAIN_DIRT_ROAD,
  TERRAIN_BUMPY_DIRT_ROAD,
  TERRAIN_PAVEMENT,
  TERRAIN_DIRT_BANK,
  TERRAIN_WOOD,
  TERRAIN_DRY_VERGE,
  TERRAIN_EXIT_RUMBLE_STRIPS,
  TERRAIN_GRASSCRETE,
  TERRAIN_LONG_GRASS,
  TERRAIN_SLOPE_GRASS,
  TERRAIN_COBBLES,
  TERRAIN_SAND_ROAD,
  TERRAIN_BAKED_CLAY,
  TERRAIN_ASTROTURF,
  TERRAIN_SNOWHALF,
  TERRAIN_SNOWFULL,
  TERRAIN_DAMAGED_ROAD1,
  TERRAIN_TRAIN_TRACK_ROAD,
  TERRAIN_BUMPYCOBBLES,
  TERRAIN_ARIES_ONLY,
  TERRAIN_ORION_ONLY,
  TERRAIN_B1RUMBLES,
  TERRAIN_B2RUMBLES,
  TERRAIN_ROUGH_SAND_MEDIUM,
  TERRAIN_ROUGH_SAND_HEAVY,

  //-------------
  TERRAIN_MAX
};

// (Type#12) Crash Damage State  (to be used with 'mCrashState')
enum
{
  CRASH_DAMAGE_NONE = 0,
  CRASH_DAMAGE_OFFTRACK,
  CRASH_DAMAGE_LARGE_PROP,
  CRASH_DAMAGE_SPINNING,
  CRASH_DAMAGE_ROLLING,
  //-------------
  CRASH_MAX
};

// (Type#13) ParticipantInfo struct  (to be used with 'mParticipantInfo')
typedef struct
{
  bool mIsActive;
  char mName[STRING_LENGTH_MAX];                   // [ string ]
  float mWorldPosition[VEC_MAX];                   // [ UNITS = World Space  X  Y  Z ]
  float mCurrentLapDistance;                       // [ UNITS = Metres ]   [ RANGE = 0.0f-&gt;... ]    [ UNSET = 0.0f ]
  unsigned int mRacePosition;                      // [ RANGE = 1-&gt;... ]   [ UNSET = 0 ]
  unsigned int mLapsCompleted;                     // [ RANGE = 0-&gt;... ]   [ UNSET = 0 ]
  unsigned int mCurrentLap;                        // [ RANGE = 0-&gt;... ]   [ UNSET = 0 ]
  unsigned int mCurrentSector;                     // [ enum (Type#4) Current Sector ]
} ParticipantInfo;

// *** Shared Memory ***

typedef struct
{
  // Version Number
  unsigned int mVersion;                           // [ RANGE = 0-&gt;... ]
  unsigned int mBuildVersionNumber;                // [ RANGE = 0-&gt;... ]   [ UNSET = 0 ]

  // Game States
  unsigned int mGameState;                         // [ enum (Type#1) Game state ]
  unsigned int mSessionState;                      // [ enum (Type#2) Session state ]
  unsigned int mRaceState;                         // [ enum (Type#3) Race State ]

  // Participant Info
  int mViewedParticipantIndex;                                  // [ RANGE = 0-&gt;STORED_PARTICIPANTS_MAX ]   [ UNSET = -1 ]
  int mNumParticipants;                                         // [ RANGE = 0-&gt;STORED_PARTICIPANTS_MAX ]   [ UNSET = -1 ]
  ParticipantInfo mParticipantInfo[STORED_PARTICIPANTS_MAX];    // [ struct (Type#13) ParticipantInfo struct ]

  // Unfiltered Input
  float mUnfilteredThrottle;                        // [ RANGE = 0.0f-&gt;1.0f ]
  float mUnfilteredBrake;                           // [ RANGE = 0.0f-&gt;1.0f ]
  float mUnfilteredSteering;                        // [ RANGE = -1.0f-&gt;1.0f ]
  float mUnfilteredClutch;                          // [ RANGE = 0.0f-&gt;1.0f ]

  // Vehicle information
  char mCarName[STRING_LENGTH_MAX];                 // [ string ]
  char mCarClassName[STRING_LENGTH_MAX];            // [ string ]

  // Event information
  unsigned int mLapsInEvent;                        // [ RANGE = 0-&gt;... ]   [ UNSET = 0 ]
  char mTrackLocation[STRING_LENGTH_MAX];           // [ string ]
  char mTrackVariation[STRING_LENGTH_MAX];          // [ string ]
  float mTrackLength;                               // [ UNITS = Metres ]   [ RANGE = 0.0f-&gt;... ]    [ UNSET = 0.0f ]

  // Timings
  bool mLapInvalidated;                             // [ UNITS = boolean ]   [ RANGE = false-&gt;true ]   [ UNSET = false ]
  float mBestLapTime;                               // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mLastLapTime;                               // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mCurrentTime;                               // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mSplitTimeAhead;                            // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mSplitTimeBehind;                           // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mSplitTime;                                 // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mEventTimeRemaining;                        // [ UNITS = milli-seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mPersonalFastestLapTime;                    // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mWorldFastestLapTime;                       // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mCurrentSector1Time;                        // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mCurrentSector2Time;                        // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mCurrentSector3Time;                        // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mFastestSector1Time;                        // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mFastestSector2Time;                        // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mFastestSector3Time;                        // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mPersonalFastestSector1Time;                // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mPersonalFastestSector2Time;                // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mPersonalFastestSector3Time;                // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mWorldFastestSector1Time;                   // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mWorldFastestSector2Time;                   // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mWorldFastestSector3Time;                   // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]

  // Flags
  unsigned int mHighestFlagColour;                 // [ enum (Type#5) Flag Colour ]
  unsigned int mHighestFlagReason;                 // [ enum (Type#6) Flag Reason ]

  // Pit Info
  unsigned int mPitMode;                           // [ enum (Type#7) Pit Mode ]
  unsigned int mPitSchedule;                       // [ enum (Type#8) Pit Stop Schedule ]

  // Car State
  unsigned int mCarFlags;                          // [ enum (Type#9) Car Flags ]
  float mOilTempCelsius;                           // [ UNITS = Celsius ]   [ UNSET = 0.0f ]
  float mOilPressureKPa;                           // [ UNITS = Kilopascal ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mWaterTempCelsius;                         // [ UNITS = Celsius ]   [ UNSET = 0.0f ]
  float mWaterPressureKPa;                         // [ UNITS = Kilopascal ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mFuelPressureKPa;                          // [ UNITS = Kilopascal ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mFuelLevel;                                // [ RANGE = 0.0f-&gt;1.0f ]
  float mFuelCapacity;                             // [ UNITS = Liters ]   [ RANGE = 0.0f-&gt;1.0f ]   [ UNSET = 0.0f ]
  float mSpeed;                                    // [ UNITS = Metres per-second ]   [ RANGE = 0.0f-&gt;... ]
  float mRpm;                                      // [ UNITS = Revolutions per minute ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mMaxRPM;                                   // [ UNITS = Revolutions per minute ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mBrake;                                    // [ RANGE = 0.0f-&gt;1.0f ]
  float mThrottle;                                 // [ RANGE = 0.0f-&gt;1.0f ]
  float mClutch;                                   // [ RANGE = 0.0f-&gt;1.0f ]
  float mSteering;                                 // [ RANGE = -1.0f-&gt;1.0f ]
  int mGear;                                       // [ RANGE = -1 (Reverse)  0 (Neutral)  1 (Gear 1)  2 (Gear 2)  etc... ]   [ UNSET = 0 (Neutral) ]
  int mNumGears;                                   // [ RANGE = 0-&gt;... ]   [ UNSET = -1 ]
  float mOdometerKM;                               // [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  bool mAntiLockActive;                            // [ UNITS = boolean ]   [ RANGE = false-&gt;true ]   [ UNSET = false ]
  int mLastOpponentCollisionIndex;                 // [ RANGE = 0-&gt;STORED_PARTICIPANTS_MAX ]   [ UNSET = -1 ]
  float mLastOpponentCollisionMagnitude;           // [ RANGE = 0.0f-&gt;... ]
  bool mBoostActive;                               // [ UNITS = boolean ]   [ RANGE = false-&gt;true ]   [ UNSET = false ]
  float mBoostAmount;                              // [ RANGE = 0.0f-&gt;100.0f ] 

  // Motion &amp; Device Related
  float mOrientation[VEC_MAX];                     // [ UNITS = Euler Angles ]
  float mLocalVelocity[VEC_MAX];                   // [ UNITS = Metres per-second ]
  float mWorldVelocity[VEC_MAX];                   // [ UNITS = Metres per-second ]
  float mAngularVelocity[VEC_MAX];                 // [ UNITS = Radians per-second ]
  float mLocalAcceleration[VEC_MAX];               // [ UNITS = Metres per-second ]
  float mWorldAcceleration[VEC_MAX];               // [ UNITS = Metres per-second ]
  float mExtentsCentre[VEC_MAX];                   // [ UNITS = Local Space  X  Y  Z ]

  // Wheels / Tyres
  unsigned int mTyreFlags[TYRE_MAX];               // [ enum (Type#10) Tyre Flags ]
  unsigned int mTerrain[TYRE_MAX];                 // [ enum (Type#11) Terrain Materials ]
  float mTyreY[TYRE_MAX];                          // [ UNITS = Local Space  Y ]
  float mTyreRPS[TYRE_MAX];                        // [ UNITS = Revolutions per second ]
  float mTyreSlipSpeed[TYRE_MAX];                  // [ UNITS = Metres per-second ]
  float mTyreTemp[TYRE_MAX];                       // [ UNITS = Celsius ]   [ UNSET = 0.0f ]
  float mTyreGrip[TYRE_MAX];                       // [ RANGE = 0.0f-&gt;1.0f ]
  float mTyreHeightAboveGround[TYRE_MAX];          // [ UNITS = Local Space  Y ]
  float mTyreLateralStiffness[TYRE_MAX];           // [ UNITS = Lateral stiffness coefficient used in tyre deformation ]
  float mTyreWear[TYRE_MAX];                       // [ RANGE = 0.0f-&gt;1.0f ]
  float mBrakeDamage[TYRE_MAX];                    // [ RANGE = 0.0f-&gt;1.0f ]
  float mSuspensionDamage[TYRE_MAX];               // [ RANGE = 0.0f-&gt;1.0f ]
  float mBrakeTempCelsius[TYRE_MAX];               // [ UNITS = Celsius ]
  float mTyreTreadTemp[TYRE_MAX];                  // [ UNITS = Kelvin ]
  float mTyreLayerTemp[TYRE_MAX];                  // [ UNITS = Kelvin ]
  float mTyreCarcassTemp[TYRE_MAX];                // [ UNITS = Kelvin ]
  float mTyreRimTemp[TYRE_MAX];                    // [ UNITS = Kelvin ]
  float mTyreInternalAirTemp[TYRE_MAX];            // [ UNITS = Kelvin ]

  // Car Damage
  unsigned int mCrashState;                        // [ enum (Type#12) Crash Damage State ]
  float mAeroDamage;                               // [ RANGE = 0.0f-&gt;1.0f ]
  float mEngineDamage;                             // [ RANGE = 0.0f-&gt;1.0f ]

  // Weather
  float mAmbientTemperature;                       // [ UNITS = Celsius ]   [ UNSET = 25.0f ]
  float mTrackTemperature;                         // [ UNITS = Celsius ]   [ UNSET = 30.0f ]
  float mRainDensity;                              // [ UNITS = How much rain will fall ]   [ RANGE = 0.0f-&gt;1.0f ]
  float mWindSpeed;                                // [ RANGE = 0.0f-&gt;100.0f ]   [ UNSET = 2.0f ]
  float mWindDirectionX;                           // [ UNITS = Normalised Vector X ]
  float mWindDirectionY;                           // [ UNITS = Normalised Vector Y ]
  float mCloudBrightness;                          // [ RANGE = 0.0f-&gt;... ]
} SharedMemory;

#endif  // _SHARED_MEMORY_HPP_
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/333848/programm-verzögert</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 08:58:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333848.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Aug 2015 21:24:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Programm verzögert on Tue, 04 Aug 2015 21:24:54 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Da ich neu bin weiß ich leider nicht, ob das hier im richtigen Bereich ist. Ich bitte um Verständnis.</p>
<p>Ich habe ein Programm geschrieben, welches Daten aus dem Spiel Project Cars ausliest, diese verarbeitet und dann an einen Arduino weiterleitet.<br />
Jetzt habe ich aber das Problem, dass nach dem das Programm eine Weile lief, die Ausgabe verzögert ist. Also kommt die Nachicht erst nach 1-2 Sekunden an.</p>
<p>Könnt ihr mir Tipps geben, wie ich das ganze verhindern kann?</p>
<p>Sorry das ich jetzt den ganzen Code hochgeladen habe, aber ich weiß nicht wo die Bremse ist.</p>
<p>PS: Ich habe die main.cpp geschrieben, die Restlichen habe ich nur inkludiert.</p>
<p>Main\1:</p>
<pre><code>// Used for memory-mapped functionality
#include &lt;windows.h&gt;
#include &lt;stdio.h&gt;
#include &lt;conio.h&gt;
#include &quot;tserial.h&quot;
#include &quot;bot_control.h&quot;
#include &quot;sharedmemory.h&quot;
#include &lt;cmath&gt;

// Name of the pCars memory mapped file

#define MAP_OBJECT_NAME &quot;$pcars$&quot;

//Konstanten

const bool debug = true;
const unsigned char maxFPS = 100;
const unsigned char fuelWarn = 10;

char data; //To store the character to send
char lastFlag;

serial comm; //serial is a class type defined in these files, used for referring to the communication device

int main() {

	// Open the memory-mapped file
	HANDLE fileHandle = OpenFileMapping( PAGE_READONLY, FALSE, MAP_OBJECT_NAME );
	if (fileHandle == NULL)
	{
		printf( &quot;Could not open file mapping object (%d).\n&quot;, GetLastError() );
		Sleep(2000);
		return 1;
	}

	// Get the data structure
	const SharedMemory* sharedData = (SharedMemory*)MapViewOfFile( fileHandle, PAGE_READONLY, 0, 0, sizeof(SharedMemory) );
	if (sharedData == NULL)
	{
		printf( &quot;Could not map view of file (%d).\n&quot;, GetLastError() );

		CloseHandle( fileHandle );
		Sleep(2000);
		return 1;
	}

	// Ensure we're sync'd to the correct data version
	if ( sharedData-&gt;mVersion != SHARED_MEMORY_VERSION )
	{
		printf( &quot;Data version mismatch\n&quot;);
		Sleep(2000);
		return 1;
	}

	comm.startDevice(&quot;COM3&quot;, 9600);
	/* “COM 2” refers to the com port in which the USB to SERIAL port is attached. It is shown by right clicking on my computer, then going to properties and then device manager
	9600 is the baud-rate in bits per second */

	//------------------------------------------------------------------------------
	// Datensenden -- Schleife
	//------------------------------------------------------------------------------

	//printf( &quot;ESC TO EXIT\n\n&quot;, sharedData-&gt;mUnfilteredSteering );

	while (true)
	{
		if(debug)
		{
			printf( &quot;Flag: (%d)\n&quot;, sharedData-&gt;mHighestFlagColour );
			printf( &quot;RPMMax: (%d)\n&quot;, sharedData-&gt;mMaxRPM);
			printf( &quot;Data: (%d)\n&quot;,data);
			printf( &quot;lastFlag: (%d)\n&quot;,lastFlag);
			system(&quot;cls&quot;);
		}

		if(lastFlag != sharedData-&gt;mHighestFlagColour){
			data = sharedData-&gt;mHighestFlagColour;
			lastFlag = data;
		}

		comm.send_data(data); //The data is sent through the arduino

		if ( _kbhit() &amp;&amp; _getch() == 27 ) // check for escape
		{
			break;
		}

		Sleep(1000 / maxFPS);
	}

	// Cleanup
	UnmapViewOfFile( sharedData );
	CloseHandle( fileHandle );

	comm.stopDevice(); //The device is closed down
	getch();

	return 0;
}
</code></pre>
<pre><code>#include &quot;tserial.h&quot;

class serial{

  private:
        // private attributes
		Tserial *com;
  public:

	serial() {

		 }

	bool startDevice(char *port,int speed)
	{
		com = new Tserial();
		if (com!=0)
		{
			if(com-&gt;connect(port, speed, spNONE))
				printf(&quot;Not Connected...\n&quot;);
			else
				printf(&quot;Connected..\n&quot;);
			return TRUE;
		}
		else
			return FALSE; 
	}

	void stopDevice()
	{
		com-&gt;disconnect();
        // ------------------
        delete com;
        com = 0;
	}

	void send_data(unsigned char data)
	{
	//	unsigned char data = 0;

		com-&gt;sendChar(data);
		//printf(&quot;%c&quot;,data);

	}
};
</code></pre>
<pre><code>#ifndef TSERIAL_H
#define TSERIAL_H

#include &lt;stdio.h&gt;
#include &lt;windows.h&gt;

enum serial_parity  { spNONE,    spODD, spEVEN };

/* -------------------------------------------------------------------- */
/* -----------------------------  Tserial  ---------------------------- */
/* -------------------------------------------------------------------- */
class Tserial
{
    // -------------------------------------------------------- //
protected:
    char              port[10];                      // port name &quot;com1&quot;,...
    int               rate;                          // baudrate
    serial_parity     parityMode;
    HANDLE            serial_handle;                 // ...

    // ++++++++++++++++++++++++++++++++++++++++++++++
    // .................. EXTERNAL VIEW .............
    // ++++++++++++++++++++++++++++++++++++++++++++++
public:
                  Tserial();
                 ~Tserial();
    int           connect          (char *port_arg, int rate_arg,
                                    serial_parity parity_arg);
    void          sendChar         (char c);
    void          sendArray        (char *buffer, int len);
    char          getChar          (void);
    int           getArray         (char *buffer, int len);
    int           getNbrOfBytes    (void);
    void          disconnect       (void);
};
/* -------------------------------------------------------------------- */

#endif TSERIAL_H
</code></pre>
<pre><code>#define STRICT
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;process.h&gt;
#include &lt;conio.h&gt;
#include &lt;windows.h&gt;
//#include &lt;stdafx.h&gt;
#include &lt;windows.h&gt;

#include &quot;tserial.h&quot;

/* -------------------------------------------------------------------- */
/* -------------------------    Tserial   ----------------------------- */
/* -------------------------------------------------------------------- */
Tserial::Tserial()
{
    parityMode       = spNONE;
    port[0]          = 0;
    rate             = 0;
    serial_handle    = INVALID_HANDLE_VALUE;
}

/* -------------------------------------------------------------------- */
/* --------------------------    ~Tserial     ------------------------- */
/* -------------------------------------------------------------------- */
Tserial::~Tserial()
{
    if (serial_handle!=INVALID_HANDLE_VALUE)
        CloseHandle(serial_handle);
    serial_handle = INVALID_HANDLE_VALUE;
}
/* -------------------------------------------------------------------- */
/* --------------------------    disconnect   ------------------------- */
/* -------------------------------------------------------------------- */
void Tserial::disconnect(void)
{
    if (serial_handle!=INVALID_HANDLE_VALUE)
        CloseHandle(serial_handle);
    serial_handle = INVALID_HANDLE_VALUE;
}
/* -------------------------------------------------------------------- */
/* --------------------------    connect      ------------------------- */
/* -------------------------------------------------------------------- */
int  Tserial::connect          (char *port_arg, int rate_arg, serial_parity parity_arg)
{
    int erreur;
    DCB  dcb;
    COMMTIMEOUTS cto = { 0, 0, 0, 0, 0 };

    /* --------------------------------------------- */
    if (serial_handle!=INVALID_HANDLE_VALUE)
        CloseHandle(serial_handle);
    serial_handle = INVALID_HANDLE_VALUE;

    erreur = 0;

    if (port_arg!=0)
    {
        strncpy(port, port_arg, 10);
        rate      = rate_arg;
        parityMode= parity_arg;
        memset(&amp;dcb,0,sizeof(dcb));

        /* -------------------------------------------------------------------- */
        // set DCB to configure the serial port
        dcb.DCBlength       = sizeof(dcb);                   

        /* ---------- Serial Port Config ------- */
        dcb.BaudRate        = rate;

        switch(parityMode)
        {
            case spNONE:
                            dcb.Parity      = NOPARITY;
                            dcb.fParity     = 0;
                            break;
            case spEVEN:
                            dcb.Parity      = EVENPARITY;
                            dcb.fParity     = 1;
                            break;
            case spODD:
                            dcb.Parity      = ODDPARITY;
                            dcb.fParity     = 1;
                            break;
        }

        dcb.StopBits        = ONESTOPBIT;
        dcb.ByteSize        = 8;

        dcb.fOutxCtsFlow    = 0;
        dcb.fOutxDsrFlow    = 0;
        dcb.fDtrControl     = DTR_CONTROL_DISABLE;
        dcb.fDsrSensitivity = 0;
        dcb.fRtsControl     = RTS_CONTROL_DISABLE;
        dcb.fOutX           = 0;
        dcb.fInX            = 0;

        /* ----------------- misc parameters ----- */
        dcb.fErrorChar      = 0;
        dcb.fBinary         = 1;
        dcb.fNull           = 0;
        dcb.fAbortOnError   = 0;
        dcb.wReserved       = 0;
        dcb.XonLim          = 2;
        dcb.XoffLim         = 4;
        dcb.XonChar         = 0x13;
        dcb.XoffChar        = 0x19;
        dcb.EvtChar         = 0;

        /* -------------------------------------------------------------------- */
        serial_handle    = CreateFile(port, GENERIC_READ | GENERIC_WRITE,
                               0, NULL, OPEN_EXISTING,NULL,NULL);
                   // opening serial port

        if (serial_handle    != INVALID_HANDLE_VALUE)
        {
            if(!SetCommMask(serial_handle, 0))
                erreur = 1;

            // set timeouts
            if(!SetCommTimeouts(serial_handle,&amp;cto))
                erreur = 2;

            // set DCB
            if(!SetCommState(serial_handle,&amp;dcb))
                erreur = 4;
        }
        else
            erreur = 8;
    }
    else
        erreur = 16;

    /* --------------------------------------------- */
    if (erreur!=0)
    {
        CloseHandle(serial_handle);
        serial_handle = INVALID_HANDLE_VALUE;
    }
    return(erreur);
}

/* -------------------------------------------------------------------- */
/* --------------------------    sendChar     ------------------------- */
/* -------------------------------------------------------------------- */
void Tserial::sendChar(char data)
{
    sendArray(&amp;data, 1);
}

/* -------------------------------------------------------------------- */
/* --------------------------    sendArray    ------------------------- */
/* -------------------------------------------------------------------- */
void Tserial::sendArray(char *buffer, int len)
{
    unsigned long result;

    if (serial_handle!=INVALID_HANDLE_VALUE)
        WriteFile(serial_handle, buffer, len, &amp;result, NULL);
}

/* -------------------------------------------------------------------- */
/* --------------------------    getChar      ------------------------- */
/* -------------------------------------------------------------------- */
char Tserial::getChar(void)
{
    char c;
    getArray(&amp;c, 1);
    return(c);
}

/* -------------------------------------------------------------------- */
/* --------------------------    getArray     ------------------------- */
/* -------------------------------------------------------------------- */
int  Tserial::getArray         (char *buffer, int len)
{
    unsigned long read_nbr;

    read_nbr = 0;
    if (serial_handle!=INVALID_HANDLE_VALUE)
    {
        ReadFile(serial_handle, buffer, len, &amp;read_nbr, NULL);
    }
    return((int) read_nbr);
}
/* -------------------------------------------------------------------- */
/* --------------------------    getNbrOfBytes ------------------------ */
/* -------------------------------------------------------------------- */
int Tserial::getNbrOfBytes    (void)
{
    struct _COMSTAT status;
    int             n;
    unsigned long   etat;

    n = 0;

    if (serial_handle!=INVALID_HANDLE_VALUE)
    {
        ClearCommError(serial_handle, &amp;etat, &amp;status);
        n = status.cbInQue;
    }

    return(n);
}
</code></pre>
<pre><code>// *** Types ***

// Header version number to test against
enum
{
  SHARED_MEMORY_VERSION = 5
};

// Maximum allowed length of string
enum
{
  STRING_LENGTH_MAX = 64
};

// Maximum number of general participant information allowed to be stored in memory-mapped file
enum
{
  STORED_PARTICIPANTS_MAX = 64
};

// Tyres
enum 
{
  TYRE_FRONT_LEFT = 0,
  TYRE_FRONT_RIGHT,
  TYRE_REAR_LEFT,
  TYRE_REAR_RIGHT,
  //--------------
  TYRE_MAX
};

// Vector
enum
{
  VEC_X = 0,
  VEC_Y,
  VEC_Z,
  //-------------
  VEC_MAX
};

// (Type#1) GameState (to be used with 'mGameState')
enum
{
  GAME_EXITED = 0,
  GAME_FRONT_END,
  GAME_INGAME_PLAYING,
  GAME_INGAME_PAUSED,
  GAME_INGAME_RESTARTING,
  GAME_INGAME_REPLAY,
  GAME_FRONT_END_REPLAY,
  //-------------
  GAME_MAX
};

// (Type#2) Session state (to be used with 'mSessionState')
enum
{
  SESSION_INVALID = 0,
  SESSION_PRACTICE,
  SESSION_TEST,
  SESSION_QUALIFY,
  SESSION_FORMATION_LAP,
  SESSION_RACE,
  SESSION_TIME_ATTACK,
  //-------------
  SESSION_MAX
};

// (Type#3) RaceState (to be used with 'mRaceState')
enum
{
  RACESTATE_INVALID,
  RACESTATE_NOT_STARTED,
  RACESTATE_RACING,
  RACESTATE_FINISHED,
  RACESTATE_DISQUALIFIED,
  RACESTATE_RETIRED,
  RACESTATE_DNF,
  //-------------
  RACESTATE_MAX
};

// (Type#4) Current Sector (to be used with 'mCurrentSector')
enum
{
  SECTOR_INVALID = 0, 
  SECTOR_START,
  SECTOR_SECTOR1,
  SECTOR_SECTOR2,
  SECTOR_FINISH,
  SECTOR_STOP,
  //-------------
  SECTOR_MAX
};

// (Type#5) Flag Colours (to be used with 'mHighestFlagColour')
enum
{
  FLAG_COLOUR_NONE = 0,       // Not used for actual flags, only for some query functions
  FLAG_COLOUR_GREEN,          // End of danger zone, or race started
  FLAG_COLOUR_BLUE,           // Faster car wants to overtake the participant
  FLAG_COLOUR_WHITE,          // Approaching a slow car
  FLAG_COLOUR_YELLOW,         // Danger on the racing surface itself
  FLAG_COLOUR_DOUBLE_YELLOW,  // Danger that wholly or partly blocks the racing surface
  FLAG_COLOUR_BLACK,          // Participant disqualified
  FLAG_COLOUR_CHEQUERED,      // Chequered flag
  //-------------
  FLAG_COLOUR_MAX
};

// (Type#6) Flag Reason (to be used with 'mHighestFlagReason')
enum
{
  FLAG_REASON_NONE = 0,
  FLAG_REASON_SOLO_CRASH,
  FLAG_REASON_VEHICLE_CRASH,
  FLAG_REASON_VEHICLE_OBSTRUCTION,
  //-------------
  FLAG_REASON_MAX
};

// (Type#7) Pit Mode (to be used with 'mPitMode')
enum
{
  PIT_MODE_NONE = 0,
  PIT_MODE_DRIVING_INTO_PITS,
  PIT_MODE_IN_PIT,
  PIT_MODE_DRIVING_OUT_OF_PITS,
  PIT_MODE_IN_GARAGE,
  //-------------
  PIT_MODE_MAX
};

// (Type#8) Pit Stop Schedule (to be used with 'mPitSchedule')
enum
{
  PIT_SCHEDULE_NONE = 0,        // Nothing scheduled
  PIT_SCHEDULE_STANDARD,        // Used for standard pit sequence
  PIT_SCHEDULE_DRIVE_THROUGH,   // Used for drive-through penalty
  PIT_SCHEDULE_STOP_GO,         // Used for stop-go penalty
  //-------------
  PIT_SCHEDULE_MAX
};

// (Type#9) Car Flags (to be used with 'mCarFlags')
enum
{
  CAR_HEADLIGHT         = (1&lt;&lt;0),
  CAR_ENGINE_ACTIVE     = (1&lt;&lt;1),
  CAR_ENGINE_WARNING    = (1&lt;&lt;2),
  CAR_SPEED_LIMITER     = (1&lt;&lt;3),
  CAR_ABS               = (1&lt;&lt;4),
  CAR_HANDBRAKE         = (1&lt;&lt;5),
};

// (Type#10) Tyre Flags (to be used with 'mTyreFlags')
enum
{
  TYRE_ATTACHED         = (1&lt;&lt;0),
  TYRE_INFLATED         = (1&lt;&lt;1),
  TYRE_IS_ON_GROUND     = (1&lt;&lt;2),
};

// (Type#11) Terrain Materials (to be used with 'mTerrain')
enum
{
  TERRAIN_ROAD = 0,
  TERRAIN_LOW_GRIP_ROAD,
  TERRAIN_BUMPY_ROAD1,
  TERRAIN_BUMPY_ROAD2,
  TERRAIN_BUMPY_ROAD3,
  TERRAIN_MARBLES,
  TERRAIN_GRASSY_BERMS,
  TERRAIN_GRASS,
  TERRAIN_GRAVEL,
  TERRAIN_BUMPY_GRAVEL,
  TERRAIN_RUMBLE_STRIPS,
  TERRAIN_DRAINS,
  TERRAIN_TYREWALLS,
  TERRAIN_CEMENTWALLS,
  TERRAIN_GUARDRAILS,
  TERRAIN_SAND,
  TERRAIN_BUMPY_SAND,
  TERRAIN_DIRT,
  TERRAIN_BUMPY_DIRT,
  TERRAIN_DIRT_ROAD,
  TERRAIN_BUMPY_DIRT_ROAD,
  TERRAIN_PAVEMENT,
  TERRAIN_DIRT_BANK,
  TERRAIN_WOOD,
  TERRAIN_DRY_VERGE,
  TERRAIN_EXIT_RUMBLE_STRIPS,
  TERRAIN_GRASSCRETE,
  TERRAIN_LONG_GRASS,
  TERRAIN_SLOPE_GRASS,
  TERRAIN_COBBLES,
  TERRAIN_SAND_ROAD,
  TERRAIN_BAKED_CLAY,
  TERRAIN_ASTROTURF,
  TERRAIN_SNOWHALF,
  TERRAIN_SNOWFULL,
  TERRAIN_DAMAGED_ROAD1,
  TERRAIN_TRAIN_TRACK_ROAD,
  TERRAIN_BUMPYCOBBLES,
  TERRAIN_ARIES_ONLY,
  TERRAIN_ORION_ONLY,
  TERRAIN_B1RUMBLES,
  TERRAIN_B2RUMBLES,
  TERRAIN_ROUGH_SAND_MEDIUM,
  TERRAIN_ROUGH_SAND_HEAVY,

  //-------------
  TERRAIN_MAX
};

// (Type#12) Crash Damage State  (to be used with 'mCrashState')
enum
{
  CRASH_DAMAGE_NONE = 0,
  CRASH_DAMAGE_OFFTRACK,
  CRASH_DAMAGE_LARGE_PROP,
  CRASH_DAMAGE_SPINNING,
  CRASH_DAMAGE_ROLLING,
  //-------------
  CRASH_MAX
};

// (Type#13) ParticipantInfo struct  (to be used with 'mParticipantInfo')
typedef struct
{
  bool mIsActive;
  char mName[STRING_LENGTH_MAX];                   // [ string ]
  float mWorldPosition[VEC_MAX];                   // [ UNITS = World Space  X  Y  Z ]
  float mCurrentLapDistance;                       // [ UNITS = Metres ]   [ RANGE = 0.0f-&gt;... ]    [ UNSET = 0.0f ]
  unsigned int mRacePosition;                      // [ RANGE = 1-&gt;... ]   [ UNSET = 0 ]
  unsigned int mLapsCompleted;                     // [ RANGE = 0-&gt;... ]   [ UNSET = 0 ]
  unsigned int mCurrentLap;                        // [ RANGE = 0-&gt;... ]   [ UNSET = 0 ]
  unsigned int mCurrentSector;                     // [ enum (Type#4) Current Sector ]
} ParticipantInfo;

// *** Shared Memory ***

typedef struct
{
  // Version Number
  unsigned int mVersion;                           // [ RANGE = 0-&gt;... ]
  unsigned int mBuildVersionNumber;                // [ RANGE = 0-&gt;... ]   [ UNSET = 0 ]

  // Game States
  unsigned int mGameState;                         // [ enum (Type#1) Game state ]
  unsigned int mSessionState;                      // [ enum (Type#2) Session state ]
  unsigned int mRaceState;                         // [ enum (Type#3) Race State ]

  // Participant Info
  int mViewedParticipantIndex;                                  // [ RANGE = 0-&gt;STORED_PARTICIPANTS_MAX ]   [ UNSET = -1 ]
  int mNumParticipants;                                         // [ RANGE = 0-&gt;STORED_PARTICIPANTS_MAX ]   [ UNSET = -1 ]
  ParticipantInfo mParticipantInfo[STORED_PARTICIPANTS_MAX];    // [ struct (Type#13) ParticipantInfo struct ]

  // Unfiltered Input
  float mUnfilteredThrottle;                        // [ RANGE = 0.0f-&gt;1.0f ]
  float mUnfilteredBrake;                           // [ RANGE = 0.0f-&gt;1.0f ]
  float mUnfilteredSteering;                        // [ RANGE = -1.0f-&gt;1.0f ]
  float mUnfilteredClutch;                          // [ RANGE = 0.0f-&gt;1.0f ]

  // Vehicle information
  char mCarName[STRING_LENGTH_MAX];                 // [ string ]
  char mCarClassName[STRING_LENGTH_MAX];            // [ string ]

  // Event information
  unsigned int mLapsInEvent;                        // [ RANGE = 0-&gt;... ]   [ UNSET = 0 ]
  char mTrackLocation[STRING_LENGTH_MAX];           // [ string ]
  char mTrackVariation[STRING_LENGTH_MAX];          // [ string ]
  float mTrackLength;                               // [ UNITS = Metres ]   [ RANGE = 0.0f-&gt;... ]    [ UNSET = 0.0f ]

  // Timings
  bool mLapInvalidated;                             // [ UNITS = boolean ]   [ RANGE = false-&gt;true ]   [ UNSET = false ]
  float mBestLapTime;                               // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mLastLapTime;                               // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mCurrentTime;                               // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mSplitTimeAhead;                            // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mSplitTimeBehind;                           // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mSplitTime;                                 // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mEventTimeRemaining;                        // [ UNITS = milli-seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mPersonalFastestLapTime;                    // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mWorldFastestLapTime;                       // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mCurrentSector1Time;                        // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mCurrentSector2Time;                        // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mCurrentSector3Time;                        // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mFastestSector1Time;                        // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mFastestSector2Time;                        // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mFastestSector3Time;                        // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mPersonalFastestSector1Time;                // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mPersonalFastestSector2Time;                // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mPersonalFastestSector3Time;                // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mWorldFastestSector1Time;                   // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mWorldFastestSector2Time;                   // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  float mWorldFastestSector3Time;                   // [ UNITS = seconds ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]

  // Flags
  unsigned int mHighestFlagColour;                 // [ enum (Type#5) Flag Colour ]
  unsigned int mHighestFlagReason;                 // [ enum (Type#6) Flag Reason ]

  // Pit Info
  unsigned int mPitMode;                           // [ enum (Type#7) Pit Mode ]
  unsigned int mPitSchedule;                       // [ enum (Type#8) Pit Stop Schedule ]

  // Car State
  unsigned int mCarFlags;                          // [ enum (Type#9) Car Flags ]
  float mOilTempCelsius;                           // [ UNITS = Celsius ]   [ UNSET = 0.0f ]
  float mOilPressureKPa;                           // [ UNITS = Kilopascal ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mWaterTempCelsius;                         // [ UNITS = Celsius ]   [ UNSET = 0.0f ]
  float mWaterPressureKPa;                         // [ UNITS = Kilopascal ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mFuelPressureKPa;                          // [ UNITS = Kilopascal ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mFuelLevel;                                // [ RANGE = 0.0f-&gt;1.0f ]
  float mFuelCapacity;                             // [ UNITS = Liters ]   [ RANGE = 0.0f-&gt;1.0f ]   [ UNSET = 0.0f ]
  float mSpeed;                                    // [ UNITS = Metres per-second ]   [ RANGE = 0.0f-&gt;... ]
  float mRpm;                                      // [ UNITS = Revolutions per minute ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mMaxRPM;                                   // [ UNITS = Revolutions per minute ]   [ RANGE = 0.0f-&gt;... ]   [ UNSET = 0.0f ]
  float mBrake;                                    // [ RANGE = 0.0f-&gt;1.0f ]
  float mThrottle;                                 // [ RANGE = 0.0f-&gt;1.0f ]
  float mClutch;                                   // [ RANGE = 0.0f-&gt;1.0f ]
  float mSteering;                                 // [ RANGE = -1.0f-&gt;1.0f ]
  int mGear;                                       // [ RANGE = -1 (Reverse)  0 (Neutral)  1 (Gear 1)  2 (Gear 2)  etc... ]   [ UNSET = 0 (Neutral) ]
  int mNumGears;                                   // [ RANGE = 0-&gt;... ]   [ UNSET = -1 ]
  float mOdometerKM;                               // [ RANGE = 0.0f-&gt;... ]   [ UNSET = -1.0f ]
  bool mAntiLockActive;                            // [ UNITS = boolean ]   [ RANGE = false-&gt;true ]   [ UNSET = false ]
  int mLastOpponentCollisionIndex;                 // [ RANGE = 0-&gt;STORED_PARTICIPANTS_MAX ]   [ UNSET = -1 ]
  float mLastOpponentCollisionMagnitude;           // [ RANGE = 0.0f-&gt;... ]
  bool mBoostActive;                               // [ UNITS = boolean ]   [ RANGE = false-&gt;true ]   [ UNSET = false ]
  float mBoostAmount;                              // [ RANGE = 0.0f-&gt;100.0f ] 

  // Motion &amp; Device Related
  float mOrientation[VEC_MAX];                     // [ UNITS = Euler Angles ]
  float mLocalVelocity[VEC_MAX];                   // [ UNITS = Metres per-second ]
  float mWorldVelocity[VEC_MAX];                   // [ UNITS = Metres per-second ]
  float mAngularVelocity[VEC_MAX];                 // [ UNITS = Radians per-second ]
  float mLocalAcceleration[VEC_MAX];               // [ UNITS = Metres per-second ]
  float mWorldAcceleration[VEC_MAX];               // [ UNITS = Metres per-second ]
  float mExtentsCentre[VEC_MAX];                   // [ UNITS = Local Space  X  Y  Z ]

  // Wheels / Tyres
  unsigned int mTyreFlags[TYRE_MAX];               // [ enum (Type#10) Tyre Flags ]
  unsigned int mTerrain[TYRE_MAX];                 // [ enum (Type#11) Terrain Materials ]
  float mTyreY[TYRE_MAX];                          // [ UNITS = Local Space  Y ]
  float mTyreRPS[TYRE_MAX];                        // [ UNITS = Revolutions per second ]
  float mTyreSlipSpeed[TYRE_MAX];                  // [ UNITS = Metres per-second ]
  float mTyreTemp[TYRE_MAX];                       // [ UNITS = Celsius ]   [ UNSET = 0.0f ]
  float mTyreGrip[TYRE_MAX];                       // [ RANGE = 0.0f-&gt;1.0f ]
  float mTyreHeightAboveGround[TYRE_MAX];          // [ UNITS = Local Space  Y ]
  float mTyreLateralStiffness[TYRE_MAX];           // [ UNITS = Lateral stiffness coefficient used in tyre deformation ]
  float mTyreWear[TYRE_MAX];                       // [ RANGE = 0.0f-&gt;1.0f ]
  float mBrakeDamage[TYRE_MAX];                    // [ RANGE = 0.0f-&gt;1.0f ]
  float mSuspensionDamage[TYRE_MAX];               // [ RANGE = 0.0f-&gt;1.0f ]
  float mBrakeTempCelsius[TYRE_MAX];               // [ UNITS = Celsius ]
  float mTyreTreadTemp[TYRE_MAX];                  // [ UNITS = Kelvin ]
  float mTyreLayerTemp[TYRE_MAX];                  // [ UNITS = Kelvin ]
  float mTyreCarcassTemp[TYRE_MAX];                // [ UNITS = Kelvin ]
  float mTyreRimTemp[TYRE_MAX];                    // [ UNITS = Kelvin ]
  float mTyreInternalAirTemp[TYRE_MAX];            // [ UNITS = Kelvin ]

  // Car Damage
  unsigned int mCrashState;                        // [ enum (Type#12) Crash Damage State ]
  float mAeroDamage;                               // [ RANGE = 0.0f-&gt;1.0f ]
  float mEngineDamage;                             // [ RANGE = 0.0f-&gt;1.0f ]

  // Weather
  float mAmbientTemperature;                       // [ UNITS = Celsius ]   [ UNSET = 25.0f ]
  float mTrackTemperature;                         // [ UNITS = Celsius ]   [ UNSET = 30.0f ]
  float mRainDensity;                              // [ UNITS = How much rain will fall ]   [ RANGE = 0.0f-&gt;1.0f ]
  float mWindSpeed;                                // [ RANGE = 0.0f-&gt;100.0f ]   [ UNSET = 2.0f ]
  float mWindDirectionX;                           // [ UNITS = Normalised Vector X ]
  float mWindDirectionY;                           // [ UNITS = Normalised Vector Y ]
  float mCloudBrightness;                          // [ RANGE = 0.0f-&gt;... ]
} SharedMemory;

#endif  // _SHARED_MEMORY_HPP_
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2462535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462535</guid><dc:creator><![CDATA[globalhost+]]></dc:creator><pubDate>Tue, 04 Aug 2015 21:24:54 GMT</pubDate></item><item><title><![CDATA[Reply to Programm verzögert on Tue, 04 Aug 2015 22:16:34 GMT]]></title><description><![CDATA[<p>Du glaubst doch nicht im Ernst, dass sich das jemand anguckt, oder? Zumal die Fehlerbeschreibung zu wünschen lässt: Welche Ausgabe ist verzögert? Wie merkst du das? Hat das vielleicht etwas mit deinen ganzen sleeps zu tun?</p>
<p>Aber allgemein:<br />
<a href="https://www.c-plusplus.net/forum/304133">Wie man Probleme nachstellbar und nachvollziehbar macht</a><br />
Lesen, verstehen, dann bessere Frage stellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462540</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 04 Aug 2015 22:16:34 GMT</pubDate></item><item><title><![CDATA[Reply to Programm verzögert on Tue, 04 Aug 2015 22:30:38 GMT]]></title><description><![CDATA[<p>Sorry, ich weiß nicht wirklich wodurch das Problem entsteht, deshalb habe ich den kompletten Quelltext hinzugefügt.</p>
<p>In dem Programm werden Daten aus einem Spiel ausgelesen. Dabei erscheint aber erst ein paar Sekunden nach dem Ingame der Wert erscheint, die Ausgabe über die Konsole:</p>
<pre><code>printf( &quot;Flag: (%d)\n&quot;, sharedData-&gt;mHighestFlagColour );
</code></pre>
<p>Das liegt wahrscheinlich nicht an den Sleeps, da diese nicht so lang sind, sondern diese sind dafür da damit das Skript nicht zu überlasstend wird. An der Überlasstung liegt es nicht da das Skript nur 1 Mb RAM verbraucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462543</guid><dc:creator><![CDATA[globalhost+]]></dc:creator><pubDate>Tue, 04 Aug 2015 22:30:38 GMT</pubDate></item><item><title><![CDATA[Reply to Programm verzögert on Tue, 04 Aug 2015 23:00:16 GMT]]></title><description><![CDATA[<p>globalhost+ schrieb:</p>
<blockquote>
<p>Sorry, ich weiß nicht wirklich wodurch das Problem entsteht, deshalb habe ich den kompletten Quelltext hinzugefügt.</p>
</blockquote>
<p>Dann versuch es einzukreisen! Darum habe ich dir doch den Link gegeben. Niemand durchforstet auf gut Glück tausende Zeilen Code nach einem vage spezifizierten Fehler. Ohne das zugehörige Gegenstück können wir das Programm ja nicht einmal ausprobieren!</p>
<blockquote>
<p>In dem Programm werden Daten aus einem Spiel ausgelesen. Dabei erscheint aber erst ein paar Sekunden nach dem Ingame der Wert erscheint, die Ausgabe über die Konsole:</p>
</blockquote>
<p>Und was ist mit der Gegenseite? Wie kommen die Daten zu deinem Programm?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462544</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 04 Aug 2015 23:00:16 GMT</pubDate></item><item><title><![CDATA[Reply to Programm verzögert on Tue, 04 Aug 2015 23:02:57 GMT]]></title><description><![CDATA[<p>So, habe soeben tausende Zeilen Code auf gut Glück nach einem vage spezifizierten Fehler durchforstet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462545</guid><dc:creator><![CDATA[deejey]]></dc:creator><pubDate>Tue, 04 Aug 2015 23:02:57 GMT</pubDate></item><item><title><![CDATA[Reply to Programm verzögert on Tue, 04 Aug 2015 23:18:35 GMT]]></title><description><![CDATA[<p>deejey schrieb:</p>
<blockquote>
<p>So, habe soeben tausende Zeilen Code auf gut Glück nach einem vage spezifizierten Fehler durchforstet.</p>
</blockquote>
<p>Bei der Zeit klingt das eher so, als wäre das ein lockerer Waldlauf gewesen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462548</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 04 Aug 2015 23:18:35 GMT</pubDate></item><item><title><![CDATA[Reply to Programm verzögert on Tue, 04 Aug 2015 23:37:33 GMT]]></title><description><![CDATA[<p>deejey schrieb:</p>
<blockquote>
<p>So, habe soeben tausende Zeilen Code auf gut Glück nach einem vage spezifizierten Fehler durchforstet.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Das Problem tritt auf, weil irgendwie die Main-Loop nicht schnell genug durchlaufen werden kann.</p>
<p>EDIT: Jetzt habe ich den Fehler! Das Problem war diese Zeile:</p>
<pre><code>comm.send_data(data);
</code></pre>
<p>Diese wurde zu oft (sinnlos) durchlaufen und somit war der Arduino überlasstet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2462549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2462549</guid><dc:creator><![CDATA[globalhost+]]></dc:creator><pubDate>Tue, 04 Aug 2015 23:37:33 GMT</pubDate></item></channel></rss>