UEMIS Patch fixing alternating dive details

Guido Lerch guido.lerch at gmail.com
Thu Sep 17 07:51:33 PDT 2015


I hope this works nor for you too, Dirk.

-- 
Best regards,
Guido
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.subsurface-divelog.org/pipermail/subsurface/attachments/20150917/4d56d852/attachment-0001.html>
-------------- next part --------------
From cd5c20831b006fcb5da6397301026ac056fa949d Mon Sep 17 00:00:00 2001
From: glerch <guido.lerch at gmail.com>
Date: Thu, 17 Sep 2015 16:46:02 +0200
Subject: [PATCH 7/7] UEMIS-fix alternating dive details

Implemented suggestion from Dir on how to deal with dive details
not being found.

I also cleaned up some unused variables, got rid of the last_log_file_nr
because it's not needed anymore.

I kept the UEMIS_DEBUG flags active on purpose.

One thing ins question I still need to check and this is whether we really
need to decrease the dive_to_read if we find deleted dive details, this is
still in but I dont think it's really needed.

Signed-off-by: glerch <guido.lerch at gmail.com>
---
 uemis-downloader.c | 51 ++++++++++++++++++++++++++-------------------------
 1 file changed, 26 insertions(+), 25 deletions(-)

diff --git a/uemis-downloader.c b/uemis-downloader.c
index 0981f4b..43bda9b 100644
--- a/uemis-downloader.c
+++ b/uemis-downloader.c
@@ -31,7 +31,7 @@
 #define NUM_PARAM_BUFS 10
 
 // debugging setup
-// #define UEMIS_DEBUG 1 + 2 + 4 + 8 + 16 + 32
+#define UEMIS_DEBUG 1 + 2 + 4
 
 #define UEMIS_MAX_FILES 4000
 #define UEMIS_MEM_FULL 1
@@ -69,6 +69,7 @@ static int mbuf_size = 0;
 
 static int max_mem_used = -1;
 static int next_table_index = 0;
+static int dive_to_read = 0;
 
 /* helper function to parse the Uemis data structures */
 static void uemis_ts(char *buffer, void *_when)
@@ -367,7 +368,7 @@ static void buffer_add(char **buffer, int *buffer_size, char *buf)
 		*buffer = realloc(*buffer, *buffer_size);
 		strcat(*buffer, buf);
 	}
-#if UEMIS_DEBUG & 16
+#if UEMIS_DEBUG & 8
 	fprintf(debugfile, "added \"%s\" to buffer - new length %d\n", buf, *buffer_size);
 #endif
 }
