1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
/*
* $Id: network_cable_gui_gtk.c,v 1.5 2009-07-13 09:08:55 sand Exp $
*
* Copyright (C) 2003-2009 FAUmachine Team <info@faumachine.org>.
* This program is free software. You can redistribute it and/or modify it
* under the terms of the GNU General Public License, either version 2 of
* the License, or (at your option) any later version. See COPYING.
*/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include "system.h"
#include "glue-gui.h"
#include "glue-gui-gtk.h"
#include "glue-gui-gtk-fi.h"
#include "sig_integer.h"
#include "network_cable_gui_gtk.h"
#define COMP "network_cable"
struct cpssp {
GtkWidget *fi_dialog;
unsigned int comp_id;
unsigned int fault_packet_loss_sigid;
struct sig_integer *fault_packet_loss;
};
/*
* Simulator Callbacks
*/
/*
* GUI Callbacks
*/
static void
network_cable_gui_gtk_packet_loss_event(
GtkWidget *w,
gpointer _fault,
gpointer _cpssp
)
{
struct fault {
unsigned int state;
const char *loc0[4];
const char *loc1[4];
} *fault = _fault;
struct cpssp *cpssp = _cpssp;
sig_integer_set(cpssp->fault_packet_loss, cpssp, fault->state);
free(fault);
}
void *
network_cable_gui_gtk_create(
unsigned int page,
const char *name,
struct sig_manage *manage,
struct sig_eth *port_end0,
struct sig_eth *port_end1
)
{
struct cpssp *cpssp;
char path[1024];
GtkWidget *w;
cpssp = malloc(sizeof(*cpssp));
assert(cpssp);
system_name_push(name);
cpssp->comp_id = system_comp_lookup(name);
cpssp->fi_dialog = gtk_vbox_new(FALSE, 1);
w = gui_gtk_fi_new("Packet Loss", "Percentage");
g_signal_connect(G_OBJECT(w), "fi-change",
G_CALLBACK(network_cable_gui_gtk_packet_loss_event),
cpssp);
gtk_widget_show(w);
gtk_box_pack_start(GTK_BOX(cpssp->fi_dialog), w, FALSE, FALSE, 1);
gui_gtk_comp_add(page, COMP, name, NULL,
FALSE, FALSE, cpssp->fi_dialog);
/* Fault Signals */
snprintf(path, sizeof(path)-1, "%s:packet_loss", system_path());
path[sizeof(path)-1] = '\0';
cpssp->fault_packet_loss_sigid = system_sig_create("integer", path);
assert(0 <= cpssp->fault_packet_loss_sigid);
system_comp_connect(cpssp->comp_id, "packet_loss",
cpssp->fault_packet_loss_sigid);
cpssp->fault_packet_loss = system_sig_get(cpssp->fault_packet_loss_sigid);
system_name_pop();
return cpssp;
}
void
network_cable_gui_gtk_destroy(void *_cpssp)
{
struct cpssp *cpssp = _cpssp;
system_comp_disconnect(cpssp->comp_id, "packet_loss");
system_sig_unget(cpssp->fault_packet_loss);
system_sig_destroy(cpssp->fault_packet_loss_sigid);
free(cpssp);
}
|