mirror of https://github.com/OpenIPC/wiki.git
182 lines
3.9 KiB
C++
182 lines
3.9 KiB
C++
// Program used to test the USB Joystick library when used as
|
|
// a Flight Controller on the Arduino Leonardo or Arduino
|
|
// Micro.
|
|
//
|
|
// Matthew Heironimus
|
|
// 2016-05-29 - Original Version
|
|
//------------------------------------------------------------
|
|
|
|
#include "Joystick.h"
|
|
|
|
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
|
|
JOYSTICK_TYPE_MULTI_AXIS, 32, 0,
|
|
true, true, false, false, false, false,
|
|
true, true, false, false, false);
|
|
|
|
// Set to true to test "Auto Send" mode or false to test "Manual Send" mode.
|
|
//const bool testAutoSendMode = true;
|
|
const bool testAutoSendMode = false;
|
|
|
|
const unsigned long gcCycleDelta = 1000;
|
|
const unsigned long gcAnalogDelta = 25;
|
|
const unsigned long gcButtonDelta = 500;
|
|
unsigned long gNextTime = 0;
|
|
unsigned int gCurrentStep = 0;
|
|
|
|
void testSingleButtonPush(unsigned int button)
|
|
{
|
|
if (button > 0)
|
|
{
|
|
Joystick.releaseButton(button - 1);
|
|
}
|
|
if (button < 32)
|
|
{
|
|
Joystick.pressButton(button);
|
|
}
|
|
}
|
|
|
|
void testMultiButtonPush(unsigned int currentStep)
|
|
{
|
|
for (int button = 0; button < 32; button++)
|
|
{
|
|
if ((currentStep == 0) || (currentStep == 2))
|
|
{
|
|
if ((button % 2) == 0)
|
|
{
|
|
Joystick.pressButton(button);
|
|
} else if (currentStep != 2)
|
|
{
|
|
Joystick.releaseButton(button);
|
|
}
|
|
} // if ((currentStep == 0) || (currentStep == 2))
|
|
if ((currentStep == 1) || (currentStep == 2))
|
|
{
|
|
if ((button % 2) != 0)
|
|
{
|
|
Joystick.pressButton(button);
|
|
} else if (currentStep != 2)
|
|
{
|
|
Joystick.releaseButton(button);
|
|
}
|
|
} // if ((currentStep == 1) || (currentStep == 2))
|
|
if (currentStep == 3)
|
|
{
|
|
Joystick.releaseButton(button);
|
|
} // if (currentStep == 3)
|
|
} // for (int button = 0; button < 32; button++)
|
|
}
|
|
|
|
void testXYAxis(unsigned int currentStep)
|
|
{
|
|
int xAxis;
|
|
int yAxis;
|
|
|
|
if (currentStep < 256)
|
|
{
|
|
xAxis = currentStep - 127;
|
|
yAxis = -127;
|
|
Joystick.setXAxis(xAxis);
|
|
Joystick.setYAxis(yAxis);
|
|
}
|
|
else if (currentStep < 512)
|
|
{
|
|
yAxis = currentStep - 256 - 127;
|
|
Joystick.setYAxis(yAxis);
|
|
}
|
|
else if (currentStep < 768)
|
|
{
|
|
xAxis = 128 - (currentStep - 512);
|
|
Joystick.setXAxis(xAxis);
|
|
}
|
|
else if (currentStep < 1024)
|
|
{
|
|
yAxis = 128 - (currentStep - 768);
|
|
Joystick.setYAxis(yAxis);
|
|
}
|
|
else if (currentStep < 1024 + 128)
|
|
{
|
|
xAxis = currentStep - 1024 - 127;
|
|
Joystick.setXAxis(xAxis);
|
|
Joystick.setYAxis(xAxis);
|
|
}
|
|
}
|
|
|
|
void testThrottleRudder(unsigned int value)
|
|
{
|
|
Joystick.setThrottle(value);
|
|
Joystick.setRudder(255 - value);
|
|
}
|
|
|
|
void setup() {
|
|
|
|
Joystick.setXAxisRange(-127, 127);
|
|
Joystick.setYAxisRange(-127, 127);
|
|
Joystick.setZAxisRange(-127, 127);
|
|
Joystick.setThrottleRange(0, 255);
|
|
Joystick.setRudderRange(0, 255);
|
|
|
|
if (testAutoSendMode)
|
|
{
|
|
Joystick.begin();
|
|
}
|
|
else
|
|
{
|
|
Joystick.begin(false);
|
|
}
|
|
|
|
pinMode(A0, INPUT_PULLUP);
|
|
pinMode(LED_BUILTIN, OUTPUT);
|
|
}
|
|
|
|
void loop() {
|
|
|
|
// System Disabled
|
|
if (digitalRead(A0) != 0)
|
|
{
|
|
// Turn indicator light off.
|
|
digitalWrite(LED_BUILTIN, 0);
|
|
return;
|
|
}
|
|
|
|
// Turn indicator light on.
|
|
digitalWrite(LED_BUILTIN, 1);
|
|
|
|
if (millis() >= gNextTime)
|
|
{
|
|
|
|
if (gCurrentStep < 33)
|
|
{
|
|
gNextTime = millis() + gcButtonDelta;
|
|
testSingleButtonPush(gCurrentStep);
|
|
}
|
|
else if (gCurrentStep < 37)
|
|
{
|
|
gNextTime = millis() + gcButtonDelta;
|
|
testMultiButtonPush(gCurrentStep - 33);
|
|
}
|
|
else if (gCurrentStep < (37 + 256))
|
|
{
|
|
gNextTime = millis() + gcAnalogDelta;
|
|
testThrottleRudder(gCurrentStep - 37);
|
|
}
|
|
else if (gCurrentStep < (37 + 256 + 1024 + 128))
|
|
{
|
|
gNextTime = millis() + gcAnalogDelta;
|
|
testXYAxis(gCurrentStep - (37 + 256));
|
|
}
|
|
|
|
if (testAutoSendMode == false)
|
|
{
|
|
Joystick.sendState();
|
|
}
|
|
|
|
gCurrentStep++;
|
|
if (gCurrentStep >= (37 + 256 + 1024 + 128))
|
|
{
|
|
gNextTime = millis() + gcCycleDelta;
|
|
gCurrentStep = 0;
|
|
}
|
|
}
|
|
}
|
|
|