William Reynolds
/
LPC_Bootloader
SerialBuffered.cpp@5:6134277e4d57, 2011-09-30 (annotated)
- Committer:
- daugihao
- Date:
- Fri Sep 30 11:52:20 2011 +0000
- Revision:
- 5:6134277e4d57
- Parent:
- 2:9e3ee0c6536b
- Child:
- 7:d0f98d61ec4c
Added compatibility with ID codes of various lengths
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 | 2:9e3ee0c6536b | 31 | for (int i=0; i<strlen(str); i++) { |
daugihao | 2:9e3ee0c6536b | 32 | target.putc(str[i]); |
daugihao | 2:9e3ee0c6536b | 33 | } |
daugihao | 0:15536fa79743 | 34 | } |
daugihao | 0:15536fa79743 | 35 | |
daugihao | 0:15536fa79743 | 36 | void SerialBuffered::TargetSendStringAndCR(char * str) { //Sends string to the board for console communication followed by the carriage return character |
daugihao | 0:15536fa79743 | 37 | for (int i=0; i<strlen(str); i++) |
daugihao | 0:15536fa79743 | 38 | target.putc(str[i]); |
daugihao | 0:15536fa79743 | 39 | target.putc(0x0D); |
daugihao | 0:15536fa79743 | 40 | } |
daugihao | 0:15536fa79743 | 41 | |
daugihao | 0:15536fa79743 | 42 | void SerialBuffered::setTimeout( float seconds ) { |
daugihao | 0:15536fa79743 | 43 | m_timeout = seconds; |
daugihao | 0:15536fa79743 | 44 | } |
daugihao | 0:15536fa79743 | 45 | |
daugihao | 0:15536fa79743 | 46 | size_t SerialBuffered::readBytes(char *bytes, size_t requested) { |
daugihao | 0:15536fa79743 | 47 | int i = 0; |
daugihao | 0:15536fa79743 | 48 | for (int a=0; a<m_buffSize; a++) |
daugihao | 0:15536fa79743 | 49 | bytes[a] = 0; |
daugihao | 0:15536fa79743 | 50 | for (; i<requested;) { |
daugihao | 0:15536fa79743 | 51 | int c = getc(); |
daugihao | 0:15536fa79743 | 52 | if (c<0) |
daugihao | 0:15536fa79743 | 53 | break; |
daugihao | 0:15536fa79743 | 54 | bytes[i] = c; |
daugihao | 0:15536fa79743 | 55 | i++; |
daugihao | 0:15536fa79743 | 56 | } |
daugihao | 0:15536fa79743 | 57 | return i; |
daugihao | 0:15536fa79743 | 58 | } |
daugihao | 0:15536fa79743 | 59 | |
daugihao | 0:15536fa79743 | 60 | int SerialBuffered::getc() { |
daugihao | 0:15536fa79743 | 61 | m_timer.reset(); |
daugihao | 0:15536fa79743 | 62 | m_timer.start(); |
daugihao | 0:15536fa79743 | 63 | while (m_contentStart == m_contentEnd) { |
daugihao | 0:15536fa79743 | 64 | wait_ms(1); |
daugihao | 0:15536fa79743 | 65 | if (m_timeout>0 && m_timer.read()>m_timeout) |
daugihao | 0:15536fa79743 | 66 | return EOF; |
daugihao | 0:15536fa79743 | 67 | } |
daugihao | 0:15536fa79743 | 68 | m_timer.stop(); |
daugihao | 0:15536fa79743 | 69 | uint8_t result = m_buff[m_contentStart++]; |
daugihao | 0:15536fa79743 | 70 | m_contentStart = m_contentStart % m_buffSize; |
daugihao | 0:15536fa79743 | 71 | return result; |
daugihao | 0:15536fa79743 | 72 | } |
daugihao | 0:15536fa79743 | 73 | |
daugihao | 0:15536fa79743 | 74 | int SerialBuffered::readable() { |
daugihao | 0:15536fa79743 | 75 | return m_contentStart != m_contentEnd ; |
daugihao | 0:15536fa79743 | 76 | } |
daugihao | 0:15536fa79743 | 77 | |
daugihao | 0:15536fa79743 | 78 | void SerialBuffered::handleInterrupt() { |
daugihao | 0:15536fa79743 | 79 | while (target.readable()) { |
daugihao | 0:15536fa79743 | 80 | if (m_contentStart == (m_contentEnd +1) % m_buffSize) { |
daugihao | 0:15536fa79743 | 81 | pc2.printf("SerialBuffered - buffer overrun, data lost!\r\n" ); |
daugihao | 0:15536fa79743 | 82 | exit(0); |
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 | } |