This library is stripped down version of NetServices library. HTTP server and client function is NOT supported.

Dependents:   imu-daq-eth

Committer:
idinor
Date:
Wed Jul 20 11:45:39 2011 +0000
Revision:
0:dcf3c92487ca

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
idinor 0:dcf3c92487ca 1
idinor 0:dcf3c92487ca 2 /*
idinor 0:dcf3c92487ca 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
idinor 0:dcf3c92487ca 4
idinor 0:dcf3c92487ca 5 Permission is hereby granted, free of charge, to any person obtaining a copy
idinor 0:dcf3c92487ca 6 of this software and associated documentation files (the "Software"), to deal
idinor 0:dcf3c92487ca 7 in the Software without restriction, including without limitation the rights
idinor 0:dcf3c92487ca 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
idinor 0:dcf3c92487ca 9 copies of the Software, and to permit persons to whom the Software is
idinor 0:dcf3c92487ca 10 furnished to do so, subject to the following conditions:
idinor 0:dcf3c92487ca 11
idinor 0:dcf3c92487ca 12 The above copyright notice and this permission notice shall be included in
idinor 0:dcf3c92487ca 13 all copies or substantial portions of the Software.
idinor 0:dcf3c92487ca 14
idinor 0:dcf3c92487ca 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
idinor 0:dcf3c92487ca 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
idinor 0:dcf3c92487ca 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
idinor 0:dcf3c92487ca 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
idinor 0:dcf3c92487ca 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
idinor 0:dcf3c92487ca 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
idinor 0:dcf3c92487ca 21 THE SOFTWARE.
idinor 0:dcf3c92487ca 22 */
idinor 0:dcf3c92487ca 23
idinor 0:dcf3c92487ca 24 #include "ATIf.h"
idinor 0:dcf3c92487ca 25 #include "mbed.h"
idinor 0:dcf3c92487ca 26 #include <cstdarg>
idinor 0:dcf3c92487ca 27
idinor 0:dcf3c92487ca 28 #define READ_TIMEOUT 100
idinor 0:dcf3c92487ca 29 #define TMP_BUF_SIZE 128//512
idinor 0:dcf3c92487ca 30
idinor 0:dcf3c92487ca 31 #define SERIAL_BUF_LEN 512 //Huge buf needed for PPP (esp. when transferring big data chunks, using TCP)
idinor 0:dcf3c92487ca 32
idinor 0:dcf3c92487ca 33 #define BAUDRATE 9600//9600//115200// 19200
idinor 0:dcf3c92487ca 34
idinor 0:dcf3c92487ca 35 #include "netCfg.h"
idinor 0:dcf3c92487ca 36 #if NET_GPRS
idinor 0:dcf3c92487ca 37
idinor 0:dcf3c92487ca 38 //#define __DEBUG
idinor 0:dcf3c92487ca 39 #include "dbg/dbg.h"
idinor 0:dcf3c92487ca 40
idinor 0:dcf3c92487ca 41 ATIf::ATIf() : SerialBuf(SERIAL_BUF_LEN), m_isOpen(false)//, m_signalsEnable(false), m_isOpen(false), m_pCurrentSignal(NULL), m_signals()
idinor 0:dcf3c92487ca 42 {
idinor 0:dcf3c92487ca 43 DBG("New AT If@%p\n", this);
idinor 0:dcf3c92487ca 44
idinor 0:dcf3c92487ca 45 m_readTimeout = READ_TIMEOUT; //default 1s
idinor 0:dcf3c92487ca 46 //tmpBuf = NULL;
idinor 0:dcf3c92487ca 47 m_lineMode = false;
idinor 0:dcf3c92487ca 48 m_tmpBuf = new char[TMP_BUF_SIZE];
idinor 0:dcf3c92487ca 49 }
idinor 0:dcf3c92487ca 50
idinor 0:dcf3c92487ca 51 ATIf::~ATIf()
idinor 0:dcf3c92487ca 52 {
idinor 0:dcf3c92487ca 53 if(m_tmpBuf)
idinor 0:dcf3c92487ca 54 delete[] m_tmpBuf;
idinor 0:dcf3c92487ca 55 }
idinor 0:dcf3c92487ca 56
idinor 0:dcf3c92487ca 57 int ATIf::printf(const char* format, ... )
idinor 0:dcf3c92487ca 58 {
idinor 0:dcf3c92487ca 59
idinor 0:dcf3c92487ca 60 /*if(!m_tmpBuf)
idinor 0:dcf3c92487ca 61 m_tmpBuf = new char[TMP_BUF_SIZE]; //is it really necessary ??*/
idinor 0:dcf3c92487ca 62 *m_tmpBuf=0;
idinor 0:dcf3c92487ca 63
idinor 0:dcf3c92487ca 64 int len = 0;
idinor 0:dcf3c92487ca 65
idinor 0:dcf3c92487ca 66 //
idinor 0:dcf3c92487ca 67 // flushBuffer();
idinor 0:dcf3c92487ca 68 //wait(1);
idinor 0:dcf3c92487ca 69 //
idinor 0:dcf3c92487ca 70
idinor 0:dcf3c92487ca 71 va_list argp;
idinor 0:dcf3c92487ca 72
idinor 0:dcf3c92487ca 73 va_start(argp, format);
idinor 0:dcf3c92487ca 74 len += vsprintf(m_tmpBuf, format, argp);
idinor 0:dcf3c92487ca 75 va_end(argp);
idinor 0:dcf3c92487ca 76
idinor 0:dcf3c92487ca 77 //DBG("\r\nOutBuf is : %s, mode is %d.", m_tmpBuf, m_lineMode);
idinor 0:dcf3c92487ca 78
idinor 0:dcf3c92487ca 79 int err = write( m_tmpBuf, m_lineMode );
idinor 0:dcf3c92487ca 80 if (err<0)
idinor 0:dcf3c92487ca 81 return 0;
idinor 0:dcf3c92487ca 82
idinor 0:dcf3c92487ca 83 return len;
idinor 0:dcf3c92487ca 84
idinor 0:dcf3c92487ca 85 }
idinor 0:dcf3c92487ca 86
idinor 0:dcf3c92487ca 87 int ATIf::scanf(const char* format, ... )
idinor 0:dcf3c92487ca 88 {
idinor 0:dcf3c92487ca 89 /*if(!m_tmpBuf)
idinor 0:dcf3c92487ca 90 m_tmpBuf = new char[TMP_BUF_SIZE];*/
idinor 0:dcf3c92487ca 91 int err = read( m_tmpBuf, TMP_BUF_SIZE - 1, m_readTimeout, m_lineMode, 1/*Ensure at least one char is read*/ );
idinor 0:dcf3c92487ca 92 if (err<0)
idinor 0:dcf3c92487ca 93 return -1;//EOF
idinor 0:dcf3c92487ca 94
idinor 0:dcf3c92487ca 95 DBG("Scanf'ing:\r\n%s\r\n",m_tmpBuf);
idinor 0:dcf3c92487ca 96
idinor 0:dcf3c92487ca 97 int len = 0;
idinor 0:dcf3c92487ca 98
idinor 0:dcf3c92487ca 99 if(strchr(format,'%')) //Ugly, determines wether format string is null or not
idinor 0:dcf3c92487ca 100 {
idinor 0:dcf3c92487ca 101 va_list argp;
idinor 0:dcf3c92487ca 102
idinor 0:dcf3c92487ca 103 va_start(argp, format);
idinor 0:dcf3c92487ca 104 len += vsscanf(m_tmpBuf, format, argp);
idinor 0:dcf3c92487ca 105 va_end(argp);
idinor 0:dcf3c92487ca 106 }
idinor 0:dcf3c92487ca 107 else //No varargs, call strncmp
idinor 0:dcf3c92487ca 108 {
idinor 0:dcf3c92487ca 109 /* if(strlen(m_tmpBuf) == 0 )
idinor 0:dcf3c92487ca 110 return -1;*/
idinor 0:dcf3c92487ca 111 if( !strncmp(m_tmpBuf, format, strlen(format)) )
idinor 0:dcf3c92487ca 112 {
idinor 0:dcf3c92487ca 113 return 0;
idinor 0:dcf3c92487ca 114 }
idinor 0:dcf3c92487ca 115 else
idinor 0:dcf3c92487ca 116 {
idinor 0:dcf3c92487ca 117 return -1;
idinor 0:dcf3c92487ca 118 }
idinor 0:dcf3c92487ca 119 }
idinor 0:dcf3c92487ca 120
idinor 0:dcf3c92487ca 121 return len;
idinor 0:dcf3c92487ca 122
idinor 0:dcf3c92487ca 123 }
idinor 0:dcf3c92487ca 124
idinor 0:dcf3c92487ca 125 void ATIf::setTimeout(int timeout) //used by scanf
idinor 0:dcf3c92487ca 126 {
idinor 0:dcf3c92487ca 127 m_readTimeout = timeout;
idinor 0:dcf3c92487ca 128 }
idinor 0:dcf3c92487ca 129
idinor 0:dcf3c92487ca 130 void ATIf::setLineMode(bool lineMode) //Switch btw line & raw fns
idinor 0:dcf3c92487ca 131 {
idinor 0:dcf3c92487ca 132 m_lineMode = lineMode;
idinor 0:dcf3c92487ca 133 }
idinor 0:dcf3c92487ca 134
idinor 0:dcf3c92487ca 135 #if 0
idinor 0:dcf3c92487ca 136 void ATIf::setSignals(bool signalsEnable)
idinor 0:dcf3c92487ca 137 {
idinor 0:dcf3c92487ca 138 m_signalsEnable=signalsEnable;
idinor 0:dcf3c92487ca 139 }
idinor 0:dcf3c92487ca 140 #endif
idinor 0:dcf3c92487ca 141
idinor 0:dcf3c92487ca 142 #if 0
idinor 0:dcf3c92487ca 143 template<class T>
idinor 0:dcf3c92487ca 144 void ATIf::attachSignal( const char* sigName, T* pItem, bool (T::*pMethod)(ATIf*, bool, bool*) ) //Attach Signal ("Unsollicited response code" in Telit_AT_Reference_Guide.pdf) to an handler fn
idinor 0:dcf3c92487ca 145 {
idinor 0:dcf3c92487ca 146 ATSigHandler sig(sigName, (ATSigHandler::CDummy*)pItem, (bool (ATSigHandler::CDummy::*)(ATIf*, bool, bool*))pMethod);
idinor 0:dcf3c92487ca 147 m_signals.push_back(sig);
idinor 0:dcf3c92487ca 148 }
idinor 0:dcf3c92487ca 149 #endif
idinor 0:dcf3c92487ca 150
idinor 0:dcf3c92487ca 151 #if 0
idinor 0:dcf3c92487ca 152 void ATIf::detachSignal( const char* sigName )
idinor 0:dcf3c92487ca 153 {
idinor 0:dcf3c92487ca 154 list<ATSigHandler>::iterator it;
idinor 0:dcf3c92487ca 155
idinor 0:dcf3c92487ca 156 for ( it = m_signals.begin(); it != m_signals.end(); it++ )
idinor 0:dcf3c92487ca 157 {
idinor 0:dcf3c92487ca 158 if( !strcmp((*it).m_name,sigName) )
idinor 0:dcf3c92487ca 159 {
idinor 0:dcf3c92487ca 160 m_signals.erase(it);
idinor 0:dcf3c92487ca 161 break;
idinor 0:dcf3c92487ca 162 }
idinor 0:dcf3c92487ca 163 }
idinor 0:dcf3c92487ca 164 }
idinor 0:dcf3c92487ca 165 #endif
idinor 0:dcf3c92487ca 166
idinor 0:dcf3c92487ca 167 ATErr ATIf::open(Serial* pSerial) //Deactivate echo, etc
idinor 0:dcf3c92487ca 168 {
idinor 0:dcf3c92487ca 169 DBG("Opening...\n");
idinor 0:dcf3c92487ca 170 m_isOpen = true; //Must be set so that the serial port-related fns work
idinor 0:dcf3c92487ca 171 //Setup options
idinor 0:dcf3c92487ca 172 // pSerial->baud(BAUDRATE); //FIXME
idinor 0:dcf3c92487ca 173 SerialBuf::attach(pSerial);
idinor 0:dcf3c92487ca 174
idinor 0:dcf3c92487ca 175 setReadMode(false); //Discard chars
idinor 0:dcf3c92487ca 176 setTimeout(1000);
idinor 0:dcf3c92487ca 177 setLineMode(true); //Line Mode
idinor 0:dcf3c92487ca 178
idinor 0:dcf3c92487ca 179 DBG("Trmt...\n");
idinor 0:dcf3c92487ca 180 // printf("AT+IPR=%d", BAUDRATE); //FIXME
idinor 0:dcf3c92487ca 181 printf("ATZ"); //Reset
idinor 0:dcf3c92487ca 182 wait(.100);
idinor 0:dcf3c92487ca 183 printf("ATE"); //Deactivate echo
idinor 0:dcf3c92487ca 184 wait(.500);
idinor 0:dcf3c92487ca 185 flushBuffer();
idinor 0:dcf3c92487ca 186
idinor 0:dcf3c92487ca 187 DBG("ATZ ATE...\n");
idinor 0:dcf3c92487ca 188
idinor 0:dcf3c92487ca 189 int len = writeLine("ATV1");
idinor 0:dcf3c92487ca 190 ATErr err = AT_OK;
idinor 0:dcf3c92487ca 191 if(len<0)
idinor 0:dcf3c92487ca 192 err=(ATErr)len;
idinor 0:dcf3c92487ca 193
idinor 0:dcf3c92487ca 194 if(!err)
idinor 0:dcf3c92487ca 195 {
idinor 0:dcf3c92487ca 196 err = checkOK();
idinor 0:dcf3c92487ca 197 if (err) //No ACK from module
idinor 0:dcf3c92487ca 198 {
idinor 0:dcf3c92487ca 199 DBG("\r\nOpening port, error %d.", err);
idinor 0:dcf3c92487ca 200 if(err==AT_TIMEOUT)
idinor 0:dcf3c92487ca 201 err = AT_NOANSWER;
idinor 0:dcf3c92487ca 202 }
idinor 0:dcf3c92487ca 203 }
idinor 0:dcf3c92487ca 204
idinor 0:dcf3c92487ca 205 if(err)
idinor 0:dcf3c92487ca 206 {
idinor 0:dcf3c92487ca 207 SerialBuf::detach();
idinor 0:dcf3c92487ca 208 m_isOpen = false;
idinor 0:dcf3c92487ca 209 return err;
idinor 0:dcf3c92487ca 210 }
idinor 0:dcf3c92487ca 211
idinor 0:dcf3c92487ca 212 DBG("\r\nNo error.");
idinor 0:dcf3c92487ca 213 #if 0//FIXME
idinor 0:dcf3c92487ca 214 m_signalsEnable = true;
idinor 0:dcf3c92487ca 215 #endif
idinor 0:dcf3c92487ca 216 //FIXME:
idinor 0:dcf3c92487ca 217 // m_pSerial->attach<ATIf>(this, &ATIf::onSerialInterrupt);
idinor 0:dcf3c92487ca 218
idinor 0:dcf3c92487ca 219 return AT_OK;
idinor 0:dcf3c92487ca 220 }
idinor 0:dcf3c92487ca 221
idinor 0:dcf3c92487ca 222 #if NET_USB_SERIAL
idinor 0:dcf3c92487ca 223 ATErr ATIf::open(UsbSerial* pUsbSerial) //Deactivate echo, etc
idinor 0:dcf3c92487ca 224 {
idinor 0:dcf3c92487ca 225 DBG("Opening...\n");
idinor 0:dcf3c92487ca 226 m_isOpen = true; //Must be set so that the serial port-related fns work
idinor 0:dcf3c92487ca 227 //Setup options
idinor 0:dcf3c92487ca 228 SerialBuf::attach(pUsbSerial);
idinor 0:dcf3c92487ca 229
idinor 0:dcf3c92487ca 230 setReadMode(false); //Discard chars
idinor 0:dcf3c92487ca 231 setTimeout(1000);
idinor 0:dcf3c92487ca 232 setLineMode(true); //Line Mode
idinor 0:dcf3c92487ca 233
idinor 0:dcf3c92487ca 234 printf("ATZ"); //Reinit
idinor 0:dcf3c92487ca 235 wait(.500);
idinor 0:dcf3c92487ca 236 //flushBuffer();
idinor 0:dcf3c92487ca 237 // printf("ATE0 ^CURC=0"); //Deactivate echo & notif
idinor 0:dcf3c92487ca 238 printf("ATE0"); //Deactivate echo & notif
idinor 0:dcf3c92487ca 239 wait(.500);
idinor 0:dcf3c92487ca 240 flushBuffer();
idinor 0:dcf3c92487ca 241
idinor 0:dcf3c92487ca 242 DBG("ATZ ATE...\n");
idinor 0:dcf3c92487ca 243
idinor 0:dcf3c92487ca 244 int len = writeLine("ATQ0 V1 S0=0 &C1 &D2 +FCLASS=0");//writeLine("ATQ0 V1 S0=0 &C1 &D2 +FCLASS=0");
idinor 0:dcf3c92487ca 245 ATErr err = AT_OK;
idinor 0:dcf3c92487ca 246 if(len<0)
idinor 0:dcf3c92487ca 247 err=(ATErr)len;
idinor 0:dcf3c92487ca 248
idinor 0:dcf3c92487ca 249 if(!err)
idinor 0:dcf3c92487ca 250 {
idinor 0:dcf3c92487ca 251 err = checkOK();
idinor 0:dcf3c92487ca 252 if (err) //No ACK from module
idinor 0:dcf3c92487ca 253 {
idinor 0:dcf3c92487ca 254 DBG("Opening port, error %d.\n", err);
idinor 0:dcf3c92487ca 255 if(err==AT_TIMEOUT)
idinor 0:dcf3c92487ca 256 err = AT_NOANSWER;
idinor 0:dcf3c92487ca 257 }
idinor 0:dcf3c92487ca 258 }
idinor 0:dcf3c92487ca 259
idinor 0:dcf3c92487ca 260 if(err)
idinor 0:dcf3c92487ca 261 {
idinor 0:dcf3c92487ca 262 SerialBuf::detach();
idinor 0:dcf3c92487ca 263 m_isOpen = false;
idinor 0:dcf3c92487ca 264 return err;
idinor 0:dcf3c92487ca 265 }
idinor 0:dcf3c92487ca 266
idinor 0:dcf3c92487ca 267 DBG("No error.\n");
idinor 0:dcf3c92487ca 268 #if 0//FIXME
idinor 0:dcf3c92487ca 269 m_signalsEnable = true;
idinor 0:dcf3c92487ca 270 #endif
idinor 0:dcf3c92487ca 271 //FIXME:
idinor 0:dcf3c92487ca 272 // m_pSerial->attach<ATIf>(this, &ATIf::onSerialInterrupt);
idinor 0:dcf3c92487ca 273
idinor 0:dcf3c92487ca 274 return AT_OK;
idinor 0:dcf3c92487ca 275 }
idinor 0:dcf3c92487ca 276 #endif
idinor 0:dcf3c92487ca 277
idinor 0:dcf3c92487ca 278 ATErr ATIf::close() //Release port
idinor 0:dcf3c92487ca 279 {
idinor 0:dcf3c92487ca 280 SerialBuf::detach(); //Detach serial buf
idinor 0:dcf3c92487ca 281 m_isOpen = false;
idinor 0:dcf3c92487ca 282 //m_signalsEnable = false;
idinor 0:dcf3c92487ca 283 return AT_OK;
idinor 0:dcf3c92487ca 284 }
idinor 0:dcf3c92487ca 285
idinor 0:dcf3c92487ca 286 ATErr ATIf::flushBuffer()
idinor 0:dcf3c92487ca 287 {
idinor 0:dcf3c92487ca 288 if(!m_isOpen)
idinor 0:dcf3c92487ca 289 return AT_CLOSED;
idinor 0:dcf3c92487ca 290
idinor 0:dcf3c92487ca 291 int len=0;
idinor 0:dcf3c92487ca 292 //char c;
idinor 0:dcf3c92487ca 293 while(readable())
idinor 0:dcf3c92487ca 294 {
idinor 0:dcf3c92487ca 295 //DBG("Readable\n");
idinor 0:dcf3c92487ca 296 /*c =*/ getc();
idinor 0:dcf3c92487ca 297 //DBG("\r\n[%c] discarded.", c);
idinor 0:dcf3c92487ca 298 // wait(0.01);
idinor 0:dcf3c92487ca 299 len++;
idinor 0:dcf3c92487ca 300 }
idinor 0:dcf3c92487ca 301
idinor 0:dcf3c92487ca 302 DBG("\r\n%d chars discarded.", len);
idinor 0:dcf3c92487ca 303
idinor 0:dcf3c92487ca 304 return AT_OK;
idinor 0:dcf3c92487ca 305 }
idinor 0:dcf3c92487ca 306
idinor 0:dcf3c92487ca 307 ATErr ATIf::flushLine(int timeout)
idinor 0:dcf3c92487ca 308 {
idinor 0:dcf3c92487ca 309 if(!m_isOpen)
idinor 0:dcf3c92487ca 310 return AT_CLOSED;
idinor 0:dcf3c92487ca 311
idinor 0:dcf3c92487ca 312 Timer timer;
idinor 0:dcf3c92487ca 313
idinor 0:dcf3c92487ca 314 timer.start();
idinor 0:dcf3c92487ca 315
idinor 0:dcf3c92487ca 316 int len=0;
idinor 0:dcf3c92487ca 317 char c=0;
idinor 0:dcf3c92487ca 318 while(true)
idinor 0:dcf3c92487ca 319 {
idinor 0:dcf3c92487ca 320 while(!readable())
idinor 0:dcf3c92487ca 321 { if(timer.read_ms()>timeout)
idinor 0:dcf3c92487ca 322 {
idinor 0:dcf3c92487ca 323 // DBG("Timeout!!0");
idinor 0:dcf3c92487ca 324 return AT_TIMEOUT;
idinor 0:dcf3c92487ca 325 }
idinor 0:dcf3c92487ca 326 }
idinor 0:dcf3c92487ca 327 if(c=='\x0D')
idinor 0:dcf3c92487ca 328 {
idinor 0:dcf3c92487ca 329 c = getc();
idinor 0:dcf3c92487ca 330 len++;
idinor 0:dcf3c92487ca 331 if(c=='\x0A')
idinor 0:dcf3c92487ca 332 break;
idinor 0:dcf3c92487ca 333 }
idinor 0:dcf3c92487ca 334 else
idinor 0:dcf3c92487ca 335 {
idinor 0:dcf3c92487ca 336 c = getc();
idinor 0:dcf3c92487ca 337 len++;
idinor 0:dcf3c92487ca 338 }
idinor 0:dcf3c92487ca 339 }
idinor 0:dcf3c92487ca 340
idinor 0:dcf3c92487ca 341 // DBG("\r\n%d chars discarded.", len);
idinor 0:dcf3c92487ca 342
idinor 0:dcf3c92487ca 343 return AT_OK;
idinor 0:dcf3c92487ca 344 }
idinor 0:dcf3c92487ca 345
idinor 0:dcf3c92487ca 346 #if 0
idinor 0:dcf3c92487ca 347 bool ATIf::onRead()
idinor 0:dcf3c92487ca 348 {
idinor 0:dcf3c92487ca 349 if(!m_signalsEnable)
idinor 0:dcf3c92487ca 350 return false;
idinor 0:dcf3c92487ca 351
idinor 0:dcf3c92487ca 352 //Save Usermode params
idinor 0:dcf3c92487ca 353 volatile int u_readTimeout = m_readTimeout;
idinor 0:dcf3c92487ca 354 volatile bool u_lineMode = m_lineMode;
idinor 0:dcf3c92487ca 355 // bool u_isOpen = m_isOpen;
idinor 0:dcf3c92487ca 356 SerialBuf::setReadMode(true);
idinor 0:dcf3c92487ca 357
idinor 0:dcf3c92487ca 358 m_readTimeout = 0; //No timeout in an interrupt fn!
idinor 0:dcf3c92487ca 359
idinor 0:dcf3c92487ca 360 bool handled;
idinor 0:dcf3c92487ca 361 if(!!flushLine(0))
idinor 0:dcf3c92487ca 362 {
idinor 0:dcf3c92487ca 363 SerialBuf::resetRead();
idinor 0:dcf3c92487ca 364 //Not a complete line here, wait...
idinor 0:dcf3c92487ca 365 handled = false;
idinor 0:dcf3c92487ca 366 }
idinor 0:dcf3c92487ca 367 else
idinor 0:dcf3c92487ca 368 {
idinor 0:dcf3c92487ca 369 SerialBuf::resetRead();
idinor 0:dcf3c92487ca 370 handled = true;
idinor 0:dcf3c92487ca 371 if( handleSignal() ) //Was that a signal ?
idinor 0:dcf3c92487ca 372 {
idinor 0:dcf3c92487ca 373 //OK, discard data since it has been processed
idinor 0:dcf3c92487ca 374 SerialBuf::flushRead();
idinor 0:dcf3c92487ca 375 }
idinor 0:dcf3c92487ca 376 else
idinor 0:dcf3c92487ca 377 {
idinor 0:dcf3c92487ca 378 //Keep data since it has not been processed yet
idinor 0:dcf3c92487ca 379 //Have to be processed in usermode
idinor 0:dcf3c92487ca 380 SerialBuf::resetRead();
idinor 0:dcf3c92487ca 381 // handled = false;
idinor 0:dcf3c92487ca 382 }
idinor 0:dcf3c92487ca 383 }
idinor 0:dcf3c92487ca 384 //Restore Usermode params
idinor 0:dcf3c92487ca 385 m_readTimeout = u_readTimeout;
idinor 0:dcf3c92487ca 386 m_lineMode = u_lineMode;
idinor 0:dcf3c92487ca 387 //m_isOpen = u_isOpen;
idinor 0:dcf3c92487ca 388 return handled;
idinor 0:dcf3c92487ca 389 }
idinor 0:dcf3c92487ca 390 #endif
idinor 0:dcf3c92487ca 391
idinor 0:dcf3c92487ca 392 ATErr ATIf::rawOpen(Serial* pSerial, int baudrate) //Simple open function for similar non-conforming protocols
idinor 0:dcf3c92487ca 393 {
idinor 0:dcf3c92487ca 394 DBG("\r\nOpening...");
idinor 0:dcf3c92487ca 395 m_isOpen = true; //Must be set so that the serial port-related fns work
idinor 0:dcf3c92487ca 396 //Setup options
idinor 0:dcf3c92487ca 397 pSerial->baud(baudrate);
idinor 0:dcf3c92487ca 398 SerialBuf::attach(pSerial);
idinor 0:dcf3c92487ca 399
idinor 0:dcf3c92487ca 400 return AT_OK;
idinor 0:dcf3c92487ca 401 }
idinor 0:dcf3c92487ca 402
idinor 0:dcf3c92487ca 403 #if 0
idinor 0:dcf3c92487ca 404 ATErr ATIf::command(const char* cmd, char* result, int resultLen, int timeout) ////WARN/FIXME: result has to be long enough!!!
idinor 0:dcf3c92487ca 405 {
idinor 0:dcf3c92487ca 406 if(!m_isOpen)
idinor 0:dcf3c92487ca 407 return AT_CLOSED;
idinor 0:dcf3c92487ca 408
idinor 0:dcf3c92487ca 409 flushBuffer();
idinor 0:dcf3c92487ca 410
idinor 0:dcf3c92487ca 411 int err;
idinor 0:dcf3c92487ca 412 err = writeLine(cmd);
idinor 0:dcf3c92487ca 413
idinor 0:dcf3c92487ca 414 if(err<0)
idinor 0:dcf3c92487ca 415 { m_receiveStatus = AT_READY; return (ATErr)err; }
idinor 0:dcf3c92487ca 416
idinor 0:dcf3c92487ca 417 err = readLine(result, resultLen, timeout);
idinor 0:dcf3c92487ca 418
idinor 0:dcf3c92487ca 419 if(err<0)
idinor 0:dcf3c92487ca 420 { m_receiveStatus = AT_READY; return (ATErr)err; }
idinor 0:dcf3c92487ca 421
idinor 0:dcf3c92487ca 422 m_receiveStatus = AT_READY;
idinor 0:dcf3c92487ca 423
idinor 0:dcf3c92487ca 424 return AT_OK;
idinor 0:dcf3c92487ca 425
idinor 0:dcf3c92487ca 426 }
idinor 0:dcf3c92487ca 427 #endif
idinor 0:dcf3c92487ca 428
idinor 0:dcf3c92487ca 429 ATErr ATIf::write(const char* cmd, bool lineMode /*= false*/)
idinor 0:dcf3c92487ca 430 {
idinor 0:dcf3c92487ca 431 if(!m_isOpen)
idinor 0:dcf3c92487ca 432 return AT_CLOSED;
idinor 0:dcf3c92487ca 433
idinor 0:dcf3c92487ca 434 int err;
idinor 0:dcf3c92487ca 435 err = lineMode ? writeLine(cmd) : writeRaw(cmd);
idinor 0:dcf3c92487ca 436
idinor 0:dcf3c92487ca 437 if(err<0)
idinor 0:dcf3c92487ca 438 return (ATErr)err;
idinor 0:dcf3c92487ca 439
idinor 0:dcf3c92487ca 440 return AT_OK;
idinor 0:dcf3c92487ca 441 }
idinor 0:dcf3c92487ca 442
idinor 0:dcf3c92487ca 443
idinor 0:dcf3c92487ca 444 ATErr ATIf::read(char* result, int resultMaxLen, int timeout, bool lineMode /*= false*/, int resultMinLen/* = 0*/)
idinor 0:dcf3c92487ca 445 {
idinor 0:dcf3c92487ca 446 if(!m_isOpen)
idinor 0:dcf3c92487ca 447 return AT_CLOSED;
idinor 0:dcf3c92487ca 448
idinor 0:dcf3c92487ca 449 int err;
idinor 0:dcf3c92487ca 450 err = lineMode ? readLine(result, resultMaxLen, timeout) : readRaw(result, resultMaxLen, timeout, resultMinLen);
idinor 0:dcf3c92487ca 451
idinor 0:dcf3c92487ca 452 if(err<0)
idinor 0:dcf3c92487ca 453 return (ATErr)err;
idinor 0:dcf3c92487ca 454
idinor 0:dcf3c92487ca 455 return AT_OK;
idinor 0:dcf3c92487ca 456 }
idinor 0:dcf3c92487ca 457
idinor 0:dcf3c92487ca 458 bool ATIf::isOpen()
idinor 0:dcf3c92487ca 459 {
idinor 0:dcf3c92487ca 460 return m_isOpen;
idinor 0:dcf3c92487ca 461 }
idinor 0:dcf3c92487ca 462
idinor 0:dcf3c92487ca 463 ATErr ATIf::checkOK() //Helper fn to quickly check that OK has been returned
idinor 0:dcf3c92487ca 464 {
idinor 0:dcf3c92487ca 465 char ret[16] = {0};
idinor 0:dcf3c92487ca 466 int err = readLine(ret,16,m_readTimeout);
idinor 0:dcf3c92487ca 467
idinor 0:dcf3c92487ca 468 if(err<0)
idinor 0:dcf3c92487ca 469 {
idinor 0:dcf3c92487ca 470 DBG("\r\nError in check (%s).\r\n", ret);
idinor 0:dcf3c92487ca 471 flushBuffer(); //Discard anything in buf to avoid misparsing in the following calls
idinor 0:dcf3c92487ca 472 return (ATErr)err;
idinor 0:dcf3c92487ca 473 }
idinor 0:dcf3c92487ca 474
idinor 0:dcf3c92487ca 475 if(!!strcmp("OK",ret))
idinor 0:dcf3c92487ca 476 {
idinor 0:dcf3c92487ca 477 DBG("\r\nNot an OK <%s>.\r\n", ret);
idinor 0:dcf3c92487ca 478 flushBuffer();
idinor 0:dcf3c92487ca 479 return AT_ERROR;
idinor 0:dcf3c92487ca 480 }
idinor 0:dcf3c92487ca 481
idinor 0:dcf3c92487ca 482 DBG("\r\nCHECK OK\r\n");
idinor 0:dcf3c92487ca 483
idinor 0:dcf3c92487ca 484 return AT_OK;
idinor 0:dcf3c92487ca 485 }
idinor 0:dcf3c92487ca 486
idinor 0:dcf3c92487ca 487 #if 0
idinor 0:dcf3c92487ca 488 void ATIf::onSerialInterrupt() //Callback from m_pSerial
idinor 0:dcf3c92487ca 489 {
idinor 0:dcf3c92487ca 490 return;//FIXME
idinor 0:dcf3c92487ca 491
idinor 0:dcf3c92487ca 492 if(m_receiveStatus == AT_READING)
idinor 0:dcf3c92487ca 493 return;
idinor 0:dcf3c92487ca 494
idinor 0:dcf3c92487ca 495 if( m_cbObj && m_cbMeth )
idinor 0:dcf3c92487ca 496 return (m_cbObj->*m_cbMeth)();
idinor 0:dcf3c92487ca 497 }
idinor 0:dcf3c92487ca 498 #endif
idinor 0:dcf3c92487ca 499
idinor 0:dcf3c92487ca 500 int ATIf::readLine(char* line, int maxLen, int timeout) //Read a single line from serial port, return length or ATErr(<0)
idinor 0:dcf3c92487ca 501 {
idinor 0:dcf3c92487ca 502 #ifdef OLDREADLINE
idinor 0:dcf3c92487ca 503 if(!m_isOpen)
idinor 0:dcf3c92487ca 504 return AT_CLOSED;
idinor 0:dcf3c92487ca 505
idinor 0:dcf3c92487ca 506 int len = 0;
idinor 0:dcf3c92487ca 507
idinor 0:dcf3c92487ca 508 Timer timer;
idinor 0:dcf3c92487ca 509
idinor 0:dcf3c92487ca 510 timer.start();
idinor 0:dcf3c92487ca 511 #ifdef __START_CLRF_MANDAT
idinor 0:dcf3c92487ca 512 for( int i=0; i<2; i++ )
idinor 0:dcf3c92487ca 513 {
idinor 0:dcf3c92487ca 514 while(!readable())
idinor 0:dcf3c92487ca 515 {
idinor 0:dcf3c92487ca 516 if(timer.read_ms()>timeout)
idinor 0:dcf3c92487ca 517 {
idinor 0:dcf3c92487ca 518 // DBG("Timeout!!0");
idinor 0:dcf3c92487ca 519 return AT_TIMEOUT;
idinor 0:dcf3c92487ca 520 }
idinor 0:dcf3c92487ca 521 wait_ms(10); //Wait 10ms
idinor 0:dcf3c92487ca 522 }
idinor 0:dcf3c92487ca 523 *line = getc();
idinor 0:dcf3c92487ca 524 // DBG("In readLine(), read : %c", *line);
idinor 0:dcf3c92487ca 525 if( ( (i == 0) && (*line!='\x0D') )
idinor 0:dcf3c92487ca 526 || ( (i == 1) && (*line!='\x0A') ) )
idinor 0:dcf3c92487ca 527 return AT_PARSE;
idinor 0:dcf3c92487ca 528 }
idinor 0:dcf3c92487ca 529 #else
idinor 0:dcf3c92487ca 530
idinor 0:dcf3c92487ca 531 #endif
idinor 0:dcf3c92487ca 532
idinor 0:dcf3c92487ca 533 for( ; len < maxLen ; len++ )
idinor 0:dcf3c92487ca 534 {
idinor 0:dcf3c92487ca 535 timer.reset();
idinor 0:dcf3c92487ca 536 while(!readable())
idinor 0:dcf3c92487ca 537 {
idinor 0:dcf3c92487ca 538 if(timer.read_ms()>timeout)
idinor 0:dcf3c92487ca 539 {
idinor 0:dcf3c92487ca 540 // DBG("Timeout!!1");
idinor 0:dcf3c92487ca 541 return AT_TIMEOUT;
idinor 0:dcf3c92487ca 542 }
idinor 0:dcf3c92487ca 543 wait_ms(10); //Wait 10ms
idinor 0:dcf3c92487ca 544 }
idinor 0:dcf3c92487ca 545 *line = getc();
idinor 0:dcf3c92487ca 546 //DBG("In readLine(), read : %c", *line);
idinor 0:dcf3c92487ca 547
idinor 0:dcf3c92487ca 548 if(*line=='\x0D')
idinor 0:dcf3c92487ca 549 {
idinor 0:dcf3c92487ca 550 timer.reset();
idinor 0:dcf3c92487ca 551 while(!readable())
idinor 0:dcf3c92487ca 552 {
idinor 0:dcf3c92487ca 553 if(timer.read_ms()>timeout)
idinor 0:dcf3c92487ca 554 {
idinor 0:dcf3c92487ca 555 return AT_TIMEOUT;
idinor 0:dcf3c92487ca 556 }
idinor 0:dcf3c92487ca 557 wait_ms(10); //Wait 1ms
idinor 0:dcf3c92487ca 558 }
idinor 0:dcf3c92487ca 559 *line = getc();
idinor 0:dcf3c92487ca 560 // DBG("In readLine(), read : %c", *line);
idinor 0:dcf3c92487ca 561 if(*line=='\x0A')
idinor 0:dcf3c92487ca 562 {
idinor 0:dcf3c92487ca 563 if(len==0)
idinor 0:dcf3c92487ca 564 {
idinor 0:dcf3c92487ca 565 //Start of line
idinor 0:dcf3c92487ca 566 len--;
idinor 0:dcf3c92487ca 567 continue;
idinor 0:dcf3c92487ca 568 }
idinor 0:dcf3c92487ca 569 else
idinor 0:dcf3c92487ca 570 {
idinor 0:dcf3c92487ca 571 *line=0; //End of line
idinor 0:dcf3c92487ca 572 break;
idinor 0:dcf3c92487ca 573 }
idinor 0:dcf3c92487ca 574 }
idinor 0:dcf3c92487ca 575 else
idinor 0:dcf3c92487ca 576 {
idinor 0:dcf3c92487ca 577 //Should not happen, must have lost some bytes somewhere or non AT protocol
idinor 0:dcf3c92487ca 578 return AT_PARSE;
idinor 0:dcf3c92487ca 579 }
idinor 0:dcf3c92487ca 580 }
idinor 0:dcf3c92487ca 581 line++;
idinor 0:dcf3c92487ca 582 }
idinor 0:dcf3c92487ca 583
idinor 0:dcf3c92487ca 584 if(len==maxLen)
idinor 0:dcf3c92487ca 585 return AT_INCOMPLETE; //Buffer full, must call this method again to get end of line
idinor 0:dcf3c92487ca 586
idinor 0:dcf3c92487ca 587 return len;
idinor 0:dcf3c92487ca 588 #else
idinor 0:dcf3c92487ca 589 if(!m_isOpen)
idinor 0:dcf3c92487ca 590 return AT_CLOSED;
idinor 0:dcf3c92487ca 591
idinor 0:dcf3c92487ca 592 Timer timer;
idinor 0:dcf3c92487ca 593 timer.start();
idinor 0:dcf3c92487ca 594
idinor 0:dcf3c92487ca 595 int len = 0;
idinor 0:dcf3c92487ca 596 while( len < maxLen )
idinor 0:dcf3c92487ca 597 {
idinor 0:dcf3c92487ca 598 timer.reset();
idinor 0:dcf3c92487ca 599 while(!readable())
idinor 0:dcf3c92487ca 600 {
idinor 0:dcf3c92487ca 601 if(timer.read_ms()>timeout)
idinor 0:dcf3c92487ca 602 {
idinor 0:dcf3c92487ca 603 return AT_TIMEOUT;
idinor 0:dcf3c92487ca 604 }
idinor 0:dcf3c92487ca 605 wait_ms(10); //Wait 10ms
idinor 0:dcf3c92487ca 606 }
idinor 0:dcf3c92487ca 607 *line = getc();
idinor 0:dcf3c92487ca 608
idinor 0:dcf3c92487ca 609 if( (*line=='\x0D') || (*line=='\x0A') )
idinor 0:dcf3c92487ca 610 {
idinor 0:dcf3c92487ca 611
idinor 0:dcf3c92487ca 612 if(len==0)
idinor 0:dcf3c92487ca 613 {
idinor 0:dcf3c92487ca 614 //Start of line
idinor 0:dcf3c92487ca 615 continue;
idinor 0:dcf3c92487ca 616 }
idinor 0:dcf3c92487ca 617 else
idinor 0:dcf3c92487ca 618 {
idinor 0:dcf3c92487ca 619 *line=0; //End of line
idinor 0:dcf3c92487ca 620 break;
idinor 0:dcf3c92487ca 621 }
idinor 0:dcf3c92487ca 622 }
idinor 0:dcf3c92487ca 623 len++;
idinor 0:dcf3c92487ca 624 line++;
idinor 0:dcf3c92487ca 625 }
idinor 0:dcf3c92487ca 626
idinor 0:dcf3c92487ca 627 if(len==maxLen)
idinor 0:dcf3c92487ca 628 return AT_INCOMPLETE; //Buffer full, must call this method again to get end of line
idinor 0:dcf3c92487ca 629
idinor 0:dcf3c92487ca 630 return len;
idinor 0:dcf3c92487ca 631 #endif
idinor 0:dcf3c92487ca 632 }
idinor 0:dcf3c92487ca 633
idinor 0:dcf3c92487ca 634 int ATIf::writeLine(const char* line) //Write a single line to serial port
idinor 0:dcf3c92487ca 635 {
idinor 0:dcf3c92487ca 636 // char* line = (char*) _line;
idinor 0:dcf3c92487ca 637 if(!m_isOpen)
idinor 0:dcf3c92487ca 638 return AT_CLOSED;
idinor 0:dcf3c92487ca 639
idinor 0:dcf3c92487ca 640 // DBG("\n\rIn writeline.");
idinor 0:dcf3c92487ca 641
idinor 0:dcf3c92487ca 642 int len = 0;
idinor 0:dcf3c92487ca 643
idinor 0:dcf3c92487ca 644 while(*line)
idinor 0:dcf3c92487ca 645 {
idinor 0:dcf3c92487ca 646 putc(*line);
idinor 0:dcf3c92487ca 647 line++;
idinor 0:dcf3c92487ca 648 len++;
idinor 0:dcf3c92487ca 649 }
idinor 0:dcf3c92487ca 650
idinor 0:dcf3c92487ca 651 /* putc('\r');
idinor 0:dcf3c92487ca 652
idinor 0:dcf3c92487ca 653 putc('\n');*/
idinor 0:dcf3c92487ca 654
idinor 0:dcf3c92487ca 655 putc('\x0D');
idinor 0:dcf3c92487ca 656 // putc('\x0A');
idinor 0:dcf3c92487ca 657
idinor 0:dcf3c92487ca 658 // DBG("\n\rWritten %d + 1", len);
idinor 0:dcf3c92487ca 659
idinor 0:dcf3c92487ca 660 return len;
idinor 0:dcf3c92487ca 661
idinor 0:dcf3c92487ca 662 }
idinor 0:dcf3c92487ca 663
idinor 0:dcf3c92487ca 664
idinor 0:dcf3c92487ca 665
idinor 0:dcf3c92487ca 666 int ATIf::readRaw(char* str, int maxLen, int timeout /*= 0*/, int minLen /*= 0*/) //Read from serial port in buf
idinor 0:dcf3c92487ca 667 {
idinor 0:dcf3c92487ca 668 if(!m_isOpen)
idinor 0:dcf3c92487ca 669 return AT_CLOSED;
idinor 0:dcf3c92487ca 670
idinor 0:dcf3c92487ca 671 int len = 0;
idinor 0:dcf3c92487ca 672
idinor 0:dcf3c92487ca 673 Timer timer;
idinor 0:dcf3c92487ca 674
idinor 0:dcf3c92487ca 675 timer.start();
idinor 0:dcf3c92487ca 676
idinor 0:dcf3c92487ca 677 for( ; len < maxLen ; len++ )
idinor 0:dcf3c92487ca 678 {
idinor 0:dcf3c92487ca 679 while( (len < minLen) && !readable())
idinor 0:dcf3c92487ca 680 {
idinor 0:dcf3c92487ca 681 if(timer.read_ms()>timeout)
idinor 0:dcf3c92487ca 682 {
idinor 0:dcf3c92487ca 683 return AT_TIMEOUT;
idinor 0:dcf3c92487ca 684 }
idinor 0:dcf3c92487ca 685 wait(.01); //Wait 10ms
idinor 0:dcf3c92487ca 686 }
idinor 0:dcf3c92487ca 687
idinor 0:dcf3c92487ca 688 if(!readable()) //Buffer read entirely
idinor 0:dcf3c92487ca 689 break;
idinor 0:dcf3c92487ca 690
idinor 0:dcf3c92487ca 691 *str = getc();
idinor 0:dcf3c92487ca 692 str++;
idinor 0:dcf3c92487ca 693 len++;
idinor 0:dcf3c92487ca 694 }
idinor 0:dcf3c92487ca 695
idinor 0:dcf3c92487ca 696 *str = 0; //End char
idinor 0:dcf3c92487ca 697
idinor 0:dcf3c92487ca 698 return len;
idinor 0:dcf3c92487ca 699
idinor 0:dcf3c92487ca 700 }
idinor 0:dcf3c92487ca 701
idinor 0:dcf3c92487ca 702 int ATIf::writeRaw(const char* str) //Write directly to serial port
idinor 0:dcf3c92487ca 703 {
idinor 0:dcf3c92487ca 704 if(!m_isOpen)
idinor 0:dcf3c92487ca 705 return AT_CLOSED;
idinor 0:dcf3c92487ca 706
idinor 0:dcf3c92487ca 707 int len = 0;
idinor 0:dcf3c92487ca 708
idinor 0:dcf3c92487ca 709 while(*str)
idinor 0:dcf3c92487ca 710 {
idinor 0:dcf3c92487ca 711 putc(*str);
idinor 0:dcf3c92487ca 712 str++;
idinor 0:dcf3c92487ca 713 len++;
idinor 0:dcf3c92487ca 714 }
idinor 0:dcf3c92487ca 715
idinor 0:dcf3c92487ca 716 return len;
idinor 0:dcf3c92487ca 717 }
idinor 0:dcf3c92487ca 718
idinor 0:dcf3c92487ca 719 #if 0
idinor 0:dcf3c92487ca 720 bool ATIf::handleSignal()
idinor 0:dcf3c92487ca 721 {
idinor 0:dcf3c92487ca 722 bool beg = false;
idinor 0:dcf3c92487ca 723
idinor 0:dcf3c92487ca 724 // SerialBuf::setReadMode(true); //Keep chars in buf when read
idinor 0:dcf3c92487ca 725 // SerialBuf::resetRead();
idinor 0:dcf3c92487ca 726
idinor 0:dcf3c92487ca 727 //if( !m_pCurrentSignal ) //If no signal asked for this line
idinor 0:dcf3c92487ca 728 if(true) //Check anyway, could have been some parsing error before
idinor 0:dcf3c92487ca 729 {
idinor 0:dcf3c92487ca 730 //Extract Signal Name
idinor 0:dcf3c92487ca 731 char sigName[32]; //Should not be longer than that
idinor 0:dcf3c92487ca 732 setLineMode(true); //Read one line
idinor 0:dcf3c92487ca 733
idinor 0:dcf3c92487ca 734 int len = scanf("%[^:]:%*[^\n]", sigName);
idinor 0:dcf3c92487ca 735 if(len != 1)
idinor 0:dcf3c92487ca 736 return false; //This is not a signal
idinor 0:dcf3c92487ca 737 // DBG("\r\nGot signal %s\r\n", sigName);
idinor 0:dcf3c92487ca 738
idinor 0:dcf3c92487ca 739 list<ATSigHandler>::iterator it;
idinor 0:dcf3c92487ca 740
idinor 0:dcf3c92487ca 741 for ( it = m_signals.begin(); it != m_signals.end(); it++ )
idinor 0:dcf3c92487ca 742 {
idinor 0:dcf3c92487ca 743 if( !strcmp((*it).m_name, sigName) )
idinor 0:dcf3c92487ca 744 {
idinor 0:dcf3c92487ca 745 // DBG("\r\nFound signal %s\r\n", sigName);
idinor 0:dcf3c92487ca 746 m_pCurrentSignal = &(*it);
idinor 0:dcf3c92487ca 747 beg = true;
idinor 0:dcf3c92487ca 748 break;
idinor 0:dcf3c92487ca 749 }
idinor 0:dcf3c92487ca 750 }
idinor 0:dcf3c92487ca 751
idinor 0:dcf3c92487ca 752
idinor 0:dcf3c92487ca 753 }
idinor 0:dcf3c92487ca 754
idinor 0:dcf3c92487ca 755 if( !m_pCurrentSignal )
idinor 0:dcf3c92487ca 756 return false; //This is not a signal or it cannot be handled
idinor 0:dcf3c92487ca 757
idinor 0:dcf3c92487ca 758 bool moreData = false;
idinor 0:dcf3c92487ca 759 //Call signal handling routine
idinor 0:dcf3c92487ca 760 SerialBuf::resetRead(); //Rollback so that the handling fn can call scanf properly
idinor 0:dcf3c92487ca 761 bool result = ((m_pCurrentSignal->m_cbObj)->*(m_pCurrentSignal->m_cbMeth))(this, beg, &moreData);
idinor 0:dcf3c92487ca 762
idinor 0:dcf3c92487ca 763 if( !moreData ) //Processing completed
idinor 0:dcf3c92487ca 764 {
idinor 0:dcf3c92487ca 765 m_pCurrentSignal = NULL;
idinor 0:dcf3c92487ca 766 }
idinor 0:dcf3c92487ca 767
idinor 0:dcf3c92487ca 768 return result;
idinor 0:dcf3c92487ca 769 }
idinor 0:dcf3c92487ca 770 #endif
idinor 0:dcf3c92487ca 771
idinor 0:dcf3c92487ca 772 #endif