Dependencies:   mbed

Committer:
daugihao
Date:
Fri Sep 30 14:55:11 2011 +0000
Revision:
7:d0f98d61ec4c
Parent:
5:6134277e4d57
Some slight alterations and comment addition

Who changed what in which revision?

UserRevisionLine numberNew 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 7:d0f98d61ec4c 14 pc2.printf("\n\rERROR: Failed to alloc serial buffer size of %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 7:d0f98d61ec4c 81 pc2.printf("\n\rERROR: Serial 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 }