mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
188:bcfe06ba3d64
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* mbed Microcontroller Library
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2017 ARM Limited
AnnaBridge 189:f392fc9709a3 3 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 167:e84263d55307 4 *
AnnaBridge 167:e84263d55307 5 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 6 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 7 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 8 *
AnnaBridge 167:e84263d55307 9 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 10 *
AnnaBridge 167:e84263d55307 11 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 12 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 14 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 15 * limitations under the License.
AnnaBridge 167:e84263d55307 16 */
AnnaBridge 167:e84263d55307 17 #include "mbed_poll.h"
AnnaBridge 167:e84263d55307 18 #include "FileHandle.h"
Anna Bridge 186:707f6e361f3e 19 #if MBED_CONF_RTOS_PRESENT
Anna Bridge 186:707f6e361f3e 20 #include "rtos/Kernel.h"
AnnaBridge 189:f392fc9709a3 21 #include "rtos/ThisThread.h"
Anna Bridge 186:707f6e361f3e 22 using namespace rtos;
Anna Bridge 186:707f6e361f3e 23 #else
AnnaBridge 188:bcfe06ba3d64 24 #include "drivers/Timer.h"
AnnaBridge 188:bcfe06ba3d64 25 #include "drivers/LowPowerTimer.h"
AnnaBridge 167:e84263d55307 26 #endif
AnnaBridge 167:e84263d55307 27
AnnaBridge 167:e84263d55307 28 namespace mbed {
AnnaBridge 167:e84263d55307 29
AnnaBridge 167:e84263d55307 30 // timeout -1 forever, or milliseconds
AnnaBridge 167:e84263d55307 31 int poll(pollfh fhs[], unsigned nfhs, int timeout)
AnnaBridge 167:e84263d55307 32 {
AnnaBridge 188:bcfe06ba3d64 33 /*
AnnaBridge 167:e84263d55307 34 * TODO Proper wake-up mechanism.
AnnaBridge 167:e84263d55307 35 * In order to correctly detect availability of read/write a FileHandle, we needed
AnnaBridge 167:e84263d55307 36 * a select or poll mechanisms. We opted for poll as POSIX defines in
AnnaBridge 167:e84263d55307 37 * http://pubs.opengroup.org/onlinepubs/009695399/functions/poll.html Currently,
AnnaBridge 167:e84263d55307 38 * mbed::poll() just spins and scans filehandles looking for any events we are
AnnaBridge 167:e84263d55307 39 * interested in. In future, his spinning behaviour will be replaced with
AnnaBridge 167:e84263d55307 40 * condition variables.
AnnaBridge 167:e84263d55307 41 */
Anna Bridge 186:707f6e361f3e 42 #if MBED_CONF_RTOS_PRESENT
Anna Bridge 186:707f6e361f3e 43 uint64_t start_time = 0;
Anna Bridge 186:707f6e361f3e 44 if (timeout > 0) {
Anna Bridge 186:707f6e361f3e 45 start_time = Kernel::get_ms_count();
Anna Bridge 186:707f6e361f3e 46 }
Anna Bridge 186:707f6e361f3e 47 #define TIME_ELAPSED() int64_t(Kernel::get_ms_count() - start_time)
Anna Bridge 186:707f6e361f3e 48 #else
Anna Bridge 186:707f6e361f3e 49 #if MBED_CONF_PLATFORM_POLL_USE_LOWPOWER_TIMER
Anna Bridge 186:707f6e361f3e 50 LowPowerTimer timer;
Anna Bridge 186:707f6e361f3e 51 #else
AnnaBridge 167:e84263d55307 52 Timer timer;
Anna Bridge 186:707f6e361f3e 53 #endif
AnnaBridge 167:e84263d55307 54 if (timeout > 0) {
AnnaBridge 167:e84263d55307 55 timer.start();
AnnaBridge 167:e84263d55307 56 }
Anna Bridge 186:707f6e361f3e 57 #define TIME_ELAPSED() timer.read_ms()
Anna Bridge 186:707f6e361f3e 58 #endif // MBED_CONF_RTOS_PRESENT
AnnaBridge 167:e84263d55307 59
AnnaBridge 167:e84263d55307 60 int count = 0;
AnnaBridge 167:e84263d55307 61 for (;;) {
AnnaBridge 167:e84263d55307 62 /* Scan the file handles */
AnnaBridge 167:e84263d55307 63 for (unsigned n = 0; n < nfhs; n++) {
AnnaBridge 167:e84263d55307 64 FileHandle *fh = fhs[n].fh;
AnnaBridge 167:e84263d55307 65 short mask = fhs[n].events | POLLERR | POLLHUP | POLLNVAL;
AnnaBridge 167:e84263d55307 66 if (fh) {
AnnaBridge 167:e84263d55307 67 fhs[n].revents = fh->poll(mask) & mask;
AnnaBridge 167:e84263d55307 68 } else {
AnnaBridge 167:e84263d55307 69 fhs[n].revents = POLLNVAL;
AnnaBridge 167:e84263d55307 70 }
AnnaBridge 167:e84263d55307 71 if (fhs[n].revents) {
AnnaBridge 167:e84263d55307 72 count++;
AnnaBridge 167:e84263d55307 73 }
AnnaBridge 167:e84263d55307 74 }
AnnaBridge 167:e84263d55307 75
AnnaBridge 167:e84263d55307 76 if (count) {
AnnaBridge 167:e84263d55307 77 break;
AnnaBridge 167:e84263d55307 78 }
AnnaBridge 167:e84263d55307 79
AnnaBridge 167:e84263d55307 80 /* Nothing selected - this is where timeout handling would be needed */
Anna Bridge 186:707f6e361f3e 81 if (timeout == 0 || (timeout > 0 && TIME_ELAPSED() > timeout)) {
AnnaBridge 167:e84263d55307 82 break;
AnnaBridge 167:e84263d55307 83 }
AnnaBridge 167:e84263d55307 84 #ifdef MBED_CONF_RTOS_PRESENT
AnnaBridge 167:e84263d55307 85 // TODO - proper blocking
AnnaBridge 167:e84263d55307 86 // wait for condition variable, wait queue whatever here
AnnaBridge 189:f392fc9709a3 87 rtos::ThisThread::sleep_for(1);
AnnaBridge 167:e84263d55307 88 #endif
AnnaBridge 167:e84263d55307 89 }
AnnaBridge 167:e84263d55307 90 return count;
AnnaBridge 167:e84263d55307 91 }
AnnaBridge 167:e84263d55307 92
AnnaBridge 167:e84263d55307 93 } // namespace mbed