WIZnet-IoTShield-AMM592-GPS for AMM592

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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 }