source: flair-src/trunk/tools/FlairGCS/src/file_ui.cpp @ 10

Last change on this file since 10 was 10, checked in by Sanahuja Guillaume, 5 years ago

lic

File size: 11.7 KB
Line 
1// %flair:license{
2// This file is part of the Flair framework distributed under the
3// CECILL-C License, Version 1.0.
4// %flair:license}
5#include "file_ui.h"
6#include <stdio.h>
7
8#include <cstring>
9#include <cstdlib>
10#include <fstream>
11#include <iostream>
12#include <QDir>
13#include <QDate>
14#include <QTextStream>
15#include <QGridLayout>
16#include <io_hdfile.h>
17#include <QtEndian>
18#include <QComboBox>
19#include <QPushButton>
20#include <QTextEdit>
21#include <QDialog>
22#include <QStringList>
23#include <QFormLayout>
24
25#ifndef WIN32
26   #include <arpa/inet.h>
27#else
28   #include <winsock2.h>
29   #include <ws2tcpip.h>
30#endif
31
32
33using namespace std;
34
35file_ui::file_ui()
36{
37    dialog=new QDialog();
38    dialog->setWindowTitle("log files");
39    QGridLayout *main_layout = new QGridLayout(dialog);
40    ok_button= new QPushButton("Ok",dialog);
41    log_text=new QTextEdit(dialog);
42    log_text->setReadOnly(true);
43    input_text=new QTextEdit(dialog);
44    input_text->setText("add your log comment here");
45    input_cleared=false;
46
47    ok_button->setEnabled(false);
48
49    main_layout->addWidget(log_text,0,0);
50    main_layout->addWidget(input_text,1,0);
51
52    QWidget *widget=new QWidget(dialog);
53    QFormLayout *formLayout = new QFormLayout(widget);
54    csv_combo = new QComboBox(widget);
55    formLayout->addRow(tr("save all log with following base time"), csv_combo);
56    csv_combo->addItem("(no base time)");
57    main_layout->addWidget(widget,2,0);
58    main_layout->addWidget(ok_button,3,0);
59
60    connect(ok_button, SIGNAL(clicked()),this, SLOT(save()), Qt::QueuedConnection);
61    connect(this, SIGNAL(showDialog()),dialog, SLOT(show()), Qt::QueuedConnection);
62    connect(this, SIGNAL(appendToLog(QString)),log_text, SLOT(append(QString)), Qt::QueuedConnection);
63    connect(input_text, SIGNAL(cursorPositionChanged()),this, SLOT(clearInputText()), Qt::QueuedConnection);
64
65    file_names=new QStringList();
66}
67
68file_ui::~file_ui()
69{
70    delete dialog;
71}
72
73void file_ui::log(QString text) {
74    appendToLog(text);
75}
76
77void file_ui::addFile(QString file_path) {
78    //framework sends dbt file then txt file
79    //when we receive txt, we have both files
80    //and we can convert it to .csv
81    if(file_path.endsWith(".dbt")==true) {
82        QString name=file_path.section('/', -1);//remove path for displaying on combobox
83        csv_combo->addItem(name.replace(QString(".dbt"), QString(".csv")));
84        file_names->append(file_path.replace(QString(".dbt"), QString(".csv")));
85    }
86
87    if(file_path.endsWith(".txt")==true) {
88        dbt2csv(file_path.replace(QString(".txt"), QString(".dbt")));
89    }
90
91    if(file_names->size()==1) {
92        input_cleared=false;
93        showDialog();
94    }
95}
96
97void file_ui::endOfFiles(void) {
98    ok_button->setEnabled(true);
99
100    qint64 max_file_size=0;
101    for(int i=0;i<file_names->count();i++) {
102        QFileInfo info(file_names->at(i));
103        if(info.size()>max_file_size) {
104            max_file_size=info.size();
105            csv_combo->setCurrentIndex(i+1);//first item of combobox is already taken
106        }
107    }
108}
109
110void file_ui::dbt2csv(QString file_path)
111{
112    hdfile_t *dbtFile = NULL;
113    char *data;
114    QStringList data_type;
115
116    QString filename=file_path.section('/', -1);//remove path for displaying on logs
117    appendToLog(QString("converting %1 to csv").arg(filename));
118
119    //open csv file
120    QString csv_filename=file_path;
121    csv_filename.replace(QString(".dbt"), QString(".csv"));
122    QFile csv_file(csv_filename);
123
124    if(!csv_file.open(QIODevice::WriteOnly | QIODevice::Text)) {
125        appendToLog("      error opening csv file!");
126        return;
127    }
128    QTextStream out(&csv_file);
129
130    //open txt file
131    QString txt_filename=file_path;
132    txt_filename.replace(QString(".dbt"), QString(".txt"));
133    QFile txt_file(txt_filename);
134
135    if(!txt_file.open(QIODevice::ReadOnly | QIODevice::Text)) {
136        appendToLog("      error opening txt file!");
137        return;
138    }
139
140    //read txt file
141    QTextStream txt_in(&txt_file);
142    txt_in.readLine();//time us
143    txt_in.readLine();//time ns
144    while(1)
145    {
146        if(txt_in.atEnd()==true) break;
147        QString txt_line=txt_in.readLine();
148        data_type.append(txt_line.section("(",-1));//on part de la fin pour trouver la premiere parenthese ouvrante
149        //printf("type %s\n",txt_line.section("(",-1).toLocal8Bit().constData());
150    }
151    txt_file.close();
152
153    dbtFile=open_hdfile(file_path.toLocal8Bit().data(),READ_MODE);
154
155    if (!dbtFile)
156    {
157        appendToLog("      error opening dbt file!");
158        return;
159    }
160    data=(char*)malloc(dbtFile->h.DataSize);
161    if(data==NULL)
162    {
163        appendToLog("      error malloc!");
164        return;
165    }
166
167    bool dataWritten=false;
168    while(1)
169    {
170        road_time_t time;
171        road_timerange_t tr = 0;
172        int offset=0;
173        QTextStream csv_line;
174
175        if(read_hdfile(dbtFile,(void*)data,&time,&tr)==0) {
176            break;
177        }
178        dataWritten=true;
179
180        out << time << "," << tr;
181        for(int i=0;i<data_type.size();i++)
182        {
183            if(data_type.at(i)=="float)")
184            {
185                float* value=(float*)(data+offset);
186                offset+=sizeof(float);
187                out << "," << *value;
188            }
189            else if(data_type.at(i)=="int8_t)")
190            {
191                int8_t* value=(int8_t*)(data+offset);
192                offset+=sizeof(int8_t);
193                float fl=(float)*value;
194                out << "," << *value;
195            }
196            else
197            {
198                appendToLog(QString("      unhandled type: %1").arg(data_type.at(i)));
199            }
200        }
201
202        out << "\n";
203    }
204
205    if(!dataWritten) {
206        //empty file!
207        out <<  "0,0";//timr
208        for(int i=0;i<data_type.size();i++) {
209            out << ",0";
210        }
211        out << "\n";
212    }
213
214    csv_file.close();
215    close_hdfile(dbtFile);
216    if(data!=NULL) free(data);
217
218    appendToLog("      ok");
219}
220
221void file_ui::clearInputText(void){
222    if(input_cleared==false) {
223        input_cleared=true;
224        input_text->clear();
225    }
226}
227
228void file_ui::save(void)
229{
230    save_comment();
231    if(csv_combo->currentIndex()!=0)
232    {
233        save_csv();
234        save_txt();
235    }
236
237    log_text->clear();
238    input_cleared=true;//avoid clearing it with setText
239    input_text->setText("add your log comment here");
240    file_names->clear();
241    csv_combo->clear();
242    csv_combo->addItem(QString("(no base time)"));
243
244    dialog->setVisible(false);
245    ok_button->setEnabled(false);
246    emit finished();
247}
248
249void file_ui::save_comment(void)
250{
251    QString folder_name=file_names->at(0).section('/', 0,-2);
252
253    QString filename=folder_name+"/commentaire.txt";
254    QFile file(filename);
255    if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) printf("file_ui::save_comment: erreur ouverture fichier %s\n",filename.toLocal8Bit().constData());
256    QTextStream out(&file);
257
258    out<<input_text->toPlainText();
259    file.close();
260}
261
262void file_ui::save_csv(void)
263{
264    //global csv file
265    QString folder_name=file_names->at(0).section('/', 0,-2);
266    QString filename=folder_name + "/all_logs.csv" ;
267    QFile global_file(filename);
268    if(!global_file.open(QIODevice::WriteOnly | QIODevice::Text)) printf("file_ui::save_csv: erreur ouverture fichier %s\n",filename.toLocal8Bit().constData());
269    QTextStream out(&global_file);
270
271    //reference csv file
272    filename=file_names->at(csv_combo->currentIndex()-1);
273    QFile ref_file(filename);
274    //printf("file_ui::save_csv: ref %s\n",filename.toLocal8Bit().constData());
275    if(!ref_file.open(QIODevice::ReadOnly | QIODevice::Text)) printf("file_ui::save_csv: erreur ouverture ficher %s\n",filename.toLocal8Bit().constData());
276
277    //other csv files
278    int j=0;
279    QFile m_file[file_names->count()-1];
280    QTextStream m_in[file_names->count()-1];
281    for(int i=0;i<file_names->count();i++)
282    {
283        if(i==csv_combo->currentIndex()-1) continue;
284        filename=file_names->at(i);
285        m_file[j].setFileName(filename);
286        if(!m_file[j].open(QIODevice::ReadOnly | QIODevice::Text)) printf("file_ui::save_csv: erreur ouverture ficher %s\n",filename.toLocal8Bit().constData());
287        m_in[j].setDevice(&m_file[j]);
288        j++;
289    }
290
291    //init
292    QTextStream ref_in(&ref_file);
293    QString m_line[file_names->count()-1];
294    QString m_line_prev[file_names->count()-1];
295    for(int i=0;i<file_names->count()-1;i++)
296    {
297        m_line[i]=m_in[i].readLine();
298        m_line_prev[i]=m_line[i];
299    }
300
301    //organize csv files in one file
302    while(1)
303    {
304        if(ref_in.atEnd()==true) break;
305        QString ref_line=ref_in.readLine();
306
307        qint64 ref_us=ref_line.section(',',0,0).toLongLong();
308        int ref_ns=ref_line.section(',',1,1).toInt();
309        //printf("ref %lld %i\n",ref_us,ref_ns);
310
311        for(int i=0;i<file_names->count()-1;i++)
312        {
313            qint64 csv_us=m_line[i].section(',',0,0).toLongLong();
314            int csv_ns=m_line[i].section(',',1,1).toInt();
315            //printf("m %lld %i\n",csv_us,csv_ns);
316
317            while(is_greater(ref_us,csv_us,ref_ns,csv_ns)==true)
318            {
319                m_line_prev[i]=m_line[i];
320                if(m_in[i].atEnd()==true) break;
321                m_line[i]=m_in[i].readLine();
322                csv_us=m_line[i].section(',',0,0).toLongLong();
323                csv_ns=m_line[i].section(',',1,1).toInt();
324                //printf("m %lld %i\n",csv_us,csv_ns);
325            }
326            csv_us=m_line_prev[i].section(',',0,0).toLongLong();
327            csv_ns=m_line_prev[i].section(',',1,1).toInt();
328            //printf("m ok %lld %i\n",csv_us,csv_ns);
329
330            ref_line+="," + m_line_prev[i].section(',',2);
331        }
332
333        out<<ref_line << "\n";
334    }
335
336    global_file.close();
337    ref_file.close();
338    for(int i=0;i<file_names->count()-1;i++) m_file[i].close();
339}
340
341void file_ui::save_txt(void)
342{
343    //global txt file
344    QString folder_name=file_names->at(0).section('/', 0,-2);
345    QString filename=folder_name + "/all_logs.txt";
346    QFile global_file(filename);
347    if(!global_file.open(QIODevice::WriteOnly | QIODevice::Text)) printf("file_ui::save_txt: erreur ouverture ficher %s\n",filename.toLocal8Bit().constData());
348    QTextStream out(&global_file);
349
350    //reference txt file
351    filename=file_names->at(csv_combo->currentIndex()-1);
352    filename.replace(QString(".csv"), QString(".txt"));
353    QFile ref_file(filename);
354    if(!ref_file.open(QIODevice::ReadOnly | QIODevice::Text)) printf("file_ui::save_txt: erreur ouverture ficher %s\n",filename.toLocal8Bit().constData());
355
356    QTextStream ref_in(&ref_file);
357    QString current_line=ref_in.readLine();
358    int nb_lines=1;
359    while(current_line!=NULL)
360    {
361        out<<current_line << "\n";;
362        current_line=ref_in.readLine();
363        nb_lines++;
364    }
365
366    //other txt files
367    for(int i=0;i<file_names->count();i++)
368    {
369        if(i==csv_combo->currentIndex()-1) continue;
370        filename=file_names->at(i);
371        filename.replace(QString(".csv"), QString(".txt"));
372        QFile txt_file(filename);
373        if(!txt_file.open(QIODevice::ReadOnly | QIODevice::Text)) printf("file_ui::save_txt: erreur ouverture ficher %s\n",filename.toLocal8Bit().constData());
374        QTextStream txt_in(&txt_file);
375        txt_in.readLine();//time us
376        txt_in.readLine();//time ns
377        current_line=txt_in.readLine();
378        while(current_line!=NULL)
379        {
380            out<< nb_lines << ":" << current_line.section(':',1) << "\n";;
381            current_line=txt_in.readLine();
382            nb_lines++;
383        }
384        txt_file.close();
385
386    }
387    global_file.close();
388    ref_file.close();
389}
390
391
392bool file_ui::is_greater(qint64 ref_us,qint64 csv_us,int ref_ns,int csv_ns)
393{
394    if(ref_us==csv_us)
395    {
396        if(ref_ns>csv_ns)
397        {
398            return true;
399        }
400        else
401        {
402            return false;
403        }
404    }
405    if(ref_us>csv_us)
406    {
407        return true;
408    }
409    else
410    {
411        return false;
412    }
413}
Note: See TracBrowser for help on using the repository browser.