Main Page   Class Hierarchy   Compound List   File List   Compound Members  

C_DataLogControl.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 "Utils.hpp"
00021 #include "GeneratorTrace.hpp"
00022 #include "C_DataLogControl.hpp"
00023 
00024 #include <pthread.h>
00025 #include "iostream_t.hpp"
00026 
00027 C_DataLogControl::C_DataLogControl(size_t         P_max_data,
00028                                    size_t         P_max_data_log,
00029                                    char          *P_file_name, 
00030                                    unsigned long  P_period) {
00031 
00032   size_t L_i ;
00033 
00034 
00035   GEN_DEBUG(0, "C_DataLogControl::C_DataLogControl()");
00036 
00037   m_size_log = P_max_data_log ;
00038   m_size     = P_max_data ;
00039 
00040   NEW_VAR(m_sem, C_SemaphoreTimed(P_period));
00041   NEW_VAR(m_available_sem, C_Semaphore());
00042   NEW_VAR(m_values_sem, C_Semaphore());
00043 
00044   NEW_VAR(m_values, T_LogValuePList());
00045   NEW_VAR(m_available, T_LogValuePList());
00046   NEW_VAR(m_log, T_LogValuePList());
00047 
00048   ALLOC_TABLE(m_data_values, C_LogValue**, sizeof(C_LogValue*), m_size);
00049   for(L_i = 0; L_i < m_size; L_i++) {
00050     NEW_VAR(m_data_values[L_i], C_LogValue((char*)""));
00051     // init all to available
00052     m_available->push_back(m_data_values[L_i]);
00053   }
00054 
00055   NEW_VAR(m_output_stream, fstream_output(P_file_name));
00056   if (!m_output_stream->good()) {
00057     GEN_FATAL(0, "Unable to open file ["
00058               << P_file_name << "] for data logging");
00059   }
00060   
00061   m_time_ref = 0.0 ;
00062 }
00063 
00064 C_DataLogControl::~C_DataLogControl() {
00065 
00066   size_t L_i ;
00067 
00068   GEN_DEBUG(0, "C_DataLogControl::~C_DataLogControl()");
00069 
00070   DELETE_VAR(m_sem);
00071   DELETE_VAR(m_available_sem);
00072   DELETE_VAR(m_values_sem);
00073 
00074   if (!m_values->empty()) {
00075     m_values->erase(m_values->begin(), m_values->end());
00076   }
00077   if (!m_available->empty()) {
00078     m_available->erase(m_available->begin(), m_available->end());
00079   }
00080   if (!m_log->empty()) {
00081     m_log->erase(m_log->begin(), m_log->end());
00082   }
00083   DELETE_VAR(m_values);
00084   DELETE_VAR(m_available);
00085   DELETE_VAR(m_log);
00086 
00087   for(L_i = 0; L_i < m_size; L_i++) {
00088     DELETE_VAR(m_data_values[L_i]);
00089   }
00090   FREE_TABLE(m_data_values);
00091   DELETE_VAR(m_output_stream);
00092 
00093 
00094 }
00095 
00096 T_GeneratorError C_DataLogControl::InitProcedure () {
00097   T_GeneratorError L_err = E_GEN_NO_ERROR ;
00098 
00099   struct timezone L_zone ;
00100   struct timeval  L_time;
00101 
00102   GEN_DEBUG(0, "C_DataLogControl::InitProcedure()");
00103 
00104   gettimeofday(&L_time, &L_zone);
00105 
00106   m_time_ref = (double)L_time.tv_sec*1000.0 + (double)L_time.tv_usec/1000.0 ;
00107  
00108   m_sem->P() ;
00109 
00110   return (L_err);
00111 }
00112 
00113 
00114 T_GeneratorError C_DataLogControl::TaskProcedure () {
00115   T_GeneratorError L_err = E_GEN_NO_ERROR ;
00116 
00117   GEN_DEBUG(0, "C_DataLogControl::TaskProcedure()");
00118 
00119   sched_yield() ;
00120   do_log() ;
00121   m_sem->P() ;
00122 
00123   return (L_err);
00124 }
00125 
00126 T_GeneratorError C_DataLogControl::EndProcedure () {
00127   T_GeneratorError L_err = E_GEN_NO_ERROR ;
00128 
00129   GEN_DEBUG(0, "C_DataLogControl::EndProcedure()");
00130   do_log () ;
00131   do_log_cumul () ;
00132   return (L_err);
00133 }
00134 
00135 T_GeneratorError C_DataLogControl::StoppingProcedure () {
00136   T_GeneratorError L_err = E_GEN_NO_ERROR ;
00137 
00138   M_state = C_TaskControl::E_STATE_STOPPED ;
00139   m_sem->V();
00140 
00141   GEN_DEBUG(0, "C_DataLogControl::StoppingProcedure()");
00142   return (L_err);
00143 }
00144 
00145 T_GeneratorError C_DataLogControl::ForcedStoppingProcedure () {
00146   T_GeneratorError L_err = E_GEN_NO_ERROR ;
00147   GEN_DEBUG(0, "C_DataLogControl::ForcedStoppingProcedure()");
00148   return (L_err);
00149 }
00150 
00151 
00152 int C_DataLogControl::data (double P_time, double P_data) {
00153 
00154   int                   L_ret          = 0 ;
00155   T_LogValuePList::iterator L_it ;
00156   C_LogValue*               L_buf          = NULL ;
00157   size_t                L_waiting_data = 0 ;
00158   
00159   GEN_DEBUG(0, "C_DataLogControl::data(" << P_data << ")");
00160   m_available_sem->P();
00161   if (!m_available->empty()) {
00162     L_it = m_available->begin() ;
00163     L_buf = *L_it ;
00164     m_available->erase(L_it);
00165   }
00166   m_available_sem->V();
00167 
00168   if (L_buf != NULL) { // a buffer is available
00169 
00170     L_buf->set_data(P_time, P_data);
00171     m_values_sem->P();
00172     m_values->push_back(L_buf);
00173     L_waiting_data = m_values->size();
00174     GEN_DEBUG(0, "C_DataLogControl::data() waiting list size=" 
00175               << L_waiting_data);
00176     m_values_sem->V();
00177     if (L_waiting_data >= m_size_log) { m_sem->V(); }
00178     L_ret = 1 ;
00179   }
00180 
00181   return (L_ret);
00182 }
00183 
00184 
00185 int C_DataLogControl::data (char* P_data) {
00186 
00187   int                   L_ret          = 0 ;
00188   T_LogValuePList::iterator L_it ;
00189   C_LogValue*               L_buf          = NULL ;
00190   size_t                L_waiting_data = 0 ;
00191   
00192     GEN_DEBUG(0, "C_DataLogControl::data(" << P_data << ")");
00193     m_available_sem->P();
00194     if (!m_available->empty()) {
00195       L_it = m_available->begin() ;
00196       L_buf = *L_it ;
00197       m_available->erase(L_it);
00198     }
00199     m_available_sem->V();
00200     
00201     if (L_buf != NULL) { // a buffer is available
00202       L_buf->set_string(P_data);
00203       m_values_sem->P();
00204       m_values->push_back(L_buf);
00205       L_waiting_data = m_values->size();
00206       GEN_DEBUG(0, "C_DataLogControl::data() waiting list size=" 
00207                 << L_waiting_data);
00208       m_values_sem->V();
00209       if (L_waiting_data >= m_size_log) { m_sem->V(); }
00210       L_ret = 1 ;
00211     }
00212     
00213     return (L_ret);
00214 }
00215 
00216 void C_DataLogControl::do_log_cumul () {
00217 }
00218 
00219 
00220 void C_DataLogControl::do_log () {
00221 
00222   T_LogValuePList::iterator L_it ;
00223   C_LogValue*               L_buf=NULL ;
00224   size_t                    L_nb_data=0  ;
00225   char                      L_final_string [ 100 ] ;
00226 
00227   GEN_DEBUG(0, "C_DataLogControl::do_log()");
00228   // critical section => just copy the pointers
00229   m_values_sem->P() ;
00230   GEN_DEBUG(0, "C_DataLogControl::do_log() waiting list size=" << m_values->size());
00231   if ((L_nb_data=m_values->size())) {
00232     while (L_nb_data) {
00233       L_it = m_values->begin() ;
00234       GEN_DEBUG(0, "C_DataLogControl::do_log() data=" << *L_it);
00235       m_log->push_back(*L_it);
00236       m_values->erase(L_it);
00237       L_nb_data -- ;
00238     }
00239   }
00240   m_values_sem->V() ;
00241 
00242   if ((L_nb_data=m_log->size())) {
00243 
00244     while (L_nb_data) {
00245       
00246       L_it = m_log->begin();
00247       L_buf = *L_it ;
00248 
00249       L_buf->get_value(L_final_string);
00250       // make sys log
00251       *m_output_stream << L_final_string << iostream_endl << iostream_flush ;
00252 
00253       m_available_sem->P();
00254       m_available->push_back(L_buf);
00255       m_available_sem->V();
00256       m_log->erase(L_it);
00257 
00258       L_nb_data-- ;
00259     }
00260   }
00261 
00262 }
00263 
00264 int C_DataLogControl::time_data(struct timeval *P_begin,
00265                                 struct timeval *P_end) {
00266 
00267   // convert data to string 
00268 
00269   double L_diff, L_time ;
00270   long L_val_sec, L_val_usec ;
00271 
00272   L_time = (double)P_end->tv_sec*1000.0 + (double)(P_end->tv_usec)/(double)1000.0 ;
00273   L_time = (double)L_time - (double)m_time_ref ;
00274 
00275   L_val_sec = P_end->tv_sec - P_begin->tv_sec ;
00276   L_val_usec = P_end->tv_usec - P_begin->tv_usec ;
00277   if (L_val_usec < 0) { L_val_usec += 1000000; L_val_sec --; }
00278 
00279   L_diff = (double) L_val_sec*1000.0 + (double)(L_val_usec)/1000.0 ;
00280 
00281   return (data(L_time, L_diff));
00282 
00283 }
00284 
00285 
00286 
00287 
00288 
00289 

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