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; }
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; } }