Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of C027Interface by
C027Interface.cpp@12:181a9415736b, 2016-04-15 (annotated)
- 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?
| User | Revision | Line number | New 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 |
