Skip to content

Commit

Permalink
usart buf removed spl calls
Browse files Browse the repository at this point in the history
  • Loading branch information
catompiler committed May 25, 2018
1 parent 1f94f4e commit 9faff35
Showing 1 changed file with 76 additions and 39 deletions.
115 changes: 76 additions & 39 deletions usart/usart_buf.c
Original file line number Diff line number Diff line change
@@ -1,30 +1,32 @@
#include "usart_buf.h"
#include "utils/utils.h"
#include "defs/defs.h"
#include <stdbool.h>


ALWAYS_INLINE static ITStatus usart_tx_it_state(USART_TypeDef* usart)

ALWAYS_INLINE static bool usart_tx_it_enabled(USART_TypeDef* usart)
{
if(usart->CR1 & USART_CR1_TXEIE) return ENABLE;
return DISABLE;
if(usart->CR1 & USART_CR1_TXEIE) return true;
return false;
}

ALWAYS_INLINE static ITStatus usart_rx_it_state(USART_TypeDef* usart)
ALWAYS_INLINE static bool usart_rx_it_enabled(USART_TypeDef* usart)
{
if(usart->CR1 & USART_CR1_RXNEIE) return ENABLE;
return DISABLE;
if(usart->CR1 & USART_CR1_RXNEIE) return true;
return false;
}

ALWAYS_INLINE static FunctionalState usart_transmitter_state(USART_TypeDef* usart)
ALWAYS_INLINE static bool usart_transmitter_enabled(USART_TypeDef* usart)
{
if(usart->CR1 & USART_CR1_TE) return ENABLE;
return DISABLE;
if(usart->CR1 & USART_CR1_TE) return true;
return false;
}

ALWAYS_INLINE static FunctionalState usart_receiver_state(USART_TypeDef* usart)
ALWAYS_INLINE static bool usart_receiver_enabled(USART_TypeDef* usart)
{
if(usart->CR1 & USART_CR1_RE) return ENABLE;
return DISABLE;
if(usart->CR1 & USART_CR1_RE) return true;
return false;
}

err_t usart_buf_init(usart_buf_t* usart_buf, usart_buf_init_t* usart_buf_init)
Expand Down Expand Up @@ -57,9 +59,10 @@ err_t usart_buf_init(usart_buf_t* usart_buf, usart_buf_init_t* usart_buf_init)
circular_buffer_init(&usart_buf->write_buffer, (uint8_t*)usart_buf_init->write_buffer, usart_buf_init->write_buffer_size);
circular_buffer_init(&usart_buf->read_buffer, (uint8_t*)usart_buf_init->read_buffer, usart_buf_init->read_buffer_size);

