Viktor Shin
/
WIZnet-IoTShield-AMM592-GPS
WIZnet-IoTShield-AMM592-GPS for AMM592
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 /* WIZnet IoT Shield Cat.M1 Sample code for Arm MBED 00002 * Copyright (c) 2019 WIZnet Co., Ltd. 00003 * SPDX-License-Identifier: Apache-2.0 00004 */ 00005 00006 /* 00007 * Licensed under the Apache License, Version 2.0 (the "License"); 00008 * you may not use this file except in compliance with the License. 00009 * You may obtain a copy of the License at 00010 * 00011 * http://www.apache.org/licenses/LICENSE-2.0 00012 * 00013 * Unless required by applicable law or agreed to in writing, software 00014 * distributed under the License is distributed on an "AS IS" BASIS, 00015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00016 * 00017 * See the License for the specific language governing permissions and 00018 * limitations under the License. 00019 * 00020 */ 00021 00022 00023 #include <string> 00024 #include "mbed.h" 00025 00026 #define RET_OK 1 00027 #define RET_NOK -1 00028 #define DEBUG_ENABLE 1 00029 #define DEBUG_DISABLE 0 00030 #define ON 1 00031 #define OFF 0 00032 00033 #define MAX_BUF_SIZE 1024 00034 00035 #define AMM592_APN_PROTOCOL_IPv4 1 00036 #define AMM592_APN_PROTOCOL_IPv6 2 00037 #define AMM592_DEFAULT_TIMEOUT 1000 00038 #define AMM592_CONNECT_TIMEOUT 15000 00039 #define AMM592_SEND_TIMEOUT 500 00040 #define AMM592_RECV_TIMEOUT 500 00041 00042 #define AMM592_APN_PROTOCOL AMM592_APN_PROTOCOL_IPv6 00043 #define AMM592_DEFAULT_BAUD_RATE 115200 00044 #define AMM592_PARSER_DELIMITER "\r\n" 00045 00046 #define CATM1_APN_SKT "lte-internet.sktelecom.com" 00047 00048 #define CATM1_DEVICE_NAME_AMM592 "AMM592" 00049 #define DEVNAME CATM1_DEVICE_NAME_AMM592 00050 00051 #define devlog(f_, ...) if(CATM1_DEVICE_DEBUG == DEBUG_ENABLE) { pc.printf("\r\n[%s] ", DEVNAME); pc.printf((f_), ##__VA_ARGS__); } 00052 #define myprintf(f_, ...) {pc.printf("\r\n[MAIN] "); pc.printf((f_), ##__VA_ARGS__);} 00053 00054 /* Pin configuraiton */ 00055 // Cat.M1 00056 #define MBED_CONF_IOTSHIELD_CATM1_TX D8 00057 #define MBED_CONF_IOTSHIELD_CATM1_RX D2 00058 #define MBED_CONF_IOTSHIELD_CATM1_RESET D7 00059 #define MBED_CONF_IOTSHIELD_CATM1_PWRKEY D9 00060 00061 // Sensors 00062 #define MBED_CONF_IOTSHIELD_SENSOR_CDS A0 00063 #define MBED_CONF_IOTSHIELD_SENSOR_TEMP A1 00064 00065 /* Debug message settings */ 00066 #define AMM592_PARSER_DEBUG DEBUG_DISABLE 00067 #define CATM1_DEVICE_DEBUG DEBUG_ENABLE 00068 00069 00070 typedef struct gps_data_t { 00071 float lat; // latitude. (-)dd.ddddd 00072 float lon; // longitude. (-)dd.ddddd 00073 } gps_data; 00074 00075 00076 // Functions: Module Status 00077 void waitCatM1Ready(void); 00078 int8_t setEchoStatus_AMM592(int onoff); 00079 int8_t getUsimStatus_AMM592(void); 00080 int8_t getNetworkStatus_AMM592(void); 00081 int8_t checknSetApn_AMM592(const char * apn); 00082 int8_t getFirmwareVersion_AMM592(char * version); 00083 int8_t getImeiNumber_AMM592(char * imei); 00084 00085 // Functions: GPS 00086 int8_t setGpsSesssion_AMM592(int session_type); 00087 int8_t setGpsOnOff_AMM592(bool onoff); 00088 int8_t getGpsLocation_AMM592(gps_data *data); 00089 00090 00091 Serial pc(USBTX, USBRX); // USB debug 00092 00093 UARTSerial *_serial; // Cat.M1 module 00094 ATCmdParser *_parser; 00095 00096 DigitalOut _RESET_AMM592(MBED_CONF_IOTSHIELD_CATM1_RESET); 00097 DigitalOut _PWRKEY_AMM592(MBED_CONF_IOTSHIELD_CATM1_PWRKEY); 00098 00099 void serialPcInit(void) 00100 { 00101 pc.baud(115200); 00102 pc.format(8, Serial::None, 1); 00103 } 00104 00105 void serialDeviceInit(PinName tx, PinName rx, int baudrate) 00106 { 00107 _serial = new UARTSerial(tx, rx, baudrate); 00108 } 00109 00110 void serialAtParserInit(const char *delimiter, bool debug_en) 00111 { 00112 _parser = new ATCmdParser(_serial); 00113 _parser->debug_on(debug_en); 00114 _parser->set_delimiter(delimiter); 00115 _parser->set_timeout(AMM592_DEFAULT_TIMEOUT); 00116 } 00117 00118 void catm1DeviceInit(void) 00119 { 00120 serialDeviceInit( MBED_CONF_IOTSHIELD_CATM1_TX, 00121 MBED_CONF_IOTSHIELD_CATM1_RX, 00122 AMM592_DEFAULT_BAUD_RATE); 00123 00124 serialAtParserInit( AMM592_PARSER_DELIMITER, 00125 AMM592_PARSER_DEBUG); 00126 } 00127 00128 void catm1DeviceReset_AMM592(void) 00129 { 00130 _RESET_AMM592 = 1; 00131 _PWRKEY_AMM592 = 1; 00132 wait_ms(300); 00133 00134 _RESET_AMM592 = 0; 00135 _PWRKEY_AMM592 = 0; 00136 wait_ms(400); 00137 00138 _RESET_AMM592 = 1; 00139 wait_ms(1000); 00140 } 00141 00142 00143 // ---------------------------------------------------------------- 00144 // Main routine 00145 // ---------------------------------------------------------------- 00146 00147 int main() 00148 { 00149 serialPcInit(); 00150 catm1DeviceInit(); 00151 00152 myprintf("Waiting for Cat.M1 Module Ready...\r\n"); 00153 00154 catm1DeviceReset_AMM592(); 00155 00156 waitCatM1Ready(); 00157 00158 wait_ms(5000); 00159 00160 myprintf("System Init Complete\r\n"); 00161 00162 myprintf("WIZnet IoT Shield for Arm MBED"); 00163 myprintf("LTE Cat.M1 Version"); 00164 myprintf("================================================="); 00165 myprintf(">> Target Board: WIoT-AM01 (AM Telecom AMM592)"); 00166 myprintf(">> Sample Code: GPS"); 00167 myprintf("=================================================\r\n"); 00168 00169 setEchoStatus_AMM592(0); 00170 00171 getUsimStatus_AMM592(); 00172 00173 getNetworkStatus_AMM592(); 00174 00175 checknSetApn_AMM592(CATM1_APN_SKT); 00176 00177 // GPS information structure 00178 gps_data gps_info; 00179 00180 00181 if(setGpsSesssion_AMM592(1) == RET_OK) { 00182 myprintf("GPS Session setting success\r\n"); 00183 00184 if(setGpsOnOff_AMM592(ON) == RET_OK) { 00185 myprintf("GPS On\r\n"); 00186 00187 if(getGpsLocation_AMM592(&gps_info) == RET_OK) { 00188 myprintf("Get GPS information >>>"); 00189 myprintf("gps_info - lat: %2.5f", gps_info.lat) // latitude: (-)dd.ddddd 00190 myprintf("gps_info - lon: %2.5f", gps_info.lon) // longitude: (-)dd.ddddd 00191 } else { 00192 myprintf("Failed to get GPS information\r\n"); 00193 } 00194 wait_ms(1000); 00195 00196 #if 0 00197 if(setGpsOnOff_AMM592(OFF) == RET_OK) { 00198 myprintf("GPS Off\r\n") 00199 } 00200 #endif 00201 00202 } else { 00203 myprintf("GPS On failed\r\n") 00204 } 00205 } else { 00206 myprintf("GPS Session setting failed\r\n"); 00207 } 00208 00209 } 00210 00211 // ---------------------------------------------------------------- 00212 // Functions: Cat.M1 Status 00213 // ---------------------------------------------------------------- 00214 00215 void waitCatM1Ready(void) 00216 { 00217 while(1) 00218 { 00219 if(_parser->recv("@NOTI:34,AMT_BOOT_ALERT") && _parser->recv("@NETSTI:3") ) 00220 { 00221 myprintf("AM592 ready\r\n"); 00222 return ; 00223 } 00224 else if(_parser->send("AT") && _parser->recv("OK")) 00225 { 00226 myprintf("AM592 already available\r\n"); 00227 wait_ms(5000); 00228 return ; 00229 } 00230 } 00231 } 00232 00233 int8_t setEchoStatus_AMM592(int onoff) 00234 { 00235 int8_t ret = RET_NOK; 00236 char _buf[10]; 00237 00238 sprintf((char *)_buf, "ATE%d", onoff); 00239 00240 if(_parser->send(_buf) && _parser->recv("OK")) { 00241 devlog("Turn Echo %s success\r\n", onoff?"ON":"OFF"); 00242 ret = RET_OK; 00243 } else { 00244 devlog("Turn Echo %s failed\r\n", onoff?"ON":"OFF"); 00245 } 00246 return ret; 00247 } 00248 00249 int8_t getUsimStatus_AMM592(void) 00250 { 00251 int8_t ret = RET_NOK; 00252 00253 _parser->send("AT+CPIN?"); 00254 if(_parser->recv("+CPIN: READY") && _parser->recv("OK")) { 00255 devlog("USIM Status: READY\r\n"); 00256 ret = RET_OK; 00257 } else { 00258 devlog("Retrieving USIM Status failed\r\n"); 00259 } 00260 return ret; 00261 } 00262 00263 int8_t getNetworkStatus_AMM592(void) 00264 { 00265 int8_t ret = RET_NOK; 00266 bool cereg = false, nsi = false; 00267 int n, stat; 00268 00269 if(_parser->send("AT+CEREG?") && _parser->recv("+CEREG: %d, %d", &n, &stat) && _parser->recv("OK")){ 00270 if ((n==0 || n==1) && stat==1){ 00271 cereg = true; 00272 } 00273 } 00274 00275 if(_parser->send("AT@NSI") && _parser->recv("@NSI:%d,\"IN SRV\"") && _parser->recv("OK")) { 00276 devlog("Network Status: attached\r\n"); 00277 nsi = true; 00278 } else if (_parser->send("AT@NSI") && _parser->recv("@NSI: \"LIMITED\"") && _parser->recv("OK")) { 00279 devlog("Network Status: limited\r\n"); 00280 nsi = true; 00281 } else { 00282 devlog("Network Status: Error\r\n"); 00283 } 00284 00285 if (cereg && nsi){ 00286 ret = RET_OK; 00287 } 00288 return ret; 00289 } 00290 00291 int8_t checknSetApn_AMM592(const char * apn) // Configure Parameters of a TCP/IP Context 00292 { 00293 bool cgdccont = false, cgatt = false; 00294 int8_t ret = RET_NOK; 00295 00296 devlog("Checking APN...\r\n"); 00297 //APN setting 00298 if (_parser->send("AT+CGDCONT=1,\"IPV4V6\",\"%s\"", apn) && _parser->recv("OK")){ 00299 cgdccont = true; 00300 } 00301 //Attach setting 00302 if (_parser->send("AT+CGATT?") && _parser->recv("+CGATT: 1") &&_parser->recv("OK")){ 00303 cgatt = true; 00304 } 00305 00306 if (cgdccont && cgatt){ 00307 ret = RET_OK; 00308 } 00309 00310 devlog("APN Check Done\r\n"); 00311 00312 return ret; 00313 } 00314 00315 // ---------------------------------------------------------------- 00316 // Functions: Cat.M1 GPS 00317 // ---------------------------------------------------------------- 00318 00319 int8_t setGpsSesssion_AMM592(int session_type) 00320 { 00321 int8_t ret = RET_NOK; 00322 00323 00324 if(_parser->send("AT@AMGST=%d", session_type) && _parser->recv("OK")) { 00325 ret = RET_OK; 00326 } else { 00327 devlog("Set GPS session failed"); 00328 } 00329 return ret; 00330 } 00331 00332 int8_t setGpsOnOff_AMM592(bool onoff) 00333 { 00334 int8_t ret = RET_NOK; 00335 if(onoff == ON){ 00336 if(_parser->send("AT@AMGSTART") && _parser->recv("OK")) { 00337 ret = RET_OK; 00338 } else { 00339 devlog("Set AMGSTART failed\r\n"); 00340 } 00341 } else { 00342 if(_parser->send("AT@AMGSTOP") && _parser->recv("OK")) { 00343 ret = RET_OK; 00344 } else { 00345 devlog("Set AMGSTOP failed\r\n"); 00346 } 00347 } 00348 return ret; 00349 } 00350 00351 00352 int8_t getGpsLocation_AMM592(gps_data *data) 00353 { 00354 int8_t ret = RET_NOK; 00355 int state_code=0; 00356 00357 bool ok = false; 00358 Timer t; 00359 char _buf[100] = {0, }; 00360 00361 // Structure init: GPS info 00362 data->lat = data->lon=0; 00363 memset(&data->lat, 0x00, 7); 00364 00365 // timer start 00366 t.start(); 00367 00368 while( !ok && (t.read_ms() < 65000 ) ) { 00369 if (_parser->recv("@AMG:%d,", &state_code)){ 00370 if (state_code == 0) { 00371 _parser->read(_buf, sizeof(_buf)); 00372 sscanf(_buf, "%f, %f", &data->lat, &data->lon); 00373 ok = true; 00374 } 00375 else { 00376 _parser->read(_buf, sizeof(_buf)); 00377 devlog("Error: %s", _buf); 00378 } 00379 } 00380 00381 if(ok == true) ret = RET_OK; 00382 t.reset(); 00383 return ret; 00384 }
Generated on Thu Aug 4 2022 19:16:36 by 1.7.2