Alex Borisevich
/
OpenBCI
OpenBCI 32bit board variation with STM32L476 mircocontroller and mbed support
SerialBuffered.cpp@1:4683702d7ad8, 2017-01-22 (annotated)
- Committer:
- akpc806a
- Date:
- Sun Jan 22 04:10:11 2017 +0000
- Revision:
- 1:4683702d7ad8
OpenBCI 32bit board variation with STM32L476 mircocontroller and mbed support. Version V2 of firmware, forked from the same official version for the PIC32 board.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
akpc806a | 1:4683702d7ad8 | 1 | |
akpc806a | 1:4683702d7ad8 | 2 | #include "mbed.h" |
akpc806a | 1:4683702d7ad8 | 3 | #include "SerialBuffered.h" |
akpc806a | 1:4683702d7ad8 | 4 | |
akpc806a | 1:4683702d7ad8 | 5 | //extern Serial loggerSerial; |
akpc806a | 1:4683702d7ad8 | 6 | |
akpc806a | 1:4683702d7ad8 | 7 | SerialBuffered::SerialBuffered( size_t bufferSize, PinName tx, PinName rx, int baud ) : RawSerial( tx, rx, baud ) |
akpc806a | 1:4683702d7ad8 | 8 | { |
akpc806a | 1:4683702d7ad8 | 9 | m_buffSize = 0; |
akpc806a | 1:4683702d7ad8 | 10 | m_contentStart = 0; |
akpc806a | 1:4683702d7ad8 | 11 | m_contentEnd = 0; |
akpc806a | 1:4683702d7ad8 | 12 | m_timeout = 1.0; |
akpc806a | 1:4683702d7ad8 | 13 | |
akpc806a | 1:4683702d7ad8 | 14 | |
akpc806a | 1:4683702d7ad8 | 15 | attach( this, &SerialBuffered::handleInterrupt ); |
akpc806a | 1:4683702d7ad8 | 16 | |
akpc806a | 1:4683702d7ad8 | 17 | m_buff = (uint8_t *) malloc( bufferSize ); |
akpc806a | 1:4683702d7ad8 | 18 | if( m_buff == NULL ) |
akpc806a | 1:4683702d7ad8 | 19 | { |
akpc806a | 1:4683702d7ad8 | 20 | //loggerSerial.printf("SerialBuffered - failed to alloc buffer size %d\r\n", (int) bufferSize ); |
akpc806a | 1:4683702d7ad8 | 21 | } |
akpc806a | 1:4683702d7ad8 | 22 | else |
akpc806a | 1:4683702d7ad8 | 23 | { |
akpc806a | 1:4683702d7ad8 | 24 | m_buffSize = bufferSize; |
akpc806a | 1:4683702d7ad8 | 25 | } |
akpc806a | 1:4683702d7ad8 | 26 | } |
akpc806a | 1:4683702d7ad8 | 27 | |
akpc806a | 1:4683702d7ad8 | 28 | |
akpc806a | 1:4683702d7ad8 | 29 | SerialBuffered::~SerialBuffered() |
akpc806a | 1:4683702d7ad8 | 30 | { |
akpc806a | 1:4683702d7ad8 | 31 | if( m_buff ) |
akpc806a | 1:4683702d7ad8 | 32 | free( m_buff ); |
akpc806a | 1:4683702d7ad8 | 33 | } |
akpc806a | 1:4683702d7ad8 | 34 | |
akpc806a | 1:4683702d7ad8 | 35 | void SerialBuffered::setTimeout( float seconds ) |
akpc806a | 1:4683702d7ad8 | 36 | { |
akpc806a | 1:4683702d7ad8 | 37 | m_timeout = seconds; |
akpc806a | 1:4683702d7ad8 | 38 | } |
akpc806a | 1:4683702d7ad8 | 39 | |
akpc806a | 1:4683702d7ad8 | 40 | size_t SerialBuffered::readBytes( uint8_t *bytes, size_t requested ) |
akpc806a | 1:4683702d7ad8 | 41 | { |
akpc806a | 1:4683702d7ad8 | 42 | int i = 0; |
akpc806a | 1:4683702d7ad8 | 43 | |
akpc806a | 1:4683702d7ad8 | 44 | for( ; i < requested; ) |
akpc806a | 1:4683702d7ad8 | 45 | { |
akpc806a | 1:4683702d7ad8 | 46 | int c = getc(); |
akpc806a | 1:4683702d7ad8 | 47 | if( c < 0 ) |
akpc806a | 1:4683702d7ad8 | 48 | break; |
akpc806a | 1:4683702d7ad8 | 49 | bytes[i] = c; |
akpc806a | 1:4683702d7ad8 | 50 | i++; |
akpc806a | 1:4683702d7ad8 | 51 | } |
akpc806a | 1:4683702d7ad8 | 52 | |
akpc806a | 1:4683702d7ad8 | 53 | return i; |
akpc806a | 1:4683702d7ad8 | 54 | |
akpc806a | 1:4683702d7ad8 | 55 | } |
akpc806a | 1:4683702d7ad8 | 56 | |
akpc806a | 1:4683702d7ad8 | 57 | |
akpc806a | 1:4683702d7ad8 | 58 | int SerialBuffered::getc() |
akpc806a | 1:4683702d7ad8 | 59 | { |
akpc806a | 1:4683702d7ad8 | 60 | m_timer.reset(); |
akpc806a | 1:4683702d7ad8 | 61 | m_timer.start(); |
akpc806a | 1:4683702d7ad8 | 62 | while( m_contentStart == m_contentEnd ) |
akpc806a | 1:4683702d7ad8 | 63 | { |
akpc806a | 1:4683702d7ad8 | 64 | |
akpc806a | 1:4683702d7ad8 | 65 | |
akpc806a | 1:4683702d7ad8 | 66 | wait_ms( 1 ); |
akpc806a | 1:4683702d7ad8 | 67 | if( m_timeout > 0 && m_timer.read() > m_timeout ) |
akpc806a | 1:4683702d7ad8 | 68 | return EOF; |
akpc806a | 1:4683702d7ad8 | 69 | } |
akpc806a | 1:4683702d7ad8 | 70 | |
akpc806a | 1:4683702d7ad8 | 71 | m_timer.stop(); |
akpc806a | 1:4683702d7ad8 | 72 | |
akpc806a | 1:4683702d7ad8 | 73 | uint8_t result = m_buff[m_contentStart++]; |
akpc806a | 1:4683702d7ad8 | 74 | m_contentStart = m_contentStart % m_buffSize; |
akpc806a | 1:4683702d7ad8 | 75 | |
akpc806a | 1:4683702d7ad8 | 76 | |
akpc806a | 1:4683702d7ad8 | 77 | return result; |
akpc806a | 1:4683702d7ad8 | 78 | } |
akpc806a | 1:4683702d7ad8 | 79 | |
akpc806a | 1:4683702d7ad8 | 80 | |
akpc806a | 1:4683702d7ad8 | 81 | int SerialBuffered::readable() |
akpc806a | 1:4683702d7ad8 | 82 | { |
akpc806a | 1:4683702d7ad8 | 83 | return m_contentStart != m_contentEnd ; |
akpc806a | 1:4683702d7ad8 | 84 | } |
akpc806a | 1:4683702d7ad8 | 85 | |
akpc806a | 1:4683702d7ad8 | 86 | #include "stm32l4xx_hal_def.h" |
akpc806a | 1:4683702d7ad8 | 87 | #include "stm32l4xx_hal_uart.h" |
akpc806a | 1:4683702d7ad8 | 88 | |
akpc806a | 1:4683702d7ad8 | 89 | void SerialBuffered::handleInterrupt() |
akpc806a | 1:4683702d7ad8 | 90 | { |
akpc806a | 1:4683702d7ad8 | 91 | |
akpc806a | 1:4683702d7ad8 | 92 | while( RawSerial::readable()) |
akpc806a | 1:4683702d7ad8 | 93 | { |
akpc806a | 1:4683702d7ad8 | 94 | if( m_contentStart == (m_contentEnd +1) % m_buffSize) |
akpc806a | 1:4683702d7ad8 | 95 | { |
akpc806a | 1:4683702d7ad8 | 96 | //loggerSerial.printf("SerialBuffered - buffer overrun, data lost!\r\n" ); |
akpc806a | 1:4683702d7ad8 | 97 | RawSerial::getc(); |
akpc806a | 1:4683702d7ad8 | 98 | //UART_HandleTypeDef huart; |
akpc806a | 1:4683702d7ad8 | 99 | //huart.Instance = (USART_TypeDef *)USART1_BASE; |
akpc806a | 1:4683702d7ad8 | 100 | //__HAL_UART_CLEAR_FLAG(&huart, UART_FLAG_RXNE); |
akpc806a | 1:4683702d7ad8 | 101 | //volatile uint32_t tmpval = huart.Instance->RDR; |
akpc806a | 1:4683702d7ad8 | 102 | |
akpc806a | 1:4683702d7ad8 | 103 | //break; |
akpc806a | 1:4683702d7ad8 | 104 | |
akpc806a | 1:4683702d7ad8 | 105 | } |
akpc806a | 1:4683702d7ad8 | 106 | else |
akpc806a | 1:4683702d7ad8 | 107 | { |
akpc806a | 1:4683702d7ad8 | 108 | |
akpc806a | 1:4683702d7ad8 | 109 | m_buff[ m_contentEnd ++ ] = RawSerial::getc(); |
akpc806a | 1:4683702d7ad8 | 110 | m_contentEnd = m_contentEnd % m_buffSize; |
akpc806a | 1:4683702d7ad8 | 111 | |
akpc806a | 1:4683702d7ad8 | 112 | |
akpc806a | 1:4683702d7ad8 | 113 | |
akpc806a | 1:4683702d7ad8 | 114 | } |
akpc806a | 1:4683702d7ad8 | 115 | } |
akpc806a | 1:4683702d7ad8 | 116 | } |
akpc806a | 1:4683702d7ad8 | 117 |