]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Merge branch 'uemis-integration' of git://github.com/dirkhh/subsurface
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 3 Oct 2011 19:13:54 +0000 (12:13 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 3 Oct 2011 19:13:54 +0000 (12:13 -0700)
* 'uemis-integration' of git://github.com/dirkhh/subsurface:
  Remove the ability to 'Import' .SDA files
  Integrate loading of uemis SDA files into the regular xml parsing
  First steps towards integrating SDA files into the default XML loading

1  2 
gtk-gui.c
uemis.c

diff --combined gtk-gui.c
index 8ae67ecaa6bcf3ad445b2a52be889a9dfd7716a3,002b804148cb977a10d79a45138b96d1ce8f4799..ee3ad2ef11583109f80254007757833970e34fe5
+++ b/gtk-gui.c
@@@ -103,6 -103,8 +103,8 @@@ static void file_open(GtkWidget *w, gpo
        filter = gtk_file_filter_new();
        gtk_file_filter_add_pattern(filter, "*.xml");
        gtk_file_filter_add_pattern(filter, "*.XML");
+       gtk_file_filter_add_pattern(filter, "*.sda");
+       gtk_file_filter_add_pattern(filter, "*.SDA");
        gtk_file_filter_add_mime_type(filter, "text/xml");
        gtk_file_filter_set_name(filter, "XML file");
        gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);
@@@ -203,42 -205,6 +205,42 @@@ static void quit(GtkWidget *w, gpointe
        gtk_main_quit();
  }
  
 +GtkTreeViewColumn *tree_view_column(GtkWidget *tree_view, int index, const char *title,
 +                              data_func_t data_func, PangoAlignment align, gboolean visible)
 +{
 +      GtkCellRenderer *renderer;
 +      GtkTreeViewColumn *col;
 +      double xalign = 0.0; /* left as default */
 +
 +      renderer = gtk_cell_renderer_text_new();
 +      col = gtk_tree_view_column_new();
 +
 +      gtk_tree_view_column_set_title(col, title);
 +      gtk_tree_view_column_set_sort_column_id(col, index);
 +      gtk_tree_view_column_set_resizable(col, TRUE);
 +      gtk_tree_view_column_pack_start(col, renderer, TRUE);
 +      if (data_func)
 +              gtk_tree_view_column_set_cell_data_func(col, renderer, data_func, (void *)(long)index, NULL);
 +      else
 +              gtk_tree_view_column_add_attribute(col, renderer, "text", index);
 +      gtk_object_set(GTK_OBJECT(renderer), "alignment", align, NULL);
 +      switch (align) {
 +      case PANGO_ALIGN_LEFT:
 +              xalign = 0.0;
 +              break;
 +      case PANGO_ALIGN_CENTER:
 +              xalign = 0.5;
 +              break;
 +      case PANGO_ALIGN_RIGHT:
 +              xalign = 1.0;
 +              break;
 +      }
 +      gtk_cell_renderer_set_alignment(GTK_CELL_RENDERER(renderer), xalign, 0.5);
 +      gtk_tree_view_column_set_visible(col, visible);
 +      gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), col);
 +      return col;
 +}
 +
  static void create_radio(GtkWidget *vbox, const char *name, ...)
  {
        va_list args;
@@@ -668,46 -634,6 +670,6 @@@ void run_ui(void
        gtk_main();
  }
  
- /* get the filenames the user selects and call the parsing function
-  * on them
-  * return 0 if the user cancelled the dialog
-  */
- int open_import_file_dialog(char *filterpattern, char *filtertext, 
-                       void(* parse_function)(char *))
- {
-       int ret=0;
-       GtkWidget *dialog;
-       GtkFileFilter *filter = gtk_file_filter_new ();
-       gtk_file_filter_add_pattern (filter, filterpattern);
-       gtk_file_filter_set_name(filter, filtertext);
-       dialog = gtk_file_chooser_dialog_new("Open File",
-                                       GTK_WINDOW(main_window),
-                                       GTK_FILE_CHOOSER_ACTION_OPEN,
-                                       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                       GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
-                                       NULL);
-       gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE);
-       gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter);
-       if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
-               GSList *filenames;
-               char *filename;
-               filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog));
-               while(filenames != NULL) {
-                       filename = (char *)filenames->data;
-                       parse_function(filename);
-                       g_free(filename);
-                       filenames = g_slist_next(filenames);
-               }
-               g_slist_free(filenames);
-               ret = 1;
-       }
-       gtk_widget_destroy(dialog);
-       return ret;
- }
  static gboolean expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
  {
        struct dive *dive = current_dive;
diff --combined uemis.c
index 76bd1669b4217a8f05306874a9a0c1b6dcfae71e,1be48f33ed3b17a91b31fd61c01c523034b812f9..46878e22a89c0632ad0be203f41ea3bbbcc8bfda
+++ b/uemis.c
@@@ -73,64 -73,6 +73,6 @@@ static void decode( uint8_t *inbuf, uin
  }
  /* end code from Bob Trower */
  
- /* small helper functions */
- /* simpleregex allocates (and reallocates) the found buffer
-  * don't forget to free it when you are done
-  */
- static int simpleregex(char *buffer, char *regex, char **found) {
-       int status;
-       regex_t re;
-       regmatch_t match[5];
-       if (regcomp(&re, regex, 0) !=0) {
-               fprintf(stderr,"internal error, regex failed!\n");
-               exit(1);
-       }
-       status = regexec(&re,buffer,5,match,0);
-       if(status == 0) {
-               *found = realloc(*found,match[1].rm_eo-match[1].rm_so + 1);
-               strncpy(*found,buffer+match[1].rm_so,match[1].rm_eo-match[1].rm_so);
-               (*found)[match[1].rm_eo-match[1].rm_so] = '\0';
-       }
-       return(status == 0);
- }
- /* read in line of arbitrary length (important for SDA files that can
-  * have lines that are tens of kB long
-  * don't forget to free it when you are done
-  */
- #define MYGETL_INCR 1024
- static char * mygetline(FILE * f) {
-       size_t size = 0;
-       size_t len  = 0;
-       char * buf  = NULL;
-       do {
-               size += MYGETL_INCR;
-               if ((buf = realloc(buf,size)) == NULL)
-                       break;
-               fgets(buf+len,MYGETL_INCR,f);
-               len = strlen(buf);
-       } while (!feof(f) && buf[len-1]!='\n');
-       return buf;
- }
- /* text matching, used to build very poor man's XML parser */
- int matchit(FILE *infd, char *regex, char *typeregex, char **found) {
-       char *buffer;
-       while (!feof(infd)) {
-               buffer = mygetline(infd);
-               if (buffer && simpleregex(buffer,regex,found)) {
-                       buffer = mygetline(infd);
-                       if (buffer && simpleregex(buffer,typeregex,found)) {
-                               return 1;
-                       }
-               }
-       }
-       return 0;
- }
  /*
   * pressure_to_depth: In centibar. And when converting to
   * depth, I'm just going to always use saltwater, because I
@@@ -180,11 -122,12 +122,12 @@@ bail
  /*
   * parse uemis base64 data blob into struct dive
   */
static void parse_divelog_binary(char *base64, struct dive **divep) {
void uemis_parse_divelog_binary(char *base64, void *datap) {
        int datalen;
        int i;
        uint8_t *data;
        struct sample *sample;
+       struct dive **divep = datap;
        struct dive *dive = *divep;
        int template, gasoffset;
  
                gasoffset = 4;
        for (i = 0; i < template; i++) {
                float volume = *(float *)(data+116+25*(gasoffset + i)) * 1000.0;
 -              /* uemis always assumes a working pressure of 3000psi / 206bar - even though that's wrong */
 -              /* I also think that the unit that it stores (cuft for me) might change with SDA settings */
 -              // dive->cylinder[i].type.size.mliter = volume * 206.84 / 28.317;
 -              dive->cylinder[i].type.size.mliter = volume * 200 / 28.317;
 +              /* uemis always assumes a working pressure of 202.6bar (!?!?) - I first thought
 +               * it was 3000psi, but testing against all my dives gets me that strange number.
 +               * Still, that's of course completely bogus and shows they don't get how
 +               * cylinders are named in non-metric parts of the world...
 +               * we store the incorrect working pressure to get the SAC calculations "close"
 +               * but the user will have to correct this manually
 +               */
 +              dive->cylinder[i].type.size.mliter = volume;
 +              dive->cylinder[i].type.workingpressure.mbar = 202600;
                dive->cylinder[i].gasmix.o2.permille = *(uint8_t *)(data+120+25*(gasoffset + i)) * 10 + 0.5;
                dive->cylinder[i].gasmix.he.permille = 0;
        }
        dive->duration.seconds = sample->time.seconds - 1;
        return;
  }
- /* parse a single file
-  * TODO: we don't report any errors when the parse fails - we simply don't add them to the list
-  */
- void
- parse_uemis_file(char *divelogfilename) {
-       char *found=NULL;
-       struct tm tm;
-       struct dive *dive;
-       FILE *divelogfile = fopen(divelogfilename,"r");
-       dive = alloc_dive();
-       if (! matchit(divelogfile,"val key=\"date\"","<ts>\\([^<]*\\)</ts>",&found)) {
-               /* some error handling */
-               goto bail;
-       }
-       strptime(found, "%Y-%m-%dT%H:%M:%S", &tm);
-       dive->when = utc_mktime(&tm);
-       if (! matchit(divelogfile,"<val key=\"duration\">",
-                       "<float>\\([0-9.]*\\)</float>", &found)) {
-               /* some error handling */
-               goto bail;
-       }
-       dive->duration.seconds = 60.0 * atof(found);
-       if (! matchit(divelogfile,"<val key=\"depth\">",
-                       "<int>\\([0-9.]*\\)</int>", &found)) {
-               /* some error handling */
-               goto bail;
-       }
-       dive->maxdepth.mm = pressure_to_depth(atoi(found));
-       if (! matchit(divelogfile,"<val key=\"file_content\">",
-                       ">\\([a-zA-Z0-9+/=]*\\)<", &found)) {
-               /* some error handling */
-               goto bail;
-       }
-       parse_divelog_binary(found,&dive);
-       record_dive(dive);
- bail:
-       if (found)
-               free(found);
- }
- /*
-  * parse the two files extracted from the SDA
-  */
- void
- uemis_import() {
-       if (open_import_file_dialog("*.SDA","uemis Zurich SDA files",
-                                       &parse_uemis_file))
-               report_dives();
- }