Dependents:   mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510

Committer:
jacobjohnson
Date:
Mon Feb 27 17:45:05 2017 +0000
Revision:
1:f30bdcd2b33b
Parent:
0:098463de4c5d
changed the inputscale from 1 to 7 in analogin_api.c.  This will need to be changed later, and accessed from the main level, but for now this allows the  adc to read a value from 0 to 3.7V, instead of just up to 1V.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-onsemi 0:098463de4c5d 1 /* Socket
group-onsemi 0:098463de4c5d 2 * Copyright (c) 2015 ARM Limited
group-onsemi 0:098463de4c5d 3 *
group-onsemi 0:098463de4c5d 4 * Licensed under the Apache License, Version 2.0 (the "License");
group-onsemi 0:098463de4c5d 5 * you may not use this file except in compliance with the License.
group-onsemi 0:098463de4c5d 6 * You may obtain a copy of the License at
group-onsemi 0:098463de4c5d 7 *
group-onsemi 0:098463de4c5d 8 * http://www.apache.org/licenses/LICENSE-2.0
group-onsemi 0:098463de4c5d 9 *
group-onsemi 0:098463de4c5d 10 * Unless required by applicable law or agreed to in writing, software
group-onsemi 0:098463de4c5d 11 * distributed under the License is distributed on an "AS IS" BASIS,
group-onsemi 0:098463de4c5d 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
group-onsemi 0:098463de4c5d 13 * See the License for the specific language governing permissions and
group-onsemi 0:098463de4c5d 14 * limitations under the License.
group-onsemi 0:098463de4c5d 15 */
group-onsemi 0:098463de4c5d 16
group-onsemi 0:098463de4c5d 17 #include "TCPSocket.h"
group-onsemi 0:098463de4c5d 18 #include "Timer.h"
group-onsemi 0:098463de4c5d 19 #include "mbed_assert.h"
group-onsemi 0:098463de4c5d 20
group-onsemi 0:098463de4c5d 21 TCPSocket::TCPSocket()
group-onsemi 0:098463de4c5d 22 : _pending(1), _read_sem(0), _write_sem(0),
group-onsemi 0:098463de4c5d 23 _read_in_progress(false), _write_in_progress(false)
group-onsemi 0:098463de4c5d 24 {
group-onsemi 0:098463de4c5d 25 }
group-onsemi 0:098463de4c5d 26
group-onsemi 0:098463de4c5d 27 TCPSocket::~TCPSocket()
group-onsemi 0:098463de4c5d 28 {
group-onsemi 0:098463de4c5d 29 close();
group-onsemi 0:098463de4c5d 30 }
group-onsemi 0:098463de4c5d 31
group-onsemi 0:098463de4c5d 32 nsapi_protocol_t TCPSocket::get_proto()
group-onsemi 0:098463de4c5d 33 {
group-onsemi 0:098463de4c5d 34 return NSAPI_TCP;
group-onsemi 0:098463de4c5d 35 }
group-onsemi 0:098463de4c5d 36
group-onsemi 0:098463de4c5d 37 nsapi_error_t TCPSocket::connect(const SocketAddress &address)
group-onsemi 0:098463de4c5d 38 {
group-onsemi 0:098463de4c5d 39 _lock.lock();
group-onsemi 0:098463de4c5d 40 nsapi_error_t ret;
group-onsemi 0:098463de4c5d 41
group-onsemi 0:098463de4c5d 42 // If this assert is hit then there are two threads
group-onsemi 0:098463de4c5d 43 // performing a send at the same time which is undefined
group-onsemi 0:098463de4c5d 44 // behavior
group-onsemi 0:098463de4c5d 45 MBED_ASSERT(!_write_in_progress);
group-onsemi 0:098463de4c5d 46 _write_in_progress = true;
group-onsemi 0:098463de4c5d 47
group-onsemi 0:098463de4c5d 48 bool blocking_connect_in_progress = false;
group-onsemi 0:098463de4c5d 49
group-onsemi 0:098463de4c5d 50 while (true) {
group-onsemi 0:098463de4c5d 51 if (!_socket) {
group-onsemi 0:098463de4c5d 52 ret = NSAPI_ERROR_NO_SOCKET;
group-onsemi 0:098463de4c5d 53 break;
group-onsemi 0:098463de4c5d 54 }
group-onsemi 0:098463de4c5d 55
group-onsemi 0:098463de4c5d 56 _pending = 0;
group-onsemi 0:098463de4c5d 57 ret = _stack->socket_connect(_socket, address);
group-onsemi 0:098463de4c5d 58 if ((_timeout == 0) || !(ret == NSAPI_ERROR_IN_PROGRESS || ret == NSAPI_ERROR_ALREADY)) {
group-onsemi 0:098463de4c5d 59 break;
group-onsemi 0:098463de4c5d 60 } else {
group-onsemi 0:098463de4c5d 61 blocking_connect_in_progress = true;
group-onsemi 0:098463de4c5d 62
group-onsemi 0:098463de4c5d 63 int32_t count;
group-onsemi 0:098463de4c5d 64
group-onsemi 0:098463de4c5d 65 // Release lock before blocking so other threads
group-onsemi 0:098463de4c5d 66 // accessing this object aren't blocked
group-onsemi 0:098463de4c5d 67 _lock.unlock();
group-onsemi 0:098463de4c5d 68 count = _write_sem.wait(_timeout);
group-onsemi 0:098463de4c5d 69 _lock.lock();
group-onsemi 0:098463de4c5d 70
group-onsemi 0:098463de4c5d 71 if (count < 1) {
group-onsemi 0:098463de4c5d 72 // Semaphore wait timed out so break out and return
group-onsemi 0:098463de4c5d 73 break;
group-onsemi 0:098463de4c5d 74 }
group-onsemi 0:098463de4c5d 75 }
group-onsemi 0:098463de4c5d 76 }
group-onsemi 0:098463de4c5d 77
group-onsemi 0:098463de4c5d 78 _write_in_progress = false;
group-onsemi 0:098463de4c5d 79
group-onsemi 0:098463de4c5d 80 /* Non-blocking connect gives "EISCONN" once done - convert to OK for blocking mode if we became connected during this call */
group-onsemi 0:098463de4c5d 81 if (ret == NSAPI_ERROR_IS_CONNECTED && blocking_connect_in_progress) {
group-onsemi 0:098463de4c5d 82 ret = NSAPI_ERROR_OK;
group-onsemi 0:098463de4c5d 83 }
group-onsemi 0:098463de4c5d 84
group-onsemi 0:098463de4c5d 85 _lock.unlock();
group-onsemi 0:098463de4c5d 86 return ret;
group-onsemi 0:098463de4c5d 87 }
group-onsemi 0:098463de4c5d 88
group-onsemi 0:098463de4c5d 89 nsapi_error_t TCPSocket::connect(const char *host, uint16_t port)
group-onsemi 0:098463de4c5d 90 {
group-onsemi 0:098463de4c5d 91 SocketAddress address;
group-onsemi 0:098463de4c5d 92 nsapi_error_t err = _stack->gethostbyname(host, &address);
group-onsemi 0:098463de4c5d 93 if (err) {
group-onsemi 0:098463de4c5d 94 return NSAPI_ERROR_DNS_FAILURE;
group-onsemi 0:098463de4c5d 95 }
group-onsemi 0:098463de4c5d 96
group-onsemi 0:098463de4c5d 97 address.set_port(port);
group-onsemi 0:098463de4c5d 98
group-onsemi 0:098463de4c5d 99 // connect is thread safe
group-onsemi 0:098463de4c5d 100 return connect(address);
group-onsemi 0:098463de4c5d 101 }
group-onsemi 0:098463de4c5d 102
group-onsemi 0:098463de4c5d 103 nsapi_size_or_error_t TCPSocket::send(const void *data, nsapi_size_t size)
group-onsemi 0:098463de4c5d 104 {
group-onsemi 0:098463de4c5d 105 _lock.lock();
group-onsemi 0:098463de4c5d 106 nsapi_size_or_error_t ret;
group-onsemi 0:098463de4c5d 107
group-onsemi 0:098463de4c5d 108 // If this assert is hit then there are two threads
group-onsemi 0:098463de4c5d 109 // performing a send at the same time which is undefined
group-onsemi 0:098463de4c5d 110 // behavior
group-onsemi 0:098463de4c5d 111 MBED_ASSERT(!_write_in_progress);
group-onsemi 0:098463de4c5d 112 _write_in_progress = true;
group-onsemi 0:098463de4c5d 113
group-onsemi 0:098463de4c5d 114 while (true) {
group-onsemi 0:098463de4c5d 115 if (!_socket) {
group-onsemi 0:098463de4c5d 116 ret = NSAPI_ERROR_NO_SOCKET;
group-onsemi 0:098463de4c5d 117 break;
group-onsemi 0:098463de4c5d 118 }
group-onsemi 0:098463de4c5d 119
group-onsemi 0:098463de4c5d 120 _pending = 0;
group-onsemi 0:098463de4c5d 121 ret = _stack->socket_send(_socket, data, size);
group-onsemi 0:098463de4c5d 122 if ((_timeout == 0) || (ret != NSAPI_ERROR_WOULD_BLOCK)) {
group-onsemi 0:098463de4c5d 123 break;
group-onsemi 0:098463de4c5d 124 } else {
group-onsemi 0:098463de4c5d 125 int32_t count;
group-onsemi 0:098463de4c5d 126
group-onsemi 0:098463de4c5d 127 // Release lock before blocking so other threads
group-onsemi 0:098463de4c5d 128 // accessing this object aren't blocked
group-onsemi 0:098463de4c5d 129 _lock.unlock();
group-onsemi 0:098463de4c5d 130 count = _write_sem.wait(_timeout);
group-onsemi 0:098463de4c5d 131 _lock.lock();
group-onsemi 0:098463de4c5d 132
group-onsemi 0:098463de4c5d 133 if (count < 1) {
group-onsemi 0:098463de4c5d 134 // Semaphore wait timed out so break out and return
group-onsemi 0:098463de4c5d 135 ret = NSAPI_ERROR_WOULD_BLOCK;
group-onsemi 0:098463de4c5d 136 break;
group-onsemi 0:098463de4c5d 137 }
group-onsemi 0:098463de4c5d 138 }
group-onsemi 0:098463de4c5d 139 }
group-onsemi 0:098463de4c5d 140
group-onsemi 0:098463de4c5d 141 _write_in_progress = false;
group-onsemi 0:098463de4c5d 142 _lock.unlock();
group-onsemi 0:098463de4c5d 143 return ret;
group-onsemi 0:098463de4c5d 144 }
group-onsemi 0:098463de4c5d 145
group-onsemi 0:098463de4c5d 146 nsapi_size_or_error_t TCPSocket::recv(void *data, nsapi_size_t size)
group-onsemi 0:098463de4c5d 147 {
group-onsemi 0:098463de4c5d 148 _lock.lock();
group-onsemi 0:098463de4c5d 149 nsapi_size_or_error_t ret;
group-onsemi 0:098463de4c5d 150
group-onsemi 0:098463de4c5d 151 // If this assert is hit then there are two threads
group-onsemi 0:098463de4c5d 152 // performing a recv at the same time which is undefined
group-onsemi 0:098463de4c5d 153 // behavior
group-onsemi 0:098463de4c5d 154 MBED_ASSERT(!_read_in_progress);
group-onsemi 0:098463de4c5d 155 _read_in_progress = true;
group-onsemi 0:098463de4c5d 156
group-onsemi 0:098463de4c5d 157 while (true) {
group-onsemi 0:098463de4c5d 158 if (!_socket) {
group-onsemi 0:098463de4c5d 159 ret = NSAPI_ERROR_NO_SOCKET;
group-onsemi 0:098463de4c5d 160 break;
group-onsemi 0:098463de4c5d 161 }
group-onsemi 0:098463de4c5d 162
group-onsemi 0:098463de4c5d 163 _pending = 0;
group-onsemi 0:098463de4c5d 164 ret = _stack->socket_recv(_socket, data, size);
group-onsemi 0:098463de4c5d 165 if ((_timeout == 0) || (ret != NSAPI_ERROR_WOULD_BLOCK)) {
group-onsemi 0:098463de4c5d 166 break;
group-onsemi 0:098463de4c5d 167 } else {
group-onsemi 0:098463de4c5d 168 int32_t count;
group-onsemi 0:098463de4c5d 169
group-onsemi 0:098463de4c5d 170 // Release lock before blocking so other threads
group-onsemi 0:098463de4c5d 171 // accessing this object aren't blocked
group-onsemi 0:098463de4c5d 172 _lock.unlock();
group-onsemi 0:098463de4c5d 173 count = _read_sem.wait(_timeout);
group-onsemi 0:098463de4c5d 174 _lock.lock();
group-onsemi 0:098463de4c5d 175
group-onsemi 0:098463de4c5d 176 if (count < 1) {
group-onsemi 0:098463de4c5d 177 // Semaphore wait timed out so break out and return
group-onsemi 0:098463de4c5d 178 ret = NSAPI_ERROR_WOULD_BLOCK;
group-onsemi 0:098463de4c5d 179 break;
group-onsemi 0:098463de4c5d 180 }
group-onsemi 0:098463de4c5d 181 }
group-onsemi 0:098463de4c5d 182 }
group-onsemi 0:098463de4c5d 183
group-onsemi 0:098463de4c5d 184 _read_in_progress = false;
group-onsemi 0:098463de4c5d 185 _lock.unlock();
group-onsemi 0:098463de4c5d 186 return ret;
group-onsemi 0:098463de4c5d 187 }
group-onsemi 0:098463de4c5d 188
group-onsemi 0:098463de4c5d 189 void TCPSocket::event()
group-onsemi 0:098463de4c5d 190 {
group-onsemi 0:098463de4c5d 191 int32_t wcount = _write_sem.wait(0);
group-onsemi 0:098463de4c5d 192 if (wcount <= 1) {
group-onsemi 0:098463de4c5d 193 _write_sem.release();
group-onsemi 0:098463de4c5d 194 }
group-onsemi 0:098463de4c5d 195 int32_t rcount = _read_sem.wait(0);
group-onsemi 0:098463de4c5d 196 if (rcount <= 1) {
group-onsemi 0:098463de4c5d 197 _read_sem.release();
group-onsemi 0:098463de4c5d 198 }
group-onsemi 0:098463de4c5d 199
group-onsemi 0:098463de4c5d 200 _pending += 1;
group-onsemi 0:098463de4c5d 201 if (_callback && _pending == 1) {
group-onsemi 0:098463de4c5d 202 _callback();
group-onsemi 0:098463de4c5d 203 }
group-onsemi 0:098463de4c5d 204 }