void SetBitValue( uint8_t bitValue )
{
    if( bitValue != 0 )
    {
        SET_TX();
    }
    else
    {
        CLEAR_TX();
    }
}
	int TransactionThread(int id)
	{
		int nQuery,sts;
		char szData[MAX_BUFFER];
		char szAux[1000];
		char szComando[MAX_BUFFER];
		Tipo_XML *xml=NULL;
		/*PGresult *res=NULL;*/
		int nFila,nReg;
		int nSocketCerrado;
		char szTmp[200];
		
		printf("(%02i) INICIA THREAD SOCKET ",id);
		Conexion[id].nAbierta=0;
		while(1)
		{
		   EsperaActivacion2(id,&Conexion[id]);
		   if (Conexion[id].nAbierta==0)
		   {
			if (!Conexion[id].nAbierta)
			{	
			   WriteLog(id,"Abre Conexion BD");
			   Conexion[id].dbconn=OpenDatabaseMSSQL(id);
			}
			if (Conexion[id].dbconn==NULL)
			{
				printf("(%02i) Falla Conexion a BD",id);
				WriteLog(id,"Falla Conexion a BD");
				goto fin;
			}
			Conexion[id].nAbierta=1;
		   }
		   printf("(%02i) Conexion MSSQL %i\n\r",id,Conexion[id].nSocket); 
                   dbmsghandle( (MHANDLEFUNC)msg_handler  );

		   nQuery=0;
		   while ((sts=LeePaquete(id,Conexion[id].nSocket,szData,MAX_BUFFER,global.nTimeoutBaseDatos))>0)
		   {
			//printf("(%02i) LEE %s\n\r",id,szData);
			xml=CierraXML(xml);
			xml=ProcesaInputXML1(xml,szData);
			if (GetStrXML(xml,"GET_RECORD",szComando,MAX_BUFFER))
			{
				sprintf(szAux,"(%02i) Socket(%i) GET_RECORD %s",id,Conexion[id].nSocket,szComando);
				SET_TX(id,szComando);
				WriteLog(id,szAux);
				GetOneRecordMSSQL(id,Conexion[id].nSocket,szComando,Conexion[id].dbconn);//Descomentar cuando este implementado
				nQuery=0;
				break;
			}
			else if (GetStrXML(xml,"CLOSE",szComando,1024))
			{
				printf("(%02i) CloseDatabase\n\r",id);
				nQuery=0;
				break;	
			}
			else if (GetStrXML(xml,"CAMPOS",szComando,1024))
			{
				sprintf(szAux,"(%02i) Socket(%i) CAMPOS %s",id,Conexion[id].nSocket,szComando);
				SET_TX(id,szComando);
				WriteLog(id,szAux);
				GetCamposMSSQL(id,Conexion[id].nSocket,szComando,Conexion[id].dbconn);//Descomentar cuando este implementado
				break;
			}
			else if (GetStrXML(xml,"SQL",szComando,MAX_BUFFER))
			{
				sprintf(szAux,"(%02i) Socket(%i) SQL %s",id,Conexion[id].nSocket,szComando);
				SET_TX(id,szComando);
				WriteLog(id,szAux);
				//res=ExecuteSql(id,Conexion[id].nSocket,szComando,Conexion[id].dbconn);//Descomentar cuando este implementado
				nQuery=0;
				nFila=0;
				break;
			}
			else if (GetStrXML(xml,"QUERY",szComando,MAX_BUFFER))
			{
				sprintf(szAux,"(%02i) Socket(%i) SQL %s",id,Conexion[id].nSocket,szComando);
				SET_TX(id,szComando);
				WriteLog(id,szAux);
				//res=ExecuteSql(id,Conexion[id].nSocket,szComando,Conexion[id].dbconn);//Descomentar cuando este implementado
				nQuery=1;
				nFila=0;
				nReg=0;
			}
			else if (GetStrXML(xml,"MOVE_NEXT",szComando,MAX_BUFFER))
			{
				if (nQuery)
				{
					sprintf(szAux,"(%02i) Socket(%i) MOVE_NEXT Fila=%i",id,Conexion[id].nSocket,nFila);
					WriteLog(id,szAux);
                                        //Descomentar cuando este implementado
					/*
					if (!MoveNextData(id,Conexion[id].nSocket,res,nFila++))
					{
						PQclear(res);
						res=NULL;
						printf("(%02i) Fin de Query...\n\r",id);
						nQuery=0;
						break;
					}
                                        */
				}
				else
				{
					printf("(%02i) No hay query activa...\n\r",id);
					break;
				}
			}
			else if (GetStrXML(xml,"MOVE_NEXT_100",szComando,MAX_BUFFER))
			{
				if (nQuery)
				{
					sprintf(szAux,"(%02i) Socket(%i) MOVE_NEXT_100",id,Conexion[id].nSocket);
					WriteLog(id,szAux);
                                        //Descomentar cuando este implementado
 					/*
					if (!MoveNextData100(id,Conexion[id].nSocket,res,&nFila,&nReg))
					{
						PQclear(res);
						res=NULL;
						printf("(%02i) Fin de Query...\n\r",id);
						nQuery=0;
						break;
					}
 					*/
				}
				else
				{
					printf("(%02i) No hay query activa...\n\r",id);
					break;
				}
			}
			else if (GetStrXML(xml,"MOVE_NEXT_NIVEL_100",szComando,MAX_BUFFER))
			{
				if (nQuery)
				{
					sprintf(szAux,"(%02i) Socket(%i) MOVE_NEXT_100",id,Conexion[id].nSocket);
					WriteLog(id,szAux);
                                        /*
					if (!MoveNextData_100(id,Conexion[id].nSocket,res,&nFila,&nReg))
					{
						PQclear(res);
						res=NULL;
						printf("(%02i) Fin de Query...\n\r",id);
						nQuery=0;
						break;
					}
 					*/
				}
				else
				{
					printf("(%02i) No hay query activa...\n\r",id);
					break;
				}
			}
		   }

		   xml=CierraXML(xml);
                   /*Comentado Por Felipe Avendano
		   if (res!=NULL) 
		   {
			   WriteLog(id,"PQclear");
			   //PQclear(res);//Comentado por FelipeAvendano
			   res=NULL;
		   }
		   */

		   //si esta cerrada la conexion...
		   while (Conexion[id].nAbierta!=1)
		   {
			printf("(%02i) Abre conexion Base Datos..\n\r",id);
			WriteError(id,"Re-Abre Conexion a BD");
			 sprintf(szTmp,IP_BD);
			Conexion[id].dbconn=OpenDatabaseMSSQL(id);
		 	if (Conexion[id].dbconn==NULL)
			{
				printf("(%02i) Falla Conexion a BD",id);
				WriteLog(id,"Falla Conexion a BD");
				WriteError(id,"Falla Re-Conexion a BD");
				sleep(1);
				continue;
			}
			WriteLog(id,"ReAbre Conexion a BD");
			Conexion[id].nAbierta=1;
	    }

fin:
	   sts=close(Conexion[id].nSocket);
	   WriteLog(id,"DesactivaProceso2");
	   DesactivaProceso2(id);
	}
}
void UARTTransmitHandler()
{
    switch(state)
    {
        case Idle:
        {
            SET_TX();
            break;
        }

        case Start:
        {
            CLEAR_TX();
            state   = Bit0;
            break;
        }

        case Bit0:
        {
            SetBitValue( byteToTransmit & 0x01 );
            state   = Bit1;
            break;
        }

        case Bit1:
        {
            SetBitValue( byteToTransmit & 0x02 );
            state   = Bit2;
            break;
        }

        case Bit2:
        {
            SetBitValue( byteToTransmit & 0x04 );
            state   = Bit3;
            break;
        }

        case Bit3:
        {
            SetBitValue( byteToTransmit & 0x08 );
            state   = Bit4;
            break;
        }

        case Bit4:
        {
            SetBitValue( byteToTransmit & 0x10 );
            state   = Bit5;
            break;
        }

        case Bit5:
        {
            SetBitValue( byteToTransmit & 0x20 );
            state   = Bit6;
            break;
        }

        case Bit6:
        {
            SetBitValue( byteToTransmit & 0x40 );
            state   = Bit7;
            break;
        }

        case Bit7:
        {
            SetBitValue( byteToTransmit & 0x80 );
            state   = Stop;
            break;
        }

        case Parity:
        {
            state   = Idle;
            SetBitValue( parityValue );
            break;
        }

        case Stop:
        {
            SET_TX();
            state   = Idle;
            break;
        }

        default:
        {
            PANIC();
            break;
        }
    }
}
void ResetUARTTransmitter()
{
    state   = Idle;
    SET_TX();
}