Main Page   Class Hierarchy   Compound List   File List   Compound Members  

C_DisplayControl.cpp

00001 /*
00002  *  This program is free software; you can redistribute it and/or modify
00003  *  it under the terms of the GNU General Public License as published by
00004  *  the Free Software Foundation; either version 2 of the License, or
00005  *  (at your option) any later version.
00006  *
00007  *  This program is distributed in the hope that it will be useful,
00008  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00009  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00010  *  GNU General Public License for more details.
00011  *
00012  *  You should have received a copy of the GNU General Public License
00013  *  along with this program; if not, write to the Free Software
00014  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00015  *
00016  * (c)Copyright 2006 Hewlett-Packard Development Company, LP.
00017  *
00018  */
00019 
00020 #include "C_DisplayControl.hpp"
00021 
00022 #include "Utils.hpp"
00023 #include "GeneratorTrace.hpp"
00024 
00025 #include <cstdlib>
00026 #include <pthread.h> // for sched_yield()
00027 
00028 #define MAX_KEY 255
00029 
00030 #define DISPLAY_LINE()\
00031         printf("|-----------------------------------------------------------------------------|\r\n")
00032 
00033 
00034 #define DISPLAY_LINE_EMPTY()\
00035         printf("|                                                                             |\r\n")
00036 
00037 #define DISPLAY_3TXT(T1, T2, T3)\
00038         printf("| %-22s | %25s | %23s |\r\n", (T1), (T2), (T3))
00039 
00040 
00041 #define DISPLAY_INFO(T1)\
00042         printf("| %-76.76s|\r\n", T1)
00043 
00044 #define DISPLAY_NEXT()\
00045         printf("|--- Select a key ----------------------- Next screen : Press the same key ---|\r\n")
00046 
00047 
00048 
00049 
00050 C_DisplayControl::C_DisplayControl():C_TaskControl(){
00051   int L_i;
00052 
00053   m_sem = NULL ;
00054   m_stat = NULL ;
00055   m_sem_scr_id = NULL ;
00056   m_screen_id = (int)'1' ;
00057   m_previous_screen_id = m_screen_id ;
00058   m_pause = false ;
00059   m_sem_pause = NULL ;
00060   NEW_VAR(m_screen_list, T_ScreenDataList());
00061 
00062   ALLOC_TABLE(m_screen_table, T_pScreenByKey, sizeof(T_ScreenByKey), MAX_KEY);
00063   for(L_i=0; L_i< MAX_KEY; L_i++) {
00064     m_screen_table[L_i].m_nb_screen = 0 ;
00065     m_screen_table[L_i].m_current_screen = 0 ;
00066     m_screen_table[L_i].m_screen_object = NULL ;
00067     m_screen_table[L_i].m_comment = NULL ;
00068   }
00069   m_current_screen = -1 ;
00070   m_current_display = NULL ;
00071 
00072   m_help_table_size = 0 ;
00073   m_help_table = NULL ;
00074   NEW_VAR(m_help_list, T_HelpInfoList());
00075 }
00076 
00077 C_DisplayControl::~C_DisplayControl(){
00078 
00079   int L_i ;
00080 
00081   DELETE_VAR (m_sem) ;
00082   m_stat = NULL ;
00083   DELETE_VAR (m_sem_scr_id);
00084   DELETE_VAR (m_sem_pause);
00085 
00086   if (!m_screen_list->empty()) {
00087     m_screen_list->erase(m_screen_list->begin(), 
00088                          m_screen_list->end());
00089   }
00090   DELETE_VAR(m_screen_list);
00091 
00092 
00093   for(L_i=0; L_i < MAX_KEY; L_i++) {
00094     FREE_TABLE(m_screen_table[L_i].m_screen_object);
00095     FREE_TABLE(m_screen_table[L_i].m_comment);
00096   }
00097   FREE_TABLE (m_screen_table);
00098 
00099   m_current_display = NULL ;
00100 
00101   if (!m_help_list->empty()) {
00102     m_help_list->erase(m_help_list->begin(),
00103                        m_help_list->end());
00104   }
00105   DELETE_VAR(m_help_list);
00106 
00107   FREE_TABLE(m_help_table);
00108                   
00109 }
00110 
00111 void  C_DisplayControl::init(long P_period) {
00112   GEN_DEBUG(0, "C_DisplayControl::init() start");
00113   m_stat = C_GeneratorStats::instance() ;
00114   NEW_VAR(m_sem_scr_id, C_Semaphore());
00115   NEW_VAR(m_sem_pause, C_Semaphore());
00116   NEW_VAR(m_sem, C_SemaphoreTimed(P_period));
00117   m_sem -> P();
00118   C_TaskControl::init() ;
00119   GEN_DEBUG(0, "C_DisplayControl::init() end");
00120 }
00121 
00122 
00123 T_GeneratorError C_DisplayControl::InitProcedure() {
00124   GEN_DEBUG(0, "C_DisplayControl::doInit() start");
00125   m_stat->init();
00126   GEN_DEBUG(0, "C_DisplayControl::doInit() end");
00127   return (E_GEN_NO_ERROR);
00128 }
00129 
00130 T_GeneratorError C_DisplayControl::TaskProcedure() {
00131 
00132   bool L_pause ; 
00133 
00134   GEN_DEBUG(0, "C_DisplayControl::doTask() start");
00135 
00136   m_sem_pause->P();
00137   L_pause = m_pause ;
00138   m_sem_pause->V() ;
00139 
00140   if (L_pause == false) {
00141     m_current_display->displayScreen();
00142   }
00143 
00144   m_stat->executeStatAction(C_GeneratorStats::E_RESET_PD_COUNTERS);
00145   sched_yield () ;
00146   m_sem -> P() ;
00147   GEN_DEBUG(0, "C_DisplayControl::doTask() end");
00148   return (E_GEN_NO_ERROR);
00149 }
00150 
00151 T_GeneratorError C_DisplayControl::EndProcedure() {
00152   // nothing to do at the end
00153   // just display the last screen
00154 
00155   m_current_display->displayScreen();
00156   
00157   return (E_GEN_NO_ERROR);
00158 }
00159 
00160 T_GeneratorError C_DisplayControl::StoppingProcedure() {
00161   M_state = C_TaskControl::E_STATE_STOPPED ;
00162   m_sem->V();
00163 
00164   return (E_GEN_NO_ERROR);
00165 }
00166 
00167 void C_DisplayControl::set_screen (char P_key) {
00168   int L_current ;
00169   bool L_first = false ;
00170   m_sem_scr_id->P() ;
00171   m_screen_id = (int)(P_key);
00172 
00173   // std::cerr << "m_screen_id " << m_screen_id << std::endl;
00174   // std::cerr << "m_screen_table[m_screen_id].m_nb_screen "  
00175   //        << m_screen_table[m_screen_id].m_nb_screen << std::endl ;
00176 
00177   if ((m_screen_id <= MAX_KEY) && (m_screen_table[m_screen_id].m_nb_screen != 0)) {
00178     m_current_screen = m_screen_id ;
00179 
00180     L_current = m_screen_table[m_screen_id].m_current_screen ;
00181     if (m_previous_screen_id != m_screen_id) {
00182       m_previous_screen_id = m_screen_id ;
00183       L_first = true ;
00184       L_current = 0 ;
00185     } else {
00186       L_current++ ;
00187       if (L_current == m_screen_table[m_screen_id].m_nb_screen) { L_current = 0; }
00188     }
00189 
00190     m_screen_table[m_screen_id].m_screen_object[L_current]->setCurrentScreen(L_first);
00191     m_screen_table[m_screen_id].m_current_screen = L_current ;
00192     m_current_display = m_screen_table[m_screen_id].m_screen_object[L_current] ;
00193   }
00194   
00195   m_sem_scr_id->V() ;
00196 }
00197 
00198 T_GeneratorError C_DisplayControl::ForcedStoppingProcedure() {
00199   return (E_GEN_NO_ERROR);
00200 }
00201 
00202 void C_DisplayControl::pause () {
00203   m_sem_pause->P() ;
00204   m_pause = (m_pause == true) ? false : true ;
00205   m_sem_pause->V() ;
00206 }
00207 
00208 void C_DisplayControl::init_screens() {
00209 
00210   T_ScreenDataList::iterator  L_it      ;
00211   int                         L_current ;
00212 
00213   T_HelpInfoList::iterator L_list_help_it ;
00214   T_HelpInfo               L_list_info ;
00215 
00216   if (!m_screen_list->empty()) {
00217 
00218     for(L_it = m_screen_list->begin();
00219         L_it != m_screen_list->end();
00220         L_it++) {
00221       m_screen_table[(int)(L_it->m_key)].m_nb_screen++ ;
00222     }
00223     
00224     for(L_it = m_screen_list->begin();
00225         L_it != m_screen_list->end();
00226         L_it++) {
00227       if ((m_screen_table[(int)(L_it->m_key)].m_screen_object)
00228           == NULL) {
00229         ALLOC_TABLE(m_screen_table[(int)(L_it->m_key)].m_screen_object,
00230                     C_DisplayObject**,
00231                     sizeof(C_DisplayObject*),
00232                     m_screen_table[(int)(L_it->m_key)].m_nb_screen);
00233 
00234         L_list_info.m_key = L_it->m_key ;
00235         L_list_info.m_comment = L_it->m_comment ;
00236         m_help_list->push_back (L_list_info);
00237       }
00238       L_current = m_screen_table[(int)(L_it->m_key)].m_current_screen ;
00239       if (m_current_display == NULL) {
00240         m_current_display = L_it->m_object ;
00241       }
00242       m_screen_table[(int)(L_it->m_key)].m_screen_object[L_current]
00243         = L_it->m_object ;
00244       m_screen_table[(int)(L_it->m_key)].m_current_screen++ ;
00245     }
00246 
00247     for(L_it = m_screen_list->begin();
00248         L_it != m_screen_list->end();
00249         L_it++) {
00250       m_screen_table[(int)(L_it->m_key)].m_current_screen = 0 ;
00251       m_screen_table[(int)(L_it->m_key)].m_comment = L_it->m_comment ;
00252     }
00253 
00254     if (!m_help_list->empty()) {
00255       L_current = 0 ;
00256       m_help_table_size = m_help_list->size();
00257       ALLOC_TABLE(m_help_table,
00258                   T_pHelpInfo,
00259                   sizeof(T_HelpInfo),
00260                   m_help_table_size);
00261       for (L_list_help_it = m_help_list->begin();
00262            L_list_help_it != m_help_list->end();
00263            L_list_help_it++) {
00264         m_help_table[L_current].m_key = L_list_help_it->m_key ;
00265         m_help_table[L_current].m_comment = L_list_help_it->m_comment ;
00266         L_current++;
00267       }
00268     }
00269   }
00270 }
00271 
00272 void C_DisplayControl::add_screen(C_DisplayObject *P_display, 
00273                                   char P_key,
00274                                   char *P_comment) {
00275   T_ScreenData L_screen_data ;
00276 
00277   L_screen_data.m_object = P_display ;
00278   L_screen_data.m_key = P_key ;
00279 
00280   ALLOC_TABLE(L_screen_data.m_comment,
00281               char*,
00282               sizeof(char),
00283               strlen(P_comment)+1);
00284   strcpy(L_screen_data.m_comment,P_comment);
00285 
00286   m_screen_list->push_back(L_screen_data);
00287 }
00288 
00289 void C_DisplayControl::add_help(char P_key,
00290                                char *P_comment) {
00291 
00292   T_HelpInfo L_info ;
00293 
00294   L_info.m_key = P_key ;
00295   L_info.m_comment = P_comment ;
00296   m_help_list->push_back (L_info);
00297 
00298 }
00299 
00300 int  C_DisplayControl::help_all_screens(int P_counter) {
00301 
00302   int    L_i ;
00303   //  bool   L_found = true ;
00304   int    L_counter_help = m_help_table_size ;
00305   int    L_count ;
00306 
00307   DISPLAY_LINE ();
00308 
00309   // Add version tool : VERSION
00310 
00311   DISPLAY_INFO("Key: Description");
00312   DISPLAY_LINE ();
00313 
00314   L_count = 0 ;
00315   for (L_i = P_counter ; L_i < L_counter_help ; L_i++) {
00316     printf("|%c : %-73.73s|\n\r", 
00317            m_help_table[L_i].m_key, m_help_table[L_i].m_comment);
00318     if (m_help_table[L_i].m_key == 'c' ) {
00319       printf("|    set call-rate      50 : call-rate become 50 c/s                          |\r\n");
00320       printf("|    set call-rate-scale 5 : use +/- key to increase/decrease call-rate by 5  |\r\n");
00321       L_count += 2 ;
00322     }
00323     
00324     L_count++;
00325     if (L_count > 19) {
00326       DISPLAY_NEXT();
00327       return (L_count) ; 
00328     }
00329   }
00330 
00331   if (L_count < 20) {  
00332     for (L_i = L_count ; L_i < 20 ; L_i ++) {
00333       DISPLAY_LINE_EMPTY();
00334     }
00335   }
00336   if (P_counter > 0) {
00337     DISPLAY_NEXT();
00338   } else {
00339     DISPLAY_LINE ();
00340   }
00341 
00342   return (L_count) ; 
00343 }
00344 
00345 
00346 void C_DisplayControl::change_display_period (long P_period) {
00347   m_sem -> change_display_period(P_period);
00348 }
00349 
00350 
00351 // end of file
00352 
00353 
00354 
00355 

Generated on Wed Mar 7 14:44:49 2007 for Seagull by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002