Marco Mayer / Mbed OS Queue
Committer:
demayer
Date:
Sat Mar 28 15:28:19 2020 +0000
Revision:
0:6bf0743ece18
IMU Thread with an event-queue running parallel to handle tasks like a 5 times blinking LED. Button with interrupt detected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
demayer 0:6bf0743ece18 1 /* Socket
demayer 0:6bf0743ece18 2 * Copyright (c) 2015 ARM Limited
demayer 0:6bf0743ece18 3 *
demayer 0:6bf0743ece18 4 * Licensed under the Apache License, Version 2.0 (the "License");
demayer 0:6bf0743ece18 5 * you may not use this file except in compliance with the License.
demayer 0:6bf0743ece18 6 * You may obtain a copy of the License at
demayer 0:6bf0743ece18 7 *
demayer 0:6bf0743ece18 8 * http://www.apache.org/licenses/LICENSE-2.0
demayer 0:6bf0743ece18 9 *
demayer 0:6bf0743ece18 10 * Unless required by applicable law or agreed to in writing, software
demayer 0:6bf0743ece18 11 * distributed under the License is distributed on an "AS IS" BASIS,
demayer 0:6bf0743ece18 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
demayer 0:6bf0743ece18 13 * See the License for the specific language governing permissions and
demayer 0:6bf0743ece18 14 * limitations under the License.
demayer 0:6bf0743ece18 15 */
demayer 0:6bf0743ece18 16
demayer 0:6bf0743ece18 17 #include "Socket.h"
demayer 0:6bf0743ece18 18 #include "mbed.h"
demayer 0:6bf0743ece18 19
demayer 0:6bf0743ece18 20 Socket::Socket()
demayer 0:6bf0743ece18 21 : _stack(0)
demayer 0:6bf0743ece18 22 , _socket(0)
demayer 0:6bf0743ece18 23 , _timeout(osWaitForever)
demayer 0:6bf0743ece18 24 {
demayer 0:6bf0743ece18 25 }
demayer 0:6bf0743ece18 26
demayer 0:6bf0743ece18 27 nsapi_error_t Socket::open(NetworkStack *stack)
demayer 0:6bf0743ece18 28 {
demayer 0:6bf0743ece18 29 _lock.lock();
demayer 0:6bf0743ece18 30
demayer 0:6bf0743ece18 31 if (_stack != NULL || stack == NULL) {
demayer 0:6bf0743ece18 32 _lock.unlock();
demayer 0:6bf0743ece18 33 return NSAPI_ERROR_PARAMETER;
demayer 0:6bf0743ece18 34 }
demayer 0:6bf0743ece18 35 _stack = stack;
demayer 0:6bf0743ece18 36
demayer 0:6bf0743ece18 37 nsapi_socket_t socket;
demayer 0:6bf0743ece18 38 nsapi_error_t err = _stack->socket_open(&socket, get_proto());
demayer 0:6bf0743ece18 39 if (err) {
demayer 0:6bf0743ece18 40 _lock.unlock();
demayer 0:6bf0743ece18 41 return err;
demayer 0:6bf0743ece18 42 }
demayer 0:6bf0743ece18 43
demayer 0:6bf0743ece18 44 _socket = socket;
demayer 0:6bf0743ece18 45 _event = callback(this, &Socket::event);
demayer 0:6bf0743ece18 46 _stack->socket_attach(_socket, Callback<void()>::thunk, &_event);
demayer 0:6bf0743ece18 47
demayer 0:6bf0743ece18 48 _lock.unlock();
demayer 0:6bf0743ece18 49 return NSAPI_ERROR_OK;
demayer 0:6bf0743ece18 50 }
demayer 0:6bf0743ece18 51
demayer 0:6bf0743ece18 52 nsapi_error_t Socket::close()
demayer 0:6bf0743ece18 53 {
demayer 0:6bf0743ece18 54 _lock.lock();
demayer 0:6bf0743ece18 55
demayer 0:6bf0743ece18 56 nsapi_error_t ret = NSAPI_ERROR_OK;
demayer 0:6bf0743ece18 57 if (_socket) {
demayer 0:6bf0743ece18 58 _stack->socket_attach(_socket, 0, 0);
demayer 0:6bf0743ece18 59 nsapi_socket_t socket = _socket;
demayer 0:6bf0743ece18 60 _socket = 0;
demayer 0:6bf0743ece18 61 ret = _stack->socket_close(socket);
demayer 0:6bf0743ece18 62 }
demayer 0:6bf0743ece18 63 _stack = 0;
demayer 0:6bf0743ece18 64
demayer 0:6bf0743ece18 65 // Wakeup anything in a blocking operation
demayer 0:6bf0743ece18 66 // on this socket
demayer 0:6bf0743ece18 67 event();
demayer 0:6bf0743ece18 68
demayer 0:6bf0743ece18 69 _lock.unlock();
demayer 0:6bf0743ece18 70 return ret;
demayer 0:6bf0743ece18 71 }
demayer 0:6bf0743ece18 72
demayer 0:6bf0743ece18 73 int Socket::modify_multicast_group(const SocketAddress &address, nsapi_socket_option_t socketopt)
demayer 0:6bf0743ece18 74 {
demayer 0:6bf0743ece18 75 nsapi_ip_mreq_t mreq;
demayer 0:6bf0743ece18 76
demayer 0:6bf0743ece18 77 // Set up group address
demayer 0:6bf0743ece18 78 mreq.imr_multiaddr = address.get_addr();
demayer 0:6bf0743ece18 79 mreq.imr_interface = nsapi_addr_t(); // Default address, NSAPI_UNSPEC
demayer 0:6bf0743ece18 80
demayer 0:6bf0743ece18 81 return this->setsockopt(NSAPI_SOCKET, socketopt, &mreq, sizeof(mreq));
demayer 0:6bf0743ece18 82 }
demayer 0:6bf0743ece18 83
demayer 0:6bf0743ece18 84 int Socket::join_multicast_group(const SocketAddress &address)
demayer 0:6bf0743ece18 85 {
demayer 0:6bf0743ece18 86 return modify_multicast_group(address, NSAPI_ADD_MEMBERSHIP);
demayer 0:6bf0743ece18 87 }
demayer 0:6bf0743ece18 88
demayer 0:6bf0743ece18 89 int Socket::leave_multicast_group(const SocketAddress &address)
demayer 0:6bf0743ece18 90 {
demayer 0:6bf0743ece18 91 return modify_multicast_group(address, NSAPI_DROP_MEMBERSHIP);
demayer 0:6bf0743ece18 92 }
demayer 0:6bf0743ece18 93
demayer 0:6bf0743ece18 94
demayer 0:6bf0743ece18 95 nsapi_error_t Socket::bind(uint16_t port)
demayer 0:6bf0743ece18 96 {
demayer 0:6bf0743ece18 97 // Underlying bind is thread safe
demayer 0:6bf0743ece18 98 SocketAddress addr(0, port);
demayer 0:6bf0743ece18 99 return bind(addr);
demayer 0:6bf0743ece18 100 }
demayer 0:6bf0743ece18 101
demayer 0:6bf0743ece18 102 nsapi_error_t Socket::bind(const char *address, uint16_t port)
demayer 0:6bf0743ece18 103 {
demayer 0:6bf0743ece18 104 // Underlying bind is thread safe
demayer 0:6bf0743ece18 105 SocketAddress addr(address, port);
demayer 0:6bf0743ece18 106 return bind(addr);
demayer 0:6bf0743ece18 107 }
demayer 0:6bf0743ece18 108
demayer 0:6bf0743ece18 109 nsapi_error_t Socket::bind(const SocketAddress &address)
demayer 0:6bf0743ece18 110 {
demayer 0:6bf0743ece18 111 _lock.lock();
demayer 0:6bf0743ece18 112 nsapi_error_t ret;
demayer 0:6bf0743ece18 113
demayer 0:6bf0743ece18 114 if (!_socket) {
demayer 0:6bf0743ece18 115 ret = NSAPI_ERROR_NO_SOCKET;
demayer 0:6bf0743ece18 116 } else {
demayer 0:6bf0743ece18 117 ret = _stack->socket_bind(_socket, address);
demayer 0:6bf0743ece18 118 }
demayer 0:6bf0743ece18 119
demayer 0:6bf0743ece18 120 _lock.unlock();
demayer 0:6bf0743ece18 121 return ret;
demayer 0:6bf0743ece18 122 }
demayer 0:6bf0743ece18 123
demayer 0:6bf0743ece18 124 void Socket::set_blocking(bool blocking)
demayer 0:6bf0743ece18 125 {
demayer 0:6bf0743ece18 126 // Socket::set_timeout is thread safe
demayer 0:6bf0743ece18 127 set_timeout(blocking ? -1 : 0);
demayer 0:6bf0743ece18 128 }
demayer 0:6bf0743ece18 129
demayer 0:6bf0743ece18 130 void Socket::set_timeout(int timeout)
demayer 0:6bf0743ece18 131 {
demayer 0:6bf0743ece18 132 _lock.lock();
demayer 0:6bf0743ece18 133
demayer 0:6bf0743ece18 134 if (timeout >= 0) {
demayer 0:6bf0743ece18 135 _timeout = (uint32_t)timeout;
demayer 0:6bf0743ece18 136 } else {
demayer 0:6bf0743ece18 137 _timeout = osWaitForever;
demayer 0:6bf0743ece18 138 }
demayer 0:6bf0743ece18 139
demayer 0:6bf0743ece18 140 _lock.unlock();
demayer 0:6bf0743ece18 141 }
demayer 0:6bf0743ece18 142
demayer 0:6bf0743ece18 143 nsapi_error_t Socket::setsockopt(int level, int optname, const void *optval, unsigned optlen)
demayer 0:6bf0743ece18 144 {
demayer 0:6bf0743ece18 145 _lock.lock();
demayer 0:6bf0743ece18 146 nsapi_error_t ret;
demayer 0:6bf0743ece18 147
demayer 0:6bf0743ece18 148 if (!_socket) {
demayer 0:6bf0743ece18 149 ret = NSAPI_ERROR_NO_SOCKET;
demayer 0:6bf0743ece18 150 } else {
demayer 0:6bf0743ece18 151 ret = _stack->setsockopt(_socket, level, optname, optval, optlen);
demayer 0:6bf0743ece18 152 }
demayer 0:6bf0743ece18 153
demayer 0:6bf0743ece18 154 _lock.unlock();
demayer 0:6bf0743ece18 155 return ret;
demayer 0:6bf0743ece18 156 }
demayer 0:6bf0743ece18 157
demayer 0:6bf0743ece18 158 nsapi_error_t Socket::getsockopt(int level, int optname, void *optval, unsigned *optlen)
demayer 0:6bf0743ece18 159 {
demayer 0:6bf0743ece18 160 _lock.lock();
demayer 0:6bf0743ece18 161 nsapi_error_t ret;
demayer 0:6bf0743ece18 162
demayer 0:6bf0743ece18 163 if (!_socket) {
demayer 0:6bf0743ece18 164 ret = NSAPI_ERROR_NO_SOCKET;
demayer 0:6bf0743ece18 165 } else {
demayer 0:6bf0743ece18 166 ret = _stack->getsockopt(_socket, level, optname, optval, optlen);
demayer 0:6bf0743ece18 167 }
demayer 0:6bf0743ece18 168
demayer 0:6bf0743ece18 169 _lock.unlock();
demayer 0:6bf0743ece18 170 return ret;
demayer 0:6bf0743ece18 171
demayer 0:6bf0743ece18 172 }
demayer 0:6bf0743ece18 173
demayer 0:6bf0743ece18 174 void Socket::sigio(Callback<void()> callback)
demayer 0:6bf0743ece18 175 {
demayer 0:6bf0743ece18 176 _lock.lock();
demayer 0:6bf0743ece18 177 _callback = callback;
demayer 0:6bf0743ece18 178 _lock.unlock();
demayer 0:6bf0743ece18 179 }
demayer 0:6bf0743ece18 180
demayer 0:6bf0743ece18 181 void Socket::attach(Callback<void()> callback)
demayer 0:6bf0743ece18 182 {
demayer 0:6bf0743ece18 183 sigio(callback);
demayer 0:6bf0743ece18 184 }