From 9cb60c910681b0fb3c04d22c77bcf9c2754bfa7f Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Mon, 12 Sep 2011 09:19:21 -0700 Subject: [PATCH] Start some very initial libdivecomputer integration Ok, so this is quite broken right now: it doesn't actually really *do* anything, and it now requires that you have libdivecomputer all set up and installed. That is fairly easy: mkdir ../src cd ../src git clone git://libdivecomputer.git.sourceforge.net/gitroot/libdivecomputer/libdivecomputer cd libdivecomputer autoreconf --install ./configure make sudo make install but you may feel that this is not exactly useful considering that nothing actually *works* yet. Some day. Signed-off-by: Linus Torvalds --- Makefile | 15 +++- display.h | 2 + libdivecomputer.c | 213 ++++++++++++++++++++++++++++++++++++++++++++++ main.c | 5 +- 4 files changed, 232 insertions(+), 3 deletions(-) create mode 100644 libdivecomputer.c diff --git a/Makefile b/Makefile index 787a74f..7e04f8f 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,18 @@ CC=gcc CFLAGS=-Wall -Wno-pointer-sign -g -OBJS=main.o dive.o profile.o info.o equipment.o divelist.o parse-xml.o save-xml.o +LIBDIVECOMPUTERDIR = /usr/local +LIBDIVECOMPUTERINCLUDES = $(LIBDIVECOMPUTERDIR)/include/libdivecomputer +LIBDIVECOMPUTERARCHIVE = $(LIBDIVECOMPUTERDIR)/lib/libdivecomputer.a + +OBJS = main.o dive.o profile.o info.o equipment.o divelist.o \ + parse-xml.o save-xml.o libdivecomputer.o divelog: $(OBJS) $(CC) $(LDFLAGS) -o divelog $(OBJS) \ `xml2-config --libs` \ - `pkg-config --libs gtk+-2.0 glib-2.0 gconf-2.0` + `pkg-config --libs gtk+-2.0 glib-2.0 gconf-2.0` \ + $(LIBDIVECOMPUTERARCHIVE) parse-xml.o: parse-xml.c dive.h $(CC) $(CFLAGS) `pkg-config --cflags glib-2.0` -c `xml2-config --cflags` parse-xml.c @@ -32,3 +38,8 @@ equipment.o: equipment.c dive.h display.h divelist.h divelist.o: divelist.c dive.h display.h divelist.h $(CC) $(CFLAGS) `pkg-config --cflags gtk+-2.0 glib-2.0` -c divelist.c + +libdivecomputer.o: libdivecomputer.c dive.h display.h + $(CC) $(CFLAGS) `pkg-config --cflags gtk+-2.0 glib-2.0` \ + -I$(LIBDIVECOMPUTERINCLUDES) \ + -c libdivecomputer.c diff --git a/display.h b/display.h index 5e6a390..4b2e83b 100644 --- a/display.h +++ b/display.h @@ -7,6 +7,8 @@ extern GtkWidget *main_window; +extern void import_dialog(GtkWidget *, gpointer); + extern GtkWidget *dive_profile_widget(void); extern GtkWidget *dive_info_frame(void); extern GtkWidget *extended_dive_info_widget(void); diff --git a/libdivecomputer.c b/libdivecomputer.c new file mode 100644 index 0000000..b9850b3 --- /dev/null +++ b/libdivecomputer.c @@ -0,0 +1,213 @@ +#include +#include + +#include "display.h" + +/* libdivecomputer */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static device_status_t device_open(const char *devname, + device_type_t type, + device_t **device) +{ + switch (type) { + case DEVICE_TYPE_SUUNTO_SOLUTION: + return suunto_solution_device_open(device, devname); + + case DEVICE_TYPE_SUUNTO_EON: + return suunto_eon_device_open(device, devname); + + case DEVICE_TYPE_SUUNTO_VYPER: + return suunto_vyper_device_open(device, devname); + + case DEVICE_TYPE_SUUNTO_VYPER2: + return suunto_vyper2_device_open(device, devname); + + case DEVICE_TYPE_SUUNTO_D9: + return suunto_d9_device_open(device, devname); + + case DEVICE_TYPE_UWATEC_ALADIN: + return uwatec_aladin_device_open(device, devname); + + case DEVICE_TYPE_UWATEC_MEMOMOUSE: + return uwatec_memomouse_device_open(device, devname); + + case DEVICE_TYPE_UWATEC_SMART: + return uwatec_smart_device_open(device); + + case DEVICE_TYPE_REEFNET_SENSUS: + return reefnet_sensus_device_open(device, devname); + + case DEVICE_TYPE_REEFNET_SENSUSPRO: + return reefnet_sensuspro_device_open(device, devname); + + case DEVICE_TYPE_REEFNET_SENSUSULTRA: + return reefnet_sensusultra_device_open(device, devname); + + case DEVICE_TYPE_OCEANIC_VTPRO: + return oceanic_vtpro_device_open(device, devname); + + case DEVICE_TYPE_OCEANIC_VEO250: + return oceanic_veo250_device_open(device, devname); + + case DEVICE_TYPE_OCEANIC_ATOM2: + return oceanic_atom2_device_open(device, devname); + + case DEVICE_TYPE_MARES_NEMO: + return mares_nemo_device_open(device, devname); + + case DEVICE_TYPE_MARES_PUCK: + return mares_puck_device_open(device, devname); + + case DEVICE_TYPE_MARES_ICONHD: + return mares_iconhd_device_open(device, devname); + + case DEVICE_TYPE_HW_OSTC: + return hw_ostc_device_open(device, devname); + + case DEVICE_TYPE_CRESSI_EDY: + return cressi_edy_device_open(device, devname); + + case DEVICE_TYPE_ZEAGLE_N2ITION3: + return zeagle_n2ition3_device_open(device, devname); + + case DEVICE_TYPE_ATOMICS_COBALT: + return atomics_cobalt_device_open(device); + + default: + return DEVICE_STATUS_ERROR; + } +} + +static void do_import(const char *computer, device_type_t type) +{ + /* FIXME! Needs user input! */ + const char *devname = "/dev/ttyUSB0"; + device_t *device = NULL; + device_status_t rc; + + rc = device_open(devname, type, &device); + printf("rc=%d\n", rc); + if (rc != DEVICE_STATUS_SUCCESS) + return; +} + +/* + * Taken from 'example.c' in libdivecomputer. + * + * I really wish there was some way to just have + * libdivecomputer tell us what devices it supports, + * rather than have the application have to know.. + */ +struct device_list { + const char *name; + device_type_t type; +} device_list[] = { + { "Suunto Solution", DEVICE_TYPE_SUUNTO_SOLUTION }, + { "Suunto Eon", DEVICE_TYPE_SUUNTO_EON }, + { "Suunto Vyper", DEVICE_TYPE_SUUNTO_VYPER }, + { "Suunto Vyper Air", DEVICE_TYPE_SUUNTO_VYPER2 }, + { "Suunto D9", DEVICE_TYPE_SUUNTO_D9 }, + { "Uwatec Aladin", DEVICE_TYPE_UWATEC_ALADIN }, + { "Uwatec Memo Mouse", DEVICE_TYPE_UWATEC_MEMOMOUSE }, + { "Uwatec Smart", DEVICE_TYPE_UWATEC_SMART }, + { "ReefNet Sensus", DEVICE_TYPE_REEFNET_SENSUS }, + { "ReefNet Sensus Pro", DEVICE_TYPE_REEFNET_SENSUSPRO }, + { "ReefNet Sensus Ultra",DEVICE_TYPE_REEFNET_SENSUSULTRA }, + { "Oceanic VT Pro", DEVICE_TYPE_OCEANIC_VTPRO }, + { "Oceanic Veo250", DEVICE_TYPE_OCEANIC_VEO250 }, + { "Oceanic Atom 2", DEVICE_TYPE_OCEANIC_ATOM2 }, + { "Mares Nemo", DEVICE_TYPE_MARES_NEMO }, + { "Mares Puck", DEVICE_TYPE_MARES_PUCK }, + { "Mares Icon HD", DEVICE_TYPE_MARES_ICONHD }, + { "OSTC", DEVICE_TYPE_HW_OSTC }, + { "Cressi Edy", DEVICE_TYPE_CRESSI_EDY }, + { "Zeagle N2iTiON 3", DEVICE_TYPE_ZEAGLE_N2ITION3 }, + { "Atomics Cobalt", DEVICE_TYPE_ATOMICS_COBALT }, + { NULL } +}; + +static void fill_computer_list(GtkListStore *store) +{ + GtkTreeIter iter; + struct device_list *list = device_list; + + for (list = device_list ; list->name ; list++) { + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, + 0, list->name, + 1, list->type, + -1); + } +} + +static GtkComboBox *dive_computer_selector(GtkWidget *dialog) +{ + GtkWidget *hbox, *combo_box; + GtkListStore *model; + GtkCellRenderer *renderer; + + hbox = gtk_hbox_new(FALSE, 6); + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), hbox); + + model = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT); + fill_computer_list(model); + + combo_box = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model)); + gtk_box_pack_start(GTK_BOX(hbox), combo_box, FALSE, TRUE, 3); + + renderer = gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo_box), renderer, TRUE); + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo_box), renderer, "text", 0, NULL); + + return GTK_COMBO_BOX(combo_box); +} + +void import_dialog(GtkWidget *w, gpointer data) +{ + int result; + GtkWidget *dialog; + GtkComboBox *computer; + + dialog = gtk_dialog_new_with_buttons("Import from dive computer", + GTK_WINDOW(main_window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + NULL); + + computer = dive_computer_selector(dialog); + + gtk_widget_show_all(dialog); + result = gtk_dialog_run(GTK_DIALOG(dialog)); + switch (result) { + int type; + GtkTreeIter iter; + GtkTreeModel *model; + const char *comp; + case GTK_RESPONSE_ACCEPT: + if (!gtk_combo_box_get_active_iter(computer, &iter)) + break; + model = gtk_combo_box_get_model(computer); + gtk_tree_model_get(model, &iter, + 0, &comp, + 1, &type, + -1); + do_import(comp, type); + break; + default: + break; + } + gtk_widget_destroy(dialog); +} + diff --git a/main.c b/main.c index 367d3ad..ab2948e 100644 --- a/main.c +++ b/main.c @@ -367,6 +367,7 @@ static GtkActionEntry menu_items[] = { { "FileMenuAction", GTK_STOCK_FILE, "Log", NULL, NULL, NULL}, { "OpenFile", GTK_STOCK_OPEN, NULL, "O", NULL, G_CALLBACK(file_open) }, { "SaveFile", GTK_STOCK_SAVE, NULL, "S", NULL, G_CALLBACK(file_save) }, + { "Import", NULL, "Import", NULL, NULL, G_CALLBACK(import_dialog) }, { "Units", NULL, "Units", NULL, NULL, G_CALLBACK(unit_dialog) }, { "Renumber", NULL, "Renumber", NULL, NULL, G_CALLBACK(renumber_dialog) }, { "Quit", GTK_STOCK_QUIT, NULL, "Q", NULL, G_CALLBACK(quit) }, @@ -380,9 +381,11 @@ static const gchar* ui_string = " \ \ \ \ + \ + \ \ \ - \ + \ \ \ \ -- 2.45.2