
#include "SerialThread.h"

SerialThread::SerialThread(QObject *parent) : QThread(parent)
{
	
	canReceive = false;
}
void SerialThread::run()
{
	bReadSerial = true;
	qDebug("Port mit Standart-Einstellungen Initialisiert:");
	initPort();
	while(bReadSerial)
	{
		if(canReceive)
			receiveMsg();
	}
	qDebug("close Thread");
	closePort();
	delete port;
    port = NULL;
}
void SerialThread::initPort(QString com, BaudRateType bt, DataBitsType dt, FlowType ft, ParityType pt, StopBitsType st)
{
    //modify the port settings on your own
	port = new QextSerialPort(com);
	port->setBaudRate(bt);   
	port->setFlowControl(ft);
	port->setParity(pt);    
	port->setDataBits(dt);   
	port->setStopBits(st);
	openPort();
	conf = "ComPort = " + com.toAscii() + "\n";
	qDebug("ComPort = " + com.toAscii());
	QByteArray baud;
	switch(bt)
	{
			case BAUD50:
                baud = "50";
                break;
            case BAUD75:
                baud = "75";
                break;
            case BAUD110:
                baud = "110";
                break;
            case BAUD134:
                baud = "134";
                break;
            case BAUD150:
                baud = "150";
                break;
            case BAUD200:
                baud = "200";
                break;
            case BAUD300:
                baud = "300";
                break;
            case BAUD600:
                baud = "600";
                break;
            case BAUD1200:
                baud = "1200";
                break;
            case BAUD1800:
                baud = "1800";
                break;
            case BAUD2400:
                baud = "2400";
                break;
            case BAUD4800:
                baud = "4800";
                break;
            case BAUD9600:
                baud = "9600 (Standard)";
                break;
            case BAUD14400:
                baud = "14400";
                break;
            case BAUD19200:
                baud = "19200";
                break;
            case BAUD38400:
                baud = "38400";
                break;
            case BAUD56000:
                baud = "56000";
                break;
            case BAUD57600:
                baud = "57600";
                break;
            case BAUD76800:
                baud = "76800";
                break;
            case BAUD115200:
                baud = "115200";
                break;
            case BAUD128000:
                baud = "128000";
                break;
            case BAUD256000:
                baud = "256000";
               break;
    }
	conf += "Baud = " + baud + "\n";
	qDebug("Baud = " + baud);
	QByteArray dat;
	switch(dt) 
	{
            case DATA_5:
               dat = "5";
                break;
            case DATA_6:
               dat = "6";
                break;
            case DATA_7:
               dat = "7";
                break;
            case DATA_8:
               dat = "8 (Standard)";
                break;
    }
	conf += "DataBits = " + dat + "\n";
	qDebug("DataBits = " + dat);
	QByteArray sto;
	switch (st) 
	{
            case STOP_1:
				sto = "1 (Standard)";
                break;
            case STOP_1_5:
				sto = "1.5";
                break;
            case STOP_2:
				sto = "2";
                break;
    }
	conf += "StopBits = " + sto + "\n";
	qDebug("StopBits = " + sto);
	
	QByteArray par;
	switch (pt) 
	{
            case PAR_SPACE:
				par = "SPACE";
                break;
            case PAR_MARK:
				par = "MARK";
                break;
            case PAR_NONE:
				par = "NONE (Standard)";
                break;
            case PAR_EVEN:
				par = "EVEN";
                break;
            case PAR_ODD:
				par = "ODD";
                break;
    }
	conf += "Parity = " + par + "\n";
	qDebug("Parity = " + par);
	
	QByteArray flow;
	switch(ft) 
	{
            case FLOW_OFF:
				flow = "OFF (Standard)";
                break;
            case FLOW_XONXOFF:
				flow = "XONXOFF";
                break;
            case FLOW_HARDWARE:
				flow = "HARDWARE";
                break;
    }
	conf += "FlowControl = " + flow + "\n";
	qDebug("FlowControl = " + flow);
	//qDebug("isOpen : %d", port->isOpen());
	canReceive = true;
}

void SerialThread::transmitMsg(QByteArray msg)
{
	int length = msg.length();
	char *buff;
	buff = new char[length];
	for(int i = 0; i< msg.length(); ++i)
	{
		if(msg.at(i) == 48)
			buff[i] = 0;
		else
			buff[i] = msg.at(i);
	}
  int l = port->write(buff, length);
  qDebug("trasmitted : %d", l);
}

void SerialThread::receiveMsg()
{
	char buff[1024];
  	int numBytes;
    msleep(500);
	numBytes = port->bytesAvailable();
	if(numBytes > 0) 
	{
	    if(numBytes > 1024) numBytes = 1024;
	
	    int i = port->read(buff, numBytes);
		
		for(int z = 0; z < i; ++z)
			if(buff[z] == 0)
				buff[z] = '0';
		buff[i] = '\0';
	
	   	readBuffer = buff;
		//qDebug("bytes available: %d", numBytes);
		//qDebug("received: %d", i);
		emit bytesInBuffer();
  }
}


void SerialThread::appendCR()
{
	message.append("\x0D");
}

void SerialThread::appendLF()
{
	message.append("\x0A");
}

void SerialThread::closePort()
{
	port->close();
	qDebug("is open: %d", port->isOpen());
}

void SerialThread::openPort()
{
	port->open(QIODevice::ReadWrite);
	qDebug("is open: %d", port->isOpen());
}

