void processTxState(softSerial_t *softSerial) { uint8_t mask; if (!softSerial->isTransmittingData) { char byteToSend; if (isSoftSerialTransmitBufferEmpty((serialPort_t *)softSerial)) { return; } // data to send byteToSend = softSerial->port.txBuffer[softSerial->port.txBufferTail++]; if (softSerial->port.txBufferTail >= softSerial->port.txBufferSize) { softSerial->port.txBufferTail = 0; } // build internal buffer, MSB = Stop Bit (1) + data bits (MSB to LSB) + start bit(0) LSB softSerial->internalTxBuffer = (1 << (TX_TOTAL_BITS - 1)) | (byteToSend << 1); softSerial->bitsLeftToTransmit = TX_TOTAL_BITS; softSerial->isTransmittingData = true; return; } if (softSerial->bitsLeftToTransmit) { mask = softSerial->internalTxBuffer & 1; softSerial->internalTxBuffer >>= 1; setTxSignal(softSerial, mask); softSerial->bitsLeftToTransmit--; return; }
void processTxState(softSerial_t *softSerial) { uint8_t mask; if (!softSerial->isTransmittingData) { if (isSoftSerialTransmitBufferEmpty((serialPort_t *)softSerial)) { // Transmit buffer empty. // Start listening if not already in if half-duplex if (!softSerial->rxActive && softSerial->port.options & SERIAL_BIDIR) { serialOutputPortDeActivate(softSerial); serialInputPortActivate(softSerial); } return; } // data to send uint8_t byteToSend = softSerial->port.txBuffer[softSerial->port.txBufferTail++]; if (softSerial->port.txBufferTail >= softSerial->port.txBufferSize) { softSerial->port.txBufferTail = 0; } // build internal buffer, MSB = Stop Bit (1) + data bits (MSB to LSB) + start bit(0) LSB softSerial->internalTxBuffer = (1 << (TX_TOTAL_BITS - 1)) | (byteToSend << 1); softSerial->bitsLeftToTransmit = TX_TOTAL_BITS; softSerial->isTransmittingData = true; if (softSerial->rxActive && (softSerial->port.options & SERIAL_BIDIR)) { // Half-duplex: Deactivate receiver, activate transmitter serialInputPortDeActivate(softSerial); serialOutputPortActivate(softSerial); } return; } if (softSerial->bitsLeftToTransmit) { mask = softSerial->internalTxBuffer & 1; softSerial->internalTxBuffer >>= 1; setTxSignal(softSerial, mask); softSerial->bitsLeftToTransmit--; return; }
void processTxState(softSerial_t *softSerial) { char mask; if (!softSerial->isTransmittingData) { char byteToSend; if (isSoftSerialTransmitBufferEmpty((serialPort_t *)softSerial)) { return; } // data to send byteToSend = softSerial->port.txBuffer[softSerial->port.txBufferTail++]; if (softSerial->port.txBufferTail >= softSerial->port.txBufferSize) { softSerial->port.txBufferTail = 0; } // build internal buffer, start bit(1) + data bits + stop bit(0) softSerial->internalTxBuffer = (1 << (TX_TOTAL_BITS - 1)) | (byteToSend << 1); softSerial->bitsLeftToTransmit = TX_TOTAL_BITS; // start immediately softSerial->timerTxCounter = 1; softSerial->isTransmittingData = true; return; } if (--softSerial->timerTxCounter <= 0) { mask = softSerial->internalTxBuffer & 1; softSerial->internalTxBuffer >>= 1; setTxSignal(softSerial, mask); softSerial->timerTxCounter = TICKS_PER_BIT; if (--softSerial->bitsLeftToTransmit <= 0) { softSerial->isTransmittingData = false; } }