From ea1f8be62bfc931b18df91edcb5ddb42330e3887 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Tue, 23 May 2006 22:07:37 +0000 Subject: [PATCH] Net module meets shelf :) -Removed graphs (they ate memory for lunch). -Added led-type gradient indicators in place of graph. -Added mouse-over send and recieve values. It may not be 100% perfect yet, but it won't crash E. Users will need to remove any old module.net.cfg file they have before running. SVN revision: 22854 --- Makefile.am | 6 +- e_mod_config.c | 71 ++-- e_mod_config.h | 11 - e_mod_main.c | 984 ++++++++++++++++++++---------------------------- e_mod_main.h | 59 +-- module.eap | Bin 0 -> 5783 bytes module_icon.png | Bin 3765 -> 4193 bytes net.edc | 550 ++++++++++++++++++++------- rx_00.png | Bin 0 -> 99 bytes rx_01.png | Bin 0 -> 375 bytes rx_02.png | Bin 0 -> 526 bytes rx_03.png | Bin 0 -> 651 bytes rx_04.png | Bin 0 -> 743 bytes rx_05.png | Bin 0 -> 862 bytes rx_06.png | Bin 0 -> 974 bytes rx_07.png | Bin 0 -> 1087 bytes rx_08.png | Bin 0 -> 1208 bytes rx_09.png | Bin 0 -> 1295 bytes rx_10.png | Bin 0 -> 1381 bytes tx_00.png | Bin 0 -> 99 bytes tx_01.png | Bin 0 -> 533 bytes tx_02.png | Bin 0 -> 812 bytes tx_03.png | Bin 0 -> 1021 bytes tx_04.png | Bin 0 -> 1226 bytes tx_05.png | Bin 0 -> 1452 bytes tx_06.png | Bin 0 -> 1679 bytes tx_07.png | Bin 0 -> 1887 bytes tx_08.png | Bin 0 -> 2096 bytes tx_09.png | Bin 0 -> 2272 bytes tx_10.png | Bin 0 -> 2409 bytes 30 files changed, 853 insertions(+), 828 deletions(-) delete mode 100644 e_mod_config.h create mode 100644 module.eap create mode 100644 rx_00.png create mode 100644 rx_01.png create mode 100644 rx_02.png create mode 100644 rx_03.png create mode 100644 rx_04.png create mode 100644 rx_05.png create mode 100644 rx_06.png create mode 100644 rx_07.png create mode 100644 rx_08.png create mode 100644 rx_09.png create mode 100644 rx_10.png create mode 100644 tx_00.png create mode 100644 tx_01.png create mode 100644 tx_02.png create mode 100644 tx_03.png create mode 100644 tx_04.png create mode 100644 tx_05.png create mode 100644 tx_06.png create mode 100644 tx_07.png create mode 100644 tx_08.png create mode 100644 tx_09.png create mode 100644 tx_10.png diff --git a/Makefile.am b/Makefile.am index 8993eaf..0cbb5d4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -10,6 +10,7 @@ filesdir = $(datadir) files_DATA = \ module_icon.png \ +module.eap \ net.edj \ net.edc \ VeraMono.ttf @@ -24,9 +25,8 @@ pkgdir = $(datadir)/$(MODULE_ARCH) pkg_LTLIBRARIES = module.la module_la_SOURCES = e_mod_main.c \ e_mod_main.h \ - e_mod_config.c \ - e_mod_config.h - + e_mod_config.c + module_la_LIBADD = @e_libs@ -lm module_la_LDFLAGS = -module -avoid-version module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/e_mod_config.c b/e_mod_config.c index 2a45930..47aed14 100644 --- a/e_mod_config.c +++ b/e_mod_config.c @@ -1,14 +1,11 @@ #include +#include #include "e_mod_main.h" -#include "e_mod_config.h" -#include "config.h" struct _E_Config_Dialog_Data { char *device; - int check_interval; - int show_text; - int show_graph; + double poll_time; Ecore_List *devs; int dev_num; @@ -19,15 +16,16 @@ static void *_create_data(E_Config_Dialog *cfd); static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); -static void _fill_data(Net_Face *nf, E_Config_Dialog_Data *cfdata); +static void _fill_data(Config_Item *ci, E_Config_Dialog_Data *cfdata); static void _net_config_get_devices(Ecore_List *devs); /* Config Calls */ void -_configure_net_module(Net_Face *nf) +_config_net_module(Config_Item *ci) { E_Config_Dialog *cfd; E_Config_Dialog_View *v; + E_Container *con; v = E_NEW(E_Config_Dialog_View, 1); @@ -36,22 +34,21 @@ _configure_net_module(Net_Face *nf) v->basic.apply_cfdata = _basic_apply_data; v->basic.create_widgets = _basic_create_widgets; - cfd = e_config_dialog_new(nf->con, D_("Net Configuration"), NULL, 0, v, nf); - nf->net->cfd = cfd; + con = e_container_current_get(e_manager_current_get()); + cfd = e_config_dialog_new(con, D_("Net Configuration"), NULL, 0, v, ci); + net_config->config_dialog = cfd; } static void -_fill_data(Net_Face *nf, E_Config_Dialog_Data *cfdata) +_fill_data(Config_Item *ci, E_Config_Dialog_Data *cfdata) { char *tmp; int i; - cfdata->check_interval = nf->conf->check_interval; - cfdata->show_text = nf->conf->show_text; - cfdata->show_graph = nf->conf->show_graph; + cfdata->poll_time = ci->poll_time; - if (nf->conf->device != NULL) - cfdata->device = strdup(nf->conf->device); + if (ci->device != NULL) + cfdata->device = strdup(ci->device); else cfdata->device = NULL; @@ -81,22 +78,20 @@ static void * _create_data(E_Config_Dialog *cfd) { E_Config_Dialog_Data *cfdata; - Net_Face *nf; + Config_Item *ci; - nf = cfd->data; + ci = cfd->data; cfdata = E_NEW(E_Config_Dialog_Data, 1); - - _fill_data(nf, cfdata); + _fill_data(ci, cfdata); return cfdata; } static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { - Net_Face *nf; - - nf = cfd->data; - nf->net->cfd = NULL; + if (!net_config) + return; + net_config->config_dialog = NULL; E_FREE(cfdata->device); if (cfdata->devs) ecore_list_destroy(cfdata->devs); @@ -112,13 +107,6 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf int i; o = e_widget_list_add(evas, 0, 0); - of = e_widget_framelist_add(evas, D_("General Settings"), 0); - ob = e_widget_check_add(evas, D_("Show Text"), (&(cfdata->show_text))); - e_widget_framelist_object_append(of, ob); - ob = e_widget_check_add(evas, D_("Show Graph"), (&(cfdata->show_graph))); - e_widget_framelist_object_append(of, ob); - e_widget_list_object_append(o, of, 1, 1, 0.5); - of = e_widget_framelist_add(evas, D_("Device Settings"), 0); ot = e_widget_table_add(evas, 0); rg = e_widget_radio_group_new(&(cfdata->dev_num)); @@ -134,7 +122,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf ob = e_widget_label_add(evas, D_("Check Interval:")); e_widget_table_object_append(ot, ob, 0, i, 1, 1, 0, 0, 1, 0); i++; - ob = e_widget_slider_add(evas, 1, 0, _("%1.0f seconds"), 1, 60, 1, 0, NULL, &(cfdata->check_interval), 150); + ob = e_widget_slider_add(evas, 1, 0, _("%1.0f seconds"), 1, 60, 1, 0, &(cfdata->poll_time), NULL, 150); e_widget_table_object_append(ot, ob, 0, i, 1, 1, 1, 0, 1, 0); e_widget_framelist_object_append(of, ot); e_widget_list_object_append(o, of, 1, 1, 0.5); @@ -146,27 +134,22 @@ static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) { char *tmp; - Net_Face *nf; - - nf = cfd->data; + Config_Item *ci; + + ci = cfd->data; tmp = ecore_list_goto_index(cfdata->devs, cfdata->dev_num); if (tmp != NULL) { - if (strcmp(tmp, nf->conf->device)) + if (strcmp(tmp, ci->device)) { - _net_face_graph_clear(nf); - nf->conf->device = (char *)evas_stringshare_add(strdup(tmp)); + evas_stringshare_del(ci->device); + ci->device = evas_stringshare_add(strdup(tmp)); } } - nf->conf->check_interval = cfdata->check_interval; - nf->conf->show_text = cfdata->show_text; - nf->conf->show_graph = cfdata->show_graph; + ci->poll_time = cfdata->poll_time; e_config_save_queue(); - - if (nf->monitor) - ecore_timer_interval_set(nf->monitor, (double)cfdata->check_interval); - + _net_config_updated(ci->id); return 1; } diff --git a/e_mod_config.h b/e_mod_config.h deleted file mode 100644 index 8322341..0000000 --- a/e_mod_config.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifdef E_TYPEDEFS -#else -#ifndef E_MOD_CONFIG_H -#define E_MOD_CONFIG_H - -#include "e_mod_main.h" - -void _configure_net_module(Net_Face *nf); - -#endif -#endif diff --git a/e_mod_main.c b/e_mod_main.c index 0c2d22f..6313684 100644 --- a/e_mod_main.c +++ b/e_mod_main.c @@ -1,492 +1,427 @@ #include #include "e_mod_main.h" -#include "e_mod_config.h" -#include "config.h" -static Net *_net_init(E_Module *m); -static void _net_shutdown(Net *n); -static void _net_config_menu_new(Net *n); +typedef struct _Instance Instance; +typedef struct _Net Net; -static Net_Face *_net_face_init(Net *n, E_Container *con); -static void _net_face_menu_new(Net_Face *nf); -static void _net_face_enable(Net_Face *nf); -static void _net_face_disable(Net_Face *nf); -static void _net_face_free(Net_Face *nf); -static void _net_face_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change); -static void _net_face_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info); -static void _net_face_cb_menu_edit(void *data, E_Menu *mn, E_Menu_Item *mi); -static void _net_face_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi); -static int _net_face_update_values(void *data); -static void _net_face_graph_values(Net_Face *nf, int tx_val, int rx_val); +struct _Instance +{ + E_Gadcon_Client *gcc; + Evas_Object *net_obj; + Net *net; + Config_Item *ci; + Ecore_Timer *check_timer; +}; -static int net_count; +struct _Net +{ + Instance *inst; + Evas_Object *net_obj; +}; -static E_Config_DD *conf_edd; -static E_Config_DD *conf_face_edd; +/* Func Protos for Gadcon */ +static E_Gadcon_Client *_gc_init(E_Gadcon *gc, char *name, char *id, char *style); +static void _gc_shutdown(E_Gadcon_Client *gcc); +static void _gc_orient(E_Gadcon_Client *gcc); +static char *_gc_label(void); +static Evas_Object *_gc_icon(Evas *evas); -EAPI E_Module_Api e_modapi = { +/* Func Protos for Module */ +static void _net_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _net_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _net_cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _net_menu_cb_configure(void *data, E_Menu *m, E_Menu_Item *mi); +static void _net_menu_cb_post(void *data, E_Menu *m); +static Config_Item *_net_config_item_get(const char *id); +static Net *_net_new(Evas *evas); +static void _net_free(Net *net); +static void _net_update_rx(Instance *inst, int value); +static void _net_update_tx(Instance *inst, int value); +static int _net_cb_check(void *data); + +static E_Config_DD *conf_edd = NULL; +static E_Config_DD *conf_item_edd = NULL; + +Config *net_config = NULL; + +/* Define the gadcon class and functions provided by this module */ +static const E_Gadcon_Client_Class _gc_class = +{ + GADCON_CLIENT_CLASS_VERSION, + "net", { _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon } +}; + +static E_Gadcon_Client * +_gc_init(E_Gadcon *gc, char *name, char *id, char *style) +{ + E_Gadcon_Client *gcc; + Evas_Object *o; + Instance *inst; + Config_Item *ci; + Net *net; + char buf[4096]; + + inst = E_NEW(Instance, 1); + ci = _net_config_item_get(id); + if (!ci->id) ci->id = evas_stringshare_add(id); + + net = _net_new(gc->evas); + net->inst = inst; + inst->net = net; + + o = net->net_obj; + gcc = e_gadcon_client_new(gc, name, id, style, o); + gcc->data = inst; + inst->gcc = gcc; + inst->net_obj = o; + + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, + _net_cb_mouse_down, inst); + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_IN, + _net_cb_mouse_in, inst); + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_OUT, + _net_cb_mouse_out, inst); + + inst->check_timer = ecore_timer_add(ci->poll_time, _net_cb_check, inst); + + net_config->instances = evas_list_append(net_config->instances, inst); + + return gcc; +} + +static void +_gc_orient(E_Gadcon_Client *gcc) +{ + e_gadcon_client_aspect_set(gcc, 16, 16); + e_gadcon_client_min_size_set(gcc, 16, 16); +} + +static char * +_gc_label(void) +{ + return D_("Net"); +} + +static Evas_Object * +_gc_icon(Evas *evas) +{ + Evas_Object *o; + char buf[4096]; + + o = edje_object_add(evas); + snprintf(buf, sizeof(buf), "%s/module.eap", e_module_dir_get(net_config->module)); + edje_object_file_set(o, buf, "icon"); + return o; +} + +static void +_gc_shutdown(E_Gadcon_Client *gcc) +{ + Instance *inst; + + inst = gcc->data; + if (inst->check_timer) + ecore_timer_del(inst->check_timer); + net_config->instances = evas_list_remove(net_config->instances, inst); + _net_free(inst->net); + free(inst); +} + +static void +_net_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Instance *inst; + Evas_Event_Mouse_Down *ev; + + inst = data; + ev = event_info; + if ((ev->button == 3) && (!net_config->menu)) + { + E_Menu *mn; + E_Menu_Item *mi; + int x, y, w, h; + + mn = e_menu_new(); + e_menu_post_deactivate_callback_set(mn, _net_menu_cb_post, inst); + net_config->menu = mn; + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, D_("Configuration")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/configuration"); + e_menu_item_callback_set(mi, _net_menu_cb_configure, inst); + + e_gadcon_client_util_menu_items_append(inst->gcc, mn, 0); + e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, &w, &h); + e_menu_activate_mouse(mn, + e_util_zone_current_get(e_manager_current_get()), + x + ev->output.x, y + ev->output.y, 1, 1, E_MENU_POP_DIRECTION_DOWN, ev->timestamp); + evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button, EVAS_BUTTON_NONE, ev->timestamp, NULL); + } +} + +static void +_net_menu_cb_post(void *data, E_Menu *m) +{ + if (!net_config->menu) + return; + e_object_del(E_OBJECT(net_config->menu)); + net_config->menu = NULL; +} + +static void +_net_menu_cb_configure(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Instance *inst; + Config_Item *ci; + + inst = data; + ci = _net_config_item_get(inst->gcc->id); + _config_net_module(ci); +} + +void +_net_config_updated(const char *id) +{ + Evas_List *l; + Config_Item *ci; + + if (!net_config) + return; + + ci = _net_config_item_get(id); + for (l = net_config->instances; l; l = l->next) + { + Instance *inst; + + inst = l->data; + if (!inst->gcc->id) + continue; + + if (!strcmp(inst->gcc->id, ci->id)) + { + _net_cb_check(inst); + if (inst->check_timer) + ecore_timer_interval_set(inst->check_timer, (double)ci->poll_time); + else + inst->check_timer = ecore_timer_add((double)ci->poll_time, _net_cb_check, inst); + break; + } + } +} + +static Config_Item * +_net_config_item_get(const char *id) +{ + Evas_List *l; + Config_Item *ci; + + for (l = net_config->items; l; l = l->next) + { + ci = l->data; + if (!ci->id) + continue; + if (!strcmp(ci->id, id)) + return ci; + } + ci = E_NEW(Config_Item, 1); + ci->id = evas_stringshare_add(id); + ci->device = evas_stringshare_add("eth0"); + ci->poll_time = 1; + ci->max = 1500; + net_config->items = evas_list_append(net_config->items, ci); + return ci; +} + +/* Module routines */ +EAPI E_Module_Api e_modapi = +{ E_MODULE_API_VERSION, - "Net" + "Net" }; EAPI void * -e_modapi_init(E_Module *m) +e_modapi_init(E_Module *m) { - Net *n; - - /* Set up module's message catalogue */ bindtextdomain(PACKAGE, LOCALEDIR); bind_textdomain_codeset(PACKAGE, "UTF-8"); - - n = _net_init(m); - if (!n) - return NULL; - - m->config_menu = n->config_menu; - return n; -} - -EAPI int -e_modapi_shutdown(E_Module *m) -{ - Net *n; - - n = m->data; - if (!n) - return 0; - - if (m->config_menu) + + conf_item_edd = E_CONFIG_DD_NEW("Net_Config_Item", Config_Item); + + #undef T + #undef D + #define T Config_Item + #define D conf_item_edd + E_CONFIG_VAL(D, T, id, STR); + E_CONFIG_VAL(D, T, device, STR); + E_CONFIG_VAL(D, T, max, DOUBLE); + E_CONFIG_VAL(D, T, poll_time, DOUBLE); + + conf_edd = E_CONFIG_DD_NEW("Net_Config", Config); + + #undef T + #undef D + #define T Config + #define D conf_edd + E_CONFIG_LIST(D, T, items, conf_item_edd); + + net_config = e_config_domain_load("module.net", conf_edd); + if (!net_config) { - e_menu_deactivate(m->config_menu); - e_object_del(E_OBJECT(m->config_menu)); - m->config_menu = NULL; + Config_Item *ci; + + net_config = E_NEW(Config, 1); + ci = E_NEW(Config_Item, 1); + ci->id = evas_stringshare_add("0"); + ci->device = evas_stringshare_add("eth0"); + ci->poll_time = 1; + ci->max = 1500; + net_config->items = evas_list_append(net_config->items, ci); } - if (n->cfd) + net_config->module = m; + e_gadcon_provider_register(&_gc_class); + return 1; +} + +EAPI int +e_modapi_shutdown(E_Module *m) +{ + net_config->module = NULL; + e_gadcon_provider_unregister(&_gc_class); + + if (net_config->config_dialog) + e_object_del(E_OBJECT(net_config->config_dialog)); + if (net_config->menu) { - e_object_del(E_OBJECT(n->cfd)); - n->cfd = NULL; + e_menu_post_deactivate_callback_set(net_config->menu, NULL, NULL); + e_object_del(E_OBJECT(net_config->menu)); + net_config->menu = NULL; } - _net_shutdown(n); + while (net_config->items) + { + Config_Item *ci; + + ci = net_config->items->data; + if (ci->id) + evas_stringshare_del(ci->id); + net_config->items = evas_list_remove_list(net_config->items, net_config->items); + free(ci); + } + free(net_config); + net_config = NULL; + E_CONFIG_DD_FREE(conf_item_edd); + E_CONFIG_DD_FREE(conf_edd); return 1; } EAPI int -e_modapi_save(E_Module *m) +e_modapi_info(E_Module *m) { - Net *n; - - n = m->data; - if (!n) - return 0; - e_config_domain_save("module.net", conf_edd, n->conf); + char buf[4096]; + + snprintf(buf, sizeof(buf), "%s/module_icon.png", e_module_dir_get(m)); + m->icon_file = strdup(buf); return 1; } EAPI int -e_modapi_info(E_Module *m) +e_modapi_save(E_Module *m) { - m->icon_file = strdup(PACKAGE_DATA_DIR "/module_icon.png"); - return 1; -} - -EAPI int -e_modapi_about(E_Module *m) -{ - e_module_dialog_show(D_("Enlightenment Network Monitor Module"), D_("This module is used to monitor a network device.")); - return 1; -} - -EAPI int -e_modapi_config(E_Module *m) -{ - Net *n; Evas_List *l; - E_Container *con; - - n = m->data; - if (!n) - return 0; - if (!n->faces) - return 0; - - for (l = n->faces; l; l = l->next) + + for (l = net_config->instances; l; l = l->next) { - Net_Face *nf; - - nf = l->data; - if (!nf) - continue; - - con = e_container_current_get(e_manager_current_get()); - if (nf->con == con) - { - _configure_net_module(nf); - break; - } + Instance *inst; + Config_Item *ci; + + inst = l->data; + ci = _net_config_item_get(inst->gcc->id); + if (ci->id) + evas_stringshare_del(ci->id); + ci->id = evas_stringshare_add(inst->gcc->id); } + e_config_domain_save("module.net", conf_edd, net_config); + return 1; +} + +EAPI int +e_modapi_about(E_Module *m) +{ + e_module_dialog_show(D_("Enlightenment Network Monitor Module"), + D_("This module is used to monitor a network device.")); return 1; } static Net * -_net_init(E_Module *m) +_net_new(Evas *evas) { - Net *n; - E_Menu_Item *mi; - Evas_List *mans, *l, *l2, *fl; - - n = E_NEW(Net, 1); - - if (!n) - return NULL; - - conf_face_edd = E_CONFIG_DD_NEW("Net_Config_Face", Config_Face); -#undef T -#undef D -#define T Config_Face -#define D conf_face_edd - E_CONFIG_VAL(D, T, enabled, UCHAR); - E_CONFIG_VAL(D, T, device, STR); - E_CONFIG_VAL(D, T, check_interval, INT); - E_CONFIG_VAL(D, T, show_text, INT); - E_CONFIG_VAL(D, T, show_graph, INT); - - conf_edd = E_CONFIG_DD_NEW("Net_Config", Config); - -#undef T -#undef D -#define T Config -#define D conf_edd - E_CONFIG_LIST(D, T, faces, conf_face_edd); - - n->conf = e_config_domain_load("module.net", conf_edd); - if (!n->conf) - n->conf = E_NEW(Config, 1); - - _net_config_menu_new(n); - - mans = e_manager_list(); - fl = n->conf->faces; - for (l = mans; l; l = l->next) - { - E_Manager *man; - - man = l->data; - for (l2 = man->containers; l2; l2 = l2->next) - { - E_Container *con; - Net_Face *nf; - - con = l2->data; - nf = _net_face_init(n, con); - if (nf) - { - if (!fl) - { - nf->conf = E_NEW(Config_Face, 1); - - nf->conf->enabled = 1; - nf->conf->device = (char *)evas_stringshare_add("eth0"); - nf->conf->check_interval = 1; - nf->conf->show_text = 1; - nf->conf->show_graph = 1; - n->conf->faces = evas_list_append(n->conf->faces, nf->conf); - } - else - { - nf->conf = fl->data; - fl = fl->next; - } - E_CONFIG_LIMIT(nf->conf->check_interval, 0, 60); - E_CONFIG_LIMIT(nf->conf->show_text, 0, 1); - E_CONFIG_LIMIT(nf->conf->show_graph, 0, 1); - - nf->monitor = ecore_timer_add((double)nf->conf->check_interval, _net_face_update_values, nf); - - _net_face_menu_new(nf); - - mi = e_menu_item_new(n->config_menu); - e_menu_item_label_set(mi, _("Configuration")); - e_menu_item_callback_set(mi, _net_face_cb_menu_configure, nf); - - mi = e_menu_item_new(n->config_menu); - e_menu_item_label_set(mi, con->name); - e_menu_item_submenu_set(mi, nf->menu); - - if (!nf->conf->enabled) - _net_face_disable(nf); - } - } - } - return n; -} - -static void -_net_shutdown(Net *n) -{ - E_CONFIG_DD_FREE(conf_edd); - E_CONFIG_DD_FREE(conf_face_edd); - - while (n->faces) - _net_face_free(n->faces->data); - - e_object_del(E_OBJECT(n->config_menu)); - evas_list_free(n->conf->faces); - - E_FREE(n->conf); - E_FREE(n); -} - -static void -_net_config_menu_new(Net *n) -{ - E_Menu *mn; - - mn = e_menu_new(); - n->config_menu = mn; -} - -static Net_Face * -_net_face_init(Net *n, E_Container *con) -{ - Net_Face *nf; - Evas_Object *o; + Net *net; char buf[4096]; + + net = E_NEW(Net, 1); + net->net_obj = edje_object_add(evas); + + snprintf(buf, sizeof(buf), "%s/net.edj", e_module_dir_get(net_config->module)); + if (!e_theme_edje_object_set(net->net_obj, "base/theme/modules/net", "modules/net/main")) + edje_object_file_set(net->net_obj, buf, "modules/net/main"); + evas_object_show(net->net_obj); - nf = E_NEW(Net_Face, 1); - - if (!nf) - return NULL; - nf->net = n; - n->faces = evas_list_append(n->faces, nf); - - nf->con = con; - e_object_ref(E_OBJECT(con)); - nf->evas = con->bg_evas; - - evas_event_freeze(nf->evas); - - o = edje_object_add(nf->evas); - nf->net_obj = o; - - if (!e_theme_edje_object_set(o, "base/theme/modules/net", "modules/net/main")) - { - snprintf(buf, sizeof(buf), PACKAGE_DATA_DIR "/net.edj"); - edje_object_file_set(o, buf, "modules/net/main"); - } - evas_object_show(o); - - o = edje_object_add(nf->evas); - nf->chart_obj = o; - evas_object_layer_set(o, 1); - evas_object_repeat_events_set(o, 1); - evas_object_color_set(o, 255, 255, 255, 255); - evas_object_show(o); - - o = edje_object_add(nf->evas); - nf->rtxt_obj = o; - if (!e_theme_edje_object_set(o, "base/theme/modules/net", "modules/net/rx_text")) - { - snprintf(buf, sizeof(buf), PACKAGE_DATA_DIR "/net.edj"); - edje_object_file_set(o, buf, "modules/net/rx_text"); - } - evas_object_layer_set(o, 2); - evas_object_repeat_events_set(o, 1); - evas_object_color_set(o, 255, 255, 255, 255); - evas_object_show(o); - - o = edje_object_add(nf->evas); - nf->ttxt_obj = o; - if (!e_theme_edje_object_set(o, "base/theme/modules/net", "modules/net/tx_text")) - { - snprintf(buf, sizeof(buf), PACKAGE_DATA_DIR "/net.edj"); - edje_object_file_set(o, buf, "modules/net/tx_text"); - } - evas_object_layer_set(o, 2); - evas_object_repeat_events_set(o, 1); - evas_object_color_set(o, 255, 255, 255, 255); - evas_object_show(o); - - o = evas_object_rectangle_add(nf->evas); - nf->event_obj = o; - evas_object_layer_set(o, 3); - evas_object_repeat_events_set(o, 1); - evas_object_color_set(o, 0, 0, 0, 0); - evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _net_face_cb_mouse_down, nf); - evas_object_show(o); - - nf->gmc = e_gadman_client_new(nf->con->gadman); - e_gadman_client_domain_set(nf->gmc, "module.net", net_count++); - e_gadman_client_policy_set(nf->gmc, - E_GADMAN_POLICY_ANYWHERE | - E_GADMAN_POLICY_HMOVE | E_GADMAN_POLICY_HSIZE | E_GADMAN_POLICY_VMOVE | E_GADMAN_POLICY_VSIZE); - //e_gadman_client_min_size_set(nf->gmc, 40, 40); - //e_gadman_client_max_size_set(nf->gmc, 128, 128); - e_gadman_client_auto_size_set(nf->gmc, 40, 40); - e_gadman_client_align_set(nf->gmc, 1.0, 1.0); - e_gadman_client_resize(nf->gmc, 40, 40); - e_gadman_client_change_func_set(nf->gmc, _net_face_cb_gmc_change, nf); - e_gadman_client_load(nf->gmc); - evas_event_thaw(nf->evas); - - return nf; + return net; } static void -_net_face_menu_new(Net_Face *nf) +_net_free(Net *n) { - E_Menu *mn; - E_Menu_Item *mi; - - mn = e_menu_new(); - nf->menu = mn; - - mi = e_menu_item_new(mn); - e_menu_item_label_set(mi, _("Configuration")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/configuration"); - e_menu_item_callback_set(mi, _net_face_cb_menu_configure, nf); - - mi = e_menu_item_new(mn); - e_menu_item_label_set(mi, _("Edit Mode")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/gadgets"); - e_menu_item_callback_set(mi, _net_face_cb_menu_edit, nf); + evas_object_del(n->net_obj); + free(n); } -static void -_net_face_enable(Net_Face *nf) +static void +_net_update_rx(Instance *inst, int value) { - nf->conf->enabled = 1; - e_config_save_queue(); - evas_object_show(nf->net_obj); - evas_object_show(nf->event_obj); - evas_object_show(nf->chart_obj); - evas_object_show(nf->rtxt_obj); - evas_object_show(nf->ttxt_obj); + Edje_Message_Int_Set *val; + + val = malloc(sizeof(Edje_Message_Int_Set) + (1 * sizeof(int))); + val->count = 1; + val->val[0] = value; + edje_object_message_send(inst->net_obj, EDJE_MESSAGE_INT_SET, 1, val); + free(val); } -static void -_net_face_disable(Net_Face *nf) +static void +_net_update_tx(Instance *inst, int value) { - nf->conf->enabled = 0; - e_config_save_queue(); - evas_object_hide(nf->event_obj); - evas_object_hide(nf->net_obj); - evas_object_hide(nf->chart_obj); - evas_object_hide(nf->rtxt_obj); - evas_object_hide(nf->ttxt_obj); + Edje_Message_Int_Set *val; + + val = malloc(sizeof(Edje_Message_Int_Set) + (1 * sizeof(int))); + val->count = 1; + val->val[0] = value; + edje_object_message_send(inst->net_obj, EDJE_MESSAGE_INT_SET, 2, val); + free(val); } -static void -_net_face_free(Net_Face *nf) +static void +_net_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info) { - e_object_unref(E_OBJECT(nf->con)); - e_object_del(E_OBJECT(nf->menu)); - - if (nf->monitor) - ecore_timer_del(nf->monitor); - if (nf->menu) - e_object_del(E_OBJECT(nf->menu)); - if (nf->event_obj) - evas_object_del(nf->event_obj); - if (nf->net_obj) - evas_object_del(nf->net_obj); - if (nf->chart_obj) - evas_object_del(nf->chart_obj); - if (nf->rtxt_obj) - evas_object_del(nf->rtxt_obj); - if (nf->ttxt_obj) - evas_object_del(nf->ttxt_obj); - if (nf->old_rx || nf->old_tx) - _net_face_graph_clear(nf); - - if (nf->gmc) - { - e_gadman_client_save(nf->gmc); - e_object_del(E_OBJECT(nf->gmc)); - } - - nf->net->faces = evas_list_remove(nf->net->faces, nf); - - E_FREE(nf->conf); - E_FREE(nf); - net_count--; + Instance *inst; + + inst = data; + edje_object_signal_emit(inst->net_obj, "label_active", ""); } -static void -_net_face_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change) +static void +_net_cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info) { - Net_Face *nf; - Evas_Coord x, y, w, h; - - nf = data; - switch (change) - { - case E_GADMAN_CHANGE_MOVE_RESIZE: - e_gadman_client_geometry_get(nf->gmc, &x, &y, &w, &h); - evas_object_move(nf->net_obj, x, y); - evas_object_move(nf->event_obj, x, y); - evas_object_move(nf->chart_obj, x, y); - evas_object_move(nf->rtxt_obj, x, y); - evas_object_move(nf->ttxt_obj, x, y); - evas_object_resize(nf->net_obj, w, h); - evas_object_resize(nf->event_obj, w, h); - evas_object_resize(nf->chart_obj, w, h); - evas_object_resize(nf->rtxt_obj, w, h); - evas_object_resize(nf->ttxt_obj, w, h); - _net_face_graph_clear(nf); - break; - case E_GADMAN_CHANGE_RAISE: - evas_object_raise(nf->net_obj); - evas_object_raise(nf->event_obj); - evas_object_raise(nf->chart_obj); - evas_object_raise(nf->rtxt_obj); - evas_object_raise(nf->ttxt_obj); - break; - default: - break; - } + Instance *inst; + + inst = data; + edje_object_signal_emit(inst->net_obj, "label_passive", ""); } -static void -_net_face_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info) +static int +_net_cb_check(void *data) { - Net_Face *nf; - Evas_Event_Mouse_Down *ev; - - ev = event_info; - nf = data; - if (ev->button == 3) - { - e_menu_activate_mouse(nf->menu, e_zone_current_get(nf->con), - ev->output.x, ev->output.y, 1, 1, E_MENU_POP_DIRECTION_DOWN, ev->timestamp); - e_util_container_fake_mouse_up_all_later(nf->con); - } -} - -static void -_net_face_cb_menu_edit(void *data, E_Menu *mn, E_Menu_Item *mi) -{ - Net_Face *nf; - - nf = data; - e_gadman_mode_set(nf->gmc->gadman, E_GADMAN_MODE_EDIT); -} - -static void -_net_face_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi) -{ - Net_Face *nf; - - nf = data; - if (!nf) - return; - - _configure_net_module(nf); -} - -static int -_net_face_update_values(void *data) -{ - Net_Face *nf; + Instance *inst; + Config_Item *ci; FILE *stat; char dev[64]; char buf[256]; @@ -500,12 +435,15 @@ _net_face_update_values(void *data) long max_out = 28672; long bytes_in; long bytes_out; - int in_use = 0; - int out_use = 0; + double in_use = 0.0; + double out_use = 0.0; Edje_Message_Float msg; - - nf = data; - + char in_str[100]; + char out_str[100]; + + inst = data; + ci = _net_config_item_get(inst->gcc->id); + stat = fopen("/proc/net/dev", "r"); if (!stat) return 1; @@ -524,7 +462,7 @@ _net_face_update_values(void *data) "%lu %lu %lu %lu\n", dev, &in, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &out, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy) < 17) continue; - if (!strcmp(dev, strdup(nf->conf->device))) + if (!strcmp(dev, strdup(ci->device))) { found = 1; break; @@ -556,20 +494,11 @@ _net_face_update_values(void *data) old_in = in; old_out = out; - - /* Update the modules text */ - char in_str[100]; - char out_str[100]; - - if (!nf->conf->show_text) + + if ((bytes_in < 0) || (bytes_out < 0)) { - edje_object_part_text_set(nf->ttxt_obj, "tx-text", ""); - edje_object_part_text_set(nf->rtxt_obj, "rx-text", ""); - } - else if ((bytes_in < 0) || (bytes_out < 0)) - { - edje_object_part_text_set(nf->ttxt_obj, "tx-text", "Tx: 0 B"); - edje_object_part_text_set(nf->rtxt_obj, "rx-text", "Rx: 0 B"); + edje_object_part_text_set(inst->net_obj, "tx_label", "Tx: 0 B"); + edje_object_part_text_set(inst->net_obj, "rx_label", "Rx: 0 B"); } else { @@ -599,142 +528,27 @@ _net_face_update_values(void *data) else snprintf(out_str, sizeof(out_str), "Tx: %d B", bytes_out); - edje_object_part_text_set(nf->ttxt_obj, "tx-text", out_str); - edje_object_part_text_set(nf->rtxt_obj, "rx-text", in_str); + edje_object_part_text_set(inst->net_obj, "tx_label", out_str); + edje_object_part_text_set(inst->net_obj, "rx_label", in_str); } - msg.val = in_use; - edje_object_message_send(nf->net_obj, EDJE_MESSAGE_FLOAT, 1, &msg); - - msg.val = out_use; - edje_object_message_send(nf->net_obj, EDJE_MESSAGE_FLOAT, 2, &msg); - - if (nf->conf->show_graph) - _net_face_graph_values(nf, out_use, in_use); - else - _net_face_graph_clear(nf); + int x, y, w, h; + double i, o; + evas_object_geometry_get(inst->net_obj, &x, &y, &w, &h); + if (in_use > 100) + in_use = 100; + if (out_use > 100) + out_use = 100; + i = ((double)in_use * ((double)w / (double)100)); + o = ((double)out_use * ((double)w / (double)100)); + if ((i > 0) && (i < 1)) + i = 10.0; + if ((o > 0) && (o < 1)) + o = 10.0; + + _net_update_rx(inst, (i / 10)); + _net_update_tx(inst, (o / 10)); + return 1; } - -static void -_net_face_graph_values(Net_Face *nf, int tx_val, int rx_val) -{ - int x, y, w, h; - Evas_Object *o; - Evas_Object *last = NULL; - Evas_List *l; - int i, j = 0; - - evas_event_freeze(nf->evas); - - evas_object_geometry_get(nf->chart_obj, &x, &y, &w, &h); - - if (rx_val > 100) - rx_val = 100; - if (tx_val > 100) - tx_val = 100; - - rx_val = (int)(((double)rx_val) * (((double)h) / ((double)100))); - tx_val = (int)(((double)tx_val) * (((double)h) / ((double)100))); - - o = evas_object_line_add(nf->evas); - edje_object_part_swallow(nf->chart_obj, "lines", o); - evas_object_layer_set(o, 1); - if (rx_val == 0) - evas_object_hide(o); - else - { - evas_object_line_xy_set(o, (x + w), (y + h), (x + w), (y + h - rx_val)); - evas_object_color_set(o, 255, 0, 0, 100); - evas_object_pass_events_set(o, 1); - evas_object_show(o); - } - - nf->old_rx = evas_list_prepend(nf->old_rx, o); - l = nf->old_rx; - for (i = (x + w); l && ((j - 2) < w); l = l->next, j++) - { - Evas_Coord oy; - Evas_Object *lo; - - lo = (Evas_Object *)evas_list_data(l); - evas_object_geometry_get(lo, NULL, &oy, NULL, NULL); - evas_object_move(lo, i--, oy); - last = lo; - } - if ((j - 2) >= w) - { - nf->old_rx = evas_list_remove(nf->old_rx, last); - edje_object_part_unswallow(nf->chart_obj, last); - evas_object_del(last); - } - - j = 0; - last = NULL; - o = evas_object_line_add(nf->evas); - edje_object_part_swallow(nf->chart_obj, "lines", o); - evas_object_layer_set(o, 1); - if (tx_val == 0) - evas_object_hide(o); - else - { - evas_object_line_xy_set(o, (x + w), y, (x + w), (y + tx_val)); - evas_object_color_set(o, 0, 255, 0, 100); - evas_object_pass_events_set(o, 1); - evas_object_show(o); - } - - nf->old_tx = evas_list_prepend(nf->old_tx, o); - l = nf->old_tx; - for (i = (x + w); l && ((j - 2) < w); l = l->next, j++) - { - Evas_Coord oy; - Evas_Object *lo; - - lo = (Evas_Object *)evas_list_data(l); - evas_object_geometry_get(lo, NULL, &oy, NULL, NULL); - evas_object_move(lo, i--, oy); - last = lo; - } - if ((j - 2) >= w) - { - nf->old_tx = evas_list_remove(nf->old_tx, last); - edje_object_part_unswallow(nf->chart_obj, last); - evas_object_del(last); - } - - evas_event_thaw(nf->evas); -} - -void -_net_face_graph_clear(Net_Face *nf) -{ - Evas_List *l; - - evas_event_freeze(nf->evas); - - for (l = nf->old_rx; l; l = l->next) - { - Evas_Object *o; - - o = evas_list_data(l); - edje_object_part_unswallow(nf->chart_obj, o); - evas_object_del(o); - } - evas_list_free(nf->old_rx); - nf->old_rx = NULL; - - for (l = nf->old_tx; l; l = l->next) - { - Evas_Object *o; - - o = evas_list_data(l); - edje_object_part_unswallow(nf->chart_obj, o); - evas_object_del(o); - } - evas_list_free(nf->old_tx); - nf->old_tx = NULL; - - evas_event_thaw(nf->evas); -} diff --git a/e_mod_main.h b/e_mod_main.h index 31d3365..4439ac2 100644 --- a/e_mod_main.h +++ b/e_mod_main.h @@ -4,61 +4,34 @@ #define E_MOD_MAIN_H typedef struct _Config Config; -typedef struct _Config_Face Config_Face; -typedef struct _Net Net; -typedef struct _Net_Face Net_Face; +typedef struct _Config_Item Config_Item; -struct _Config +struct _Config { - Evas_List *faces; -}; - -struct _Config_Face -{ - unsigned char enabled; - char *device; - int check_interval; - int show_text; - int show_graph; -}; - -struct _Net -{ - E_Menu *config_menu; - Evas_List *faces; - Config *conf; - E_Config_Dialog *cfd; -}; - -struct _Net_Face -{ - Evas *evas; - E_Container *con; + E_Module *module; + E_Config_Dialog *config_dialog; E_Menu *menu; - Net *net; - Evas_List *old_rx, *old_tx; - Config_Face *conf; + Evas_List *instances; + Evas_List *items; +}; - Evas_Object *net_obj; - Evas_Object *event_obj; - Evas_Object *chart_obj; - Evas_Object *rtxt_obj; - Evas_Object *ttxt_obj; - - Ecore_Timer *monitor; - - E_Gadman_Client *gmc; +struct _Config_Item +{ + const char *id; + const char *device; + double poll_time; + double max; }; EAPI extern E_Module_Api e_modapi; - EAPI void *e_modapi_init(E_Module *m); EAPI int e_modapi_shutdown(E_Module *m); EAPI int e_modapi_save(E_Module *m); EAPI int e_modapi_info(E_Module *m); EAPI int e_modapi_about(E_Module *m); -EAPI int e_modapi_config(E_Module *m); -void _net_face_graph_clear(Net_Face *nf); +void _net_config_updated(const char *id); +void _config_net_module(Config_Item *ci); +extern Config *net_config; #endif diff --git a/module.eap b/module.eap new file mode 100644 index 0000000000000000000000000000000000000000..ad58042016edaccaaba9824b8ee1865def7ac334 GIT binary patch literal 5783 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 Qr2qf`07*qoM6N<$g27Vhi2wiq literal 0 HcmV?d00001 diff --git a/rx_03.png b/rx_03.png new file mode 100644 index 0000000000000000000000000000000000000000..d2ccb6cb51dd40b5793ad19ee7297fd49f53e7bd GIT binary patch literal 651 zcmV;60(AX}P)E7$} z$2T4be&GwaHfdd(wzh@sl`VE}ZLfhr$O}a_R1s6n_fO;n2SV5;<3L6=_q^`w)PaMF z0-+G53cPJBwi0wIRoJdq^Lell!hC}f1)-WUN?$+}f~G_*p#<0XQ?dpgvYRo85}0Wh zNo!HakPvsNn7kS#Bw-2&DI;NZWykTIJpfcTUdLV#Z*W!_Bqe42L&+-AZ%n)Tz#!z5 ztRPBR9incDaZDgQWZI8FC<7+Z!J!WU`Q;COLXQd3Yn#>uKbj^ zHtEKr5VK^dnNwjlf_Kytm?ev)BKLY3qy>Z6i@`5mrL!WbD`-mA-P6G(yhj~=1x?9< zQTJK&MROnGA@>_Ykg}ybp$3WwA!h7#Jb}g9C7Q=NMCgEc2u$CAF|TsQFo8%}Y*Up- z>`H+-{|ZbGS!BL-+HiGri_Eg_jZPqv(Gnw*ZoE<{S#yOsB40d9;N818FI|&9U%N>`%H2a)~{GmczPw6^()i?%(km)0$6QV-KO+r}D z!Dd}5{-$JoKnR2)AQV!YzX16w!fisF0i!e3P1*W@5DYd`m8tjG3!ITV| lhqEl@82~>`Ot=0qegMhaG}Shtu=xN0002ovPDHLkV1nAtB^dw! literal 0 HcmV?d00001 diff --git a/rx_04.png b/rx_04.png new file mode 100644 index 0000000000000000000000000000000000000000..fe0161c9fc91fcdd01aa8317e6904b94ce60f675 GIT binary patch literal 743 zcmV?P)!-}g`P?CjqA zyJznjKj)7RJP@=!fmZ;=B^cKox1-wCy_|dl#q-zu!nWTD`Q9i3+9ig?^IZ~0F)-p1 zqJoS`GT4mjD!?f2XOp1l3Q<*oOJH$>pjohSyG|4KMtVYM!iXC2vr*0l`l@enlFY~o zK><-6?6|~VRZ*49Xb!pKIYcEW(xy;rvkFmg7oU(FRYbEQx{8`r3X>B;Lt#~cba>}3 z0BEQ)AYAsMY1F!%Mv@?UjiazOA&Wx7Vk41VGZ~){2nkw287ESgh8c zT7@etsIa&`1Y+b5qgQYmNE!-^heMv0bX_HO_Zk~=XDVbV_+fLc>n|X9NL5s9g#f+X zPOMq*PW4or#q>VJ3KSNuJI*eOP94R0wCu&gi0{-H1wYV8U?gPi&JK=-d)zKuHHnds z<@N*}-YZLFMa?1I%c|6k%L!bl2&dAR&LJ>4LCM?QojT>DdSTqJ<_*JVm3~}bv z|EMe#)Q%%C8PzMDe?{y_O$ZxebrvS5k&ev-$6F_z**6-?q_S6NRtFDcJ*C;V>f-M9 zFci&XyvpjDHwr0RsV*2M;t*99N$Rc&0<^6@>$Hir^}J_JeFJKoK(k4l>OJCRFYx|K zcA5~Tz6YF@i!GMB5cAG22&(F06QX(!z?&a&xyD)B#gmXa*fat?gB=J}rPS3~C}$ds zj;p)7(((MTGx?=$75h=hUO=zsh3N*wLsqAb+=(Tc?--3|7VTwqvxGEdF&aa$Q&vni z7w-_W;z0rb^C#|%?Biz)S0Txr@!RcPkP2BHsbfPK?aUgUrKA%ttK$s7|Jh~-s)%?C Z{tMHLm`;yg4+Q`K002ovPDHLkV1kU?PB{Po literal 0 HcmV?d00001 diff --git a/rx_05.png b/rx_05.png new file mode 100644 index 0000000000000000000000000000000000000000..3a42927f1e7bd9e708e3261c1bb5ef7cf88fcefa GIT binary patch literal 862 zcmV-k1EKthP)xjVqA0hQ$pL~QZQ{0)B~q0Ah(G`U_&mP=#PfA^eLug%v#WdW zW3R@FWNhZ+KK|i>0mlVA3J@>Gcs+4@Rj0a_i|;`4eDzznxNpeu(;@#43WHXTVe)+C z#4wz(`U=C2OBxvqXRw&nnSqhqPs2eWCdudsQBi>x!{U~LAZBjdo{cw7h{ze^5So8n z&3Gn8qA}Bvj0%ym;sgvqlA@}#;{tycMKlV3H@f=l&tu3cA7_!EK${}pN5YUYM>(Vc zlO3{?$7x1H6;Z3GV1vDlV_7ceN0ENQh@2I`({x�O~3?cUTb$CuPx98Qa0CV^bCd zg~f&=onq1<0%IM5f`USTGZ(<_&}tM6DmKRW^BB^tM_^FeZbh$HSey|h*RPpLgT}(t zt7wn|7)2w^Ninuk-vRY7EAzXfSyb&VhK&^$Q51(&Dp^GUOo~k7KFqE~E=waKdJ?=7 zJ+8#gM66t;!I3G8V)nW3JIXGSN*&^wCt!$cJDO+OBG)B5`m(#5EQdaz~YN)P59amHgP0ESB=Jy osvGC*s`|usXA0+6z(3^p2GL*o$Od|4`Tzg`07*qoM6N<$f|XQ|O8@`> literal 0 HcmV?d00001 diff --git a/rx_06.png b/rx_06.png new file mode 100644 index 0000000000000000000000000000000000000000..721a187f897a0a0982bc8e1f6ccda91c70559828 GIT binary patch literal 974 zcmV;<12O!GP)%AZT z`RNed9$+O89&HZJubjAmGj?ORj=6HSCO9NBvNq0eF{>j3D>&Z3K`WUg-i&n@6`mL& zSybruKrW1}+kQjX>qe6{Tp3Qg%MlzV`3a*{y0unhpXRJvPq5z^Q*rAC( ziXub9-;GHk%89cdokJ=-zR!9W1~4>I26u!ss0nXtl0!~#+%O`lh*B_{DSJ~8c>|f& zSBvwjfS&~-XJ;%!r>!KZ8$#F^+FLOciq|?Q{3>Ig7O9@)j5Ek`LSc2_NK#A^BCra! zrfEq%EA#~9i#v1}NFWimpVTA*P&O)ubn6iTO53gIGZsduv7nsFHA&GX!b4GQXp+?k2Rez_~KU#h_ za0;3ARjwgxyQ-Cn7HjWHf3P1yjpdEpQ9;fE(tX6#R1}n&%CczFiKx1#D;-bdbXrG^ zkxtYwrhs7_ROxO&T1WGuZ(n&TWOd%dsPwN+4}=<62Q|(p`90(Pr>_VQEYFOZ(O>$u zRi+?6+9A7jOP|u$(~h5D4s=MhvSpF4w%tN*N`S{ w1(DQs^aw4BET^F_+nhiZ`G*F7;N$_H|5NB+Ql-N~F8}}l07*qoM6N<$f?DptAOHXW literal 0 HcmV?d00001 diff --git a/rx_07.png b/rx_07.png new file mode 100644 index 0000000000000000000000000000000000000000..348018dd394fb2377a645f119efc12389097fc60 GIT binary patch literal 1087 zcmV-F1i<@=P)j;fOvoJey`hiaqjNe z_1e2@MRIKx*Uj$zxj%|~F8f}8@WO@97w{fvd>G?%!}48i)v?^%1IhVnEZiK2;+ibZ z%dUIr^RGj&JU|o=o^4FdS56GW8M`rjj#)Vy!udbf!A*x$Mn*E=YF1|kMshp~2SqVS zxEbpj6-e$?IetWhR8g@Gl)~6p_S1yDZZu&t&g>kR(RnpOXg+u~uqf0fwWVMR_Ng(%EI z%;;{Bx`W3ZY2b{a@C>q8P*@x|(kUh#A`pVDt&vH?p(7juK|xU@XKoTZ5Agb=CV>HE zD5&?i9MY{v6k7rM6@A6RoaF4lE(&6Dy;6q|?mD$X_V6?q7z$!>qJyct#2L|%SL*Q~ z7j*V1L6FTHc3P8QQl+lohhm?ist`(R1t)koNl-Y@)y1wrmePaRl;BTfj7(x@B35<@ z0|ktZi4fONXzX_&1xclj;&+GcMk4jN#q22Bi^hysvy?@C;GqNErWuObi1T!;ydT0t zybhrlJIbviUMd#mu)<0|<88=tYXYaG$_GNEiUy!xAiDKP)|9(e7@{zUf)qC4!(~SC zOB+RWVG?9jD>Ibx3X$-6SU;eULfn~NjT1$Z2Zr?2U11Q0Ue%RhXx^`Kykbu*{w4BybAsS*AulE$5Wg9}A4k9V769q1jwvhXm}9T|kE+o(_T3g9hvs3z0M2L}&>apIyYEGok= zsnXeiw2tQGzI{b=;&B>eb>72J`d6n1;u=^nCK%7tX#rf-vQ(GQeMP{<@(?uFxj)3j zP%`_-RVQrDo-Rb3^yND*u7h)*;OseSx)1=Y;yut&VOj&11DFJG(a{1fWPMtzssf+s)PUl002ovPDHLk FV1l;k{eoka4Sa{~lj0>?f}CyJuveN>?U0Q`D?0;sRQtIyZ>=kVLr zvDb62&Q;C1Ih?n<_UrdGT$AEHn&Uox;{$Je{Q|x&UN6RYedF?XdQZo4aSAlQS8L(o zI1K0H@H=(hfB(kiIO53byF+lfff{bSd$akya$*_ISgql8&C1yj&c}alG{K!i8W6%;3eYn-f#BucDr(lX?m7SBTdxtDy-myiugC;BiG7 zRy9nQ+wfElNes^ccT-2YOhy??(N{D(KY{2+lloNX!H^lQ&_P22>27MLCV>HE7^rtb zv-w00N$U~CR)D;spIDe(7ztsZfYAg7aWX<&Lm~LyffO{AI)={)-R&d~+=w=(ia$bo5$t#di|^=T>Oi+? zHVK0aVR3Tm@qP$z>>z~3LQo{SEX-kr5RE4#HXd_GQWH2WRo)OHRWty3f#}vFNf+^G zgmml%K~7)@A1*VhH@#^jW;ZuJBEQ4T2@|b##61R1fhq3MtTSNN9TR~#T&4ftF)TB= zD!nR|VQ5}&ay){h%prRC(@EW_6I70X(dta`osB}PCP2zqtLl$%XnGw_>JE-Ng9%D= z+HtU3_$57ZnmvyC8QA(2iG2=lM^m6V(UBTd^X1eXkaioVO4x0H z?JzT#3=EAncARCY;*FSx3wC-E6J)rp)RcK8qdv|M;oFls0^C*7c+zihG_*wUbD;|c zd^-Bwah8QQgu0SJ6wkk#R{(F=VcJZ9H&gIvgrpTSO$bv;Elr4X8b}ll+8wSt4q54l z=pAVTLDY4-yf%!NPRG#5dB^23ATz2Gir;c)}aRj}SM;_S02KJ+2D!@F?oA$Mx zsT9SGoQ>yf6g~-A$#WP=|4Mowu7QEP#&N~Zq@Ti*kOi|#=sqIgVtEOg>s%i}$I+dN zbf*4~)gh}w=PrHS?fAj$fjC`1SDta^nK`WKc!Z?A?xbCtJ}#}AVKkC%Ix`07NBXY0 z^3kM@3TCv^HFT3Unn+3=?QEWjejk@koaeX!|6!XQsB->?2HtS8qOTLFf!H8#di?

x zj^juSgV}rkOYOm$wSRhm9RR3(7XlfbdddQcQqnXhwnBuV}`z9pTXzi;oK$9MDH zw{xG@e!JEwuI=W!)xCdzewurFc#iMk*@tz0{i`p5*FVzF&Cf4m{66&f+a2Axez}K= z?@w#-%Xw<9>E?UWb^rWZkMsO;uj;%b{QBD=dOW~s9=tkSe1CG{0nT_^!|ydu&eq_3 z6^2$}+%v3Qk3c~V>5Qym!Ch2W23B#tfrCyHBz{@zGb>cwYjS*bo{P^_IMv$>>9RtP z3wtp3Gdc`mFU=+jkt+z173_4`r6wrfG6gxr@WH!?_mJXUv+# zn;JyfVC;|zjvHpglu@*h8bmQ+OT>X4T|GgjtQ?Yf`7ERQS@0%yCJ2WLsJ6qx{+9I} zW1QGyM0*7nOBh+&_)W&%HmNSyj|TeP)iwptxb8zvXm}3=PRnZ^i2GJfUsXhY0?`WV z)kkWG04G09^cfWR312roi2#&oXy_=-p6Z=$AXV&z<(He%CflOX7@hHZNi!OT|^s0N6# z5*IZzhbJiNRc#QYrMe6fH4aRmFzJ1|XTgv)=|K)9_>GKFN$hSUjD#?FfYAg72{~9d zhSX3BJ|~c(qElD%KB2pnjbqI?V?>m;+QO`qs z5kU%#rJzZq&_VkGhe1Y~O5bKk(i4!8sxO4dDH{^`n}~;-@$tmUu4_og2xv`k2p^Og zoev!zvP(g2B-!j{lLV%{q$YHl(FF^_*#BXb{!h@0O_<* z%{-e9z&6ZGkb$Yt#spaEDnksLHxB~aW+u@=1|6lQ%q!XILzD^wcQxH+6-`;vRyD(AjB?{&a?<9kU^XO-+>{#E}7# z!6u2#<~q7f_G;IOf?Xsx(uRVptD^i|7?0Kqhc%BlCzjvI;z`sekyOFvq?{U#cLg$W zf?$V%wkYV?JcJs{FLK8OIR{Ah8Z@KIQIp)VDfk@&l|DG2A{5Tr$s@@yC&hKrN0Dw^ z!R&?LojB56k!06@R|hTjvxahn>t*yPh^TZfpZq9?46Xzj zk(*-eMV-?Ivb2DtbmEuxE&{_agQA=68SC~6=%rRBBZrR^buF0DW@<=_wu($j9ZiDA zVjIf}0%WCS8L}Abe&(?K9~yk&WD2yjBQ*j8s|nV?>p$yXdCQxjL`?ty002ovPDHLk FV1g6*VkQ6p literal 0 HcmV?d00001 diff --git a/rx_10.png b/rx_10.png new file mode 100644 index 0000000000000000000000000000000000000000..075f8999589db9056e47ad51bd38de3e0cf458e6 GIT binary patch literal 1381 zcmV-r1)BPaP)*O{{IU^j|%K&N<|wl!6FNTVwBbr~ zJIzZk0n5>#g~U45?BxWHC#7_QJdHK47OOi!X|Ng(&{sXn&A~dboJklPq5^?nH|JCN zIh`$T9S3=UBV9QD%8CpR{(Ft|a207Id8O<9d0y!b_s>Vo}fpx>QuQvi*`-yJPv zhX?P$!Rc~N8bDb&eN~Oy7@`&WE9b;#jXt8{;Fb0nICwSMB;Ca%0#K$QprbT<@^^wk zrz@v!cyI|@k@ASXV_|f|#JNty#6jFNu`~na`%<3u&mRg?1gR4>U|@#yG0lTbe#sD~ z9FiIjZ0ndhv2rd?1F`A5DIw_4huy{`f|jpFQ5}$t#%kBN2oiC28_J3(->8X-AxK3Aq*a1G=V`v4w4Y!OKBE9C2hc)a%#<<7EW__ zZ8emsrMTNcV<#vD@M{=9q)g32gGDj-LUDosLm>E>;Jb?qt%q7ml5O>1i30syG{*;n z#D#Fwkj6QzYfJ)m=)`G$jn+6U9*@zef2gypDA`ANyNUpfSVwxGQ>{TSNI=&^MzY1} zI(;hP-jqW93o%UBjX|3d_9ZhDWMC?CV*)HSP?Ck}3mwD=1bY)R>L7!bQd8!YwEB=t zg#+tv#;%wJ37Be9Zy-6eB;iM)OW*)W{*G2V#nMRY8fpZcJ;hjoZVu{KNLt*3G7&mE ztQpo=?+RGr1i=m!Ev>t#63FC41rAl}UxE=}SJS3kWC#Rm z7gaQ#kN{mIVZpWHqLX!(9=R>%Bmt!Z|DcA((=HqO5)iGz9$#s@d10n%DDL`s)4De4 zN|~4uQ9Pn3zOW|9G}r6C)Gq&}3_s(hGzItE1b>qy5O@sx%2pInChtek#R_h=YZRar zN7@xhy8c04YJ_-KjdH%!9t9ee*5#9za!BDyL3d*1tbO6<63aAw3-_iB`!;qFD26#q zbtftL>5V4?5;65893e}g(|!{er9R0(<9uO-g34pD#&QD%A@vT3sS!ivD%SW1j11dsI`c4c00000NkvXXu0mjfa(0W8 literal 0 HcmV?d00001 diff --git a/tx_00.png b/tx_00.png new file mode 100644 index 0000000000000000000000000000000000000000..6847583d0fc5dafeca51fbbf919bba8f3b1e8765 GIT binary patch literal 99 zcmeAS@N?&q;$mQ6;PUiv2?EkNKy1Ll1|+{|&36P++MX_sAr-gY9yDYG@(wNd>YvNS ezW~U@0Q-0X4Hy^`4^5o`lJa!*b6Mw<&;$U-fKb7-5`NtPS(MPf>a>uP0LO0Woo!|(|Q(l)h^s%-QE)zs&B+E-zLYU%+S;jbFI zOua=R)5NWK$yA9zH1*h&u>LJl8j|{7>#sm2#6J+RhD3psL-JV4>#tPOVCtuu#FH{y z9>U(T>W5#I5x8=SMiw!L%<~T**Y8%$UTE5~ykrkkxyU92sUE58Z!95EAXX=9?x@NT zAykD}*{Y_WSgKM4szT0V%M=VdO+Ah(Q7~*Vb;n*TJ`1oyVN(vN2_5O^)^t&htB^RP zbSnf2R1c}&{#eXiq|gb8ak2Vj?(&f)h3sePq58dZ?X3Z^`ia_J9$v9sY{20yjnD{L z!{0m`(TQPOb+V4BtO`{pt<_14^N^fP1oDefl~+6(N(BA{}yMIn2aH48?KEgpUW X=iPKP>%q6k00000NkvXXu0mjf5KQu< literal 0 HcmV?d00001 diff --git a/tx_02.png b/tx_02.png new file mode 100644 index 0000000000000000000000000000000000000000..e1df5d1919b689af2889e4085946cfa286f001f1 GIT binary patch literal 812 zcmV+{1JnG8P)d#~9DJU}``^u#;G%5;gmhtWH@sKdU%wkDGt4Aa%wP(^4*|YReRcRk>A02~>L$c74mw0fa?SBV>;_)|3I&|s^?$=S zC|Luc8kPFn_=})ba$#g>6J>|=6ht?Lh$7L$Su_^sXZA^p4nZPklsd!rktF|0 zMo}4uQ`VbJVs6a?<626-0gKUZo#ZKNLQvEsTEZFut4XP6Jz)W|kcb_w8!U~?wBY|? z%F>b>BF99BI1)Xh0kTl?f`u_S6So(FkA*@WX@RUt;EA){*Of#+>gFX~MuT;t$UfCm zlxQfbE5Ph5A*pwFND5o4yNiWKjP}X@=nxc(RIAR2Ntf56F%C#wOQC0>Fd9hSl9&{B zNVg7I1)mHLOBb#XSOHhGPFgy|oJlAPY~`nZU3br&#W>^;DHER8LbUjug$a!v(xlXF zF$!(5MPl-iye{u^F^&r|)plhT?slHM2}wr7*oy*w{NfanK(rFF7%d&*52O+J=^jm- zvfBaAIP8!-A;q;3EV~nd_w7N92J56!+wrvo*$Tl-_Kai5io~r>lSCuY76UO7Jv*dL zhrHH1bL`!Jd~B)^KV-_wf%zKp`Ki$hQ(KCXvIp-n0w$$}ggA1c41g8TP%{W$!6 zLa*U`hlOWF{^~!Kv0{G?XG6rDkDq#;4<|wpu3vxSbnr42oX5Ji9%Gw;$nDh2na66z z9Tc2F@z*st7cR4Wz}DaOnXx7y@mN{1oUQ3B?jD3J@tNZt@85O3XN&|yZs(|5#oCq` zxNKM@3$DcZXVu+zJ%h=RT|g{23c;By02Tr$Asgy>l|vA08lxE^#fc!8Aa|+3c^#oF zAq9*9I3^g6_5;VD;3#e^Ki758EQrrULQqTB1m&S*<&|DnxUc(l#VY~%4B{1k#vVak zO0BmR>@_hmb(x^I`z^698Bl)*>fVtN*crp}WzEywOqq|yFgKDmCF?muA`bX6lpXF@ zI6{w+GblEagB>3lL$tjHN-67ml>DqD3SH^&Si`b-N#a2P3Cb#Ww(U(SH6CllMcJot zIS4h#7;*87bYi97K*#_o%!#otrK)iX;8@d#Xy~4EvnL7IC1gXS%uC~{nPP!fk8MFc z4w)D>M2s=Yxnkmz%Z!tuI6SF2&n?$7SSXrgbdpJ=T+e#T;@5EI^qu_B{v!MV<_Kl_9)r)vj9#j$k9BD3$IJ0y@@8C!krv z94sU|Bwz~5I>y?@nm)uf;-KA>7YPfL>R(oZiDo1`w(Uc@+ApDD^y~|b=5^d-o6M3a zS-T8@6A87Ht-PA++?`QeO^i&77&+Erh*F2=S%{JU<$YHmLn%q+P-NuyhfWl>3_YN>hH|K$z{ZGD@3QmedRyd(04o zPY7zwzsj1(em6VQ!1#E0Fk~w(GRN6w7QWjav>yczhI|wkvx1v@61EW{gFQqjLD1O_ z^sZz@;5OHjL?IDnmJxwoX|PyNGXZ&pA-uM)u3Lk0%Xg}vOdpXN!6{iEFeHD9z*l^S z9cVUc^PXm`35byn9j#)E3V6qPdH!Z`b}oL|;Bb{^`u0{Ct@Vahfj~0_#rvLbu rAwqR2G+Tf`fE}e#?7l6T!1VSXN&|u9DXFO=00000NkvXXu0mjfhkw-X literal 0 HcmV?d00001 diff --git a/tx_04.png b/tx_04.png new file mode 100644 index 0000000000000000000000000000000000000000..46cfa3ff88e8693a314cae98694133ebe2b702ba GIT binary patch literal 1226 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 b2od-X-WwD(&l>2G00000NkvXXu0mjf5MrX2 literal 0 HcmV?d00001