-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathE1_arm.lua
108 lines (98 loc) · 3.58 KB
/
E1_arm.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
-- custom arming routine for Align helicopters - version 1.0
-- constants
local AUX_FUNCTION_MOTOR_INTERLOCK = 32
local AUX_HIGH = 2
local AUX_LOW = 0
local STATES = { WAIT_INTERLOCK_LOW = 0,
WAIT_INTERLOCK_HIGH = 1,
WAIT_THROTTLE_LOW = 2,
WAIT_THROTTLE_LOW_TIMEOUT = 3,
ARM = 4,
ARMED_ON = 5,
ARMED_OFF = 6 }
-- global variables
local state = STATES.WAIT_INTERLOCK_LOW
local time_ms = uint32_t(0)
function update()
if state == STATES.WAIT_INTERLOCK_LOW then
if rc:get_pwm(3) < 950 then
-- rc not ready
return update, 100
end
-- need motor interlock low after boot
if rc:get_aux_cached(AUX_FUNCTION_MOTOR_INTERLOCK) == AUX_LOW then
state = STATES.WAIT_INTERLOCK_HIGH
end
elseif state == STATES.WAIT_INTERLOCK_HIGH then
-- need motor interlock high before arming routine
if rc:get_aux_cached(AUX_FUNCTION_MOTOR_INTERLOCK) == AUX_HIGH then
time_ms = millis()
state = STATES.WAIT_THROTTLE_LOW
end
elseif state == STATES.WAIT_THROTTLE_LOW then
if rc:get_aux_cached(AUX_FUNCTION_MOTOR_INTERLOCK) == AUX_LOW then
-- user turned off motor
state = STATES.WAIT_INTERLOCK_HIGH
end
if rc:get_pwm(3) > 950 and rc:get_pwm(3) < 1150 then
state = STATES.WAIT_THROTTLE_LOW_TIMEOUT
time_ms = millis()
end
if millis() - time_ms > 10000 then
-- timeout after 10 seconds
state = STATES.WAIT_INTERLOCK_LOW
end
elseif state == STATES.WAIT_THROTTLE_LOW_TIMEOUT then
if rc:get_aux_cached(AUX_FUNCTION_MOTOR_INTERLOCK) == AUX_LOW then
-- user turned off motor
state = STATES.WAIT_INTERLOCK_HIGH
end
if rc:get_pwm(3) > 1150 then
state = STATES.WAIT_THROTTLE_LOW
end
if millis() - time_ms > 2000 then
rc:run_aux_function(AUX_FUNCTION_MOTOR_INTERLOCK, AUX_LOW)
state = STATES.ARM
end
elseif state == STATES.ARM then
if arming:arm() then
-- motor interlock ON
rc:run_aux_function(AUX_FUNCTION_MOTOR_INTERLOCK, AUX_HIGH)
state = STATES.ARMED_ON
else
-- arm fail, go back to wait interlock low
state = STATES.WAIT_INTERLOCK_LOW
end
elseif state == STATES.ARMED_ON then
if not arming:is_armed() then
state = STATES.WAIT_INTERLOCK_LOW
end
if rc:get_aux_cached(AUX_FUNCTION_MOTOR_INTERLOCK) == AUX_LOW then
-- user turned off motor
time_ms = millis()
state = STATES.ARMED_OFF
end
elseif state == STATES.ARMED_OFF then
if not arming:is_armed() then
state = STATES.WAIT_INTERLOCK_LOW
end
if rc:get_aux_cached(AUX_FUNCTION_MOTOR_INTERLOCK) == AUX_HIGH then
-- user turned on motor
state = STATES.ARMED_ON
end
if millis() - time_ms > 10000 then
-- try disarm after 10 seconds if vehicle is not flying
-- if disarm fails wait 10 more seconds before trying again
if not vehicle:get_likely_flying() then
time_ms = millis()
if arming:disarm() then
state = STATES.WAIT_INTERLOCK_LOW
end
end
end
end
gcs:send_named_float("arm", state)
return update, 100
end
gcs:send_text('6', "E1_arm.lua is running")
return update, 100