mbed os example for Wislink RAK2011

Committer:
ClockworkBird
Date:
Thu May 07 21:57:52 2020 +0000
Revision:
45:d90a8c5ae1e3
Parent:
43:91f11760b50f
- add config for Wislink and Hologram

Who changed what in which revision?

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