aboutsummaryrefslogtreecommitdiff
path: root/apps/px4/attitude_estimator_bm/attitude_estimator_bm.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/px4/attitude_estimator_bm/attitude_estimator_bm.c')
-rw-r--r--apps/px4/attitude_estimator_bm/attitude_estimator_bm.c39
1 files changed, 36 insertions, 3 deletions
diff --git a/apps/px4/attitude_estimator_bm/attitude_estimator_bm.c b/apps/px4/attitude_estimator_bm/attitude_estimator_bm.c
index 3c6c8eec3..8551b5e1c 100644
--- a/apps/px4/attitude_estimator_bm/attitude_estimator_bm.c
+++ b/apps/px4/attitude_estimator_bm/attitude_estimator_bm.c
@@ -33,7 +33,10 @@
*
****************************************************************************/
-/* @file Black Magic Attitude Estimator */
+/**
+ * @file attitude_estimator_bm.c
+ * Black Magic Attitude Estimator
+ */
@@ -49,6 +52,7 @@
#include <uORB/uORB.h>
#include <uORB/topics/sensor_combined.h>
#include <uORB/topics/vehicle_attitude.h>
+#include <uORB/topics/vehicle_status.h>
#include <math.h>
#include <errno.h>
@@ -135,14 +139,22 @@ int attitude_estimator_bm_main(int argc, char *argv[])
/* rate-limit raw data updates to 200Hz */
//orb_set_interval(sub_raw, 5);
+ bool hil_enabled = false;
+ bool publishing = false;
+
/* advertise attitude */
int pub_att = orb_advertise(ORB_ID(vehicle_attitude), &att);
+ publishing = true;
struct pollfd fds[] = {
{ .fd = sub_raw, .events = POLLIN },
};
- // int paramcounter = 100;
+ /* subscribe to system status */
+ struct vehicle_status_s vstatus = {0};
+ int vstatus_sub = orb_subscribe(ORB_ID(vehicle_status));
+
+ unsigned int loopcounter = 0;
/* Main loop*/
while (true) {
@@ -217,8 +229,29 @@ int attitude_estimator_bm_main(int argc, char *argv[])
att.R[0][2] = x_n_b.z;
// XXX add remaining entries
+ if (loopcounter % 250 == 0) {
+ /* Check HIL state */
+ orb_copy(ORB_ID(vehicle_status), vstatus_sub, &vstatus);
+ /* switching from non-HIL to HIL mode */
+ if ((vstatus.mode & VEHICLE_MODE_FLAG_HIL_ENABLED) && !hil_enabled) {
+ hil_enabled = true;
+ publishing = false;
+ close(pub_att);
+
+ /* switching from HIL to non-HIL mode */
+
+ } else if (!publishing && !hil_enabled) {
+ /* advertise the topic and make the initial publication */
+ pub_att = orb_advertise(ORB_ID(vehicle_attitude), &att);
+ hil_enabled = false;
+ publishing = true;
+ }
+ }
+
// Broadcast
- orb_publish(ORB_ID(vehicle_attitude), pub_att, &att);
+ if (publishing) orb_publish(ORB_ID(vehicle_attitude), pub_att, &att);
+
+ loopcounter++;
}
/* Should never reach here */