Michael Spencer / Mbed 2 deprecated LaOS

Dependencies:   mbed

Committer:
Michael J. Spencer
Date:
Wed Mar 05 06:14:02 2014 -0800
Revision:
1:f5ac63519541
Initial commit.

Who changed what in which revision?

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