diff --git a/ArduCopter/ArduCopter.pde b/ArduCopter/ArduCopter.pde
index 3784c00eaa..512ca5bd8a 100644
--- a/ArduCopter/ArduCopter.pde
+++ b/ArduCopter/ArduCopter.pde
@@ -1171,7 +1171,7 @@ static void read_AHRS(void)
{
// Perform IMU calculations and get attitude info
//-----------------------------------------------
- #if HIL_MODE == HIL_MODE_SENSORS
+ #if HIL_MODE != HIL_MODE_DISABLED
// update hil before dcm update
gcs_update();
#endif
diff --git a/Tools/autotest/arducopter.py b/Tools/autotest/arducopter.py
index 155bfdb991..355c9e1075 100644
--- a/Tools/autotest/arducopter.py
+++ b/Tools/autotest/arducopter.py
@@ -91,6 +91,7 @@ def arm_motors(mavproxy):
mavproxy.expect('APM: ARMING MOTORS')
mavproxy.send('rc 4 1500\n')
print("MOTORS ARMED OK")
+ return True
def disarm_motors(mavproxy):
'''disarm motors'''
@@ -101,6 +102,7 @@ def disarm_motors(mavproxy):
mavproxy.expect('APM: DISARMING MOTORS')
mavproxy.send('rc 4 1500\n')
print("MOTORS DISARMED OK")
+ return True
def takeoff(mavproxy, mav):
@@ -110,6 +112,7 @@ def takeoff(mavproxy, mav):
mavproxy.send('rc 3 1500\n')
wait_altitude(mav, 30, 40)
print("TAKEOFF COMPLETE")
+ return True
def loiter(mavproxy, mav, maxaltchange=10, holdtime=10, timeout=60):
@@ -162,16 +165,18 @@ def wait_distance(mav, distance, accuracy=5, timeout=30):
return False
-def wait_location(mav, loc, accuracy=5, timeout=30, height_accuracy=-1):
+def wait_location(mav, loc, accuracy=5, timeout=30, target_altitude=None, height_accuracy=-1):
'''wait for arrival at a location'''
tstart = time.time()
+ if target_altitude is None:
+ target_altitude = loc.alt
while time.time() < tstart + timeout:
m = mav.recv_match(type='GPS_RAW', blocking=True)
pos = current_location(mav)
delta = get_distance(loc, pos)
print("Distance %.2f meters" % delta)
if delta <= accuracy:
- if height_accuracy != -1 and math.fabs(pos.alt - loc.alt) > height_accuracy:
+ if height_accuracy != -1 and math.fabs(pos.alt - target_altitude) > height_accuracy:
continue
print("Reached location (%.2f meters)" % delta)
return True
@@ -184,6 +189,7 @@ def fly_square(mavproxy, mav, side=50, timeout=120):
mavproxy.send('switch 6\n')
mavproxy.expect('STABILIZE>')
tstart = time.time()
+ failed = False
mavproxy.send('rc 3 1430\n')
mavproxy.send('rc 4 1610\n')
if not wait_heading(mav, 0):
@@ -192,24 +198,28 @@ def fly_square(mavproxy, mav, side=50, timeout=120):
print("Going north %u meters" % side)
mavproxy.send('rc 2 1390\n')
- ok = wait_distance(mav, side)
+ if not wait_distance(mav, side):
+ failed = True
mavproxy.send('rc 2 1500\n')
print("Going east %u meters" % side)
mavproxy.send('rc 1 1610\n')
- ok = wait_distance(mav, side)
+ if not wait_distance(mav, side):
+ failed = True
mavproxy.send('rc 1 1500\n')
print("Going south %u meters" % side)
mavproxy.send('rc 2 1610\n')
- ok = wait_distance(mav, side)
+ if not wait_distance(mav, side):
+ failed = True
mavproxy.send('rc 2 1500\n')
print("Going west %u meters" % side)
mavproxy.send('rc 1 1390\n')
- ok = wait_distance(mav, side)
+ if not wait_distance(mav, side):
+ failed = True
mavproxy.send('rc 1 1500\n')
- return ok
+ return not failed
@@ -238,7 +248,7 @@ def land(mavproxy, mav, timeout=60):
return False
-def fly_mission(mavproxy, mav, filename, height_accuracy=-1):
+def fly_mission(mavproxy, mav, filename, height_accuracy=-1, target_altitude=None):
'''fly a mission from a file'''
global homeloc
mavproxy.send('wp load %s\n' % filename)
@@ -247,8 +257,11 @@ def fly_mission(mavproxy, mav, filename, height_accuracy=-1):
mavproxy.expect('Requesting [0-9]+ waypoints')
mavproxy.send('switch 1\n') # auto mode
mavproxy.expect('AUTO>')
- wait_distance(mav, 30, timeout=120)
- wait_location(mav, homeloc, timeout=600, height_accuracy=height_accuracy)
+ if not wait_distance(mav, 30, timeout=120):
+ return False
+ if not wait_location(mav, homeloc, timeout=600, target_altitude=target_altitude, height_accuracy=height_accuracy):
+ return False
+ return True
def setup_rc(mavproxy):
@@ -301,7 +314,7 @@ def fly_ArduCopter():
util.expect_setup_callback(mavproxy, expect_callback)
# start hil_quad.py
- hquad = pexpect.spawn(util.reltopdir('../HILTest/hil_quad.py') + ' --fgout=192.168.2.15:9123 --home=%s' % HOME_LOCATION,
+ hquad = pexpect.spawn(util.reltopdir('../HILTest/hil_quad.py') + ' --fgout=192.168.2.15:9123 --fgrate=200 --home=%s' % HOME_LOCATION,
logfile=sys.stdout, timeout=10)
util.pexpect_autoclose(hquad)
hquad.expect('Starting at')
@@ -322,15 +335,23 @@ def fly_ArduCopter():
mav.recv_match(type='GPS_RAW', blocking=True)
setup_rc(mavproxy)
homeloc = current_location(mav)
- arm_motors(mavproxy)
- takeoff(mavproxy, mav)
- fly_square(mavproxy, mav)
- loiter(mavproxy, mav)
- land(mavproxy, mav)
+ if not arm_motors(mavproxy):
+ failed = True
+ if not takeoff(mavproxy, mav):
+ failed = True
+ if not fly_square(mavproxy, mav):
+ failed = True
+ if not loiter(mavproxy, mav):
+ failed = True
+ if not land(mavproxy, mav):
+ failed = True
#fly_mission(mavproxy, mav, os.path.join(testdir, "mission_ttt.txt"), height_accuracy=0.2)
- fly_mission(mavproxy, mav, os.path.join(testdir, "mission1.txt"), height_accuracy = 0.2)
- land(mavproxy, mav)
- disarm_motors(mavproxy)
+ if not fly_mission(mavproxy, mav, os.path.join(testdir, "mission1.txt"), height_accuracy = 0.5, target_altitude=10):
+ failed = True
+ if not land(mavproxy, mav):
+ failed = True
+ if not disarm_motors(mavproxy):
+ failed = True
except pexpect.TIMEOUT, e:
failed = True
diff --git a/Tools/autotest/autotest.py b/Tools/autotest/autotest.py
index d0acc02ada..3f834ebdb1 100755
--- a/Tools/autotest/autotest.py
+++ b/Tools/autotest/autotest.py
@@ -222,16 +222,16 @@ def run_tests(steps):
print(">>>> FAILED STEP: %s at %s" % (step, time.asctime()))
passed = False
failed.append(step)
- results.add(step, "FAILED", time.time() - t1)
+ results.add(step, 'FAILED', time.time() - t1)
continue
except Exception, msg:
passed = False
failed.append(step)
print(">>>> FAILED STEP: %s at %s (%s)" % (step, time.asctime(), msg))
traceback.print_exc(file=sys.stdout)
- results.add(step, "FAILED", time.time() - t1)
+ results.add(step, 'FAILED', time.time() - t1)
pass
- results.add(step, "PASSED", time.time() - t1)
+ results.add(step, 'PASSED', time.time() - t1)
print(">>>> PASSED STEP: %s at %s" % (step, time.asctime()))
if not passed:
print("FAILED %u tests: %s" % (len(failed), failed))
@@ -244,9 +244,11 @@ def run_tests(steps):
results.addfile('ArduPlane build log', 'ArduPlane.txt')
results.addfile('ArduPlane code size', 'ArduPlane.sizes.txt')
results.addfile('ArduPlane stack sizes', 'ArduPlane.framesizes.txt')
+ results.addfile('ArduPlane defaults', 'ArduPlane.defaults.txt')
results.addfile('ArduCopter build log', 'ArduCopter.txt')
results.addfile('ArduCopter code size', 'ArduCopter.sizes.txt')
results.addfile('ArduCopter stack sizes', 'ArduCopter.framesizes.txt')
+ results.addfile('ArduCopter defaults', 'ArduCopter.defaults.txt')
write_webresults(results)
diff --git a/Tools/autotest/util.py b/Tools/autotest/util.py
index df721ae68e..e9e4ff99d6 100644
--- a/Tools/autotest/util.py
+++ b/Tools/autotest/util.py
@@ -106,11 +106,12 @@ def start_SIL(atype, valgrind=False, wipe=False, CLI=False):
return ret
def start_MAVProxy_SIL(atype, aircraft=None, setup=False, master='tcp:127.0.0.1:5760',
+ fgrate=200,
options=None, logfile=sys.stdout):
'''launch mavproxy connected to a SIL instance'''
global close_list
MAVPROXY = reltopdir('../MAVProxy/mavproxy.py')
- cmd = MAVPROXY + ' --master=%s' % master
+ cmd = MAVPROXY + ' --master=%s --fgrate=%u' % (master, fgrate)
if setup:
cmd += ' --setup'
if aircraft is None:
diff --git a/Tools/autotest/web/css/main.css b/Tools/autotest/web/css/main.css
index 4cb4f2a53f..a9f5f3c735 100644
--- a/Tools/autotest/web/css/main.css
+++ b/Tools/autotest/web/css/main.css
@@ -1,124 +1,132 @@
-@charset "utf-8";
-/* CSS Document */
-
-/* Background-Styles */
-html {
- overflow-y: scroll;
- }
-
-body {
- font-family:Helvetica;
- margin:0px;
- padding:0px;
- background-color: #fff;
- background-image: url(images/bg.png);
-}
-
-#logo {
- background-image:url(images/logo.png);
- background-repeat:no-repeat;
- height: 120px;
- width: 420px;
- -moz-box-shadow: 2px 2px 5px #888;
- -webkit-box-shadow: 2px 2px 5px #888;
- box-shadow: 2px 2px 5px #888;
- background-color: #000;
-}
-
-h2 {
- text-shadow: #ccc 0px 1px 0px;
- text-decoration:none;
- color:#D14836;
- padding-top: 0px;
- padding-right: 5px;
- padding-bottom: 5px;
- padding-left: 5px;
-}
-
-#git {
- background-color: #FFF;
- font-size: 15px;
- display: auto;
- padding: 10px;
- border: 1px solid #CCC;
- position: relative;
- -moz-box-shadow: 2px 2px 5px #888;
- -webkit-box-shadow: 2px 2px 5px #888;
- box-shadow: 2px 2px 5px #888;
-}
-
-#git a {
- color:#00F;
- font-weight: normal;
- }
-
-#git a:hover {
- color:#D14836;
-}
-
-
-#main {
- padding-top:0px;
- min-width: 420px;
- margin-top: 0;
- margin-right: auto;
- margin-bottom: 0;
- margin-left: auto;
- padding-right: 20px;
- padding-bottom: 50px;
- padding-left: 20px;
-}
-
-ul#testresults {
- background-color: #FFF;
- display: block;
- padding: 10px;
- border: 1px solid #CCC;
- list-style-type: none;
- position: relative;
- -moz-box-shadow: 2px 2px 5px #888;
- -webkit-box-shadow: 2px 2px 5px #888;
- box-shadow: 2px 2px 5px #888;
-}
-
-ul#testresults li {
- list-style-type: none;
- display: block;
- background-color: #eef1f1;
- margin: 5px;
- padding: 5px;
- }
-
-ul#testlogs {
- background-color: #FFF;
- display: block;
- padding: 10px;
- border: 1px solid #CCC;
- list-style-type: none;
- position: relative;
- -moz-box-shadow: 2px 2px 5px #888;
- -webkit-box-shadow: 2px 2px 5px #888;
- box-shadow: 2px 2px 5px #888;
-}
-
-ul#testlogs li {
- text-decoration:none;
- list-style-type: none;
- display: block;
- background-color: #eef1f1;
- margin: 5px;
- padding: 5px;
- font-size: 15px;
- }
-
-
-ul#testlogs li a {
- text-decoration:none;
- color:#8aa19c;
- font-weight: bold;
- font-size: 12px;
- }
-
-ul#testlogs li a:hover {
- color:#D14836;
-}
+@charset "utf-8";
+/* CSS Document */
+
+/* Background-Styles */
+html {
+ overflow-y: scroll;
+ }
+
+body {
+ font-family:Helvetica;
+ margin:0px;
+ padding:0px;
+ background-color: #fff;
+ background-image: url(images/bg.png);
+}
+
+#logo {
+ background-image:url(images/logo.png);
+ background-repeat:no-repeat;
+ height: 120px;
+ width: 420px;
+ -moz-box-shadow: 2px 2px 5px #888;
+ -webkit-box-shadow: 2px 2px 5px #888;
+ box-shadow: 2px 2px 5px #888;
+ background-color: #000;
+}
+
+h2 {
+ text-shadow: #ccc 0px 1px 0px;
+ text-decoration:none;
+ color:#D14836;
+ padding-top: 0px;
+ padding-right: 5px;
+ padding-bottom: 5px;
+ padding-left: 5px;
+}
+
+#git {
+ background-color: #FFF;
+ font-size: 15px;
+ display: auto;
+ padding: 10px;
+ border: 1px solid #CCC;
+ position: relative;
+ -moz-box-shadow: 2px 2px 5px #888;
+ -webkit-box-shadow: 2px 2px 5px #888;
+ box-shadow: 2px 2px 5px #888;
+}
+
+#git a {
+ color:#00F;
+ font-weight: normal;
+ }
+
+#git a:hover {
+ color:#D14836;
+}
+
+.passed-text {
+ color:green;
+}
+
+.failed-text {
+ color:red;
+}
+
+
+#main {
+ padding-top:0px;
+ min-width: 420px;
+ margin-top: 0;
+ margin-right: auto;
+ margin-bottom: 0;
+ margin-left: auto;
+ padding-right: 20px;
+ padding-bottom: 50px;
+ padding-left: 20px;
+}
+
+ul#testresults {
+ background-color: #FFF;
+ display: block;
+ padding: 10px;
+ border: 1px solid #CCC;
+ list-style-type: none;
+ position: relative;
+ -moz-box-shadow: 2px 2px 5px #888;
+ -webkit-box-shadow: 2px 2px 5px #888;
+ box-shadow: 2px 2px 5px #888;
+}
+
+ul#testresults li {
+ list-style-type: none;
+ display: block;
+ background-color: #eef1f1;
+ margin: 5px;
+ padding: 5px;
+ }
+
+ul#testlogs {
+ background-color: #FFF;
+ display: block;
+ padding: 10px;
+ border: 1px solid #CCC;
+ list-style-type: none;
+ position: relative;
+ -moz-box-shadow: 2px 2px 5px #888;
+ -webkit-box-shadow: 2px 2px 5px #888;
+ box-shadow: 2px 2px 5px #888;
+}
+
+ul#testlogs li {
+ text-decoration:none;
+ list-style-type: none;
+ display: block;
+ background-color: #eef1f1;
+ margin: 5px;
+ padding: 5px;
+ font-size: 15px;
+ }
+
+
+ul#testlogs li a {
+ text-decoration:none;
+ color:#8aa19c;
+ font-weight: bold;
+ font-size: 12px;
+ }
+
+ul#testlogs li a:hover {
+ color:#D14836;
+}