why my inline ui function call create segmentation fault when i call it from other class ?
-
wrote on 26 May 2021, 13:30 last edited by
i am calling below function from other class to set message box dynamically but it create segmentation fault at "delete pGasLable ". i don't know what is reason behind that i want to know why this happen. how to remove segmentation fault?
inline void MSG_BOX(QWidget* parent,QString sMessage, QString sButtonText) { qDebug()<<"Profile updated successfully at 372"<<__LINE__; QFont font("Open Sans", 14); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QFont qButtonFont("Open Sans", 16, QFont::Bold); qDebug()<<"Profile updated successfully at 372"<<__LINE__; const QSize btn_size1 = QSize(300,80); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QFrame *FrameMessageBox = new QFrame(parent); qDebug()<<"Profile updated successfully at 372"<<__LINE__; FrameMessageBox->setGeometry(0,0,480,800); qDebug()<<"Profile updated successfully at 372"<<__LINE__; FrameMessageBox->show(); qDebug()<<"Profile updated successfully at 372"<<__LINE__; FrameMessageBox->setStyleSheet("background-color: rgba(0, 0, 0, 0.5);border-radius:10px;"); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QMessageBox * msgBox = new QMessageBox(QMessageBox::NoIcon, "", "", QMessageBox::Ok,FrameMessageBox, Qt::FramelessWindowHint); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QLabel *pGasLable = new QLabel(msgBox); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QString sStringhtml = "<html>" "<head>" "</style>" "</head>" "<body>" "<p><p align=\'center\'><span style= \""+QString("font-family:'Open Sans';font-weight:400;font-size:14pt;")+"\">"+(sMessage)+"</span><p align=\"center\">" "</body></html>"; qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setTextFormat(Qt::RichText); qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setText(sStringhtml); qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setTextInteractionFlags(Qt::NoTextInteraction); qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setWordWrap(true); qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setAlignment(Qt::AlignCenter); qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setStyleSheet("Padding-top: 10px;background-color: rgb(255, 255, 255);"); qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setGeometry(MSGLBL_STARTX, MSGLBL_STARTY, MSGLBL_WIDTH, MSGLBL_HEIGHT); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->setStyleSheet("QMessageBox { background-color: rgb(255, 255, 255);border-radius:10px;}" "QLabel{min-height:80px; max-height:80px; min-width:280px; max-width:300px;border-radius:10px;}"); // msgBox->setText("<center>Machine Configuration Saved</center>"); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->setFont(font); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->button(QMessageBox::Ok)->setText(sButtonText); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->button(QMessageBox::Ok)->setStyleSheet("border: none;color: rgb(0, 0, 0);background-color: #FFBF00; background-repeat: no-repeat;position: center;border-radius:10px;"); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->button(QMessageBox::Ok)->setMinimumSize(btn_size1); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->button(QMessageBox::Ok)->setMaximumSize(btn_size1); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->button(QMessageBox::Ok)->setFont(qButtonFont); qDebug()<<"Profile updated successfully at 372"<<__LINE__; #if 1 //To add border-radius int radius = 10; qDebug()<<"Profile updated successfully at 372"<<__LINE__; int width = 324; qDebug()<<"Profile updated successfully at 372"<<__LINE__; int height = 192; qDebug()<<"Profile updated successfully at 372"<<__LINE__; QRegion verticalRegion(0, radius, width, height - (2 * radius)); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QRegion horizontalRegion(radius, 0, width - (2 * radius), height); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QRegion circle(0, 0, 2 * radius, 2 * radius, QRegion::Ellipse); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QRegion region = verticalRegion.united(horizontalRegion); qDebug()<<"Profile updated successfully at 372"<<__LINE__; region = region.united(circle); qDebug()<<"Profile updated successfully at 372"<<__LINE__; region = region.united(circle.translated(width - (2 * radius), 0)); qDebug()<<"Profile updated successfully at 372"<<__LINE__; region = region.united(circle.translated(width - (2 * radius), height - (2 * radius))); qDebug()<<"Profile updated successfully at 372"<<__LINE__; region = region.united(circle.translated(0, height - (2 * radius))); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->setMask(region); qDebug()<<"Profile updated successfully at 372"<<__LINE__; #endif qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->exec(); qDebug()<<"Profile updated successfully at 372"<<__LINE__; delete pGasLable; qDebug()<<"Profile updated successfully at 372"<<__LINE__; delete msgBox; qDebug()<<"Profile updated successfully at 372"<<__LINE__; delete FrameMessageBox; qDebug()<<"Profile updated successfully at 372"<<__LINE__; }
-
i am calling below function from other class to set message box dynamically but it create segmentation fault at "delete pGasLable ". i don't know what is reason behind that i want to know why this happen. how to remove segmentation fault?
inline void MSG_BOX(QWidget* parent,QString sMessage, QString sButtonText) { qDebug()<<"Profile updated successfully at 372"<<__LINE__; QFont font("Open Sans", 14); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QFont qButtonFont("Open Sans", 16, QFont::Bold); qDebug()<<"Profile updated successfully at 372"<<__LINE__; const QSize btn_size1 = QSize(300,80); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QFrame *FrameMessageBox = new QFrame(parent); qDebug()<<"Profile updated successfully at 372"<<__LINE__; FrameMessageBox->setGeometry(0,0,480,800); qDebug()<<"Profile updated successfully at 372"<<__LINE__; FrameMessageBox->show(); qDebug()<<"Profile updated successfully at 372"<<__LINE__; FrameMessageBox->setStyleSheet("background-color: rgba(0, 0, 0, 0.5);border-radius:10px;"); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QMessageBox * msgBox = new QMessageBox(QMessageBox::NoIcon, "", "", QMessageBox::Ok,FrameMessageBox, Qt::FramelessWindowHint); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QLabel *pGasLable = new QLabel(msgBox); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QString sStringhtml = "<html>" "<head>" "</style>" "</head>" "<body>" "<p><p align=\'center\'><span style= \""+QString("font-family:'Open Sans';font-weight:400;font-size:14pt;")+"\">"+(sMessage)+"</span><p align=\"center\">" "</body></html>"; qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setTextFormat(Qt::RichText); qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setText(sStringhtml); qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setTextInteractionFlags(Qt::NoTextInteraction); qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setWordWrap(true); qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setAlignment(Qt::AlignCenter); qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setStyleSheet("Padding-top: 10px;background-color: rgb(255, 255, 255);"); qDebug()<<"Profile updated successfully at 372"<<__LINE__; pGasLable->setGeometry(MSGLBL_STARTX, MSGLBL_STARTY, MSGLBL_WIDTH, MSGLBL_HEIGHT); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->setStyleSheet("QMessageBox { background-color: rgb(255, 255, 255);border-radius:10px;}" "QLabel{min-height:80px; max-height:80px; min-width:280px; max-width:300px;border-radius:10px;}"); // msgBox->setText("<center>Machine Configuration Saved</center>"); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->setFont(font); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->button(QMessageBox::Ok)->setText(sButtonText); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->button(QMessageBox::Ok)->setStyleSheet("border: none;color: rgb(0, 0, 0);background-color: #FFBF00; background-repeat: no-repeat;position: center;border-radius:10px;"); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->button(QMessageBox::Ok)->setMinimumSize(btn_size1); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->button(QMessageBox::Ok)->setMaximumSize(btn_size1); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->button(QMessageBox::Ok)->setFont(qButtonFont); qDebug()<<"Profile updated successfully at 372"<<__LINE__; #if 1 //To add border-radius int radius = 10; qDebug()<<"Profile updated successfully at 372"<<__LINE__; int width = 324; qDebug()<<"Profile updated successfully at 372"<<__LINE__; int height = 192; qDebug()<<"Profile updated successfully at 372"<<__LINE__; QRegion verticalRegion(0, radius, width, height - (2 * radius)); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QRegion horizontalRegion(radius, 0, width - (2 * radius), height); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QRegion circle(0, 0, 2 * radius, 2 * radius, QRegion::Ellipse); qDebug()<<"Profile updated successfully at 372"<<__LINE__; QRegion region = verticalRegion.united(horizontalRegion); qDebug()<<"Profile updated successfully at 372"<<__LINE__; region = region.united(circle); qDebug()<<"Profile updated successfully at 372"<<__LINE__; region = region.united(circle.translated(width - (2 * radius), 0)); qDebug()<<"Profile updated successfully at 372"<<__LINE__; region = region.united(circle.translated(width - (2 * radius), height - (2 * radius))); qDebug()<<"Profile updated successfully at 372"<<__LINE__; region = region.united(circle.translated(0, height - (2 * radius))); qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->setMask(region); qDebug()<<"Profile updated successfully at 372"<<__LINE__; #endif qDebug()<<"Profile updated successfully at 372"<<__LINE__; msgBox->exec(); qDebug()<<"Profile updated successfully at 372"<<__LINE__; delete pGasLable; qDebug()<<"Profile updated successfully at 372"<<__LINE__; delete msgBox; qDebug()<<"Profile updated successfully at 372"<<__LINE__; delete FrameMessageBox; qDebug()<<"Profile updated successfully at 372"<<__LINE__; }
@Qt-embedded-developer said in why my inline ui function call create segmentation fault when i call it from other class ?:
delete pGasLable
Why do you delete it?
You should not delete widgets like that, dopGasLable->deleteLater();
instead.
Also, if you set parent then DO NOT DELETE IT! It will be deleted as soon as parent is deleted. If you delete it by yourself you get a double delete! Please read https://doc.qt.io/qt-5/objecttrees.html -
@Qt-embedded-developer said in why my inline ui function call create segmentation fault when i call it from other class ?:
delete pGasLable
Why do you delete it?
You should not delete widgets like that, dopGasLable->deleteLater();
instead.
Also, if you set parent then DO NOT DELETE IT! It will be deleted as soon as parent is deleted. If you delete it by yourself you get a double delete! Please read https://doc.qt.io/qt-5/objecttrees.htmlwrote on 26 May 2021, 13:54 last edited by Qt embedded developer@jsulm in one parent class this function get called multiple time so i have used delete. so in this case what will you suggest ?
-
@jsulm in one parent class this function get called multiple time so i have used delete. so in this case what will you suggest ?
@Qt-embedded-developer said in why my inline ui function call create segmentation fault when i call it from other class ?:
so i have used delete
But you don't have to delete all widgets manually. When you delete msgBox it will delete all its children including pGasLable.
You should really read the link I gave you, parent-child is one of the core concepts in Qt. -
@Qt-embedded-developer said in why my inline ui function call create segmentation fault when i call it from other class ?:
so i have used delete
But you don't have to delete all widgets manually. When you delete msgBox it will delete all its children including pGasLable.
You should really read the link I gave you, parent-child is one of the core concepts in Qt.wrote on 26 May 2021, 14:00 last edited by@jsulm Thanks
-
@Qt-embedded-developer said in why my inline ui function call create segmentation fault when i call it from other class ?:
so i have used delete
But you don't have to delete all widgets manually. When you delete msgBox it will delete all its children including pGasLable.
You should really read the link I gave you, parent-child is one of the core concepts in Qt.wrote on 27 May 2021, 05:45 last edited by Qt embedded developer@jsulm Hi !
i have seen that this function does not create segmentation fault in other class. it works properly but it happens in my one class only.
i have printed line number to find out segmentation fault. and i found out last line number before line "delete pGasLable" , after that line number not get printed. so i think it created segmentation fault. so can you refer me right link to find out segmentation fault in case qt programs
-
@jsulm Hi !
i have seen that this function does not create segmentation fault in other class. it works properly but it happens in my one class only.
i have printed line number to find out segmentation fault. and i found out last line number before line "delete pGasLable" , after that line number not get printed. so i think it created segmentation fault. so can you refer me right link to find out segmentation fault in case qt programs
@Qt-embedded-developer said in why my inline ui function call create segmentation fault when i call it from other class ?:
so can you refer me right link to find out segmentation fault in case qt programs
There is nothing special about Qt here. Simply use the debugger.
And I already said several times: if a QObject based object has a parent you DO NOT HAVE to delete it explicitly, it will be deleted as soon as its parent is deleted. I also posted this link for you to read (and you should really do!): https://doc.qt.io/qt-5/objecttrees.html
A heave nothing to add to this topic... -
@Qt-embedded-developer said in why my inline ui function call create segmentation fault when i call it from other class ?:
so can you refer me right link to find out segmentation fault in case qt programs
There is nothing special about Qt here. Simply use the debugger.
And I already said several times: if a QObject based object has a parent you DO NOT HAVE to delete it explicitly, it will be deleted as soon as its parent is deleted. I also posted this link for you to read (and you should really do!): https://doc.qt.io/qt-5/objecttrees.html
A heave nothing to add to this topic...wrote on 27 May 2021, 06:30 last edited by@jsulm i have read it yesterday. i removed delete statement. and segmentation fault gone.
but now in that function it not wait for user action to click on ok button. so what is solution of this problem ?
-
@jsulm i have read it yesterday. i removed delete statement. and segmentation fault gone.
but now in that function it not wait for user action to click on ok button. so what is solution of this problem ?
@Qt-embedded-developer said in why my inline ui function call create segmentation fault when i call it from other class ?:
so what is solution of this problem ?
Please post the current code, this issue has nothing to do with object deletion.
It should wait here:msgBox->exec();
as exec() is a blocking call.
-
@Qt-embedded-developer said in why my inline ui function call create segmentation fault when i call it from other class ?:
so what is solution of this problem ?
Please post the current code, this issue has nothing to do with object deletion.
It should wait here:msgBox->exec();
as exec() is a blocking call.
wrote on 27 May 2021, 06:53 last edited by#include "FuelCheckProfileUpdate.h" #include "ui_FuelCheckProfileUpdate.h" #include "CommonClass/AppMain.h" #include "FuelCheck.h" #include "MainScreen.h" inline void MSG_BOX11(QWidget* parent,QString sMessage, QString sButtonText) { QFont font("Open Sans", 14); QFont qButtonFont("Open Sans", 16, QFont::Bold); const QSize btn_size1 = QSize(300,80); QFrame *FrameMessageBox = new QFrame(parent); FrameMessageBox->setGeometry(0,0,480,800); FrameMessageBox->show(); FrameMessageBox->setStyleSheet("background-color: rgba(0, 0, 0, 0.5);border-radius:10px;"); QMessageBox * msgBox = new QMessageBox(QMessageBox::NoIcon, "", "", QMessageBox::Ok,FrameMessageBox, Qt::FramelessWindowHint); QLabel *pGasLable = new QLabel(msgBox); QString sStringhtml = "<html>" "<head>" "</style>" "</head>" "<body>" "<p><p align=\'center\'><span style= \""+QString("font-family:'Open Sans';font-weight:400;font-size:14pt;")+"\">"+(sMessage)+"</span><p align=\"center\">" "</body></html>"; pGasLable->setTextFormat(Qt::RichText); pGasLable->setText(sStringhtml); pGasLable->setTextInteractionFlags(Qt::NoTextInteraction); pGasLable->setWordWrap(true); pGasLable->setAlignment(Qt::AlignCenter); pGasLable->setStyleSheet("Padding-top: 10px;background-color: rgb(255, 255, 255);"); pGasLable->setGeometry(MSGLBL_STARTX, MSGLBL_STARTY, MSGLBL_WIDTH, MSGLBL_HEIGHT); msgBox->setStyleSheet("QMessageBox { background-color: rgb(255, 255, 255);border-radius:10px;}" "QLabel{min-height:80px; max-height:80px; min-width:280px; max-width:300px;border-radius:10px;}"); // msgBox->setText("<center>Machine Configuration Saved</center>"); msgBox->setFont(font); msgBox->button(QMessageBox::Ok)->setText(sButtonText); msgBox->button(QMessageBox::Ok)->setStyleSheet("border: none;color: rgb(0, 0, 0);background-color: #FFBF00; background-repeat: no-repeat;position: center;border-radius:10px;"); msgBox->button(QMessageBox::Ok)->setMinimumSize(btn_size1); msgBox->button(QMessageBox::Ok)->setMaximumSize(btn_size1); msgBox->button(QMessageBox::Ok)->setFont(qButtonFont); #if 1 //To add border-radius int radius = 10; int width = 324; int height = 192; QRegion verticalRegion(0, radius, width, height - (2 * radius)); QRegion horizontalRegion(radius, 0, width - (2 * radius), height); QRegion circle(0, 0, 2 * radius, 2 * radius, QRegion::Ellipse); QRegion region = verticalRegion.united(horizontalRegion); region = region.united(circle); region = region.united(circle.translated(width - (2 * radius), 0)); region = region.united(circle.translated(width - (2 * radius), height - (2 * radius))); region = region.united(circle.translated(0, height - (2 * radius))); msgBox->setMask(region); #endif msgBox->exec(); if(IS_VALID_OBJ(pGasLable)) { pGasLable->deleteLater(); } if (IS_VALID_OBJ(pGasLable)) { msgBox->deleteLater(); } if (IS_VALID_OBJ(pGasLable)) { FrameMessageBox->deleteLater(); } } #define X_SECONDS_TO_SHOW 5 FuelCheckProfileUpdate::FuelCheckProfileUpdate(QWidget *parent) : QWidget(parent), ui(new Ui::FuelCheckProfileUpdate) { ui->setupUi(this); ui->lblProgress->setVisible(false); bIsRequiredToUpdateFirmware = false; timer=new QTimer(this); QFont font; font.setFamily(FONT_FAMILY_AWESOME); font.setPixelSize(28); font.setPixelSize(44); u16OldFirmware = 0; u16FwToUpdate = 0; u16NewFirmware = 0; u8BlinkCounter=X_SECONDS_TO_SHOW; FwUpdateProcess(); QTimer::singleShot(1000,this, SLOT(UpdateFirmware())); QObject::connect(timer, SIGNAL(timeout()), this, SLOT(FwUpdateFail())); timer->start(500); // QObject::connect(&qFwFailTimer, SIGNAL(timeout()), this, SLOT(FwUpdateFail())); } FuelCheckProfileUpdate::~FuelCheckProfileUpdate() { if(timer->isActive()) timer->stop(); QObject::disconnect(timer, SIGNAL(timeout()), this, SLOT(FwUpdateFail())); pMainApp.ObjSettings.eScreenStatus = SCREEN_MAIN; if( pMainApp.ObjSettings.bIsCritiCalFailed == true) { pMainApp.ObjHwControl.ObjLed.OnOff(RedLed); } else { pMainApp.ObjHwControl.ObjLed.OnOff(GreenLed); } MainScreen* parent = qobject_cast<MainScreen*>(this->parent()); parent->LaserModuleFirmwareUpgrade(); delete ui; } void FuelCheckProfileUpdate::FwUpdateFail() { u8BlinkCounter=u8BlinkCounter-1; ui->lblProgress->show(); QString sMessage = "<html><head/><body><p align=\"center\"><span style=\" font-size:16pt; font-weight:400;\">"+sUpdatingFuelGaugeProfile()+" </span></p>" "<p align=\"center\"><span style=\" font-size:16pt; font-weight:400;\">Profile From Version </span>" "<span style=\" font-size:16pt;\">"+ sCurrentFuelGaugeFirmwareValue +"</span><span style=\" font-size:16pt; font-weight:400;\"> to </span>" "<span style=\" font-size:16pt;\">"+ sNewFuelGaugeFirmwareValue +"</span></p></body></html>"; if(u8BlinkCounter%2 == 0) { ui->lblProgress->setText(sMessage); } else { QString sMessage = "<html><head/><body><p align=\"center\"><span style=\" font-size:16pt; font-weight:400;\">"+sUpdatingFuelGaugeProfile()+" </span></p>" "<p align=\"center\"><span style=\" font-size:16pt; font-weight:400;\">Profile From Version </span>" "<span style=\" font-size:16pt;\">"+ sCurrentFuelGaugeFirmwareValue +"</span><span style=\" font-size:16pt; font-weight:400;\"> to </span>" "<span style=\" font-size:16pt;\">"+ sNewFuelGaugeFirmwareValue +"</span></p></body></html>"; ui->lblProgress->setText(sMessage); } if(u8BlinkCounter==0) { timer->stop(); this->deleteLater(); } } void FuelCheckProfileUpdate::FwUpdateProcess() { bIsRequiredToUpdateFirmware = false; if(GetFwVersionToUpdate()) { //2. Get Current version if(GetFirmwareVersion(u16OldFirmware) == true) { sOldFuelGaugeFirmwareValue = QString::number(u16OldFirmware); if(u16FwToUpdate != u16OldFirmware) { bIsRequiredToUpdateFirmware = true; } } } } bool FuelCheckProfileUpdate::GetFirmwareVersion(u_int16_t &u16GotFwVersion) { bool bStatus = false; unsigned char pData[36]; char text1[4]; u16OldFirmware = 0; if(pMainApp.ObjSettings.ObjFuelCheck.gauge_read_firmware(pMainApp.ObjSettings.ObjFuelCheck.nI2CId,0x0100,pData,36) == 0) { text1[0] = pData[2]; text1[1] = pData[3]; text1[2] = pData[4]; text1[3] = '\0'; sCurrentFuelGaugeFirmwareValue = text1; u16GotFwVersion = sCurrentFuelGaugeFirmwareValue.toInt(); #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Existing Fuel Gauge profile version :"+sCurrentFuelGaugeFirmwareValue); #endif bStatus = true; } return bStatus; } bool FuelCheckProfileUpdate::GetFwVersionToUpdate() { bool bStatus = false; u16FwToUpdate = 0; QString sFwUpdateFilePath = SOURCE_FILE; do { if(sFwUpdateFilePath.isEmpty()) { #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation(sInvalidFilePath()); MSG_BOX1(this, sInvalidFilePath(), sOk()); #endif break; } else { FILE *fp; int errnum; char ra[50],text[4]; fp = fopen(SOURCE_FILE,"r"); if( fp == NULL) { errnum = errno; fprintf(stderr, "Value of errno: %d\n", errno); perror("Error printed by perror"); fprintf(stderr, "Error opening file: %s\n", strerror( errnum )); } else { fseek(fp, -543, SEEK_END); //fflush(ra); fgets ( ra, 50, fp ); if( fclose(fp) == 0) { if((ra[0]=='3')&&(ra[3]=='3')&&(ra[6]=='3')) { if(((ra[1]>='0') && (ra[1]<='9')) && ((ra[4]>='0') && (ra[4]<='9')) &&((ra[7]>='0') && (ra[7]<='9'))) { text[0] = ra[1]; text[1] = ra[4]; text[2] = ra[7]; text[3] = '\0'; sNewFuelGaugeFirmwareValue = text; u16FwToUpdate = sNewFuelGaugeFirmwareValue.toInt(); #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Source file Fuel Gauge profile version :"+sNewFuelGaugeFirmwareValue); #endif } else { #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("golden image not recognized"); #endif } } else { #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("golden image not recognized"); #endif } } } } bStatus = true; }while(false); return bStatus; } bool FuelCheckProfileUpdate::UpdateFirmware() { bool bStatus = false; pMainApp.ObjSettings.DebugStation("sCurrentFuelGaugeFirmwareValue" + sCurrentFuelGaugeFirmwareValue); pMainApp.ObjSettings.DebugStation("sNewFuelGaugeFirmwareValue" + sNewFuelGaugeFirmwareValue); if ( sCurrentFuelGaugeFirmwareValue != sNewFuelGaugeFirmwareValue ) { do { pMainApp.ObjSettings.eScreenStatus = SCREEN_FWUPDATE; #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Golden image update process started"); #endif int nSourceFile; struct stat st; char *pFileBuffer; stat(SOURCE_FILE,&st); if((nSourceFile= open(SOURCE_FILE,O_RDONLY))< 0) { #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Can not open Golden image Source file"); #endif return bStatus; } pFileBuffer =(char *)malloc(st.st_size); if (!pFileBuffer) return bStatus; read(nSourceFile, pFileBuffer, st.st_size); ::close(nSourceFile); QString str =pMainApp.ObjSettings.ObjFuelCheck.gauge_execute_fs(pMainApp.ObjSettings.ObjFuelCheck.nI2CId, pFileBuffer); if(GetFwVersionToUpdate()) { pMainApp.ObjSettings.ObjFuelCheck.bIsFuelCheckOn=pMainApp.ObjSettings.ObjFuelCheck.gauge_init(); if ( pMainApp.ObjSettings.ObjFuelCheck.bIsFuelCheckOn) { int Percentage = -1; bool bisFuelConnected = true; for(UINT8 u8loop =0; u8loop < 3 ; u8loop++) { if(pMainApp.ObjSettings.ObjFuelCheck.gauge_cmd_read(pMainApp.ObjSettings.ObjFuelCheck.nI2CId, 0x2c) > 0) //SOC in [%] { Percentage = pMainApp.ObjSettings.ObjFuelCheck.u16Datareceived; } else { pMainApp.ObjSettings.bIsFuelCheckPassed=false; qDebug()<<"Fuel gauge not found"; #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Fuel gauge not found"); #endif return bStatus; } QThread::msleep(100); if((Percentage < 0) && (Percentage > 100)) { bisFuelConnected = false; qDebug()<<"Fuel gauge found but wrong percentarge detected : " + QString::number(Percentage); #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Fuel gauge found but wrong percentarge detected : " + QString::number(Percentage)); #endif } } if(bisFuelConnected == true) { qDebug()<<"Battery percentage" + QString::number(Percentage); #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Battery percentage" + QString::number(Percentage)); #endif pMainApp.ObjSettings.bIsFuelCheckPassed=true; pMainApp.ObjSettings.ObjFuelCheck.nResult = Percentage; } } else { pMainApp.ObjSettings.bIsFuelCheckPassed=false; } //2. Get Current version if(GetFirmwareVersion(u16OldFirmware) == true) { if(u16FwToUpdate == u16OldFirmware) { pMainApp.ObjSettings.bIsFuelGaugeFirmWareUpdateRequire = false; #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Profile updated successfully"); #endif pMainApp.ObjHwControl.ObjSounder.SetAlarmLevel(AlarmLevel1); QString sMessage = "<html><head/><body><p align=\"center\"><span style=\" font-size:12pt; font-weight:400;\">"+sFuelGaugeProfile() +"</span>" "<span style=\" font-size:12pt;\"><br/></span>" "<span style=\" font-size:12pt; font-weight:400;\">From </span><span style=\" font-size:12pt;\">"+sOldFuelGaugeFirmwareValue +"</span>" "<span style=\" font-size:12pt; font-weight:400;\"> To </span><span style=\" font-size:12pt;\">"+sNewFuelGaugeFirmwareValue +" "+sSuccessfully() +".</span></p>" "<p align=\"center\"><span style=\" font-size:12pt; font-weight:600;\">" "</span></p></body></html>"; MSG_BOX1(this, sMessage, sOk()); // pMainApp.ObjSettings.bIsLaserModuleFirmwareUpdate = true; // pMainApp.ObjSettings.UpdateConfig(SETTING_ISLASERMODULEFIRMWAREUPDATE, QString::number(pMainApp.ObjSettings.bIsLaserModuleFirmwareUpdate)); pMainApp.ObjHwControl.ObjSounder.SetAlarmLevel(SounderOFF); } else { pMainApp.ObjHwControl.ObjSounder.SetAlarmLevel(AlarmLevel1); MSG_BOX1(this, sFuelGaugeProfileUpdateFail(), sOk()); pMainApp.ObjHwControl.ObjSounder.SetAlarmLevel(SounderOFF); this->deleteLater(); } } } if(str == '\0' || str == "") { qDebug()<<"Profile updated successfully" <<str; } else { qDebug()<<"Profile updation failed"<<str; } free(pFileBuffer); bStatus = true; } while(false); return bStatus; } return false; }
-
#include "FuelCheckProfileUpdate.h" #include "ui_FuelCheckProfileUpdate.h" #include "CommonClass/AppMain.h" #include "FuelCheck.h" #include "MainScreen.h" inline void MSG_BOX11(QWidget* parent,QString sMessage, QString sButtonText) { QFont font("Open Sans", 14); QFont qButtonFont("Open Sans", 16, QFont::Bold); const QSize btn_size1 = QSize(300,80); QFrame *FrameMessageBox = new QFrame(parent); FrameMessageBox->setGeometry(0,0,480,800); FrameMessageBox->show(); FrameMessageBox->setStyleSheet("background-color: rgba(0, 0, 0, 0.5);border-radius:10px;"); QMessageBox * msgBox = new QMessageBox(QMessageBox::NoIcon, "", "", QMessageBox::Ok,FrameMessageBox, Qt::FramelessWindowHint); QLabel *pGasLable = new QLabel(msgBox); QString sStringhtml = "<html>" "<head>" "</style>" "</head>" "<body>" "<p><p align=\'center\'><span style= \""+QString("font-family:'Open Sans';font-weight:400;font-size:14pt;")+"\">"+(sMessage)+"</span><p align=\"center\">" "</body></html>"; pGasLable->setTextFormat(Qt::RichText); pGasLable->setText(sStringhtml); pGasLable->setTextInteractionFlags(Qt::NoTextInteraction); pGasLable->setWordWrap(true); pGasLable->setAlignment(Qt::AlignCenter); pGasLable->setStyleSheet("Padding-top: 10px;background-color: rgb(255, 255, 255);"); pGasLable->setGeometry(MSGLBL_STARTX, MSGLBL_STARTY, MSGLBL_WIDTH, MSGLBL_HEIGHT); msgBox->setStyleSheet("QMessageBox { background-color: rgb(255, 255, 255);border-radius:10px;}" "QLabel{min-height:80px; max-height:80px; min-width:280px; max-width:300px;border-radius:10px;}"); // msgBox->setText("<center>Machine Configuration Saved</center>"); msgBox->setFont(font); msgBox->button(QMessageBox::Ok)->setText(sButtonText); msgBox->button(QMessageBox::Ok)->setStyleSheet("border: none;color: rgb(0, 0, 0);background-color: #FFBF00; background-repeat: no-repeat;position: center;border-radius:10px;"); msgBox->button(QMessageBox::Ok)->setMinimumSize(btn_size1); msgBox->button(QMessageBox::Ok)->setMaximumSize(btn_size1); msgBox->button(QMessageBox::Ok)->setFont(qButtonFont); #if 1 //To add border-radius int radius = 10; int width = 324; int height = 192; QRegion verticalRegion(0, radius, width, height - (2 * radius)); QRegion horizontalRegion(radius, 0, width - (2 * radius), height); QRegion circle(0, 0, 2 * radius, 2 * radius, QRegion::Ellipse); QRegion region = verticalRegion.united(horizontalRegion); region = region.united(circle); region = region.united(circle.translated(width - (2 * radius), 0)); region = region.united(circle.translated(width - (2 * radius), height - (2 * radius))); region = region.united(circle.translated(0, height - (2 * radius))); msgBox->setMask(region); #endif msgBox->exec(); if(IS_VALID_OBJ(pGasLable)) { pGasLable->deleteLater(); } if (IS_VALID_OBJ(pGasLable)) { msgBox->deleteLater(); } if (IS_VALID_OBJ(pGasLable)) { FrameMessageBox->deleteLater(); } } #define X_SECONDS_TO_SHOW 5 FuelCheckProfileUpdate::FuelCheckProfileUpdate(QWidget *parent) : QWidget(parent), ui(new Ui::FuelCheckProfileUpdate) { ui->setupUi(this); ui->lblProgress->setVisible(false); bIsRequiredToUpdateFirmware = false; timer=new QTimer(this); QFont font; font.setFamily(FONT_FAMILY_AWESOME); font.setPixelSize(28); font.setPixelSize(44); u16OldFirmware = 0; u16FwToUpdate = 0; u16NewFirmware = 0; u8BlinkCounter=X_SECONDS_TO_SHOW; FwUpdateProcess(); QTimer::singleShot(1000,this, SLOT(UpdateFirmware())); QObject::connect(timer, SIGNAL(timeout()), this, SLOT(FwUpdateFail())); timer->start(500); // QObject::connect(&qFwFailTimer, SIGNAL(timeout()), this, SLOT(FwUpdateFail())); } FuelCheckProfileUpdate::~FuelCheckProfileUpdate() { if(timer->isActive()) timer->stop(); QObject::disconnect(timer, SIGNAL(timeout()), this, SLOT(FwUpdateFail())); pMainApp.ObjSettings.eScreenStatus = SCREEN_MAIN; if( pMainApp.ObjSettings.bIsCritiCalFailed == true) { pMainApp.ObjHwControl.ObjLed.OnOff(RedLed); } else { pMainApp.ObjHwControl.ObjLed.OnOff(GreenLed); } MainScreen* parent = qobject_cast<MainScreen*>(this->parent()); parent->LaserModuleFirmwareUpgrade(); delete ui; } void FuelCheckProfileUpdate::FwUpdateFail() { u8BlinkCounter=u8BlinkCounter-1; ui->lblProgress->show(); QString sMessage = "<html><head/><body><p align=\"center\"><span style=\" font-size:16pt; font-weight:400;\">"+sUpdatingFuelGaugeProfile()+" </span></p>" "<p align=\"center\"><span style=\" font-size:16pt; font-weight:400;\">Profile From Version </span>" "<span style=\" font-size:16pt;\">"+ sCurrentFuelGaugeFirmwareValue +"</span><span style=\" font-size:16pt; font-weight:400;\"> to </span>" "<span style=\" font-size:16pt;\">"+ sNewFuelGaugeFirmwareValue +"</span></p></body></html>"; if(u8BlinkCounter%2 == 0) { ui->lblProgress->setText(sMessage); } else { QString sMessage = "<html><head/><body><p align=\"center\"><span style=\" font-size:16pt; font-weight:400;\">"+sUpdatingFuelGaugeProfile()+" </span></p>" "<p align=\"center\"><span style=\" font-size:16pt; font-weight:400;\">Profile From Version </span>" "<span style=\" font-size:16pt;\">"+ sCurrentFuelGaugeFirmwareValue +"</span><span style=\" font-size:16pt; font-weight:400;\"> to </span>" "<span style=\" font-size:16pt;\">"+ sNewFuelGaugeFirmwareValue +"</span></p></body></html>"; ui->lblProgress->setText(sMessage); } if(u8BlinkCounter==0) { timer->stop(); this->deleteLater(); } } void FuelCheckProfileUpdate::FwUpdateProcess() { bIsRequiredToUpdateFirmware = false; if(GetFwVersionToUpdate()) { //2. Get Current version if(GetFirmwareVersion(u16OldFirmware) == true) { sOldFuelGaugeFirmwareValue = QString::number(u16OldFirmware); if(u16FwToUpdate != u16OldFirmware) { bIsRequiredToUpdateFirmware = true; } } } } bool FuelCheckProfileUpdate::GetFirmwareVersion(u_int16_t &u16GotFwVersion) { bool bStatus = false; unsigned char pData[36]; char text1[4]; u16OldFirmware = 0; if(pMainApp.ObjSettings.ObjFuelCheck.gauge_read_firmware(pMainApp.ObjSettings.ObjFuelCheck.nI2CId,0x0100,pData,36) == 0) { text1[0] = pData[2]; text1[1] = pData[3]; text1[2] = pData[4]; text1[3] = '\0'; sCurrentFuelGaugeFirmwareValue = text1; u16GotFwVersion = sCurrentFuelGaugeFirmwareValue.toInt(); #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Existing Fuel Gauge profile version :"+sCurrentFuelGaugeFirmwareValue); #endif bStatus = true; } return bStatus; } bool FuelCheckProfileUpdate::GetFwVersionToUpdate() { bool bStatus = false; u16FwToUpdate = 0; QString sFwUpdateFilePath = SOURCE_FILE; do { if(sFwUpdateFilePath.isEmpty()) { #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation(sInvalidFilePath()); MSG_BOX1(this, sInvalidFilePath(), sOk()); #endif break; } else { FILE *fp; int errnum; char ra[50],text[4]; fp = fopen(SOURCE_FILE,"r"); if( fp == NULL) { errnum = errno; fprintf(stderr, "Value of errno: %d\n", errno); perror("Error printed by perror"); fprintf(stderr, "Error opening file: %s\n", strerror( errnum )); } else { fseek(fp, -543, SEEK_END); //fflush(ra); fgets ( ra, 50, fp ); if( fclose(fp) == 0) { if((ra[0]=='3')&&(ra[3]=='3')&&(ra[6]=='3')) { if(((ra[1]>='0') && (ra[1]<='9')) && ((ra[4]>='0') && (ra[4]<='9')) &&((ra[7]>='0') && (ra[7]<='9'))) { text[0] = ra[1]; text[1] = ra[4]; text[2] = ra[7]; text[3] = '\0'; sNewFuelGaugeFirmwareValue = text; u16FwToUpdate = sNewFuelGaugeFirmwareValue.toInt(); #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Source file Fuel Gauge profile version :"+sNewFuelGaugeFirmwareValue); #endif } else { #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("golden image not recognized"); #endif } } else { #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("golden image not recognized"); #endif } } } } bStatus = true; }while(false); return bStatus; } bool FuelCheckProfileUpdate::UpdateFirmware() { bool bStatus = false; pMainApp.ObjSettings.DebugStation("sCurrentFuelGaugeFirmwareValue" + sCurrentFuelGaugeFirmwareValue); pMainApp.ObjSettings.DebugStation("sNewFuelGaugeFirmwareValue" + sNewFuelGaugeFirmwareValue); if ( sCurrentFuelGaugeFirmwareValue != sNewFuelGaugeFirmwareValue ) { do { pMainApp.ObjSettings.eScreenStatus = SCREEN_FWUPDATE; #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Golden image update process started"); #endif int nSourceFile; struct stat st; char *pFileBuffer; stat(SOURCE_FILE,&st); if((nSourceFile= open(SOURCE_FILE,O_RDONLY))< 0) { #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Can not open Golden image Source file"); #endif return bStatus; } pFileBuffer =(char *)malloc(st.st_size); if (!pFileBuffer) return bStatus; read(nSourceFile, pFileBuffer, st.st_size); ::close(nSourceFile); QString str =pMainApp.ObjSettings.ObjFuelCheck.gauge_execute_fs(pMainApp.ObjSettings.ObjFuelCheck.nI2CId, pFileBuffer); if(GetFwVersionToUpdate()) { pMainApp.ObjSettings.ObjFuelCheck.bIsFuelCheckOn=pMainApp.ObjSettings.ObjFuelCheck.gauge_init(); if ( pMainApp.ObjSettings.ObjFuelCheck.bIsFuelCheckOn) { int Percentage = -1; bool bisFuelConnected = true; for(UINT8 u8loop =0; u8loop < 3 ; u8loop++) { if(pMainApp.ObjSettings.ObjFuelCheck.gauge_cmd_read(pMainApp.ObjSettings.ObjFuelCheck.nI2CId, 0x2c) > 0) //SOC in [%] { Percentage = pMainApp.ObjSettings.ObjFuelCheck.u16Datareceived; } else { pMainApp.ObjSettings.bIsFuelCheckPassed=false; qDebug()<<"Fuel gauge not found"; #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Fuel gauge not found"); #endif return bStatus; } QThread::msleep(100); if((Percentage < 0) && (Percentage > 100)) { bisFuelConnected = false; qDebug()<<"Fuel gauge found but wrong percentarge detected : " + QString::number(Percentage); #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Fuel gauge found but wrong percentarge detected : " + QString::number(Percentage)); #endif } } if(bisFuelConnected == true) { qDebug()<<"Battery percentage" + QString::number(Percentage); #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Battery percentage" + QString::number(Percentage)); #endif pMainApp.ObjSettings.bIsFuelCheckPassed=true; pMainApp.ObjSettings.ObjFuelCheck.nResult = Percentage; } } else { pMainApp.ObjSettings.bIsFuelCheckPassed=false; } //2. Get Current version if(GetFirmwareVersion(u16OldFirmware) == true) { if(u16FwToUpdate == u16OldFirmware) { pMainApp.ObjSettings.bIsFuelGaugeFirmWareUpdateRequire = false; #ifdef QDEBUG_ENABLE pMainApp.ObjSettings.DebugStation("Profile updated successfully"); #endif pMainApp.ObjHwControl.ObjSounder.SetAlarmLevel(AlarmLevel1); QString sMessage = "<html><head/><body><p align=\"center\"><span style=\" font-size:12pt; font-weight:400;\">"+sFuelGaugeProfile() +"</span>" "<span style=\" font-size:12pt;\"><br/></span>" "<span style=\" font-size:12pt; font-weight:400;\">From </span><span style=\" font-size:12pt;\">"+sOldFuelGaugeFirmwareValue +"</span>" "<span style=\" font-size:12pt; font-weight:400;\"> To </span><span style=\" font-size:12pt;\">"+sNewFuelGaugeFirmwareValue +" "+sSuccessfully() +".</span></p>" "<p align=\"center\"><span style=\" font-size:12pt; font-weight:600;\">" "</span></p></body></html>"; MSG_BOX1(this, sMessage, sOk()); // pMainApp.ObjSettings.bIsLaserModuleFirmwareUpdate = true; // pMainApp.ObjSettings.UpdateConfig(SETTING_ISLASERMODULEFIRMWAREUPDATE, QString::number(pMainApp.ObjSettings.bIsLaserModuleFirmwareUpdate)); pMainApp.ObjHwControl.ObjSounder.SetAlarmLevel(SounderOFF); } else { pMainApp.ObjHwControl.ObjSounder.SetAlarmLevel(AlarmLevel1); MSG_BOX1(this, sFuelGaugeProfileUpdateFail(), sOk()); pMainApp.ObjHwControl.ObjSounder.SetAlarmLevel(SounderOFF); this->deleteLater(); } } } if(str == '\0' || str == "") { qDebug()<<"Profile updated successfully" <<str; } else { qDebug()<<"Profile updation failed"<<str; } free(pFileBuffer); bStatus = true; } while(false); return bStatus; } return false; }
@Qt-embedded-developer said in why my inline ui function call create segmentation fault when i call it from other class ?:
msgBox->exec();
It should wait here for user to close dialog. So, what exactly is not working?
-
@Qt-embedded-developer said in why my inline ui function call create segmentation fault when i call it from other class ?:
msgBox->exec();
It should wait here for user to close dialog. So, what exactly is not working?
wrote on 27 May 2021, 07:05 last edited by Qt embedded developerIn my above mentioned class's slot FwUpdateFail() used
below statement so parent delete messagebox function before click on okay.if(u8BlinkCounter==0)
{ timer->stop();
this->deleteLater(); // THIS LINE CAUSE PROBLEM
}So i have commented it and i have added "this->deleteLater()" statement in UpdateFirmware slot before return statment.
Thank you jsulm for solve problem correctly.
-
In my above mentioned class's slot FwUpdateFail() used
below statement so parent delete messagebox function before click on okay.if(u8BlinkCounter==0)
{ timer->stop();
this->deleteLater(); // THIS LINE CAUSE PROBLEM
}So i have commented it and i have added "this->deleteLater()" statement in UpdateFirmware slot before return statment.
Thank you jsulm for solve problem correctly.
@Qt-embedded-developer said in why my inline ui function call create segmentation fault when i call it from other class ?:
i think solution is i need to delete 'this' in destructor
What? Destructor is called just before "this" is deleted! You should read about memory management in C++.
I don't really understand what you are doing, sorry. No idea why you have a timer and why you want to delete "this"? It just makes no sense...
1/13