C027 Interface

Dependencies:   C027_Support(p)

Fork of C027Interface by NetworkSocketAPI

Committer:
geky
Date:
Fri Apr 15 16:06:47 2016 +0000
Revision:
12:181a9415736b
Child:
14:3d1845f5cd81
Created C027Interface

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"
geky 12:181a9415736b 19
geky 12:181a9415736b 20
geky 12:181a9415736b 21 static void ipToString(MDMParser::IP ip, char *buffer) {
geky 12:181a9415736b 22 sprintf(buffer, IPSTR, IPNUM(ip));
geky 12:181a9415736b 23 }
geky 12:181a9415736b 24
geky 12:181a9415736b 25
geky 12:181a9415736b 26 // C027Interface implementation
geky 12:181a9415736b 27 C027Interface::C027Interface(const char *simpin, bool debug)
geky 12:181a9415736b 28 : _debug(debug)
geky 12:181a9415736b 29 {
geky 12:181a9415736b 30 strcpy(_pin, simpin);
geky 12:181a9415736b 31 }
geky 12:181a9415736b 32
geky 12:181a9415736b 33 int32_t C027Interface::connect(const char *apn, const char *username, const char *password)
geky 12:181a9415736b 34 {
geky 12:181a9415736b 35 // create the modem
geky 12:181a9415736b 36 _mdm = new MDMSerial;
geky 12:181a9415736b 37 if (_debug) {
geky 12:181a9415736b 38 _mdm->setDebug(4);
geky 12:181a9415736b 39 } else {
geky 12:181a9415736b 40 _mdm->setDebug(0);
geky 12:181a9415736b 41 }
geky 12:181a9415736b 42
geky 12:181a9415736b 43 // initialize the modem
geky 12:181a9415736b 44 MDMParser::DevStatus devStatus = {};
geky 12:181a9415736b 45 MDMParser::NetStatus netStatus = {};
geky 12:181a9415736b 46 bool mdmOk = _mdm->init(_pin, &devStatus);
geky 12:181a9415736b 47 if (_debug) {
geky 12:181a9415736b 48 _mdm->dumpDevStatus(&devStatus);
geky 12:181a9415736b 49 }
geky 12:181a9415736b 50
geky 12:181a9415736b 51 if (mdmOk) {
geky 12:181a9415736b 52 // wait until we are connected
geky 12:181a9415736b 53 mdmOk = _mdm->registerNet(&netStatus);
geky 12:181a9415736b 54 if (_debug) {
geky 12:181a9415736b 55 _mdm->dumpNetStatus(&netStatus);
geky 12:181a9415736b 56 }
geky 12:181a9415736b 57 }
geky 12:181a9415736b 58
geky 12:181a9415736b 59 if (mdmOk)
geky 12:181a9415736b 60 {
geky 12:181a9415736b 61 // join the internet connection
geky 12:181a9415736b 62 MDMParser::IP ip = _mdm->join(apn, username, password);
geky 12:181a9415736b 63 ipToString(ip, _ip_address);
geky 12:181a9415736b 64 mdmOk = (ip != NOIP);
geky 12:181a9415736b 65 }
geky 12:181a9415736b 66
geky 12:181a9415736b 67 return mdmOk ? 0 : NS_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 68 }
geky 12:181a9415736b 69
geky 12:181a9415736b 70 int32_t C027Interface::disconnect()
geky 12:181a9415736b 71 {
geky 12:181a9415736b 72 if (!_mdm->disconnect()) {
geky 12:181a9415736b 73 return NS_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 74 }
geky 12:181a9415736b 75
geky 12:181a9415736b 76 return 0;
geky 12:181a9415736b 77 }
geky 12:181a9415736b 78
geky 12:181a9415736b 79 const char *C027Interface::getIPAddress()
geky 12:181a9415736b 80 {
geky 12:181a9415736b 81 return _ip_address;
geky 12:181a9415736b 82 }
geky 12:181a9415736b 83
geky 12:181a9415736b 84 const char *C027Interface::getMACAddress()
geky 12:181a9415736b 85 {
geky 12:181a9415736b 86 return 0;
geky 12:181a9415736b 87 }
geky 12:181a9415736b 88
geky 12:181a9415736b 89 SocketInterface *C027Interface::createSocket(ns_protocol_t proto)
geky 12:181a9415736b 90 {
geky 12:181a9415736b 91 MDMParser::IpProtocol mdmproto = (proto == NS_UDP) ? MDMParser::IPPROTO_UDP : MDMParser::IPPROTO_TCP;
geky 12:181a9415736b 92 int socket = _mdm->socketSocket(mdmproto);
geky 12:181a9415736b 93 if (socket < 0) {
geky 12:181a9415736b 94 return 0;
geky 12:181a9415736b 95 }
geky 12:181a9415736b 96
geky 12:181a9415736b 97 _mdm->socketSetBlocking(socket, 10000);
geky 12:181a9415736b 98
geky 12:181a9415736b 99 return new C027Socket(_mdm, socket, mdmproto);
geky 12:181a9415736b 100 }
geky 12:181a9415736b 101
geky 12:181a9415736b 102 void C027Interface::destroySocket(SocketInterface *siface)
geky 12:181a9415736b 103 {
geky 12:181a9415736b 104 C027Socket *socket = (C027Socket *)siface;
geky 12:181a9415736b 105 _mdm->socketFree(socket->_socket);
geky 12:181a9415736b 106
geky 12:181a9415736b 107 delete socket;
geky 12:181a9415736b 108 }
geky 12:181a9415736b 109
geky 12:181a9415736b 110
geky 12:181a9415736b 111 // TCP SocketInterface implementation
geky 12:181a9415736b 112 int32_t C027Interface::C027Socket::open(const char *ip, uint16_t port)
geky 12:181a9415736b 113 {
geky 12:181a9415736b 114 _ip = _mdm->gethostbyname(ip);
geky 12:181a9415736b 115 _port = port;
geky 12:181a9415736b 116
geky 12:181a9415736b 117 if (_proto == MDMParser::IPPROTO_TCP) {
geky 12:181a9415736b 118 if (!_mdm->socketConnect(_socket, ip, port)) {
geky 12:181a9415736b 119 return NS_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 120 }
geky 12:181a9415736b 121 }
geky 12:181a9415736b 122
geky 12:181a9415736b 123 return 0;
geky 12:181a9415736b 124 }
geky 12:181a9415736b 125
geky 12:181a9415736b 126 int32_t C027Interface::C027Socket::close()
geky 12:181a9415736b 127 {
geky 12:181a9415736b 128 if (_proto == MDMParser::IPPROTO_TCP) {
geky 12:181a9415736b 129 if (!_mdm->socketClose(_socket)) {
geky 12:181a9415736b 130 return NS_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 131 }
geky 12:181a9415736b 132 }
geky 12:181a9415736b 133
geky 12:181a9415736b 134 return 0;
geky 12:181a9415736b 135 }
geky 12:181a9415736b 136
geky 12:181a9415736b 137 int32_t C027Interface::C027Socket::send(const void *data, uint32_t size)
geky 12:181a9415736b 138 {
geky 12:181a9415736b 139 int sent;
geky 12:181a9415736b 140
geky 12:181a9415736b 141 if (_proto == MDMParser::IPPROTO_TCP) {
geky 12:181a9415736b 142 sent = _mdm->socketSend(_socket, (const char *)data, size);
geky 12:181a9415736b 143 } else {
geky 12:181a9415736b 144 sent = _mdm->socketSendTo(_socket, _ip, _port, (const char *)data, size);
geky 12:181a9415736b 145 }
geky 12:181a9415736b 146
geky 12:181a9415736b 147 if (sent != size) {
geky 12:181a9415736b 148 return NS_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 149 }
geky 12:181a9415736b 150
geky 12:181a9415736b 151 return 0;
geky 12:181a9415736b 152 }
geky 12:181a9415736b 153
geky 12:181a9415736b 154 int32_t C027Interface::C027Socket::recv(void *data, uint32_t size)
geky 12:181a9415736b 155 {
geky 12:181a9415736b 156 if (!_mdm->socketReadable(_socket)) {
geky 12:181a9415736b 157 return NS_ERROR_WOULD_BLOCK;
geky 12:181a9415736b 158 }
geky 12:181a9415736b 159
geky 12:181a9415736b 160 int recv;
geky 12:181a9415736b 161
geky 12:181a9415736b 162 if (_proto == MDMParser::IPPROTO_TCP) {
geky 12:181a9415736b 163 recv = _mdm->socketRecv(_socket, (char *)data, size);
geky 12:181a9415736b 164 } else {
geky 12:181a9415736b 165 MDMParser::IP ip;
geky 12:181a9415736b 166 int port;
geky 12:181a9415736b 167 recv = _mdm->socketRecvFrom(_socket, &ip, &port, (char *)data, size);
geky 12:181a9415736b 168 }
geky 12:181a9415736b 169
geky 12:181a9415736b 170 if (recv == SOCKET_ERROR) {
geky 12:181a9415736b 171 return NS_ERROR_DEVICE_ERROR;
geky 12:181a9415736b 172 }
geky 12:181a9415736b 173
geky 12:181a9415736b 174 return recv;
geky 12:181a9415736b 175 }
geky 12:181a9415736b 176
geky 12:181a9415736b 177