3G Shield library, port for mbed. (from http://3gsa.org/ ) see: https://developer.mbed.org/users/phsfan/notebook/phsshield/

Dependents:   PHSShield_test PHSShield_connectTCP PHSShield_Twitter PHSShield_httpGET

Committer:
phsfan
Date:
Tue Mar 10 01:12:17 2015 +0000
Revision:
0:ca471c239d5f
1st port for mbed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phsfan 0:ca471c239d5f 1 //***********************************************************
phsfan 0:ca471c239d5f 2 // a3gs.cpp -- IEM 3G Sheild for Arduino Control Library
phsfan 0:ca471c239d5f 3 //
phsfan 0:ca471c239d5f 4 // History:
phsfan 0:ca471c239d5f 5 // R1.0 2012/10/06 1st Release for IEM 3G Shiled(Ver1.0)
phsfan 0:ca471c239d5f 6 // R1.1 2012/10/14 2nd Release(Operate by few memories)
phsfan 0:ca471c239d5f 7 // (modify sendSMS(),onSMSReceived(),httpGET(),httpPOST(),tweet(),connectTCP())
phsfan 0:ca471c239d5f 8 // R1.2 2012/10/28 Bug fix (httpGET(), httpPOST(), tweet(), availableSMS() and redSMS())
phsfan 0:ca471c239d5f 9 // R1.3 2013/01/01 Support "https" in httpGET() and httpPost() [if gw3g version is above 1.1]
phsfan 0:ca471c239d5f 10 // R1.4 2013/04/16 Bug fix (discardUntil() has never return)
phsfan 0:ca471c239d5f 11 // R2.0 2013/07/12 Change interface of TCP/IP and discardUntil()
phsfan 0:ca471c239d5f 12 // some bugs fix(httpPOST, httpGET, read and getResult)
phsfan 0:ca471c239d5f 13 // R2.1 2013/08/17 Buf fix (discardUntil() has never return)
phsfan 0:ca471c239d5f 14 // R2.2 2013/10/27 Bug fix (read(res, reslength))
phsfan 0:ca471c239d5f 15 // R2.3 2014/07/06 Support binary data in read() and add new version read() function, bug fix write()
phsfan 0:ca471c239d5f 16 // R3.0 2014/08/30 Support for gw3g R2.0 and add follow functions:
phsfan 0:ca471c239d5f 17 // setAirplaneMode(), put(), get()
phsfan 0:ca471c239d5f 18 //
phsfan 0:ca471c239d5f 19 // Author:
phsfan 0:ca471c239d5f 20 // 3G Shield Alliance and Atushi Daikoku
phsfan 0:ca471c239d5f 21 //
phsfan 0:ca471c239d5f 22 // Notes:
phsfan 0:ca471c239d5f 23 // Lower compatible with Arduino GSM/GPRS Shield library.
phsfan 0:ca471c239d5f 24 // Notices as bellow:
phsfan 0:ca471c239d5f 25 // - Use SoftwareSerial library (RxD is D4, TxD is D5).
phsfan 0:ca471c239d5f 26 // - Use Interrupt 0(D2) for SMS arrival notification.
phsfan 0:ca471c239d5f 27 // - Use D6 and D7 are used for Power control.
phsfan 0:ca471c239d5f 28 // If You use Leonard, Mega or ADK(Mega2560) then you must change IEM_RXD_PIN and IEM_TXD_PIN for suitable.
phsfan 0:ca471c239d5f 29 //***********************************************************
phsfan 0:ca471c239d5f 30 /* Modified by 2015 phsfan
phsfan 0:ca471c239d5f 31 * for ABIT PHS Shield on mbed
phsfan 0:ca471c239d5f 32 */
phsfan 0:ca471c239d5f 33
phsfan 0:ca471c239d5f 34 //#define DEBUG 1 // Define if you want to debug
phsfan 0:ca471c239d5f 35
phsfan 0:ca471c239d5f 36 #include "mbed.h"
phsfan 0:ca471c239d5f 37 #include "a3gs.h"
phsfan 0:ca471c239d5f 38
phsfan 0:ca471c239d5f 39 // Macros
phsfan 0:ca471c239d5f 40 #ifdef DEBUG
phsfan 0:ca471c239d5f 41 # define DEBUG_PRINT(m,v) { printf("%s:%s\r\n", m, v); }
phsfan 0:ca471c239d5f 42 # define DEBUG_PRINT_NUM(m,v) { printf("%s:%d\r\n", m, v); }
phsfan 0:ca471c239d5f 43 # define DBG(...) printf("" __VA_ARGS__);
phsfan 0:ca471c239d5f 44 #else
phsfan 0:ca471c239d5f 45 # define DEBUG_PRINT(m,v) // do nothing
phsfan 0:ca471c239d5f 46 # define DEBUG_PRINT_NUM(m,v) // do nothing
phsfan 0:ca471c239d5f 47 # define DBG(...)
phsfan 0:ca471c239d5f 48 #endif
phsfan 0:ca471c239d5f 49 // Constants for pins
phsfan 0:ca471c239d5f 50 #define IEM_INT_PIN 2 // D2(INT0)
phsfan 0:ca471c239d5f 51 #define IEM_RXD_PIN 4 // D4(For example,If you use Leonardo or Mega etc. then change to D10..)
phsfan 0:ca471c239d5f 52 #define IEM_TXD_PIN 5 // D5(For example,If you use Leonardo or Mega etc. then change to D11..)
phsfan 0:ca471c239d5f 53 #define IEM_POWER_PIN 6 // D6
phsfan 0:ca471c239d5f 54 #define IEM_REGULATOR_PIN 7 // D7
phsfan 0:ca471c239d5f 55 // Constants for getTime2()
phsfan 0:ca471c239d5f 56 #define SECS_PER_MIN (60UL)
phsfan 0:ca471c239d5f 57 #define SECS_PER_HOUR (3600UL)
phsfan 0:ca471c239d5f 58 #define SECS_PER_DAY (SECS_PER_HOUR * 24UL)
phsfan 0:ca471c239d5f 59 #define DAYS_PER_WEEK (7UL)
phsfan 0:ca471c239d5f 60 #define SECS_YR_2000 (946684800UL) // the time at the start of y2k
phsfan 0:ca471c239d5f 61 // Leap year calulator expects year argument as years offset from 1970
phsfan 0:ca471c239d5f 62 #define LEAP_YEAR(Y) (((1970+Y)>0) && !((1970+Y)%4) && (((1970+Y)%100) || !((1970+Y)%400)))
phsfan 0:ca471c239d5f 63 // Command execution timeout values
phsfan 0:ca471c239d5f 64 #define TIMEOUT_LOCAL 5000 // Timeout value of local functions [mS]
phsfan 0:ca471c239d5f 65 #define TIMEOUT_NETWORK 35000 // Timeout value of communication functions [mS]
phsfan 0:ca471c239d5f 66 #define TIMEOUT_GPS 180000 // Timeout value og GPS locationing [mS]
phsfan 0:ca471c239d5f 67 // Misc.
phsfan 0:ca471c239d5f 68 #define ISDIGIT(c) ((c) >= '0' && (c) <= '9')
phsfan 0:ca471c239d5f 69 // Interrupt number for SMS
phsfan 0:ca471c239d5f 70 #define INTNO_SMS 0 // Use INT0
phsfan 0:ca471c239d5f 71 // IEM Version
phsfan 0:ca471c239d5f 72 #define MIN_IEM_VERSION 2.0 // A necessary minimum IEM version of this library
phsfan 0:ca471c239d5f 73
phsfan 0:ca471c239d5f 74 // Global variables
phsfan 0:ca471c239d5f 75 static char gWorkBuffer[256]; // Buffer for working(Mega..)
phsfan 0:ca471c239d5f 76 static void (*SMShandler)(void); // ISR for SMS Notification
phsfan 0:ca471c239d5f 77
phsfan 0:ca471c239d5f 78
phsfan 0:ca471c239d5f 79 A3GS::A3GS(PinName tx, PinName rx, PinName intin, PinName power, PinName reg, int baud) :
phsfan 0:ca471c239d5f 80 iemSerial(tx, rx), _intin(intin), _power(power), _reg(reg)
phsfan 0:ca471c239d5f 81 {
phsfan 0:ca471c239d5f 82 iemSerial.baud(baud);
phsfan 0:ca471c239d5f 83 _intin.mode(PullDown);
phsfan 0:ca471c239d5f 84 _power = 0;
phsfan 0:ca471c239d5f 85 _reg = 0;
phsfan 0:ca471c239d5f 86 }
phsfan 0:ca471c239d5f 87
phsfan 0:ca471c239d5f 88 //***************************
phsfan 0:ca471c239d5f 89 // begin()
phsfan 0:ca471c239d5f 90 //
phsfan 0:ca471c239d5f 91 // @description
phsfan 0:ca471c239d5f 92 // Begin to use 3G shield function
phsfan 0:ca471c239d5f 93 // @return value
phsfan 0:ca471c239d5f 94 // 0 .. OK(at least, Packet Switch or Circuit Switch is availabled)
phsfan 0:ca471c239d5f 95 // otherwise .. NG
phsfan 0:ca471c239d5f 96 // @param
phsfan 0:ca471c239d5f 97 // pin : Not used
phsfan 0:ca471c239d5f 98 // @note
phsfan 0:ca471c239d5f 99 //
phsfan 0:ca471c239d5f 100 //***************************
phsfan 0:ca471c239d5f 101 int A3GS::begin(char* pin)
phsfan 0:ca471c239d5f 102 {
phsfan 0:ca471c239d5f 103 char version[a3gsMAX_VERSION_LENGTH+1];
phsfan 0:ca471c239d5f 104 //--
phsfan 0:ca471c239d5f 105 DEBUG_PRINT(">begin()", "default");
phsfan 0:ca471c239d5f 106
phsfan 0:ca471c239d5f 107 // Initilalize global variables and detach INT0
phsfan 0:ca471c239d5f 108 _status = IDLE;
phsfan 0:ca471c239d5f 109 SMShandler = NULL;
phsfan 0:ca471c239d5f 110 _intin.fall(NULL);
phsfan 0:ca471c239d5f 111
phsfan 0:ca471c239d5f 112 // Get iem version and check it
phsfan 0:ca471c239d5f 113 if (getVersion(version) != 0)
phsfan 0:ca471c239d5f 114 return 1; // NG -- Can't get version
phsfan 0:ca471c239d5f 115
phsfan 0:ca471c239d5f 116 if (atof(version) < MIN_IEM_VERSION) {
phsfan 0:ca471c239d5f 117 DEBUG_PRINT(">getVersion()", "IEM version is old");
phsfan 0:ca471c239d5f 118 return 2; // NG -- IEM Version is old
phsfan 0:ca471c239d5f 119 }
phsfan 0:ca471c239d5f 120
phsfan 0:ca471c239d5f 121 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 122 }
phsfan 0:ca471c239d5f 123
phsfan 0:ca471c239d5f 124 //***************************
phsfan 0:ca471c239d5f 125 // begin()
phsfan 0:ca471c239d5f 126 //
phsfan 0:ca471c239d5f 127 // @description
phsfan 0:ca471c239d5f 128 // Begin to use 3G shield function
phsfan 0:ca471c239d5f 129 // @return value
phsfan 0:ca471c239d5f 130 // 0 .. OK(at least, Packet Switch or Circuit Switch is availabled)
phsfan 0:ca471c239d5f 131 // otherwise .. NG
phsfan 0:ca471c239d5f 132 // @param
phsfan 0:ca471c239d5f 133 // pin : Not used
phsfan 0:ca471c239d5f 134 // baudrate : baudrate to begin (2400/4800/9600/19200/38400/57600/115200)
phsfan 0:ca471c239d5f 135 // @note
phsfan 0:ca471c239d5f 136 // This function use to specify non-default baudrate.
phsfan 0:ca471c239d5f 137 //***************************
phsfan 0:ca471c239d5f 138 int A3GS::begin(char* pin, uint32_t baudrate)
phsfan 0:ca471c239d5f 139 {
phsfan 0:ca471c239d5f 140 char version[a3gsMAX_VERSION_LENGTH+1];
phsfan 0:ca471c239d5f 141 //--
phsfan 0:ca471c239d5f 142 DEBUG_PRINT_NUM(">begin()", baudrate);
phsfan 0:ca471c239d5f 143
phsfan 0:ca471c239d5f 144 iemSerial.baud(baudrate);
phsfan 0:ca471c239d5f 145
phsfan 0:ca471c239d5f 146 // Initilalize global variables and detach INT0
phsfan 0:ca471c239d5f 147 _status = IDLE;
phsfan 0:ca471c239d5f 148 SMShandler = NULL;
phsfan 0:ca471c239d5f 149 _intin.fall(NULL);
phsfan 0:ca471c239d5f 150
phsfan 0:ca471c239d5f 151 // Get iem version and check it
phsfan 0:ca471c239d5f 152 if (getVersion(version) != 0)
phsfan 0:ca471c239d5f 153 return 1; // NG -- Can't get version
phsfan 0:ca471c239d5f 154
phsfan 0:ca471c239d5f 155 if (atof(version) < MIN_IEM_VERSION) {
phsfan 0:ca471c239d5f 156 DEBUG_PRINT(">getVersion()", "IEM version is old");
phsfan 0:ca471c239d5f 157 return 2; // NG -- IEM Version is old
phsfan 0:ca471c239d5f 158 }
phsfan 0:ca471c239d5f 159
phsfan 0:ca471c239d5f 160 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 161 }
phsfan 0:ca471c239d5f 162
phsfan 0:ca471c239d5f 163 //***************************
phsfan 0:ca471c239d5f 164 // end()
phsfan 0:ca471c239d5f 165 //
phsfan 0:ca471c239d5f 166 // @description
phsfan 0:ca471c239d5f 167 // End to use 3G shield function
phsfan 0:ca471c239d5f 168 // @return value
phsfan 0:ca471c239d5f 169 // 0 .. always
phsfan 0:ca471c239d5f 170 // @param
phsfan 0:ca471c239d5f 171 // none
phsfan 0:ca471c239d5f 172 // @note
phsfan 0:ca471c239d5f 173 // re-enable serial communication, call a3gs.begin()
phsfan 0:ca471c239d5f 174 //***************************
phsfan 0:ca471c239d5f 175 int A3GS::end(void)
phsfan 0:ca471c239d5f 176 {
phsfan 0:ca471c239d5f 177 // Clear interrupt handler
phsfan 0:ca471c239d5f 178 if (SMShandler != NULL) {
phsfan 0:ca471c239d5f 179 _intin.fall(NULL);
phsfan 0:ca471c239d5f 180 SMShandler = NULL;
phsfan 0:ca471c239d5f 181 }
phsfan 0:ca471c239d5f 182
phsfan 0:ca471c239d5f 183 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 184 }
phsfan 0:ca471c239d5f 185
phsfan 0:ca471c239d5f 186 //***************************
phsfan 0:ca471c239d5f 187 // restart()
phsfan 0:ca471c239d5f 188 //
phsfan 0:ca471c239d5f 189 // @description
phsfan 0:ca471c239d5f 190 // Restart 3G shield and clear SMS handler
phsfan 0:ca471c239d5f 191 // @return value
phsfan 0:ca471c239d5f 192 // 0 .. always
phsfan 0:ca471c239d5f 193 // @param
phsfan 0:ca471c239d5f 194 // pin : Not used
phsfan 0:ca471c239d5f 195 // @note
phsfan 0:ca471c239d5f 196 // Reboot time is about 40 Sec.
phsfan 0:ca471c239d5f 197 //***************************
phsfan 0:ca471c239d5f 198 int A3GS::restart(char* pin)
phsfan 0:ca471c239d5f 199 {
phsfan 0:ca471c239d5f 200 // Clear interrupt handler
phsfan 0:ca471c239d5f 201 if (SMShandler != NULL) {
phsfan 0:ca471c239d5f 202 _intin.fall(NULL);
phsfan 0:ca471c239d5f 203 SMShandler = NULL;
phsfan 0:ca471c239d5f 204 }
phsfan 0:ca471c239d5f 205
phsfan 0:ca471c239d5f 206 sendCommand("$YE"); // Send "Reset IEM" Command
phsfan 0:ca471c239d5f 207
phsfan 0:ca471c239d5f 208 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 209 }
phsfan 0:ca471c239d5f 210
phsfan 0:ca471c239d5f 211 //***************************
phsfan 0:ca471c239d5f 212 // start()
phsfan 0:ca471c239d5f 213 //
phsfan 0:ca471c239d5f 214 // @description
phsfan 0:ca471c239d5f 215 // Power on 3G shield and wait for ready to use
phsfan 0:ca471c239d5f 216 // @return value
phsfan 0:ca471c239d5f 217 // 0 .. always
phsfan 0:ca471c239d5f 218 // @param
phsfan 0:ca471c239d5f 219 // pin : Not used
phsfan 0:ca471c239d5f 220 // @note
phsfan 0:ca471c239d5f 221 // Start up time is about 40 Sec.
phsfan 0:ca471c239d5f 222 //***************************
phsfan 0:ca471c239d5f 223 int A3GS::start(char* pin)
phsfan 0:ca471c239d5f 224 {
phsfan 0:ca471c239d5f 225 _reg = 1; // Regulator turn on
phsfan 0:ca471c239d5f 226 wait_ms(1000); // Wait a moment
phsfan 0:ca471c239d5f 227 _power = 0;
phsfan 0:ca471c239d5f 228 wait_ms(2000); // Make low STATUS_PB_WALK -> Turn on IEM
phsfan 0:ca471c239d5f 229 _power = 1;
phsfan 0:ca471c239d5f 230
phsfan 0:ca471c239d5f 231 DEBUG_PRINT(">start()", "Turn on and wait for a moment..");
phsfan 0:ca471c239d5f 232
phsfan 0:ca471c239d5f 233 wait_ms(35000); // Wait for ready IEM
phsfan 0:ca471c239d5f 234 // wait_ms(1000); // Wait for ready IEM
phsfan 0:ca471c239d5f 235
phsfan 0:ca471c239d5f 236 DEBUG_PRINT(">start()", "IEM is available now.");
phsfan 0:ca471c239d5f 237
phsfan 0:ca471c239d5f 238 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 239 }
phsfan 0:ca471c239d5f 240
phsfan 0:ca471c239d5f 241 //***************************
phsfan 0:ca471c239d5f 242 // shutdown()
phsfan 0:ca471c239d5f 243 //
phsfan 0:ca471c239d5f 244 // @description
phsfan 0:ca471c239d5f 245 // Power off 3G shield
phsfan 0:ca471c239d5f 246 // @return value
phsfan 0:ca471c239d5f 247 // 0 .. always
phsfan 0:ca471c239d5f 248 // @param
phsfan 0:ca471c239d5f 249 // none
phsfan 0:ca471c239d5f 250 // @note
phsfan 0:ca471c239d5f 251 // Shutdown time is about 15 Sec.
phsfan 0:ca471c239d5f 252 //***************************
phsfan 0:ca471c239d5f 253 int A3GS::shutdown(void)
phsfan 0:ca471c239d5f 254 {
phsfan 0:ca471c239d5f 255 sendCommand("$YE"); // Send "Reset IEM" Command
phsfan 0:ca471c239d5f 256
phsfan 0:ca471c239d5f 257 wait_ms(15000); // Wait a moment
phsfan 0:ca471c239d5f 258
phsfan 0:ca471c239d5f 259 _reg = 0; // Regulator turn off
phsfan 0:ca471c239d5f 260
phsfan 0:ca471c239d5f 261 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 262 }
phsfan 0:ca471c239d5f 263
phsfan 0:ca471c239d5f 264 //***************************
phsfan 0:ca471c239d5f 265 // getService
phsfan 0:ca471c239d5f 266 //
phsfan 0:ca471c239d5f 267 // @description
phsfan 0:ca471c239d5f 268 // Get network service status
phsfan 0:ca471c239d5f 269 // @return value
phsfan 0:ca471c239d5f 270 // 0 .. Succeeded, otherwise .. Failed
phsfan 0:ca471c239d5f 271 // @param
phsfan 0:ca471c239d5f 272 // status .. [OUT] SRV* (see a3gs.h)
phsfan 0:ca471c239d5f 273 // @note
phsfan 0:ca471c239d5f 274 //
phsfan 0:ca471c239d5f 275 //***************************
phsfan 0:ca471c239d5f 276 int A3GS::getServices(int& status)
phsfan 0:ca471c239d5f 277 {
phsfan 0:ca471c239d5f 278 char responses[12]; // Format "$YS=OK 9" or "$YS=NG errno"
phsfan 0:ca471c239d5f 279 int length = sizeof(responses);
phsfan 0:ca471c239d5f 280 //--
phsfan 0:ca471c239d5f 281 sendCommand("$YS"); // Send "Get Services" command
phsfan 0:ca471c239d5f 282
phsfan 0:ca471c239d5f 283 if (getResult(responses, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 284 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 285
phsfan 0:ca471c239d5f 286 DEBUG_PRINT(">getServices()", responses);
phsfan 0:ca471c239d5f 287
phsfan 0:ca471c239d5f 288 // parse response
phsfan 0:ca471c239d5f 289 switch (responses[7]) {
phsfan 0:ca471c239d5f 290 case '0' : // NO_SRV
phsfan 0:ca471c239d5f 291 status = a3gsSRV_NO;
phsfan 0:ca471c239d5f 292 break;
phsfan 0:ca471c239d5f 293 case '1' : // PS_ONLY
phsfan 0:ca471c239d5f 294 status = a3gsSRV_PS;
phsfan 0:ca471c239d5f 295 break;
phsfan 0:ca471c239d5f 296 case '2' : // CS_ONLY
phsfan 0:ca471c239d5f 297 status = a3gsSRV_CS;
phsfan 0:ca471c239d5f 298 break;
phsfan 0:ca471c239d5f 299 case '3' : // BOTH
phsfan 0:ca471c239d5f 300 status = a3gsSRV_BOTH;
phsfan 0:ca471c239d5f 301 break;
phsfan 0:ca471c239d5f 302 default : // bug
phsfan 0:ca471c239d5f 303 return 1; // NG -- Can't get service
phsfan 0:ca471c239d5f 304 }
phsfan 0:ca471c239d5f 305
phsfan 0:ca471c239d5f 306 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 307 }
phsfan 0:ca471c239d5f 308
phsfan 0:ca471c239d5f 309 //***************************
phsfan 0:ca471c239d5f 310 // getIMEI()
phsfan 0:ca471c239d5f 311 //
phsfan 0:ca471c239d5f 312 // @description
phsfan 0:ca471c239d5f 313 // Get IEM's IMEI
phsfan 0:ca471c239d5f 314 // @return value
phsfan 0:ca471c239d5f 315 // 0 .. Succeeded
phsfan 0:ca471c239d5f 316 // otherwise .. Failed
phsfan 0:ca471c239d5f 317 // @param
phsfan 0:ca471c239d5f 318 // imei : [OUT] IMEI (a3gsIMEI_SIZE bytes space requred)
phsfan 0:ca471c239d5f 319 // @note
phsfan 0:ca471c239d5f 320 //
phsfan 0:ca471c239d5f 321 //***************************
phsfan 0:ca471c239d5f 322 int A3GS::getIMEI(char* imei)
phsfan 0:ca471c239d5f 323 {
phsfan 0:ca471c239d5f 324 char responses[a3gsIMEI_SIZE+10]; // Format "$YI=OK 99..99" or "$YI=NG errno"
phsfan 0:ca471c239d5f 325 int length = sizeof(responses);
phsfan 0:ca471c239d5f 326 //--
phsfan 0:ca471c239d5f 327 sendCommand("$YI"); // Send "Get IMEI" command
phsfan 0:ca471c239d5f 328
phsfan 0:ca471c239d5f 329 if (getResult(responses, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 330 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 331
phsfan 0:ca471c239d5f 332 DEBUG_PRINT(">getIMEI()", responses);
phsfan 0:ca471c239d5f 333
phsfan 0:ca471c239d5f 334 // parse response
phsfan 0:ca471c239d5f 335 if (strncmp(responses, "$YI=OK", 6))
phsfan 0:ca471c239d5f 336 return 1; // NG -- Can't get IMEI
phsfan 0:ca471c239d5f 337
phsfan 0:ca471c239d5f 338 strncpy(imei, responses+7, a3gsIMEI_SIZE);
phsfan 0:ca471c239d5f 339 imei[a3gsIMEI_SIZE] = '\0';
phsfan 0:ca471c239d5f 340
phsfan 0:ca471c239d5f 341 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 342 }
phsfan 0:ca471c239d5f 343
phsfan 0:ca471c239d5f 344 //***************************
phsfan 0:ca471c239d5f 345 // setBaudrate
phsfan 0:ca471c239d5f 346 //
phsfan 0:ca471c239d5f 347 // @description
phsfan 0:ca471c239d5f 348 // Set UART baudrate
phsfan 0:ca471c239d5f 349 // @return value
phsfan 0:ca471c239d5f 350 // 0 .. OK
phsfan 0:ca471c239d5f 351 // 1 .. NG
phsfan 0:ca471c239d5f 352 // @param
phsfan 0:ca471c239d5f 353 // baudrate : baudrate to set (2400/4800/9600/19200/38400/57600/115200)
phsfan 0:ca471c239d5f 354 // @note
phsfan 0:ca471c239d5f 355 // New baudrate will be validated after reset IEM
phsfan 0:ca471c239d5f 356 //***************************
phsfan 0:ca471c239d5f 357 int A3GS::setBaudrate(uint32_t baudrate)
phsfan 0:ca471c239d5f 358 {
phsfan 0:ca471c239d5f 359 char command[13];
phsfan 0:ca471c239d5f 360 char responses[12]; // Format "$YB=OK" or "$YB=NG errno"
phsfan 0:ca471c239d5f 361 int length = sizeof(responses);
phsfan 0:ca471c239d5f 362 //--
phsfan 0:ca471c239d5f 363 switch (baudrate) {
phsfan 0:ca471c239d5f 364 case 2400 :
phsfan 0:ca471c239d5f 365 case 4800 :
phsfan 0:ca471c239d5f 366 case 9600 :
phsfan 0:ca471c239d5f 367 case 19200 :
phsfan 0:ca471c239d5f 368 case 38400 :
phsfan 0:ca471c239d5f 369 case 57600 :
phsfan 0:ca471c239d5f 370 case 115200 :
phsfan 0:ca471c239d5f 371 break;
phsfan 0:ca471c239d5f 372 default :
phsfan 0:ca471c239d5f 373 return 1; // NG -- Bad parameter
phsfan 0:ca471c239d5f 374 }
phsfan 0:ca471c239d5f 375
phsfan 0:ca471c239d5f 376 // Make command and send it
phsfan 0:ca471c239d5f 377 sprintf(command, "$YB %lu", baudrate);
phsfan 0:ca471c239d5f 378 sendCommand(command); // Send "Set Baudrate" command
phsfan 0:ca471c239d5f 379
phsfan 0:ca471c239d5f 380 if (getResult(responses, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 381 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 382
phsfan 0:ca471c239d5f 383 DEBUG_PRINT(">setBaudrate()", responses);
phsfan 0:ca471c239d5f 384
phsfan 0:ca471c239d5f 385 // parse response
phsfan 0:ca471c239d5f 386 if (strncmp(responses, "$YB=OK", 6))
phsfan 0:ca471c239d5f 387 return 1; // NG -- Can't set baudrate
phsfan 0:ca471c239d5f 388
phsfan 0:ca471c239d5f 389 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 390 }
phsfan 0:ca471c239d5f 391
phsfan 0:ca471c239d5f 392 //***************************
phsfan 0:ca471c239d5f 393 // setLED
phsfan 0:ca471c239d5f 394 //
phsfan 0:ca471c239d5f 395 // @description
phsfan 0:ca471c239d5f 396 // Set LED On/Off
phsfan 0:ca471c239d5f 397 // @return value
phsfan 0:ca471c239d5f 398 // 0 .. OK
phsfan 0:ca471c239d5f 399 // 1 .. NG
phsfan 0:ca471c239d5f 400 // @param
phsfan 0:ca471c239d5f 401 // sw : true is On, false is Off
phsfan 0:ca471c239d5f 402 // @note
phsfan 0:ca471c239d5f 403 // There is LED on 3G shield board(named LED1)
phsfan 0:ca471c239d5f 404 //***************************
phsfan 0:ca471c239d5f 405 int A3GS::setLED(bool sw)
phsfan 0:ca471c239d5f 406 {
phsfan 0:ca471c239d5f 407 char command[10];
phsfan 0:ca471c239d5f 408 char responses[12]; // Format "$YL=OK" or "$YL=NG errno"
phsfan 0:ca471c239d5f 409 int length = sizeof(responses);
phsfan 0:ca471c239d5f 410 //--
phsfan 0:ca471c239d5f 411 // Make command and send it
phsfan 0:ca471c239d5f 412 sprintf(command, "$YL %d", (sw ? 1 : 0));
phsfan 0:ca471c239d5f 413 sendCommand(command); // Send "Set LED" command
phsfan 0:ca471c239d5f 414
phsfan 0:ca471c239d5f 415 if (getResult(responses, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 416 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 417
phsfan 0:ca471c239d5f 418 DEBUG_PRINT(">setLED()", responses);
phsfan 0:ca471c239d5f 419
phsfan 0:ca471c239d5f 420 // parse response
phsfan 0:ca471c239d5f 421 if (strncmp(responses, "$YL=OK", 6))
phsfan 0:ca471c239d5f 422 return 1; // NG -- Can't set led
phsfan 0:ca471c239d5f 423
phsfan 0:ca471c239d5f 424 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 425 }
phsfan 0:ca471c239d5f 426
phsfan 0:ca471c239d5f 427 //***************************
phsfan 0:ca471c239d5f 428 // setAirplaneMode
phsfan 0:ca471c239d5f 429 //
phsfan 0:ca471c239d5f 430 // @description
phsfan 0:ca471c239d5f 431 // Set airplane mode
phsfan 0:ca471c239d5f 432 // @return value
phsfan 0:ca471c239d5f 433 // 0 .. OK
phsfan 0:ca471c239d5f 434 // 1 .. NG
phsfan 0:ca471c239d5f 435 // @param
phsfan 0:ca471c239d5f 436 // sw : true is On(Airplane mode), false is Off(Normal mode)
phsfan 0:ca471c239d5f 437 // @note
phsfan 0:ca471c239d5f 438 // R3.0 add
phsfan 0:ca471c239d5f 439 //***************************
phsfan 0:ca471c239d5f 440 int A3GS::setAirplaneMode(bool sw)
phsfan 0:ca471c239d5f 441 {
phsfan 0:ca471c239d5f 442 char command[10];
phsfan 0:ca471c239d5f 443 char responses[12]; // Format "$YP=OK" or "$YP=NG errno"
phsfan 0:ca471c239d5f 444 int length = sizeof(responses);
phsfan 0:ca471c239d5f 445 //--
phsfan 0:ca471c239d5f 446 // Make command and send it
phsfan 0:ca471c239d5f 447 sprintf(command, "$YP %d", (sw ? 1 : 0));
phsfan 0:ca471c239d5f 448 sendCommand(command); // Send "Set Airplane mode" command
phsfan 0:ca471c239d5f 449
phsfan 0:ca471c239d5f 450 if (getResult(responses, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 451 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 452
phsfan 0:ca471c239d5f 453 DEBUG_PRINT(">setAirplaneMode()", responses);
phsfan 0:ca471c239d5f 454
phsfan 0:ca471c239d5f 455 // parse response
phsfan 0:ca471c239d5f 456 if (strncmp(responses, "$YP=OK", 6))
phsfan 0:ca471c239d5f 457 return 1; // NG -- Can't set airplane mode
phsfan 0:ca471c239d5f 458
phsfan 0:ca471c239d5f 459 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 460 }
phsfan 0:ca471c239d5f 461
phsfan 0:ca471c239d5f 462 //***************************
phsfan 0:ca471c239d5f 463 // sendSMS
phsfan 0:ca471c239d5f 464 //
phsfan 0:ca471c239d5f 465 // @description
phsfan 0:ca471c239d5f 466 // send SMS
phsfan 0:ca471c239d5f 467 // @return value
phsfan 0:ca471c239d5f 468 // 0 .. OK
phsfan 0:ca471c239d5f 469 // otherwise .. NG
phsfan 0:ca471c239d5f 470 // @param
phsfan 0:ca471c239d5f 471 // to : MSN(10 digits)
phsfan 0:ca471c239d5f 472 // msg : message string(ASCII or UNICODE)
phsfan 0:ca471c239d5f 473 // encode : message's char set(default is ASCII)
phsfan 0:ca471c239d5f 474 //***************************
phsfan 0:ca471c239d5f 475 int A3GS::sendSMS(const char* to, const char* msg, int encode)
phsfan 0:ca471c239d5f 476 {
phsfan 0:ca471c239d5f 477 char responses[20]; // FORMAT: "$SS=OK" or "$SS=NG errno"
phsfan 0:ca471c239d5f 478 int length = sizeof(responses);
phsfan 0:ca471c239d5f 479 //--
phsfan 0:ca471c239d5f 480 // Check parameter sizes
phsfan 0:ca471c239d5f 481 if (strlen(msg) > a3gsMAX_SMS_LENGTH)
phsfan 0:ca471c239d5f 482 return 1; // NG - too long message
phsfan 0:ca471c239d5f 483 if (strlen(to) > a3gsMAX_MSN_LENGTH)
phsfan 0:ca471c239d5f 484 return 1; // NG - too long msn
phsfan 0:ca471c239d5f 485
phsfan 0:ca471c239d5f 486 // Send comamnd little by little
phsfan 0:ca471c239d5f 487 sendData("$SS ");
phsfan 0:ca471c239d5f 488 sendData(to);
phsfan 0:ca471c239d5f 489 sendData(" \"");
phsfan 0:ca471c239d5f 490 sendData(msg);
phsfan 0:ca471c239d5f 491 sendData("\" ");
phsfan 0:ca471c239d5f 492 if (encode == a3gsCS_UNICODE)
phsfan 0:ca471c239d5f 493 sendCommand("UNICODE");
phsfan 0:ca471c239d5f 494 else
phsfan 0:ca471c239d5f 495 sendCommand("ASCII");
phsfan 0:ca471c239d5f 496
phsfan 0:ca471c239d5f 497 DEBUG_PRINT(">sendSMS", to);
phsfan 0:ca471c239d5f 498
phsfan 0:ca471c239d5f 499 if (getResult(responses, &length, TIMEOUT_NETWORK))
phsfan 0:ca471c239d5f 500 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 501
phsfan 0:ca471c239d5f 502 DEBUG_PRINT(">sendSMS()", responses);
phsfan 0:ca471c239d5f 503
phsfan 0:ca471c239d5f 504 if (strncmp(responses, "$SS=OK", 6))
phsfan 0:ca471c239d5f 505 return 1; // NG -- send error
phsfan 0:ca471c239d5f 506
phsfan 0:ca471c239d5f 507 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 508 }
phsfan 0:ca471c239d5f 509
phsfan 0:ca471c239d5f 510 //***************************
phsfan 0:ca471c239d5f 511 // availableSMS
phsfan 0:ca471c239d5f 512 //
phsfan 0:ca471c239d5f 513 // @description
phsfan 0:ca471c239d5f 514 // Check SMS is available or not
phsfan 0:ca471c239d5f 515 // @return value
phsfan 0:ca471c239d5f 516 // true .. Available
phsfan 0:ca471c239d5f 517 // false .. Not Available
phsfan 0:ca471c239d5f 518 // @param
phsfan 0:ca471c239d5f 519 // none
phsfan 0:ca471c239d5f 520 // @note
phsfan 0:ca471c239d5f 521 //
phsfan 0:ca471c239d5f 522 //***************************
phsfan 0:ca471c239d5f 523 bool A3GS::availableSMS()
phsfan 0:ca471c239d5f 524 {
phsfan 0:ca471c239d5f 525 char responses[20]; // FORMAT: "$SC=OK n" or "$SC=NG errno"
phsfan 0:ca471c239d5f 526 int length = sizeof(responses);
phsfan 0:ca471c239d5f 527 //--
phsfan 0:ca471c239d5f 528 sendCommand("$SC"); // Send "Check SMS" command
phsfan 0:ca471c239d5f 529
phsfan 0:ca471c239d5f 530 if (getResult(responses, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 531 return false; // NG -- maybe timeout
phsfan 0:ca471c239d5f 532
phsfan 0:ca471c239d5f 533 DEBUG_PRINT(">availableSMS()", responses);
phsfan 0:ca471c239d5f 534
phsfan 0:ca471c239d5f 535 if (strncmp(responses, "$SC=OK 1", 8))
phsfan 0:ca471c239d5f 536 return false; // Not available
phsfan 0:ca471c239d5f 537
phsfan 0:ca471c239d5f 538 return true; // Available
phsfan 0:ca471c239d5f 539 }
phsfan 0:ca471c239d5f 540
phsfan 0:ca471c239d5f 541 //***************************
phsfan 0:ca471c239d5f 542 // readSMS
phsfan 0:ca471c239d5f 543 //
phsfan 0:ca471c239d5f 544 // @description
phsfan 0:ca471c239d5f 545 // Read received SMS
phsfan 0:ca471c239d5f 546 // @return value
phsfan 0:ca471c239d5f 547 // 0 .. OK
phsfan 0:ca471c239d5f 548 // otherwise .. NG
phsfan 0:ca471c239d5f 549 // @param
phsfan 0:ca471c239d5f 550 // msg : [OUT] read message string
phsfan 0:ca471c239d5f 551 // msglength : msg length(max a3gsMAX_SMS_LENGTH)
phsfan 0:ca471c239d5f 552 // number : [OUT] MSN
phsfan 0:ca471c239d5f 553 // nlength : MSN length(max a3gsMAX_MSN_LENGTH)
phsfan 0:ca471c239d5f 554 // @note
phsfan 0:ca471c239d5f 555 // Use gWorkBuffer and destory it
phsfan 0:ca471c239d5f 556 //***************************
phsfan 0:ca471c239d5f 557 int A3GS::readSMS(char* msg, int msglength, char* number, int nlength)
phsfan 0:ca471c239d5f 558 {
phsfan 0:ca471c239d5f 559 int length = sizeof(gWorkBuffer);
phsfan 0:ca471c239d5f 560 char *cp;
phsfan 0:ca471c239d5f 561 //--
phsfan 0:ca471c239d5f 562 sendCommand("$SR"); // Send "Read SMS" command
phsfan 0:ca471c239d5f 563
phsfan 0:ca471c239d5f 564 if (getResult(gWorkBuffer, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 565 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 566
phsfan 0:ca471c239d5f 567 if (! strncmp(gWorkBuffer, "$SR=NG", 6))
phsfan 0:ca471c239d5f 568 return 1; // NG -- No SMS
phsfan 0:ca471c239d5f 569
phsfan 0:ca471c239d5f 570 // Parse number(msn)
phsfan 0:ca471c239d5f 571 for (cp = gWorkBuffer+7; *cp != '\0'; cp++) {
phsfan 0:ca471c239d5f 572 while (ISDIGIT(*cp) && nlength-- > 1)
phsfan 0:ca471c239d5f 573 *number++ = *cp++;
phsfan 0:ca471c239d5f 574 *number = '\0';
phsfan 0:ca471c239d5f 575 DEBUG_PRINT(">readSMS() msn", number);
phsfan 0:ca471c239d5f 576 break;
phsfan 0:ca471c239d5f 577 }
phsfan 0:ca471c239d5f 578
phsfan 0:ca471c239d5f 579 // Parse message
phsfan 0:ca471c239d5f 580 for ( ; *cp != '\0'; cp++) {
phsfan 0:ca471c239d5f 581 if (*cp != '\"')
phsfan 0:ca471c239d5f 582 continue; // Skip until "
phsfan 0:ca471c239d5f 583 cp++; // skip "
phsfan 0:ca471c239d5f 584 while (*cp != '\0' && *cp != '\"' && msglength-- > 1)
phsfan 0:ca471c239d5f 585 *msg++ = *cp++;
phsfan 0:ca471c239d5f 586 *msg = '\0';
phsfan 0:ca471c239d5f 587 DEBUG_PRINT(">readSMS() msg", msg);
phsfan 0:ca471c239d5f 588 break;
phsfan 0:ca471c239d5f 589 }
phsfan 0:ca471c239d5f 590
phsfan 0:ca471c239d5f 591 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 592 }
phsfan 0:ca471c239d5f 593
phsfan 0:ca471c239d5f 594 //***************************
phsfan 0:ca471c239d5f 595 // onSMSReceived
phsfan 0:ca471c239d5f 596 //
phsfan 0:ca471c239d5f 597 // @description
phsfan 0:ca471c239d5f 598 // Set call back function when SMS was receieved
phsfan 0:ca471c239d5f 599 // @return value
phsfan 0:ca471c239d5f 600 // 0 .. OK(always)
phsfan 0:ca471c239d5f 601 // @param
phsfan 0:ca471c239d5f 602 // handler : Call back function(Set) or NULL(Cancel)
phsfan 0:ca471c239d5f 603 // @note
phsfan 0:ca471c239d5f 604 // This function use attachInterrupt() and detachInterrupt() with interrupt number 0(D2).
phsfan 0:ca471c239d5f 605 // Interrupt mode is "LOW".
phsfan 0:ca471c239d5f 606 // It is necessary to call onSMSReceived() each time and to set up handler to use continuously.
phsfan 0:ca471c239d5f 607 //***************************
phsfan 0:ca471c239d5f 608 int A3GS::onSMSReceived(void (*handler)(void))
phsfan 0:ca471c239d5f 609 {
phsfan 0:ca471c239d5f 610 if (handler == NULL)
phsfan 0:ca471c239d5f 611 _intin.fall(NULL);
phsfan 0:ca471c239d5f 612 else
phsfan 0:ca471c239d5f 613 _intin.fall(this, &A3GS::handleINT0);
phsfan 0:ca471c239d5f 614
phsfan 0:ca471c239d5f 615 SMShandler = handler;
phsfan 0:ca471c239d5f 616
phsfan 0:ca471c239d5f 617 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 618 }
phsfan 0:ca471c239d5f 619
phsfan 0:ca471c239d5f 620 //***************************
phsfan 0:ca471c239d5f 621 // httpGET
phsfan 0:ca471c239d5f 622 //
phsfan 0:ca471c239d5f 623 // @description
phsfan 0:ca471c239d5f 624 // Request HTTP/GET to server and port
phsfan 0:ca471c239d5f 625 //
phsfan 0:ca471c239d5f 626 // @return value
phsfan 0:ca471c239d5f 627 // 0 .. OK
phsfan 0:ca471c239d5f 628 // otherwise .. NG
phsfan 0:ca471c239d5f 629 // @param
phsfan 0:ca471c239d5f 630 // server : server name(ex. "www,google.com")
phsfan 0:ca471c239d5f 631 // port : port number(ex. 80)
phsfan 0:ca471c239d5f 632 // path : path(ex. service/index.html)
phsfan 0:ca471c239d5f 633 // result : [OUT] responce raw data(no escaped, '\0' terminated)
phsfan 0:ca471c239d5f 634 // resultlength ; "result" size(max MAX_RESULT_LENGTH)
phsfan 0:ca471c239d5f 635 // ssled : if true then use https(SSL), otherwise use http
phsfan 0:ca471c239d5f 636 // @note
phsfan 0:ca471c239d5f 637 // This function is synchronized.
phsfan 0:ca471c239d5f 638 // Support optional parameter "header" since @R3.0
phsfan 0:ca471c239d5f 639 //***************************
phsfan 0:ca471c239d5f 640 int A3GS::httpGET(const char* server, uint16_t port, const char* path, char* result, int resultlength, bool ssled, const char* header)
phsfan 0:ca471c239d5f 641 {
phsfan 0:ca471c239d5f 642 int length = sizeof(gWorkBuffer);
phsfan 0:ca471c239d5f 643 int nbytes;
phsfan 0:ca471c239d5f 644 int c; //@R2.0 Change
phsfan 0:ca471c239d5f 645 //--
phsfan 0:ca471c239d5f 646 // Send command line little by little
phsfan 0:ca471c239d5f 647 if (ssled) {
phsfan 0:ca471c239d5f 648 if (strlen(server) + strlen(path) + 8 > a3gsMAX_URL_LENGTH)
phsfan 0:ca471c239d5f 649 return 1; // NG -- Too long url
phsfan 0:ca471c239d5f 650
phsfan 0:ca471c239d5f 651 sendData("$WG https://");
phsfan 0:ca471c239d5f 652 sendData(server);
phsfan 0:ca471c239d5f 653 if (port != a3gsDEFAULT_PORT) {
phsfan 0:ca471c239d5f 654 char ports[6];
phsfan 0:ca471c239d5f 655 sendData(":");
phsfan 0:ca471c239d5f 656 sprintf(ports, "%u", port);
phsfan 0:ca471c239d5f 657 sendData(ports);
phsfan 0:ca471c239d5f 658 }
phsfan 0:ca471c239d5f 659 }
phsfan 0:ca471c239d5f 660 else {
phsfan 0:ca471c239d5f 661 if (strlen(server) + strlen(path) + 7 > a3gsMAX_URL_LENGTH)
phsfan 0:ca471c239d5f 662 return 1; // NG -- Too long url
phsfan 0:ca471c239d5f 663
phsfan 0:ca471c239d5f 664 sendData("$WG http://");
phsfan 0:ca471c239d5f 665 sendData(server);
phsfan 0:ca471c239d5f 666 if (port != a3gsDEFAULT_PORT) {
phsfan 0:ca471c239d5f 667 char ports[6];
phsfan 0:ca471c239d5f 668 sendData(":");
phsfan 0:ca471c239d5f 669 sprintf(ports, "%u", port);
phsfan 0:ca471c239d5f 670 sendData(ports);
phsfan 0:ca471c239d5f 671 }
phsfan 0:ca471c239d5f 672 }
phsfan 0:ca471c239d5f 673
phsfan 0:ca471c239d5f 674 sendData(path);
phsfan 0:ca471c239d5f 675
phsfan 0:ca471c239d5f 676 // Request with extra header --@R3.0 add
phsfan 0:ca471c239d5f 677 if (header != NULL) {
phsfan 0:ca471c239d5f 678 sendData(" \"");
phsfan 0:ca471c239d5f 679 sendData(header);
phsfan 0:ca471c239d5f 680 sendData("\"");
phsfan 0:ca471c239d5f 681 }
phsfan 0:ca471c239d5f 682
phsfan 0:ca471c239d5f 683 sendCommand(""); // Go HTTP/GET request
phsfan 0:ca471c239d5f 684
phsfan 0:ca471c239d5f 685 DEBUG_PRINT(">httpGET()", "REQ");
phsfan 0:ca471c239d5f 686
phsfan 0:ca471c239d5f 687 if (getResult(gWorkBuffer, &length, TIMEOUT_NETWORK))
phsfan 0:ca471c239d5f 688 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 689
phsfan 0:ca471c239d5f 690 DEBUG_PRINT(">httpGET()", gWorkBuffer);
phsfan 0:ca471c239d5f 691 // result's format: $WG=OK nbytes "response"
phsfan 0:ca471c239d5f 692
phsfan 0:ca471c239d5f 693 // Parse response
phsfan 0:ca471c239d5f 694 if (strncmp(gWorkBuffer, "$WG=OK", 6))
phsfan 0:ca471c239d5f 695 return 1; // NG -- Can't get response
phsfan 0:ca471c239d5f 696
phsfan 0:ca471c239d5f 697 nbytes = atoi(gWorkBuffer + 7);
phsfan 0:ca471c239d5f 698 DEBUG_PRINT_NUM(">httpGET() nbytes", nbytes);
phsfan 0:ca471c239d5f 699
phsfan 0:ca471c239d5f 700 // Copy response body into "result" and set "resultlength"
phsfan 0:ca471c239d5f 701 Timer millis;
phsfan 0:ca471c239d5f 702 millis.start();
phsfan 0:ca471c239d5f 703 for (int n = 0; n < nbytes; n++) {
phsfan 0:ca471c239d5f 704 while (!iemSerial.readable()) {
phsfan 0:ca471c239d5f 705 // Wait until valid response
phsfan 0:ca471c239d5f 706 if (millis.read_ms() >= TIMEOUT_NETWORK)
phsfan 0:ca471c239d5f 707 return 2; // NG -- Timeout
phsfan 0:ca471c239d5f 708 }
phsfan 0:ca471c239d5f 709 c = iemSerial.getc();
phsfan 0:ca471c239d5f 710 if (n < resultlength - 1)
phsfan 0:ca471c239d5f 711 result[n] = c;
phsfan 0:ca471c239d5f 712 }
phsfan 0:ca471c239d5f 713 discardUntil('\n'); // discard last '\n' -- @R2.0 Change
phsfan 0:ca471c239d5f 714 if (nbytes > resultlength - 1) //@R2.0 Change
phsfan 0:ca471c239d5f 715 result[resultlength - 1] = '\0';
phsfan 0:ca471c239d5f 716 else
phsfan 0:ca471c239d5f 717 result[nbytes] = '\0';
phsfan 0:ca471c239d5f 718
phsfan 0:ca471c239d5f 719 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 720 }
phsfan 0:ca471c239d5f 721
phsfan 0:ca471c239d5f 722 //***************************
phsfan 0:ca471c239d5f 723 // httpPOST
phsfan 0:ca471c239d5f 724 //
phsfan 0:ca471c239d5f 725 // @discription
phsfan 0:ca471c239d5f 726 // Request HTTP/POST to server and port
phsfan 0:ca471c239d5f 727 //
phsfan 0:ca471c239d5f 728 // @return value
phsfan 0:ca471c239d5f 729 // 0 .. OK
phsfan 0:ca471c239d5f 730 // otherwise .. NG
phsfan 0:ca471c239d5f 731 // @param
phsfan 0:ca471c239d5f 732 // server : server name(ex. "www,google.com")
phsfan 0:ca471c239d5f 733 // port : port number(ex. 80)
phsfan 0:ca471c239d5f 734 // path : path(ex. service/index.html)
phsfan 0:ca471c239d5f 735 // header : header(without Content-Length, nul terminate, max MAX_HEADER_LENGTH)
phsfan 0:ca471c239d5f 736 // body : request body(nul terminate, max MAX_BODY_LENGTH)
phsfan 0:ca471c239d5f 737 // result : [OUT] responce raw data(no escaped)
phsfan 0:ca471c239d5f 738 // resultlength ; [OUT] "result" size(max MAX_RESULT_LENGTH)
phsfan 0:ca471c239d5f 739 // ssled : if true then use https(SSL), otherwise use http
phsfan 0:ca471c239d5f 740 // @note
phsfan 0:ca471c239d5f 741 // This function is synchronized.
phsfan 0:ca471c239d5f 742 //***************************
phsfan 0:ca471c239d5f 743 int A3GS::httpPOST(const char* server, uint16_t port, const char* path, const char *header, const char *body, char* result, int* resultlength, bool ssled)
phsfan 0:ca471c239d5f 744 {
phsfan 0:ca471c239d5f 745 int length = sizeof(gWorkBuffer);
phsfan 0:ca471c239d5f 746 int nbytes;
phsfan 0:ca471c239d5f 747 int c; //@R2.0 Change
phsfan 0:ca471c239d5f 748 //--
phsfan 0:ca471c239d5f 749 if (strlen(body) > a3gsMAX_BODY_LENGTH)
phsfan 0:ca471c239d5f 750 return 1; // NG -- too long body
phsfan 0:ca471c239d5f 751 if (header != NULL && strlen(header) > a3gsMAX_HEADER_LENGTH)
phsfan 0:ca471c239d5f 752 return 1; // NG -- too long header
phsfan 0:ca471c239d5f 753
phsfan 0:ca471c239d5f 754 // Send command line little by little
phsfan 0:ca471c239d5f 755 if (ssled) {
phsfan 0:ca471c239d5f 756 if (strlen(server) + strlen(path) + 8 > a3gsMAX_URL_LENGTH)
phsfan 0:ca471c239d5f 757 return 1; // NG -- Too long url
phsfan 0:ca471c239d5f 758
phsfan 0:ca471c239d5f 759 sendData("$WP https://");
phsfan 0:ca471c239d5f 760 sendData(server);
phsfan 0:ca471c239d5f 761 if (port != a3gsDEFAULT_PORT) {
phsfan 0:ca471c239d5f 762 char ports[6];
phsfan 0:ca471c239d5f 763 sendData(":");
phsfan 0:ca471c239d5f 764 sprintf(ports, "%u", port);
phsfan 0:ca471c239d5f 765 sendData(ports);
phsfan 0:ca471c239d5f 766 }
phsfan 0:ca471c239d5f 767 }
phsfan 0:ca471c239d5f 768 else {
phsfan 0:ca471c239d5f 769 if (strlen(server) + strlen(path) + 7 > a3gsMAX_URL_LENGTH)
phsfan 0:ca471c239d5f 770 return 1; // NG -- Too long url
phsfan 0:ca471c239d5f 771
phsfan 0:ca471c239d5f 772 sendData("$WP http://");
phsfan 0:ca471c239d5f 773 sendData(server);
phsfan 0:ca471c239d5f 774 if (port != a3gsDEFAULT_PORT) {
phsfan 0:ca471c239d5f 775 char ports[6];
phsfan 0:ca471c239d5f 776 sendData(":");
phsfan 0:ca471c239d5f 777 sprintf(ports, "%u", port);
phsfan 0:ca471c239d5f 778 sendData(ports);
phsfan 0:ca471c239d5f 779 }
phsfan 0:ca471c239d5f 780 }
phsfan 0:ca471c239d5f 781
phsfan 0:ca471c239d5f 782 if (path[0] != '/')
phsfan 0:ca471c239d5f 783 sendData("/"); // for compatiblity old version
phsfan 0:ca471c239d5f 784 sendData(path);
phsfan 0:ca471c239d5f 785
phsfan 0:ca471c239d5f 786 sendData(" \"");
phsfan 0:ca471c239d5f 787
phsfan 0:ca471c239d5f 788 sendData(body);
phsfan 0:ca471c239d5f 789
phsfan 0:ca471c239d5f 790 if (header != NULL && *header != '\0') {
phsfan 0:ca471c239d5f 791 sendData("\" \"");
phsfan 0:ca471c239d5f 792 sendData(header);
phsfan 0:ca471c239d5f 793 }
phsfan 0:ca471c239d5f 794
phsfan 0:ca471c239d5f 795 sendCommand("\""); // Go command
phsfan 0:ca471c239d5f 796
phsfan 0:ca471c239d5f 797 DEBUG_PRINT(">httpPOST()", "REQ");
phsfan 0:ca471c239d5f 798
phsfan 0:ca471c239d5f 799 if (getResult(gWorkBuffer, &length, TIMEOUT_NETWORK))
phsfan 0:ca471c239d5f 800 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 801
phsfan 0:ca471c239d5f 802 DEBUG_PRINT(">httpPOST()", gWorkBuffer);
phsfan 0:ca471c239d5f 803 // result's format: $WP=OK nbytes or $WP=NG errno
phsfan 0:ca471c239d5f 804
phsfan 0:ca471c239d5f 805 // Parse response
phsfan 0:ca471c239d5f 806 if (strncmp(gWorkBuffer, "$WP=OK", 6))
phsfan 0:ca471c239d5f 807 return 1; // NG -- Can't post or get response
phsfan 0:ca471c239d5f 808
phsfan 0:ca471c239d5f 809 nbytes = atoi(gWorkBuffer + 7);
phsfan 0:ca471c239d5f 810 DEBUG_PRINT_NUM(">httpPOST() nbytes", nbytes);
phsfan 0:ca471c239d5f 811
phsfan 0:ca471c239d5f 812 // Copy response body into "result" and set "resultlength"
phsfan 0:ca471c239d5f 813 Timer millis;
phsfan 0:ca471c239d5f 814 millis.start();
phsfan 0:ca471c239d5f 815 for (int n = 0; n < nbytes; n++) {
phsfan 0:ca471c239d5f 816 while (!iemSerial.readable()) {
phsfan 0:ca471c239d5f 817 // Wait until valid response
phsfan 0:ca471c239d5f 818 if (millis.read_ms() >= TIMEOUT_NETWORK)
phsfan 0:ca471c239d5f 819 return 2; // NG -- Timeout
phsfan 0:ca471c239d5f 820 }
phsfan 0:ca471c239d5f 821 c = iemSerial.getc();
phsfan 0:ca471c239d5f 822 if (n < *resultlength - 1)
phsfan 0:ca471c239d5f 823 result[n] = c;
phsfan 0:ca471c239d5f 824 }
phsfan 0:ca471c239d5f 825 discardUntil('\n'); // discard last '\n' -- @R2.0 Change
phsfan 0:ca471c239d5f 826 if (nbytes > *resultlength - 1) //@R2.0 Change
phsfan 0:ca471c239d5f 827 result[*resultlength - 1] = '\0';
phsfan 0:ca471c239d5f 828 else {
phsfan 0:ca471c239d5f 829 result[nbytes] = '\0';
phsfan 0:ca471c239d5f 830 *resultlength = nbytes;
phsfan 0:ca471c239d5f 831 }
phsfan 0:ca471c239d5f 832
phsfan 0:ca471c239d5f 833 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 834 }
phsfan 0:ca471c239d5f 835
phsfan 0:ca471c239d5f 836 //***************************
phsfan 0:ca471c239d5f 837 // tweet
phsfan 0:ca471c239d5f 838 //
phsfan 0:ca471c239d5f 839 // @description
phsfan 0:ca471c239d5f 840 // Tweet a message
phsfan 0:ca471c239d5f 841 //
phsfan 0:ca471c239d5f 842 // @return value
phsfan 0:ca471c239d5f 843 // 0 .. OK
phsfan 0:ca471c239d5f 844 // otherwise .. NG
phsfan 0:ca471c239d5f 845 // @param
phsfan 0:ca471c239d5f 846 // token .. token from http://arduino-tweet.appspot.com/
phsfan 0:ca471c239d5f 847 // msg .. message to tweet(in UTF-8)
phsfan 0:ca471c239d5f 848 // @note
phsfan 0:ca471c239d5f 849 // This function use cloud service on "arduino-tweet.appspot.com".
phsfan 0:ca471c239d5f 850 // Notice from this service:
phsfan 0:ca471c239d5f 851 // - The library uses this site as a proxy server for OAuth stuff. Your tweet may not be applied during maintenance of this site.
phsfan 0:ca471c239d5f 852 // - Please avoid sending more than 1 request per minute not to overload the server.
phsfan 0:ca471c239d5f 853 // - Twitter seems to reject repeated tweets with the same contenet (returns error 403).
phsfan 0:ca471c239d5f 854 // Use gWorkBuffer and destory it
phsfan 0:ca471c239d5f 855
phsfan 0:ca471c239d5f 856 //***************************
phsfan 0:ca471c239d5f 857 int A3GS::tweet(const char* token, const char* msg)
phsfan 0:ca471c239d5f 858 {
phsfan 0:ca471c239d5f 859 int resultlength = sizeof(gWorkBuffer);
phsfan 0:ca471c239d5f 860 //--
phsfan 0:ca471c239d5f 861 if (strlen(msg) > a3gsMAX_TWEET_LENGTH)
phsfan 0:ca471c239d5f 862 return 8; // Too long message. (@@ check by number of characters, not bytes)
phsfan 0:ca471c239d5f 863
phsfan 0:ca471c239d5f 864 sprintf(gWorkBuffer, "token=%s&status=%s", token, msg);
phsfan 0:ca471c239d5f 865
phsfan 0:ca471c239d5f 866 // request POST to http://arduino-tweet.appspot.com
phsfan 0:ca471c239d5f 867 return httpPOST("arduino-tweet.appspot.com", 80, "update", NULL, gWorkBuffer, gWorkBuffer, &resultlength);
phsfan 0:ca471c239d5f 868 }
phsfan 0:ca471c239d5f 869
phsfan 0:ca471c239d5f 870 //***************************
phsfan 0:ca471c239d5f 871 // getTime
phsfan 0:ca471c239d5f 872 //
phsfan 0:ca471c239d5f 873 // @description
phsfan 0:ca471c239d5f 874 // Get current date and time
phsfan 0:ca471c239d5f 875 // @return value
phsfan 0:ca471c239d5f 876 // 0 .. OK
phsfan 0:ca471c239d5f 877 // otherwise .. NG
phsfan 0:ca471c239d5f 878 // @param
phsfan 0:ca471c239d5f 879 // date : [OUT] current date(JST) ("YYYY/MM/DD" format)
phsfan 0:ca471c239d5f 880 // time : [OUT] current time(JST) ("HH:MM:SS" format)
phsfan 0:ca471c239d5f 881 // @note
phsfan 0:ca471c239d5f 882 //
phsfan 0:ca471c239d5f 883 //***************************
phsfan 0:ca471c239d5f 884 int A3GS::getTime(char date[], char time[])
phsfan 0:ca471c239d5f 885 {
phsfan 0:ca471c239d5f 886 char responses[28]; // Format "$YT=OK 2012/03/18 13:28:25"
phsfan 0:ca471c239d5f 887 int length = sizeof(responses);
phsfan 0:ca471c239d5f 888 //--
phsfan 0:ca471c239d5f 889 sendCommand("$YT"); // Send "Get Time" command
phsfan 0:ca471c239d5f 890
phsfan 0:ca471c239d5f 891 if (getResult(responses, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 892 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 893
phsfan 0:ca471c239d5f 894 DEBUG_PRINT(">getTime()", responses);
phsfan 0:ca471c239d5f 895
phsfan 0:ca471c239d5f 896 if (strncmp(responses, "$YT=OK", 6))
phsfan 0:ca471c239d5f 897 return 1; // NG -- Can't get time
phsfan 0:ca471c239d5f 898
phsfan 0:ca471c239d5f 899 // Parse response
phsfan 0:ca471c239d5f 900 strncpy(date, responses + 7, 10);
phsfan 0:ca471c239d5f 901 date[10] = '\0';
phsfan 0:ca471c239d5f 902
phsfan 0:ca471c239d5f 903 strncpy(time, responses + 18, 8);
phsfan 0:ca471c239d5f 904 time[8] = '\0';
phsfan 0:ca471c239d5f 905
phsfan 0:ca471c239d5f 906 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 907 }
phsfan 0:ca471c239d5f 908
phsfan 0:ca471c239d5f 909 //***************************
phsfan 0:ca471c239d5f 910 // getTime2
phsfan 0:ca471c239d5f 911 //
phsfan 0:ca471c239d5f 912 // @description
phsfan 0:ca471c239d5f 913 // Get the current time as seconds since Jan 1 1970
phsfan 0:ca471c239d5f 914 // @return value
phsfan 0:ca471c239d5f 915 // 0 .. OK
phsfan 0:ca471c239d5f 916 // otherwise .. NG
phsfan 0:ca471c239d5f 917 // @param
phsfan 0:ca471c239d5f 918 // seconds : [OUT] Current seconds since Jan 1 1970(JST)
phsfan 0:ca471c239d5f 919 // @noyte
phsfan 0:ca471c239d5f 920 //
phsfan 0:ca471c239d5f 921 //***************************
phsfan 0:ca471c239d5f 922 int A3GS::getTime2(uint32_t& seconds)
phsfan 0:ca471c239d5f 923 {
phsfan 0:ca471c239d5f 924 static const uint8_t monthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
phsfan 0:ca471c239d5f 925 char date[a3gsDATE_SIZE];
phsfan 0:ca471c239d5f 926 char time[a3gsTIME_SIZE];
phsfan 0:ca471c239d5f 927 uint8_t year, month, day, hour, minute, second;
phsfan 0:ca471c239d5f 928 uint32_t t; // total seconds from 1970/01/01 00:00:00
phsfan 0:ca471c239d5f 929 //--
phsfan 0:ca471c239d5f 930 // Get Current Time
phsfan 0:ca471c239d5f 931 if (getTime(date, time) != 0)
phsfan 0:ca471c239d5f 932 return 1; // NG -- can't get time, Failed.
phsfan 0:ca471c239d5f 933
phsfan 0:ca471c239d5f 934 year = atoi(date) - 1970;
phsfan 0:ca471c239d5f 935 month = atoi(date+5);
phsfan 0:ca471c239d5f 936 day = atoi(date+8);
phsfan 0:ca471c239d5f 937 hour = atoi(time);
phsfan 0:ca471c239d5f 938 minute = atoi(time+3);
phsfan 0:ca471c239d5f 939 second = atoi(time+6);
phsfan 0:ca471c239d5f 940
phsfan 0:ca471c239d5f 941 // Seconds from 1970 till 1 jan 00:00:00 of the given year
phsfan 0:ca471c239d5f 942 t = year * (SECS_PER_DAY * 365);
phsfan 0:ca471c239d5f 943 for (int y = 0; y < year; y++) {
phsfan 0:ca471c239d5f 944 if (LEAP_YEAR(y))
phsfan 0:ca471c239d5f 945 t += SECS_PER_DAY; // add extra days for leap years
phsfan 0:ca471c239d5f 946 }
phsfan 0:ca471c239d5f 947
phsfan 0:ca471c239d5f 948 // Add days for this year, months start from 1
phsfan 0:ca471c239d5f 949 for (int m = 1; m < month; m++) {
phsfan 0:ca471c239d5f 950 if ((m == 2) && LEAP_YEAR(year))
phsfan 0:ca471c239d5f 951 t += SECS_PER_DAY * 29;
phsfan 0:ca471c239d5f 952 else
phsfan 0:ca471c239d5f 953 t += SECS_PER_DAY * monthDays[m-1]; //monthDay array starts from 0
phsfan 0:ca471c239d5f 954 }
phsfan 0:ca471c239d5f 955 t += (day - 1) * SECS_PER_DAY;
phsfan 0:ca471c239d5f 956 t += hour * SECS_PER_HOUR;
phsfan 0:ca471c239d5f 957 t += minute * SECS_PER_MIN;
phsfan 0:ca471c239d5f 958 t += second;
phsfan 0:ca471c239d5f 959
phsfan 0:ca471c239d5f 960 seconds = t;
phsfan 0:ca471c239d5f 961
phsfan 0:ca471c239d5f 962 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 963 }
phsfan 0:ca471c239d5f 964
phsfan 0:ca471c239d5f 965 //***************************
phsfan 0:ca471c239d5f 966 // getRSSI
phsfan 0:ca471c239d5f 967 //
phsfan 0:ca471c239d5f 968 // @description
phsfan 0:ca471c239d5f 969 // Get 3G RSSI
phsfan 0:ca471c239d5f 970 // @return value
phsfan 0:ca471c239d5f 971 // 0 .. OK
phsfan 0:ca471c239d5f 972 // 1 .. NG
phsfan 0:ca471c239d5f 973 // @param
phsfan 0:ca471c239d5f 974 // rssi : [OUT] rssi (dBm)
phsfan 0:ca471c239d5f 975 // @note
phsfan 0:ca471c239d5f 976 //
phsfan 0:ca471c239d5f 977 //***************************
phsfan 0:ca471c239d5f 978 int A3GS::getRSSI(int& rssi)
phsfan 0:ca471c239d5f 979 {
phsfan 0:ca471c239d5f 980 char responses[13]; // Format "$YR=OK -999"
phsfan 0:ca471c239d5f 981 int length = sizeof(responses);
phsfan 0:ca471c239d5f 982 //--
phsfan 0:ca471c239d5f 983 sendCommand("$YR"); // Send "Get RSSI" command
phsfan 0:ca471c239d5f 984
phsfan 0:ca471c239d5f 985 if (getResult(responses, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 986 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 987
phsfan 0:ca471c239d5f 988 DEBUG_PRINT(">getRSSI()", responses);
phsfan 0:ca471c239d5f 989
phsfan 0:ca471c239d5f 990 // Parse response
phsfan 0:ca471c239d5f 991 rssi = atoi(responses + 7);
phsfan 0:ca471c239d5f 992
phsfan 0:ca471c239d5f 993 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 994 }
phsfan 0:ca471c239d5f 995
phsfan 0:ca471c239d5f 996 //***************************
phsfan 0:ca471c239d5f 997 // getVersion
phsfan 0:ca471c239d5f 998 //
phsfan 0:ca471c239d5f 999 // @description
phsfan 0:ca471c239d5f 1000 // Get Version
phsfan 0:ca471c239d5f 1001 // @return value
phsfan 0:ca471c239d5f 1002 // 0 .. OK
phsfan 0:ca471c239d5f 1003 // 1 .. NG
phsfan 0:ca471c239d5f 1004 // @param
phsfan 0:ca471c239d5f 1005 // version : [OUT] version ("X.YY")
phsfan 0:ca471c239d5f 1006 // @note
phsfan 0:ca471c239d5f 1007 //
phsfan 0:ca471c239d5f 1008 //***************************
phsfan 0:ca471c239d5f 1009 int A3GS::getVersion(char *version)
phsfan 0:ca471c239d5f 1010 {
phsfan 0:ca471c239d5f 1011 char responses[13]; // Format "$YV=OK 9.99"
phsfan 0:ca471c239d5f 1012 int length = sizeof(responses);
phsfan 0:ca471c239d5f 1013 //--
phsfan 0:ca471c239d5f 1014 sendCommand("$YV"); // Send "Get Version" command
phsfan 0:ca471c239d5f 1015
phsfan 0:ca471c239d5f 1016 if (getResult(responses, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 1017 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 1018
phsfan 0:ca471c239d5f 1019 DEBUG_PRINT(">getVersion()", responses);
phsfan 0:ca471c239d5f 1020
phsfan 0:ca471c239d5f 1021 // Copy version
phsfan 0:ca471c239d5f 1022 strcpy(version, responses + 7);
phsfan 0:ca471c239d5f 1023
phsfan 0:ca471c239d5f 1024 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 1025 }
phsfan 0:ca471c239d5f 1026
phsfan 0:ca471c239d5f 1027 //***************************
phsfan 0:ca471c239d5f 1028 // getLocation
phsfan 0:ca471c239d5f 1029 //
phsfan 0:ca471c239d5f 1030 // @description
phsfan 0:ca471c239d5f 1031 // get Current Location from GPS and Network
phsfan 0:ca471c239d5f 1032 //
phsfan 0:ca471c239d5f 1033 // @return value
phsfan 0:ca471c239d5f 1034 // 0 .. OK
phsfan 0:ca471c239d5f 1035 // 1 .. NG(Bad parameters)
phsfan 0:ca471c239d5f 1036 // otherwise .. NG(Can't locate position..)
phsfan 0:ca471c239d5f 1037 // @param
phsfan 0:ca471c239d5f 1038 // method .. method of locate(a3gsM)
phsfan 0:ca471c239d5f 1039 // latitude .. [OUT] latitude
phsfan 0:ca471c239d5f 1040 // longitude .. [OUT] longitude
phsfan 0:ca471c239d5f 1041 // @note
phsfan 0:ca471c239d5f 1042 // 10-180 Sec. required.
phsfan 0:ca471c239d5f 1043 //***************************
phsfan 0:ca471c239d5f 1044 int A3GS::getLocation(int method, char* latitude, char* longitude)
phsfan 0:ca471c239d5f 1045 {
phsfan 0:ca471c239d5f 1046 char *cp, responses[40]; // Format "$LG=OK lat lng"
phsfan 0:ca471c239d5f 1047 int length = sizeof(responses);
phsfan 0:ca471c239d5f 1048 //--
phsfan 0:ca471c239d5f 1049 *latitude = '\0';
phsfan 0:ca471c239d5f 1050 *longitude = '\0';
phsfan 0:ca471c239d5f 1051
phsfan 0:ca471c239d5f 1052 // Make command and send it
phsfan 0:ca471c239d5f 1053 switch (method) {
phsfan 0:ca471c239d5f 1054 case a3gsMPBASED :
phsfan 0:ca471c239d5f 1055 sendCommand("$LG MSBASED"); // Default is method=MSBASED
phsfan 0:ca471c239d5f 1056 break;
phsfan 0:ca471c239d5f 1057 case a3gsMPASSISTED :
phsfan 0:ca471c239d5f 1058 sendCommand("$LG MSASSISTED");
phsfan 0:ca471c239d5f 1059 break;
phsfan 0:ca471c239d5f 1060 case a3gsMPSTANDALONE :
phsfan 0:ca471c239d5f 1061 sendCommand("$LG STANDALONE");
phsfan 0:ca471c239d5f 1062 break;
phsfan 0:ca471c239d5f 1063 default :
phsfan 0:ca471c239d5f 1064 return 1; // bad method
phsfan 0:ca471c239d5f 1065 }
phsfan 0:ca471c239d5f 1066
phsfan 0:ca471c239d5f 1067 if (getResult(responses, &length, TIMEOUT_GPS))
phsfan 0:ca471c239d5f 1068 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 1069
phsfan 0:ca471c239d5f 1070 DEBUG_PRINT(">getLocation()", responses);
phsfan 0:ca471c239d5f 1071
phsfan 0:ca471c239d5f 1072 // parse response
phsfan 0:ca471c239d5f 1073 if (! strncmp(responses, "$LG=NG", 6))
phsfan 0:ca471c239d5f 1074 return 1; // NG -- Can't locate
phsfan 0:ca471c239d5f 1075
phsfan 0:ca471c239d5f 1076 // Parse lattitude (assume enough space to store latitude)
phsfan 0:ca471c239d5f 1077 for (cp = responses+7; *cp != '\0'; cp++) {
phsfan 0:ca471c239d5f 1078 while (ISDIGIT(*cp) || *cp == '.')
phsfan 0:ca471c239d5f 1079 *latitude++ = *cp++;
phsfan 0:ca471c239d5f 1080 *latitude = '\0';
phsfan 0:ca471c239d5f 1081 DEBUG_PRINT(">getLocation() lat", latitude);
phsfan 0:ca471c239d5f 1082 break;
phsfan 0:ca471c239d5f 1083 }
phsfan 0:ca471c239d5f 1084
phsfan 0:ca471c239d5f 1085 // Skip spaces
phsfan 0:ca471c239d5f 1086 while (*cp != '\0' && ! ISDIGIT(*cp))
phsfan 0:ca471c239d5f 1087 cp++;
phsfan 0:ca471c239d5f 1088
phsfan 0:ca471c239d5f 1089 // Parse longitude (assume enough space to store longitude)
phsfan 0:ca471c239d5f 1090 for ( ; *cp != '\0'; cp++) {
phsfan 0:ca471c239d5f 1091 while (ISDIGIT(*cp) || *cp == '.')
phsfan 0:ca471c239d5f 1092 *longitude++ = *cp++;
phsfan 0:ca471c239d5f 1093 *longitude = '\0';
phsfan 0:ca471c239d5f 1094 DEBUG_PRINT(">getLocation() lng", longitude);
phsfan 0:ca471c239d5f 1095 break;
phsfan 0:ca471c239d5f 1096 }
phsfan 0:ca471c239d5f 1097
phsfan 0:ca471c239d5f 1098 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 1099 }
phsfan 0:ca471c239d5f 1100
phsfan 0:ca471c239d5f 1101 //***************************
phsfan 0:ca471c239d5f 1102 // setDefaultProfile
phsfan 0:ca471c239d5f 1103 //
phsfan 0:ca471c239d5f 1104 // @description
phsfan 0:ca471c239d5f 1105 // Set default profile(APN) number
phsfan 0:ca471c239d5f 1106 // @return value
phsfan 0:ca471c239d5f 1107 // 0 .. OK
phsfan 0:ca471c239d5f 1108 // 1 .. NG(Bad parameters)
phsfan 0:ca471c239d5f 1109 // @param
phsfan 0:ca471c239d5f 1110 // profileNum : profile number(1..a3gsMAX_PROFILE_NUMBER)
phsfan 0:ca471c239d5f 1111 // @note
phsfan 0:ca471c239d5f 1112 //
phsfan 0:ca471c239d5f 1113 //***************************
phsfan 0:ca471c239d5f 1114 int A3GS::setDefaultProfile(int profileNum)
phsfan 0:ca471c239d5f 1115 {
phsfan 0:ca471c239d5f 1116 char responses[20]; // Format "$PS=OK"
phsfan 0:ca471c239d5f 1117 char commands[20]; // Format "$PS 99"
phsfan 0:ca471c239d5f 1118 int length = sizeof(responses);
phsfan 0:ca471c239d5f 1119 //--
phsfan 0:ca471c239d5f 1120 if (profileNum < 1 || a3gsMAX_PROFILE_NUMBER < profileNum)
phsfan 0:ca471c239d5f 1121 return 1; // NG -- Bad parameter
phsfan 0:ca471c239d5f 1122
phsfan 0:ca471c239d5f 1123 sprintf(commands, "$PS %d", profileNum);
phsfan 0:ca471c239d5f 1124 sendCommand(commands); // Send "Set Profile" command
phsfan 0:ca471c239d5f 1125
phsfan 0:ca471c239d5f 1126 if (getResult(responses, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 1127 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 1128
phsfan 0:ca471c239d5f 1129 DEBUG_PRINT(">setDefaultProfile()", responses);
phsfan 0:ca471c239d5f 1130
phsfan 0:ca471c239d5f 1131 // parse response
phsfan 0:ca471c239d5f 1132 if (! strncmp(responses, "$PS=NG", 6))
phsfan 0:ca471c239d5f 1133 return 1; // NG -- Can't set prfoile number
phsfan 0:ca471c239d5f 1134
phsfan 0:ca471c239d5f 1135 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 1136 }
phsfan 0:ca471c239d5f 1137
phsfan 0:ca471c239d5f 1138 //***************************
phsfan 0:ca471c239d5f 1139 // getDefaultProfile
phsfan 0:ca471c239d5f 1140 //
phsfan 0:ca471c239d5f 1141 // @description
phsfan 0:ca471c239d5f 1142 // Get default profile(APN) number
phsfan 0:ca471c239d5f 1143 // @return value
phsfan 0:ca471c239d5f 1144 // 0 .. OK
phsfan 0:ca471c239d5f 1145 // 1 .. NG
phsfan 0:ca471c239d5f 1146 // @param
phsfan 0:ca471c239d5f 1147 // profileNum : [OUT] profile number(1..a3gsMAX_PROFILE_NUMBER)
phsfan 0:ca471c239d5f 1148 // @note
phsfan 0:ca471c239d5f 1149 //
phsfan 0:ca471c239d5f 1150 //***************************
phsfan 0:ca471c239d5f 1151 int A3GS::getDefaultProfile(int* profileNum)
phsfan 0:ca471c239d5f 1152 {
phsfan 0:ca471c239d5f 1153 char responses[20]; // Format "$PR=OK 99\n"
phsfan 0:ca471c239d5f 1154 int length = sizeof(responses);
phsfan 0:ca471c239d5f 1155 //--
phsfan 0:ca471c239d5f 1156 sendCommand("$PR"); // Send "Read Profile" command
phsfan 0:ca471c239d5f 1157
phsfan 0:ca471c239d5f 1158 if (getResult(responses, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 1159 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 1160
phsfan 0:ca471c239d5f 1161 DEBUG_PRINT(">getDefaultProfile()", responses);
phsfan 0:ca471c239d5f 1162
phsfan 0:ca471c239d5f 1163 // parse response
phsfan 0:ca471c239d5f 1164 *profileNum = atoi(responses + 7);
phsfan 0:ca471c239d5f 1165
phsfan 0:ca471c239d5f 1166 return a3gsSUCCESS; // Succeeded
phsfan 0:ca471c239d5f 1167 }
phsfan 0:ca471c239d5f 1168
phsfan 0:ca471c239d5f 1169 //***************************
phsfan 0:ca471c239d5f 1170 // connectTCP
phsfan 0:ca471c239d5f 1171 //
phsfan 0:ca471c239d5f 1172 // @description
phsfan 0:ca471c239d5f 1173 // Connect to server with TCP/IP connection
phsfan 0:ca471c239d5f 1174 // @return value
phsfan 0:ca471c239d5f 1175 // 0 .. OK
phsfan 0:ca471c239d5f 1176 // 1 .. NG
phsfan 0:ca471c239d5f 1177 // @param
phsfan 0:ca471c239d5f 1178 // server : server name or IP address(ex. "www,google.com", "192.161.10.1")
phsfan 0:ca471c239d5f 1179 // port : port number(ex. 80)
phsfan 0:ca471c239d5f 1180 // @note
phsfan 0:ca471c239d5f 1181 //
phsfan 0:ca471c239d5f 1182 //***************************
phsfan 0:ca471c239d5f 1183 int A3GS::connectTCP(const char* server, int port)
phsfan 0:ca471c239d5f 1184 {
phsfan 0:ca471c239d5f 1185 char responses[30]; // FORMAT: "$TC=OK\n" or "$TC=NG errno [info]\n"
phsfan 0:ca471c239d5f 1186 int length = sizeof(responses);
phsfan 0:ca471c239d5f 1187 //--
phsfan 0:ca471c239d5f 1188 // Check parameter size
phsfan 0:ca471c239d5f 1189 if (strlen(server) > a3gsMAX_HOST_LENGTH)
phsfan 0:ca471c239d5f 1190 return 1; // NG -- too long host name
phsfan 0:ca471c239d5f 1191 // Make command and send it
phsfan 0:ca471c239d5f 1192 sprintf(gWorkBuffer, "$TC %s %d", server, port);
phsfan 0:ca471c239d5f 1193 sendCommand(gWorkBuffer);
phsfan 0:ca471c239d5f 1194
phsfan 0:ca471c239d5f 1195 if (getResult(responses, &length, TIMEOUT_NETWORK))
phsfan 0:ca471c239d5f 1196 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 1197
phsfan 0:ca471c239d5f 1198 DEBUG_PRINT(">connectTCP()", responses);
phsfan 0:ca471c239d5f 1199
phsfan 0:ca471c239d5f 1200 // parse response
phsfan 0:ca471c239d5f 1201 if (! strncmp(responses, "$TC=NG", 6))
phsfan 0:ca471c239d5f 1202 return 1; // NG -- Can't connect
phsfan 0:ca471c239d5f 1203
phsfan 0:ca471c239d5f 1204 // Change status
phsfan 0:ca471c239d5f 1205 _status = TCPCONNECTEDCLIENT;
phsfan 0:ca471c239d5f 1206
phsfan 0:ca471c239d5f 1207 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 1208 }
phsfan 0:ca471c239d5f 1209
phsfan 0:ca471c239d5f 1210 //***************************
phsfan 0:ca471c239d5f 1211 // disconnectTCP
phsfan 0:ca471c239d5f 1212 //
phsfan 0:ca471c239d5f 1213 // @description
phsfan 0:ca471c239d5f 1214 // Disconnect from server with current TCP/IP connection
phsfan 0:ca471c239d5f 1215 // @return value
phsfan 0:ca471c239d5f 1216 // 0 .. OK
phsfan 0:ca471c239d5f 1217 // 1 .. NG
phsfan 0:ca471c239d5f 1218 // @param
phsfan 0:ca471c239d5f 1219 // none
phsfan 0:ca471c239d5f 1220 // @note
phsfan 0:ca471c239d5f 1221 //
phsfan 0:ca471c239d5f 1222 //***************************
phsfan 0:ca471c239d5f 1223 int A3GS::disconnectTCP()
phsfan 0:ca471c239d5f 1224 {
phsfan 0:ca471c239d5f 1225 char responses[30]; // FORMAT: "$TD=OK\n" or "$TD=NG errno [info]\n"
phsfan 0:ca471c239d5f 1226 int length = sizeof(responses);
phsfan 0:ca471c239d5f 1227 //--
phsfan 0:ca471c239d5f 1228 // Send command
phsfan 0:ca471c239d5f 1229 sendCommand("$TD");
phsfan 0:ca471c239d5f 1230
phsfan 0:ca471c239d5f 1231 if (getResult(responses, &length, TIMEOUT_NETWORK))
phsfan 0:ca471c239d5f 1232 return 1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 1233
phsfan 0:ca471c239d5f 1234 DEBUG_PRINT(">disconnectTCP()", responses);
phsfan 0:ca471c239d5f 1235
phsfan 0:ca471c239d5f 1236 // parse response
phsfan 0:ca471c239d5f 1237 if (! strncmp(responses, "$TD=NG", 6))
phsfan 0:ca471c239d5f 1238 return 1; // NG -- Can't connect
phsfan 0:ca471c239d5f 1239
phsfan 0:ca471c239d5f 1240 // Change status
phsfan 0:ca471c239d5f 1241 _status = READY;
phsfan 0:ca471c239d5f 1242
phsfan 0:ca471c239d5f 1243 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 1244 }
phsfan 0:ca471c239d5f 1245
phsfan 0:ca471c239d5f 1246 //***************************
phsfan 0:ca471c239d5f 1247 // write
phsfan 0:ca471c239d5f 1248 //
phsfan 0:ca471c239d5f 1249 // @description
phsfan 0:ca471c239d5f 1250 // Write byte into current TCP/IP connection
phsfan 0:ca471c239d5f 1251 // @return value
phsfan 0:ca471c239d5f 1252 // -1 .. NG (Error)
phsfan 0:ca471c239d5f 1253 // 1 .. OK
phsfan 0:ca471c239d5f 1254 // @param
phsfan 0:ca471c239d5f 1255 // c : byte data to write
phsfan 0:ca471c239d5f 1256 // @note
phsfan 0:ca471c239d5f 1257 // R2.3 bug fix(binary data escaping)
phsfan 0:ca471c239d5f 1258 //***************************
phsfan 0:ca471c239d5f 1259 int A3GS::write(uint8_t c)
phsfan 0:ca471c239d5f 1260 {
phsfan 0:ca471c239d5f 1261 char responses[30]; // FORMAT: "$TW=OK nbytes\n" or "$TW=NG errno [info]\n"
phsfan 0:ca471c239d5f 1262 int length = sizeof(responses);
phsfan 0:ca471c239d5f 1263 //--
phsfan 0:ca471c239d5f 1264 // Make command and send it
phsfan 0:ca471c239d5f 1265 sendData("$TW \"");
phsfan 0:ca471c239d5f 1266 if (c < 0x20) {
phsfan 0:ca471c239d5f 1267 char escaped[6];
phsfan 0:ca471c239d5f 1268 sprintf(escaped, "$x%02x", c);
phsfan 0:ca471c239d5f 1269 iemSerial.puts(escaped);
phsfan 0:ca471c239d5f 1270 }
phsfan 0:ca471c239d5f 1271 // @R2.3 add -begin-
phsfan 0:ca471c239d5f 1272 else if (c == '"') {
phsfan 0:ca471c239d5f 1273 iemSerial.puts("$\"");
phsfan 0:ca471c239d5f 1274 }
phsfan 0:ca471c239d5f 1275 else if (c == '$') {
phsfan 0:ca471c239d5f 1276 iemSerial.puts("$$");
phsfan 0:ca471c239d5f 1277 }
phsfan 0:ca471c239d5f 1278 // @R2.3 add -end-
phsfan 0:ca471c239d5f 1279 else {
phsfan 0:ca471c239d5f 1280 iemSerial.putc(c);
phsfan 0:ca471c239d5f 1281 }
phsfan 0:ca471c239d5f 1282 sendCommand("\"");
phsfan 0:ca471c239d5f 1283
phsfan 0:ca471c239d5f 1284 if (getResult(responses, &length, TIMEOUT_NETWORK))
phsfan 0:ca471c239d5f 1285 return -1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 1286
phsfan 0:ca471c239d5f 1287 DEBUG_PRINT(">write()", responses);
phsfan 0:ca471c239d5f 1288
phsfan 0:ca471c239d5f 1289 // parse response
phsfan 0:ca471c239d5f 1290 if (! strncmp(responses, "$TW=NG", 6))
phsfan 0:ca471c239d5f 1291 return -1; // NG -- Can't connect
phsfan 0:ca471c239d5f 1292
phsfan 0:ca471c239d5f 1293 int nbytes = atoi(responses + 7);
phsfan 0:ca471c239d5f 1294
phsfan 0:ca471c239d5f 1295 return nbytes; // OK
phsfan 0:ca471c239d5f 1296 }
phsfan 0:ca471c239d5f 1297
phsfan 0:ca471c239d5f 1298 //***************************
phsfan 0:ca471c239d5f 1299 // write
phsfan 0:ca471c239d5f 1300 //
phsfan 0:ca471c239d5f 1301 // @description
phsfan 0:ca471c239d5f 1302 // Write string into current TCP/IP connection
phsfan 0:ca471c239d5f 1303 // @return value
phsfan 0:ca471c239d5f 1304 // -1 .. NG (Error)
phsfan 0:ca471c239d5f 1305 // 0 < .. OK (= wrote bytes)
phsfan 0:ca471c239d5f 1306 // @param
phsfan 0:ca471c239d5f 1307 // str : string(= '\0' terminated byte array) to write
phsfan 0:ca471c239d5f 1308 // @note
phsfan 0:ca471c239d5f 1309 // "str" must be encoded by $ escape sequence
phsfan 0:ca471c239d5f 1310 //***************************
phsfan 0:ca471c239d5f 1311 int A3GS::write(const char* str)
phsfan 0:ca471c239d5f 1312 {
phsfan 0:ca471c239d5f 1313 char responses[30]; // FORMAT: "$TW=OK nbytes" or "$TW=NG errno [info]\n"
phsfan 0:ca471c239d5f 1314 int length = sizeof(responses);
phsfan 0:ca471c239d5f 1315 //--
phsfan 0:ca471c239d5f 1316 if (strlen(str) > a3gsMAX_DATA_LENGTH)
phsfan 0:ca471c239d5f 1317 return -1; // NG -- too large data
phsfan 0:ca471c239d5f 1318
phsfan 0:ca471c239d5f 1319 // Make command and send it
phsfan 0:ca471c239d5f 1320 sendData("$TW \"");
phsfan 0:ca471c239d5f 1321 sendData(str);
phsfan 0:ca471c239d5f 1322 sendCommand("\"");
phsfan 0:ca471c239d5f 1323
phsfan 0:ca471c239d5f 1324 if (getResult(responses, &length, TIMEOUT_NETWORK))
phsfan 0:ca471c239d5f 1325 return -1; // NG -- maybe timeou\t
phsfan 0:ca471c239d5f 1326
phsfan 0:ca471c239d5f 1327 DEBUG_PRINT(">write()", responses);
phsfan 0:ca471c239d5f 1328
phsfan 0:ca471c239d5f 1329 // parse response
phsfan 0:ca471c239d5f 1330 if (! strncmp(responses, "$TW=NG", 6))
phsfan 0:ca471c239d5f 1331 return -1; // NG -- Can't connect
phsfan 0:ca471c239d5f 1332
phsfan 0:ca471c239d5f 1333 int nbytes = atoi(responses + 7);
phsfan 0:ca471c239d5f 1334
phsfan 0:ca471c239d5f 1335 return nbytes; // OK
phsfan 0:ca471c239d5f 1336 }
phsfan 0:ca471c239d5f 1337
phsfan 0:ca471c239d5f 1338 //***************************
phsfan 0:ca471c239d5f 1339 // write
phsfan 0:ca471c239d5f 1340 //
phsfan 0:ca471c239d5f 1341 // @description
phsfan 0:ca471c239d5f 1342 // Write byte data into current TCP/IP connection
phsfan 0:ca471c239d5f 1343 // @return value
phsfan 0:ca471c239d5f 1344 // -1 .. NG (Error)
phsfan 0:ca471c239d5f 1345 // 0 < .. OK (= wrote bytes)
phsfan 0:ca471c239d5f 1346 // @param
phsfan 0:ca471c239d5f 1347 // buffer : data to write(byte array)
phsfan 0:ca471c239d5f 1348 // sz : data size(in byte)
phsfan 0:ca471c239d5f 1349 // @note
phsfan 0:ca471c239d5f 1350 // R2.3 bug fix(binary data escaping)
phsfan 0:ca471c239d5f 1351 //***************************
phsfan 0:ca471c239d5f 1352 int A3GS::write(const uint8_t* buffer, size_t sz)
phsfan 0:ca471c239d5f 1353 {
phsfan 0:ca471c239d5f 1354 char responses[30]; // FORMAT: "$TW=OK nbytes\n" or "$TW=NG errno [info]\n"
phsfan 0:ca471c239d5f 1355 int length = sizeof(responses);
phsfan 0:ca471c239d5f 1356 //--
phsfan 0:ca471c239d5f 1357 if (sz > (size_t)a3gsMAX_DATA_LENGTH)
phsfan 0:ca471c239d5f 1358 return -1; // NG -- too large data
phsfan 0:ca471c239d5f 1359
phsfan 0:ca471c239d5f 1360 // Make command and send it
phsfan 0:ca471c239d5f 1361 sendData("$TW \"");
phsfan 0:ca471c239d5f 1362 while (sz-- > 0) {
phsfan 0:ca471c239d5f 1363 if (*buffer < 0x20) {
phsfan 0:ca471c239d5f 1364 char escaped[6];
phsfan 0:ca471c239d5f 1365 sprintf(escaped, "$x%02x", *buffer);
phsfan 0:ca471c239d5f 1366 iemSerial.puts(escaped);
phsfan 0:ca471c239d5f 1367 }
phsfan 0:ca471c239d5f 1368 // @R2.3 add -begin-
phsfan 0:ca471c239d5f 1369 else if (*buffer == '"') {
phsfan 0:ca471c239d5f 1370 iemSerial.puts("$\"");
phsfan 0:ca471c239d5f 1371 }
phsfan 0:ca471c239d5f 1372 else if (*buffer == '$') {
phsfan 0:ca471c239d5f 1373 iemSerial.puts("$$");
phsfan 0:ca471c239d5f 1374 }
phsfan 0:ca471c239d5f 1375 // @R2.3 add -end-
phsfan 0:ca471c239d5f 1376 else {
phsfan 0:ca471c239d5f 1377 iemSerial.putc((char)*buffer);
phsfan 0:ca471c239d5f 1378 }
phsfan 0:ca471c239d5f 1379 buffer++;
phsfan 0:ca471c239d5f 1380 }
phsfan 0:ca471c239d5f 1381 sendCommand("\"");
phsfan 0:ca471c239d5f 1382
phsfan 0:ca471c239d5f 1383 if (getResult(responses, &length, TIMEOUT_NETWORK))
phsfan 0:ca471c239d5f 1384 return -1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 1385
phsfan 0:ca471c239d5f 1386 DEBUG_PRINT(">write()", responses);
phsfan 0:ca471c239d5f 1387
phsfan 0:ca471c239d5f 1388 // parse response
phsfan 0:ca471c239d5f 1389 if (! strncmp(responses, "$TW=NG", 6))
phsfan 0:ca471c239d5f 1390 return -1; // NG -- Can't connect
phsfan 0:ca471c239d5f 1391
phsfan 0:ca471c239d5f 1392 int nbytes = atoi(responses + 7);
phsfan 0:ca471c239d5f 1393
phsfan 0:ca471c239d5f 1394 return nbytes; // OK
phsfan 0:ca471c239d5f 1395 }
phsfan 0:ca471c239d5f 1396
phsfan 0:ca471c239d5f 1397 //***************************
phsfan 0:ca471c239d5f 1398 // read
phsfan 0:ca471c239d5f 1399 //
phsfan 0:ca471c239d5f 1400 // @description
phsfan 0:ca471c239d5f 1401 // Read data from current TCP/IP connection
phsfan 0:ca471c239d5f 1402 // @return value
phsfan 0:ca471c239d5f 1403 // -2 .. NG (Closed connection by other side)
phsfan 0:ca471c239d5f 1404 // -1 .. NG (Error)
phsfan 0:ca471c239d5f 1405 // 0 .. OK (No data)
phsfan 0:ca471c239d5f 1406 // 0 < .. OK (= read bytes)
phsfan 0:ca471c239d5f 1407 // @param
phsfan 0:ca471c239d5f 1408 // result : [OUT] read data(byte array, not '\0' terminated)
phsfan 0:ca471c239d5f 1409 // resultlength : data length(in byte)
phsfan 0:ca471c239d5f 1410 // @note
phsfan 0:ca471c239d5f 1411 // R2.3 fix return value bug
phsfan 0:ca471c239d5f 1412 // This function leaves for compatibility
phsfan 0:ca471c239d5f 1413 //***************************
phsfan 0:ca471c239d5f 1414 int A3GS::read(char* result, int resultlength)
phsfan 0:ca471c239d5f 1415 {
phsfan 0:ca471c239d5f 1416 int length = sizeof(gWorkBuffer);
phsfan 0:ca471c239d5f 1417 int c; //@R2.0 Change
phsfan 0:ca471c239d5f 1418 //--
phsfan 0:ca471c239d5f 1419 if (resultlength > a3gsMAX_DATA_LENGTH)
phsfan 0:ca471c239d5f 1420 return -1; // NG -- Bad parameter
phsfan 0:ca471c239d5f 1421
phsfan 0:ca471c239d5f 1422 // Make command and send it
phsfan 0:ca471c239d5f 1423 sprintf(gWorkBuffer, "$TR %d", resultlength);
phsfan 0:ca471c239d5f 1424 sendCommand(gWorkBuffer);
phsfan 0:ca471c239d5f 1425
phsfan 0:ca471c239d5f 1426 if (getResult(gWorkBuffer, &length, TIMEOUT_NETWORK))
phsfan 0:ca471c239d5f 1427 return (-1); // NG -- can't read
phsfan 0:ca471c239d5f 1428
phsfan 0:ca471c239d5f 1429 DEBUG_PRINT(">read()", gWorkBuffer);
phsfan 0:ca471c239d5f 1430
phsfan 0:ca471c239d5f 1431 // Parse response
phsfan 0:ca471c239d5f 1432 if (! strncmp(gWorkBuffer, "$TR=NG", 6)) {
phsfan 0:ca471c239d5f 1433 int errno = atoi(gWorkBuffer + 7);
phsfan 0:ca471c239d5f 1434 switch (errno) {
phsfan 0:ca471c239d5f 1435 case 635 : // Connection closed
phsfan 0:ca471c239d5f 1436 case 636 :
phsfan 0:ca471c239d5f 1437 return (-2);
phsfan 0:ca471c239d5f 1438 default : // Other error
phsfan 0:ca471c239d5f 1439 return (-1);
phsfan 0:ca471c239d5f 1440 }
phsfan 0:ca471c239d5f 1441 }
phsfan 0:ca471c239d5f 1442
phsfan 0:ca471c239d5f 1443 int nbytes = atoi(gWorkBuffer + 7);
phsfan 0:ca471c239d5f 1444 DEBUG_PRINT_NUM(">read() nbytes", nbytes);
phsfan 0:ca471c239d5f 1445
phsfan 0:ca471c239d5f 1446 // Copy response body into "result" and set "resultlength"
phsfan 0:ca471c239d5f 1447 for (int n = 0; n < nbytes; ) {
phsfan 0:ca471c239d5f 1448 while (!iemSerial.readable())
phsfan 0:ca471c239d5f 1449 ; // read until valid response
phsfan 0:ca471c239d5f 1450 c = iemSerial.getc();
phsfan 0:ca471c239d5f 1451 if (n < resultlength - 1)
phsfan 0:ca471c239d5f 1452 result[n] = c;
phsfan 0:ca471c239d5f 1453 n++;
phsfan 0:ca471c239d5f 1454 }
phsfan 0:ca471c239d5f 1455 discardUntil('\n'); // discard last '\n' -- @R2.0 Change
phsfan 0:ca471c239d5f 1456
phsfan 0:ca471c239d5f 1457 if (nbytes > resultlength - 1) { //@R2.0 Change
phsfan 0:ca471c239d5f 1458 result[resultlength - 1] = '\0';
phsfan 0:ca471c239d5f 1459 return (resultlength - 1); // OK
phsfan 0:ca471c239d5f 1460 }
phsfan 0:ca471c239d5f 1461 else {
phsfan 0:ca471c239d5f 1462 result[nbytes] = '\0';
phsfan 0:ca471c239d5f 1463 return nbytes; // OK
phsfan 0:ca471c239d5f 1464 }
phsfan 0:ca471c239d5f 1465 }
phsfan 0:ca471c239d5f 1466
phsfan 0:ca471c239d5f 1467 //***************************
phsfan 0:ca471c239d5f 1468 // read
phsfan 0:ca471c239d5f 1469 //
phsfan 0:ca471c239d5f 1470 // @description
phsfan 0:ca471c239d5f 1471 // Read (binary) data from current TCP/IP connection
phsfan 0:ca471c239d5f 1472 // @return value
phsfan 0:ca471c239d5f 1473 // -2 .. NG (Closed connection by other side)
phsfan 0:ca471c239d5f 1474 // -1 .. NG (Error)
phsfan 0:ca471c239d5f 1475 // 0 .. OK (No data)
phsfan 0:ca471c239d5f 1476 // 0 < .. OK (= read bytes)
phsfan 0:ca471c239d5f 1477 // @param
phsfan 0:ca471c239d5f 1478 // buffer : [OUT] read data(byte array, not '\0' terminated)
phsfan 0:ca471c239d5f 1479 // sz : binary data size(in byte)
phsfan 0:ca471c239d5f 1480 // @note
phsfan 0:ca471c239d5f 1481 // R2.3 Add this function
phsfan 0:ca471c239d5f 1482 //***************************
phsfan 0:ca471c239d5f 1483 int A3GS::read(uint8_t* buffer, size_t sz)
phsfan 0:ca471c239d5f 1484 {
phsfan 0:ca471c239d5f 1485 int length = sizeof(gWorkBuffer);
phsfan 0:ca471c239d5f 1486 int c;
phsfan 0:ca471c239d5f 1487 //--
phsfan 0:ca471c239d5f 1488 if (sz > (size_t)a3gsMAX_DATA_LENGTH)
phsfan 0:ca471c239d5f 1489 return -1; // NG -- Bad parameter
phsfan 0:ca471c239d5f 1490
phsfan 0:ca471c239d5f 1491 // Make command and send it
phsfan 0:ca471c239d5f 1492 sprintf(gWorkBuffer, "$TR %d", sz);
phsfan 0:ca471c239d5f 1493 sendCommand(gWorkBuffer);
phsfan 0:ca471c239d5f 1494
phsfan 0:ca471c239d5f 1495 if (getResult(gWorkBuffer, &length, TIMEOUT_NETWORK))
phsfan 0:ca471c239d5f 1496 return (-1); // NG -- can't read
phsfan 0:ca471c239d5f 1497
phsfan 0:ca471c239d5f 1498 DEBUG_PRINT(">read()", gWorkBuffer);
phsfan 0:ca471c239d5f 1499
phsfan 0:ca471c239d5f 1500 // Parse response
phsfan 0:ca471c239d5f 1501 if (! strncmp(gWorkBuffer, "$TR=NG", 6)) {
phsfan 0:ca471c239d5f 1502 int errno = atoi(gWorkBuffer + 7);
phsfan 0:ca471c239d5f 1503 switch (errno) {
phsfan 0:ca471c239d5f 1504 case 635 : // Connection closed
phsfan 0:ca471c239d5f 1505 case 636 :
phsfan 0:ca471c239d5f 1506 return (-2);
phsfan 0:ca471c239d5f 1507 default : // Other error
phsfan 0:ca471c239d5f 1508 return (-1);
phsfan 0:ca471c239d5f 1509 }
phsfan 0:ca471c239d5f 1510 }
phsfan 0:ca471c239d5f 1511
phsfan 0:ca471c239d5f 1512 size_t nbytes = atoi(gWorkBuffer + 7);
phsfan 0:ca471c239d5f 1513 DEBUG_PRINT_NUM(">read() nbytes", nbytes);
phsfan 0:ca471c239d5f 1514
phsfan 0:ca471c239d5f 1515 // Copy response body into "result" and set "resultlength"
phsfan 0:ca471c239d5f 1516 size_t n;
phsfan 0:ca471c239d5f 1517 for (n = 0; n < nbytes; n++) {
phsfan 0:ca471c239d5f 1518 while (!iemSerial.readable())
phsfan 0:ca471c239d5f 1519 ; // read until valid response
phsfan 0:ca471c239d5f 1520 c = iemSerial.getc();
phsfan 0:ca471c239d5f 1521 if (n < sz)
phsfan 0:ca471c239d5f 1522 buffer[n] = (uint8_t)c;
phsfan 0:ca471c239d5f 1523 }
phsfan 0:ca471c239d5f 1524
phsfan 0:ca471c239d5f 1525 discardUntil('\n'); // discard last '\n'
phsfan 0:ca471c239d5f 1526
phsfan 0:ca471c239d5f 1527 return (int)((n < sz) ? n : sz); // OK
phsfan 0:ca471c239d5f 1528 }
phsfan 0:ca471c239d5f 1529
phsfan 0:ca471c239d5f 1530 //***************************
phsfan 0:ca471c239d5f 1531 // read
phsfan 0:ca471c239d5f 1532 //
phsfan 0:ca471c239d5f 1533 // @description
phsfan 0:ca471c239d5f 1534 // Read byte from current TCP/IP connection
phsfan 0:ca471c239d5f 1535 // @return value
phsfan 0:ca471c239d5f 1536 // -2 .. NG (Closed connection by other side)
phsfan 0:ca471c239d5f 1537 // -1 .. NG (Error)
phsfan 0:ca471c239d5f 1538 // -3 .. OK (No data)
phsfan 0:ca471c239d5f 1539 // 0..0xFF .. OK (= read byte)
phsfan 0:ca471c239d5f 1540 // @param
phsfan 0:ca471c239d5f 1541 // none
phsfan 0:ca471c239d5f 1542 // @note
phsfan 0:ca471c239d5f 1543 // This function is synchronized operation.
phsfan 0:ca471c239d5f 1544 // Change return value type at @R2.0
phsfan 0:ca471c239d5f 1545 //***************************
phsfan 0:ca471c239d5f 1546 int A3GS::read(void)
phsfan 0:ca471c239d5f 1547 {
phsfan 0:ca471c239d5f 1548 int length = sizeof(gWorkBuffer);
phsfan 0:ca471c239d5f 1549 int c; //@R2.0 Change
phsfan 0:ca471c239d5f 1550 //--
phsfan 0:ca471c239d5f 1551 // Send command
phsfan 0:ca471c239d5f 1552 sendCommand("$TR 1");
phsfan 0:ca471c239d5f 1553
phsfan 0:ca471c239d5f 1554 if (getResult(gWorkBuffer, &length, TIMEOUT_NETWORK))
phsfan 0:ca471c239d5f 1555 return (-1); // NG -- can't read
phsfan 0:ca471c239d5f 1556
phsfan 0:ca471c239d5f 1557 DEBUG_PRINT(">read()", gWorkBuffer);
phsfan 0:ca471c239d5f 1558
phsfan 0:ca471c239d5f 1559 // Parse response
phsfan 0:ca471c239d5f 1560 if (! strncmp(gWorkBuffer, "$TR=NG", 6)) {
phsfan 0:ca471c239d5f 1561 int errno = atoi(gWorkBuffer + 7);
phsfan 0:ca471c239d5f 1562 switch (errno) {
phsfan 0:ca471c239d5f 1563 case 635 : // Connection closed
phsfan 0:ca471c239d5f 1564 case 636 :
phsfan 0:ca471c239d5f 1565 return (-2);
phsfan 0:ca471c239d5f 1566 default : // Other error
phsfan 0:ca471c239d5f 1567 return (-1);
phsfan 0:ca471c239d5f 1568 }
phsfan 0:ca471c239d5f 1569 }
phsfan 0:ca471c239d5f 1570
phsfan 0:ca471c239d5f 1571 size_t nbytes = atoi(gWorkBuffer + 7);
phsfan 0:ca471c239d5f 1572 DEBUG_PRINT_NUM(">read() nbytes", nbytes);
phsfan 0:ca471c239d5f 1573
phsfan 0:ca471c239d5f 1574 if (nbytes == 1) {
phsfan 0:ca471c239d5f 1575 while (!iemSerial.readable())
phsfan 0:ca471c239d5f 1576 ; // read valid response
phsfan 0:ca471c239d5f 1577 c = iemSerial.getc();
phsfan 0:ca471c239d5f 1578 }
phsfan 0:ca471c239d5f 1579 else // if (nbytes == 0)
phsfan 0:ca471c239d5f 1580 c = -3; // NG -- no data
phsfan 0:ca471c239d5f 1581
phsfan 0:ca471c239d5f 1582 discardUntil('\n'); // discard last '\n' -- @R2.0 Change
phsfan 0:ca471c239d5f 1583
phsfan 0:ca471c239d5f 1584 return c; // OK
phsfan 0:ca471c239d5f 1585 }
phsfan 0:ca471c239d5f 1586
phsfan 0:ca471c239d5f 1587 //***************************
phsfan 0:ca471c239d5f 1588 // put
phsfan 0:ca471c239d5f 1589 //
phsfan 0:ca471c239d5f 1590 // @description
phsfan 0:ca471c239d5f 1591 // Put data to non-volatile storage in 3G shield
phsfan 0:ca471c239d5f 1592 // @return value
phsfan 0:ca471c239d5f 1593 // -1 .. NG (Error)
phsfan 0:ca471c239d5f 1594 // 0 .. OK
phsfan 0:ca471c239d5f 1595 // @param
phsfan 0:ca471c239d5f 1596 // storageNum : [IN] Storage number (1..a3gsMAX_STORAGE_NUMBER)
phsfan 0:ca471c239d5f 1597 // buffer : [IN] Put data
phsfan 0:ca471c239d5f 1598 // sz : [IN] size of data (in bytes)
phsfan 0:ca471c239d5f 1599 // @note
phsfan 0:ca471c239d5f 1600 // @3.0 add
phsfan 0:ca471c239d5f 1601 //***************************
phsfan 0:ca471c239d5f 1602 int A3GS::put(int storageNum, uint8_t *buffer, size_t sz)
phsfan 0:ca471c239d5f 1603 {
phsfan 0:ca471c239d5f 1604 char responses[30]; // FORMAT: "$RW=OK nbytes\n" or "$RW=NG errno [info]\n"
phsfan 0:ca471c239d5f 1605 int length = sizeof(responses);
phsfan 0:ca471c239d5f 1606 //--
phsfan 0:ca471c239d5f 1607 if (storageNum < 0 || storageNum > a3gsMAX_STORAGE_NUMBER)
phsfan 0:ca471c239d5f 1608 return a3gsERROR; // NG -- Bad parameter
phsfan 0:ca471c239d5f 1609
phsfan 0:ca471c239d5f 1610 if (sz < 1 || sz > (size_t)a3gsMAX_STORAGE_LENGTH)
phsfan 0:ca471c239d5f 1611 return a3gsERROR; // NG -- too large data
phsfan 0:ca471c239d5f 1612
phsfan 0:ca471c239d5f 1613 // Make command and send it
phsfan 0:ca471c239d5f 1614 sprintf(responses, "$RW %d \"", storageNum);
phsfan 0:ca471c239d5f 1615 sendData(responses);
phsfan 0:ca471c239d5f 1616 while (sz-- > 0) {
phsfan 0:ca471c239d5f 1617 if (*buffer < 0x20) {
phsfan 0:ca471c239d5f 1618 char escaped[6];
phsfan 0:ca471c239d5f 1619 sprintf(escaped, "$x%02x", *buffer);
phsfan 0:ca471c239d5f 1620 iemSerial.puts(escaped);
phsfan 0:ca471c239d5f 1621 }
phsfan 0:ca471c239d5f 1622 else if (*buffer == '"')
phsfan 0:ca471c239d5f 1623 iemSerial.puts("$\"");
phsfan 0:ca471c239d5f 1624 else if (*buffer == '$')
phsfan 0:ca471c239d5f 1625 iemSerial.puts("$$");
phsfan 0:ca471c239d5f 1626 else
phsfan 0:ca471c239d5f 1627 iemSerial.putc(*buffer);
phsfan 0:ca471c239d5f 1628 buffer++;
phsfan 0:ca471c239d5f 1629 }
phsfan 0:ca471c239d5f 1630 sendCommand("\""); // execute $RW command
phsfan 0:ca471c239d5f 1631
phsfan 0:ca471c239d5f 1632 if (getResult(responses, &length, TIMEOUT_NETWORK))
phsfan 0:ca471c239d5f 1633 return a3gsERROR; // NG -- maybe timeout
phsfan 0:ca471c239d5f 1634
phsfan 0:ca471c239d5f 1635 DEBUG_PRINT(">put()", responses);
phsfan 0:ca471c239d5f 1636
phsfan 0:ca471c239d5f 1637 // parse response
phsfan 0:ca471c239d5f 1638 if (! strncmp(responses, "$RW=NG", 6))
phsfan 0:ca471c239d5f 1639 return a3gsERROR; // NG -- Can't connect
phsfan 0:ca471c239d5f 1640
phsfan 0:ca471c239d5f 1641 return a3gsSUCCESS; // OK
phsfan 0:ca471c239d5f 1642 }
phsfan 0:ca471c239d5f 1643
phsfan 0:ca471c239d5f 1644 //***************************
phsfan 0:ca471c239d5f 1645 // get
phsfan 0:ca471c239d5f 1646 //
phsfan 0:ca471c239d5f 1647 // @description
phsfan 0:ca471c239d5f 1648 // Get data from non-volatile storage in 3G shield
phsfan 0:ca471c239d5f 1649 // @return value
phsfan 0:ca471c239d5f 1650 // -1 .. NG (Error)
phsfan 0:ca471c239d5f 1651 // 0..a3gsMAX_STORAGE_LENGTH .. OK (length of data to get)
phsfan 0:ca471c239d5f 1652 // @param
phsfan 0:ca471c239d5f 1653 // storageNum : [IN] Storage number (1..a3gsMAX_STORAGE_NUMBER)
phsfan 0:ca471c239d5f 1654 // buffer : [OUT] Got data space
phsfan 0:ca471c239d5f 1655 // sz : [OUT] size of data (in bytes)
phsfan 0:ca471c239d5f 1656 // @note
phsfan 0:ca471c239d5f 1657 // @3.0 add
phsfan 0:ca471c239d5f 1658 //***************************
phsfan 0:ca471c239d5f 1659 int A3GS::get(int storageNum, uint8_t *buffer, size_t sz)
phsfan 0:ca471c239d5f 1660 {
phsfan 0:ca471c239d5f 1661 int length = sizeof(gWorkBuffer);
phsfan 0:ca471c239d5f 1662 int c;
phsfan 0:ca471c239d5f 1663 //--
phsfan 0:ca471c239d5f 1664 if (storageNum < 0 || storageNum > a3gsMAX_STORAGE_NUMBER)
phsfan 0:ca471c239d5f 1665 return a3gsERROR; // NG -- Bad parameter
phsfan 0:ca471c239d5f 1666
phsfan 0:ca471c239d5f 1667 if (sz > (size_t)a3gsMAX_STORAGE_LENGTH)
phsfan 0:ca471c239d5f 1668 return a3gsERROR; // NG -- Bad parameter
phsfan 0:ca471c239d5f 1669
phsfan 0:ca471c239d5f 1670 // Make command and send it
phsfan 0:ca471c239d5f 1671 sprintf(gWorkBuffer, "$RR %d", storageNum);
phsfan 0:ca471c239d5f 1672 sendCommand(gWorkBuffer);
phsfan 0:ca471c239d5f 1673
phsfan 0:ca471c239d5f 1674 if (getResult(gWorkBuffer, &length, TIMEOUT_NETWORK))
phsfan 0:ca471c239d5f 1675 return a3gsERROR; // NG -- can't read
phsfan 0:ca471c239d5f 1676
phsfan 0:ca471c239d5f 1677 DEBUG_PRINT(">get()", gWorkBuffer);
phsfan 0:ca471c239d5f 1678
phsfan 0:ca471c239d5f 1679 // Parse response
phsfan 0:ca471c239d5f 1680 if (! strncmp(gWorkBuffer, "$RR=NG", 6))
phsfan 0:ca471c239d5f 1681 return a3gsERROR; // NG -- can't read
phsfan 0:ca471c239d5f 1682
phsfan 0:ca471c239d5f 1683 size_t nbytes = atoi(gWorkBuffer + 7);
phsfan 0:ca471c239d5f 1684 DEBUG_PRINT_NUM(">get() nbytes", nbytes);
phsfan 0:ca471c239d5f 1685
phsfan 0:ca471c239d5f 1686 // Copy response body into "result" and set "resultlength"
phsfan 0:ca471c239d5f 1687 size_t n;
phsfan 0:ca471c239d5f 1688 for (n = 0; n < nbytes; n++) {
phsfan 0:ca471c239d5f 1689 while (!iemSerial.readable())
phsfan 0:ca471c239d5f 1690 ; // read until valid response
phsfan 0:ca471c239d5f 1691 c = iemSerial.getc();
phsfan 0:ca471c239d5f 1692 if (n < sz)
phsfan 0:ca471c239d5f 1693 buffer[n] = (uint8_t)c;
phsfan 0:ca471c239d5f 1694 }
phsfan 0:ca471c239d5f 1695 discardUntil('\n'); // discard last '\n'
phsfan 0:ca471c239d5f 1696
phsfan 0:ca471c239d5f 1697 return (int)((n < sz) ? n : sz); // OK
phsfan 0:ca471c239d5f 1698 }
phsfan 0:ca471c239d5f 1699
phsfan 0:ca471c239d5f 1700 //***************************
phsfan 0:ca471c239d5f 1701 // updateProfile
phsfan 0:ca471c239d5f 1702 //
phsfan 0:ca471c239d5f 1703 // @description
phsfan 0:ca471c239d5f 1704 // Update profile with encrypted data
phsfan 0:ca471c239d5f 1705 // @return value
phsfan 0:ca471c239d5f 1706 // -1 .. NG
phsfan 0:ca471c239d5f 1707 // 0 .. OK
phsfan 0:ca471c239d5f 1708 // @param
phsfan 0:ca471c239d5f 1709 // encryptedProfile : [IN] Encrypted profile
phsfan 0:ca471c239d5f 1710 // sz : [IN] bytes of encrypted profile
phsfan 0:ca471c239d5f 1711 // @note
phsfan 0:ca471c239d5f 1712 // @3.0 add
phsfan 0:ca471c239d5f 1713 //***************************
phsfan 0:ca471c239d5f 1714 int A3GS::updateProfile(const uint8_t *encryptedProfile, int sz)
phsfan 0:ca471c239d5f 1715 {
phsfan 0:ca471c239d5f 1716 int length = sizeof(gWorkBuffer);
phsfan 0:ca471c239d5f 1717 //--
phsfan 0:ca471c239d5f 1718 // Make command and send it
phsfan 0:ca471c239d5f 1719 sendData("$YD - \"");
phsfan 0:ca471c239d5f 1720 for (char *p = (char *)encryptedProfile; sz-- > 0; p++) {
phsfan 0:ca471c239d5f 1721 if (*p < 0x20) {
phsfan 0:ca471c239d5f 1722 char escaped[6];
phsfan 0:ca471c239d5f 1723 sprintf(escaped, "$x%02x", (uint8_t)*p);
phsfan 0:ca471c239d5f 1724 iemSerial.puts(escaped);
phsfan 0:ca471c239d5f 1725 // Serial.print(escaped);
phsfan 0:ca471c239d5f 1726 }
phsfan 0:ca471c239d5f 1727 else if (*p == '"') {
phsfan 0:ca471c239d5f 1728 iemSerial.puts("$\"");
phsfan 0:ca471c239d5f 1729 // Serial.print("$\"");
phsfan 0:ca471c239d5f 1730 }
phsfan 0:ca471c239d5f 1731 else if (*p == '$') {
phsfan 0:ca471c239d5f 1732 iemSerial.puts("$$");
phsfan 0:ca471c239d5f 1733 // Serial.print("$$");
phsfan 0:ca471c239d5f 1734 }
phsfan 0:ca471c239d5f 1735 else {
phsfan 0:ca471c239d5f 1736 iemSerial.putc(*p);
phsfan 0:ca471c239d5f 1737 // Serial.print((char)*p);
phsfan 0:ca471c239d5f 1738 }
phsfan 0:ca471c239d5f 1739 }
phsfan 0:ca471c239d5f 1740 sendCommand("\"");
phsfan 0:ca471c239d5f 1741
phsfan 0:ca471c239d5f 1742 if (getResult(gWorkBuffer, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 1743 return -1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 1744
phsfan 0:ca471c239d5f 1745 // parse response
phsfan 0:ca471c239d5f 1746 if (! strncmp(gWorkBuffer, "$YD=NG", 6))
phsfan 0:ca471c239d5f 1747 return -1; // NG -- Can't do
phsfan 0:ca471c239d5f 1748
phsfan 0:ca471c239d5f 1749 return 0; // OK
phsfan 0:ca471c239d5f 1750 }
phsfan 0:ca471c239d5f 1751
phsfan 0:ca471c239d5f 1752 //***************************
phsfan 0:ca471c239d5f 1753 // encryptString
phsfan 0:ca471c239d5f 1754 //
phsfan 0:ca471c239d5f 1755 // @description
phsfan 0:ca471c239d5f 1756 // Encrypt string with password
phsfan 0:ca471c239d5f 1757 // @return value
phsfan 0:ca471c239d5f 1758 // -1 .. NG
phsfan 0:ca471c239d5f 1759 // 0 .. OK
phsfan 0:ca471c239d5f 1760 // @param
phsfan 0:ca471c239d5f 1761 // password : [IN] Password to encrypt
phsfan 0:ca471c239d5f 1762 // s : [IN] String to encrypt
phsfan 0:ca471c239d5f 1763 // @note
phsfan 0:ca471c239d5f 1764 // @3.0 add
phsfan 0:ca471c239d5f 1765 //***************************
phsfan 0:ca471c239d5f 1766 int A3GS::encryptString(const char *password, const char *s)
phsfan 0:ca471c239d5f 1767 {
phsfan 0:ca471c239d5f 1768 int length = sizeof(gWorkBuffer);
phsfan 0:ca471c239d5f 1769 //--
phsfan 0:ca471c239d5f 1770 // Make command and send it
phsfan 0:ca471c239d5f 1771 sendData("$YY ");
phsfan 0:ca471c239d5f 1772 sendData(password);
phsfan 0:ca471c239d5f 1773 sendData(" \"");
phsfan 0:ca471c239d5f 1774 sendData(s);
phsfan 0:ca471c239d5f 1775 sendCommand("\"");
phsfan 0:ca471c239d5f 1776
phsfan 0:ca471c239d5f 1777 if (getResult(gWorkBuffer, &length, TIMEOUT_LOCAL))
phsfan 0:ca471c239d5f 1778 return -1; // NG -- maybe timeout
phsfan 0:ca471c239d5f 1779
phsfan 0:ca471c239d5f 1780 // parse response
phsfan 0:ca471c239d5f 1781 if (! strncmp(gWorkBuffer, "$YY=NG", 6))
phsfan 0:ca471c239d5f 1782 return -1; // NG -- Can't encrypt
phsfan 0:ca471c239d5f 1783
phsfan 0:ca471c239d5f 1784 size_t nbytes = atoi(gWorkBuffer + 7);
phsfan 0:ca471c239d5f 1785 DEBUG_PRINT_NUM(">encrypt() nbytes", nbytes);
phsfan 0:ca471c239d5f 1786
phsfan 0:ca471c239d5f 1787 printf(">>");
phsfan 0:ca471c239d5f 1788 int c;
phsfan 0:ca471c239d5f 1789 for (int n = 0; n < (int)nbytes; n++) {
phsfan 0:ca471c239d5f 1790 while (!iemSerial.readable())
phsfan 0:ca471c239d5f 1791 ; // read until valid response
phsfan 0:ca471c239d5f 1792 c = iemSerial.getc();
phsfan 0:ca471c239d5f 1793 printf("\\x");
phsfan 0:ca471c239d5f 1794 printf("%02x", c);
phsfan 0:ca471c239d5f 1795 }
phsfan 0:ca471c239d5f 1796 printf("<<\r\n");
phsfan 0:ca471c239d5f 1797
phsfan 0:ca471c239d5f 1798 discardUntil('\n'); // discard last '\n'
phsfan 0:ca471c239d5f 1799
phsfan 0:ca471c239d5f 1800 return 0; // OK
phsfan 0:ca471c239d5f 1801 }
phsfan 0:ca471c239d5f 1802
phsfan 0:ca471c239d5f 1803
phsfan 0:ca471c239d5f 1804 //***
phsfan 0:ca471c239d5f 1805 // Private methods
phsfan 0:ca471c239d5f 1806 //***
phsfan 0:ca471c239d5f 1807
phsfan 0:ca471c239d5f 1808 // sendCommand() -- send command to iem with \n
phsfan 0:ca471c239d5f 1809 void A3GS::sendCommand(const char* cmd)
phsfan 0:ca471c239d5f 1810 {
phsfan 0:ca471c239d5f 1811 // Send command to IEM with '\n'
phsfan 0:ca471c239d5f 1812 iemSerial.puts(cmd);
phsfan 0:ca471c239d5f 1813 iemSerial.putc('\n');
phsfan 0:ca471c239d5f 1814 DEBUG_PRINT("<sendCommand()", cmd);
phsfan 0:ca471c239d5f 1815 }
phsfan 0:ca471c239d5f 1816
phsfan 0:ca471c239d5f 1817 // sendData() -- send data to iem without \n
phsfan 0:ca471c239d5f 1818 void A3GS::sendData(const char* data)
phsfan 0:ca471c239d5f 1819 {
phsfan 0:ca471c239d5f 1820 // Send data to IEM without '\n'
phsfan 0:ca471c239d5f 1821 iemSerial.puts(data);
phsfan 0:ca471c239d5f 1822 DEBUG_PRINT("<sendData()", data);
phsfan 0:ca471c239d5f 1823 }
phsfan 0:ca471c239d5f 1824
phsfan 0:ca471c239d5f 1825 // discardUntl() -- discard characters from iemSerial until match specified character
phsfan 0:ca471c239d5f 1826 void A3GS::discardUntil(const char match)
phsfan 0:ca471c239d5f 1827 {
phsfan 0:ca471c239d5f 1828 int c; //@R2.0 Change
phsfan 0:ca471c239d5f 1829 Timer millis;
phsfan 0:ca471c239d5f 1830 bool done = false;
phsfan 0:ca471c239d5f 1831 //--
phsfan 0:ca471c239d5f 1832 millis.start();
phsfan 0:ca471c239d5f 1833 while (! done) {
phsfan 0:ca471c239d5f 1834 if (millis.read_ms() >= TIMEOUT_LOCAL) {
phsfan 0:ca471c239d5f 1835 DEBUG_PRINT(">discardUntil()", "TIMEOUT");
phsfan 0:ca471c239d5f 1836 break; // Timeout !
phsfan 0:ca471c239d5f 1837 }
phsfan 0:ca471c239d5f 1838
phsfan 0:ca471c239d5f 1839 if (!iemSerial.readable())
phsfan 0:ca471c239d5f 1840 continue; // discard until valid response -- @R2.1 Change
phsfan 0:ca471c239d5f 1841
phsfan 0:ca471c239d5f 1842 c = iemSerial.getc();
phsfan 0:ca471c239d5f 1843 if (c == match)
phsfan 0:ca471c239d5f 1844 done = true;
phsfan 0:ca471c239d5f 1845 }
phsfan 0:ca471c239d5f 1846 }
phsfan 0:ca471c239d5f 1847
phsfan 0:ca471c239d5f 1848 // getResult() -- get result from IEM
phsfan 0:ca471c239d5f 1849 int A3GS::getResult(char *buf, int *len, uint32_t timeout)
phsfan 0:ca471c239d5f 1850 {
phsfan 0:ca471c239d5f 1851 Timer millis;
phsfan 0:ca471c239d5f 1852 bool completed = false;
phsfan 0:ca471c239d5f 1853 int length = 0;
phsfan 0:ca471c239d5f 1854 millis.start();
phsfan 0:ca471c239d5f 1855 while (! completed) {
phsfan 0:ca471c239d5f 1856 if (millis.read_ms() >= timeout) {
phsfan 0:ca471c239d5f 1857 DEBUG_PRINT(">getResult()", "TIMEOUT");
phsfan 0:ca471c239d5f 1858 return 1; // NG -- Timeout
phsfan 0:ca471c239d5f 1859 }
phsfan 0:ca471c239d5f 1860 if (!iemSerial.readable())
phsfan 0:ca471c239d5f 1861 continue;
phsfan 0:ca471c239d5f 1862 int c = iemSerial.getc();
phsfan 0:ca471c239d5f 1863 if (c >= 0x20 && c < 0x7f) {
phsfan 0:ca471c239d5f 1864 DBG("%c", c);
phsfan 0:ca471c239d5f 1865 } else {
phsfan 0:ca471c239d5f 1866 DBG("_%02x", c);
phsfan 0:ca471c239d5f 1867 }
phsfan 0:ca471c239d5f 1868 if (c == 0x0a) { // end of line
phsfan 0:ca471c239d5f 1869 if (buf[0] == '$')
phsfan 0:ca471c239d5f 1870 completed = true; // got result
phsfan 0:ca471c239d5f 1871 else
phsfan 0:ca471c239d5f 1872 length = 0; // got status, so retry
phsfan 0:ca471c239d5f 1873 }
phsfan 0:ca471c239d5f 1874 else if (length < *len - 1)
phsfan 0:ca471c239d5f 1875 buf[length++] = c;
phsfan 0:ca471c239d5f 1876 }
phsfan 0:ca471c239d5f 1877 buf[length] = '\0';
phsfan 0:ca471c239d5f 1878 *len = length;
phsfan 0:ca471c239d5f 1879
phsfan 0:ca471c239d5f 1880 DEBUG_PRINT("<getResult", buf);
phsfan 0:ca471c239d5f 1881
phsfan 0:ca471c239d5f 1882 return 0; // OK
phsfan 0:ca471c239d5f 1883 }
phsfan 0:ca471c239d5f 1884
phsfan 0:ca471c239d5f 1885 // handleINT0() -- Interrupt Service Routine(ISR) of INT0
phsfan 0:ca471c239d5f 1886 void A3GS::handleINT0(void)
phsfan 0:ca471c239d5f 1887 {
phsfan 0:ca471c239d5f 1888 // disable INT0
phsfan 0:ca471c239d5f 1889 _intin.fall(NULL);
phsfan 0:ca471c239d5f 1890
phsfan 0:ca471c239d5f 1891 (*SMShandler)(); // Call user handler(You can use other interrupts(UART, millis()..))
phsfan 0:ca471c239d5f 1892
phsfan 0:ca471c239d5f 1893 // Clear hander
phsfan 0:ca471c239d5f 1894 SMShandler = NULL;
phsfan 0:ca471c239d5f 1895 }
phsfan 0:ca471c239d5f 1896
phsfan 0:ca471c239d5f 1897 // END OF a3gs.cpp
phsfan 0:ca471c239d5f 1898