mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Thu Nov 08 11:46:34 2018 +0000
Revision:
188:bcfe06ba3d64
Parent:
186:707f6e361f3e
Child:
189:f392fc9709a3
mbed-dev library. Release version 164

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