0
votes

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);

1

1 Answers

0
votes

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);