Tested this today. Works with my 240 dives I have by now on the Uemis.

Also the blindly strstr was obvious and an overlook on my side.

The initial object id wasn't from me :-)

So I am happy with my newbie contributions :-)

The code to update selected dives is ready but requires a UI change. I suppose 
you don't want this for 4.5.

G. Lerch


Sonntag, 20. September 2015 06:14 +0200 von Linus Torvalds  
<torva...@linux-foundation.org>:
>
>From: Linus Torvalds < torva...@linux-foundation.org >
>Date: Sat, 19 Sep 2015 21:09:58 -0700
>Subject: [PATCH 2/2] uemis downloader: start downloading using the correct 
>dive ID
>
>The logic to pick the initial dive ID for the uemis downloader was very
>confused, and did not work at all when restarting a download when the
>Uemis filled up, and the "Force download all dives" flag was set.  It
>also required a rather odd Uemis-specific callback from the download UI
>because of how it picked the initial ID.
>
>This changes the logic to just look at the list of downloaded dives when
>restarting, which simplifies the logic a lot, gets rid of the odd
>special callback, and also means that the whole "Force download" issue
>just goes away.  It seems to work now.
>
>Signed-off-by: Linus Torvalds < torva...@linux-foundation.org >
>---
> dive.h                             |  2 +-
> qt-ui/downloadfromdivecomputer.cpp |  8 --------
> uemis-downloader.c                 | 40 +++++++++++++++++++++-----------------
> uemis.h                            |  1 -
> 4 files changed, 23 insertions(+), 28 deletions(-)
>
>diff --git a/dive.h b/dive.h
>index fa95f6721631..4eb44cfc9c8d 100644
>--- a/dive.h
>+++ b/dive.h
>@@ -498,7 +498,7 @@ struct dive_table {
>       struct dive **dives;
> };
> 
>-extern struct dive_table dive_table;
>+extern struct dive_table dive_table, downloadTable;
> extern struct dive displayed_dive;
> extern struct dive_site displayed_dive_site;
> extern int selected_dive;
>diff --git a/qt-ui/downloadfromdivecomputer.cpp 
>b/qt-ui/downloadfromdivecomputer.cpp
>index 7e18dae70baa..1fef9f6bff1e 100644
>--- a/qt-ui/downloadfromdivecomputer.cpp
>+++ b/qt-ui/downloadfromdivecomputer.cpp
>@@ -298,14 +298,6 @@ void 
>DownloadFromDCWidget::on_downloadCancelRetryButton_clicked()
>               diveImportedModel->clearTable();
>               clear_table(&downloadTable);
>       }
>-      if (ui.vendor->currentText() == "Uemis") {
>-              if (currentState == ERROR && downloadTable.nr > 0)
>-                      // let the uemis code know how far we've gotten
>-                      
>uemis_set_max_diveid_from_dialog(downloadTable.dives[downloadTable.nr - 
>1]->dc.diveid);
>-              else
>-                      // fresh download, so only look at what's in the 
>dive_table
>-                      uemis_set_max_diveid_from_dialog(0);
>-      }
>       updateState(DOWNLOADING);
> 
>       // you cannot cancel the dialog, just the download
>diff --git a/uemis-downloader.c b/uemis-downloader.c
>index 70cc3f78d449..3b8ddf900e89 100644
>--- a/uemis-downloader.c
>+++ b/uemis-downloader.c
>@@ -928,23 +928,32 @@ static bool process_raw_buffer(device_data_t *devdata, 
>uint32_t deviceid, char *
>       return true;
> }
> 
>-static int max_diveid_from_dialog;
>-
>-void uemis_set_max_diveid_from_dialog(int diveid)
>-{
>-      max_diveid_from_dialog = diveid;
>-}
>-
>-static char *uemis_get_divenr(char *deviceidstr)
>+static char *uemis_get_divenr(char *deviceidstr, int force)
> {
>       uint32_t deviceid, maxdiveid = 0;
>       int i;
>       char divenr[10];
>-
>+      struct dive_table *table;
>       deviceid = atoi(deviceidstr);
>-      struct dive *d;
>-      for_each_dive (i, d) {
>+
>+      /*
>+       * If we are are retrying after a disconnect/reconnect, we
>+       * will look up the highest dive number in the dives we
>+       * already have.
>+       *
>+       * Also, if "force_download" is true, do this even if we
>+       * don't have any dives (maxdiveid will remain zero)
>+       */
>+      if (force || downloadTable.nr)
>+              table = &downloadTable;
>+      else
>+              table = &dive_table;
>+
>+      for (i = 0; i < table->nr; i++) {
>+              struct dive *d = table->dives[i];
>               struct divecomputer *dc;
>+              if (!d)
>+                      continue;
>               for_each_dc (d, dc) {
>                       if (dc->model && !strcmp(dc->model, "Uemis Zurich") &&
>                           (dc->deviceid == 0 || dc->deviceid == 0x7fffffff || 
>dc->deviceid == deviceid) &&
>@@ -952,7 +961,7 @@ static char *uemis_get_divenr(char *deviceidstr)
>                               maxdiveid = dc->diveid;
>               }
>       }
>-      snprintf(divenr, 10, "%d", maxdiveid > max_diveid_from_dialog ? 
>maxdiveid : max_diveid_from_dialog);
>+      snprintf(divenr, 10, "%d", maxdiveid);
>       return strdup(divenr);
> }
> 
>@@ -1215,12 +1224,7 @@ const char *do_uemis_import(device_data_t *data)
>               goto bail;
> 
>       param_buff[1] = "notempty";
>-      /* if we force it we start downloading from the first dive on the Uemis;
>-       *  otherwise check which was the last dive downloaded */
>-      if (!force_download)
>-              newmax = uemis_get_divenr(deviceid);
>-      else
>-              newmax = strdup("0");
>+      newmax = uemis_get_divenr(deviceid, force_download);
> 
>       first = start = atoi(newmax);
>       dive_to_read = first;
>diff --git a/uemis.h b/uemis.h
>index 90ae99028799..5f32fe76c0af 100644
>--- a/uemis.h
>+++ b/uemis.h
>@@ -16,7 +16,6 @@ void uemis_parse_divelog_binary(char *base64, void *divep);
> int uemis_get_weight_unit(int diveid);
> void uemis_mark_divelocation(int diveid, int divespot, uint32_t 
>dive_site_uuid);
> void uemis_set_divelocation(int divespot, char *text, double longitude, 
>double latitude);
>-void uemis_set_max_diveid_from_dialog(int diveid);
> int uemis_get_divespot_id_by_diveid(uint32_t diveid);
> 
> typedef struct
>-- 
>2.6.0.rc1.16.g1962994
>
_______________________________________________
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to