00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
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) {
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) {
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
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
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
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