00001 // Copyright (C) 2005-2009 Christopher Mire 00002 // Copyright (C) 2005-2009 University of Louisiana at Lafayette 00003 00004 #ifndef CAJUN_CBSTAT_UI_BASE_H 00005 #define CAJUN_CBSTAT_UI_BASE_H 00006 00007 #include "queue_generator.H" 00008 #include "util.H" 00009 #include "cb_time.H" 00010 #include "conf.H" 00011 #include <gtk/gtk.h> 00012 #include <cstring> 00013 00014 namespace cajun 00015 { 00016 enum { VALID, QUEUE_TITLE, FREQ, DATA, VIEW, N_COLUMNS }; 00017 00018 class my_ui_base_t 00019 { 00020 public: 00021 my_ui_base_t (const gchar *name_); 00022 virtual ~my_ui_base_t () {} 00023 00024 void init (); 00025 void update_ui (); 00026 00027 virtual const unsigned num_fields () const = 0; 00028 virtual const std::string get_queue_member (const unsigned FIELD_) const = 0; 00029 virtual const std::string get_queue_member_value (const unsigned FIELD_) const = 0; 00030 virtual gboolean new_data () = 0; 00031 const std::string get_class_name () const {return std::string (name);}; 00032 00033 void set_tree_store (GtkTreeStore *store_) 00034 { m_store = store_; } 00035 void set_parent_iter (GtkTreeIter iter) 00036 { m_parent_iter = iter; } 00037 void set_child_iter (GtkTreeIter iter) 00038 { m_queue_iters.push_back (iter); } 00039 00040 protected: 00041 virtual double read_data () = 0; 00042 00043 GdkPixbuf *m_pixbuf_yellow; 00044 GdkPixbuf *m_pixbuf_active; 00045 GdkPixbuf *m_pixbuf_deactive; 00046 00047 GtkTreeStore *m_store; 00048 GtkTreeIter m_parent_iter; 00049 std::vector<GtkTreeIter> m_queue_iters; 00050 00051 gdouble time_interval; 00052 const gchar *name; 00053 gdouble tstamp; 00054 gdouble data_record1; 00055 gdouble data_record2; 00056 gdouble latest_tstamp; 00057 }; 00058 00059 template <typename T> 00060 class my_ui_t : public my_ui_base_t 00061 { 00062 public: 00063 my_ui_t (const gchar *name) : my_ui_base_t (name) 00064 { 00065 m_reader = get_queue_reader (&data_t); 00066 } 00067 virtual ~my_ui_t () { delete m_reader; } 00068 00069 void update_ui (); 00070 00071 const unsigned num_fields () const; 00072 const std::string get_queue_member (const unsigned FIELD_) const; 00073 const std::string get_queue_member_value (const unsigned FIELD_) const; 00074 00075 gboolean new_data () 00076 { 00077 if (m_reader->at_head ()) 00078 return false; 00079 else 00080 { 00081 m_reader->next (data_t); 00082 return true; 00083 } 00084 } 00085 00086 protected: 00087 double read_data (); 00088 T data_t; 00089 data_queue_reader_t<T> *m_reader; 00090 }; 00091 00092 template <typename T> 00093 double my_ui_t<T>::read_data () 00094 { 00095 if (! m_reader->initialized ()) 00096 return -1; 00097 00098 // save old data , used for determining frequency 00099 data_record2 = data_record1; 00100 00101 if (strncmp (name, "cbmesg", sizeof (name)) != 0) 00102 { 00103 if (! m_reader->at_head ()) 00104 latest_tstamp = cb_time_t::curr_time (); 00105 data_record1 = m_reader->head (data_t); 00106 } 00107 else//dont want to skip date from cbmesg 00108 { 00109 if (! m_reader->at_head ()) 00110 { 00111 data_record1 = m_reader->next (data_t); 00112 latest_tstamp = cb_time_t::curr_time (); 00113 } 00114 00115 } 00116 00117 gdouble new_time = cb_time_t::curr_time (); 00118 00119 return (data_record1 - data_record2) / (new_time - tstamp); 00120 } 00121 }; 00122 00123 00124 #endif