##// END OF EJS Templates
Sync
Jeandet Alexis -
r57:d1a982ae47e5 default
parent child
Show More
@@ -0,0 +1,62
1 #include "genericbinaryfilewidget.h"
2 #include "ui_genericbinaryfilewidget.h"
3 #include <QFileDialog>
4 #include <QFile>
5 #include "srec/srecfile.h"
6
7 genericBinaryFileWidget::genericBinaryFileWidget(QWidget *parent) :
8 QWidget(parent),
9 ui(new Ui::genericBinaryFileWidget)
10 {
11 ui->setupUi(this);
12 }
13
14 genericBinaryFileWidget::~genericBinaryFileWidget()
15 {
16 delete ui;
17 }
18
19 void genericBinaryFileWidget::openFile()
20 {
21 QStringList filesNames = QFileDialog::getOpenFileNames(
22 this,
23 "Select one or more files to open",
24 NULL,
25 "Binary Files (*.bin);;SREC Files (*.srec);;Elf Files (*)");
26
27 for(int i=0;i<filesNames.count();i++)
28 {
29 QFile file(filesNames.at(i));
30 if(file.open(QIODevice::ReadOnly))
31 {
32 char magic[4];
33 file.read(magic,4);
34 QString line;
35 switch((int)magic[0])
36 {
37 case 'e':
38 if((magic[1]=='l') && (magic[2]=='f'))
39 {
40 files.append(new FileListElement(filesNames.at(i),false,Type_Elf,NULL));
41 }
42 break;
43 case 'S':
44 file.seek(0);
45 line = file.readLine();
46 if(srecFile::checkSum(line))
47 {
48 files.append(new FileListElement(filesNames.at(i),false,Type_SREC,NULL));
49 }
50 break;
51 default:
52 files.append(new FileListElement(filesNames.at(i),false,Type_Bin,NULL));
53 break;
54 }
55 }
56 }
57
58 }
59
60
61
62
@@ -0,0 +1,42
1 #ifndef GENERICBINARYFILEWIDGET_H
2 #define GENERICBINARYFILEWIDGET_H
3
4 #include <QWidget>
5 #include <QString>
6 #include <QStringList>
7 #include <abstractbinfile.h>
8
9 namespace Ui {
10 class genericBinaryFileWidget;
11 }
12
13 typedef enum {Type_SREC,Type_Bin,Type_Elf}FileTypeEnum;
14 class FileListElement
15 {
16 public:
17 FileListElement() {}
18 FileListElement(QString fileName,bool isOpened,FileTypeEnum FileType,abstractBinFileWidget* viewer)
19 :fileName(fileName),isOpened(isOpened),FileType(FileType),viewer(viewer){}
20 QString fileName;
21 bool isOpened;
22 FileTypeEnum FileType;
23 abstractBinFileWidget* viewer;
24 };
25
26 class genericBinaryFileWidget : public QWidget
27 {
28 Q_OBJECT
29
30 public:
31 explicit genericBinaryFileWidget(QWidget *parent = 0);
32 ~genericBinaryFileWidget();
33
34 public slots:
35 void openFile();
36
37 private:
38 Ui::genericBinaryFileWidget *ui;
39 QList<FileListElement*> files;
40 };
41
42 #endif // GENERICBINARYFILEWIDGET_H
@@ -0,0 +1,103
1 <?xml version="1.0" encoding="UTF-8"?>
2 <ui version="4.0">
3 <class>genericBinaryFileWidget</class>
4 <widget class="QWidget" name="genericBinaryFileWidget">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>878</width>
10 <height>360</height>
11 </rect>
12 </property>
13 <property name="acceptDrops">
14 <bool>false</bool>
15 </property>
16 <property name="windowTitle">
17 <string>Form</string>
18 </property>
19 <layout class="QGridLayout" name="gridLayout_2">
20 <item row="0" column="0">
21 <widget class="QSplitter" name="splitter">
22 <property name="orientation">
23 <enum>Qt::Horizontal</enum>
24 </property>
25 <widget class="QWidget" name="widget" native="true">
26 <layout class="QGridLayout" name="gridLayout">
27 <item row="1" column="0">
28 <widget class="QPushButton" name="openFileQpb">
29 <property name="text">
30 <string/>
31 </property>
32 <property name="icon">
33 <iconset resource="../SocExplorerCommon.qrc">
34 <normaloff>:/images/add.svg</normaloff>:/images/add.svg</iconset>
35 </property>
36 <property name="iconSize">
37 <size>
38 <width>32</width>
39 <height>32</height>
40 </size>
41 </property>
42 </widget>
43 </item>
44 <item row="1" column="1">
45 <widget class="QPushButton" name="removeFileQpb">
46 <property name="text">
47 <string/>
48 </property>
49 <property name="icon">
50 <iconset resource="../SocExplorerCommon.qrc">
51 <normaloff>:/images/trash.svg</normaloff>:/images/trash.svg</iconset>
52 </property>
53 <property name="iconSize">
54 <size>
55 <width>32</width>
56 <height>32</height>
57 </size>
58 </property>
59 </widget>
60 </item>
61 <item row="1" column="2">
62 <spacer name="horizontalSpacer">
63 <property name="orientation">
64 <enum>Qt::Horizontal</enum>
65 </property>
66 <property name="sizeHint" stdset="0">
67 <size>
68 <width>40</width>
69 <height>20</height>
70 </size>
71 </property>
72 </spacer>
73 </item>
74 <item row="0" column="0" colspan="3">
75 <widget class="QTableWidget" name="tableWidget">
76 <column>
77 <property name="text">
78 <string>File</string>
79 </property>
80 </column>
81 <column>
82 <property name="text">
83 <string>Type</string>
84 </property>
85 </column>
86 </widget>
87 </item>
88 </layout>
89 </widget>
90 <widget class="QTabWidget" name="fileViewerTab">
91 <property name="currentIndex">
92 <number>-1</number>
93 </property>
94 </widget>
95 </widget>
96 </item>
97 </layout>
98 </widget>
99 <resources>
100 <include location="../SocExplorerCommon.qrc"/>
101 </resources>
102 <connections/>
103 </ui>
@@ -5,13 +5,13
5 5 #include "qhexedit/qhexedit.h"
6 6 #include "SocExplorerPlot.h"
7 7 #include "tcp_terminal_client.h"
8 #include "elf/elfparser.h"
9 #include "abstractbinfile.h"
10 #include "elf/elffile.h"
11 #include "elf/elffilewidget.h"
12 #include "elf/elfinfowdgt.h"
13 8 #include "QCustomPlot/qcustomplot.h"
14 #include "srec/srecfile.h"
15 #include "srec/srecfilewidget.h"
16 #include "BinFile/binaryfile.h"
17 #include "BinFile/binaryfilewidget.h"
9 #include "genericBinaryFiles/abstractbinfile.h"
10 #include "genericBinaryFiles/elf/elfparser.h"
11 #include "genericBinaryFiles/elf/elffile.h"
12 #include "genericBinaryFiles/elf/elffilewidget.h"
13 #include "genericBinaryFiles/elf/elfinfowdgt.h"
14 #include "genericBinaryFiles/srec/srecfile.h"
15 #include "genericBinaryFiles/srec/srecfilewidget.h"
16 #include "genericBinaryFiles/BinFile/binaryfile.h"
17 #include "genericBinaryFiles/BinFile/binaryfilewidget.h"
@@ -96,7 +96,8 HEADERS += \
96 96 genericBinaryFiles/srec/srecfilewidget.h \
97 97 genericBinaryFiles/abstractbinfile.h \
98 98 genericBinaryFiles/BinFile/binaryfile.h \
99 genericBinaryFiles/BinFile/binaryfilewidget.h
99 genericBinaryFiles/BinFile/binaryfilewidget.h \
100 genericBinaryFiles/genericbinaryfilewidget.h
100 101
101 102
102 103 SOURCES += \
@@ -120,12 +121,14 SOURCES += \
120 121 genericBinaryFiles/srec/srecfilewidget.cpp \
121 122 genericBinaryFiles/abstractbinfile.cpp \
122 123 genericBinaryFiles/BinFile/binaryfile.cpp \
123 genericBinaryFiles/BinFile/binaryfilewidget.cpp
124 genericBinaryFiles/BinFile/binaryfilewidget.cpp \
125 genericBinaryFiles/genericbinaryfilewidget.cpp
124 126
125 127 FORMS += \
126 128 genericBinaryFiles/elf/elffilewidget.ui \
127 129 genericBinaryFiles/srec/srecfilewidget.ui \
128 genericBinaryFiles/BinFile/binaryfilewidget.ui
130 genericBinaryFiles/BinFile/binaryfilewidget.ui \
131 genericBinaryFiles/genericbinaryfilewidget.ui
129 132
130 133 OTHER_FILES += \
131 134 ./pythongenerator.sh \
@@ -133,3 +136,5 OTHER_FILES += \
133 136
134 137
135 138
139
140
@@ -25,15 +25,18
25 25
26 26 srecFile::srecFile()
27 27 {
28 p_mergingRecords = true;
28 29 }
29 30
30 31 srecFile::srecFile(const QString &File)
31 32 {
33 p_mergingRecords = true;
32 34 openFile(File);
33 35 }
34 36
35 37 srecFile::srecFile(const QStringList &Files)
36 38 {
39 p_mergingRecords = true;
37 40 openFiles(Files);
38 41 }
39 42
@@ -101,9 +104,9 bool srecFile::toSrec(QList<codeFragment
101 104 for(int i=0;i<fragments.count();i++)
102 105 {
103 106 codeFragment *fragment = fragments.at(i);
104 for(int j=0;j<((int)(fragment->size));j+=16)
107 for(int j=0;j<((int)(fragment->size)/16);j++)
105 108 {
106 stream << buildRecord(3,fragment->address+j,fragment->data+j,16);
109 stream << buildRecord(3,fragment->address+(j*16),fragment->data+(j*16),16);
107 110 }
108 111 int rem = fragment->size % 16;
109 112 if(rem)
@@ -186,6 +189,16 bool srecFile::getFragmentData(int index
186 189 return false;
187 190 }
188 191
192 bool srecFile::mergingRecords()
193 {
194 return p_mergingRecords;
195 }
196
197 void srecFile::setMergingRecords(bool enabled)
198 {
199 p_mergingRecords = enabled;
200 }
201
189 202 bool srecFile::isSREC()
190 203 {
191 204 return p_isSrec & isopened();
@@ -205,6 +218,7 bool srecFile::isSREC(const QString &Fil
205 218 return false;
206 219 }
207 220
221
208 222 void srecFile::parseFile(QFile *file)
209 223 {
210 224 if(file->isOpen())
@@ -212,6 +226,7 void srecFile::parseFile(QFile *file)
212 226 this->p_lineCount = 0;
213 227 file->seek(0);
214 228 codeFragment* fragment=NULL;
229 bool newFragment=true;
215 230 char* data;
216 231 quint64 size=0;
217 232 quint64 address=-1;
@@ -233,40 +248,55 void srecFile::parseFile(QFile *file)
233 248 {
234 249 if((rectype>=1) && (rectype<=3))
235 250 {
236 bool merged = false;
237 //Could I merge it with an other fragment?
238 // TODO should make merging optionnal
239 for(int i=0;i<p_fragments.count();i++)
251 if(p_mergingRecords)
240 252 {
241 codeFragment* frag = p_fragments.at(i);
242 if(((frag->address+frag->size)==address) && (merged==false) && (size!=0))
253 //Could I merge it with an other fragment?
254 bool merged = false;
255 for(int i=0;i<p_fragments.count();i++)
243 256 {
244 char* mergedData=(char*)malloc(size+frag->size);
245 memcpy(mergedData,frag->data,frag->size);
246 memcpy(mergedData+frag->size,data,size);
247 free(frag->data);
248 free(data);
249 frag->data = mergedData;
250 frag->size = frag->size+size;
251 merged = true;
257 codeFragment* frag = p_fragments.at(i);
258 if(((frag->address+frag->size)==address) && (merged==false) && (size!=0))
259 {
260 merged = mergeFragment(frag,data,size);
261 }
262 }
263 if(!merged)
264 {
265 fragment = new codeFragment(data,size,address);
266 fragment->header = header;
267 p_fragments.append(fragment);
252 268 }
253 269 }
254 if(!merged)
270 else
255 271 {
256 fragment = new codeFragment(data,size,address);
257 fragment->header = header;
258 p_fragments.append(fragment);
272 if(newFragment)
273 {
274 fragment = new codeFragment(data,size,address);
275 fragment->header = header;
276 p_fragments.append(fragment);
277 newFragment = false;
278 }
279 else
280 {
281 codeFragment* frag = p_fragments.last();
282 mergeFragment(frag,data,size);
283 }
259 284 }
285
260 286 }
261 287 else
262 288 {
263
289 if((rectype>=7) && (rectype<=9))
290 {
291 newFragment = true;
292 }
264 293 }
265 294 }
266 295 }
267 296 }
268 297 }
269 298
299
270 300 int srecFile::parseLine(const QString &record, quint64 *address, char **data, quint64 *size)
271 301 {
272 302 #define newData (*data)
@@ -340,6 +370,7 int srecFile::parseLine(const QString &r
340 370 return recType;
341 371 }
342 372
373
343 374 char srecFile::lineCheckSum(const QString &line)
344 375 {
345 376 char sum=0;
@@ -363,9 +394,15 bool srecFile::checkSum(const QString &l
363 394 scp.remove('\r');
364 395 char ck2 = (char)scp.mid(scp.count()-2,2).toInt(0,16);
365 396 char ck=lineCheckSum(scp.remove(scp.count()-2,2));
366 return (ck2==ck);
397 if(ck==ck2)
398 {
399 return true;
400 }
401 return false;
402 // return (ck2==ck);
367 403 }
368 404
405
369 406 QString srecFile::buildRecord(int recType, int address,const char *data, int size)
370 407 {
371 408 QString record;
@@ -401,3 +438,19 QString srecFile::buildRecord(int recTyp
401 438 return record.toUpper();
402 439 }
403 440
441 bool srecFile::mergeFragment(codeFragment *fragment, char *data, int size)
442 {
443 char* mergedData=(char*)malloc(size+fragment->size);
444 if(mergedData!=NULL)
445 {
446 memcpy(mergedData,fragment->data,fragment->size);
447 memcpy(mergedData+fragment->size,data,size);
448 free(fragment->data);
449 free(data);
450 fragment->data = mergedData;
451 fragment->size = fragment->size+size;
452 return true;
453 }
454 return false;
455 }
456
@@ -51,8 +51,11 public:
51 51 QString getFragmentHeader(int index);
52 52 bool getFragmentData(int index, char **buffer);
53 53
54 bool mergingRecords();
55 void setMergingRecords(bool enabled);
54 56 bool isSREC();
55 57 static bool isSREC(const QString& File);
58 static bool checkSum(const QString& line);
56 59 signals:
57 60
58 61 public slots:
@@ -60,13 +63,14 private:
60 63 void parseFile(QFile* file);
61 64 static int parseLine(const QString& record, quint64 *address, char** data, quint64 *size);
62 65 static char lineCheckSum(const QString& line);
63 static bool checkSum(const QString& line);
64 66 static QString buildRecord(int recType,int address,const char* data,int size);
67 static bool mergeFragment(codeFragment* fragment, char* data, int size);
65 68 QStringList p_fileNames;
66 69 QList<QFile*>p_files;
67 70 QList<codeFragment*> p_fragments;
68 71 int p_lineCount;
69 72 bool p_isSrec;
73 bool p_mergingRecords;
70 74
71 75 };
72 76
@@ -46,6 +46,12
46 46 <property name="contextMenuPolicy">
47 47 <enum>Qt::ActionsContextMenu</enum>
48 48 </property>
49 <attribute name="horizontalHeaderVisible">
50 <bool>true</bool>
51 </attribute>
52 <attribute name="verticalHeaderVisible">
53 <bool>false</bool>
54 </attribute>
49 55 <column>
50 56 <property name="text">
51 57 <string>Index</string>
@@ -7701,6 +7701,11 int PythonQtWrapper_srecFile::lineCount
7701 7701 return ( theWrappedObject->lineCount());
7702 7702 }
7703 7703
7704 bool PythonQtWrapper_srecFile::mergingRecords(srecFile* theWrappedObject)
7705 {
7706 return ( theWrappedObject->mergingRecords());
7707 }
7708
7704 7709 bool PythonQtWrapper_srecFile::openFile(srecFile* theWrappedObject, const QString& File)
7705 7710 {
7706 7711 return ( ((PythonQtPublicPromoter_srecFile*)theWrappedObject)->promoted_openFile(File));
@@ -7711,6 +7716,11 bool PythonQtWrapper_srecFile::openFile
7711 7716 return ( theWrappedObject->openFiles(Files));
7712 7717 }
7713 7718
7719 void PythonQtWrapper_srecFile::setMergingRecords(srecFile* theWrappedObject, bool enabled)
7720 {
7721 ( theWrappedObject->setMergingRecords(enabled));
7722 }
7723
7714 7724 bool PythonQtWrapper_srecFile::toBinary(srecFile* theWrappedObject, const QString& File)
7715 7725 {
7716 7726 return ( ((PythonQtPublicPromoter_srecFile*)theWrappedObject)->promoted_toBinary(File));
@@ -778,12 +778,12 codeFragment* new_codeFragment(char* da
778 778 void delete_codeFragment(codeFragment* obj) { delete obj; }
779 779 void py_set_size(codeFragment* theWrappedObject, quint64 size){ theWrappedObject->size = size; }
780 780 quint64 py_get_size(codeFragment* theWrappedObject){ return theWrappedObject->size; }
781 void py_set_address(codeFragment* theWrappedObject, quint64 address){ theWrappedObject->address = address; }
782 quint64 py_get_address(codeFragment* theWrappedObject){ return theWrappedObject->address; }
783 void py_set_data(codeFragment* theWrappedObject, char* data){ theWrappedObject->data = data; }
784 char* py_get_data(codeFragment* theWrappedObject){ return theWrappedObject->data; }
781 785 void py_set_header(codeFragment* theWrappedObject, QString header){ theWrappedObject->header = header; }
782 786 QString py_get_header(codeFragment* theWrappedObject){ return theWrappedObject->header; }
783 void py_set_data(codeFragment* theWrappedObject, char* data){ theWrappedObject->data = data; }
784 char* py_get_data(codeFragment* theWrappedObject){ return theWrappedObject->data; }
785 void py_set_address(codeFragment* theWrappedObject, quint64 address){ theWrappedObject->address = address; }
786 quint64 py_get_address(codeFragment* theWrappedObject){ return theWrappedObject->address; }
787 787 };
788 788
789 789
@@ -976,8 +976,10 void delete_srecFile(srecFile* obj) { de
976 976 bool static_srecFile_isSREC(const QString& File);
977 977 bool isopened(srecFile* theWrappedObject);
978 978 int lineCount(srecFile* theWrappedObject);
979 bool mergingRecords(srecFile* theWrappedObject);
979 980 bool openFile(srecFile* theWrappedObject, const QString& File);
980 981 bool openFiles(srecFile* theWrappedObject, const QStringList& Files);
982 void setMergingRecords(srecFile* theWrappedObject, bool enabled);
981 983 bool toBinary(srecFile* theWrappedObject, const QString& File);
982 984 bool static_srecFile_toSrec(QList<codeFragment* > fragments, const QString& File);
983 985 bool toSrec(srecFile* theWrappedObject, const QString& File);
@@ -3,4 +3,4
3 3 #export QTDIR=/usr/include
4 4 #export QTDIR=/usr/include/qt5
5 5
6 pythonqt_generator --include-paths=./genericBinaryFiles/elf:./genericBinaryFiles/srec:./genericBinaryFiles/BinFile:/usr/include/qt5:/usr/include/qt5/QtCore:/usr/include/qt5/QtWidgets --output-directory=pythonQtOut PySocExplorer.h pythonQtgeneratorCfg.txt
6 pythonqt_generator --include-paths=./genericBinaryFiles/:./genericBinaryFiles/elf:./genericBinaryFiles/srec:./genericBinaryFiles/BinFile:/usr/include/qt5:/usr/include/qt5/QtCore:/usr/include/qt5/QtWidgets --output-directory=pythonQtOut PySocExplorer.h pythonQtgeneratorCfg.txt
General Comments 0
You need to be logged in to leave comments. Login now