Kaffeautomat Kaffeautomat - 1 month ago 8
C Question

Gtk: Gtk-CRITICAL **:gtk_spin_button_get_value_as_int: assertion 'GTK_IS_SPIN_BUTTON (spin_button)' failed

The GUI itself starts up normal. Everytime a Button is pressed a function is called which speaks to DAC's over SPI. The Error appears if a Button is pressed and the function

gtk_spin_button_get_value_as_int()
returns 0.
But the Button itself works.

The Error message:


Gtk-CRITICAL **:gtk_spin_button_get_value_as_int: assertion 'GTK_IS_SPIN_BUTTON (spin_button)'


Here is my sourcecode:

#include<stdio.h>
#include<wiringPi.h>
#include<gtk/gtk.h>

#define SPAM 1

#define SPIDELAY 500


#define CPLDSPEED 500000
#define DACSPEED 500000


GtkWidget *g_lbl_hello;
GtkWidget *g_lbl_count;
GtkWidget *spin1,*spin2,*spin3,*spin4,*spin5;
int channel1,dac1=0;
int channel2,dac2=0;
int channel3,dac3=0;
int channel4,dac4=0;
int dac5=0;

//Konvertierung der Adresse zum Sendeformat
char createAdress(int channel,int dac){
char aout;
int test;
test=(channel*16)+dac;
aout=(channel*16)+dac;
printf("\n\nAdeDEC:%i\n",test);
printf("Adresse:Fx%0x\n\n",aout);
return aout;
}

//Kovertierung des DACWertes zum Sendeformmat
char *createValue(short dacvalue){

static char vout[1];
vout[1]=dacvalue & 0xFF;
vout[0]=dacvalue>>8;
printf("\n\nWert:Fx%02x%02x\n\n",vout[0],vout[1]);
return vout;
}

void write_dac(int value,int dac,int channel){
//Sendeformat der Adresse
unsigned char a[0];
printf("Schalte CS für DAC%i%i LOW\n",channel,dac);
a[0]=createAdress(channel,dac);
wiringPiSPIDataRW(0,a,1);


printf("Schreibe Wert %hu auf den DAC%i%i",value,channel,dac);
wiringPiSPIDataRW(1,createValue(value),2);

printf("Schalte CS für DAC%i%i HIGH\n",channel,dac);
a[0]=0x00;
wiringPiSPIDataRW(0,a,1);

}


int main(int argc, char *argv[]){

//Sendeformat des DAC-Wertes
unsigned char *v;

//Zwischenspeicher für die Daten
unsigned short value;
int channel,dac, spilocj=0;
//SPI Setup
wiringPiSetup();
//Kommunikation mit CPLD wird eingerichtet
if (wiringPiSPISetup(0,CPLDSPEED)==-1)
{
printf("Du hast was falsch gemacht beim CPLDSPI\n");
}

//Kommunikation mit DAC wird eingerichtet
if (wiringPiSPISetup(1,DACSPEED)==-1)
{
printf("Du hast was falsch gemacht beim DACSPI\n");
}


GtkBuilder *builder;
GtkWidget *window;

gtk_init(&argc, &argv);

builder = gtk_builder_new();
gtk_builder_add_from_file (builder, "Testgui.glade", NULL);

window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
gtk_builder_connect_signals(builder, NULL);

g_object_unref(builder);

gtk_widget_show(window);
gtk_main();

return 0;
}

void prg_dac1(){
write_dac(gtk_spin_button_get_value_as_int(spin1),1,2);
}

void prg_dac2(){
write_dac(gtk_spin_button_get_value_as_int(spin2),2,2);
}

void prg_dac3(){
write_dac(gtk_spin_button_get_value_as_int(spin3),3,2);
}

void prg_dac4(){
write_dac(gtk_spin_button_get_value_as_int(spin4),4,2);
}

void prg_dac5(){
write_dac(gtk_spin_button_get_value_as_int(spin5),5,2);
}


