// ***************************************************************************** // * Config_SIOC ver 4.3 - By Manuel Velez - www.opencockpits.com // ***************************************************************************** // * FileName : A_TQ_2-11-20.txt // * Date last modified: 02-11-20 Mod: A // * Reason: Change to IDX assignments // ***************************************************************************** // * Original SIOC Code By Fred Kurasiewicz Version 2.53 10/15/2017 // * Revised SIOC Code by Mike Sherick Version 1.0 04/21/2020 // ***************************************************************************** // * IDX = DCMotorsPlusCard - Device=84 // * IDX = IOCard-USBServos - Device=56 // ***************************************************************************** // ** NOTE: Be sure to change the SIOC.ini file Config to reflect the file name! // ***************************************************************************** Var 0000, name Initialization, Value 0 // Initialization values { &lever1_max = 225 &lever1_idle = 90 &rev1_min = 70 // &lever1_idle - 15 &rev1_max = 12 &lever2_max = 214 &lever2_idle = 80 &rev2_min = 70 // &lever2_idle - 15 &rev2_max = 4 &dead_range1 = 6 &Lever1_Speed = 40 &dead_range2 = 6 &Lever2_Speed = 40 &SpdServo_Up = 700 &SpdServo_Down = 175 &TrimServo = 0 &SpdBrkServo = 0 } Var 0001, name Pause, Link FSUIPC_IN, Offset $0262, Length 2 // Is Pause mode active? { IF &Pause = 1 { &Motor1 = 0 &Motor2 = 0 } } Var 0002, name ATengage, Link FSUIPC_IN, Offset $53E4, Length 1 // Is A/T active? (SA Thrust_Ref_Mode) { IF &ATengage = 0 // Thrust Ref Mode Manual { &Motor1 = 0 &Motor2 = 0 } } Var 0004, name IAS_FS, Link FSUIPC_IN, Offset $02BC, Length 4 { &IAS = &IAS_FS / 128 } Var 0005, name IAS // Indicated air speed Var 0006, name SimA, Link FSUIPC_INOUT, Offset $53DB, Length 2 // Sim-A Multifunction Offset Var 0007, name FS_PBrake, Link FSUIPC_OUT, offset $5418, Length 1 // Parking Brake Var 0010, name lever1_max // Max pot value Var 0011, name lever1_idle // Idle pot value Var 0012, name rev1_min // Minimum reverse pot value Var 0013, name rev1_max // Maximum reverse pot value Var 0014, name SpdServo_Up // Speed brake servo value full up Var 0015, name SpdServo_Down // Speed brake servo value down Var 0016, name lever1_FS_cf // Pot value to FS value conversion factor Var 0017, name rev1_FS_cf // Pot value to FS value conversion factor Var 0018, name lever1_pot, Link IOCARD_ANALOGIC, Device 84, Input 6, PosL 0, PosC 128, PosR 255 // Pot value of lever1 position { IF &ATengage = 0 { IF &SpdBrk_UP = 0 { IF &IAS > 65 { IF &lever1_pot < &rev1_min // If reverse thrust is applied { &SpdBrkServo = &SpdServo_Up &SpdBrkServo = DELAY 0 ,200 // Deploy speed brake to full up &SpdBrk_UP = 1 &SpdBrkFS = 16383 } } } IF &SpdBrk_UP = 1 { IF &IAS < 25 { L0 = &lever1_idle + 5 IF &lever1_pot > L0 // If forward thrust is applied { &SpdBrkServo = &SpdServo_Down // Return speed brake lever to down &SpdBrkServo = DELAY 0 ,200 } } } IF &lever1_pot >= &lever1_idle { L0 = &lever1_max - &lever1_idle L1 = 16383 / L0 L1 = TRUNC L1 &lever1_FS_cf = L1 L0 = &lever1_pot - &lever1_idle L1 = L0 * &lever1_FS_cf L1 = TRUNC L1 &lever1_to_FS = L1 } IF &lever1_pot <= &rev1_min { L0 = &rev1_max - &rev1_min L1 = 4096 / L0 L1 = TRUNC L1 &rev1_FS_cf = L1 L0 = &lever1_pot - &rev1_min L1 = L0 * &rev1_FS_cf L1 = TRUNC L1 L1 = L1 * -1 &lever1_to_FS = L1 } } } Var 0019, name lever1_to_FS, Link FSUIPC_OUT, Offset $52FA, Length 2 // Send corrected value of Lever1 to FS Var 0021, name lever2_max // Max pot value Var 0022, name lever2_idle // Idle pot value Var 0023, name rev2_min // Minimum reverse pot value Var 0024, name rev2_max // Maximum reverse pot value Var 0025, name lever2_FS_cf // Pot value to FS value conversion factor Var 0026, name rev2_FS_cf // Pot value to FS value conversion factor Var 0027, name lever2_pot, Link IOCARD_ANALOGIC, Device 84, Input 5, PosL 0, PosC 128, PosR 255 // Pot value of lever2 position { IF &ATengage = 0 { IF &lever2_pot >= &lever2_idle { L0 = &lever2_max - &lever2_idle L1 = 16383 / L0 L1 = TRUNC L1 &lever2_FS_cf = L1 L0 = &lever2_pot - &lever2_idle L1 = L0 * &lever2_FS_cf L1 = TRUNC L1 &lever2_to_FS = L1 } IF &lever2_pot <= &rev2_min { L0 = &rev2_max - &rev2_min L1 = 4096 / L0 L1 = TRUNC L1 &rev2_FS_cf = L1 L0 = &lever2_pot - &rev2_min L1 = L0 * &rev2_FS_cf L1 = TRUNC L1 L1 = L1 * -1 &lever2_to_FS = L1 } } } Var 0028, name lever2_to_FS, Link FSUIPC_OUT, Offset $52FC, Length 2 // Send corrected value of Lever2 to FS Var 0029, name Engine1_N1, Link FSUIPC_IN, Offset $0898, Length 2 // Engine 1, N1 Value Var 0030, name FS_mot1_cf // FS value to pot value conversion factor Var 0031, name lever1_target, Link FSUIPC_IN, Offset $53E0, Length 2 // Get lever1 target position value from FS { L0 = &Engine1_N1 IF L0 < 6200 // If N1 FSUIPC value at or near engine idle, forces Motor 1 Off { &Motor1 = 0 } ELSE { IF &ATengage <> 0 // When autothrottle is active { L0 = &lever1_max - &lever1_idle L1 = 16383 / L0 L1 = TRUNC L1 &FS_mot1_cf = L1 // FS units per pot unit L0 = &lever1_pot - &lever1_idle L1 = L0 * &FS_mot1_cf L1 = L1 / 100 L2 = &Engine1_N1 / 100 L0 = L1 - L2 &lever1_diff = TRUNC L0 // lever1 position difference versus target CALL &motor_lever1 // Subroutine for Motor1 motion } } } Var 0032, name lever1_diff // Difference of where Lever1 is versus where it should be Var 0033, name dead_range1 Var 0035, name Lever1_Speed Var 0037, name motor_lever1, Link SUBRUTINE // Motor1 motion SubRoutine { IF &Pause = 0 { L0 = &lever1_diff L1 = 0 IF L0 < 0 { L1 = 128 // Reverses direction } L2 = &Lever1_Speed + L1 L0 = ABS L0 IF L0 <= &dead_range1 { L2 = 0 } &Motor1 = L2 } } Var 0038, name Motor1, Link IOCARD_MOTOR, Device 84, Output 2, Aceleration 0 Var 0039, name Engine2_N1, Link FSUIPC_IN, Offset $0930, Length 2 // Engine 2, N1 FSUIPC Value Var 0040, name FS_mot2_cf // FS value to pot value conversion factor Var 0041, name lever2_target, Link FSUIPC_IN, Offset $53E2, Length 2 // Get lever2 target position value from FS { L0 = &Engine2_N1 IF L0 < 6200 // If N1 FSUIPC value at or near engine idle, forces Motor 1 Off { &Motor2 = 0 } ELSE { IF &ATengage <> 0 // When autothrottle is active { L0 = &lever2_max - &lever2_idle L1 = 16383 / L0 L1 = TRUNC L1 &FS_mot2_cf = L1 // FS units per pot unit L0 = &lever2_pot - &lever2_idle L1 = L0 * &FS_mot2_cf L1 = L1 / 100 L2 = &Engine2_N1 / 100 L0 = L1 - L2 &lever2_diff = TRUNC L0 // lever1 position difference versus target CALL &motor_lever2 // Subroutine for Motor2 motion } } } Var 0042, name lever2_diff // Difference of where Lever2 is versus where it should be Var 0043, name dead_range2 Var 0045, name Lever2_Speed Var 0047, name motor_lever2, Link SUBRUTINE // Motor2 motion { IF &Pause = 0 { L0 = &lever2_diff L1 = 0 IF L0 < 0 { L1 = 128 // Reverses direction } L2 = &Lever2_Speed + L1 L0 = ABS L0 IF L0 <= &dead_range2 { L2 = 0 } &Motor2 = L2 } } Var 0048, name Motor2, Link IOCARD_MOTOR, Device 84, Output 3, Aceleration 0 Var 0050, name acongnd, Link FSUIPC_INOUT, Offset $0366, Length 2 // Is aircraft on ground? { IF &acongnd = 1 { IF &SpdBrkFSArm = 1 { &SpdBrkServo = &SpdServo_Up // Spoiler lever full up &SpdBrkServo = DELAY 0 ,200 &SpdBrk_UP = 1 } } } Var 0051, name SpdBrk_UP // Speed brake up flag Var 0052, name SpdBrkFS, Link FSUIPC_INOUT, Offset $0BD0, Length 4 // FS speed brake value Var 0053, name SpdBrkFSArm, Link FSUIPC_INOUT, Offset $0BCC, Length 4 // Is spoiler armed? Var 0054, name SpdBrkPot, Link IOCARD_ANALOGIC, Device 84, Input 8, PosL 0, PosC 128, PosR 255 { IF &SpdBrkPot > 64 // Greater than "armed" range { &SpdBrk_UP = 1 // Speed brake is deployed } IF &SpdBrkPot < 20 { &SpdBrkFS = 0 &SpdBrk_UP = 0 } IF &SpdBrkPot >= 20 { IF &SpdBrkPot <= 64 { &SpdBrkFS = 4800 // Speed brake armed } ELSE { L0 = &SpdBrkPot * 65 // Cfactor 65 yields FSUIPC 16250 @ pot 250; and 5655 @ pot 87 IF L0 > 5620 { &SpdBrkFS = L0 } } } } Var 0055, name SpdBrkServo, Link USB_Servos, Device 56, Output 1, PosL 0, PosC 512, PosR 1023 Var 0060, name TrimVal_CS // FS trim value converted to trim servo sc Var 0061, name TrimDelay // Fs trim value x seconds prior Var 0062, name TrimDiff // Magnitude of trim change Var 0063, name TrimVal_FS, Link FSUIPC_IN, Offset $0BC0, Length 2 // Get FS trim gauge target value { IF &TrimVal_FS > 33000 { L0 = 81918 - &TrimVal_FS } ELSE { L0 = 16383 - &TrimVal_FS } &TrimVal_CS = L0 // FS value corrected to continuous scale L1 = &TrimVal_CS / 25 L1 = L1 + 70 // FS trim value corrected to servo scale L1 = TRUNC L1 &TrimServo = L1 &TrimDelay = DELAY &TrimVal_CS ,175 &TrimDiff = &TrimVal_CS - &TrimDelay CALL &TrimMotion } Var 0064, name TrimServo, Link USB_Servos, Device 56, Output 2, PosL 0, PosC 512, PosR 1023 Var 0065, name TrimMotion, Link SUBRUTINE // Subroutine for trim motion { L0 = &TrimDiff L1 = 0 IF L0 < 0 { L1 = 128 } L2 = 120 + L1 L0 = ABS L0 IF L0 <= 500 // Intermediate zone { L2 = 75 + L1 // Intermediate speed } IF L0 <= 23 // Near Zone { L2 = 25 + L1 // Slow speed } IF L0 <= 18 // Dead Zone { L2 = 0 // Motor off } &TrimMotor = L2 &TrimMotor = DELAY 0 ,150 } Var 0066, name TrimMotor, Link IOCARD_MOTOR, Device 84, Output 1, Aceleration 0 Var 0068, name PrkBrkLight, Link IOCARD_OUT, Device 84, Output 0 Var 0070, name FuelCut1, Link IOCARD_SW, Device 84, Input 1 { IF &FuelCut1 = 1 { &SimA = 843 // On } ELSE { &SimA = 842 // Off } } Var 0071, name FuelCut2, Link IOCARD_SW, Device 84, Input 2 { IF &FuelCut2 = 1 { &SimA = 845 // On } ELSE { &SimA = 844 // Off } } Var 0072, name P_Brake, Link IOCARD_SW, Device 84, Input 0 { IF &P_Brake = 1 { &FS_PBrake = 1 // On &PrkBrkLight = 1 // Parking Brake Light "ON" } ELSE { &FS_PBrake = 0 // Off &PrkBrkLight = 0 // Parking Brake Light "OFF" } } Var 0073, name TOGA_btn, Link IOCARD_SW, Device 84, Input 4 { IF &TOGA_btn = 1 { &SimA = 567 } } Var 0084, name AT_Discon_btn, Link IOCARD_SW, Device 84, Input 5 { IF &AT_Discon_btn = 1 { &SimA = 563 // was 584 } } Var 0075, name Flaps, Link FSUIPC_Out, Offset $0BDC, Length 4 // Flaps control Var 0076, name FlapsPot, Link IOCARD_ANALOGIC, Device 84, Input 7, PosL 0, PosC 128, PosR 255 { IF &FlapsPot <= 50 { &Flaps = 0 // Flaps 0 } IF &FlapsPot > 50 { IF &FlapsPot <= 85 { &Flaps = 2047 // Flaps 1 } } IF &FlapsPot > 85 { IF &FlapsPot <= 110 { &Flaps = 4095 // Flaps 2 } } IF &FlapsPot > 110 { IF &FlapsPot <= 130 { &Flaps = 6143 // Flaps 5 } } IF &FlapsPot > 130 { IF &FlapsPot <= 150 { &Flaps = 8191 // Flaps 10 } } IF &FlapsPot > 150 { IF &FlapsPot <= 170 { &Flaps = 10239 // Flaps 15 } } IF &FlapsPot > 170 { IF &FlapsPot <= 190 { &Flaps = 12287 // Flaps 25 } } IF &FlapsPot > 190 { IF &FlapsPot <= 225 { &Flaps = 14335 // Flaps 30 } } IF &FlapsPot > 225 { &Flaps = 16383 // Flaps 40 } } Var 0077, name Horn_Cutout, Link IOCARD_SW, Device 84, Input 3 { IF &Horn_Cutout = 1 // Switch when "On" disengages throttle motors { &Motor1 = 0 &Motor2 = 0 } }