Leest de waarde van een sensor binnen een maakt deze beschikbaar via internet

Dependencies:   NTPClient_NetServices mbed

Committer:
hendrikvincent
Date:
Mon Dec 02 09:01:23 2013 +0000
Revision:
0:05ccbd4f84f1
eerste programma;

Who changed what in which revision?

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