@@ -435,7 +436,7 @@ static void show_progress(char *buf, const char *what)
 	char *val = first_object_id_val(buf);
 	if (val) {
 /* let the user know what we are working on */
-#if UEMIS_DEBUG & 16
+#if UEMIS_DEBUG & 8
 		fprintf(debugfile, "reading %s\n %s\n %s\n", what, val, buf);
 #endif
 		uemis_info(translate("gettextFromC", "%s %s"), what, val);
@@ -789,7 +790,7 @@ static bool process_raw_buffer(device_data_t *devdata, uint32_t deviceid, char *
 	struct dive *dive = NULL;
 	char dive_no[10];
 
-#if UEMIS_DEBUG & 4
+#if UEMIS_DEBUG & 8
 	fprintf(debugfile, "p_r_b %s\n", inbuf);
 #endif
 	if (for_dive)
@@ -1085,18 +1086,19 @@ static void get_uemis_divespot(const char *mountpath, int divespot_id, struct di
 	}
 }
 
-static bool get_matching_dive(int idx, int *dive_to_read, int *last_found_log_file_nr, int *deleted_files, char *newmax, int *uemis_mem_status, struct device_data_t *data, const char* mountpath, const char deviceidnr)
+static bool get_matching_dive(int idx, char *newmax, int *uemis_mem_status, struct device_data_t *data, const char* mountpath, const char deviceidnr)
 {
 	struct dive *dive = data->download_table->dives[idx];
 	char log_file_no_to_find[20];
 	char dive_to_read_buf[10];
 	bool found = false;
+	int deleted_files = 0;
 
 	snprintf(log_file_no_to_find, sizeof(log_file_no_to_find), "logfilenr{int{%d", dive->dc.diveid);
 	while (!found) {
 		if (import_thread_cancelled)
 			break;
-		snprintf(dive_to_read_buf, sizeof(dive_to_read_buf), "%d", *dive_to_read);
+		snprintf(dive_to_read_buf, sizeof(dive_to_read_buf), "%d", dive_to_read);
 		param_buff[2] = dive_to_read_buf;
 		(void)uemis_get_answer(mountpath, "getDive", 3, 0, NULL);
 #if UEMIS_DEBUG & 16
@@ -1122,9 +1124,8 @@ static bool get_matching_dive(int idx, int *dive_to_read, int *last_found_log_fi
 						 * UEMIS unfortunately deletes dives by deleting the dive details and not the logs. */
 #if UEMIS_DEBUG & 2
 						d_time = get_dive_date_c_string(dive->when);
-						fprintf(debugfile, "Matching divelog id %d from %s with dive details %d\n", dive->dc.diveid, d_time, *dive_to_read);
+						fprintf(debugfile, "Matching divelog id %d from %s with dive details %d\n", dive->dc.diveid, d_time, dive_to_read);
 #endif
-						*last_found_log_file_nr = *dive_to_read;
 						int divespot_id = uemis_get_divespot_id_by_diveid(dive->dc.diveid);
 						get_uemis_divespot(mountpath, divespot_id, dive);
 
@@ -1132,26 +1133,28 @@ static bool get_matching_dive(int idx, int *dive_to_read, int *last_found_log_fi
 						/* in this case we found a deleted file, so let's increment */
 #if UEMIS_DEBUG & 2
 						d_time = get_dive_date_c_string(dive->when);
-						fprintf(debugfile, "TRY matching divelog id %d from %s with dive details %d but details are deleted\n", dive->dc.diveid, d_time, *dive_to_read);
+						fprintf(debugfile, "TRY matching divelog id %d from %s with dive details %d but details are deleted\n", dive->dc.diveid, d_time, dive_to_read);
 #endif
-						*deleted_files = *deleted_files + 1;
+						deleted_files++;
 						/* mark this log entry as deleted and cleanup later, otherwise we mess up our array */
 						dive->downloaded = false;
 #if UEMIS_DEBUG & 2
 						fprintf(debugfile, "Deleted dive from %s, with id %d from table\n", d_time, dive->dc.diveid);
 #endif
 					}
-					return true;
 				} else {
-					/* Ugly, need something better than this
-					 * essentially, if we start reading divelogs not from the start
-					 * we have no idea on how many log entries are there that have no
-					 * valid dive details */
-					if (*dive_to_read >= dive->dc.diveid)
-						*dive_to_read = (*dive_to_read - 2 >= 0 ? *dive_to_read - 2 : 0);
+					uint32_t nr_found = 0;
+					char *logfilenr = strstr(mbuf, "logfilenr");
+					if (logfilenr) {
+						sscanf(logfilenr, "logfilenr{int{%u", &nr_found);
+						if (nr_found >= dive->dc.diveid)
+							dive_to_read = dive_to_read - 2;
+						if (dive_to_read < -1)
+							dive_to_read = -1;
+					}
 				}
 			}
-			*dive_to_read = *dive_to_read + 1;
+			dive_to_read++;
 		} else {
 			/* At this point the memory of the UEMIS is full, let's cleanup all divelog files were
 			 * we could not match the details to. */
@@ -1161,8 +1164,8 @@ static bool get_matching_dive(int idx, int *dive_to_read, int *last_found_log_fi
 	}
 	/* decrement iDiveToRead by the amount of deleted entries found to assure
 	 * we are not missing any valid matches when processing subsequent logs */
-	*dive_to_read = (dive_to_read - deleted_files > 0 ? dive_to_read - deleted_files : 0);
-	*deleted_files = 0;
+	dive_to_read = (dive_to_read - deleted_files > 0 ? dive_to_read - deleted_files : 0);
+	deleted_files = 0;
 	return true;
 }
 
@@ -1177,8 +1180,6 @@ const char *do_uemis_import(device_data_t *data)
 	const char *result = NULL;
 	char *endptr;
 	bool success, keep_number = false, once = true;
-	int deleted_files = 0;
-	int last_found_log_file_nr = 0;
 	int match_dive_and_log = 0;
 	int uemis_mem_status = UEMIS_MEM_OK;
 
@@ -1188,6 +1189,7 @@ const char *do_uemis_import(device_data_t *data)
 #endif
 	if (dive_table.nr == 0)
 		keep_number = true;
+
 	uemis_info(translate("gettextFromC", "Initialise communication"));
 	if (!uemis_init(mountpath)) {
 		free(reqtxt_path);
@@ -1220,7 +1222,7 @@ const char *do_uemis_import(device_data_t *data)
 		newmax = strdup("0");
 
 	first = start = atoi(newmax);
-
+	dive_to_read = first;
 	for (;;) {
 #if UEMIS_DEBUG & 2
 		debug_round++;
@@ -1269,9 +1271,8 @@ const char *do_uemis_import(device_data_t *data)
 			 * What the following part does is to optimize the mapping by using
 			 * dive_to_read = the dive deatils entry that need to be read using the object_id
 			 * logFileNoToFind = map the logfilenr of the dive details with the object_id = diveid from the get dive logs */
-			int dive_to_read = (last_found_log_file_nr > 0 ? last_found_log_file_nr + 1 : start);
 			for (int i = match_dive_and_log; i < data->download_table->nr; i++) {
-				bool success  = get_matching_dive(i, &dive_to_read, &last_found_log_file_nr, &deleted_files, newmax, &uemis_mem_status, data, mountpath, deviceidnr);
+				bool success  = get_matching_dive(i, newmax, &uemis_mem_status, data, mountpath, deviceidnr);
 				if (!success)
 					break;
 				if (import_thread_cancelled)
-- 
1.9.5 (Apple Git-50.3)



More information about the subsurface mailing list