if((usart_receiver_state(usart_buf->usart) != DISABLE) &&
if(usart_receiver_enabled(usart_buf->usart) &&
circular_buffer_valid(&usart_buf->read_buffer)){
USART_ITConfig(usart_buf->usart, USART_IT_RXNE, ENABLE);
usart_buf->usart->CR1 |= USART_CR1_RXNEIE;
//USART_ITConfig(usart_buf->usart, USART_IT_RXNE, ENABLE);
}

return E_NO_ERROR;
Expand All @@ -69,31 +72,39 @@ err_t usart_buf_init(usart_buf_t* usart_buf, usart_buf_init_t* usart_buf_init)
{
uint8_t data;
if(circular_buffer_get(&usart_buf->write_buffer, &data)){
USART_SendData(usart_buf->usart, data);
//USART_SendData(usart_buf->usart, data);
usart_buf->usart->DR = data;
return true;
}
return false;
}*/

void usart_buf_irq_handler(usart_buf_t* usart_buf)
{
if(USART_GetITStatus(usart_buf->usart, USART_IT_RXNE) != RESET){
USART_ClearITPendingBit(usart_buf->usart, USART_IT_RXNE);
//if(USART_GetITStatus(usart_buf->usart, USART_IT_RXNE) != RESET){
if(usart_buf->usart->SR & USART_SR_RXNE){
//USART_ClearITPendingBit(usart_buf->usart, USART_IT_RXNE);
usart_buf->usart->SR |= USART_SR_RXNE;

uint8_t data = USART_ReceiveData(usart_buf->usart);
//uint8_t data = USART_ReceiveData(usart_buf->usart);
uint8_t data = usart_buf->usart->DR;
if(!circular_buffer_put(&usart_buf->read_buffer, data)){
usart_buf->data_overrun = true;
}
}
if(USART_GetITStatus(usart_buf->usart, USART_IT_TXE) != RESET){
//if(USART_GetITStatus(usart_buf->usart, USART_IT_TXE) != RESET){
if(usart_buf->usart->SR & USART_SR_TXE){
// Cleared only by write to USARTx->DR.
//USART_ClearITPendingBit(usart_buf->usart, USART_IT_TXE);
//usart_buf->usart->SR |= USART_SR_TXE;

uint8_t data;
if(circular_buffer_get(&usart_buf->write_buffer, &data)){
USART_SendData(usart_buf->usart, data);
//USART_SendData(usart_buf->usart, data);
usart_buf->usart->DR = data;
}else{
USART_ITConfig(usart_buf->usart, USART_IT_TXE, DISABLE);
//USART_ITConfig(usart_buf->usart, USART_IT_TXE, DISABLE);
usart_buf->usart->CR1 &= ~USART_CR1_TXEIE;
}
}
}
Expand All @@ -118,19 +129,26 @@ size_t usart_buf_put(usart_buf_t* usart_buf, uint8_t data)
size_t res;

if(!circular_buffer_valid(&usart_buf->write_buffer) ||
usart_transmitter_state(usart_buf->usart) == DISABLE) return 0;
usart_transmitter_enabled(usart_buf->usart) == DISABLE) return 0;

while(circular_buffer_free_size(&usart_buf->write_buffer) == 0);

ITStatus itstatus = usart_tx_it_state(usart_buf->usart);
USART_ITConfig(usart_buf->usart, USART_IT_TXE, DISABLE);
bool tx_it_enabled = usart_tx_it_enabled(usart_buf->usart);
//USART_ITConfig(usart_buf->usart, USART_IT_TXE, DISABLE);
usart_buf->usart->CR1 &= ~USART_CR1_TXEIE;

res = circular_buffer_put(&usart_buf->write_buffer, data);

if(res != 0){
USART_ITConfig(usart_buf->usart, USART_IT_TXE, ENABLE);
//USART_ITConfig(usart_buf->usart, USART_IT_TXE, ENABLE);
usart_buf->usart->CR1 |= USART_CR1_TXEIE;
}else{
USART_ITConfig(usart_buf->usart, USART_IT_TXE, itstatus);
//USART_ITConfig(usart_buf->usart, USART_IT_TXE, tx_it_enabled);
if(tx_it_enabled){
usart_buf->usart->CR1 |= USART_CR1_TXEIE;
}else{
usart_buf->usart->CR1 &= ~USART_CR1_TXEIE;
}
}

return res;
Expand All @@ -141,14 +159,20 @@ size_t usart_buf_get(usart_buf_t* usart_buf, uint8_t* data)
size_t res;

if(!circular_buffer_valid(&usart_buf->read_buffer) ||
usart_receiver_state(usart_buf->usart) == DISABLE) return 0;
usart_receiver_enabled(usart_buf->usart) == DISABLE) return 0;

ITStatus itstatus = usart_rx_it_state(usart_buf->usart);
USART_ITConfig(usart_buf->usart, USART_IT_RXNE, DISABLE);
bool rx_it_enabled = usart_rx_it_enabled(usart_buf->usart);
//USART_ITConfig(usart_buf->usart, USART_IT_RXNE, DISABLE);
usart_buf->usart->CR1 &= ~USART_CR1_RXNEIE;

res = circular_buffer_get(&usart_buf->read_buffer, data);

USART_ITConfig(usart_buf->usart, USART_IT_RXNE, itstatus);
//USART_ITConfig(usart_buf->usart, USART_IT_RXNE, rx_it_enabled);
if(rx_it_enabled){
usart_buf->usart->CR1 |= USART_CR1_RXNEIE;
}else{
usart_buf->usart->CR1 &= ~USART_CR1_RXNEIE;
}

if(res != 0){
usart_buf->data_overrun = false;
Expand All @@ -161,7 +185,7 @@ size_t usart_buf_write(usart_buf_t* usart_buf, const void* data, size_t size)
{
if(size == 0 || data == NULL) return 0;
if(!circular_buffer_valid(&usart_buf->write_buffer) ||
usart_transmitter_state(usart_buf->usart) == DISABLE) return 0;
usart_transmitter_enabled(usart_buf->usart) == DISABLE) return 0;

size_t res_size = 0;
size_t n;
Expand All @@ -174,15 +198,22 @@ size_t usart_buf_write(usart_buf_t* usart_buf, const void* data, size_t size)
n = MIN(free_size, size);
}while(n == 0);

ITStatus itstatus = usart_tx_it_state(usart_buf->usart);
USART_ITConfig(usart_buf->usart, USART_IT_TXE, DISABLE);
bool tx_it_enabled = usart_tx_it_enabled(usart_buf->usart);
//USART_ITConfig(usart_buf->usart, USART_IT_TXE, DISABLE);
usart_buf->usart->CR1 &= ~USART_CR1_TXEIE;

n = circular_buffer_write(&usart_buf->write_buffer, data, n);

if(n != 0){
USART_ITConfig(usart_buf->usart, USART_IT_TXE, ENABLE);
//USART_ITConfig(usart_buf->usart, USART_IT_TXE, ENABLE);
usart_buf->usart->CR1 |= USART_CR1_TXEIE;
}else{
USART_ITConfig(usart_buf->usart, USART_IT_TXE, itstatus);
//USART_ITConfig(usart_buf->usart, USART_IT_TXE, tx_it_enabled);
if(tx_it_enabled){
usart_buf->usart->CR1 |= USART_CR1_TXEIE;
}else{
usart_buf->usart->CR1 &= ~USART_CR1_TXEIE;
}
break;
}

Expand All @@ -199,16 +230,22 @@ size_t usart_buf_read(usart_buf_t* usart_buf, void* data, size_t size)
{
if(size == 0 || data == NULL) return 0;
if(!circular_buffer_valid(&usart_buf->read_buffer) ||
usart_receiver_state(usart_buf->usart) == DISABLE) return 0;
usart_receiver_enabled(usart_buf->usart) == DISABLE) return 0;

size_t res_size = 0;

ITStatus itstatus = usart_rx_it_state(usart_buf->usart);
USART_ITConfig(usart_buf->usart, USART_IT_RXNE, DISABLE);
bool rx_it_enabled = usart_rx_it_enabled(usart_buf->usart);
//USART_ITConfig(usart_buf->usart, USART_IT_RXNE, DISABLE);
usart_buf->usart->CR1 &= ~USART_CR1_RXNEIE;

res_size = circular_buffer_read(&usart_buf->read_buffer, data, size);

USART_ITConfig(usart_buf->usart, USART_IT_RXNE, itstatus);
//USART_ITConfig(usart_buf->usart, USART_IT_RXNE, rx_it_enabled);
if(rx_it_enabled){
usart_buf->usart->CR1 |= USART_CR1_RXNEIE;
}else{
usart_buf->usart->CR1 &= ~USART_CR1_RXNEIE;
}

if(res_size != 0){
usart_buf->data_overrun = false;
Expand Down

0 comments on commit 9faff35

Please sign in to comment.