Socket interface for C027Interface. Implements the NetworkSocketAPI

Dependencies:   C027_Support

Dependents:   HelloC027Interface U_Blox_DeviceConnector U_Blox_DeviceConnector U-Blox_Client

Fork of LWIPInterface by NetworkSocketAPI

Committer:
mbed_official
Date:
Thu Apr 20 09:04:44 2017 -0500
Revision:
23:5e320842ccad
Parent:
22:69ea34ad7fc6
Only join a running threat. Zero initialise callback array.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
geky 12:181a9415736b 1 /* C027 implementation of NetworkInterfaceAPI
geky 12:181a9415736b 2 * Copyright (c) 2015 ARM Limited
geky 12:181a9415736b 3 *
geky 12:181a9415736b 4 * Licensed under the Apache License, Version 2.0 (the "License");
geky 12:181a9415736b 5 * you may not use this file except in compliance with the License.
geky 12:181a9415736b 6 * You may obtain a copy of the License at
geky 12:181a9415736b 7 *
geky 12:181a9415736b 8 * http://www.apache.org/licenses/LICENSE-2.0
geky 12:181a9415736b 9 *
geky 12:181a9415736b 10 * Unless required by applicable law or agreed to in writing, software
geky 12:181a9415736b 11 * distributed under the License is distributed on an "AS IS" BASIS,
geky 12:181a9415736b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
geky 12:181a9415736b 13 * See the License for the specific language governing permissions and
geky 12:181a9415736b 14 * limitations under the License.
geky 12:181a9415736b 15 */
geky 12:181a9415736b 16
geky 12:181a9415736b 17 #include "C027Interface.h"
geky 12:181a9415736b 18 #include "mbed.h"
mbed_official 22:69ea34ad7fc6 19 #include <math.h>
geky 12:181a9415736b 20
geky 12:181a9415736b 21
geky 12:181a9415736b 22 // C027Interface implementation
geky 12:181a9415736b 23 C027Interface::C027Interface(const char *simpin, bool debug)
geky 12:181a9415736b 24 : _debug(debug)
geky 12:181a9415736b 25 {
geky 12:181a9415736b 26 strcpy(_pin, simpin);
mbed_official 23:5e320842ccad 27 memset(_cbs, 0, sizeof(_cbs));
sarahmarshy 19:fed715eb9c83 28 running = false;
geky 12:181a9415736b 29 }
geky 12:181a9415736b 30
mbed_official 21:0c4d90bc84af 31 C027Interface::~C027Interface()
mbed_official 21:0c4d90bc84af 32 {
mbed_official 23:5e320842ccad 33 if(running)
mbed_official 23:5e320842ccad 34 _thread.join();
mbed_official 21:0c4d90bc84af 35 }
mbed_official 21:0c4d90bc84af 36
mbed_official 21:0c4d90bc84af 37 nsapi_error_t C027Interface::set_credentials(const char *apn, const char *username, const char *password)
mbed_official 21:0c4d90bc84af 38 {
mbed_official 21:0c4d90bc84af 39 memset(_apn, 0, sizeof(_apn));
mbed_official 21:0c4d90bc84af 40 strncpy(_apn, apn, sizeof(_apn));
mbed_official 21:0c4d90bc84af 41
mbed_official 21:0c4d90bc84af 42 memset(_username, 0, sizeof(_username));
mbed_official 21:0c4d90bc84af 43 strncpy(_username, username, sizeof(_username));
mbed_official 21:0c4d90bc84af 44
mbed_official 21:0c4d90bc84af 45 memset(_password, 0, sizeof(_password));
mbed_official 21:0c4d90bc84af 46 strncpy(_password, password, sizeof(_password));
mbed_official 21:0c4d90bc84af 47 return 0;
mbed_official 21:0c4d90bc84af 48 }
mbed_official 21:0c4d90bc84af 49
mbed_official 21:0c4d90bc84af 50 nsapi_error_t C027Interface::connect()
geky 12:181a9415736b 51 {
geky 12:181a9415736b 52 // create the modem
geky 12:181a9415736b 53 _mdm = new MDMSerial;
geky 12:181a9415736b 54 if (_debug) {
geky 12:181a9415736b 55 _mdm->setDebug(4);
geky 12:181a9415736b 56 } else {
geky 12:181a9415736b 57 _mdm->setDebug(0);
geky 12:181a9415736b 58 }
geky 12:181a9415736b 59
geky 12:181a9415736b 60 // initialize the modem
geky 12:181a9415736b 61 MDMParser::DevStatus devStatus = {};
geky 12:181a9415736b 62 MDMParser::NetStatus netStatus = {};
geky 12:181a9415736b 63 bool mdmOk = _mdm->init(_pin, &devStatus);
geky 12:181a9415736b 64 if (_debug) {
geky 12:181a9415736b 65 _mdm->dumpDevStatus(&devStatus);
geky 12:181a9415736b 66 }
geky 12:181a9415736b 67
geky 12:181a9415736b 68 if (mdmOk) {
geky 12:181a9415736b 69 // wait until we are connected
geky 12:181a9415736b 70 mdmOk = _mdm->registerNet(&netStatus);
geky 12:181a9415736b 71 if (_debug) {
geky 12:181a9415736b 72 _mdm->dumpNetStatus(&netStatus);
geky 12:181a9415736b 73 }
geky 12:181a9415736b 74 }
geky 12:181a9415736b 75
Christopher Haster 14:3d1845f5cd81 76 if (mdmOk) {
geky 12:181a9415736b 77 // join the internet connection
mbed_official 21:0c4d90bc84af 78 MDMParser::IP ip = _mdm->join(_apn, _username, _password);
geky 15:21d4f56eb172 79 _ip_address.set_ip_bytes(&ip, NSAPI_IPv4);
geky 12:181a9415736b 80 mdmOk = (ip != NOIP);
geky 12:181a9415736b 81 }
geky 12:181a9415736b 82
Christopher Haster 14:3d1845f5cd81 83 return mdmOk ? 0 : NSAPI_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 84 }
mbed_official 21:0c4d90bc84af 85
mbed_official 21:0c4d90bc84af 86 nsapi_error_t C027Interface::connect(const char *apn, const char *username, const char *password)
mbed_official 21:0c4d90bc84af 87 {
mbed_official 21:0c4d90bc84af 88
mbed_official 21:0c4d90bc84af 89 set_credentials(apn, username, password);
mbed_official 21:0c4d90bc84af 90 return connect();
mbed_official 21:0c4d90bc84af 91 }
geky 12:181a9415736b 92
Christopher Haster 14:3d1845f5cd81 93 int C027Interface::disconnect()
geky 12:181a9415736b 94 {
geky 12:181a9415736b 95 if (!_mdm->disconnect()) {
Christopher Haster 14:3d1845f5cd81 96 return NSAPI_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 97 }
geky 12:181a9415736b 98
geky 12:181a9415736b 99 return 0;
geky 12:181a9415736b 100 }
geky 12:181a9415736b 101
Christopher Haster 14:3d1845f5cd81 102 const char *C027Interface::get_ip_address()
geky 12:181a9415736b 103 {
geky 15:21d4f56eb172 104 return _ip_address.get_ip_address();
geky 12:181a9415736b 105 }
geky 12:181a9415736b 106
Christopher Haster 14:3d1845f5cd81 107 const char *C027Interface::get_mac_address()
geky 12:181a9415736b 108 {
geky 12:181a9415736b 109 return 0;
geky 12:181a9415736b 110 }
geky 12:181a9415736b 111
Christopher Haster 14:3d1845f5cd81 112 struct c027_socket {
Christopher Haster 14:3d1845f5cd81 113 int socket;
Christopher Haster 14:3d1845f5cd81 114 MDMParser::IpProtocol proto;
Christopher Haster 14:3d1845f5cd81 115 MDMParser::IP ip;
Christopher Haster 14:3d1845f5cd81 116 int port;
Christopher Haster 14:3d1845f5cd81 117 };
Christopher Haster 14:3d1845f5cd81 118
Christopher Haster 14:3d1845f5cd81 119 int C027Interface::socket_open(void **handle, nsapi_protocol_t proto)
geky 12:181a9415736b 120 {
Christopher Haster 14:3d1845f5cd81 121 MDMParser::IpProtocol mdmproto = (proto == NSAPI_UDP) ? MDMParser::IPPROTO_UDP : MDMParser::IPPROTO_TCP;
Christopher Haster 14:3d1845f5cd81 122 int fd = _mdm->socketSocket(mdmproto);
Christopher Haster 14:3d1845f5cd81 123 if (fd < 0) {
Christopher Haster 14:3d1845f5cd81 124 return NSAPI_ERROR_NO_SOCKET;
geky 12:181a9415736b 125 }
geky 12:181a9415736b 126
Christopher Haster 14:3d1845f5cd81 127 _mdm->socketSetBlocking(fd, 10000);
Christopher Haster 14:3d1845f5cd81 128 struct c027_socket *socket = new struct c027_socket;
Christopher Haster 14:3d1845f5cd81 129 if (!socket) {
Christopher Haster 14:3d1845f5cd81 130 return NSAPI_ERROR_NO_SOCKET;
Christopher Haster 14:3d1845f5cd81 131 }
geky 12:181a9415736b 132
Christopher Haster 14:3d1845f5cd81 133 socket->socket = fd;
Christopher Haster 14:3d1845f5cd81 134 socket->proto = mdmproto;
Christopher Haster 14:3d1845f5cd81 135 *handle = socket;
Christopher Haster 14:3d1845f5cd81 136 return 0;
geky 12:181a9415736b 137 }
geky 12:181a9415736b 138
Christopher Haster 14:3d1845f5cd81 139 int C027Interface::socket_close(void *handle)
geky 12:181a9415736b 140 {
Christopher Haster 14:3d1845f5cd81 141 struct c027_socket *socket = (struct c027_socket *)handle;
Christopher Haster 14:3d1845f5cd81 142 _mdm->socketFree(socket->socket);
geky 12:181a9415736b 143
geky 12:181a9415736b 144 delete socket;
Christopher Haster 14:3d1845f5cd81 145 return 0;
geky 12:181a9415736b 146 }
geky 12:181a9415736b 147
Christopher Haster 14:3d1845f5cd81 148 int C027Interface::socket_bind(void *handle, const SocketAddress &address)
Christopher Haster 14:3d1845f5cd81 149 {
Christopher Haster 14:3d1845f5cd81 150 return NSAPI_ERROR_UNSUPPORTED;
Christopher Haster 14:3d1845f5cd81 151 }
geky 12:181a9415736b 152
Christopher Haster 14:3d1845f5cd81 153 int C027Interface::socket_listen(void *handle, int backlog)
geky 12:181a9415736b 154 {
Christopher Haster 14:3d1845f5cd81 155 return NSAPI_ERROR_UNSUPPORTED;
Christopher Haster 14:3d1845f5cd81 156 }
Christopher Haster 14:3d1845f5cd81 157
Christopher Haster 14:3d1845f5cd81 158 int C027Interface::socket_connect(void *handle, const SocketAddress &addr)
Christopher Haster 14:3d1845f5cd81 159 {
Christopher Haster 14:3d1845f5cd81 160 struct c027_socket *socket = (struct c027_socket *)handle;
geky 12:181a9415736b 161
Christopher Haster 14:3d1845f5cd81 162 if (!_mdm->socketConnect(socket->socket, addr.get_ip_address(), addr.get_port())) {
Christopher Haster 14:3d1845f5cd81 163 return NSAPI_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 164 }
geky 12:181a9415736b 165
geky 12:181a9415736b 166 return 0;
geky 12:181a9415736b 167 }
geky 12:181a9415736b 168
mbed_official 21:0c4d90bc84af 169 nsapi_error_t C027Interface::socket_accept(nsapi_socket_t server,
mbed_official 21:0c4d90bc84af 170 nsapi_socket_t *handle, SocketAddress *address)
geky 12:181a9415736b 171 {
Christopher Haster 14:3d1845f5cd81 172 return NSAPI_ERROR_UNSUPPORTED;
geky 12:181a9415736b 173 }
geky 12:181a9415736b 174
Christopher Haster 14:3d1845f5cd81 175 int C027Interface::socket_send(void *handle, const void *data, unsigned size)
geky 12:181a9415736b 176 {
mbed_official 22:69ea34ad7fc6 177 m.lock();
mbed_official 22:69ea34ad7fc6 178 struct c027_socket *socket = (struct c027_socket *)handle;
Christopher Haster 14:3d1845f5cd81 179
Christopher Haster 14:3d1845f5cd81 180 int sent = _mdm->socketSend(socket->socket, (const char *)data, size);
mbed_official 22:69ea34ad7fc6 181 m.unlock();
Christopher Haster 14:3d1845f5cd81 182 if (sent == SOCKET_ERROR) {
Christopher Haster 14:3d1845f5cd81 183 return NSAPI_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 184 }
geky 12:181a9415736b 185
Christopher Haster 14:3d1845f5cd81 186 return sent;
geky 12:181a9415736b 187 }
geky 12:181a9415736b 188
Christopher Haster 14:3d1845f5cd81 189 int C027Interface::socket_recv(void *handle, void *data, unsigned size)
geky 12:181a9415736b 190 {
mbed_official 22:69ea34ad7fc6 191 m.lock();
mbed_official 22:69ea34ad7fc6 192 struct c027_socket *socket = (struct c027_socket *)handle;
mbed_official 21:0c4d90bc84af 193
mbed_official 21:0c4d90bc84af 194 if (!_mdm->socketReadable(socket->socket)) {
mbed_official 22:69ea34ad7fc6 195 m.unlock();
Christopher Haster 14:3d1845f5cd81 196 return NSAPI_ERROR_WOULD_BLOCK;
geky 12:181a9415736b 197 }
mbed_official 22:69ea34ad7fc6 198
mbed_official 22:69ea34ad7fc6 199 int size_r = size >= 200 ? 200 : size;
mbed_official 22:69ea34ad7fc6 200
mbed_official 22:69ea34ad7fc6 201 int recv = _mdm->socketRecv(socket->socket, (char *)data, size_r);
mbed_official 22:69ea34ad7fc6 202 m.unlock();
geky 12:181a9415736b 203 if (recv == SOCKET_ERROR) {
Christopher Haster 14:3d1845f5cd81 204 return NSAPI_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 205 }
geky 12:181a9415736b 206 return recv;
geky 12:181a9415736b 207 }
geky 12:181a9415736b 208
Christopher Haster 14:3d1845f5cd81 209 int C027Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
Christopher Haster 14:3d1845f5cd81 210 {
Christopher Haster 14:3d1845f5cd81 211 struct c027_socket *socket = (struct c027_socket *)handle;
geky 12:181a9415736b 212
geky 15:21d4f56eb172 213 int sent = _mdm->socketSendTo(socket->socket,
geky 15:21d4f56eb172 214 *(MDMParser::IP *)addr.get_ip_bytes(), addr.get_port(),
geky 15:21d4f56eb172 215 (const char *)data, size);
geky 15:21d4f56eb172 216
Christopher Haster 14:3d1845f5cd81 217 if (sent == SOCKET_ERROR) {
Christopher Haster 14:3d1845f5cd81 218 return NSAPI_ERROR_DEVICE_ERROR;
Christopher Haster 14:3d1845f5cd81 219 }
Christopher Haster 14:3d1845f5cd81 220
Christopher Haster 14:3d1845f5cd81 221 return sent;
Christopher Haster 14:3d1845f5cd81 222 }
Christopher Haster 14:3d1845f5cd81 223
Christopher Haster 14:3d1845f5cd81 224 int C027Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
Christopher Haster 14:3d1845f5cd81 225 {
Christopher Haster 14:3d1845f5cd81 226 struct c027_socket *socket = (struct c027_socket *)handle;
Christopher Haster 14:3d1845f5cd81 227 if (!_mdm->socketReadable(socket->socket)) {
Christopher Haster 14:3d1845f5cd81 228 return NSAPI_ERROR_WOULD_BLOCK;
Christopher Haster 14:3d1845f5cd81 229 }
Christopher Haster 14:3d1845f5cd81 230
Christopher Haster 14:3d1845f5cd81 231 MDMParser::IP ip;
Christopher Haster 14:3d1845f5cd81 232 int port;
Christopher Haster 14:3d1845f5cd81 233
Christopher Haster 14:3d1845f5cd81 234 int recv = _mdm->socketRecvFrom(socket->socket, &ip, &port, (char *)data, size);
Christopher Haster 14:3d1845f5cd81 235 if (recv == SOCKET_ERROR) {
Christopher Haster 14:3d1845f5cd81 236 return NSAPI_ERROR_DEVICE_ERROR;
Christopher Haster 14:3d1845f5cd81 237 }
Christopher Haster 14:3d1845f5cd81 238
Christopher Haster 14:3d1845f5cd81 239 if (addr) {
geky 15:21d4f56eb172 240 addr->set_ip_bytes(&ip, NSAPI_IPv4);
Christopher Haster 14:3d1845f5cd81 241 addr->set_port(port);
Christopher Haster 14:3d1845f5cd81 242 }
Christopher Haster 14:3d1845f5cd81 243
Christopher Haster 14:3d1845f5cd81 244 return recv;
Christopher Haster 14:3d1845f5cd81 245 }
Christopher Haster 14:3d1845f5cd81 246
sarahmarshy 19:fed715eb9c83 247 void C027Interface::socket_check()
sarahmarshy 16:eaf31bd133f0 248 {
sarahmarshy 19:fed715eb9c83 249 while(running){
mbed_official 21:0c4d90bc84af 250 for (int i = 0; i < NUMSOCKETS; i++){
mbed_official 22:69ea34ad7fc6 251 m.lock();
mbed_official 21:0c4d90bc84af 252 int readable = _mdm->socketReadable(i);
mbed_official 22:69ea34ad7fc6 253 m.unlock();
mbed_official 22:69ea34ad7fc6 254 if (readable != -1 && readable != 0) {
mbed_official 21:0c4d90bc84af 255 event();
sarahmarshy 19:fed715eb9c83 256 }
sarahmarshy 19:fed715eb9c83 257 }
mbed_official 21:0c4d90bc84af 258 wait(1);
mbed_official 21:0c4d90bc84af 259 }
mbed_official 21:0c4d90bc84af 260 running = false;
sarahmarshy 19:fed715eb9c83 261 }
sarahmarshy 19:fed715eb9c83 262
sarahmarshy 19:fed715eb9c83 263
sarahmarshy 19:fed715eb9c83 264 void C027Interface::event(){
mbed_official 21:0c4d90bc84af 265 for (int i = 0; i < NUMSOCKETS; i++){
mbed_official 21:0c4d90bc84af 266 if (_cbs[i].callback) {
mbed_official 21:0c4d90bc84af 267 _cbs[i].callback(_cbs[i].data);
mbed_official 21:0c4d90bc84af 268 }
mbed_official 21:0c4d90bc84af 269 }
sarahmarshy 16:eaf31bd133f0 270 }
sarahmarshy 16:eaf31bd133f0 271
Christopher Haster 14:3d1845f5cd81 272 void C027Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
Christopher Haster 14:3d1845f5cd81 273 {
mbed_official 21:0c4d90bc84af 274 struct c027_socket *socket = (struct c027_socket *)handle;
mbed_official 21:0c4d90bc84af 275 _cbs[socket->socket].callback = callback;
mbed_official 21:0c4d90bc84af 276 _cbs[socket->socket].data = data;
sarahmarshy 19:fed715eb9c83 277 if(!running){
sarahmarshy 19:fed715eb9c83 278 running = true;
sarahmarshy 19:fed715eb9c83 279 _thread.start(this, &C027Interface::socket_check);
sarahmarshy 19:fed715eb9c83 280 }
Christopher Haster 14:3d1845f5cd81 281 }
sarahmarshy 19:fed715eb9c83 282