]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Start some very initial libdivecomputer integration
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 12 Sep 2011 16:19:21 +0000 (09:19 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 12 Sep 2011 16:27:01 +0000 (09:27 -0700)
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 <torvalds@linux-foundation.org>
Makefile
display.h
libdivecomputer.c [new file with mode: 0644]
main.c

index 787a74feefa7d59799be666b3314f0d3c566abe2..7e04f8f179a44c2a894bdd8fd44a89d38c635e7c 100644 (file)
--- 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
index 5e6a390632efbabdfc61e5ee9a39a4143c515fd4..4b2e83b494d6f08780a17ee114aaf401ba7379ef 100644 (file)
--- 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 (file)
index 0000000..b9850b3
--- /dev/null
@@ -0,0 +1,213 @@
+#include <stdio.h>
+#include <gtk/gtk.h>
+
+#include "display.h"
+
+/* libdivecomputer */
+#include <device.h>
+#include <suunto.h>
+#include <reefnet.h>
+#include <uwatec.h>
+#include <oceanic.h>
+#include <mares.h>
+#include <hw.h>
+#include <cressi.h>
+#include <zeagle.h>
+#include <atomics.h>
+#include <utils.h>
+
+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 367d3ada4e54912ab868926dc5fc7a28a0c43389..ab2948e46ba67962abedb59507aae3f613dfea00 100644 (file)
--- 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,   "<control>O", NULL, G_CALLBACK(file_open) },
        { "SaveFile",       GTK_STOCK_SAVE, NULL,   "<control>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,   "<control>Q", NULL, G_CALLBACK(quit) },
@@ -380,9 +381,11 @@ static const gchar* ui_string = " \
                                <menuitem name=\"Open\" action=\"OpenFile\" /> \
                                <menuitem name=\"Save\" action=\"SaveFile\" /> \
                                <separator name=\"Separator1\"/> \
+                               <menuitem name=\"Import\" action=\"Import\" /> \
+                               <separator name=\"Separator2\"/> \
                                <menuitem name=\"Units\" action=\"Units\" /> \
                                <menuitem name=\"Renumber\" action=\"Renumber\" /> \
-                               <separator name=\"Separator2\"/> \
+                               <separator name=\"Separator3\"/> \
                                <menuitem name=\"Quit\" action=\"Quit\" /> \
                        </menu> \
                </menubar> \