00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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>
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
00153
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
00174
00175
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
00304 int L_counter_help = m_help_table_size ;
00305 int L_count ;
00306
00307 DISPLAY_LINE ();
00308
00309
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
00352
00353
00354
00355