local fork
Dependencies: Socket USBHostWANDongle_bleedingedge lwip-sys lwip
Fork of VodafoneUSBModem_bleedingedge by
Diff: serial/usb/USBSerialStream.cpp
- Revision:
- 10:21a6f09d5631
- Parent:
- 8:04b6a042595f
- Child:
- 22:06fb2a93a1f6
--- a/serial/usb/USBSerialStream.cpp Tue Jun 26 13:44:59 2012 +0000 +++ b/serial/usb/USBSerialStream.cpp Fri Jul 06 08:56:32 2012 +0000 @@ -57,7 +57,8 @@ WARN("Error %d while waiting for incoming data", ret); return ret; } - int readLen = MIN( available(), maxLength ); + int a = available(); //Prevent macro issues + int readLen = MIN( a, maxLength ); *pLength = readLen; setupReadableISR(false); @@ -84,7 +85,7 @@ int ret; if(available()) //Is data already available? { - m_availableSphre.wait(0); //Clear the queue as data is available + while( m_availableSphre.wait(0) > 0 ); //Clear the queue as data is available return OK; } @@ -101,7 +102,7 @@ return NET_INTERRUPTED; } DBG("Finished waiting"); - m_availableSphre.wait(0); //Clear the queue as data is available + while( m_availableSphre.wait(0) > 0 ); //Clear the queue as data is available return OK; } @@ -142,11 +143,12 @@ int ret = waitSpace(timeout); if(ret) { - WARN("Error %d while waiting for space"); + WARN("Error %d while waiting for space", ret); return ret; } - int writeLen = MIN( space(), length ); - DBG("Writing %d chars", length); + int s = space(); //Prevent macro issues + int writeLen = MIN( s, length ); + DBG("Writing %d chars", writeLen); setupWriteableISR(false); while(writeLen) { @@ -155,15 +157,14 @@ length--; writeLen--; } + //If m_serial tx fifo is empty we need to start the packet write + if( m_outBuf.available() && m_serialTxFifoEmpty ) + { + writeable(); + } setupWriteableISR(true); } while(length); - //If m_serial tx fifo is empty we need to start the packet write - setupWriteableISR(false); - if( m_outBuf.available() && m_serialTxFifoEmpty ) - { - writeable(); - } - setupWriteableISR(true); + DBG("Write successful"); return OK; } @@ -181,7 +182,7 @@ int ret; if(space()) //Is still space already left? { - m_spaceSphre.wait(0); //Clear the queue as space is available + while( m_spaceSphre.wait(0) > 0); //Clear the queue as space is available return OK; } @@ -197,7 +198,7 @@ DBG("Aborted"); return NET_INTERRUPTED; } - m_spaceSphre.wait(0); //Clear the queue as space is available + while( m_spaceSphre.wait(0) > 0); //Clear the queue as space is available return OK; } @@ -230,8 +231,10 @@ m_outBuf.dequeue(&c); m_serial.putc((char)c); } - static volatile int i=0; m_serial.writePacket(); //Start packet write } - m_spaceSphre.release(); //Force exiting the waiting state + if(!m_outBuf.isFull()) + { + m_spaceSphre.release(); //Force exiting the waiting state + } }