First step: AutoIP compiled in and working

Dependencies:   mbed

Committer:
darran
Date:
Fri Jun 18 15:54:21 2010 +0000
Revision:
1:4218cacaf696
Parent:
0:55a05330f8cc

        

Who changed what in which revision?

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