diff --git a/conf/messages.xml b/conf/messages.xml
index f1ca47f72a..4860f4d2c1 100644
--- a/conf/messages.xml
+++ b/conf/messages.xml
@@ -356,6 +356,13 @@
+
+
+
+
+
+
+
diff --git a/conf/settings/antenna_settings.xml b/conf/settings/antenna_settings.xml
index 46eb8e62d8..7b2643bf24 100644
--- a/conf/settings/antenna_settings.xml
+++ b/conf/settings/antenna_settings.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/sw/airborne/avr/ant_tracker.c b/sw/airborne/avr/ant_tracker.c
index f4911f21f7..bbae2b7da7 100644
--- a/sw/airborne/avr/ant_tracker.c
+++ b/sw/airborne/avr/ant_tracker.c
@@ -9,3 +9,12 @@ uint8_t ant_track_id;
int32_t nav_utm_east0;
int32_t nav_utm_north0;
uint8_t nav_utm_zone0;
+
+
+void ant_tracker_update( void ) {
+ if (ant_track_mode == ANT_TRACK_AUTO) {
+ ant_track_azim += 0.5;
+ if (ant_track_azim > 360.)
+ ant_track_azim = 0.;
+ }
+}
diff --git a/sw/airborne/avr/ant_tracker.h b/sw/airborne/avr/ant_tracker.h
index 24356cd30b..4005570482 100644
--- a/sw/airborne/avr/ant_tracker.h
+++ b/sw/airborne/avr/ant_tracker.h
@@ -11,7 +11,19 @@ extern float ant_track_azim;
extern float ant_track_elev;
extern uint8_t ant_track_id;
-#define ant_tracker_SetId(i) { ant_track_id = i; }
+#include "led.h"
+#define ant_tracker_SetId(i) { ant_track_id = i; }
+#define ant_tracker_SetMode(i) \
+ { \
+ ant_track_mode = i; \
+ if(ant_track_mode) \
+ LED_ON(1); \
+ else \
+ LED_OFF(1); \
+ }
+
+
+extern void ant_tracker_update( void );
#endif /* ANT_TRACKER_H */
diff --git a/sw/airborne/datalink.c b/sw/airborne/datalink.c
index 048c6272a6..32d0f49d31 100644
--- a/sw/airborne/datalink.c
+++ b/sw/airborne/datalink.c
@@ -79,8 +79,10 @@ void dl_parse_msg(void) {
wind_north = DL_WIND_INFO_north(dl_buffer);
} else
#endif /** NAV */
+#ifdef AP
if (msg_id == DL_TELEMETRY_MODE) {
telemetry_mode_Ap = DL_TELEMETRY_MODE_mode(dl_buffer);
+#endif /** AP */
}
#ifdef HITL
/** Infrared and GPS sensors are replaced by messages on the datalink */
diff --git a/sw/airborne/main_antenna.c b/sw/airborne/main_antenna.c
index e7e6d0d810..5709ce1456 100644
--- a/sw/airborne/main_antenna.c
+++ b/sw/airborne/main_antenna.c
@@ -16,6 +16,8 @@
#include "messages.h"
#include "downlink.h"
+#include "ant_tracker.h"
+
static inline void main_init( void );
static inline void main_periodic_task( void );
static inline void main_event_task( void);
@@ -39,6 +41,7 @@ static inline void main_init( void ) {
sys_time_init();
led_init();
uart1_init_tx();
+ uart1_init_rx();
adc_init();
int_enable();
}
@@ -56,6 +59,7 @@ static inline void main_event_task( void ) {
}
if (PprzBuffer()) {
+ LED_TOGGLE(1);
ReadPprzBuffer();
if (pprz_msg_received) {
pprz_parse_payload();
@@ -74,9 +78,10 @@ static inline void main_periodic_task( void ) {
cnt++;
if (!(cnt%16)) {
LED_TOGGLE(2);
- // uart1_transmit('#');
- // Uart1PrintHex(cnt);
- // uart1_transmit('\n');
+ DOWNLINK_SEND_ANTENNA_STATUS(&ant_track_azim, &ant_track_elev, &ant_track_id, &ant_track_mode);
+ }
+ if (!(cnt%4)) {
+ ant_tracker_update();
}
}
diff --git a/sw/ground_segment/cockpit/Makefile b/sw/ground_segment/cockpit/Makefile
index 7869a61a05..257e519b3f 100644
--- a/sw/ground_segment/cockpit/Makefile
+++ b/sw/ground_segment/cockpit/Makefile
@@ -64,6 +64,17 @@ clean:
rm -f *~* *.cm* *.o *.out *.opt map2d gcs .depend
+
+
+CC = gcc
+CFLAGS=-g -O2 -Wall `pkg-config gtk+-2.0 --cflags`
+LDFLAGS=`pkg-config gtk+-2.0 --libs` -s `pcre-config --libs` -lglibivy
+
+
+ant_track : ant_track.c
+ $(CC) $(CFLAGS) -g -o $@ $^ $(LDFLAGS)
+
+
#
# Dependencies
#
diff --git a/sw/ground_segment/cockpit/ant_track.c b/sw/ground_segment/cockpit/ant_track.c
new file mode 100644
index 0000000000..dd58ad1677
--- /dev/null
+++ b/sw/ground_segment/cockpit/ant_track.c
@@ -0,0 +1,181 @@
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+#define MANUAL 0
+#define AUTO 1
+
+static float azim_sp;
+static float elev_sp;
+static guint id_sp;
+static guint mode;
+
+GtkWidget *azim_scale;
+GtkWidget *elev_scale;
+
+void on_mode_changed (GtkRadioButton *radiobutton, gpointer user_data) {
+
+ mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radiobutton)) ? MANUAL : AUTO;
+ IvySendMsg("1ME RAW_DATALINK 80 SETTING;0;0;%d", mode);
+ g_message("on mode changed %d" , mode);
+}
+
+
+#define GLADE_HOOKUP_OBJECT(component,widget,name) \
+ g_object_set_data_full (G_OBJECT (component), name, \
+ gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)
+
+#define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \
+ g_object_set_data (G_OBJECT (component), name, widget)
+
+
+GtkWidget* build_gui ( void ) {
+ GtkWidget *window1;
+ GtkWidget *vbox1;
+ GtkWidget *vbox2;
+ GtkWidget *table1;
+ GtkWidget *label1;
+ GtkWidget *label2;
+ GtkWidget *label3;
+ GtkWidget *label4;
+ GtkWidget *radiobutton1;
+ GSList *radiobutton1_group = NULL;
+ GtkWidget *radiobutton2;
+ GtkWidget *entry1;
+
+ window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (window1), "tracking antenna");
+
+ vbox1 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (window1), vbox1);
+
+ vbox2 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox2);
+ gtk_box_pack_start (GTK_BOX (vbox1), vbox2, TRUE, TRUE, 0);
+
+ table1 = gtk_table_new (4, 3, FALSE);
+ gtk_widget_show (table1);
+ gtk_box_pack_start (GTK_BOX (vbox2), table1, TRUE, TRUE, 0);
+ gtk_table_set_col_spacings (GTK_TABLE (table1), 5);
+
+ label1 = gtk_label_new ("Azimuth");
+ gtk_widget_show (label1);
+ gtk_table_attach (GTK_TABLE (table1), label1, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label1), 0, 0.5);
+
+ label2 = gtk_label_new ("Elevation");
+ gtk_widget_show (label2);
+ gtk_table_attach (GTK_TABLE (table1), label2, 0, 1, 2, 3,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label2), 0, 0.5);
+
+ label3 = gtk_label_new ("Id");
+ gtk_widget_show (label3);
+ gtk_table_attach (GTK_TABLE (table1), label3, 0, 1, 3, 4,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
+
+ label4 = gtk_label_new ("mode");
+ gtk_widget_show (label4);
+ gtk_table_attach (GTK_TABLE (table1), label4, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5);
+
+ radiobutton1 = gtk_radio_button_new_with_mnemonic (NULL, "manual");
+ gtk_widget_show (radiobutton1);
+ gtk_table_attach (GTK_TABLE (table1), radiobutton1, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton1), radiobutton1_group);
+ radiobutton1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton1));
+
+ radiobutton2 = gtk_radio_button_new_with_mnemonic (NULL, "tracking");
+ gtk_widget_show (radiobutton2);
+ gtk_table_attach (GTK_TABLE (table1), radiobutton2, 2, 3, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_radio_button_set_group (GTK_RADIO_BUTTON (radiobutton2), radiobutton1_group);
+ radiobutton1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radiobutton2));
+
+ azim_scale = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (144.7, 0, 360, 1, 1, 1)));
+ gtk_widget_show (azim_scale);
+ gtk_table_attach (GTK_TABLE (table1), azim_scale, 1, 3, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
+ gtk_range_set_update_policy (GTK_RANGE (azim_scale), GTK_UPDATE_DELAYED);
+
+ elev_scale = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (32.3, 0, 90, 1, 1, 1)));
+ gtk_widget_show (elev_scale);
+ gtk_table_attach (GTK_TABLE (table1), elev_scale, 1, 3, 2, 3,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+ entry1 = gtk_entry_new ();
+ gtk_widget_show (entry1);
+ gtk_table_attach (GTK_TABLE (table1), entry1, 1, 3, 3, 4,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+
+ g_signal_connect ((gpointer) radiobutton1, "toggled",
+ G_CALLBACK (on_mode_changed),
+ NULL);
+
+ /* Store pointers to all widgets, for use by lookup_widget(). */
+ GLADE_HOOKUP_OBJECT_NO_REF (window1, window1, "window1");
+ GLADE_HOOKUP_OBJECT (window1, vbox1, "vbox1");
+ GLADE_HOOKUP_OBJECT (window1, vbox2, "vbox2");
+ GLADE_HOOKUP_OBJECT (window1, table1, "table1");
+ GLADE_HOOKUP_OBJECT (window1, label1, "label1");
+ GLADE_HOOKUP_OBJECT (window1, label2, "label2");
+ GLADE_HOOKUP_OBJECT (window1, label3, "label3");
+ GLADE_HOOKUP_OBJECT (window1, label4, "label4");
+ GLADE_HOOKUP_OBJECT (window1, radiobutton1, "radiobutton1");
+ GLADE_HOOKUP_OBJECT (window1, radiobutton2, "radiobutton2");
+ GLADE_HOOKUP_OBJECT (window1, entry1, "entry1");
+
+ return window1;
+
+
+}
+
+void on_ANTENNA_STATUS(IvyClientPtr app, void *user_data, int argc, char *argv[]){
+ // azim_sp = atof(argv[0]);
+ // elev_sp = atof(argv[1]);
+ // id_sp = atoi(argv[2]);
+ // mode = atoi(argv[3]);
+
+ if (mode == AUTO) {
+ azim_sp = atof(argv[0]);
+ elev_sp = atof(argv[1]);
+ gtk_range_set_value(azim_scale, azim_sp);
+ gtk_range_set_value(elev_scale, elev_sp);
+
+ }
+ g_message("on antenna status %d", mode);
+}
+
+int main (int argc, char** argv) {
+
+ gtk_init(&argc, &argv);
+
+ GtkWidget* window = build_gui();
+ gtk_widget_show_all(window);
+
+ IvyInit ("AntennaTracker", "AntennaTracker READY", NULL, NULL, NULL, NULL);
+ IvyBindMsg(on_ANTENNA_STATUS, NULL, "^\\S* ANTENNA_STATUS (\\S*) (\\S*) (\\S*) (\\S*)");
+ IvyStart("127.255.255.255");
+
+ gtk_main();
+ return 0;
+}