William Reynolds
/
LPC_Bootloader
SerialBuffered.cpp@0:15536fa79743, 2011-09-27 (annotated)
- Committer:
- daugihao
- Date:
- Tue Sep 27 15:44:55 2011 +0000
- Revision:
- 0:15536fa79743
- Child:
- 2:9e3ee0c6536b
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
daugihao | 0:15536fa79743 | 1 | #include "mbed.h" |
daugihao | 0:15536fa79743 | 2 | #include "LPC.h" |
daugihao | 0:15536fa79743 | 3 | |
daugihao | 0:15536fa79743 | 4 | Serial pc2(USBTX, USBRX); |
daugihao | 0:15536fa79743 | 5 | |
daugihao | 0:15536fa79743 | 6 | SerialBuffered::SerialBuffered( size_t bufferSize, PinName tx, PinName rx ) : target( tx, rx ) { |
daugihao | 0:15536fa79743 | 7 | m_buffSize = 0; |
daugihao | 0:15536fa79743 | 8 | m_contentStart = 0; |
daugihao | 0:15536fa79743 | 9 | m_contentEnd = 0; |
daugihao | 0:15536fa79743 | 10 | m_timeout = 1.0; |
daugihao | 0:15536fa79743 | 11 | target.attach( this, &SerialBuffered::handleInterrupt ); |
daugihao | 0:15536fa79743 | 12 | m_buff = (uint8_t *) malloc( bufferSize ); |
daugihao | 0:15536fa79743 | 13 | if ( m_buff == NULL ) { |
daugihao | 0:15536fa79743 | 14 | pc2.printf("SerialBuffered - failed to alloc buffer size %d\r\n", (int) bufferSize ); |
daugihao | 0:15536fa79743 | 15 | } else { |
daugihao | 0:15536fa79743 | 16 | m_buffSize = bufferSize; |
daugihao | 0:15536fa79743 | 17 | } |
daugihao | 0:15536fa79743 | 18 | } |
daugihao | 0:15536fa79743 | 19 | |
daugihao | 0:15536fa79743 | 20 | SerialBuffered::~SerialBuffered() { |
daugihao | 0:15536fa79743 | 21 | if ( m_buff ) |
daugihao | 0:15536fa79743 | 22 | free( m_buff ); |
daugihao | 0:15536fa79743 | 23 | } |
daugihao | 0:15536fa79743 | 24 | |
daugihao | 0:15536fa79743 | 25 | void SerialBuffered::InitUART(int baud) { //Sets the baud rates |
daugihao | 0:15536fa79743 | 26 | pc2.baud(baud); |
daugihao | 0:15536fa79743 | 27 | target.baud(baud); |
daugihao | 0:15536fa79743 | 28 | } |
daugihao | 0:15536fa79743 | 29 | |
daugihao | 0:15536fa79743 | 30 | void SerialBuffered::TargetSendString(char * str) { //Sends string to the board for console communication |
daugihao | 0:15536fa79743 | 31 | for (int i=0; i<strlen(str); i++) |
daugihao | 0:15536fa79743 | 32 | target.putc(str[i]); |
daugihao | 0:15536fa79743 | 33 | } |
daugihao | 0:15536fa79743 | 34 | |
daugihao | 0:15536fa79743 | 35 | void SerialBuffered::TargetSendStringAndCR(char * str) { //Sends string to the board for console communication followed by the carriage return character |
daugihao | 0:15536fa79743 | 36 | for (int i=0; i<strlen(str); i++) |
daugihao | 0:15536fa79743 | 37 | target.putc(str[i]); |
daugihao | 0:15536fa79743 | 38 | target.putc(0x0D); |
daugihao | 0:15536fa79743 | 39 | } |
daugihao | 0:15536fa79743 | 40 | |
daugihao | 0:15536fa79743 | 41 | void SerialBuffered::setTimeout( float seconds ) { |
daugihao | 0:15536fa79743 | 42 | m_timeout = seconds; |
daugihao | 0:15536fa79743 | 43 | } |
daugihao | 0:15536fa79743 | 44 | |
daugihao | 0:15536fa79743 | 45 | size_t SerialBuffered::readBytes(char *bytes, size_t requested) { |
daugihao | 0:15536fa79743 | 46 | int i = 0; |
daugihao | 0:15536fa79743 | 47 | for (int a=0; a<m_buffSize; a++) |
daugihao | 0:15536fa79743 | 48 | bytes[a] = 0; |
daugihao | 0:15536fa79743 | 49 | for (; i<requested;) { |
daugihao | 0:15536fa79743 | 50 | int c = getc(); |
daugihao | 0:15536fa79743 | 51 | if (c<0) |
daugihao | 0:15536fa79743 | 52 | break; |
daugihao | 0:15536fa79743 | 53 | bytes[i] = c; |
daugihao | 0:15536fa79743 | 54 | i++; |
daugihao | 0:15536fa79743 | 55 | } |
daugihao | 0:15536fa79743 | 56 | return i; |
daugihao | 0:15536fa79743 | 57 | } |
daugihao | 0:15536fa79743 | 58 | |
daugihao | 0:15536fa79743 | 59 | int SerialBuffered::getc() { |
daugihao | 0:15536fa79743 | 60 | m_timer.reset(); |
daugihao | 0:15536fa79743 | 61 | m_timer.start(); |
daugihao | 0:15536fa79743 | 62 | while (m_contentStart == m_contentEnd) { |
daugihao | 0:15536fa79743 | 63 | wait_ms(1); |
daugihao | 0:15536fa79743 | 64 | if (m_timeout>0 && m_timer.read()>m_timeout) |
daugihao | 0:15536fa79743 | 65 | return EOF; |
daugihao | 0:15536fa79743 | 66 | } |
daugihao | 0:15536fa79743 | 67 | m_timer.stop(); |
daugihao | 0:15536fa79743 | 68 | uint8_t result = m_buff[m_contentStart++]; |
daugihao | 0:15536fa79743 | 69 | m_contentStart = m_contentStart % m_buffSize; |
daugihao | 0:15536fa79743 | 70 | return result; |
daugihao | 0:15536fa79743 | 71 | } |
daugihao | 0:15536fa79743 | 72 | |
daugihao | 0:15536fa79743 | 73 | int SerialBuffered::readable() { |
daugihao | 0:15536fa79743 | 74 | return m_contentStart != m_contentEnd ; |
daugihao | 0:15536fa79743 | 75 | } |
daugihao | 0:15536fa79743 | 76 | |
daugihao | 0:15536fa79743 | 77 | void SerialBuffered::handleInterrupt() { |
daugihao | 0:15536fa79743 | 78 | while (target.readable()) { |
daugihao | 0:15536fa79743 | 79 | if (m_contentStart == (m_contentEnd +1) % m_buffSize) { |
daugihao | 0:15536fa79743 | 80 | pc2.printf("SerialBuffered - buffer overrun, data lost!\r\n" ); |
daugihao | 0:15536fa79743 | 81 | exit(0); |
daugihao | 0:15536fa79743 | 82 | //target.getc(); |
daugihao | 0:15536fa79743 | 83 | } else { |
daugihao | 0:15536fa79743 | 84 | m_buff[m_contentEnd++] = target.getc(); |
daugihao | 0:15536fa79743 | 85 | m_contentEnd = m_contentEnd % m_buffSize; |
daugihao | 0:15536fa79743 | 86 | } |
daugihao | 0:15536fa79743 | 87 | } |
daugihao | 0:15536fa79743 | 88 | } |