#include <Bounce.h>
float map1 (float x, const float& x0, const float& x1, const float& y0, const float& y1)
{
if (x <= x0) return y0;
if (x >= x1) return y1;
float gradient = (y1 - y0) / (x1 - x0);
return y0 + (x - x0) * gradient;
}
const int potPin1 = A0; // Throttle 1 Lever
const int potPin2 = A1; // Throttle 2 Lever
const int potPinS = A2; // Spolier Lever
const int potPinF = A3; // Flaps Lever
const int potPinT = A4; // Trim Pot
const int parkSW = 4;
int revsolenoid;
int val;
int oldval = -1;
FlightSimFloat throttle1;
FlightSimFloat throttle2;
FlightSimFloat spoiler;
FlightSimFloat flapLever;
FlightSimFloat fuelCut1;
FlightSimFloat fuelCut2;
FlightSimFloat simpark;
FlightSimFloat asp;
FlightSimFloat elevTrim;
FlightSimFloat parkBrake; //Handle position
FlightSimFloat leftBrake;
FlightSimInteger reverse1;
FlightSimInteger reverse2;
FlightSimInteger wow;
FlightSimFloat supplyVolts;
Bounce spoilerArmSW = Bounce (5, 5);
void setup() {
Serial.begin(9600);
pinMode (12, OUTPUT); //Speed Brake Armed Light Relay 10
pinMode (6, OUTPUT); //Park Release Solenoid
pinMode (11, OUTPUT); //Park Brake Lamp
pinMode (10, OUTPUT); //Spoiler Lever motor
pinMode (9, OUTPUT); // Reverse Solenoid Lock out
pinMode (8, OUTPUT); //Trim Whl Mtr UP
pinMode (7, OUTPUT); // Trom Whl Mtr Down
pinMode (parkSW, INPUT_PULLUP);
pinMode (5, INPUT_PULLUP); //spoiler arm SW
pinMode (2, INPUT_PULLUP); //FuelCut1
pinMode (1, INPUT_PULLUP); //FuelCut2
pinMode (0, INPUT_PULLUP); //Stab Trim motor cutout
throttle1 = XPlaneRef("sim/cockpit2/engine/actuators/throttle_ratio[0]");
throttle2 = XPlaneRef("sim/cockpit2/engine/actuators/throttle_ratio[1]");
spoiler = XPlaneRef("sim/cockpit2/controls/speedbrake_ratio");
flapLever = XPlaneRef("sim/cockpit2/controls/flap_ratio");
reverse1 = XPlaneRef("sim/cockpit2/engine/actuators/prop_mode[0]");
reverse2 = XPlaneRef("sim/cockpit2/engine/actuators/prop_mode[1]");
wow = XPlaneRef("sim/flightmodel/failures/onground_any"); //weight on wheels sw
asp = XPlaneRef("sim/cockpit2/gauges/indicators/airspeed_kts_pilot");
elevTrim = XPlaneRef("sim/cockpit2/controls/elevator_trim");
parkBrake = XPlaneRef("FJS/732/FltControls/ParkBrakeHandle");
simpark = XPlaneRef("sim/cockpit2/controls/parking_brake_ratio");
fuelCut1 = XPlaneRef("sim/cockpit2/engine/actuators/mixture_ratio[0]");
fuelCut2 = XPlaneRef("sim/cockpit2/engine/actuators/mixture_ratio[1]");
leftBrake = XPlaneRef("sim/cockpit2/controls/left_brake_ratio");
supplyVolts = XPlaneRef("sim/cockpit2/electrical/bus_volts[0]");
}
void loop() {
FlightSim.update();
analogReadResolution(12);
bool canLight = (supplyVolts > 10.0) && FlightSim.isEnabled();
// float analog1 = analogRead(potPin1);
// throttle1 = map1(analog1, 440, 2050, 1.0, 0.0);
// float analog2 = analogRead(potPin2);
// throttle2 = map1(analog2, 480, 2098, 1.0, 0.0);
float analogrev = analogRead(potPin1);
if (analogrev > 2080) {
reverse1 = 3;
throttle1 = map1(analogrev, 2080, 3200, 0.0, 1.0);
}
else if (analogrev < 2080) {
reverse1 = 1;
throttle1 = map1(analogrev, 440, 2050, 1.0, 0.0);
}
float analogrev2 = analogRead(potPin2);
if (analogrev2 > 2110) {
reverse2 = 3;
throttle2 = map1(analogrev2, 2110, 3200, 0.0, 1.0);
}
else if (analogrev2 < 2110) {
reverse2 = 1;
throttle2 = map1(analogrev2, 480, 2098, 1.0, 0.0);
}
//Read Spoiler Lever Position Armed position = -0.500
float analogS = analogRead(potPinS);
spoiler = map1(analogS, 850, 3120, 0.0, 1.0);
//Read Trim Potsition
// float analogT = analogRead(potPinT);
// elevTrim = map1(analogT, 300, 1353, -0.2, 0.32);
// Serial.println(analogT);
// Serial.println(elevTrim);
//Trim Wheel Motor commands
val = elevTrim * 100;
if ((val != oldval && canLight) && (digitalRead(0) == HIGH)) {
if (val > oldval) {
digitalWrite(7, LOW);
} if (val < oldval) {
digitalWrite(8, LOW);
}
}
else {
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
delay(300);
oldval = val;
//Read Flap Lever position
float analogF = analogRead(potPinF);
if (analogF < 100) {
flapLever = 0.0;
}
if (analogF >= 150 && analogF <= 300) {
flapLever = 0.125;
}
if (analogF >= 630 && analogF <= 700) {
flapLever = 0.250;
}
if (analogF >= 780 && analogF <= 920) {
flapLever = 0.375;
}
if (analogF >= 1140 && analogF <= 1200) {
flapLever = 0.500;
}
if (analogF >= 1300 && analogF <= 1450) {
flapLever = 0.625;
}
if (analogF >= 1550 && analogF <= 1680) {
flapLever = 0.750;
}
if (analogF >= 1880 && analogF <= 2180) {
flapLever = 0.875;
}
if (analogF >= 2290 && analogF <= 2700) {
flapLever = 1.0;
}
if (asp > 40 && wow == 1 && flapLever > .700)
{
digitalWrite(9, LOW);
}
else
{
digitalWrite(9, HIGH);
}
if (digitalRead(4) == LOW) {
parkBrake = 1.0;
simpark = 1.0;
digitalWrite(11, LOW);
}
else {
parkBrake = 0.0;
simpark = 0.0;
digitalWrite(11, HIGH);
}
// Spoiler Lever auto deploy Logic
if (digitalRead(5) == LOW && spoiler < 0.8 && wow == 1 && flapLever > .700) {
digitalWrite(10, LOW);
}
else {
if (spoiler > 0.9);
digitalWrite(10, HIGH);
}
if (digitalRead(5) == LOW && spoiler < 0.8 && wow == 0 && flapLever > 0.100) {
digitalWrite(12, LOW);
}
else {
digitalWrite(12, HIGH);
}
if (digitalRead(1) == LOW) {
fuelCut2 = 0.0;
}
else {
fuelCut2 = 1.0;
}
if (digitalRead(2) == LOW) {
fuelCut1 = 0.0;
}
else {
fuelCut1 = 1.0;
}
// activate park brake release solenoid
if (leftBrake > 0.7 && parkBrake > 0.7) {
digitalWrite(6, LOW);
}
else {
digitalWrite(6, HIGH);
}
}