Ver Fonte

Implementiert Upload-Status als Property.

Rind há 5 anos atrás
pai
commit
33af9924d4

+ 29 - 21
main.c

@@ -60,7 +60,9 @@ static int _ShowDevImgInfo(HIMGFILE hIf, HGFABLM hBlm, LPCCMD_LINE_ARGS pcla, GF
     	GfaTfuDumpImageInfo("Application", &aii.app);
 
 		if(	(aii.bl.nImgLength != 0xFFFFFFFF) &&
-			(aii.bl.nImgCRC32 != 0xFFFFFFFF))
+			(aii.bl.nImgCRC32 != 0xFFFFFFFF) &&
+			(*aii.bl.szImgMaterialNum != 0xFF) &&
+			(*aii.bl.szImgNameBuild != 0xFF))
 		{
 			TTRACE(PLUGIN_TAG_IMG_LENGTH_BOOT, "%u", aii.bl.nImgLength);
 			TTRACE(PLUGIN_TAG_IMG_CRC32_BOOT, "%u", aii.bl.nImgCRC32);
@@ -69,14 +71,16 @@ static int _ShowDevImgInfo(HIMGFILE hIf, HGFABLM hBlm, LPCCMD_LINE_ARGS pcla, GF
 		}
 		else
 		{
-			TTRACE(PLUGIN_TAG_IMG_LENGTH_BOOT, "%u", 0xFFFFFFFF);
-			TTRACE(PLUGIN_TAG_IMG_CRC32_BOOT, "%u", 0xFFFFFFFF);
+			TTRACE(PLUGIN_TAG_IMG_LENGTH_BOOT, "%u", 0);
+			TTRACE(PLUGIN_TAG_IMG_CRC32_BOOT, "%u", 0);
 			TTRACE(PLUGIN_TAG_IMG_MATERIAL_BOOT, "%s", "n/a");
 			TTRACE(PLUGIN_TAG_IMG_BUILD_BOOT, "%s", "n/a");
 		}
 
 		if(	(aii.app.nImgLength != 0xFFFFFFFF) &&
-			(aii.app.nImgCRC32 != 0xFFFFFFFF))
+			(aii.app.nImgCRC32 != 0xFFFFFFFF) &&
+			(*aii.app.szImgMaterialNum != 0xFF) &&
+			(*aii.app.szImgNameBuild != 0xFF))
 		{
 			TTRACE(PLUGIN_TAG_IMG_LENGTH_APP, "%u", aii.app.nImgLength);
 			TTRACE(PLUGIN_TAG_IMG_CRC32_APP, "%u", aii.app.nImgCRC32);
@@ -85,8 +89,8 @@ static int _ShowDevImgInfo(HIMGFILE hIf, HGFABLM hBlm, LPCCMD_LINE_ARGS pcla, GF
 		}
 		else
 		{
-			TTRACE(PLUGIN_TAG_IMG_LENGTH_APP, "%u", 0xFFFFFFFF);
-			TTRACE(PLUGIN_TAG_IMG_CRC32_APP, "%u", 0xFFFFFFFF);
+			TTRACE(PLUGIN_TAG_IMG_LENGTH_APP, "%u", 0);
+			TTRACE(PLUGIN_TAG_IMG_CRC32_APP, "%u", 0);
 			TTRACE(PLUGIN_TAG_IMG_MATERIAL_APP, "%s", "n/a");
 			TTRACE(PLUGIN_TAG_IMG_BUILD_APP, "%s", "n/a");
 		}
@@ -131,7 +135,9 @@ static int _ShowDevImgInfo(HIMGFILE hIf, HGFABLM hBlm, LPCCMD_LINE_ARGS pcla, GF
 	    	GfaTfuDumpImageInfo("Application", &aii.app);
 
 			if(	(aii.bl.nImgLength != 0xFFFFFFFF) &&
-				(aii.bl.nImgCRC32 != 0xFFFFFFFF))
+				(aii.bl.nImgCRC32 != 0xFFFFFFFF) &&
+				(*aii.bl.szImgMaterialNum != 0xFF) &&
+				(*aii.bl.szImgNameBuild != 0xFF))
 			{
 				TTRACE(PLUGIN_TAG_IMG_LENGTH_BOOT, "%u", aii.bl.nImgLength);
 				TTRACE(PLUGIN_TAG_IMG_CRC32_BOOT, "%u", aii.bl.nImgCRC32);
@@ -140,14 +146,16 @@ static int _ShowDevImgInfo(HIMGFILE hIf, HGFABLM hBlm, LPCCMD_LINE_ARGS pcla, GF
 			}
 			else
 			{
-				TTRACE(PLUGIN_TAG_IMG_LENGTH_BOOT, "%u", 0xFFFFFFFF);
-				TTRACE(PLUGIN_TAG_IMG_CRC32_BOOT, "%u", 0xFFFFFFFF);
+				TTRACE(PLUGIN_TAG_IMG_LENGTH_BOOT, "%u", 0);
+				TTRACE(PLUGIN_TAG_IMG_CRC32_BOOT, "%u", 0);
 				TTRACE(PLUGIN_TAG_IMG_MATERIAL_BOOT, "%s", "n/a");
 				TTRACE(PLUGIN_TAG_IMG_BUILD_BOOT, "%s", "n/a");
 			}
 
 			if(	(aii.app.nImgLength != 0xFFFFFFFF) &&
-				(aii.app.nImgCRC32 != 0xFFFFFFFF))
+				(aii.app.nImgCRC32 != 0xFFFFFFFF) &&
+				(*aii.app.szImgMaterialNum != 0xFF) &&
+				(*aii.app.szImgNameBuild != 0xFF))
 			{
 				TTRACE(PLUGIN_TAG_IMG_LENGTH_APP, "%u", aii.app.nImgLength);
 				TTRACE(PLUGIN_TAG_IMG_CRC32_APP, "%u", aii.app.nImgCRC32);
@@ -156,8 +164,8 @@ static int _ShowDevImgInfo(HIMGFILE hIf, HGFABLM hBlm, LPCCMD_LINE_ARGS pcla, GF
 			}
 			else
 			{
-				TTRACE(PLUGIN_TAG_IMG_LENGTH_APP, "%u", 0xFFFFFFFF);
-				TTRACE(PLUGIN_TAG_IMG_CRC32_APP, "%u", 0xFFFFFFFF);
+				TTRACE(PLUGIN_TAG_IMG_LENGTH_APP, "%u", 0);
+				TTRACE(PLUGIN_TAG_IMG_CRC32_APP, "%u", 0);
 				TTRACE(PLUGIN_TAG_IMG_MATERIAL_APP, "%s", "n/a");
 				TTRACE(PLUGIN_TAG_IMG_BUILD_APP, "%s", "n/a");
 			}
@@ -219,9 +227,9 @@ static int _ValidateImg(HIMGFILE hIf, HGFABLM hBlm, LPCCMD_LINE_ARGS pcla, GFA_B
 	}
 
 	if(szMaterial[0] == '\xFF')
-		strcpy(szMaterial, "not set");
+		strcpy(szMaterial, "n/a");
 	if(szSerial[0] == '\xFF')
-		strcpy(szSerial, "not set");
+		strcpy(szSerial, "n/a");
 
 	TTRACE(PLUGIN_TAG_IMG_MATERIAL_EEPROM, szMaterial);
 	TTRACE(PLUGIN_TAG_IMG_SERIAL_EEPROM, szSerial);
@@ -265,13 +273,13 @@ static int _ShowMatSer(HIMGFILE hIf, HGFABLM hBlm, LPCCMD_LINE_ARGS pcla, GFA_BL
 	}
 
 	if(szMaterial[0] == '\xFF')
-		strcpy(szMaterial, "not set");
+		strcpy(szMaterial, "n/a");
 	if(szSerial[0] == '\xFF')
-		strcpy(szSerial, "not set");
+		strcpy(szSerial, "n/a");
 
 	TRACE2("Material and Serial number:\n");
-	TRACE2("  Mat.Nr.: \"%s\"\n", szMaterial);
-	TRACE2("  Serial:  \"%s\"\n", szSerial);
+	TRACE2("  Material: \"%s\"\n", szMaterial);
+	TRACE2("  Serial:   \"%s\"\n", szSerial);
 	TTRACE(PLUGIN_TAG_IMG_MATERIAL_EEPROM, szMaterial);
 	TTRACE(PLUGIN_TAG_IMG_SERIAL_EEPROM, szSerial);
 	return nRet;
@@ -369,7 +377,7 @@ static int _Ping(HIMGFILE hIf, HGFABLM hBlm, LPCCMD_LINE_ARGS pcla, GFA_BLM_EXEC
 		t = time(NULL);
 		strftime(szTime, sizeof(szTime), "%T", localtime(&t));
 		GfaTfuGetClock(&tsStart);
-		
+
 		if(ctx == GfaBlmCtx_ModB)
 		{
 			if((nRet = GfaMbMstPing(hMbm, pcla->nModbusSlvID)) == 0)
@@ -768,7 +776,7 @@ static bool _AutoBaud(HGFABLM hBlm, LPCMD_LINE_ARGS pcla)
 			for(j = 0; j < _countof(nBaudrates); ++j)
 			{
 				scp.baud = nBaudrates[j];
-				
+
 				TRACE4("MiniNet - Try to connect @ %u,8,1,%c\n", scp.baud, scp.parity);
 
 				if(GfaMininetDeviceSetConfigParams(hDev, &scp, sizeof(scp)) != 0)
@@ -1191,7 +1199,7 @@ int main(int argc, char* argv[])
 			        TRACE3("Currently running: %s.\n", (ctx == GfaBlmCtx_App) ? "Application" : "Bootloader");
 			        TTRACE3("Currently running: %s", (ctx == GfaBlmCtx_App) ? "Application" : "Bootloader");
 			    }
-			    
+
 			    // handle the commands
 
 				if(cla.bUploadImg)

+ 10 - 9
qmlplugin/Demo/main.qml

@@ -93,13 +93,14 @@ Window {
         width: 40
         height: 40
         color: "darkblue"
+        visible: idTivaFlash.imgUploadStatus.uploadInProgress
 
 	    Text {
 	        id: idUploadPercent
             anchors.centerIn: parent
 	        color: "white"
 	        font.pixelSize: 14
-	        text: ""
+            text: idTivaFlash.imgUploadStatus.percentSent
 	    }
 	}
 
@@ -362,7 +363,7 @@ Window {
             onClicked:
             {
                 idExecOut.text = "";
-        		idUploadPercent.text = "";
+//        		idUploadPercent.text = "";
 	            idTivaFlash.clearImgInfo(statNr);
 			}
         }
@@ -386,12 +387,12 @@ Window {
         slvIdIsNodeAddr: false
         imgFile: "/opt/GfA/tivaflashutil/OLS-1V1_0009_crc.bin"
         verbosity: 2
-        
+
         onProcessStarted:	// arguments: slv (number, Slave ID)
         {
             console.info("Process started");
         }
-        
+
         onProcessFinished:	// arguments: slv (number, Slave ID), exitcode (number Exit code), normalExit (bool, Normal exit or crash)
         {
             console.info("Process finished - exitcode: " + (normalExit ? exitcode : "crashed!"));
@@ -407,21 +408,21 @@ Window {
         	switch(stat.ctx)
         	{
         	case ImgUploadStatus.EraseFlashStart:
-        		idUploadPercent.text = "";
+//        		idUploadPercent.text = "";
         		break;
             case ImgUploadStatus.EraseFlashEnd:
                 break;
             case ImgUploadStatus.ImgUploadStart:
-        		idUploadPercent.text = "0";
+//        		idUploadPercent.text = "0";
                 break;
             case ImgUploadStatus.ImgUploadBlock:
-                idUploadPercent.text = stat.percentSent;
+//                idUploadPercent.text = stat.percentSent;
                 break;
             case ImgUploadStatus.ImgUploadSuccess:
-        		idUploadPercent.text = "Ok";
+//        		idUploadPercent.text = "Ok";
                 break;
             case ImgUploadStatus.ImgUploadError:
-        		idUploadPercent.text = "Err";
+//        		idUploadPercent.text = "Err";
                 break;
             }
         }

+ 68 - 17
qmlplugin/libgfativaflashplugin/gfativaflash.cpp

@@ -46,7 +46,7 @@ TivaFlash::TivaFlash(QObject *pParent) :	QObject(pParent),
 											m_qProcess(this)
 {
 	setObjectName("TivaFlash");
-	
+
 	for(int i = 0; i < _MAX_SLAVE_COUNT; i++)
 	{
 		m_materialEeprom.append("");
@@ -62,12 +62,12 @@ TivaFlash::TivaFlash(QObject *pParent) :	QObject(pParent),
 		m_imgMaterialApp.append("");
 		m_imgBuildApp.append("");
 	}
-	
+
 	connect(&m_qProcess, SIGNAL(started()), SLOT(onProcessStarted()));
 	connect(&m_qProcess, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(onProcessFinished(int, QProcess::ExitStatus)));
 	connect(&m_qProcess, SIGNAL(readyReadStandardOutput()), SLOT(onProcessReadyReadStandardOutput()));
 	connect(&m_qProcess, SIGNAL(stateChanged(QProcess::ProcessState)), SLOT(onProcessStateChanged(QProcess::ProcessState)));
-	
+
 	m_qProcess.setProcessChannelMode(QProcess::MergedChannels);
 }
 
@@ -112,7 +112,7 @@ bool TivaFlash::execFlashUtil(int nSlvID, const char *pszOpt)
 	char buffer[256];
 	m_nExitCode = -1;
 	std::string strCmd = _formatString("\"%s\" %s --plugin-mode 2>&1", m_tivaFlashUtilPath.c_str(), pszOpt);
-		
+
 	if((pd = popen(strCmd.c_str(), "r")))
 	{
 		while(fgets(buffer, sizeof buffer, pd))
@@ -156,7 +156,7 @@ void TivaFlash::getSlavIDs(int nSlvID, int nMbID, QStringList &rargs) const
 	if(_IS_VALID_MB_ID(nMbID))
 	{
 		rargs << QString::asprintf("--mb-slave-id=%d", nMbID);
-		
+
 		if(m_mbCtrlRegister > 0)
 			rargs << QString::asprintf("--mb-bl-ctrl-reg=%d", m_mbCtrlRegister);
 	}
@@ -227,7 +227,7 @@ int TivaFlash::parseTaggedString(const char *pszIn, std::string &sOut) const
 			if(regex_search(pszIn, res, reg))
 			{
 				size_t nSize = res.size();
-				
+
 				if(nSize == 3)
 				{
 					std::string strTagName = res[1].str();
@@ -240,7 +240,7 @@ int TivaFlash::parseTaggedString(const char *pszIn, std::string &sOut) const
 		{
 		}
 	}
-	
+
 	return -1;
 }
 
@@ -259,7 +259,7 @@ int TivaFlash::parseTaggedValues(const char *pszIn, int &rnVal1, int &rnVal2) co
 			if(regex_search(pszIn, res, reg))
 			{
 				size_t nSize = res.size();
-				
+
 				if(nSize == 3)
 				{
 					rnVal1 = atoi(res[1].str().c_str());
@@ -272,7 +272,7 @@ int TivaFlash::parseTaggedValues(const char *pszIn, int &rnVal1, int &rnVal2) co
 		{
 		}
 	}
-	
+
 	return -1;
 }
 
@@ -283,7 +283,7 @@ void TivaFlash::onCmdOutput(int nSlvID, const char *pszOut)
 	std::string s;
 	int nTag = parseTaggedString(pszOut, s);
 	int nVal1, nVal2;
-	
+
 	if(nTag >= 0)
 	{
 		QString qs = QString::fromStdString(s);
@@ -372,6 +372,7 @@ void TivaFlash::onCmdOutput(int nSlvID, const char *pszOut)
 			m_imgUpldProg.setCtx(ImgUploadStatus::EraseFlashStart);
 			if(parseTaggedValues(s.c_str(), nVal1, nVal2) == 2)
 			{
+				m_imgUpldProg.setUploadInProgress(true);
 				m_imgUpldProg.setCntFlashPages(nVal1);
 				m_imgUpldProg.setCbTotal(nVal2);
 				emit imgUploadProgress(&m_imgUpldProg);
@@ -393,7 +394,8 @@ void TivaFlash::onCmdOutput(int nSlvID, const char *pszOut)
 				int nCbTotal = m_imgUpldProg.cbTotal();
 				int nCbSent = nVal1;
 				m_imgUpldProg.setCbSent(nCbSent);
-				m_imgUpldProg.setPercentSent(nCbSent * 100 / nCbTotal);
+				if(nCbTotal)
+					m_imgUpldProg.setPercentSent(nCbSent * 100 / nCbTotal);
 				m_imgUpldProg.SetBlockNr(nVal2);
 				emit imgUploadProgress(&m_imgUpldProg);
 			}
@@ -401,11 +403,13 @@ void TivaFlash::onCmdOutput(int nSlvID, const char *pszOut)
 		case PLUGIN_TAG_UPLOAD_BLOCKS_END:
 			m_imgUpldProg.setCtx(ImgUploadStatus::ImgUploadSuccess);
 			m_imgUpldProg.setErrorCode(0);
+			m_imgUpldProg.setUploadInProgress(false);
 			emit imgUploadProgress(&m_imgUpldProg);
 			break;
 		case PLUGIN_TAG_UPLOAD_ERROR:
 			m_imgUpldProg.setCtx(ImgUploadStatus::ImgUploadError);
 			m_imgUpldProg.setErrorCode(qs.toInt());
+			m_imgUpldProg.setUploadInProgress(false);
 			emit imgUploadProgress(&m_imgUpldProg);
 			break;
 		}
@@ -423,7 +427,7 @@ bool TivaFlash::getMatSer(int nSlvID, int nMbID)
 	if(!_IS_VALID_SLV_ID(nSlvID))
 		return false;
 	m_curSlvID = nSlvID;
-	
+
 	setMaterialEeprom(nSlvID, "");
 	setSerialEeprom(nSlvID, "");
 
@@ -548,6 +552,7 @@ bool TivaFlash::uploadImgFile(int nSlvID, int nMbID)
 	if(!_IS_VALID_SLV_ID(nSlvID))
 		return false;
 	m_curSlvID = nSlvID;
+	m_imgUpldProg.clear();
 
 	QStringList args;
 	args << "--upload-img";
@@ -570,12 +575,12 @@ bool TivaFlash::clearImgInfo(int nSlvID)
 		return false;
 	if(!_IS_VALID_SLV_ID(nSlvID))
 		return false;
-		
+
 	setImgSizeFile(0);
 	setImgCRC32File(0);
 	setImgMaterialFile(0);
 	setImgBuildFile(0);
-	
+
 	if(nSlvID > 0)
 	{
 		setMaterialEeprom(nSlvID, "");
@@ -609,7 +614,7 @@ bool TivaFlash::clearImgInfo(int nSlvID)
 			setImgBuildApp(i, "");
 		}
 	}
-	
+
 	return true;
 }
 
@@ -667,7 +672,7 @@ void TivaFlash::setVerbosity(int val)
 		val = 0;
 	else if(val > 3)
 		val = 3;
-		
+
 	if(m_verbosity != val)
 	{
 		m_verbosity = val;
@@ -792,6 +797,11 @@ void TivaFlash::setForceAllParities(bool val)
 	}
 }
 
+ImgUploadStatus* TivaFlash::imgUploadStatus(void)
+{
+	return &m_imgUpldProg;
+}
+
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
@@ -1050,6 +1060,7 @@ void ImgUploadStatus::clear(void)
 	m_nCbSent = 0;
 	m_nPercentSent = 0;
 	m_nCntFlashPages = 0;
+	m_bUploadInProgress = false;
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -1062,7 +1073,10 @@ int ImgUploadStatus::ctx(void) const
 void ImgUploadStatus::setCtx(int val)
 {
 	if(m_nCtx != val)
+	{
 		m_nCtx = val;
+		emit ctxChanged(m_nCtx);
+	}
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -1075,7 +1089,10 @@ int ImgUploadStatus::errorCode(void) const
 void ImgUploadStatus::setErrorCode(int val)
 {
 	if(m_nErrorCode != val)
+	{
 		m_nErrorCode = val;
+		emit errorCodeChanged(m_nErrorCode);
+	}
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -1088,7 +1105,10 @@ int ImgUploadStatus::cbBlock(void) const
 void ImgUploadStatus::setCbBlock(int val)
 {
 	if(m_nCbBlock != val)
+	{
 		m_nCbBlock = val;
+		emit cbBlockChanged(m_nCbBlock);
+	}
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -1101,7 +1121,10 @@ int ImgUploadStatus::blockNr(void) const
 void ImgUploadStatus::SetBlockNr(int val)
 {
 	if(m_nBlockNr != val)
+	{
 		m_nBlockNr = val;
+		emit blockNrChanged(m_nBlockNr);
+	}
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -1114,7 +1137,10 @@ int ImgUploadStatus::cbTotal(void) const
 void ImgUploadStatus::setCbTotal(int val)
 {
 	if(m_nCbTotal != val)
+	{
 		m_nCbTotal = val;
+		emit cbTotalChanged(m_nCbTotal);
+	}
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -1127,11 +1153,14 @@ int ImgUploadStatus::cbSent(void) const
 void ImgUploadStatus::setCbSent(int val)
 {
 	if(m_nCbSent != val)
+	{
 		m_nCbSent = val;
+		emit cbSentChanged(m_nCbSent);
+	}
 }
 
 /////////////////////////////////////////////////////////////////////////////
-	
+
 int ImgUploadStatus::percentSent(void) const
 {
 	return m_nPercentSent;
@@ -1140,7 +1169,10 @@ int ImgUploadStatus::percentSent(void) const
 void ImgUploadStatus::setPercentSent(int val)
 {
 	if(m_nPercentSent != val)
+	{
 		m_nPercentSent = val;
+		emit percentSentChanged(m_nPercentSent);
+	}
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -1153,5 +1185,24 @@ int ImgUploadStatus::cntFlashPages(void) const
 void ImgUploadStatus::setCntFlashPages(int val)
 {
 	if(m_nCntFlashPages != val)
+	{
 		m_nCntFlashPages = val;
+		emit cntFlashPagesChanged(m_nCntFlashPages);
+	}
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+bool ImgUploadStatus::uploadInProgress(void) const
+{
+	return m_bUploadInProgress;
+}
+
+void ImgUploadStatus::setUploadInProgress(bool val)
+{
+	if(m_bUploadInProgress != val)
+	{
+		m_bUploadInProgress = val;
+		emit uploadInProgressChanged(m_bUploadInProgress);
+	}
 }

+ 43 - 20
qmlplugin/libgfativaflashplugin/gfativaflash.h

@@ -29,14 +29,15 @@
 class ImgUploadStatus : public QObject
 {
     Q_OBJECT
-	Q_PROPERTY(int ctx READ ctx)
-	Q_PROPERTY(int errorCode READ errorCode)
-	Q_PROPERTY(int cntFlashPages READ cntFlashPages)
-	Q_PROPERTY(int cbBlock READ cbBlock)
-	Q_PROPERTY(int blockNr READ blockNr)
-	Q_PROPERTY(int cbTotal READ cbTotal)
-	Q_PROPERTY(int cbSent READ cbSent)
-	Q_PROPERTY(int percentSent READ percentSent)
+	Q_PROPERTY(int ctx READ ctx NOTIFY ctxChanged)
+	Q_PROPERTY(int errorCode READ errorCode NOTIFY errorCodeChanged)
+	Q_PROPERTY(int cntFlashPages READ cntFlashPages NOTIFY cntFlashPagesChanged)
+	Q_PROPERTY(int cbBlock READ cbBlock NOTIFY cbBlockChanged)
+	Q_PROPERTY(int blockNr READ blockNr NOTIFY blockNrChanged)
+	Q_PROPERTY(int cbTotal READ cbTotal NOTIFY cbTotalChanged)
+	Q_PROPERTY(int cbSent READ cbSent NOTIFY cbSentChanged)
+	Q_PROPERTY(int percentSent READ percentSent NOTIFY percentSentChanged)
+	Q_PROPERTY(bool uploadInProgress READ uploadInProgress NOTIFY uploadInProgressChanged)
 
 public:
 	enum StatusCtx
@@ -48,39 +49,54 @@ public:
 		ImgUploadSuccess,
 		ImgUploadError
 	};
-	
+
 	Q_ENUMS(StatusCtx);
+
 public:
     explicit ImgUploadStatus(QObject *pParent = NULL);
     virtual ~ImgUploadStatus(void);
-    
+
     void clear(void);
 
+signals:
+	void ctxChanged(int val);
+	void errorCodeChanged(int val);
+	void cntFlashPagesChanged(int val);
+	void cbBlockChanged(int val);
+	void blockNrChanged(int val);
+	void cbTotalChanged(int val);
+	void cbSentChanged(int val);
+	void percentSentChanged(int val);
+	void uploadInProgressChanged(bool val);
+
 public:
 	int ctx(void) const;
 	void setCtx(int val);
-	
+
 	int errorCode(void) const;
 	void setErrorCode(int val);
-	
+
 	int cbBlock(void) const;
 	void setCbBlock(int val);
-	
+
 	int blockNr(void) const;
 	void SetBlockNr(int val);
-	
+
 	int cbTotal(void) const;
 	void setCbTotal(int val);
-	
+
 	int cbSent(void) const;
 	void setCbSent(int val);
-	
+
 	int percentSent(void) const;
 	void setPercentSent(int val);
-	
+
 	int cntFlashPages(void) const;
 	void setCntFlashPages(int val);
 
+	bool uploadInProgress(void) const;
+	void setUploadInProgress(bool val);
+
 private:
 	int m_nCtx;
 	int m_nErrorCode;
@@ -90,6 +106,7 @@ private:
 	int m_nCbSent;
 	int m_nPercentSent;
 	int m_nCntFlashPages;
+	bool m_bUploadInProgress;
 };
 
 /////////////////////////////////////////////////////////////////////////////
@@ -110,6 +127,10 @@ class TivaFlash : public QObject
 	Q_PROPERTY(int mbCtrlRegister READ mbCtrlRegister WRITE setMbCtrlRegister)
     Q_PROPERTY(bool forceAllParities READ forceAllParities WRITE setForceAllParities)
 
+    Q_PROPERTY(ImgUploadStatus* imgUploadStatus READ imgUploadStatus CONSTANT)
+    
+
+
     Q_PROPERTY(QStringList materialEeprom READ materialEeprom NOTIFY materialEepromChanged)
     Q_PROPERTY(QStringList serialEeprom READ serialEeprom NOTIFY serialEepromChanged)
 
@@ -160,7 +181,7 @@ signals:
 	void imgBuildFileChanged(const QString &val) const;
 	void imgSizeFileChanged(int val) const;
 	void imgCRC32FileChanged(double val) const;
-	
+
 	void executingChanged(bool val) const;
 	void processStarted(int slv) const;
 	void processFinished(int slv, int exitcode, bool normalExit) const;
@@ -192,6 +213,8 @@ private:
 	void setMbCtrlRegister(int val);
 	bool forceAllParities(void) const;
 	void setForceAllParities(bool val);
+	
+	ImgUploadStatus* imgUploadStatus(void);
 
 	const QStringList& materialEeprom(void) const;
 	void setMaterialEeprom(int nSlvID, const QString &val);
@@ -224,7 +247,7 @@ private:
 	void setImgMaterialFile(const QString &val);
 	const QString& imgBuildFile(void) const;
 	void setImgBuildFile(const QString &val);
-	
+
 private:
 	void onCmdOutput(int nSlvID, const char *pszOut);
 	void getSlavIDs(int nSlvID, int nMbID, QStringList &rargs) const;
@@ -275,7 +298,7 @@ private:
 	double m_imgCRC32File;
 	QString m_imgMaterialFile;
 	QString m_imgBuildFile;
-	
+
 	ImgUploadStatus m_imgUpldProg;
 	QProcess m_qProcess;
 };