diff --git a/src/common/PySocExplorer.h b/src/common/PySocExplorer.h --- a/src/common/PySocExplorer.h +++ b/src/common/PySocExplorer.h @@ -5,13 +5,13 @@ #include "qhexedit/qhexedit.h" #include "SocExplorerPlot.h" #include "tcp_terminal_client.h" -#include "elf/elfparser.h" -#include "abstractbinfile.h" -#include "elf/elffile.h" -#include "elf/elffilewidget.h" -#include "elf/elfinfowdgt.h" #include "QCustomPlot/qcustomplot.h" -#include "srec/srecfile.h" -#include "srec/srecfilewidget.h" -#include "BinFile/binaryfile.h" -#include "BinFile/binaryfilewidget.h" +#include "genericBinaryFiles/abstractbinfile.h" +#include "genericBinaryFiles/elf/elfparser.h" +#include "genericBinaryFiles/elf/elffile.h" +#include "genericBinaryFiles/elf/elffilewidget.h" +#include "genericBinaryFiles/elf/elfinfowdgt.h" +#include "genericBinaryFiles/srec/srecfile.h" +#include "genericBinaryFiles/srec/srecfilewidget.h" +#include "genericBinaryFiles/BinFile/binaryfile.h" +#include "genericBinaryFiles/BinFile/binaryfilewidget.h" diff --git a/src/common/common.pro b/src/common/common.pro --- a/src/common/common.pro +++ b/src/common/common.pro @@ -96,7 +96,8 @@ HEADERS += \ genericBinaryFiles/srec/srecfilewidget.h \ genericBinaryFiles/abstractbinfile.h \ genericBinaryFiles/BinFile/binaryfile.h \ - genericBinaryFiles/BinFile/binaryfilewidget.h + genericBinaryFiles/BinFile/binaryfilewidget.h \ + genericBinaryFiles/genericbinaryfilewidget.h SOURCES += \ @@ -120,12 +121,14 @@ SOURCES += \ genericBinaryFiles/srec/srecfilewidget.cpp \ genericBinaryFiles/abstractbinfile.cpp \ genericBinaryFiles/BinFile/binaryfile.cpp \ - genericBinaryFiles/BinFile/binaryfilewidget.cpp + genericBinaryFiles/BinFile/binaryfilewidget.cpp \ + genericBinaryFiles/genericbinaryfilewidget.cpp FORMS += \ genericBinaryFiles/elf/elffilewidget.ui \ genericBinaryFiles/srec/srecfilewidget.ui \ - genericBinaryFiles/BinFile/binaryfilewidget.ui + genericBinaryFiles/BinFile/binaryfilewidget.ui \ + genericBinaryFiles/genericbinaryfilewidget.ui OTHER_FILES += \ ./pythongenerator.sh \ @@ -133,3 +136,5 @@ OTHER_FILES += \ + + diff --git a/src/common/genericBinaryFiles/genericbinaryfilewidget.cpp b/src/common/genericBinaryFiles/genericbinaryfilewidget.cpp new file mode 100644 --- /dev/null +++ b/src/common/genericBinaryFiles/genericbinaryfilewidget.cpp @@ -0,0 +1,62 @@ +#include "genericbinaryfilewidget.h" +#include "ui_genericbinaryfilewidget.h" +#include +#include +#include "srec/srecfile.h" + +genericBinaryFileWidget::genericBinaryFileWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::genericBinaryFileWidget) +{ + ui->setupUi(this); +} + +genericBinaryFileWidget::~genericBinaryFileWidget() +{ + delete ui; +} + +void genericBinaryFileWidget::openFile() +{ + QStringList filesNames = QFileDialog::getOpenFileNames( + this, + "Select one or more files to open", + NULL, + "Binary Files (*.bin);;SREC Files (*.srec);;Elf Files (*)"); + + for(int i=0;i +#include +#include +#include + +namespace Ui { +class genericBinaryFileWidget; +} + +typedef enum {Type_SREC,Type_Bin,Type_Elf}FileTypeEnum; +class FileListElement +{ +public: + FileListElement() {} + FileListElement(QString fileName,bool isOpened,FileTypeEnum FileType,abstractBinFileWidget* viewer) + :fileName(fileName),isOpened(isOpened),FileType(FileType),viewer(viewer){} + QString fileName; + bool isOpened; + FileTypeEnum FileType; + abstractBinFileWidget* viewer; +}; + +class genericBinaryFileWidget : public QWidget +{ + Q_OBJECT + +public: + explicit genericBinaryFileWidget(QWidget *parent = 0); + ~genericBinaryFileWidget(); + +public slots: + void openFile(); + +private: + Ui::genericBinaryFileWidget *ui; + QList files; +}; + +#endif // GENERICBINARYFILEWIDGET_H diff --git a/src/common/genericBinaryFiles/genericbinaryfilewidget.ui b/src/common/genericBinaryFiles/genericbinaryfilewidget.ui new file mode 100644 --- /dev/null +++ b/src/common/genericBinaryFiles/genericbinaryfilewidget.ui @@ -0,0 +1,103 @@ + + + genericBinaryFileWidget + + + + 0 + 0 + 878 + 360 + + + + false + + + Form + + + + + + Qt::Horizontal + + + + + + + + + + + :/images/add.svg:/images/add.svg + + + + 32 + 32 + + + + + + + + + + + + :/images/trash.svg:/images/trash.svg + + + + 32 + 32 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + File + + + + + Type + + + + + + + + + -1 + + + + + + + + + + + diff --git a/src/common/genericBinaryFiles/srec/srecfile.cpp b/src/common/genericBinaryFiles/srec/srecfile.cpp --- a/src/common/genericBinaryFiles/srec/srecfile.cpp +++ b/src/common/genericBinaryFiles/srec/srecfile.cpp @@ -25,15 +25,18 @@ srecFile::srecFile() { + p_mergingRecords = true; } srecFile::srecFile(const QString &File) { + p_mergingRecords = true; openFile(File); } srecFile::srecFile(const QStringList &Files) { + p_mergingRecords = true; openFiles(Files); } @@ -101,9 +104,9 @@ bool srecFile::toSrec(QListsize));j+=16) + for(int j=0;j<((int)(fragment->size)/16);j++) { - stream << buildRecord(3,fragment->address+j,fragment->data+j,16); + stream << buildRecord(3,fragment->address+(j*16),fragment->data+(j*16),16); } int rem = fragment->size % 16; if(rem) @@ -186,6 +189,16 @@ bool srecFile::getFragmentData(int index return false; } +bool srecFile::mergingRecords() +{ + return p_mergingRecords; +} + +void srecFile::setMergingRecords(bool enabled) +{ + p_mergingRecords = enabled; +} + bool srecFile::isSREC() { return p_isSrec & isopened(); @@ -205,6 +218,7 @@ bool srecFile::isSREC(const QString &Fil return false; } + void srecFile::parseFile(QFile *file) { if(file->isOpen()) @@ -212,6 +226,7 @@ void srecFile::parseFile(QFile *file) this->p_lineCount = 0; file->seek(0); codeFragment* fragment=NULL; + bool newFragment=true; char* data; quint64 size=0; quint64 address=-1; @@ -233,40 +248,55 @@ void srecFile::parseFile(QFile *file) { if((rectype>=1) && (rectype<=3)) { - bool merged = false; - //Could I merge it with an other fragment? - // TODO should make merging optionnal - for(int i=0;iaddress+frag->size)==address) && (merged==false) && (size!=0)) + //Could I merge it with an other fragment? + bool merged = false; + for(int i=0;isize); - memcpy(mergedData,frag->data,frag->size); - memcpy(mergedData+frag->size,data,size); - free(frag->data); - free(data); - frag->data = mergedData; - frag->size = frag->size+size; - merged = true; + codeFragment* frag = p_fragments.at(i); + if(((frag->address+frag->size)==address) && (merged==false) && (size!=0)) + { + merged = mergeFragment(frag,data,size); + } + } + if(!merged) + { + fragment = new codeFragment(data,size,address); + fragment->header = header; + p_fragments.append(fragment); } } - if(!merged) + else { - fragment = new codeFragment(data,size,address); - fragment->header = header; - p_fragments.append(fragment); + if(newFragment) + { + fragment = new codeFragment(data,size,address); + fragment->header = header; + p_fragments.append(fragment); + newFragment = false; + } + else + { + codeFragment* frag = p_fragments.last(); + mergeFragment(frag,data,size); + } } + } else { - + if((rectype>=7) && (rectype<=9)) + { + newFragment = true; + } } } } } } + int srecFile::parseLine(const QString &record, quint64 *address, char **data, quint64 *size) { #define newData (*data) @@ -340,6 +370,7 @@ int srecFile::parseLine(const QString &r return recType; } + char srecFile::lineCheckSum(const QString &line) { char sum=0; @@ -363,9 +394,15 @@ bool srecFile::checkSum(const QString &l scp.remove('\r'); char ck2 = (char)scp.mid(scp.count()-2,2).toInt(0,16); char ck=lineCheckSum(scp.remove(scp.count()-2,2)); - return (ck2==ck); + if(ck==ck2) + { + return true; + } + return false; +// return (ck2==ck); } + QString srecFile::buildRecord(int recType, int address,const char *data, int size) { QString record; @@ -401,3 +438,19 @@ QString srecFile::buildRecord(int recTyp return record.toUpper(); } +bool srecFile::mergeFragment(codeFragment *fragment, char *data, int size) +{ + char* mergedData=(char*)malloc(size+fragment->size); + if(mergedData!=NULL) + { + memcpy(mergedData,fragment->data,fragment->size); + memcpy(mergedData+fragment->size,data,size); + free(fragment->data); + free(data); + fragment->data = mergedData; + fragment->size = fragment->size+size; + return true; + } + return false; +} + diff --git a/src/common/genericBinaryFiles/srec/srecfile.h b/src/common/genericBinaryFiles/srec/srecfile.h --- a/src/common/genericBinaryFiles/srec/srecfile.h +++ b/src/common/genericBinaryFiles/srec/srecfile.h @@ -51,8 +51,11 @@ public: QString getFragmentHeader(int index); bool getFragmentData(int index, char **buffer); + bool mergingRecords(); + void setMergingRecords(bool enabled); bool isSREC(); static bool isSREC(const QString& File); + static bool checkSum(const QString& line); signals: public slots: @@ -60,13 +63,14 @@ private: void parseFile(QFile* file); static int parseLine(const QString& record, quint64 *address, char** data, quint64 *size); static char lineCheckSum(const QString& line); - static bool checkSum(const QString& line); static QString buildRecord(int recType,int address,const char* data,int size); + static bool mergeFragment(codeFragment* fragment, char* data, int size); QStringList p_fileNames; QListp_files; QList p_fragments; int p_lineCount; bool p_isSrec; + bool p_mergingRecords; }; diff --git a/src/common/genericBinaryFiles/srec/srecfilewidget.ui b/src/common/genericBinaryFiles/srec/srecfilewidget.ui --- a/src/common/genericBinaryFiles/srec/srecfilewidget.ui +++ b/src/common/genericBinaryFiles/srec/srecfilewidget.ui @@ -46,6 +46,12 @@ Qt::ActionsContextMenu + + true + + + false + Index diff --git a/src/common/pythonQtOut/generated_cpp/PySocExplorer/PySocExplorer0.cpp b/src/common/pythonQtOut/generated_cpp/PySocExplorer/PySocExplorer0.cpp --- a/src/common/pythonQtOut/generated_cpp/PySocExplorer/PySocExplorer0.cpp +++ b/src/common/pythonQtOut/generated_cpp/PySocExplorer/PySocExplorer0.cpp @@ -7701,6 +7701,11 @@ int PythonQtWrapper_srecFile::lineCount return ( theWrappedObject->lineCount()); } +bool PythonQtWrapper_srecFile::mergingRecords(srecFile* theWrappedObject) +{ + return ( theWrappedObject->mergingRecords()); +} + bool PythonQtWrapper_srecFile::openFile(srecFile* theWrappedObject, const QString& File) { return ( ((PythonQtPublicPromoter_srecFile*)theWrappedObject)->promoted_openFile(File)); @@ -7711,6 +7716,11 @@ bool PythonQtWrapper_srecFile::openFile return ( theWrappedObject->openFiles(Files)); } +void PythonQtWrapper_srecFile::setMergingRecords(srecFile* theWrappedObject, bool enabled) +{ + ( theWrappedObject->setMergingRecords(enabled)); +} + bool PythonQtWrapper_srecFile::toBinary(srecFile* theWrappedObject, const QString& File) { return ( ((PythonQtPublicPromoter_srecFile*)theWrappedObject)->promoted_toBinary(File)); diff --git a/src/common/pythonQtOut/generated_cpp/PySocExplorer/PySocExplorer0.h b/src/common/pythonQtOut/generated_cpp/PySocExplorer/PySocExplorer0.h --- a/src/common/pythonQtOut/generated_cpp/PySocExplorer/PySocExplorer0.h +++ b/src/common/pythonQtOut/generated_cpp/PySocExplorer/PySocExplorer0.h @@ -778,12 +778,12 @@ codeFragment* new_codeFragment(char* da void delete_codeFragment(codeFragment* obj) { delete obj; } void py_set_size(codeFragment* theWrappedObject, quint64 size){ theWrappedObject->size = size; } quint64 py_get_size(codeFragment* theWrappedObject){ return theWrappedObject->size; } +void py_set_address(codeFragment* theWrappedObject, quint64 address){ theWrappedObject->address = address; } +quint64 py_get_address(codeFragment* theWrappedObject){ return theWrappedObject->address; } +void py_set_data(codeFragment* theWrappedObject, char* data){ theWrappedObject->data = data; } +char* py_get_data(codeFragment* theWrappedObject){ return theWrappedObject->data; } void py_set_header(codeFragment* theWrappedObject, QString header){ theWrappedObject->header = header; } QString py_get_header(codeFragment* theWrappedObject){ return theWrappedObject->header; } -void py_set_data(codeFragment* theWrappedObject, char* data){ theWrappedObject->data = data; } -char* py_get_data(codeFragment* theWrappedObject){ return theWrappedObject->data; } -void py_set_address(codeFragment* theWrappedObject, quint64 address){ theWrappedObject->address = address; } -quint64 py_get_address(codeFragment* theWrappedObject){ return theWrappedObject->address; } }; @@ -976,8 +976,10 @@ void delete_srecFile(srecFile* obj) { de bool static_srecFile_isSREC(const QString& File); bool isopened(srecFile* theWrappedObject); int lineCount(srecFile* theWrappedObject); + bool mergingRecords(srecFile* theWrappedObject); bool openFile(srecFile* theWrappedObject, const QString& File); bool openFiles(srecFile* theWrappedObject, const QStringList& Files); + void setMergingRecords(srecFile* theWrappedObject, bool enabled); bool toBinary(srecFile* theWrappedObject, const QString& File); bool static_srecFile_toSrec(QList fragments, const QString& File); bool toSrec(srecFile* theWrappedObject, const QString& File); diff --git a/src/common/pythongenerator.sh b/src/common/pythongenerator.sh --- a/src/common/pythongenerator.sh +++ b/src/common/pythongenerator.sh @@ -3,4 +3,4 @@ #export QTDIR=/usr/include #export QTDIR=/usr/include/qt5 -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 +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