Exemplo n.º 1
0
static void processTxStateBL(escSerial_t *escSerial)
{
    uint8_t mask;
    if (escSerial->isReceivingData) {
        return;
    }

    if (!escSerial->isTransmittingData) {
        char byteToSend;
        if (isEscSerialTransmitBufferEmpty((serialPort_t *)escSerial)) {
            // canreceive
            return;
        }

        // data to send
        byteToSend = escSerial->port.txBuffer[escSerial->port.txBufferTail++];
        if (escSerial->port.txBufferTail >= escSerial->port.txBufferSize) {
            escSerial->port.txBufferTail = 0;
        }

        // build internal buffer, MSB = Stop Bit (1) + data bits (MSB to LSB) + start bit(0) LSB
        escSerial->internalTxBuffer = (1 << (TX_TOTAL_BITS - 1)) | (byteToSend << 1);
        escSerial->bitsLeftToTransmit = TX_TOTAL_BITS;
        escSerial->isTransmittingData = true;


        //set output
        if (escSerial->mode==PROTOCOL_BLHELI || escSerial->mode==PROTOCOL_CASTLE) {
            escSerialOutputPortConfig(escSerial->rxTimerHardware);
        }
        return;
    }

    if (escSerial->bitsLeftToTransmit) {
        mask = escSerial->internalTxBuffer & 1;
        escSerial->internalTxBuffer >>= 1;

        setTxSignalEsc(escSerial, mask);
        escSerial->bitsLeftToTransmit--;
        return;
    }
Exemplo n.º 2
0
void processTxState(escSerial_t *escSerial)
{
    uint8_t mask;
    static uint8_t bitq=0, transmitStart=0;
    if (escSerial->isReceivingData) {
    	return;
    }

    if(transmitStart==0)
    {
    	setTxSignal(escSerial, 1);
    }
    if (!escSerial->isTransmittingData) {
        char byteToSend;
reload:
        if (isEscSerialTransmitBufferEmpty((serialPort_t *)escSerial)) {
        	// canreceive
        	transmitStart=0;
            return;
        }

        if(transmitStart<3)
        {
        	if(transmitStart==0)
        		byteToSend = 0xff;
        	if(transmitStart==1)
        		byteToSend = 0xff;
        	if(transmitStart==2)
        		byteToSend = 0x7f;
        	transmitStart++;
        }
        else{
			// data to send
			byteToSend = escSerial->port.txBuffer[escSerial->port.txBufferTail++];
			if (escSerial->port.txBufferTail >= escSerial->port.txBufferSize) {
				escSerial->port.txBufferTail = 0;
			}
        }


        // build internal buffer, data bits (MSB to LSB)
        escSerial->internalTxBuffer = byteToSend;
        escSerial->bitsLeftToTransmit = 8;
        escSerial->isTransmittingData = true;

        //set output
        serialOutputPortConfig(escSerial->rxTimerHardware);
        return;
    }

    if (escSerial->bitsLeftToTransmit) {
        mask = escSerial->internalTxBuffer & 1;
        if(mask)
        {
        	if(bitq==0 || bitq==1)
        	{
                setTxSignal(escSerial, 1);
        	}
        	if(bitq==2 || bitq==3)
        	{
                setTxSignal(escSerial, 0);
        	}
        }
        else
        {
        	if(bitq==0 || bitq==2)
        	{
                setTxSignal(escSerial, 1);
        	}
        	if(bitq==1 ||bitq==3)
        	{
                setTxSignal(escSerial, 0);
        	}
        }
        bitq++;
        if(bitq>3)
        {
			escSerial->internalTxBuffer >>= 1;
			escSerial->bitsLeftToTransmit--;
			bitq=0;
			if(escSerial->bitsLeftToTransmit==0)
			{
				goto reload;
			}
        }