NetServices Stack source

Dependents:   HelloWorld ServoInterfaceBoardExample1 4180_Lab4

Committer:
donatien
Date:
Fri Jun 11 16:05:15 2010 +0000
Revision:
0:632c9925f013
Child:
4:fd826cad83c0

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:632c9925f013 1
donatien 0:632c9925f013 2 /*
donatien 0:632c9925f013 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
donatien 0:632c9925f013 4
donatien 0:632c9925f013 5 Permission is hereby granted, free of charge, to any person obtaining a copy
donatien 0:632c9925f013 6 of this software and associated documentation files (the "Software"), to deal
donatien 0:632c9925f013 7 in the Software without restriction, including without limitation the rights
donatien 0:632c9925f013 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
donatien 0:632c9925f013 9 copies of the Software, and to permit persons to whom the Software is
donatien 0:632c9925f013 10 furnished to do so, subject to the following conditions:
donatien 0:632c9925f013 11
donatien 0:632c9925f013 12 The above copyright notice and this permission notice shall be included in
donatien 0:632c9925f013 13 all copies or substantial portions of the Software.
donatien 0:632c9925f013 14
donatien 0:632c9925f013 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
donatien 0:632c9925f013 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
donatien 0:632c9925f013 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
donatien 0:632c9925f013 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
donatien 0:632c9925f013 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:632c9925f013 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
donatien 0:632c9925f013 21 THE SOFTWARE.
donatien 0:632c9925f013 22 */
donatien 0:632c9925f013 23
donatien 0:632c9925f013 24 #include "SerialBuf.h"
donatien 0:632c9925f013 25 #include "mbed.h"
donatien 0:632c9925f013 26
donatien 0:632c9925f013 27 //#define __DEBUG
donatien 0:632c9925f013 28 #include "dbg/dbg.h"
donatien 0:632c9925f013 29
donatien 0:632c9925f013 30 #include "netCfg.h"
donatien 0:632c9925f013 31 #if NET_GPRS
donatien 0:632c9925f013 32
donatien 0:632c9925f013 33 #if NET_USB_SERIAL
donatien 0:632c9925f013 34 #define m_pStream( a ) (m_pSerial?m_pSerial->a:m_pUsbSerial->a)
donatien 0:632c9925f013 35 #else
donatien 0:632c9925f013 36 #define m_pStream( a ) (m_pSerial->a)
donatien 0:632c9925f013 37 #endif
donatien 0:632c9925f013 38
donatien 0:632c9925f013 39 SerialBuf::SerialBuf(int len) : m_trmt(false), m_pSerial(NULL), m_intCanReadData(true), m_readMode(false) //Buffer length
donatien 0:632c9925f013 40 #if NET_USB_SERIAL
donatien 0:632c9925f013 41 , m_pUsbSerial(NULL)
donatien 0:632c9925f013 42 #endif
donatien 0:632c9925f013 43 {
donatien 0:632c9925f013 44 m_buf = new char[len];
donatien 0:632c9925f013 45 m_bufLen=len;
donatien 0:632c9925f013 46 m_pRead=m_buf;
donatien 0:632c9925f013 47 m_pReadStart=m_buf;
donatien 0:632c9925f013 48 m_pReadByInt=m_buf;
donatien 0:632c9925f013 49 m_pWrite=m_buf;
donatien 0:632c9925f013 50 }
donatien 0:632c9925f013 51
donatien 0:632c9925f013 52 SerialBuf::~SerialBuf()
donatien 0:632c9925f013 53 {
donatien 0:632c9925f013 54 delete[] m_buf;
donatien 0:632c9925f013 55 }
donatien 0:632c9925f013 56
donatien 0:632c9925f013 57 void SerialBuf::attach(Serial* pSerial)
donatien 0:632c9925f013 58 {
donatien 0:632c9925f013 59 m_pSerial = pSerial;
donatien 0:632c9925f013 60 m_pSerial->attach<SerialBuf>(this, &SerialBuf::onSerialInterrupt);
donatien 0:632c9925f013 61 // onSerialInterrupt(); //Flush hw buffer into current buf
donatien 0:632c9925f013 62 }
donatien 0:632c9925f013 63
donatien 0:632c9925f013 64 #if NET_USB_SERIAL
donatien 0:632c9925f013 65 void SerialBuf::attach(UsbSerial* pUsbSerial)
donatien 0:632c9925f013 66 {
donatien 0:632c9925f013 67 m_pUsbSerial = pUsbSerial;
donatien 0:632c9925f013 68 //m_pUsbSerial->attach<SerialBuf>(this, &SerialBuf::onSerialInterrupt);
donatien 0:632c9925f013 69 m_usbTick.attach_us<SerialBuf>(this, &SerialBuf::onSerialInterrupt, 10000);
donatien 0:632c9925f013 70 }
donatien 0:632c9925f013 71 #endif
donatien 0:632c9925f013 72
donatien 0:632c9925f013 73 void SerialBuf::detach()
donatien 0:632c9925f013 74 {
donatien 0:632c9925f013 75 if(m_pSerial)
donatien 0:632c9925f013 76 {
donatien 0:632c9925f013 77 m_pSerial->attach(0);
donatien 0:632c9925f013 78 m_pSerial = NULL;
donatien 0:632c9925f013 79 }
donatien 0:632c9925f013 80 #if NET_USB_SERIAL
donatien 0:632c9925f013 81 else if(m_pUsbSerial)
donatien 0:632c9925f013 82 {
donatien 0:632c9925f013 83 m_usbTick.detach();
donatien 0:632c9925f013 84 m_pUsbSerial = NULL;
donatien 0:632c9925f013 85 }
donatien 0:632c9925f013 86 #endif
donatien 0:632c9925f013 87 }
donatien 0:632c9925f013 88
donatien 0:632c9925f013 89
donatien 0:632c9925f013 90 void SerialBuf::onSerialInterrupt() //Callback from m_pSerial
donatien 0:632c9925f013 91 {
donatien 0:632c9925f013 92 //DBG("\r\n[INT]");
donatien 0:632c9925f013 93 // Timer tmr;
donatien 0:632c9925f013 94 // tmr.start();
donatien 0:632c9925f013 95 // static volatile bool incompleteData = true;
donatien 0:632c9925f013 96 // static volatile char* pLastIntReadPos = m_buf;
donatien 0:632c9925f013 97 if(!(m_pStream(readable())))
donatien 0:632c9925f013 98 {
donatien 0:632c9925f013 99 return;
donatien 0:632c9925f013 100 }
donatien 0:632c9925f013 101 int len=0;
donatien 0:632c9925f013 102 do
donatien 0:632c9925f013 103 {
donatien 0:632c9925f013 104 if(room()>0)
donatien 0:632c9925f013 105 {
donatien 0:632c9925f013 106 len++;
donatien 0:632c9925f013 107 #ifdef __DEBUGVERBOSE
donatien 0:632c9925f013 108 char c = m_pStream(getc());
donatien 0:632c9925f013 109 DBG("\r\n[%c]",c);
donatien 0:632c9925f013 110 put(c);
donatien 0:632c9925f013 111 #else
donatien 0:632c9925f013 112 put(m_pStream(getc()));
donatien 0:632c9925f013 113 #endif
donatien 0:632c9925f013 114 }
donatien 0:632c9925f013 115 else
donatien 0:632c9925f013 116 {
donatien 0:632c9925f013 117 DBG("\r\nWARN: SerialBuf Overrun");
donatien 0:632c9925f013 118 m_pStream(getc());
donatien 0:632c9925f013 119 }
donatien 0:632c9925f013 120 } while(m_pStream(readable()));
donatien 0:632c9925f013 121 // DBG("\r\n[/INT]=*%d*\r\n w len=*%d*",tmr.read_us(),len);
donatien 0:632c9925f013 122
donatien 0:632c9925f013 123 if( m_intCanReadData )
donatien 0:632c9925f013 124 {
donatien 0:632c9925f013 125 volatile bool u_readMode = m_readMode; //Save User context on interrupt
donatien 0:632c9925f013 126 volatile bool handled = onRead();
donatien 0:632c9925f013 127 if(handled)
donatien 0:632c9925f013 128 {
donatien 0:632c9925f013 129 m_pReadByInt = m_pRead;
donatien 0:632c9925f013 130 if(m_pRead==m_pReadStart)
donatien 0:632c9925f013 131 {
donatien 0:632c9925f013 132 //Data has been processed
donatien 0:632c9925f013 133 }
donatien 0:632c9925f013 134 else
donatien 0:632c9925f013 135 {
donatien 0:632c9925f013 136 m_pRead = m_pReadStart;
donatien 0:632c9925f013 137 m_intCanReadData = false;
donatien 0:632c9925f013 138 //Data has to be processed in user space
donatien 0:632c9925f013 139 }
donatien 0:632c9925f013 140 }
donatien 0:632c9925f013 141 setReadMode( u_readMode );
donatien 0:632c9925f013 142 }
donatien 0:632c9925f013 143
donatien 0:632c9925f013 144
donatien 0:632c9925f013 145 #if 0
donatien 0:632c9925f013 146 if( incompleteData || ( pLastIntReadPos != m_pRead ) )
donatien 0:632c9925f013 147 {
donatien 0:632c9925f013 148 bool u_readMode = m_readMode; //Save User context on interrupt
donatien 0:632c9925f013 149 incompleteData = onRead();
donatien 0:632c9925f013 150 if(!incompleteData)
donatien 0:632c9925f013 151 m_pRead = m_pReadStart;
donatien 0:632c9925f013 152 pLastIntReadPos = m_pRead;
donatien 0:632c9925f013 153
donatien 0:632c9925f013 154 }
donatien 0:632c9925f013 155 #endif
donatien 0:632c9925f013 156
donatien 0:632c9925f013 157 }
donatien 0:632c9925f013 158
donatien 0:632c9925f013 159 char SerialBuf::getc()
donatien 0:632c9925f013 160 {
donatien 0:632c9925f013 161 // DBG("\r\n\[GETC]");
donatien 0:632c9925f013 162 #if 0
donatien 0:632c9925f013 163 if(m_trmt) //Was transmitting
donatien 0:632c9925f013 164 {
donatien 0:632c9925f013 165 DBG("\r\n<\r\n");
donatien 0:632c9925f013 166 m_trmt=false;
donatien 0:632c9925f013 167 }
donatien 0:632c9925f013 168 #endif
donatien 0:632c9925f013 169 char c;
donatien 0:632c9925f013 170 c = get();
donatien 0:632c9925f013 171 DBG("%c", c);
donatien 0:632c9925f013 172 // DBG("\r\n[/GETC]");
donatien 0:632c9925f013 173 return c;
donatien 0:632c9925f013 174 }
donatien 0:632c9925f013 175
donatien 0:632c9925f013 176 void SerialBuf::putc(char c)
donatien 0:632c9925f013 177 {
donatien 0:632c9925f013 178 #if 0
donatien 0:632c9925f013 179 if(!m_trmt) //Was receiving
donatien 0:632c9925f013 180 {
donatien 0:632c9925f013 181 DBG("\r\n>\r\n");
donatien 0:632c9925f013 182 m_trmt=true;
donatien 0:632c9925f013 183 }
donatien 0:632c9925f013 184 #endif
donatien 0:632c9925f013 185 // m_pSerial->writeable();
donatien 0:632c9925f013 186 // while(!m_pSerial->writeable() /*|| m_pSerial->readable()*/)
donatien 0:632c9925f013 187 // {
donatien 0:632c9925f013 188 // wait_us(100);
donatien 0:632c9925f013 189 // DBG("\r\nWait...\r\n");
donatien 0:632c9925f013 190 // }
donatien 0:632c9925f013 191 /*
donatien 0:632c9925f013 192 NVIC_DisableIRQ(UART1_IRQn);
donatien 0:632c9925f013 193 NVIC_DisableIRQ(UART2_IRQn);
donatien 0:632c9925f013 194 NVIC_DisableIRQ(UART3_IRQn);
donatien 0:632c9925f013 195 */
donatien 0:632c9925f013 196 // onSerialInterrupt();
donatien 0:632c9925f013 197 m_pStream(putc(c));
donatien 0:632c9925f013 198 /* NVIC_EnableIRQ(UART1_IRQn);
donatien 0:632c9925f013 199 NVIC_EnableIRQ(UART2_IRQn);
donatien 0:632c9925f013 200 NVIC_EnableIRQ(UART3_IRQn);
donatien 0:632c9925f013 201 */
donatien 0:632c9925f013 202 DBG("%c", c);
donatien 0:632c9925f013 203 }
donatien 0:632c9925f013 204
donatien 0:632c9925f013 205 /* Buffer Stuff */
donatien 0:632c9925f013 206
donatien 0:632c9925f013 207 bool SerialBuf::readable()
donatien 0:632c9925f013 208 {
donatien 0:632c9925f013 209 // onSerialInterrupt(); //Flush hw buffer into current buf
donatien 0:632c9925f013 210 // DBG("\r\nLen=%d",len());
donatien 0:632c9925f013 211 return (len()>0);
donatien 0:632c9925f013 212 }
donatien 0:632c9925f013 213
donatien 0:632c9925f013 214 bool SerialBuf::writeable()
donatien 0:632c9925f013 215 {
donatien 0:632c9925f013 216 return m_pStream(writeable());
donatien 0:632c9925f013 217 }
donatien 0:632c9925f013 218
donatien 0:632c9925f013 219 void SerialBuf::setReadMode(bool readMode) //If true, keeps chars in buf when read, false by default
donatien 0:632c9925f013 220 {
donatien 0:632c9925f013 221 if(m_readMode == true && readMode == false)
donatien 0:632c9925f013 222 {
donatien 0:632c9925f013 223 //Trash bytes that have been read
donatien 0:632c9925f013 224 flushRead();
donatien 0:632c9925f013 225 }
donatien 0:632c9925f013 226 m_readMode=readMode;
donatien 0:632c9925f013 227 }
donatien 0:632c9925f013 228
donatien 0:632c9925f013 229 void SerialBuf::flushRead() //Delete chars that have been read (only useful with readMode = true)
donatien 0:632c9925f013 230 {
donatien 0:632c9925f013 231 m_pReadStart = m_pRead;
donatien 0:632c9925f013 232 }
donatien 0:632c9925f013 233
donatien 0:632c9925f013 234 void SerialBuf::resetRead() //Go back to initial read position (only useful with readMode = true)
donatien 0:632c9925f013 235 {
donatien 0:632c9925f013 236 m_pRead = m_pReadStart;
donatien 0:632c9925f013 237 }
donatien 0:632c9925f013 238
donatien 0:632c9925f013 239 bool SerialBuf::onRead()
donatien 0:632c9925f013 240 {
donatien 0:632c9925f013 241 return false;
donatien 0:632c9925f013 242 //Nothing here
donatien 0:632c9925f013 243 }
donatien 0:632c9925f013 244
donatien 0:632c9925f013 245 char SerialBuf::get() //Get a char from buf
donatien 0:632c9925f013 246 {
donatien 0:632c9925f013 247 //WARN: Must call len() before
donatien 0:632c9925f013 248 char c = *m_pRead;
donatien 0:632c9925f013 249 m_pRead++;
donatien 0:632c9925f013 250
donatien 0:632c9925f013 251 if(m_pRead>=m_buf+m_bufLen)
donatien 0:632c9925f013 252 m_pRead=m_buf;
donatien 0:632c9925f013 253
donatien 0:632c9925f013 254 if(!m_readMode) //If readmode=false, trash this char
donatien 0:632c9925f013 255 m_pReadStart=m_pRead;
donatien 0:632c9925f013 256
donatien 0:632c9925f013 257 if(m_pRead==m_pReadByInt) //Next message can be processed by interrupt
donatien 0:632c9925f013 258 m_intCanReadData = true;
donatien 0:632c9925f013 259 /* else if(m_intCanReadData) //Increment this address
donatien 0:632c9925f013 260 m_pReadByInt=m_pRead;*/
donatien 0:632c9925f013 261 return c;
donatien 0:632c9925f013 262 }
donatien 0:632c9925f013 263
donatien 0:632c9925f013 264 void SerialBuf::put(char c) //Put a char in buf
donatien 0:632c9925f013 265 {
donatien 0:632c9925f013 266 //WARN: Must call room() before
donatien 0:632c9925f013 267 *m_pWrite = c;
donatien 0:632c9925f013 268 m_pWrite++;
donatien 0:632c9925f013 269 if(m_pWrite>=m_buf+m_bufLen)
donatien 0:632c9925f013 270 m_pWrite=m_buf;
donatien 0:632c9925f013 271 }
donatien 0:632c9925f013 272
donatien 0:632c9925f013 273 int SerialBuf::room() //Return room available in buf
donatien 0:632c9925f013 274 {
donatien 0:632c9925f013 275 //return m_bufLen - len() - 1; //-1 is to avoid loop
donatien 0:632c9925f013 276 if ( m_pReadStart > m_pWrite )
donatien 0:632c9925f013 277 return ( m_pReadStart - m_pWrite - 1 );
donatien 0:632c9925f013 278 else
donatien 0:632c9925f013 279 return m_bufLen - ( m_pWrite - m_pReadStart ) - 1;
donatien 0:632c9925f013 280 }
donatien 0:632c9925f013 281
donatien 0:632c9925f013 282 int SerialBuf::len() //Return chars length in buf
donatien 0:632c9925f013 283 {
donatien 0:632c9925f013 284 if ( m_pWrite >= m_pRead )
donatien 0:632c9925f013 285 return ( m_pWrite - m_pRead );
donatien 0:632c9925f013 286 else
donatien 0:632c9925f013 287 return m_bufLen - ( m_pRead - m_pWrite ); // = ( ( m_buf + m_bufLen) - m_pRead ) + ( m_pWrite - m_buf )
donatien 0:632c9925f013 288 }
donatien 0:632c9925f013 289
donatien 0:632c9925f013 290 #endif