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; +}