Skip to content

Commit

Permalink
pulled just the USART changes from PR #812
Browse files Browse the repository at this point in the history
  • Loading branch information
m-mcgowan committed Jan 21, 2016
1 parent 59107b0 commit c640682
Show file tree
Hide file tree
Showing 8 changed files with 48 additions and 1 deletion.
1 change: 1 addition & 0 deletions hal/inc/hal_dynalib_usart.h
Expand Up @@ -60,6 +60,7 @@ DYNALIB_FN(hal_usart,HAL_USART_Peek_Data)
DYNALIB_FN(hal_usart,HAL_USART_Flush_Data)
DYNALIB_FN(hal_usart,HAL_USART_Is_Enabled)
DYNALIB_FN(hal_usart,HAL_USART_Half_Duplex)
DYNALIB_FN(hal_usart,HAL_USART_Available_Data_For_Write)

DYNALIB_END(hal_usart)

Expand Down
1 change: 1 addition & 0 deletions hal/inc/usart_hal.h
Expand Up @@ -72,6 +72,7 @@ void HAL_USART_Init(HAL_USART_Serial serial, Ring_Buffer *rx_buffer, Ring_Buffer
void HAL_USART_Begin(HAL_USART_Serial serial, uint32_t baud);
void HAL_USART_End(HAL_USART_Serial serial);
uint32_t HAL_USART_Write_Data(HAL_USART_Serial serial, uint8_t data);
int32_t HAL_USART_Available_Data_For_Write(HAL_USART_Serial serial);
int32_t HAL_USART_Available_Data(HAL_USART_Serial serial);
int32_t HAL_USART_Read_Data(HAL_USART_Serial serial);
int32_t HAL_USART_Peek_Data(HAL_USART_Serial serial);
Expand Down
5 changes: 5 additions & 0 deletions hal/src/core/usart_hal.c
Expand Up @@ -218,6 +218,11 @@ void HAL_USART_End(HAL_USART_Serial serial)
usartMap[serial]->usart_transmitting = false;
}

int32_t HAL_USART_Available_Data_For_Write(HAL_USART_Serial serial)
{
return (unsigned int)(SERIAL_BUFFER_SIZE + usartMap[serial]->usart_tx_buffer->head - usartMap[serial]->usart_tx_buffer->tail) % SERIAL_BUFFER_SIZE;
}

uint32_t HAL_USART_Write_Data(HAL_USART_Serial serial, uint8_t data)
{
// interrupts are off and data in queue;
Expand Down
9 changes: 9 additions & 0 deletions hal/src/gcc/usart_hal.cpp
Expand Up @@ -7,6 +7,7 @@ struct Usart {
virtual void begin(uint32_t baud)=0;
virtual void end()=0;
virtual int32_t available()=0;
virtual int32_t availableForWrite()=0;
virtual int32_t read()=0;
virtual int32_t peek()=0;
virtual uint32_t write(uint8_t byte)=0;
Expand Down Expand Up @@ -84,6 +85,9 @@ class SocketUsartBase : public Usart
fillFromSocketIfNeeded();
return (rx->head-rx->tail) % SERIAL_BUFFER_SIZE;
}
virtual int32_t availableForWrite() override {
return (SERIAL_BUFFER_SIZE + tx->head - tx->tail) % SERIAL_BUFFER_SIZE;
}
virtual int32_t read() override {
fillFromSocketIfNeeded();
return read_char();
Expand Down Expand Up @@ -189,6 +193,11 @@ void HAL_USART_End(HAL_USART_Serial serial)
//usartMap(serial).end();
}

int32_t HAL_USART_Available_Data_For_Write(HAL_USART_Serial serial)
{
return usartMap(serial).availableForWrite();
}

uint32_t HAL_USART_Write_Data(HAL_USART_Serial serial, uint8_t data)
{
return usartMap(serial).write(data);
Expand Down
6 changes: 6 additions & 0 deletions hal/src/stm32f2xx/usart_hal.c
Expand Up @@ -311,6 +311,12 @@ int32_t HAL_USART_Available_Data(HAL_USART_Serial serial)
return (unsigned int)(SERIAL_BUFFER_SIZE + usartMap[serial]->usart_rx_buffer->head - usartMap[serial]->usart_rx_buffer->tail) % SERIAL_BUFFER_SIZE;
}

int32_t HAL_USART_Available_Data_For_Write(HAL_USART_Serial serial)
{
return (unsigned int)(SERIAL_BUFFER_SIZE + usartMap[serial]->usart_tx_buffer->head - usartMap[serial]->usart_tx_buffer->tail) % SERIAL_BUFFER_SIZE;
}


int32_t HAL_USART_Read_Data(HAL_USART_Serial serial)
{
// if the head isn't ahead of the tail, we don't have any characters
Expand Down
5 changes: 5 additions & 0 deletions user/tests/wiring/api/wiring.cpp
Expand Up @@ -59,6 +59,11 @@ test(api_wiring_usartserial) {
API_COMPILE(Serial1.halfduplex(true));
API_COMPILE(Serial1.halfduplex(false));

API_COMPILE(Serial1.blockOnOverrun(false));
API_COMPILE(Serial1.blockOnOverrun(true));

API_COMPILE(Serial1.availableForWrite());

}

void TIM3_callback()
Expand Down
4 changes: 4 additions & 0 deletions wiring/inc/spark_wiring_usartserial.h
Expand Up @@ -35,6 +35,7 @@ class USARTSerial : public Stream
{
private:
HAL_USART_Serial _serial;
bool _blocking;
public:
USARTSerial(HAL_USART_Serial serial, Ring_Buffer *rx_buffer, Ring_Buffer *tx_buffer);
virtual ~USARTSerial() {};
Expand All @@ -43,6 +44,9 @@ class USARTSerial : public Stream
void halfduplex(bool);
void end();

virtual void blockOnOverrun(bool);

virtual int availableForWrite(void);
virtual int available(void);
virtual int peek(void);
virtual int read(void);
Expand Down
18 changes: 17 additions & 1 deletion wiring/src/spark_wiring_usartserial.cpp
Expand Up @@ -32,6 +32,8 @@
USARTSerial::USARTSerial(HAL_USART_Serial serial, Ring_Buffer *rx_buffer, Ring_Buffer *tx_buffer)
{
_serial = serial;
// Default is blocking mode
_blocking = true;
HAL_USART_Init(serial, rx_buffer, tx_buffer);
}
// Public Methods //////////////////////////////////////////////////////////////
Expand All @@ -57,6 +59,17 @@ void USARTSerial::halfduplex(bool Enable)
HAL_USART_Half_Duplex(_serial, Enable);
}

void USARTSerial::blockOnOverrun(bool block)
{
_blocking = block;
}


int USARTSerial::availableForWrite(void)
{
return HAL_USART_Available_Data(_serial);
}

int USARTSerial::available(void)
{
return HAL_USART_Available_Data(_serial);
Expand All @@ -79,7 +92,10 @@ void USARTSerial::flush()

size_t USARTSerial::write(uint8_t c)
{
return HAL_USART_Write_Data(_serial, c);
if (HAL_USART_Available_Data_For_Write(_serial) > 0 || _blocking) {
return HAL_USART_Write_Data(_serial, c);
}
return 0;
}

USARTSerial::operator bool() {
Expand Down

0 comments on commit c640682

Please sign in to comment.