Replacing calls to serialWriteByte(softSerial_t*, char) with calls to serialWrite(serialPort_t*, char). This completes the proof of concept for polymorphic serial port implementations (uartPort and softSerialPort).

This commit is contained in:
Dominic Clifton 2013-09-30 20:29:10 +01:00
parent 6425877b2c
commit 97f54561f0
5 changed files with 17 additions and 10 deletions

View File

@ -87,6 +87,7 @@ void setupSoftSerial1(uint32_t baud)
int portIndex = 0; int portIndex = 0;
softSerial_t *softSerial = &(softSerialPorts[portIndex]); softSerial_t *softSerial = &(softSerialPorts[portIndex]);
softSerial->port.vTable = softSerialVTable;
softSerial->port.mode = MODE_RXTX; softSerial->port.mode = MODE_RXTX;
softSerial->port.baudRate = baud; softSerial->port.baudRate = baud;
@ -289,19 +290,22 @@ uint8_t serialReadByte(softSerial_t *softSerial)
moveHeadToNextByte(softSerial); moveHeadToNextByte(softSerial);
return b; return b;
} }
void serialWriteByte(softSerial_t *softSerial, uint8_t ch)
{
serialPort_t *s = &(softSerial->port);
void serialWriteByte(serialPort_t *s, uint8_t ch)
{
s->txBuffer[s->txBufferHead] = ch; s->txBuffer[s->txBufferHead] = ch;
s->txBufferHead = (s->txBufferHead + 1) % s->txBufferSize; s->txBufferHead = (s->txBufferHead + 1) % s->txBufferSize;
} }
const struct serialPortVTable softSerialVTable[] = {
{ serialWriteByte }
};
void serialPrint(softSerial_t *softSerial, const char *str) void serialPrint(softSerial_t *softSerial, const char *str)
{ {
uint8_t ch; uint8_t ch;
while ((ch = *(str++))) { while ((ch = *(str++))) {
serialWriteByte(softSerial, ch); serialWrite((serialPort_t *)softSerial, ch);
} }
} }

View File

@ -30,12 +30,15 @@ typedef struct softSerial_s {
uint16_t internalTxBuffer; // includes start and stop bits uint16_t internalTxBuffer; // includes start and stop bits
} softSerial_t; } softSerial_t;
extern const struct serialPortVTable softSerialVTable[];
void setupSoftSerial1(uint32_t baud); void setupSoftSerial1(uint32_t baud);
uint8_t serialReadByte(softSerial_t *softSerial); uint8_t serialReadByte(softSerial_t *softSerial);
uint8_t serialAvailable(softSerial_t *softSerial); uint8_t serialAvailable(softSerial_t *softSerial);
void serialWriteByte(softSerial_t *softSerial, uint8_t ch); void softSerialWriteByte(serialPort_t *instance, uint8_t ch);
void serialPrint(softSerial_t *softSerial, const char *str); void serialPrint(softSerial_t *softSerial, const char *str);
extern timerHardware_t* serialTimerHardware; extern timerHardware_t* serialTimerHardware;

View File

@ -17,7 +17,7 @@ uartPort_t *serialUSART1(uint32_t baudRate, portMode_t mode)
NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;
s = &uartPort1; s = &uartPort1;
s->port.vTable = UART; s->port.vTable = uartVTable;
s->port.baudRate = baudRate; s->port.baudRate = baudRate;
@ -62,7 +62,7 @@ uartPort_t *serialUSART2(uint32_t baudRate, portMode_t mode)
NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;
s = &uartPort2; s = &uartPort2;
s->port.vTable = UART; s->port.vTable = uartVTable;
s->port.baudRate = baudRate; s->port.baudRate = baudRate;
@ -257,7 +257,7 @@ void uartWrite(serialPort_t *instance, uint8_t ch)
} }
} }
const struct serialPortVTable UART[] = { const struct serialPortVTable uartVTable[] = {
{ uartWrite } { uartWrite }
}; };

View File

@ -26,7 +26,7 @@ typedef struct {
USART_TypeDef *USARTx; USART_TypeDef *USARTx;
} uartPort_t; } uartPort_t;
extern const struct serialPortVTable UART[]; extern const struct serialPortVTable uartVTable[];
serialPort_t *uartOpen(USART_TypeDef *USARTx, serialReceiveCallbackPtr callback, uint32_t baudRate, portMode_t mode); serialPort_t *uartOpen(USART_TypeDef *USARTx, serialReceiveCallbackPtr callback, uint32_t baudRate, portMode_t mode);
void uartChangeBaud(uartPort_t *s, uint32_t baudRate); void uartChangeBaud(uartPort_t *s, uint32_t baudRate);

View File

@ -149,7 +149,7 @@ int main(void)
while (serialAvailable(&softSerialPorts[0])) { while (serialAvailable(&softSerialPorts[0])) {
uint8_t b = serialReadByte(&softSerialPorts[0]); uint8_t b = serialReadByte(&softSerialPorts[0]);
serialWriteByte(&softSerialPorts[0], b); serialWrite((serialPort_t*)&softSerialPorts[0], b);
//uartWrite(core.mainport, b); //uartWrite(core.mainport, b);
}; };
#endif #endif