QT_USE_NAMESPACE

SerialPortManager::SerialPortManager(QObject *parent)
    : QObject(parent)
{
    m_serialPort = new QSerialPort(this);

    m_settings.portName = "";
    m_settings.baud = DEFAULT_BAUD;
    m_settings.dataBits = DEFAULT_DATABITS;
    m_settings.flowControl = DEFAULT_FLOWCONTROL;
    m_settings.parity = DEFAULT_PARITY;
    m_settings.stopBits = DEFAULT_STOPBITS;


    // forward emit serial port errors
//    qRegisterMetaType<QSerialPort::SerialPortError>("QSerialPort::SerialPortError");
    connect(m_serialPort, SIGNAL(error(QSerialPort::SerialPortError)), this, SIGNAL(serialPortError(QSerialPort::SerialPortError)));

    // deal with readyRead()
    connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPortManager::handleReadyRead);

    m_serialPort->clear();
    emit portSettingsChanged(m_settings);
}
void SerialPortManager::changePortSettings(PortSettings newSettings)
{
    if( m_settings.portName != newSettings.portName ||
        m_settings.baud != newSettings.baud ||
        m_settings.dataBits != newSettings.dataBits ||
        m_settings.flowControl != newSettings.flowControl ||
        m_settings.parity != newSettings.parity ||
        m_settings.stopBits != newSettings.stopBits ){
        m_settings = newSettings;
        emit portSettingsChanged(m_settings);
        if(m_settings.portName != ""){
            reconnect();
        }
    }
}
// this function passed the jpeg image buffer in, and returns the decoded
// image
int
decodeImage(OPENMAX_JPEG_DECODER * decoder, char *sourceImage,
	    size_t imageSize)
{
    char           *sourceOffset = sourceImage;	// we store a seperate
						// buffer ot image so we
						// can offset it
    size_t          toread = 0;	// bytes left to read from buffer
    toread += imageSize;
    int             bFilled = 0;	// have we filled our output
					// buffer
    bufferIndex = 0;

    while (toread > 0) {
	// get next buffer from array
	OMX_BUFFERHEADERTYPE *pBufHeader =
	    decoder->ppInputBufferHeader[bufferIndex];

	// step index and reset to 0 if required
	bufferIndex++;
	if (bufferIndex >= decoder->inputBufferHeaderCount)
	    bufferIndex = 0;

	// work out the next chunk to load into the decoder
	if (toread > pBufHeader->nAllocLen)
	    pBufHeader->nFilledLen = pBufHeader->nAllocLen;
	else
	    pBufHeader->nFilledLen = toread;

	toread = toread - pBufHeader->nFilledLen;

	// pass the bytes to the buffer
	memcpy(pBufHeader->pBuffer, sourceOffset, pBufHeader->nFilledLen);
	printf("Read into buffer %d\n", pBufHeader->nFilledLen);

	// update the buffer pointer and set the input flags

	sourceOffset = sourceOffset + pBufHeader->nFilledLen;
	pBufHeader->nOffset = 0;
	pBufHeader->nFlags = 0;
	if (toread <= 0) {
	    pBufHeader->nFlags = OMX_BUFFERFLAG_EOS;
	    printf("Added EOS to last inout buffer\n");
	}
	// empty the current buffer
	printf("Emptying buffer\n");
	int             ret =
	    OMX_EmptyThisBuffer(decoder->imageDecoder->handle,
				pBufHeader);

	if (ret != OMX_ErrorNone) {
	    perror("Empty input buffer");
	    fprintf(stderr, "return code %x\n", ret);
	    return OMXJPEG_ERROR_MEMORY;
	}
	// wait for buffer to empty or port changed event
	int             done = 0;
	while ((done == 0) || (decoder->pOutputBufferHeader == NULL)) {
	    if (decoder->pOutputBufferHeader == NULL) {
		ret =
		    ilclient_wait_for_event
		    (decoder->imageDecoder->component,
		     OMX_EventPortSettingsChanged,
		     decoder->imageDecoder->outPort, 0, 0, 1, 0, 5);

		if (ret == 0) {
		    portSettingsChanged(decoder);
		}
	    } else {
		ret =
		    ilclient_remove_event(decoder->imageDecoder->component,
					  OMX_EventPortSettingsChanged,
					  decoder->imageDecoder->outPort,
					  0, 0, 1);
		if (ret == 0)
		    portSettingsChangedAgain(decoder);

	    }

	    // check to see if buffer is now empty
	    if (pBufHeader->nFilledLen == 0)
		done = 1;

	    if ((done == 0)
		|| (decoder->pOutputBufferHeader == NULL)) {
		printf("Buffer is now size %d\n", pBufHeader->nFilledLen);
		sleep(1);
	    }
	}

	// fill the buffer if we have created the buffer
	if (bFilled == 0) {
	    if ((decoder->pOutputBufferHeader == NULL)) {
		portSettingsChanged(decoder);
	    }
	    OMX_PARAM_U32TYPE param;
	    param.nSize = sizeof(OMX_PARAM_U32TYPE);
	    param.nVersion.nVersion = OMX_VERSION;
	    param.nPortIndex = decoder->imageDecoder->outPort;
	   
	    OMX_GetParameter(decoder->imageDecoder->handle,
		     OMX_IndexParamActiveStream, &param);
	    printf("Active stream %d\n", param.nU32);

	    printf("Trying to fill output buffer\n");
	    printState(decoder->imageDecoder->handle);
	    ret = OMX_FillThisBuffer(decoder->imageDecoder->handle,
				     decoder->pOutputBufferHeader);
	    
	    if (ret != OMX_ErrorNone) {
		perror("Filling output buffer");
		fprintf(stderr, "Error code %x\n", ret);
		return OMXJPEG_ERROR_MEMORY;
	    }

	    bFilled = 1;
	}
    }

    // wait for buffer to fill
    /*
     * while(pBufHeader->nFilledLen == 0) { sleep(5); } 
     */

    // wait for end of stream events
    int             ret =
	ilclient_wait_for_event(decoder->imageDecoder->component,
				OMX_EventBufferFlag,
				decoder->imageDecoder->outPort, 1,
				OMX_BUFFERFLAG_EOS, 1,
				0, 2);
    if (ret != 0) {
	fprintf(stderr, "No EOS event on image decoder %d\n", ret);
    } else  {
	fprintf(stderr, "EOS event on image decoder %d\n", ret);
    }

    printf("Resized %d\n", decoder->pOutputBufferHeader->nFilledLen);
    FILE *fp = fopen("out", "w");
    int n;
    for (n = 0; n < decoder->pOutputBufferHeader->nFilledLen; n++) {
	//fputc(decoder->pOutputBufferHeader->pBuffer[n], fp);
	fputc(decoder->ppRenderInputBufferHeader[0]->pBuffer[n], fp);
    }
    fclose(fp);
    printf("File written\n");

    renderImage(decoder);

    return OMXJPEG_OK;
}
Exemple #4
0
static int decodeJpeg(JPEG_DECODER * decoder, FILE *sourceImage, IMAGE *jpeg){
	
	char pSettingsChanged = 0, end = 0, eos = 0, bFilled = 0;
	int bufferIndex = 0;
	int retVal = OMX_IMAGE_OK;
	struct timespec wait;
	
	OMX_BUFFERHEADERTYPE *pBufHeader = decoder->ppInputBufferHeader[bufferIndex];
	ilclient_set_empty_buffer_done_callback(decoder->client, emptyBufferDone, decoder);
	
	bufferIndex^=1;
	
	pBufHeader->nFilledLen = fread(pBufHeader->pBuffer, 1, pBufHeader->nAllocLen, sourceImage);
	
	pBufHeader->nOffset = 0;
	pBufHeader->nFlags = 0;
	
	if(feof(sourceImage)){
		pBufHeader->nFlags = OMX_BUFFERFLAG_EOS;
	}else if( pBufHeader->nFilledLen !=  pBufHeader->nAllocLen){
		retVal|=OMX_IMAGE_ERROR_READING;
		end=1;
	}
	
	pthread_mutex_init(&decoder->lock, NULL);
	pthread_cond_init(&decoder->cond, NULL);
	
	while(end == 0 && retVal == OMX_IMAGE_OK){
		decoder->emptyBDone=0;
		// We've got an eos event early this usually means that we are done decoding
		if(ilclient_remove_event(decoder->component, OMX_EventBufferFlag, decoder->outPort, 
				0, OMX_BUFFERFLAG_EOS, 0 )==0){
				eos=1;
				break;
		}		
		int ret = OMX_EmptyThisBuffer(decoder->handle, pBufHeader);
		if (ret != OMX_ErrorNone) {
			retVal|=OMX_IMAGE_ERROR_MEMORY;
			break;
		}
		
		if(!feof(sourceImage)){
			
			pBufHeader = decoder->ppInputBufferHeader[bufferIndex];
			
			bufferIndex^=1;
		
			pBufHeader->nFilledLen = fread(pBufHeader->pBuffer, 1, pBufHeader->nAllocLen, sourceImage);
			
			pBufHeader->nOffset = 0;
			pBufHeader->nFlags = 0;
		
			if(feof(sourceImage)){
				pBufHeader->nFlags = OMX_BUFFERFLAG_EOS;
			}else if( pBufHeader->nFilledLen !=  pBufHeader->nAllocLen){
				retVal|=OMX_IMAGE_ERROR_READING;
				break;
			}
			
		}else{
			end=1;
		}
		
		if(pSettingsChanged == 0 && ilclient_remove_event(decoder->component,
				OMX_EventPortSettingsChanged, decoder->outPort, 0, 0, 1 ) == 0){
					pSettingsChanged=1;
					retVal|=portSettingsChanged(decoder, jpeg);
		}
		
		if(!decoder->emptyBDone){
			clock_gettime(CLOCK_REALTIME, &wait);
			wait.tv_nsec += MAX_EMPTY_BUFFER_WAIT_MS*1000000L;
			wait.tv_sec += wait.tv_nsec/1000000000L;
			wait.tv_nsec %= 1000000000L;
			if(!decoder->emptyBDone){
				decoder->emptyBDone=2;
				pthread_mutex_lock(&decoder->lock);
				pthread_cond_timedwait(&decoder->cond, &decoder->lock, &wait);
				pthread_mutex_unlock(&decoder->lock);
			}
		}
		
		if(pSettingsChanged == 0 && ilclient_wait_for_event(decoder->component,
				OMX_EventPortSettingsChanged,decoder->outPort, 0, 0, 1, 
				ILCLIENT_EVENT_ERROR | ILCLIENT_PARAMETER_CHANGED, 10) == 0){	 
			
			pSettingsChanged=1;
			retVal|=portSettingsChanged(decoder, jpeg);
		}
			
			
		if (bFilled == 0 && pSettingsChanged==1 && retVal == OMX_IMAGE_OK) {
		
			ret = OMX_FillThisBuffer(decoder->handle, decoder->pOutputBufferHeader);
			if (ret != OMX_ErrorNone) {
				retVal|=OMX_IMAGE_ERROR_MEMORY;
				break;
			}
			bFilled = 1;
		}
	}
	ilclient_set_empty_buffer_done_callback(decoder->client, NULL, NULL);
	
	if( bFilled == 1 && !eos && ilclient_wait_for_event(decoder->component, OMX_EventBufferFlag, 
				decoder->outPort, 0, OMX_BUFFERFLAG_EOS, 0, ILCLIENT_BUFFER_FLAG_EOS, TIMEOUT_MS) != 0 ){
		retVal|=OMX_IMAGE_ERROR_NO_EOS;
	}
	
	pthread_mutex_destroy(&decoder->lock);
	pthread_cond_destroy(&decoder->cond);
		
	int i = 0;
	for (i = 0; i < DECODER_BUFFER_NUM; i++) {
		int ret = OMX_FreeBuffer(decoder->handle,decoder->inPort, decoder->ppInputBufferHeader[i]);
		if(ret!= OMX_ErrorNone){
			retVal|=OMX_IMAGE_ERROR_MEMORY;
		}
	}
	
	int ret=OMX_SendCommand(decoder->handle, OMX_CommandPortDisable, decoder->inPort, NULL);
	
	if(ret!= OMX_ErrorNone){
		retVal|=OMX_IMAGE_ERROR_PORTS;
	}
			
	ilclient_wait_for_event(decoder->component, OMX_EventCmdComplete, 
			OMX_CommandPortDisable, 0, decoder->inPort, 0, 
			ILCLIENT_PORT_DISABLED, TIMEOUT_MS);		
	
	if(bFilled==1){	
		OMX_SendCommand(decoder->handle, OMX_CommandFlush, decoder->outPort, NULL);
			
		ilclient_wait_for_event(decoder->component,OMX_EventCmdComplete, OMX_CommandFlush, 
			0, decoder->outPort, 0, ILCLIENT_PORT_FLUSH ,TIMEOUT_MS);	
				
		ret= OMX_FreeBuffer(decoder->handle, decoder->outPort, decoder->pOutputBufferHeader);
		
		if(ret!= OMX_ErrorNone){
			retVal|=OMX_IMAGE_ERROR_MEMORY;
		}
		
	}
	
	if(pSettingsChanged==1){
		ret= OMX_SendCommand(decoder->handle, OMX_CommandPortDisable, decoder->outPort, NULL);
		
		if(ret!= OMX_ErrorNone){
			retVal|=OMX_IMAGE_ERROR_PORTS;
		}
	}
	
	ilclient_change_component_state(decoder->component, OMX_StateIdle);
	ilclient_change_component_state(decoder->component, OMX_StateLoaded);
					
	return retVal;
}
void SoftMPEG4::onQueueFilled(OMX_U32 portIndex) {
    if (mSignalledError || mOutputPortSettingsChange != NONE) {
        return;
    }

    List<BufferInfo *> &inQueue = getPortQueue(0);
    List<BufferInfo *> &outQueue = getPortQueue(1);

    while (!inQueue.empty() && outQueue.size() == kNumOutputBuffers) {
        BufferInfo *inInfo = *inQueue.begin();
        OMX_BUFFERHEADERTYPE *inHeader = inInfo->mHeader;

        PortInfo *port = editPortInfo(1);

        OMX_BUFFERHEADERTYPE *outHeader =
            port->mBuffers.editItemAt(mNumSamplesOutput & 1).mHeader;

        if ((inHeader->nFlags & OMX_BUFFERFLAG_EOS) && inHeader->nFilledLen == 0) {
            inQueue.erase(inQueue.begin());
            inInfo->mOwnedByUs = false;
            notifyEmptyBufferDone(inHeader);

            ++mInputBufferCount;

            outHeader->nFilledLen = 0;
            outHeader->nFlags = OMX_BUFFERFLAG_EOS;

            List<BufferInfo *>::iterator it = outQueue.begin();
            while ((*it)->mHeader != outHeader) {
                ++it;
            }

            BufferInfo *outInfo = *it;
            outInfo->mOwnedByUs = false;
            outQueue.erase(it);
            outInfo = NULL;

            notifyFillBufferDone(outHeader);
            outHeader = NULL;
            return;
        }

        uint8_t *bitstream = inHeader->pBuffer + inHeader->nOffset;

        if (!mInitialized) {
            uint8_t *vol_data[1];
            int32_t vol_size = 0;

            vol_data[0] = NULL;

            if (inHeader->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
                vol_data[0] = bitstream;
                vol_size = inHeader->nFilledLen;
            }

            MP4DecodingMode mode =
                (mMode == MODE_MPEG4) ? MPEG4_MODE : H263_MODE;

            Bool success = PVInitVideoDecoder(
                    mHandle, vol_data, &vol_size, 1, mWidth, mHeight, mode);

            if (!success) {
                ALOGW("PVInitVideoDecoder failed. Unsupported content?");

                notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
                mSignalledError = true;
                return;
            }

            MP4DecodingMode actualMode = PVGetDecBitstreamMode(mHandle);
            if (mode != actualMode) {
                notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
                mSignalledError = true;
                return;
            }

            PVSetPostProcType((VideoDecControls *) mHandle, 0);

            if (inHeader->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
                inInfo->mOwnedByUs = false;
                inQueue.erase(inQueue.begin());
                inInfo = NULL;
                notifyEmptyBufferDone(inHeader);
                inHeader = NULL;
            }

            mInitialized = true;

            if (mode == MPEG4_MODE && portSettingsChanged()) {
                return;
            }

            continue;
        }

        if (!mFramesConfigured) {
            PortInfo *port = editPortInfo(1);
            OMX_BUFFERHEADERTYPE *outHeader = port->mBuffers.editItemAt(1).mHeader;

            PVSetReferenceYUV(mHandle, outHeader->pBuffer);

            mFramesConfigured = true;
        }

        uint32_t useExtTimestamp = (inHeader->nOffset == 0);

        // decoder deals in ms (int32_t), OMX in us (int64_t)
        // so use fake timestamp instead
        uint32_t timestamp = 0xFFFFFFFF;
        if (useExtTimestamp) {
            mPvToOmxTimeMap.add(mPvTime, inHeader->nTimeStamp);
            timestamp = mPvTime;
            mPvTime++;
        }

        int32_t bufferSize = inHeader->nFilledLen;
        int32_t tmp = bufferSize;

        // The PV decoder is lying to us, sometimes it'll claim to only have
        // consumed a subset of the buffer when it clearly consumed all of it.
        // ignore whatever it says...
        if (PVDecodeVideoFrame(
                    mHandle, &bitstream, &timestamp, &tmp,
                    &useExtTimestamp,
                    outHeader->pBuffer) != PV_TRUE) {
            ALOGE("failed to decode video frame.");

            notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);
            mSignalledError = true;
            return;
        }

        if (portSettingsChanged()) {
            return;
        }

        // decoder deals in ms, OMX in us.
        outHeader->nTimeStamp = mPvToOmxTimeMap.valueFor(timestamp);
        mPvToOmxTimeMap.removeItem(timestamp);

        inHeader->nOffset += bufferSize;
        inHeader->nFilledLen = 0;
        if (inHeader->nFlags & OMX_BUFFERFLAG_EOS) {
            outHeader->nFlags = OMX_BUFFERFLAG_EOS;
        } else {
            outHeader->nFlags = 0;
        }

        if (inHeader->nFilledLen == 0) {
            inInfo->mOwnedByUs = false;
            inQueue.erase(inQueue.begin());
            inInfo = NULL;
            notifyEmptyBufferDone(inHeader);
            inHeader = NULL;
        }

        ++mInputBufferCount;

        outHeader->nOffset = 0;
        outHeader->nFilledLen = (mWidth * mHeight * 3) / 2;

        List<BufferInfo *>::iterator it = outQueue.begin();
        while ((*it)->mHeader != outHeader) {
            ++it;
        }

        BufferInfo *outInfo = *it;
        outInfo->mOwnedByUs = false;
        outQueue.erase(it);
        outInfo = NULL;

        notifyFillBufferDone(outHeader);
        outHeader = NULL;

        ++mNumSamplesOutput;
    }
}
Exemple #6
0
// this function passed the jpeg image buffer in, and returns the decoded
// image
int
decodeImage(OPENMAX_JPEG_DECODER * decoder, char *sourceImage,
	    size_t imageSize)
{
    char           *sourceOffset = sourceImage;	// we store a seperate
						// buffer ot image so we
						// can offset it
    size_t          toread = 0;	// bytes left to read from buffer
    toread += imageSize;
    int             bFilled = 0;	// have we filled our output
					// buffer
    bufferIndex = 0;

    while (toread > 0) {
	// get next buffer from array
	OMX_BUFFERHEADERTYPE *pBufHeader =
	    decoder->ppInputBufferHeader[bufferIndex];

	// step index and reset to 0 if required
	bufferIndex++;
	if (bufferIndex >= decoder->inputBufferHeaderCount)
	    bufferIndex = 0;

	// work out the next chunk to load into the decoder
	if (toread > pBufHeader->nAllocLen)
	    pBufHeader->nFilledLen = pBufHeader->nAllocLen;
	else
	    pBufHeader->nFilledLen = toread;

	toread = toread - pBufHeader->nFilledLen;

	// pass the bytes to the buffer
	memcpy(pBufHeader->pBuffer, sourceOffset, pBufHeader->nFilledLen);

	// update the buffer pointer and set the input flags

	sourceOffset = sourceOffset + pBufHeader->nFilledLen;
	pBufHeader->nOffset = 0;
	pBufHeader->nFlags = 0;
	if (toread <= 0) {
	    pBufHeader->nFlags = OMX_BUFFERFLAG_EOS;
	}
	// empty the current buffer
	int             ret =
	    OMX_EmptyThisBuffer(decoder->imageDecoder->handle,
				pBufHeader);

	if (ret != OMX_ErrorNone) {
	    perror("Empty input buffer");
	    fprintf(stderr, "return code %x\n", ret);
	    return OMXJPEG_ERROR_MEMORY;
	}
	// wait for buffer to empty or port changed event
	int             done = 0;
	while ((done == 0) && (decoder->pOutputBufferHeader == NULL)) {
	    if (decoder->pOutputBufferHeader == NULL) {
		ret =
		    ilclient_wait_for_event
		    (decoder->imageDecoder->component,
		     OMX_EventPortSettingsChanged,
		     decoder->imageDecoder->outPort, 0, 0, 1, 0, 5);

		if (ret == 0) {
		    ret = portSettingsChanged(decoder);
		    if (ret != OMXJPEG_OK)
			return ret;
		}
	    } else {
		ret =
		    ilclient_remove_event(decoder->imageDecoder->component,
					  OMX_EventPortSettingsChanged,
					  decoder->imageDecoder->outPort,
					  0, 0, 1);
		if (ret == 0)
		    portSettingsChangedAgain(decoder);

	    }

	    // check to see if buffer is now empty
	    if (pBufHeader->nFilledLen == 0)
		done = 1;

	    if ((done == 0)
		|| (decoder->pOutputBufferHeader == NULL))
		sleep(1);
	}

	// fill the buffer if we have created the buffer
	if ((bFilled == 0) && (decoder->pOutputBufferHeader != NULL)) {
	    ret = OMX_FillThisBuffer(decoder->imageResizer->handle,
				     decoder->pOutputBufferHeader);
	    if (ret != OMX_ErrorNone) {
		perror("Filling output buffer");
		fprintf(stderr, "Error code %x\n", ret);
		return OMXJPEG_ERROR_MEMORY;
	    }

	    bFilled = 1;
	}
    }

    // wait for buffer to fill
    /*
     * while(pBufHeader->nFilledLen == 0) { sleep(5); } 
     */

    // wait for end of stream events
    int             ret =
	ilclient_wait_for_event(decoder->imageDecoder->component,
				OMX_EventBufferFlag,
				decoder->imageDecoder->outPort, 1,
				OMX_BUFFERFLAG_EOS, 1,
				0, 2);
    if (ret != 0) {
	fprintf(stderr, "No EOS event on image decoder %d\n", ret);
    }
    ret = ilclient_wait_for_event(decoder->imageResizer->component,
				  OMX_EventBufferFlag,
				  decoder->imageResizer->outPort, 1,
				  OMX_BUFFERFLAG_EOS, 1, 0, 2);
    if (ret != 0) {
	fprintf(stderr, "No EOS event on image resizer %d\n", ret);
    }
    return OMXJPEG_OK;
}
Exemple #7
0
void MenuSettings::on_btnOk_clicked()
{
    // Port settings
    if( settings->value( "bitsPerSecond" ).toString() != ui->cmbBps->currentText() ||
        settings->value( "dataBits" ).toString() != ui->cmbDataBits->currentText() ||
        settings->value( "parity" ).toString() != ui->cmbParity->currentText() ||
        settings->value( "stopBits" ).toString() != ui->cmbStopBits->currentText() ||
        settings->value( "flowControl" ).toString() != ui->cmbFlowControl->currentText() )
    {
        settings->setValue( "bitsPerSecond", ui->cmbBps->currentText() );
        settings->setValue( "dataBits", ui->cmbDataBits->currentText() );
        settings->setValue( "parity", ui->cmbParity->currentText() );
        settings->setValue( "stopBits", ui->cmbStopBits->currentText() );
        settings->setValue( "flowControl", ui->cmbFlowControl->currentText() );

        emit portSettingsChanged();
    }

    // CONNECTION SETTINGS
    bool changed = false;

    // connect all or single
    if( group.checkedButton() == ui->radioAll )
    {
        if( settings->value( "port" ).toString() != "ALL" )
        {
            settings->setValue( "port", "ALL" );
            changed = true;
        }
    }
    else if( group.checkedButton() == ui->radioSingle )
    {
        if( settings->value( "port" ).toString() != ui->cmbPorts->currentText() )
        {
            settings->setValue( "port", ui->cmbPorts->currentText() );
            changed = true;
        }
    }

    // auto connect
    if( settings->value( "autoConnect").toBool() != ui->chkAutoConnect->isChecked() )
    {
        if( ui->chkAutoConnect->isChecked() )   // checked
            settings->setValue( "autoConnect", true );
        else                                    // unchecked
            settings->setValue( "autoConnect", false );
        changed = true;
    }

    // did the connection settings change
    if( changed )
        emit connectionSettingsChanged();


    // VALIDATION SETTINGS
    if( settings->value( "validationManualCommand" ).toBool() != ui->chkVerifManCom->isChecked() ||
        settings->value( "validationSequence" ).toBool() != ui->chkVerifSeq->isChecked() )
    {
        // validation: manual command
        if( ui->chkVerifManCom->isChecked() )   // checked
            settings->setValue( "validationManualCommand", true );
        else                                    // unchecked
            settings->setValue( "validationManualCommand", false );

        // validation: sequence
        if( ui->chkVerifSeq->isChecked() )   // checked
            settings->setValue( "validationSequence", true );
        else                                 // unchecked
            settings->setValue( "validationSequence", false );

        emit validationSettingsChanged();
    }

    this->close();
}