Cellular example for BG96 module. In addition to default example integration of GNSS module is presented. Tested on Hani-IoT board with Shiratech LTE CAT-M1/NB1 Arduino Shield containing BG96 module.

Dependencies:   BG96_GNSS

Committer:
Pawel Zarembski
Date:
Thu Mar 05 15:05:49 2020 +0100
Revision:
1:3e3e200fa4dd
Parent:
0:8fb2a7fbc33a
add mbed-os lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pawel Zarembski 0:8fb2a7fbc33a 1 /*
Pawel Zarembski 0:8fb2a7fbc33a 2 * Copyright (c) 2017 ARM Limited. All rights reserved.
Pawel Zarembski 0:8fb2a7fbc33a 3 * SPDX-License-Identifier: Apache-2.0
Pawel Zarembski 0:8fb2a7fbc33a 4 * Licensed under the Apache License, Version 2.0 (the License); you may
Pawel Zarembski 0:8fb2a7fbc33a 5 * not use this file except in compliance with the License.
Pawel Zarembski 0:8fb2a7fbc33a 6 * You may obtain a copy of the License at
Pawel Zarembski 0:8fb2a7fbc33a 7 *
Pawel Zarembski 0:8fb2a7fbc33a 8 * http://www.apache.org/licenses/LICENSE-2.0
Pawel Zarembski 0:8fb2a7fbc33a 9 *
Pawel Zarembski 0:8fb2a7fbc33a 10 * Unless required by applicable law or agreed to in writing, software
Pawel Zarembski 0:8fb2a7fbc33a 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
Pawel Zarembski 0:8fb2a7fbc33a 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Pawel Zarembski 0:8fb2a7fbc33a 13 * See the License for the specific language governing permissions and
Pawel Zarembski 0:8fb2a7fbc33a 14 * limitations under the License.
Pawel Zarembski 0:8fb2a7fbc33a 15 */
Pawel Zarembski 0:8fb2a7fbc33a 16
Pawel Zarembski 0:8fb2a7fbc33a 17 #include "mbed.h"
Pawel Zarembski 0:8fb2a7fbc33a 18 #include "common_functions.h"
Pawel Zarembski 0:8fb2a7fbc33a 19 #include "CellularNonIPSocket.h"
Pawel Zarembski 0:8fb2a7fbc33a 20 #include "CellularDevice.h"
Pawel Zarembski 0:8fb2a7fbc33a 21 #include "UDPSocket.h"
Pawel Zarembski 0:8fb2a7fbc33a 22 #include "CellularLog.h"
Pawel Zarembski 0:8fb2a7fbc33a 23 #include "BG96_GNSS.h"
Pawel Zarembski 0:8fb2a7fbc33a 24
Pawel Zarembski 0:8fb2a7fbc33a 25 #define UDP 0
Pawel Zarembski 0:8fb2a7fbc33a 26 #define TCP 1
Pawel Zarembski 0:8fb2a7fbc33a 27 #define NONIP 2
Pawel Zarembski 0:8fb2a7fbc33a 28
Pawel Zarembski 0:8fb2a7fbc33a 29 // Number of retries /
Pawel Zarembski 0:8fb2a7fbc33a 30 #define RETRY_COUNT 3
Pawel Zarembski 0:8fb2a7fbc33a 31
Pawel Zarembski 0:8fb2a7fbc33a 32 NetworkInterface *iface;
Pawel Zarembski 0:8fb2a7fbc33a 33
Pawel Zarembski 0:8fb2a7fbc33a 34 // Echo server hostname
Pawel Zarembski 0:8fb2a7fbc33a 35 const char *host_name = MBED_CONF_APP_ECHO_SERVER_HOSTNAME;
Pawel Zarembski 0:8fb2a7fbc33a 36
Pawel Zarembski 0:8fb2a7fbc33a 37 // Echo server port (same for TCP and UDP)
Pawel Zarembski 0:8fb2a7fbc33a 38 const int port = MBED_CONF_APP_ECHO_SERVER_PORT;
Pawel Zarembski 0:8fb2a7fbc33a 39
Pawel Zarembski 0:8fb2a7fbc33a 40 static rtos::Mutex trace_mutex;
Pawel Zarembski 0:8fb2a7fbc33a 41
Pawel Zarembski 0:8fb2a7fbc33a 42 #if MBED_CONF_MBED_TRACE_ENABLE
Pawel Zarembski 0:8fb2a7fbc33a 43 static void trace_wait()
Pawel Zarembski 0:8fb2a7fbc33a 44 {
Pawel Zarembski 0:8fb2a7fbc33a 45 trace_mutex.lock();
Pawel Zarembski 0:8fb2a7fbc33a 46 }
Pawel Zarembski 0:8fb2a7fbc33a 47
Pawel Zarembski 0:8fb2a7fbc33a 48 static void trace_release()
Pawel Zarembski 0:8fb2a7fbc33a 49 {
Pawel Zarembski 0:8fb2a7fbc33a 50 trace_mutex.unlock();
Pawel Zarembski 0:8fb2a7fbc33a 51 }
Pawel Zarembski 0:8fb2a7fbc33a 52
Pawel Zarembski 0:8fb2a7fbc33a 53 static char time_st[50];
Pawel Zarembski 0:8fb2a7fbc33a 54
Pawel Zarembski 0:8fb2a7fbc33a 55 static char* trace_time(size_t ss)
Pawel Zarembski 0:8fb2a7fbc33a 56 {
Pawel Zarembski 0:8fb2a7fbc33a 57 snprintf(time_st, 49, "[%08llums]", Kernel::get_ms_count());
Pawel Zarembski 0:8fb2a7fbc33a 58 return time_st;
Pawel Zarembski 0:8fb2a7fbc33a 59 }
Pawel Zarembski 0:8fb2a7fbc33a 60
Pawel Zarembski 0:8fb2a7fbc33a 61 static void trace_open()
Pawel Zarembski 0:8fb2a7fbc33a 62 {
Pawel Zarembski 0:8fb2a7fbc33a 63 mbed_trace_init();
Pawel Zarembski 0:8fb2a7fbc33a 64 mbed_trace_prefix_function_set( &trace_time );
Pawel Zarembski 0:8fb2a7fbc33a 65
Pawel Zarembski 0:8fb2a7fbc33a 66 mbed_trace_mutex_wait_function_set(trace_wait);
Pawel Zarembski 0:8fb2a7fbc33a 67 mbed_trace_mutex_release_function_set(trace_release);
Pawel Zarembski 0:8fb2a7fbc33a 68
Pawel Zarembski 0:8fb2a7fbc33a 69 mbed_cellular_trace::mutex_wait_function_set(trace_wait);
Pawel Zarembski 0:8fb2a7fbc33a 70 mbed_cellular_trace::mutex_release_function_set(trace_release);
Pawel Zarembski 0:8fb2a7fbc33a 71 }
Pawel Zarembski 0:8fb2a7fbc33a 72
Pawel Zarembski 0:8fb2a7fbc33a 73 static void trace_close()
Pawel Zarembski 0:8fb2a7fbc33a 74 {
Pawel Zarembski 0:8fb2a7fbc33a 75 mbed_cellular_trace::mutex_wait_function_set(NULL);
Pawel Zarembski 0:8fb2a7fbc33a 76 mbed_cellular_trace::mutex_release_function_set(NULL);
Pawel Zarembski 0:8fb2a7fbc33a 77
Pawel Zarembski 0:8fb2a7fbc33a 78 mbed_trace_free();
Pawel Zarembski 0:8fb2a7fbc33a 79 }
Pawel Zarembski 0:8fb2a7fbc33a 80 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
Pawel Zarembski 0:8fb2a7fbc33a 81
Pawel Zarembski 0:8fb2a7fbc33a 82 Thread dot_thread(osPriorityNormal, 512);
Pawel Zarembski 0:8fb2a7fbc33a 83
Pawel Zarembski 0:8fb2a7fbc33a 84 void print_function(const char *format, ...)
Pawel Zarembski 0:8fb2a7fbc33a 85 {
Pawel Zarembski 0:8fb2a7fbc33a 86 trace_mutex.lock();
Pawel Zarembski 0:8fb2a7fbc33a 87 va_list arglist;
Pawel Zarembski 0:8fb2a7fbc33a 88 va_start( arglist, format );
Pawel Zarembski 0:8fb2a7fbc33a 89 vprintf(format, arglist);
Pawel Zarembski 0:8fb2a7fbc33a 90 va_end( arglist );
Pawel Zarembski 0:8fb2a7fbc33a 91 trace_mutex.unlock();
Pawel Zarembski 0:8fb2a7fbc33a 92 }
Pawel Zarembski 0:8fb2a7fbc33a 93
Pawel Zarembski 0:8fb2a7fbc33a 94 void dot_event()
Pawel Zarembski 0:8fb2a7fbc33a 95 {
Pawel Zarembski 0:8fb2a7fbc33a 96 while (true) {
Pawel Zarembski 0:8fb2a7fbc33a 97 ThisThread::sleep_for(4000);
Pawel Zarembski 0:8fb2a7fbc33a 98 if (iface && iface->get_connection_status() == NSAPI_STATUS_GLOBAL_UP) {
Pawel Zarembski 0:8fb2a7fbc33a 99 break;
Pawel Zarembski 0:8fb2a7fbc33a 100 } else {
Pawel Zarembski 0:8fb2a7fbc33a 101 trace_mutex.lock();
Pawel Zarembski 0:8fb2a7fbc33a 102 printf(".");
Pawel Zarembski 0:8fb2a7fbc33a 103 fflush(stdout);
Pawel Zarembski 0:8fb2a7fbc33a 104 trace_mutex.unlock();
Pawel Zarembski 0:8fb2a7fbc33a 105 }
Pawel Zarembski 0:8fb2a7fbc33a 106 }
Pawel Zarembski 0:8fb2a7fbc33a 107 }
Pawel Zarembski 0:8fb2a7fbc33a 108
Pawel Zarembski 0:8fb2a7fbc33a 109 /**
Pawel Zarembski 0:8fb2a7fbc33a 110 * Connects to the Cellular Network
Pawel Zarembski 0:8fb2a7fbc33a 111 */
Pawel Zarembski 0:8fb2a7fbc33a 112 nsapi_error_t do_connect()
Pawel Zarembski 0:8fb2a7fbc33a 113 {
Pawel Zarembski 0:8fb2a7fbc33a 114 nsapi_error_t retcode = NSAPI_ERROR_OK;
Pawel Zarembski 0:8fb2a7fbc33a 115 uint8_t retry_counter = 0;
Pawel Zarembski 0:8fb2a7fbc33a 116
Pawel Zarembski 0:8fb2a7fbc33a 117 while (iface->get_connection_status() != NSAPI_STATUS_GLOBAL_UP) {
Pawel Zarembski 0:8fb2a7fbc33a 118 retcode = iface->connect();
Pawel Zarembski 0:8fb2a7fbc33a 119 if (retcode == NSAPI_ERROR_AUTH_FAILURE) {
Pawel Zarembski 0:8fb2a7fbc33a 120 print_function("\n\nAuthentication Failure. Exiting application\n");
Pawel Zarembski 0:8fb2a7fbc33a 121 } else if (retcode == NSAPI_ERROR_OK) {
Pawel Zarembski 0:8fb2a7fbc33a 122 print_function("\n\nConnection Established.\n");
Pawel Zarembski 0:8fb2a7fbc33a 123 } else if (retry_counter > RETRY_COUNT) {
Pawel Zarembski 0:8fb2a7fbc33a 124 print_function("\n\nFatal connection failure: %d\n", retcode);
Pawel Zarembski 0:8fb2a7fbc33a 125 } else {
Pawel Zarembski 0:8fb2a7fbc33a 126 print_function("\n\nCouldn't connect: %d, will retry\n", retcode);
Pawel Zarembski 0:8fb2a7fbc33a 127 retry_counter++;
Pawel Zarembski 0:8fb2a7fbc33a 128 continue;
Pawel Zarembski 0:8fb2a7fbc33a 129 }
Pawel Zarembski 0:8fb2a7fbc33a 130 break;
Pawel Zarembski 0:8fb2a7fbc33a 131 }
Pawel Zarembski 0:8fb2a7fbc33a 132 return retcode;
Pawel Zarembski 0:8fb2a7fbc33a 133 }
Pawel Zarembski 0:8fb2a7fbc33a 134
Pawel Zarembski 0:8fb2a7fbc33a 135 /**
Pawel Zarembski 0:8fb2a7fbc33a 136 * Opens:
Pawel Zarembski 0:8fb2a7fbc33a 137 * - UDP or TCP socket with the given echo server and performs an echo
Pawel Zarembski 0:8fb2a7fbc33a 138 * transaction retrieving current.
Pawel Zarembski 0:8fb2a7fbc33a 139 * - Cellular Non-IP socket for which the data delivery path is decided
Pawel Zarembski 0:8fb2a7fbc33a 140 * by network's control plane CIoT optimisation setup, for the given APN.
Pawel Zarembski 0:8fb2a7fbc33a 141 */
Pawel Zarembski 0:8fb2a7fbc33a 142 nsapi_error_t test_send_recv()
Pawel Zarembski 0:8fb2a7fbc33a 143 {
Pawel Zarembski 0:8fb2a7fbc33a 144 nsapi_size_or_error_t retcode;
Pawel Zarembski 0:8fb2a7fbc33a 145 #if MBED_CONF_APP_SOCK_TYPE == TCP
Pawel Zarembski 0:8fb2a7fbc33a 146 TCPSocket sock;
Pawel Zarembski 0:8fb2a7fbc33a 147 #elif MBED_CONF_APP_SOCK_TYPE == UDP
Pawel Zarembski 0:8fb2a7fbc33a 148 UDPSocket sock;
Pawel Zarembski 0:8fb2a7fbc33a 149 #elif MBED_CONF_APP_SOCK_TYPE == NONIP
Pawel Zarembski 0:8fb2a7fbc33a 150 CellularNonIPSocket sock;
Pawel Zarembski 0:8fb2a7fbc33a 151 #endif
Pawel Zarembski 0:8fb2a7fbc33a 152
Pawel Zarembski 0:8fb2a7fbc33a 153 #if MBED_CONF_APP_SOCK_TYPE == NONIP
Pawel Zarembski 0:8fb2a7fbc33a 154 retcode = sock.open((CellularContext*)iface);
Pawel Zarembski 0:8fb2a7fbc33a 155 #else
Pawel Zarembski 0:8fb2a7fbc33a 156 retcode = sock.open(iface);
Pawel Zarembski 0:8fb2a7fbc33a 157 #endif
Pawel Zarembski 0:8fb2a7fbc33a 158
Pawel Zarembski 0:8fb2a7fbc33a 159 if (retcode != NSAPI_ERROR_OK) {
Pawel Zarembski 0:8fb2a7fbc33a 160 #if MBED_CONF_APP_SOCK_TYPE == TCP
Pawel Zarembski 0:8fb2a7fbc33a 161 print_function("TCPSocket.open() fails, code: %d\n", retcode);
Pawel Zarembski 0:8fb2a7fbc33a 162 #elif MBED_CONF_APP_SOCK_TYPE == UDP
Pawel Zarembski 0:8fb2a7fbc33a 163 print_function("UDPSocket.open() fails, code: %d\n", retcode);
Pawel Zarembski 0:8fb2a7fbc33a 164 #elif MBED_CONF_APP_SOCK_TYPE == NONIP
Pawel Zarembski 0:8fb2a7fbc33a 165 print_function("CellularNonIPSocket.open() fails, code: %d\n", retcode);
Pawel Zarembski 0:8fb2a7fbc33a 166 #endif
Pawel Zarembski 0:8fb2a7fbc33a 167 return -1;
Pawel Zarembski 0:8fb2a7fbc33a 168 }
Pawel Zarembski 0:8fb2a7fbc33a 169
Pawel Zarembski 0:8fb2a7fbc33a 170 int n = 0;
Pawel Zarembski 0:8fb2a7fbc33a 171 const char *echo_string = "TEST";
Pawel Zarembski 0:8fb2a7fbc33a 172 char recv_buf[4];
Pawel Zarembski 0:8fb2a7fbc33a 173
Pawel Zarembski 0:8fb2a7fbc33a 174 sock.set_timeout(15000);
Pawel Zarembski 0:8fb2a7fbc33a 175
Pawel Zarembski 0:8fb2a7fbc33a 176 #if MBED_CONF_APP_SOCK_TYPE == NONIP
Pawel Zarembski 0:8fb2a7fbc33a 177 retcode = sock.send((void*) echo_string, strlen(echo_string));
Pawel Zarembski 0:8fb2a7fbc33a 178 if (retcode < 0) {
Pawel Zarembski 0:8fb2a7fbc33a 179 print_function("CellularNonIPSocket.send() fails, code: %d\n", retcode);
Pawel Zarembski 0:8fb2a7fbc33a 180 return -1;
Pawel Zarembski 0:8fb2a7fbc33a 181 } else {
Pawel Zarembski 0:8fb2a7fbc33a 182 print_function("CellularNonIPSocket: Sent %d Bytes\n", retcode);
Pawel Zarembski 0:8fb2a7fbc33a 183 }
Pawel Zarembski 0:8fb2a7fbc33a 184
Pawel Zarembski 0:8fb2a7fbc33a 185 n = sock.recv((void*) recv_buf, sizeof(recv_buf));
Pawel Zarembski 0:8fb2a7fbc33a 186
Pawel Zarembski 0:8fb2a7fbc33a 187 #else
Pawel Zarembski 0:8fb2a7fbc33a 188
Pawel Zarembski 0:8fb2a7fbc33a 189 SocketAddress sock_addr;
Pawel Zarembski 0:8fb2a7fbc33a 190 retcode = iface->gethostbyname(host_name, &sock_addr);
Pawel Zarembski 0:8fb2a7fbc33a 191 if (retcode != NSAPI_ERROR_OK) {
Pawel Zarembski 0:8fb2a7fbc33a 192 print_function("Couldn't resolve remote host: %s, code: %d\n", host_name, retcode);
Pawel Zarembski 0:8fb2a7fbc33a 193 return -1;
Pawel Zarembski 0:8fb2a7fbc33a 194 }
Pawel Zarembski 0:8fb2a7fbc33a 195
Pawel Zarembski 0:8fb2a7fbc33a 196 sock_addr.set_port(port);
Pawel Zarembski 0:8fb2a7fbc33a 197
Pawel Zarembski 0:8fb2a7fbc33a 198 #if MBED_CONF_APP_SOCK_TYPE == TCP
Pawel Zarembski 0:8fb2a7fbc33a 199 retcode = sock.connect(sock_addr);
Pawel Zarembski 0:8fb2a7fbc33a 200 if (retcode < 0) {
Pawel Zarembski 0:8fb2a7fbc33a 201 print_function("TCPSocket.connect() fails, code: %d\n", retcode);
Pawel Zarembski 0:8fb2a7fbc33a 202 return -1;
Pawel Zarembski 0:8fb2a7fbc33a 203 } else {
Pawel Zarembski 0:8fb2a7fbc33a 204 print_function("TCP: connected with %s server\n", host_name);
Pawel Zarembski 0:8fb2a7fbc33a 205 }
Pawel Zarembski 0:8fb2a7fbc33a 206 retcode = sock.send((void*) echo_string, strlen(echo_string));
Pawel Zarembski 0:8fb2a7fbc33a 207 if (retcode < 0) {
Pawel Zarembski 0:8fb2a7fbc33a 208 print_function("TCPSocket.send() fails, code: %d\n", retcode);
Pawel Zarembski 0:8fb2a7fbc33a 209 return -1;
Pawel Zarembski 0:8fb2a7fbc33a 210 } else {
Pawel Zarembski 0:8fb2a7fbc33a 211 print_function("TCP: Sent %d Bytes to %s\n", retcode, host_name);
Pawel Zarembski 0:8fb2a7fbc33a 212 }
Pawel Zarembski 0:8fb2a7fbc33a 213
Pawel Zarembski 0:8fb2a7fbc33a 214 n = sock.recv((void*) recv_buf, sizeof(recv_buf));
Pawel Zarembski 0:8fb2a7fbc33a 215 #else
Pawel Zarembski 0:8fb2a7fbc33a 216
Pawel Zarembski 0:8fb2a7fbc33a 217 retcode = sock.sendto(sock_addr, (void*) echo_string, strlen(echo_string));
Pawel Zarembski 0:8fb2a7fbc33a 218 if (retcode < 0) {
Pawel Zarembski 0:8fb2a7fbc33a 219 print_function("UDPSocket.sendto() fails, code: %d\n", retcode);
Pawel Zarembski 0:8fb2a7fbc33a 220 return -1;
Pawel Zarembski 0:8fb2a7fbc33a 221 } else {
Pawel Zarembski 0:8fb2a7fbc33a 222 print_function("UDP: Sent %d Bytes to %s\n", retcode, host_name);
Pawel Zarembski 0:8fb2a7fbc33a 223 }
Pawel Zarembski 0:8fb2a7fbc33a 224
Pawel Zarembski 0:8fb2a7fbc33a 225 n = sock.recvfrom(&sock_addr, (void*) recv_buf, sizeof(recv_buf));
Pawel Zarembski 0:8fb2a7fbc33a 226 #endif
Pawel Zarembski 0:8fb2a7fbc33a 227 #endif
Pawel Zarembski 0:8fb2a7fbc33a 228
Pawel Zarembski 0:8fb2a7fbc33a 229 sock.close();
Pawel Zarembski 0:8fb2a7fbc33a 230
Pawel Zarembski 0:8fb2a7fbc33a 231 if (n > 0) {
Pawel Zarembski 0:8fb2a7fbc33a 232 print_function("Received from echo server %d Bytes\n", n);
Pawel Zarembski 0:8fb2a7fbc33a 233 return 0;
Pawel Zarembski 0:8fb2a7fbc33a 234 }
Pawel Zarembski 0:8fb2a7fbc33a 235
Pawel Zarembski 0:8fb2a7fbc33a 236 return -1;
Pawel Zarembski 0:8fb2a7fbc33a 237 }
Pawel Zarembski 0:8fb2a7fbc33a 238
Pawel Zarembski 0:8fb2a7fbc33a 239 int main()
Pawel Zarembski 0:8fb2a7fbc33a 240 {
Pawel Zarembski 0:8fb2a7fbc33a 241 print_function("\n\nmbed-os-example-cellular\n");
Pawel Zarembski 0:8fb2a7fbc33a 242 print_function("\n\nBuilt: %s, %s\n", __DATE__, __TIME__);
Pawel Zarembski 0:8fb2a7fbc33a 243 #ifdef MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN
Pawel Zarembski 0:8fb2a7fbc33a 244 print_function("\n\n[MAIN], plmn: %s\n", (MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN ? MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN : "NULL"));
Pawel Zarembski 0:8fb2a7fbc33a 245 #endif
Pawel Zarembski 0:8fb2a7fbc33a 246
Pawel Zarembski 0:8fb2a7fbc33a 247 print_function("Establishing connection\n");
Pawel Zarembski 0:8fb2a7fbc33a 248 #if MBED_CONF_MBED_TRACE_ENABLE
Pawel Zarembski 0:8fb2a7fbc33a 249 trace_open();
Pawel Zarembski 0:8fb2a7fbc33a 250 #else
Pawel Zarembski 0:8fb2a7fbc33a 251 dot_thread.start(dot_event);
Pawel Zarembski 0:8fb2a7fbc33a 252 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
Pawel Zarembski 0:8fb2a7fbc33a 253
Pawel Zarembski 0:8fb2a7fbc33a 254 #if MBED_CONF_APP_SOCK_TYPE == NONIP
Pawel Zarembski 0:8fb2a7fbc33a 255 iface = CellularContext::get_default_nonip_instance();
Pawel Zarembski 0:8fb2a7fbc33a 256 #else
Pawel Zarembski 0:8fb2a7fbc33a 257 iface = CellularContext::get_default_instance();
Pawel Zarembski 0:8fb2a7fbc33a 258 #endif
Pawel Zarembski 0:8fb2a7fbc33a 259
Pawel Zarembski 0:8fb2a7fbc33a 260 MBED_ASSERT(iface);
Pawel Zarembski 0:8fb2a7fbc33a 261
Pawel Zarembski 0:8fb2a7fbc33a 262 // sim pin, apn, credentials and possible plmn are taken automatically from json when using NetworkInterface::set_default_parameters()
Pawel Zarembski 0:8fb2a7fbc33a 263 iface->set_default_parameters();
Pawel Zarembski 0:8fb2a7fbc33a 264
Pawel Zarembski 0:8fb2a7fbc33a 265 nsapi_error_t retcode = NSAPI_ERROR_NO_CONNECTION;
Pawel Zarembski 0:8fb2a7fbc33a 266
Pawel Zarembski 0:8fb2a7fbc33a 267 /* Attempt to connect to a cellular network */
Pawel Zarembski 0:8fb2a7fbc33a 268 if (do_connect() == NSAPI_ERROR_OK) {
Pawel Zarembski 0:8fb2a7fbc33a 269 retcode = test_send_recv();
Pawel Zarembski 0:8fb2a7fbc33a 270 }
Pawel Zarembski 0:8fb2a7fbc33a 271
Pawel Zarembski 0:8fb2a7fbc33a 272 /* Create GPS data using existing cellular interface */
Pawel Zarembski 0:8fb2a7fbc33a 273 BG96_GNSS bg96_gps_module;
Pawel Zarembski 0:8fb2a7fbc33a 274 gps_data_t gps_data;
Pawel Zarembski 0:8fb2a7fbc33a 275
Pawel Zarembski 0:8fb2a7fbc33a 276 /* Power on GPS module on BG96 */
Pawel Zarembski 0:8fb2a7fbc33a 277 bg96_gps_module.set_gps_power(true);
Pawel Zarembski 0:8fb2a7fbc33a 278
Pawel Zarembski 0:8fb2a7fbc33a 279 /* Wait until GPS is fixed and get GPS data */
Pawel Zarembski 0:8fb2a7fbc33a 280 while (FAILURE == bg96_gps_module.get_gps_data(&gps_data)) {
Pawel Zarembski 0:8fb2a7fbc33a 281 thread_sleep_for(5000);
Pawel Zarembski 0:8fb2a7fbc33a 282 }
Pawel Zarembski 0:8fb2a7fbc33a 283
Pawel Zarembski 0:8fb2a7fbc33a 284 /* Print GPS data */
Pawel Zarembski 0:8fb2a7fbc33a 285 bg96_gps_module.print_gps_data(&gps_data);
Pawel Zarembski 0:8fb2a7fbc33a 286
Pawel Zarembski 0:8fb2a7fbc33a 287 if (iface->disconnect() != NSAPI_ERROR_OK) {
Pawel Zarembski 0:8fb2a7fbc33a 288 print_function("\n\n disconnect failed.\n\n");
Pawel Zarembski 0:8fb2a7fbc33a 289 }
Pawel Zarembski 0:8fb2a7fbc33a 290
Pawel Zarembski 0:8fb2a7fbc33a 291 if (retcode == NSAPI_ERROR_OK) {
Pawel Zarembski 0:8fb2a7fbc33a 292 print_function("\n\nSuccess. Exiting \n\n");
Pawel Zarembski 0:8fb2a7fbc33a 293 } else {
Pawel Zarembski 0:8fb2a7fbc33a 294 print_function("\n\nFailure. Exiting \n\n");
Pawel Zarembski 0:8fb2a7fbc33a 295 }
Pawel Zarembski 0:8fb2a7fbc33a 296
Pawel Zarembski 0:8fb2a7fbc33a 297 #if MBED_CONF_MBED_TRACE_ENABLE
Pawel Zarembski 0:8fb2a7fbc33a 298 trace_close();
Pawel Zarembski 0:8fb2a7fbc33a 299 #else
Pawel Zarembski 0:8fb2a7fbc33a 300 dot_thread.terminate();
Pawel Zarembski 0:8fb2a7fbc33a 301 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
Pawel Zarembski 0:8fb2a7fbc33a 302
Pawel Zarembski 0:8fb2a7fbc33a 303 return 0;
Pawel Zarembski 0:8fb2a7fbc33a 304 }
Pawel Zarembski 0:8fb2a7fbc33a 305 // EOF