And here is my Gladeproject saved as GtkBuilder file:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkAdjustment" id="dacwerte1">
<property name="upper">65535</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkAdjustment" id="dacwerte2">
<property name="upper">65535</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkAdjustment" id="dacwerte3">
<property name="upper">65535</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkAdjustment" id="dacwerte4">
<property name="upper">65535</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkAdjustment" id="dacwerte5">
<property name="upper">65535</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<child>
<object class="GtkGrid" id="grid2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">DAC2</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">DAC3</property>
</object>
<packing>
<property name="left_attach">2</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">DAC4</property>
</object>
<packing>
<property name="left_attach">3</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label8">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">DAC5</property>
</object>
<packing>
<property name="left_attach">4</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="prg_dac1" swapped="no"/>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button2">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="prg_dac2" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button3">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="prg_dac3" swapped="no"/>
</object>
<packing>
<property name="left_attach">2</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button4">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="prg_dac4" swapped="no"/>
</object>
<packing>
<property name="left_attach">3</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button5">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="prg_dac5" swapped="no"/>
</object>
<packing>
<property name="left_attach">4</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkToolbar" id="toolbar1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="toolbar_style">icons</property>
<property name="icon_size">10</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
<property name="width">5</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="DAC">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">DAC1</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spin1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">5</property>
<property name="invisible_char">●</property>
<property name="activates_default">True</property>
<property name="width_chars">10</property>
<property name="invisible_char_set">True</property>
<property name="adjustment">dacwerte1</property>
<property name="climb_rate">1</property>
<property name="update_policy">if-valid</property>
<signal name="editing-done" handler="set_dac1" swapped="no"/>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spin5">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">5</property>
<property name="invisible_char">●</property>
<property name="width_chars">10</property>
<property name="invisible_char_set">True</property>
<property name="adjustment">dacwerte5</property>
<property name="climb_rate">0.02</property>
<property name="numeric">True</property>
</object>
<packing>
<property name="left_attach">4</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spin4">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">5</property>
<property name="invisible_char">●</property>
<property name="width_chars">10</property>
<property name="invisible_char_set">True</property>
<property name="adjustment">dacwerte4</property>
<signal name="editing-done" handler="set_dac4" swapped="no"/>
</object>
<packing>
<property name="left_attach">3</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spin3">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">5</property>
<property name="invisible_char">●</property>
<property name="width_chars">10</property>
<property name="invisible_char_set">True</property>
<property name="adjustment">dacwerte3</property>
<property name="update_policy">if-valid</property>
<signal name="editing-done" handler="set_dac3" swapped="no"/>
</object>
<packing>
<property name="left_attach">2</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spin2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="max_length">5</property>
<property name="invisible_char">●</property>
<property name="width_chars">10</property>
<property name="invisible_char_set">True</property>
<property name="input_purpose">number</property>
<property name="adjustment">dacwerte2</property>
<property name="wrap">True</property>
<signal name="editing-done" handler="set_dac2" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkWindowGroup" id="windowgroup1"/>
</interface>


In addation I get a compilation warning about the datatypes regarding the
GtkWidget
pointers
spin1
etc. . But changing the datatype to the appropriate one
GtkSpinButton
does not help either.


main.c: In function ‘prg_dac1’: main.c:116:45: warning: passing
argument 1 of ‘gtk_spin_button_get_value_as_int’ from incompatible
pointer type write_dac(gtk_spin_button_get_value_as_int(spin1),1,2);
^ In file included from /usr/include/gtk-3.0/gtk/gtk.h:185:0,
from main.c:4: /usr/include/gtk-3.0/gtk/gtkspinbutton.h:194:7: note: expected ‘struct
GtkSpinButton *’ but argument is of type ‘struct GtkWidget *’ gint
gtk_spin_button_get_value_as_int (GtkSpinButton *spin_button);

Answer

You never assign spin1, etc. to the objects in the Glade file. Look at gtk_builder_get_object().

To get rid of the type warnings, use an explicit conversion at the call sites and keep the variable types as GtkWidget. GTK+ provides special macros that you can use:

    write_dac(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin1)),1,2);
Comments