diff --git a/artwork/Diagrams/system-health-path.svg b/artwork/Diagrams/system-health-path.svg
index 6d9b2b9fb..7be4ff744 100644
--- a/artwork/Diagrams/system-health-path.svg
+++ b/artwork/Diagrams/system-health-path.svg
@@ -7,6 +7,7 @@
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="94.2584"
@@ -483,6 +484,108 @@
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id="path3980"
+ inkscape:connector-curvature="0" />
+ id="path3982"
+ inkscape:connector-curvature="0" />
+ id="path3984"
+ inkscape:connector-curvature="0" />
+ id="path3986"
+ inkscape:connector-curvature="0" />
+ id="path3988"
+ inkscape:connector-curvature="0" />
+ id="path3931"
+ inkscape:connector-curvature="0" />
+ id="path3933"
+ inkscape:connector-curvature="0" />
+ id="path3935"
+ inkscape:connector-curvature="0" />
+ id="path3924"
+ inkscape:connector-curvature="0" />
+ id="path3926"
+ inkscape:connector-curvature="0" />
+ id="path3928"
+ inkscape:connector-curvature="0" />
+ id="path3905"
+ inkscape:connector-curvature="0" />
+ id="path3907"
+ inkscape:connector-curvature="0" />
+ id="path3909"
+ inkscape:connector-curvature="0" />
+ id="path3911"
+ inkscape:connector-curvature="0" />
+ id="path3913"
+ inkscape:connector-curvature="0" />
+ id="path3915"
+ inkscape:connector-curvature="0" />
+ id="path3917"
+ inkscape:connector-curvature="0" />
+ id="path3919"
+ inkscape:connector-curvature="0" />
+ id="path3921"
+ inkscape:connector-curvature="0" />
+ id="path4194"
+ inkscape:connector-curvature="0" />
+ id="path4196"
+ inkscape:connector-curvature="0" />
+ id="path4198"
+ inkscape:connector-curvature="0" />
+ id="path4201"
+ inkscape:connector-curvature="0" />
+ id="path4203"
+ inkscape:connector-curvature="0" />
+ id="path4205"
+ inkscape:connector-curvature="0" />
+ id="path4207"
+ inkscape:connector-curvature="0" />
+ id="path4209"
+ inkscape:connector-curvature="0" />
+ id="path4212"
+ inkscape:connector-curvature="0" />
+ id="path4214"
+ inkscape:connector-curvature="0" />
+ id="path4216"
+ inkscape:connector-curvature="0" />
+ id="path4218"
+ inkscape:connector-curvature="0" />
+ id="path4220"
+ inkscape:connector-curvature="0" />
+ id="path4222"
+ inkscape:connector-curvature="0" />
+ id="path4259"
+ inkscape:connector-curvature="0" />
+ id="path4261"
+ inkscape:connector-curvature="0" />
+ id="path4263"
+ inkscape:connector-curvature="0" />
+ id="path4118"
+ inkscape:connector-curvature="0" />
+ id="path4099"
+ inkscape:connector-curvature="0" />
+ id="path4096"
+ inkscape:connector-curvature="0" />
+ id="path4093"
+ inkscape:connector-curvature="0" />
+ id="path4090"
+ inkscape:connector-curvature="0" />
+ id="path4087"
+ inkscape:connector-curvature="0" />
+ id="path4083"
+ inkscape:connector-curvature="0" />
+ id="path4080"
+ inkscape:connector-curvature="0" />
+ id="path4102"
+ inkscape:connector-curvature="0" />
+ id="path4105"
+ inkscape:connector-curvature="0" />
+ id="path4107"
+ inkscape:connector-curvature="0" />
+ id="path4109"
+ inkscape:connector-curvature="0" />
+ id="path4111"
+ inkscape:connector-curvature="0" />
+ id="path4113"
+ inkscape:connector-curvature="0" />
+ id="path4115"
+ inkscape:connector-curvature="0" />
+ id="path4275"
+ inkscape:connector-curvature="0" />
+ id="path4277"
+ inkscape:connector-curvature="0" />
+ id="path4279"
+ inkscape:connector-curvature="0" />
+ id="path4266"
+ inkscape:connector-curvature="0" />
+ id="path4268"
+ inkscape:connector-curvature="0" />
+ id="path4270"
+ inkscape:connector-curvature="0" />
+ id="path4272"
+ inkscape:connector-curvature="0" />
+ id="path4285"
+ inkscape:connector-curvature="0" />
+ id="path4287"
+ inkscape:connector-curvature="0" />
+ id="path4289"
+ inkscape:connector-curvature="0" />
+ id="path4291"
+ inkscape:connector-curvature="0" />
+ id="path4320"
+ inkscape:connector-curvature="0" />
+ id="path4322"
+ inkscape:connector-curvature="0" />
+ id="path4324"
+ inkscape:connector-curvature="0" />
+ id="path4326"
+ inkscape:connector-curvature="0" />
+ id="path4328"
+ inkscape:connector-curvature="0" />
+ id="path4330"
+ inkscape:connector-curvature="0" />
+ id="path4332"
+ inkscape:connector-curvature="0" />
+ id="path4334"
+ inkscape:connector-curvature="0" />
+ id="path4303"
+ inkscape:connector-curvature="0" />
+ id="path4305"
+ inkscape:connector-curvature="0" />
+ id="path4307"
+ inkscape:connector-curvature="0" />
+ id="path4309"
+ inkscape:connector-curvature="0" />
+ id="path4311"
+ inkscape:connector-curvature="0" />
+ id="path4035"
+ inkscape:connector-curvature="0" />
+ id="path4037"
+ inkscape:connector-curvature="0" />
+ id="path4039"
+ inkscape:connector-curvature="0" />
+ id="path4041"
+ inkscape:connector-curvature="0" />
+ id="path4043"
+ inkscape:connector-curvature="0" />
+ id="path4045"
+ inkscape:connector-curvature="0" />
+ id="path4047"
+ inkscape:connector-curvature="0" />
+ id="path4049"
+ inkscape:connector-curvature="0" />
+ id="path4051"
+ inkscape:connector-curvature="0" />
+ id="path4053"
+ inkscape:connector-curvature="0" />
+ id="path4055"
+ inkscape:connector-curvature="0" />
+ id="path4058"
+ inkscape:connector-curvature="0" />
+ id="path4032"
+ inkscape:connector-curvature="0" />
+ id="path4029"
+ inkscape:connector-curvature="0" />
+ id="path4026"
+ inkscape:connector-curvature="0" />
+ id="path4023"
+ inkscape:connector-curvature="0" />
+ id="path4020"
+ inkscape:connector-curvature="0" />
+ id="path4017"
+ inkscape:connector-curvature="0" />
+ id="path4014"
+ inkscape:connector-curvature="0" />
+ id="path4282"
+ inkscape:connector-curvature="0" />
+ id="path4294"
+ inkscape:connector-curvature="0" />
+ id="path4297"
+ inkscape:connector-curvature="0" />
+ id="path4300"
+ inkscape:connector-curvature="0" />
+ id="path4317"
+ inkscape:connector-curvature="0" />
+ id="path4314"
+ inkscape:connector-curvature="0" />
+ inkscape:label="#rect3054"
+ transform="translate(-497.66563,-344.28037)" />
+ id="path4183"
+ inkscape:connector-curvature="0" />
+ id="path4185"
+ inkscape:connector-curvature="0" />
+ id="path4187"
+ inkscape:connector-curvature="0" />
+ id="path4189"
+ inkscape:connector-curvature="0" />
+ id="path4191"
+ inkscape:connector-curvature="0" />
+ id="path4143"
+ inkscape:connector-curvature="0" />
+ id="path4145"
+ inkscape:connector-curvature="0" />
+ id="path4147"
+ inkscape:connector-curvature="0" />
+ id="path4149"
+ inkscape:connector-curvature="0" />
+ id="path4151"
+ inkscape:connector-curvature="0" />
+ id="path4153"
+ inkscape:connector-curvature="0" />
+ id="path3947"
+ inkscape:connector-curvature="0" />
+ id="path3949"
+ inkscape:connector-curvature="0" />
+ id="path3951"
+ inkscape:connector-curvature="0" />
+ id="path3953"
+ inkscape:connector-curvature="0" />
+ id="path3955"
+ inkscape:connector-curvature="0" />
+ id="path3991"
+ inkscape:connector-curvature="0" />
+ id="path3993"
+ inkscape:connector-curvature="0" />
+ id="path3995"
+ inkscape:connector-curvature="0" />
+ id="path3997"
+ inkscape:connector-curvature="0" />
+ id="path3999"
+ inkscape:connector-curvature="0" />
+ id="path4001"
+ inkscape:connector-curvature="0" />
+ id="path4003"
+ inkscape:connector-curvature="0" />
+ id="path4005"
+ inkscape:connector-curvature="0" />
+ id="path4007"
+ inkscape:connector-curvature="0" />
+ id="path4009"
+ inkscape:connector-curvature="0" />
+ id="path4011"
+ inkscape:connector-curvature="0" />
+ id="path3969"
+ inkscape:connector-curvature="0" />
+ id="path3971"
+ inkscape:connector-curvature="0" />
+ id="path3973"
+ inkscape:connector-curvature="0" />
+ id="path3975"
+ inkscape:connector-curvature="0" />
+ id="path3977"
+ inkscape:connector-curvature="0" />
+ id="path3958"
+ inkscape:connector-curvature="0" />
+ id="path3960"
+ inkscape:connector-curvature="0" />
+ id="path3962"
+ inkscape:connector-curvature="0" />
+ id="path3964"
+ inkscape:connector-curvature="0" />
+ id="path3966"
+ inkscape:connector-curvature="0" />
+ id="path4156"
+ inkscape:connector-curvature="0" />
+ id="path4158"
+ inkscape:connector-curvature="0" />
+ id="path4160"
+ inkscape:connector-curvature="0" />
+ id="path4162"
+ inkscape:connector-curvature="0" />
+ id="path4164"
+ inkscape:connector-curvature="0" />
+ id="path4166"
+ inkscape:connector-curvature="0" />
+ id="path4168"
+ inkscape:connector-curvature="0" />
+ id="path4170"
+ inkscape:connector-curvature="0" />
+ id="path4172"
+ inkscape:connector-curvature="0" />
+ id="path4174"
+ inkscape:connector-curvature="0" />
+ id="path4176"
+ inkscape:connector-curvature="0" />
+ id="path4178"
+ inkscape:connector-curvature="0" />
+ id="path4180"
+ inkscape:connector-curvature="0" />
+ id="path3938"
+ inkscape:connector-curvature="0" />
+ id="path3940"
+ inkscape:connector-curvature="0" />
+ id="path3942"
+ inkscape:connector-curvature="0" />
+ id="path3944"
+ inkscape:connector-curvature="0" />
+ id="path4130"
+ inkscape:connector-curvature="0" />
+ id="path4132"
+ inkscape:connector-curvature="0" />
+ id="path4134"
+ inkscape:connector-curvature="0" />
+ id="path4136"
+ inkscape:connector-curvature="0" />
+ id="path4138"
+ inkscape:connector-curvature="0" />
+ id="path4140"
+ inkscape:connector-curvature="0" />
+ id="path4121"
+ inkscape:connector-curvature="0" />
+ id="path4123"
+ inkscape:connector-curvature="0" />
+ id="path4125"
+ inkscape:connector-curvature="0" />
+ id="path4127"
+ inkscape:connector-curvature="0" />
+ id="path4225"
+ inkscape:connector-curvature="0" />
+ id="path4227"
+ inkscape:connector-curvature="0" />
+ id="path4229"
+ inkscape:connector-curvature="0" />
+ id="path4231"
+ inkscape:connector-curvature="0" />
+ id="path4233"
+ inkscape:connector-curvature="0" />
+ id="path4235"
+ inkscape:connector-curvature="0" />
+ id="path4237"
+ inkscape:connector-curvature="0" />
+ id="path4239"
+ inkscape:connector-curvature="0" />
+ id="path4242"
+ inkscape:connector-curvature="0" />
+ id="path4244"
+ inkscape:connector-curvature="0" />
+ id="path4246"
+ inkscape:connector-curvature="0" />
+ id="path4248"
+ inkscape:connector-curvature="0" />
+ id="path4250"
+ inkscape:connector-curvature="0" />
+ id="path4252"
+ inkscape:connector-curvature="0" />
+ id="path4254"
+ inkscape:connector-curvature="0" />
+ id="path4256"
+ inkscape:connector-curvature="0" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/artwork/Diagrams/system-health-text.svg b/artwork/Diagrams/system-health-text.svg
index 1af000d40..609816bd4 100644
--- a/artwork/Diagrams/system-health-text.svg
+++ b/artwork/Diagrams/system-health-text.svg
@@ -7,6 +7,7 @@
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="94.2584"
@@ -483,6 +484,187 @@
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ style="display:inline"
+ sodipodi:insensitive="true">
+ style="display:inline"
+ sodipodi:insensitive="true">
Guidance
+
+
+
+
+
+ No Link
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ground/openpilotgcs/share/openpilotgcs/diagrams/default/system-health.svg b/ground/openpilotgcs/share/openpilotgcs/diagrams/default/system-health.svg
index 6d9b2b9fb..7be4ff744 100644
--- a/ground/openpilotgcs/share/openpilotgcs/diagrams/default/system-health.svg
+++ b/ground/openpilotgcs/share/openpilotgcs/diagrams/default/system-health.svg
@@ -7,6 +7,7 @@
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="94.2584"
@@ -483,6 +484,108 @@
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id="path3980"
+ inkscape:connector-curvature="0" />
+ id="path3982"
+ inkscape:connector-curvature="0" />
+ id="path3984"
+ inkscape:connector-curvature="0" />
+ id="path3986"
+ inkscape:connector-curvature="0" />
+ id="path3988"
+ inkscape:connector-curvature="0" />
+ id="path3931"
+ inkscape:connector-curvature="0" />
+ id="path3933"
+ inkscape:connector-curvature="0" />
+ id="path3935"
+ inkscape:connector-curvature="0" />
+ id="path3924"
+ inkscape:connector-curvature="0" />
+ id="path3926"
+ inkscape:connector-curvature="0" />
+ id="path3928"
+ inkscape:connector-curvature="0" />
+ id="path3905"
+ inkscape:connector-curvature="0" />
+ id="path3907"
+ inkscape:connector-curvature="0" />
+ id="path3909"
+ inkscape:connector-curvature="0" />
+ id="path3911"
+ inkscape:connector-curvature="0" />
+ id="path3913"
+ inkscape:connector-curvature="0" />
+ id="path3915"
+ inkscape:connector-curvature="0" />
+ id="path3917"
+ inkscape:connector-curvature="0" />
+ id="path3919"
+ inkscape:connector-curvature="0" />
+ id="path3921"
+ inkscape:connector-curvature="0" />
+ id="path4194"
+ inkscape:connector-curvature="0" />
+ id="path4196"
+ inkscape:connector-curvature="0" />
+ id="path4198"
+ inkscape:connector-curvature="0" />
+ id="path4201"
+ inkscape:connector-curvature="0" />
+ id="path4203"
+ inkscape:connector-curvature="0" />
+ id="path4205"
+ inkscape:connector-curvature="0" />
+ id="path4207"
+ inkscape:connector-curvature="0" />
+ id="path4209"
+ inkscape:connector-curvature="0" />
+ id="path4212"
+ inkscape:connector-curvature="0" />
+ id="path4214"
+ inkscape:connector-curvature="0" />
+ id="path4216"
+ inkscape:connector-curvature="0" />
+ id="path4218"
+ inkscape:connector-curvature="0" />
+ id="path4220"
+ inkscape:connector-curvature="0" />
+ id="path4222"
+ inkscape:connector-curvature="0" />
+ id="path4259"
+ inkscape:connector-curvature="0" />
+ id="path4261"
+ inkscape:connector-curvature="0" />
+ id="path4263"
+ inkscape:connector-curvature="0" />
+ id="path4118"
+ inkscape:connector-curvature="0" />
+ id="path4099"
+ inkscape:connector-curvature="0" />
+ id="path4096"
+ inkscape:connector-curvature="0" />
+ id="path4093"
+ inkscape:connector-curvature="0" />
+ id="path4090"
+ inkscape:connector-curvature="0" />
+ id="path4087"
+ inkscape:connector-curvature="0" />
+ id="path4083"
+ inkscape:connector-curvature="0" />
+ id="path4080"
+ inkscape:connector-curvature="0" />
+ id="path4102"
+ inkscape:connector-curvature="0" />
+ id="path4105"
+ inkscape:connector-curvature="0" />
+ id="path4107"
+ inkscape:connector-curvature="0" />
+ id="path4109"
+ inkscape:connector-curvature="0" />
+ id="path4111"
+ inkscape:connector-curvature="0" />
+ id="path4113"
+ inkscape:connector-curvature="0" />
+ id="path4115"
+ inkscape:connector-curvature="0" />
+ id="path4275"
+ inkscape:connector-curvature="0" />
+ id="path4277"
+ inkscape:connector-curvature="0" />
+ id="path4279"
+ inkscape:connector-curvature="0" />
+ id="path4266"
+ inkscape:connector-curvature="0" />
+ id="path4268"
+ inkscape:connector-curvature="0" />
+ id="path4270"
+ inkscape:connector-curvature="0" />
+ id="path4272"
+ inkscape:connector-curvature="0" />
+ id="path4285"
+ inkscape:connector-curvature="0" />
+ id="path4287"
+ inkscape:connector-curvature="0" />
+ id="path4289"
+ inkscape:connector-curvature="0" />
+ id="path4291"
+ inkscape:connector-curvature="0" />
+ id="path4320"
+ inkscape:connector-curvature="0" />
+ id="path4322"
+ inkscape:connector-curvature="0" />
+ id="path4324"
+ inkscape:connector-curvature="0" />
+ id="path4326"
+ inkscape:connector-curvature="0" />
+ id="path4328"
+ inkscape:connector-curvature="0" />
+ id="path4330"
+ inkscape:connector-curvature="0" />
+ id="path4332"
+ inkscape:connector-curvature="0" />
+ id="path4334"
+ inkscape:connector-curvature="0" />
+ id="path4303"
+ inkscape:connector-curvature="0" />
+ id="path4305"
+ inkscape:connector-curvature="0" />
+ id="path4307"
+ inkscape:connector-curvature="0" />
+ id="path4309"
+ inkscape:connector-curvature="0" />
+ id="path4311"
+ inkscape:connector-curvature="0" />
+ id="path4035"
+ inkscape:connector-curvature="0" />
+ id="path4037"
+ inkscape:connector-curvature="0" />
+ id="path4039"
+ inkscape:connector-curvature="0" />
+ id="path4041"
+ inkscape:connector-curvature="0" />
+ id="path4043"
+ inkscape:connector-curvature="0" />
+ id="path4045"
+ inkscape:connector-curvature="0" />
+ id="path4047"
+ inkscape:connector-curvature="0" />
+ id="path4049"
+ inkscape:connector-curvature="0" />
+ id="path4051"
+ inkscape:connector-curvature="0" />
+ id="path4053"
+ inkscape:connector-curvature="0" />
+ id="path4055"
+ inkscape:connector-curvature="0" />
+ id="path4058"
+ inkscape:connector-curvature="0" />
+ id="path4032"
+ inkscape:connector-curvature="0" />
+ id="path4029"
+ inkscape:connector-curvature="0" />
+ id="path4026"
+ inkscape:connector-curvature="0" />
+ id="path4023"
+ inkscape:connector-curvature="0" />
+ id="path4020"
+ inkscape:connector-curvature="0" />
+ id="path4017"
+ inkscape:connector-curvature="0" />
+ id="path4014"
+ inkscape:connector-curvature="0" />
+ id="path4282"
+ inkscape:connector-curvature="0" />
+ id="path4294"
+ inkscape:connector-curvature="0" />
+ id="path4297"
+ inkscape:connector-curvature="0" />
+ id="path4300"
+ inkscape:connector-curvature="0" />
+ id="path4317"
+ inkscape:connector-curvature="0" />
+ id="path4314"
+ inkscape:connector-curvature="0" />
+ inkscape:label="#rect3054"
+ transform="translate(-497.66563,-344.28037)" />
+ id="path4183"
+ inkscape:connector-curvature="0" />
+ id="path4185"
+ inkscape:connector-curvature="0" />
+ id="path4187"
+ inkscape:connector-curvature="0" />
+ id="path4189"
+ inkscape:connector-curvature="0" />
+ id="path4191"
+ inkscape:connector-curvature="0" />
+ id="path4143"
+ inkscape:connector-curvature="0" />
+ id="path4145"
+ inkscape:connector-curvature="0" />
+ id="path4147"
+ inkscape:connector-curvature="0" />
+ id="path4149"
+ inkscape:connector-curvature="0" />
+ id="path4151"
+ inkscape:connector-curvature="0" />
+ id="path4153"
+ inkscape:connector-curvature="0" />
+ id="path3947"
+ inkscape:connector-curvature="0" />
+ id="path3949"
+ inkscape:connector-curvature="0" />
+ id="path3951"
+ inkscape:connector-curvature="0" />
+ id="path3953"
+ inkscape:connector-curvature="0" />
+ id="path3955"
+ inkscape:connector-curvature="0" />
+ id="path3991"
+ inkscape:connector-curvature="0" />
+ id="path3993"
+ inkscape:connector-curvature="0" />
+ id="path3995"
+ inkscape:connector-curvature="0" />
+ id="path3997"
+ inkscape:connector-curvature="0" />
+ id="path3999"
+ inkscape:connector-curvature="0" />
+ id="path4001"
+ inkscape:connector-curvature="0" />
+ id="path4003"
+ inkscape:connector-curvature="0" />
+ id="path4005"
+ inkscape:connector-curvature="0" />
+ id="path4007"
+ inkscape:connector-curvature="0" />
+ id="path4009"
+ inkscape:connector-curvature="0" />
+ id="path4011"
+ inkscape:connector-curvature="0" />
+ id="path3969"
+ inkscape:connector-curvature="0" />
+ id="path3971"
+ inkscape:connector-curvature="0" />
+ id="path3973"
+ inkscape:connector-curvature="0" />
+ id="path3975"
+ inkscape:connector-curvature="0" />
+ id="path3977"
+ inkscape:connector-curvature="0" />
+ id="path3958"
+ inkscape:connector-curvature="0" />
+ id="path3960"
+ inkscape:connector-curvature="0" />
+ id="path3962"
+ inkscape:connector-curvature="0" />
+ id="path3964"
+ inkscape:connector-curvature="0" />
+ id="path3966"
+ inkscape:connector-curvature="0" />
+ id="path4156"
+ inkscape:connector-curvature="0" />
+ id="path4158"
+ inkscape:connector-curvature="0" />
+ id="path4160"
+ inkscape:connector-curvature="0" />
+ id="path4162"
+ inkscape:connector-curvature="0" />
+ id="path4164"
+ inkscape:connector-curvature="0" />
+ id="path4166"
+ inkscape:connector-curvature="0" />
+ id="path4168"
+ inkscape:connector-curvature="0" />
+ id="path4170"
+ inkscape:connector-curvature="0" />
+ id="path4172"
+ inkscape:connector-curvature="0" />
+ id="path4174"
+ inkscape:connector-curvature="0" />
+ id="path4176"
+ inkscape:connector-curvature="0" />
+ id="path4178"
+ inkscape:connector-curvature="0" />
+ id="path4180"
+ inkscape:connector-curvature="0" />
+ id="path3938"
+ inkscape:connector-curvature="0" />
+ id="path3940"
+ inkscape:connector-curvature="0" />
+ id="path3942"
+ inkscape:connector-curvature="0" />
+ id="path3944"
+ inkscape:connector-curvature="0" />
+ id="path4130"
+ inkscape:connector-curvature="0" />
+ id="path4132"
+ inkscape:connector-curvature="0" />
+ id="path4134"
+ inkscape:connector-curvature="0" />
+ id="path4136"
+ inkscape:connector-curvature="0" />
+ id="path4138"
+ inkscape:connector-curvature="0" />
+ id="path4140"
+ inkscape:connector-curvature="0" />
+ id="path4121"
+ inkscape:connector-curvature="0" />
+ id="path4123"
+ inkscape:connector-curvature="0" />
+ id="path4125"
+ inkscape:connector-curvature="0" />
+ id="path4127"
+ inkscape:connector-curvature="0" />
+ id="path4225"
+ inkscape:connector-curvature="0" />
+ id="path4227"
+ inkscape:connector-curvature="0" />
+ id="path4229"
+ inkscape:connector-curvature="0" />
+ id="path4231"
+ inkscape:connector-curvature="0" />
+ id="path4233"
+ inkscape:connector-curvature="0" />
+ id="path4235"
+ inkscape:connector-curvature="0" />
+ id="path4237"
+ inkscape:connector-curvature="0" />
+ id="path4239"
+ inkscape:connector-curvature="0" />
+ id="path4242"
+ inkscape:connector-curvature="0" />
+ id="path4244"
+ inkscape:connector-curvature="0" />
+ id="path4246"
+ inkscape:connector-curvature="0" />
+ id="path4248"
+ inkscape:connector-curvature="0" />
+ id="path4250"
+ inkscape:connector-curvature="0" />
+ id="path4252"
+ inkscape:connector-curvature="0" />
+ id="path4254"
+ inkscape:connector-curvature="0" />
+ id="path4256"
+ inkscape:connector-curvature="0" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ground/openpilotgcs/src/plugins/systemhealth/SystemHealthGadget.pluginspec b/ground/openpilotgcs/src/plugins/systemhealth/SystemHealthGadget.pluginspec
index c48915fcb..7b055304a 100644
--- a/ground/openpilotgcs/src/plugins/systemhealth/SystemHealthGadget.pluginspec
+++ b/ground/openpilotgcs/src/plugins/systemhealth/SystemHealthGadget.pluginspec
@@ -7,5 +7,6 @@
+
diff --git a/ground/openpilotgcs/src/plugins/systemhealth/systemhealth.pro b/ground/openpilotgcs/src/plugins/systemhealth/systemhealth.pro
index a2ba3fc60..b053a7430 100644
--- a/ground/openpilotgcs/src/plugins/systemhealth/systemhealth.pro
+++ b/ground/openpilotgcs/src/plugins/systemhealth/systemhealth.pro
@@ -4,7 +4,6 @@ QT += svg
include(../../openpilotgcsplugin.pri)
include(../../plugins/coreplugin/coreplugin.pri)
include(systemhealth_dependencies.pri)
-include(../../libs/qwt/qwt.pri)
HEADERS += systemhealthplugin.h
HEADERS += systemhealthgadget.h
HEADERS += systemhealthgadgetwidget.h
diff --git a/ground/openpilotgcs/src/plugins/systemhealth/systemhealth_dependencies.pri b/ground/openpilotgcs/src/plugins/systemhealth/systemhealth_dependencies.pri
index ad54b0073..7750ae9aa 100644
--- a/ground/openpilotgcs/src/plugins/systemhealth/systemhealth_dependencies.pri
+++ b/ground/openpilotgcs/src/plugins/systemhealth/systemhealth_dependencies.pri
@@ -1,3 +1,2 @@
include(../../plugins/uavobjects/uavobjects.pri)
-#include(../../plugins/coreplugin/coreplugin.pri)
-#include(../../libs/utils/utils.pri)
+include(../../plugins/uavtalk/uavtalk.pri)
diff --git a/ground/openpilotgcs/src/plugins/systemhealth/systemhealthgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/systemhealth/systemhealthgadgetwidget.cpp
index 6d93031ad..7a0d5066f 100644
--- a/ground/openpilotgcs/src/plugins/systemhealth/systemhealthgadgetwidget.cpp
+++ b/ground/openpilotgcs/src/plugins/systemhealth/systemhealthgadgetwidget.cpp
@@ -1,164 +1,187 @@
-/**
- ******************************************************************************
- *
- * @file systemhealthgadgetwidget.cpp
- * @author Edouard Lafargue Copyright (C) 2010.
- * @addtogroup GCSPlugins GCS Plugins
- * @{
- * @addtogroup SystemHealthPlugin System Health Plugin
- * @{
- * @brief The System Health gadget plugin
- *****************************************************************************/
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#include "systemhealthgadgetwidget.h"
-#include "utils/stylehelper.h"
-#include "extensionsystem/pluginmanager.h"
-#include "uavobjectmanager.h"
-#include "systemalarms.h"
-
-#include
-#include
-#include
-
-/*
- * Initialize the widget
- */
-SystemHealthGadgetWidget::SystemHealthGadgetWidget(QWidget *parent) : QGraphicsView(parent)
-{
- setMinimumSize(128,128);
- setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
- setScene(new QGraphicsScene(this));
-
-
- m_renderer = new QSvgRenderer();
- background = new QGraphicsSvgItem();
- foreground = new QGraphicsSvgItem();
-
- paint();
-
- // Now connect the widget to the SystemAlarms UAVObject
- ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
- UAVObjectManager *objManager = pm->getObject();
-
- SystemAlarms* obj = dynamic_cast(objManager->getObject(QString("SystemAlarms")));
- connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(updateAlarms(UAVObject*)));
-
-}
-
-void SystemHealthGadgetWidget::updateAlarms(UAVObject* systemAlarm)
-{
- // This code does not know anything about alarms beforehand, and
- // I found to efficient way to locate items inside the scene by
- // name, so it's just as simple to reset the scene:
- // And add the one with the right name.
- QGraphicsScene *m_scene = scene();
- foreach ( QGraphicsItem* item ,background->childItems()){
- m_scene->removeItem(item);
- delete item; // removeItem does _not_ delete the item.
- }
-
- QString alarm = systemAlarm->getName();
- foreach (UAVObjectField *field, systemAlarm->getFields()) {
- for (uint i = 0; i < field->getNumElements(); ++i) {
- QString element = field->getElementNames()[i];
- QString value = field->getValue(i).toString();
- if (m_renderer->elementExists(element)) {
- QMatrix blockMatrix = m_renderer->matrixForElement(element);
- qreal startX = blockMatrix.mapRect(m_renderer->boundsOnElement(element)).x();
- qreal startY = blockMatrix.mapRect(m_renderer->boundsOnElement(element)).y();
- QString element2 = element + "-" + value;
- if (m_renderer->elementExists(element2)) {
- QGraphicsSvgItem *ind = new QGraphicsSvgItem();
- ind->setSharedRenderer(m_renderer);
- ind->setElementId(element2);
- ind->setParentItem(background);
- QTransform matrix;
- matrix.translate(startX,startY);
- ind->setTransform(matrix,false);
- } else {
- if (value.compare("Uninitialised")!=0)qDebug() << "Warning: element " << element2 << " not found in SVG.";
- }
- } else {
- qDebug() << "Warning: Element " << element << " not found in SVG.";
- }
- }
- }
-}
-
-SystemHealthGadgetWidget::~SystemHealthGadgetWidget()
-{
- // Do nothing
-}
-
-
-void SystemHealthGadgetWidget::setSystemFile(QString dfn)
-{
- setBackgroundBrush(QBrush(Utils::StyleHelper::baseColor()));
- if (QFile::exists(dfn))
- {
- m_renderer->load(dfn);
- if(m_renderer->isValid())
- {
- fgenabled = false;
-
- background->setSharedRenderer(m_renderer);
- background->setElementId("background");
-
- if (m_renderer->elementExists("foreground")) {
- foreground->setSharedRenderer(m_renderer);
- foreground->setElementId("foreground");
- foreground->setZValue(99);
- fgenabled = true;
- }
- std::cout<<"Dial file loaded"<setSceneRect(background->boundingRect());
- fitInView(background, Qt::KeepAspectRatio );
- }
- }
- else
- { qDebug() <<"SystemHealthGadget: no file"; }
-}
-
-void SystemHealthGadgetWidget::paint()
-{
- QGraphicsScene *l_scene = scene();
- l_scene->clear();
- l_scene->addItem(background);
- l_scene->addItem(foreground);
- update();
-}
-
-void SystemHealthGadgetWidget::paintEvent(QPaintEvent *event)
-{
- // Skip painting until the dial file is loaded
- if (! m_renderer->isValid()) {
- qDebug() <<"SystemHealthGadget: System file not loaded, not rendering";
- return;
- }
- QGraphicsView::paintEvent(event);
-}
-
-// This event enables the dial to be dynamically resized
-// whenever the gadget is resized, taking advantage of the vector
-// nature of SVG dials.
-void SystemHealthGadgetWidget::resizeEvent(QResizeEvent *event)
-{
- Q_UNUSED(event);
- fitInView(background, Qt::KeepAspectRatio );
-}
+/**
+ ******************************************************************************
+ *
+ * @file systemhealthgadgetwidget.cpp
+ * @author Edouard Lafargue Copyright (C) 2010.
+ * @addtogroup GCSPlugins GCS Plugins
+ * @{
+ * @addtogroup SystemHealthPlugin System Health Plugin
+ * @{
+ * @brief The System Health gadget plugin
+ *****************************************************************************/
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "systemhealthgadgetwidget.h"
+#include "utils/stylehelper.h"
+#include "extensionsystem/pluginmanager.h"
+#include "uavobjectmanager.h"
+#include "systemalarms.h"
+
+#include
+
+/*
+ * Initialize the widget
+ */
+SystemHealthGadgetWidget::SystemHealthGadgetWidget(QWidget *parent) : QGraphicsView(parent)
+{
+ setMinimumSize(128,128);
+ setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+ setScene(new QGraphicsScene(this));
+
+
+ m_renderer = new QSvgRenderer();
+ background = new QGraphicsSvgItem();
+ foreground = new QGraphicsSvgItem();
+ nolink = new QGraphicsSvgItem();
+
+ paint();
+
+ // Now connect the widget to the SystemAlarms UAVObject
+ ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
+ UAVObjectManager *objManager = pm->getObject();
+
+ SystemAlarms* obj = dynamic_cast(objManager->getObject(QString("SystemAlarms")));
+ connect(obj, SIGNAL(objectUpdated(UAVObject*)), this, SLOT(updateAlarms(UAVObject*)));
+
+ // Listen to autopilot connection events
+ TelemetryManager* telMngr = pm->getObject();
+ connect(telMngr, SIGNAL(connected()), this, SLOT(onAutopilotConnect()));
+ connect(telMngr, SIGNAL(disconnected()), this, SLOT(onAutopilotDisconnect()));
+
+}
+
+/**
+ * Hide the "No Link" overlay
+ */
+void SystemHealthGadgetWidget::onAutopilotConnect()
+{
+ nolink->setVisible(false);
+}
+
+/**
+ * Show the "No Link" overlay
+ */
+void SystemHealthGadgetWidget::onAutopilotDisconnect()
+{
+ nolink->setVisible(true);
+}
+
+void SystemHealthGadgetWidget::updateAlarms(UAVObject* systemAlarm)
+{
+ // This code does not know anything about alarms beforehand, and
+ // I found no efficient way to locate items inside the scene by
+ // name, so it's just as simple to reset the scene:
+ // And add the one with the right name.
+ QGraphicsScene *m_scene = scene();
+ foreach ( QGraphicsItem* item ,background->childItems()){
+ m_scene->removeItem(item);
+ delete item; // removeItem does _not_ delete the item.
+ }
+
+ QString alarm = systemAlarm->getName();
+ foreach (UAVObjectField *field, systemAlarm->getFields()) {
+ for (uint i = 0; i < field->getNumElements(); ++i) {
+ QString element = field->getElementNames()[i];
+ QString value = field->getValue(i).toString();
+ if (m_renderer->elementExists(element)) {
+ QMatrix blockMatrix = m_renderer->matrixForElement(element);
+ qreal startX = blockMatrix.mapRect(m_renderer->boundsOnElement(element)).x();
+ qreal startY = blockMatrix.mapRect(m_renderer->boundsOnElement(element)).y();
+ QString element2 = element + "-" + value;
+ if (m_renderer->elementExists(element2)) {
+ QGraphicsSvgItem *ind = new QGraphicsSvgItem();
+ ind->setSharedRenderer(m_renderer);
+ ind->setElementId(element2);
+ ind->setParentItem(background);
+ QTransform matrix;
+ matrix.translate(startX,startY);
+ ind->setTransform(matrix,false);
+ } else {
+ if (value.compare("Uninitialised")!=0)qDebug() << "Warning: element " << element2 << " not found in SVG.";
+ }
+ } else {
+ qDebug() << "Warning: Element " << element << " not found in SVG.";
+ }
+ }
+ }
+}
+
+SystemHealthGadgetWidget::~SystemHealthGadgetWidget()
+{
+ // Do nothing
+}
+
+
+void SystemHealthGadgetWidget::setSystemFile(QString dfn)
+{
+ setBackgroundBrush(QBrush(Utils::StyleHelper::baseColor()));
+ if (QFile::exists(dfn)) {
+ m_renderer->load(dfn);
+ if(m_renderer->isValid()) {
+ fgenabled = false;
+ background->setSharedRenderer(m_renderer);
+ background->setElementId("background");
+
+ if (m_renderer->elementExists("foreground")) {
+ foreground->setSharedRenderer(m_renderer);
+ foreground->setElementId("foreground");
+ foreground->setZValue(99);
+ fgenabled = true;
+ }
+ if (m_renderer->elementExists("nolink")) {
+ nolink->setSharedRenderer(m_renderer);
+ nolink->setElementId("nolink");
+ nolink->setZValue(100);
+ }
+
+ QGraphicsScene *l_scene = scene();
+ l_scene->setSceneRect(background->boundingRect());
+ fitInView(background, Qt::KeepAspectRatio );
+ }
+ }
+ else
+ { qDebug() <<"SystemHealthGadget: no file"; }
+}
+
+void SystemHealthGadgetWidget::paint()
+{
+ QGraphicsScene *l_scene = scene();
+ l_scene->clear();
+ l_scene->addItem(background);
+ l_scene->addItem(foreground);
+ l_scene->addItem(nolink);
+ update();
+}
+
+void SystemHealthGadgetWidget::paintEvent(QPaintEvent *event)
+{
+ // Skip painting until the dial file is loaded
+ if (! m_renderer->isValid()) {
+ qDebug() <<"SystemHealthGadget: System file not loaded, not rendering";
+ return;
+ }
+ QGraphicsView::paintEvent(event);
+}
+
+// This event enables the dial to be dynamically resized
+// whenever the gadget is resized, taking advantage of the vector
+// nature of SVG dials.
+void SystemHealthGadgetWidget::resizeEvent(QResizeEvent *event)
+{
+ Q_UNUSED(event);
+ fitInView(background, Qt::KeepAspectRatio );
+}
diff --git a/ground/openpilotgcs/src/plugins/systemhealth/systemhealthgadgetwidget.h b/ground/openpilotgcs/src/plugins/systemhealth/systemhealthgadgetwidget.h
index c51a75a27..7f3034059 100644
--- a/ground/openpilotgcs/src/plugins/systemhealth/systemhealthgadgetwidget.h
+++ b/ground/openpilotgcs/src/plugins/systemhealth/systemhealthgadgetwidget.h
@@ -1,67 +1,71 @@
-/**
- ******************************************************************************
- *
- * @file systemhealthgadgetwidget.h
- * @author Edouard Lafargue Copyright (C) 2010.
- * @addtogroup GCSPlugins GCS Plugins
- * @{
- * @addtogroup SystemHealthPlugin System Health Plugin
- * @{
- * @brief The System Health gadget plugin
- *****************************************************************************/
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef SYSTEMHEALTHGADGETWIDGET_H_
-#define SYSTEMHEALTHGADGETWIDGET_H_
-
-#include "systemhealthgadgetconfiguration.h"
-#include "uavobject.h"
-#include
-#include
-#include
-
-#include
-#include
-
-class SystemHealthGadgetWidget : public QGraphicsView
-{
- Q_OBJECT
-
-public:
- SystemHealthGadgetWidget(QWidget *parent = 0);
- ~SystemHealthGadgetWidget();
- void setSystemFile(QString dfn);
- void setIndicator(QString indicator);
- void paint();
-
-protected:
- void paintEvent(QPaintEvent *event);
- void resizeEvent(QResizeEvent *event);
-
-private slots:
- void updateAlarms(UAVObject *systemAlarm); // Called by the systemalarms UAVObject
-
-private:
- QSvgRenderer *m_renderer;
- QGraphicsSvgItem *background;
- QGraphicsSvgItem *foreground;
-
- // Simple flag to skip rendering if the
- bool fgenabled; // layer does not exist.
-
-};
-#endif /* SYSTEMHEALTHGADGETWIDGET_H_ */
+/**
+ ******************************************************************************
+ *
+ * @file systemhealthgadgetwidget.h
+ * @author Edouard Lafargue Copyright (C) 2010.
+ * @addtogroup GCSPlugins GCS Plugins
+ * @{
+ * @addtogroup SystemHealthPlugin System Health Plugin
+ * @{
+ * @brief The System Health gadget plugin
+ *****************************************************************************/
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef SYSTEMHEALTHGADGETWIDGET_H_
+#define SYSTEMHEALTHGADGETWIDGET_H_
+
+#include "systemhealthgadgetconfiguration.h"
+#include "uavobject.h"
+#include "uavtalk/telemetrymanager.h"
+#include
+#include
+#include
+
+#include
+#include
+
+class SystemHealthGadgetWidget : public QGraphicsView
+{
+ Q_OBJECT
+
+public:
+ SystemHealthGadgetWidget(QWidget *parent = 0);
+ ~SystemHealthGadgetWidget();
+ void setSystemFile(QString dfn);
+ void setIndicator(QString indicator);
+ void paint();
+
+protected:
+ void paintEvent(QPaintEvent *event);
+ void resizeEvent(QResizeEvent *event);
+
+private slots:
+ void updateAlarms(UAVObject *systemAlarm); // Called by the systemalarms UAVObject
+ void onAutopilotConnect();
+ void onAutopilotDisconnect();
+
+private:
+ QSvgRenderer *m_renderer;
+ QGraphicsSvgItem *background;
+ QGraphicsSvgItem *foreground;
+ QGraphicsSvgItem *nolink;
+
+ // Simple flag to skip rendering if the
+ bool fgenabled; // layer does not exist.
+
+};
+#endif /* SYSTEMHEALTHGADGETWIDGET_H_ */