]> Pileus Git - aweather/blobdiff - src/plugins/level2.c
Fix pointer/loading bugs in RadarSite hiding
[aweather] / src / plugins / level2.c
index 3fa7d4e627628b260b41f7851afe76d2c8171813..180aea33bad9e23eb22cda902799f6c6eaefbb5c 100644 (file)
@@ -74,7 +74,6 @@ static void _load_sweep_gl(Sweep *sweep, AWeatherColormap *colormap, guint *tex)
        int height, width;
        guint8 *data;
        _bscan_sweep(sweep, colormap, &data, &width, &height);
-       glGenTextures(1, tex);
        glBindTexture(GL_TEXTURE_2D, *tex);
        glPixelStorei(GL_PACK_ALIGNMENT, 1);
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
@@ -121,11 +120,11 @@ static gboolean _decompress_radar(const gchar *file, const gchar *raw)
 /*********************
  * Drawing functions *
  *********************/
-static gpointer _draw_radar(GisCallback *_self, gpointer _viewer)
+static void _draw_radar(GisCallback *_self, gpointer _viewer)
 {
        AWeatherLevel2 *self = AWEATHER_LEVEL2(_self);
        if (!self->sweep || !self->sweep_tex)
-               return NULL;
+               return;
 
        /* Draw wsr88d */
        Sweep *sweep = self->sweep;
@@ -145,7 +144,6 @@ static gpointer _draw_radar(GisCallback *_self, gpointer _viewer)
 
        /* Draw the rays */
        glBindTexture(GL_TEXTURE_2D, self->sweep_tex);
-       g_message("Tex = %d", self->sweep_tex);
        glBegin(GL_TRIANGLE_STRIP);
        for (int ri = 0; ri <= sweep->h.nrays; ri++) {
                Ray  *ray = NULL;
@@ -186,8 +184,6 @@ static gpointer _draw_radar(GisCallback *_self, gpointer _viewer)
        //glTexCoord2d( 1.,  1.); glVertex3f( 0.,   500., 3.); // top right
        //glTexCoord2d( 1.,  0.); glVertex3f( 0.,     0., 3.); // bot right
        //glEnd();
-
-       return NULL;
 }
 
 
@@ -198,10 +194,11 @@ static gboolean _set_sweep_cb(gpointer _self)
 {
        g_debug("AWeatherLevel2: _set_sweep_cb");
        AWeatherLevel2 *self = _self;
-       if (self->sweep_tex)
-               glDeleteTextures(1, &self->sweep_tex);
+       if (!self->sweep_tex)
+                glGenTextures(1, &self->sweep_tex);
        _load_sweep_gl(self->sweep, self->sweep_colors, &self->sweep_tex);
        gtk_widget_queue_draw(GTK_WIDGET(self->viewer));
+       g_object_unref(self);
        return FALSE;
 }
 void aweather_level2_set_sweep(AWeatherLevel2 *self,
@@ -223,13 +220,14 @@ void aweather_level2_set_sweep(AWeatherLevel2 *self,
        if (!self->sweep_colors) return;
 
        /* Load data */
+       g_object_ref(self);
        g_idle_add(_set_sweep_cb, self);
 }
 
 AWeatherLevel2 *aweather_level2_new(GisViewer *viewer,
                AWeatherColormap *colormap, Radar *radar)
 {
-       g_debug("AWeatherLevel2: new");
+       g_debug("AWeatherLevel2: new - %s", radar->h.radar_name);
        AWeatherLevel2 *self = g_object_new(AWEATHER_TYPE_LEVEL2, NULL);
        self->viewer   = viewer;
        self->radar    = radar;
@@ -250,7 +248,7 @@ AWeatherLevel2 *aweather_level2_new_from_file(GisViewer *viewer,
                struct stat files, raws;
                g_stat(file, &files);
                g_stat(raw,  &raws);
-               if (files.st_mtime < raws.st_mtime)
+               if (files.st_mtime > raws.st_mtime)
                        if (!_decompress_radar(file, raw))
                                return NULL;
        } else {
@@ -260,7 +258,9 @@ AWeatherLevel2 *aweather_level2_new_from_file(GisViewer *viewer,
 
        /* Load the radar file */
        RSL_read_these_sweeps("all", NULL);
+       g_message("read start");
        Radar *radar = RSL_wsr88d_to_radar(raw, (gchar*)site);
+       g_message("read done");
        g_free(raw);
        if (!radar)
                return NULL;
@@ -268,6 +268,91 @@ AWeatherLevel2 *aweather_level2_new_from_file(GisViewer *viewer,
        return aweather_level2_new(viewer, colormaps, radar);
 }
 
+static void _on_sweep_clicked(GtkRadioButton *button, gpointer _level2)
+{
+       AWeatherLevel2 *level2 = _level2;
+       gint type = (gint)g_object_get_data(G_OBJECT(button), "type");
+       gint elev = (gint)g_object_get_data(G_OBJECT(button), "elev");
+       aweather_level2_set_sweep(level2, type, (float)elev/100);
+       //self->colormap = level2->sweep_colors;
+}
+
+GtkWidget *aweather_level2_get_config(AWeatherLevel2 *level2)
+{
+       Radar *radar = level2->radar;
+       g_debug("AWeatherLevel2: get_config - %p, %p", level2, radar);
+       /* Clear existing items */
+       gdouble elev;
+       guint rows = 1, cols = 1, cur_cols;
+       gchar row_label_str[64], col_label_str[64], button_str[64];
+       GtkWidget *row_label, *col_label, *button = NULL, *elev_box = NULL;
+       GtkWidget *table = gtk_table_new(rows, cols, FALSE);
+
+       /* Add date */
+       gchar *date_str = g_strdup_printf("<b><i>%04d-%02d-%02d %02d:%02d</i></b>",
+                       radar->h.year, radar->h.month, radar->h.day,
+                       radar->h.hour, radar->h.minute);
+       GtkWidget *date_label = gtk_label_new(date_str);
+       gtk_label_set_use_markup(GTK_LABEL(date_label), TRUE);
+       gtk_table_attach(GTK_TABLE(table), date_label,
+                       0,1, 0,1, GTK_FILL,GTK_FILL, 5,0);
+       g_free(date_str);
+
+       for (guint vi = 0; vi < radar->h.nvolumes; vi++) {
+               Volume *vol = radar->v[vi];
+               if (vol == NULL) continue;
+               rows++; cols = 1; elev = 0;
+
+               /* Row label */
+               g_snprintf(row_label_str, 64, "<b>%s:</b>", vol->h.type_str);
+               row_label = gtk_label_new(row_label_str);
+               gtk_label_set_use_markup(GTK_LABEL(row_label), TRUE);
+               gtk_misc_set_alignment(GTK_MISC(row_label), 1, 0.5);
+               gtk_table_attach(GTK_TABLE(table), row_label,
+                               0,1, rows-1,rows, GTK_FILL,GTK_FILL, 5,0);
+
+               for (guint si = 0; si < vol->h.nsweeps; si++) {
+                       Sweep *sweep = vol->sweep[si];
+                       if (sweep == NULL || sweep->h.elev == 0) continue;
+                       if (sweep->h.elev != elev) {
+                               cols++;
+                               elev = sweep->h.elev;
+
+                               /* Column label */
+                               g_object_get(table, "n-columns", &cur_cols, NULL);
+                               if (cols >  cur_cols) {
+                                       g_snprintf(col_label_str, 64, "<b>%.2f°</b>", elev);
+                                       col_label = gtk_label_new(col_label_str);
+                                       gtk_label_set_use_markup(GTK_LABEL(col_label), TRUE);
+                                       gtk_widget_set_size_request(col_label, 50, -1);
+                                       gtk_table_attach(GTK_TABLE(table), col_label,
+                                                       cols-1,cols, 0,1, GTK_FILL,GTK_FILL, 0,0);
+                               }
+
+                               elev_box = gtk_hbox_new(TRUE, 0);
+                               gtk_table_attach(GTK_TABLE(table), elev_box,
+                                               cols-1,cols, rows-1,rows, GTK_FILL,GTK_FILL, 0,0);
+                       }
+
+
+                       /* Button */
+                       g_snprintf(button_str, 64, "%3.2f", elev);
+                       button = gtk_radio_button_new_with_label_from_widget(
+                                       GTK_RADIO_BUTTON(button), button_str);
+                       gtk_widget_set_size_request(button, -1, 26);
+                       //button = gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(button));
+                       //gtk_widget_set_size_request(button, -1, 22);
+                       g_object_set(button, "draw-indicator", FALSE, NULL);
+                       gtk_box_pack_end(GTK_BOX(elev_box), button, TRUE, TRUE, 0);
+
+                       g_object_set_data(G_OBJECT(button), "level2", (gpointer)level2);
+                       g_object_set_data(G_OBJECT(button), "type",   (gpointer)vi);
+                       g_object_set_data(G_OBJECT(button), "elev",   (gpointer)(int)(elev*100));
+                       g_signal_connect(button, "clicked", G_CALLBACK(_on_sweep_clicked), level2);
+               }
+       }
+       return table;
+}
 
 /****************
  * GObject code *
@@ -278,8 +363,22 @@ static void aweather_level2_init(AWeatherLevel2 *self)
        GIS_CALLBACK(self)->callback  = _draw_radar;
        GIS_CALLBACK(self)->user_data = self;
 }
-
+static void aweather_level2_dispose(GObject *_self)
+{
+       g_debug("AWeatherLevel2: dispose - %p", _self);
+       G_OBJECT_CLASS(aweather_level2_parent_class)->dispose(_self);
+}
+static void aweather_level2_finalize(GObject *_self)
+{
+       AWeatherLevel2 *self = AWEATHER_LEVEL2(_self);
+       g_debug("AWeatherLevel2: finalize - %p", _self);
+       RSL_free_radar(self->radar);
+       if (self->sweep_tex)
+               glDeleteTextures(1, &self->sweep_tex);
+       G_OBJECT_CLASS(aweather_level2_parent_class)->finalize(_self);
+}
 static void aweather_level2_class_init(AWeatherLevel2Class *klass)
 {
+       G_OBJECT_CLASS(klass)->finalize = aweather_level2_finalize;
+       G_OBJECT_CLASS(klass)->dispose  = aweather_level2_dispose;
 }
-