Arduino RC bil med FPV Camera (6 / 15 steg)
Steg 6: C# program gängning och XBox 360 Controller Input
Den första biten av programvara jag skrev för detta projekt var för XBox 360-styrenheten (du kanske har märkt att det ursprungliga namnet Visual Studio-projekt har genomförts till slutet!). XBox controller koden hittar du i den första delen av filen "Form1.cs". Som nämnts i föregående steg, här koden fungerar bara om Xinput dotnet omslaget har konfigurerats (dvs "XInputDotNetPure.dll" har lagts till som en referens i C#-projektet, och "XInputInterface.dll" är i samma mapp som den .exe-fil).
Koden fungerar genom att upprepade gånger polling handkontrollen för att hämta status för knappar och analoga kontroller. På grund av denna polling insåg jag att programmet skulle behöva flera trådar, för att fungera alls. Detta var lite av en utmaning, som jag inte hade faktiskt skrivit ett flertrådat program innan den här. Efter att titta på några exempel och tutorials, jag bestämde mig för att det skulle vara en huvudprogrammet tråd för det grafiska användargränssnittet (GUI), en separat tråd för hantering av XBox 360-handkontrollen och flera fler trådar för andra saker. Flera trådar kan alla dessa saker att arbeta parallellt, utan någon märkbar fördröjning i GUI.
I Xbox controller tråd, är controller status intervjuade med ca 50Hz, så det har alltid mycket aktuella data. Denna controller-data återspeglas också på GUI, och knapptryckningar är markerad i orange. Det gör cross-tråd data överföringar behövdes. Jag använde begreppet "delegates" för att tillåta trådar att "påverka" varandra. Du märker också ett antal "... shared_" variabler som används i flera trådar.
Denna del av koden har också en räknare som håller koll på controller "ramar". I samband med min kod avser ramarna när controller status har lästs. Räknare "samplecount" och "oldsamplecount" används så att långa knapptryckningar kan hanteras korrekt. Som ett exempel, har jag kopplat vissa digitala knappar så att ett tryck aktiverar en funktion, och nästa pressen deaktiverar funktionen. Om en lång tryckning inte är hanteras på rätt sätt, kommer att programmet växla funktionen på och av kontinuerligt. Koden kan hantera en lång tryckning som enda tryck genom att jämföra värdet av oldsamplecount mot samplecount. Om skillnaden mellan de två variablerna är för liten, visas det som en lång tryckning.