#define CH1_PASS 201 //digital outputs
#define CH1_FAIL 202
#define CH1_DONE 88
#define CH1_READY 89
#define CH2_PASS 42
#define CH2_FAIL 46
#define CH2_DONE 45
#define CH2_READY 39
#define CH1_START 1 //digital inputs
#define CH1_STOP 11
#define CH1_MB1 91
#define CH1_MB2 175
#define CH1_MB3 51
#define CH1_MB4 93
#define CH1_MB5 166
#define CH1_MB6 128
#define CH2_START 50
#define CH2_STOP 15
#define CH2_MB1 12
#define CH2_MB2 43
#define CH2_MB3 53
#define CH2_MB4 36
#define CH2_MB5 52
#define CH2_MB6 55
#include<gtk/gtk.h>
#include"libsoc_gpio.h"
#include"libsoc_debug.h"
#include <gdk-pixbuf/gdk-pixbuf.h>
struct dig_input
{
GtkWidget *image;
GdkPixbuf *buf;
}di;
GtkWidget *mainWindow;
GtkBuilder *builder;
GtkWidget *fixed;
GtkWidget *DO_switch[8];
GtkWidget *DI_indication[16];
GdkPixbuf *DI_colourGREEN;
GdkPixbuf *DI_colourRED;
GdkRGBA color;
gpio *do_ch1_p,*do_ch1_f,*do_ch1_d,do_ch1_r; //ch1 Digital output
gpiodi_ch1_s, *di_ch1_st, *di_ch1_mb1, *di_ch1_mb2,*di_ch1_mb3, *di_ch1_mb4,*di_ch1_mb5,*di_ch1_mb6; //ch1 Digital input
gpio *do_ch2_p,*do_ch2_f,*do_ch2_d,*do_ch2_r; //ch2 Digital output
gpio *di_ch2_s,*di_ch2_st,*di_ch2_mb1,*di_ch2_mb2,*di_ch2_mb3, *di_ch2_mb4,*di_ch2_mb5,*di_ch2_mb6; //ch2 Digital input
void diagnosis_screen_init(); //screen widget init
void *diag_loop(void *dummy); //thread while loop
void update_uii(void *digg); //to update image
void DIO_init(); //gpio pins init
int main(int argc, char* argv)
{
pthread_t thread;
GError *error=NULL;
gtk_init(&argc,&argv);
builder = gtk_builder_new();
int f=gtk_builder_add_from_file(builder, “/home/root/diag.ui”, &error);
if (f == 0)
{
g_printerr(“Error loading file: %s\n”, error->message);
g_clear_error(&error);
return 0;
}
diagnosis_screen_init();
DIO_init();
mainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(mainWindow,1024, 600);
gtk_window_set_position(GTK_WINDOW(mainWindow),GTK_WIN_POS_CENTER_ALWAYS);
gtk_window_set_resizable(GTK_WINDOW(mainWindow), false);
gtk_window_set_decorated(GTK_WINDOW(mainWindow), false);
gtk_container_add(GTK_CONTAINER(mainWindow),fixed);
gdk_rgba_parse(&color, “#171515”);
gtk_widget_override_background_color(mainWindow, GTK_STATE_FLAG_NORMAL,&color);
gtk_widget_show_all(mainWindow);
pthread_create(&thread,NULL,diag_loop,NULL);
gtk_main();
return 0;
}
void DIO_init() //input and output pin initializations
{
//Digital outputs
do_ch1_p=libsoc_gpio_request(CH1_PASS,LS_GPIO_SHARED); //for ch1
do_ch1_f=libsoc_gpio_request(CH1_FAIL,LS_GPIO_SHARED);
do_ch1_d=libsoc_gpio_request(CH1_DONE,LS_GPIO_SHARED);
do_ch1_r=libsoc_gpio_request(CH1_READY,LS_GPIO_SHARED);
do_ch2_p=libsoc_gpio_request(CH2_PASS,LS_GPIO_SHARED); //for ch2
do_ch2_f=libsoc_gpio_request(CH2_FAIL,LS_GPIO_SHARED);
do_ch2_d=libsoc_gpio_request(CH2_DONE,LS_GPIO_SHARED);
do_ch2_r=libsoc_gpio_request(CH2_READY,LS_GPIO_SHARED);
if (do_ch1_p == NULL || do_ch1_f == NULL || do_ch1_d == NULL || do_ch1_r == NULL || do_ch2_p == NULL || do_ch2_f == NULL || do_ch2_d == NULL || do_ch2_r == NULL)
{
printf(“error while gpio set request for DO\n”);
return;
}
libsoc_gpio_set_direction(do_ch1_p,OUTPUT); //to set direction as o/p
libsoc_gpio_set_direction(do_ch1_f,OUTPUT);
libsoc_gpio_set_direction(do_ch1_d,OUTPUT);
libsoc_gpio_set_direction(do_ch1_r,OUTPUT);
libsoc_gpio_set_direction(do_ch2_p,OUTPUT);
libsoc_gpio_set_direction(do_ch2_f,OUTPUT);
libsoc_gpio_set_direction(do_ch2_d,OUTPUT);
libsoc_gpio_set_direction(do_ch2_r,OUTPUT);
//Digital inputs
di_ch1_s=libsoc_gpio_request(CH1_START,LS_GPIO_SHARED); //for ch1
di_ch1_st=libsoc_gpio_request(CH1_STOP,LS_GPIO_SHARED);
di_ch1_mb1=libsoc_gpio_request(CH1_MB1,LS_GPIO_SHARED);
di_ch1_mb2=libsoc_gpio_request(CH1_MB2,LS_GPIO_SHARED);
di_ch1_mb3=libsoc_gpio_request(CH1_MB3,LS_GPIO_SHARED);
di_ch1_mb4=libsoc_gpio_request(CH1_MB4,LS_GPIO_SHARED);
di_ch1_mb5=libsoc_gpio_request(CH1_MB5,LS_GPIO_SHARED);
di_ch1_mb6=libsoc_gpio_request(CH1_MB6,LS_GPIO_SHARED);
if(di_ch1_s==NULL || di_ch1_st==NULL || di_ch1_mb1==NULL || di_ch1_mb2==NULL || di_ch1_mb3==NULL || di_ch1_mb4==NULL || di_ch1_mb5==NULL || di_ch1_mb6==NULL)
{
printf(“error while setting digital inputs for ch1\n”);
return;
}
libsoc_gpio_set_direction(di_ch1_s,INPUT);
libsoc_gpio_set_direction(di_ch1_st,INPUT);
libsoc_gpio_set_direction(di_ch1_mb1,INPUT);
libsoc_gpio_set_direction(di_ch1_mb2,INPUT);
libsoc_gpio_set_direction(di_ch1_mb3,INPUT);
libsoc_gpio_set_direction(di_ch1_mb4,INPUT);
libsoc_gpio_set_direction(di_ch1_mb5,INPUT);
libsoc_gpio_set_direction(di_ch1_mb6,INPUT);
libsoc_gpio_set_edge(di_ch1_s, BOTH);
libsoc_gpio_set_edge(di_ch1_st, BOTH);
libsoc_gpio_set_edge(di_ch1_mb1, BOTH);
libsoc_gpio_set_edge(di_ch1_mb2, BOTH);
libsoc_gpio_set_edge(di_ch1_mb3, BOTH);
libsoc_gpio_set_edge(di_ch1_mb4, BOTH);
libsoc_gpio_set_edge(di_ch1_mb5, BOTH);
libsoc_gpio_set_edge(di_ch1_mb6, BOTH);
di_ch2_s=libsoc_gpio_request(CH2_START,LS_GPIO_SHARED); //for ch2
di_ch2_st=libsoc_gpio_request(CH2_STOP,LS_GPIO_SHARED);
di_ch2_mb1=libsoc_gpio_request(CH2_MB1,LS_GPIO_SHARED);
di_ch2_mb2=libsoc_gpio_request(CH2_MB2,LS_GPIO_SHARED);
di_ch2_mb3=libsoc_gpio_request(CH2_MB3,LS_GPIO_SHARED);
di_ch2_mb4=libsoc_gpio_request(CH2_MB4,LS_GPIO_SHARED);
di_ch2_mb5=libsoc_gpio_request(CH2_MB5,LS_GPIO_SHARED);
di_ch2_mb6=libsoc_gpio_request(CH2_MB6,LS_GPIO_SHARED);
if(di_ch2_s==NULL || di_ch2_st==NULL || di_ch2_mb1==NULL || di_ch2_mb2==NULL || di_ch2_mb3==NULL || di_ch2_mb4==NULL || di_ch2_mb5==NULL || di_ch2_mb6==NULL)
{
printf(“error while setting digital inputs for ch2\n”);
return;
}
libsoc_gpio_set_direction(di_ch2_s,INPUT); //to set direction as i/p for ch2
libsoc_gpio_set_direction(di_ch2_st,INPUT);
libsoc_gpio_set_direction(di_ch2_mb1,INPUT);
libsoc_gpio_set_direction(di_ch2_mb2,INPUT);
libsoc_gpio_set_direction(di_ch2_mb3,INPUT);
libsoc_gpio_set_direction(di_ch2_mb4,INPUT);
libsoc_gpio_set_direction(di_ch2_mb5,INPUT);
libsoc_gpio_set_direction(di_ch2_mb6,INPUT);
libsoc_gpio_set_edge(di_ch2_s, BOTH); //to set interrupt edge for ch2
libsoc_gpio_set_edge(di_ch2_st, BOTH);
libsoc_gpio_set_edge(di_ch2_mb1, BOTH);
libsoc_gpio_set_edge(di_ch2_mb2, BOTH);
libsoc_gpio_set_edge(di_ch2_mb3, BOTH);
libsoc_gpio_set_edge(di_ch2_mb4, BOTH);
libsoc_gpio_set_edge(di_ch2_mb5, BOTH);
libsoc_gpio_set_edge(di_ch2_mb6, BOTH);
}
void diagnosis_screen_init() //initialization of this screen widgets
{
char indication[16][16]={“DI1_indication”,“DI2_indication”,“DI3_indication”,“DI4_indication”,“DI5_indication”,“DI6_indication”,“DI7_indication”,“DI8_indication”,“DI9_indication”,“DI10_indication”,“DI11_indication”,“DI12_indication”,“DI13_indication”,“DI14_indication”,“DI15_indication”,“DI16_indication”};
char DOswitch[8][11]={“DO1_switch”,“DO2_switch”,“DO3_switch”,“DO4_switch”,“DO5_switch”,“DO6_switch”,“DO7_switch”,“DO8_switch”};
fixed = GTK_WIDGET(gtk_builder_get_object(builder, “diagnosis_screen_fixed”));
for(int i=0;i<16;i++)
{
if(i<8)
{
DO_switch[i]=GTK_WIDGET(gtk_builder_get_object(builder, DOswitch[i])); //for dig. output
}
DI_indication[i] = GTK_WIDGET(gtk_builder_get_object(builder,indication[i])); //for dig. input
}
DI_colourGREEN=gdk_pixbuf_new_from_file(“/home/root/Project/green_btn.png”,NULL);
DI_colourRED=gdk_pixbuf_new_from_file(“/home/root/Project/red_btn.png”,NULL);
}
void *diag_loop(void *dummy)
{
bool do_val[8],di_val[16];
gpio *dig_op[8],*dig_ip[16];
dig_op[0]=do_ch1_p; dig_op[1]=do_ch1_f; dig_op[2]=do_ch1_d; dig_op[3]=do_ch1_r;
dig_op[4]=do_ch2_p; dig_op[5]=do_ch2_f; dig_op[6]=do_ch2_d; dig_op[7]=do_ch2_r;
dig_ip[0]=di_ch1_s; dig_ip[1]=di_ch1_st; dig_ip[2]=di_ch1_mb1; dig_ip[3]=di_ch1_mb2; dig_ip[4]=di_ch1_mb3; dig_ip[5]=di_ch1_mb4; dig_ip[6]=di_ch1_mb5; dig_ip[7]=di_ch1_mb6;
dig_ip[8]=di_ch2_s; dig_ip[9]=di_ch2_st; dig_ip[10]=di_ch2_mb1; dig_ip[11]=di_ch2_mb2; dig_ip[12]=di_ch2_mb3; dig_ip[13]=di_ch2_mb4; dig_ip[14]=di_ch2_mb5; dig_ip[15]=di_ch2_mb6;
struct dig_input di[16];
di[0].image=DI_indication[0];
di[1].image=DI_indication[1];
di[2].image=DI_indication[2];
di[3].image=DI_indication[3];
di[4].image=DI_indication[4];
di[5].image=DI_indication[5];
di[6].image=DI_indication[6];
di[7].image=DI_indication[7];
di[8].image=DI_indication[8];
di[9].image=DI_indication[9];
di[10].image=DI_indication[10];
di[11].image=DI_indication[11];
di[12].image=DI_indication[12];
di[13].image=DI_indication[13];
di[14].image=DI_indication[14];
di[15].image=DI_indication[15];
for(int i=0;i<16;i++)
{
if(i<8)
{
do_val[i]=gtk_switch_get_active(GTK_SWITCH(DO_switch[i]));
if(do_val[i]==0) { libsoc_gpio_set_level(dig_op[i],LOW); }
else { libsoc_gpio_set_level(dig_op[i],HIGH); }
}
di_val[i]=libsoc_gpio_get_level(dig_ip[i]);
if(di_val[i]==HIGH) { gtk_image_set_from_pixbuf(GTK_IMAGE(DI_indication[i]),DI_colourGREEN); }
else { gtk_image_set_from_pixbuf(GTK_IMAGE(DI_indication[i]),DI_colourRED); }
}
while(1)
{
//for Digital output
usleep(1000);
for(int i=0;i<16;i++)
{
if(i<8)
{
if(do_val[i]!=gtk_switch_get_active(GTK_SWITCH(DO_switch[i])))
{
do_val[i]=gtk_switch_get_active(GTK_SWITCH(DO_switch[i]));
if(do_val[i]==0) { libsoc_gpio_set_level(dig_op[i],LOW); }
else { libsoc_gpio_set_level(dig_op[i],HIGH); }
}
}
//for Digital input
gpio_level level=libsoc_gpio_get_level(dig_ip[i]);
if(di_val[i]!=level) //if input level changed, set the pixbuf in structure as per level and pass to update function
{
di_val[i]=level;
if(di_val[i]==HIGH) { di[i].buf=DI_colourGREEN; }
else { di[i].buf=DI_colourRED; }
g_idle_add((GSourceFunc)update_uii,&di[i]);
}
}
}
}
void update_uii(void *digg) //func to change image
{
struct dig_input di_pin=(struct dig_input)digg;
gtk_image_set_from_pixbuf(GTK_IMAGE(di_pin->image),di_pin->buf);
}