This is a fork of the `events` subdirectory of https://github.com/ARMmbed/mbed-os

Dependents:   HelloWorld_CCA01M1 HelloWorld_CCA02M1 CI-data-logger-server HelloWorld_CCA02M1 ... more

This is a fork of the events subdirectory of https://github.com/ARMmbed/mbed-os.

Note, you must import this library with import name: events!!!

Committer:
Bogdan Marinescu
Date:
Thu Sep 29 12:38:02 2016 +0300
Revision:
0:a792d4bf36c2
Child:
2:a60d8117d0e0
Added mbed-events library

Added mbed-events from https://github.com/ARMMbed/mbed-events. Changes
from upstream:

- the whole code is licensed under the Apache license. Sources and
headers were updates with this information.
- removed the porting layers for Windows and FreeRTOS and the references
to these porting layers in equeue_platform.h.
- moved the TESTS directory in mbed-events to the TESTS directory of
mbed-os.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Bogdan Marinescu 0:a792d4bf36c2 1 /*
Bogdan Marinescu 0:a792d4bf36c2 2 * Implementation for the mbed library
Bogdan Marinescu 0:a792d4bf36c2 3 * https://github.com/mbedmicro/mbed
Bogdan Marinescu 0:a792d4bf36c2 4 *
Bogdan Marinescu 0:a792d4bf36c2 5 * Copyright (c) 2016 Christopher Haster
Bogdan Marinescu 0:a792d4bf36c2 6 *
Bogdan Marinescu 0:a792d4bf36c2 7 * Licensed under the Apache License, Version 2.0 (the "License");
Bogdan Marinescu 0:a792d4bf36c2 8 * you may not use this file except in compliance with the License.
Bogdan Marinescu 0:a792d4bf36c2 9 * You may obtain a copy of the License at
Bogdan Marinescu 0:a792d4bf36c2 10 *
Bogdan Marinescu 0:a792d4bf36c2 11 * http://www.apache.org/licenses/LICENSE-2.0
Bogdan Marinescu 0:a792d4bf36c2 12 *
Bogdan Marinescu 0:a792d4bf36c2 13 * Unless required by applicable law or agreed to in writing, software
Bogdan Marinescu 0:a792d4bf36c2 14 * distributed under the License is distributed on an "AS IS" BASIS,
Bogdan Marinescu 0:a792d4bf36c2 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Bogdan Marinescu 0:a792d4bf36c2 16 * See the License for the specific language governing permissions and
Bogdan Marinescu 0:a792d4bf36c2 17 * limitations under the License.
Bogdan Marinescu 0:a792d4bf36c2 18 */
Bogdan Marinescu 0:a792d4bf36c2 19 #include "equeue_platform.h"
Bogdan Marinescu 0:a792d4bf36c2 20
Bogdan Marinescu 0:a792d4bf36c2 21 #if defined(EQUEUE_PLATFORM_MBED)
Bogdan Marinescu 0:a792d4bf36c2 22
Bogdan Marinescu 0:a792d4bf36c2 23 #include <stdbool.h>
Bogdan Marinescu 0:a792d4bf36c2 24 #include "mbed.h"
Bogdan Marinescu 0:a792d4bf36c2 25
Bogdan Marinescu 0:a792d4bf36c2 26
Bogdan Marinescu 0:a792d4bf36c2 27 // Ticker operations
Bogdan Marinescu 0:a792d4bf36c2 28 static bool equeue_tick_inited = false;
Bogdan Marinescu 0:a792d4bf36c2 29 static unsigned equeue_minutes = 0;
Bogdan Marinescu 0:a792d4bf36c2 30 static unsigned equeue_timer[
Bogdan Marinescu 0:a792d4bf36c2 31 (sizeof(Timer)+sizeof(unsigned)-1)/sizeof(unsigned)];
Bogdan Marinescu 0:a792d4bf36c2 32 static unsigned equeue_ticker[
Bogdan Marinescu 0:a792d4bf36c2 33 (sizeof(Ticker)+sizeof(unsigned)-1)/sizeof(unsigned)];
Bogdan Marinescu 0:a792d4bf36c2 34
Bogdan Marinescu 0:a792d4bf36c2 35 static void equeue_tick_update() {
Bogdan Marinescu 0:a792d4bf36c2 36 reinterpret_cast<Timer*>(equeue_timer)->reset();
Bogdan Marinescu 0:a792d4bf36c2 37 equeue_minutes += 1;
Bogdan Marinescu 0:a792d4bf36c2 38 }
Bogdan Marinescu 0:a792d4bf36c2 39
Bogdan Marinescu 0:a792d4bf36c2 40 static void equeue_tick_init() {
Bogdan Marinescu 0:a792d4bf36c2 41 MBED_ASSERT(sizeof(equeue_timer) >= sizeof(Timer));
Bogdan Marinescu 0:a792d4bf36c2 42 MBED_ASSERT(sizeof(equeue_ticker) >= sizeof(Ticker));
Bogdan Marinescu 0:a792d4bf36c2 43 new (equeue_timer) Timer;
Bogdan Marinescu 0:a792d4bf36c2 44 new (equeue_ticker) Ticker;
Bogdan Marinescu 0:a792d4bf36c2 45
Bogdan Marinescu 0:a792d4bf36c2 46 equeue_minutes = 0;
Bogdan Marinescu 0:a792d4bf36c2 47 reinterpret_cast<Timer*>(equeue_timer)->start();
Bogdan Marinescu 0:a792d4bf36c2 48 reinterpret_cast<Ticker*>(equeue_ticker)
Bogdan Marinescu 0:a792d4bf36c2 49 ->attach_us(equeue_tick_update, (1 << 16)*1000);
Bogdan Marinescu 0:a792d4bf36c2 50
Bogdan Marinescu 0:a792d4bf36c2 51 equeue_tick_inited = true;
Bogdan Marinescu 0:a792d4bf36c2 52 }
Bogdan Marinescu 0:a792d4bf36c2 53
Bogdan Marinescu 0:a792d4bf36c2 54 unsigned equeue_tick() {
Bogdan Marinescu 0:a792d4bf36c2 55 if (!equeue_tick_inited) {
Bogdan Marinescu 0:a792d4bf36c2 56 equeue_tick_init();
Bogdan Marinescu 0:a792d4bf36c2 57 }
Bogdan Marinescu 0:a792d4bf36c2 58
Bogdan Marinescu 0:a792d4bf36c2 59 unsigned equeue_ms = reinterpret_cast<Timer*>(equeue_timer)->read_ms();
Bogdan Marinescu 0:a792d4bf36c2 60 return (equeue_minutes << 16) + equeue_ms;
Bogdan Marinescu 0:a792d4bf36c2 61 }
Bogdan Marinescu 0:a792d4bf36c2 62
Bogdan Marinescu 0:a792d4bf36c2 63
Bogdan Marinescu 0:a792d4bf36c2 64 // Mutex operations
Bogdan Marinescu 0:a792d4bf36c2 65 int equeue_mutex_create(equeue_mutex_t *m) { return 0; }
Bogdan Marinescu 0:a792d4bf36c2 66 void equeue_mutex_destroy(equeue_mutex_t *m) { }
Bogdan Marinescu 0:a792d4bf36c2 67
Bogdan Marinescu 0:a792d4bf36c2 68 void equeue_mutex_lock(equeue_mutex_t *m) {
Bogdan Marinescu 0:a792d4bf36c2 69 core_util_critical_section_enter();
Bogdan Marinescu 0:a792d4bf36c2 70 }
Bogdan Marinescu 0:a792d4bf36c2 71
Bogdan Marinescu 0:a792d4bf36c2 72 void equeue_mutex_unlock(equeue_mutex_t *m) {
Bogdan Marinescu 0:a792d4bf36c2 73 core_util_critical_section_exit();
Bogdan Marinescu 0:a792d4bf36c2 74 }
Bogdan Marinescu 0:a792d4bf36c2 75
Bogdan Marinescu 0:a792d4bf36c2 76
Bogdan Marinescu 0:a792d4bf36c2 77 // Semaphore operations
Bogdan Marinescu 0:a792d4bf36c2 78 #ifdef MBED_CONF_RTOS_PRESENT
Bogdan Marinescu 0:a792d4bf36c2 79
Bogdan Marinescu 0:a792d4bf36c2 80 int equeue_sema_create(equeue_sema_t *s) {
Bogdan Marinescu 0:a792d4bf36c2 81 MBED_ASSERT(sizeof(equeue_sema_t) >= sizeof(Semaphore));
Bogdan Marinescu 0:a792d4bf36c2 82 new (s) Semaphore(0);
Bogdan Marinescu 0:a792d4bf36c2 83 return 0;
Bogdan Marinescu 0:a792d4bf36c2 84 }
Bogdan Marinescu 0:a792d4bf36c2 85
Bogdan Marinescu 0:a792d4bf36c2 86 void equeue_sema_destroy(equeue_sema_t *s) {
Bogdan Marinescu 0:a792d4bf36c2 87 reinterpret_cast<Semaphore*>(s)->~Semaphore();
Bogdan Marinescu 0:a792d4bf36c2 88 }
Bogdan Marinescu 0:a792d4bf36c2 89
Bogdan Marinescu 0:a792d4bf36c2 90 void equeue_sema_signal(equeue_sema_t *s) {
Bogdan Marinescu 0:a792d4bf36c2 91 reinterpret_cast<Semaphore*>(s)->release();
Bogdan Marinescu 0:a792d4bf36c2 92 }
Bogdan Marinescu 0:a792d4bf36c2 93
Bogdan Marinescu 0:a792d4bf36c2 94 bool equeue_sema_wait(equeue_sema_t *s, int ms) {
Bogdan Marinescu 0:a792d4bf36c2 95 if (ms < 0) {
Bogdan Marinescu 0:a792d4bf36c2 96 ms = osWaitForever;
Bogdan Marinescu 0:a792d4bf36c2 97 }
Bogdan Marinescu 0:a792d4bf36c2 98
Bogdan Marinescu 0:a792d4bf36c2 99 return (reinterpret_cast<Semaphore*>(s)->wait(ms) > 0);
Bogdan Marinescu 0:a792d4bf36c2 100 }
Bogdan Marinescu 0:a792d4bf36c2 101
Bogdan Marinescu 0:a792d4bf36c2 102 #else
Bogdan Marinescu 0:a792d4bf36c2 103
Bogdan Marinescu 0:a792d4bf36c2 104 // Semaphore operations
Bogdan Marinescu 0:a792d4bf36c2 105 int equeue_sema_create(equeue_sema_t *s) {
Bogdan Marinescu 0:a792d4bf36c2 106 *s = false;
Bogdan Marinescu 0:a792d4bf36c2 107 return 0;
Bogdan Marinescu 0:a792d4bf36c2 108 }
Bogdan Marinescu 0:a792d4bf36c2 109
Bogdan Marinescu 0:a792d4bf36c2 110 void equeue_sema_destroy(equeue_sema_t *s) {
Bogdan Marinescu 0:a792d4bf36c2 111 }
Bogdan Marinescu 0:a792d4bf36c2 112
Bogdan Marinescu 0:a792d4bf36c2 113 void equeue_sema_signal(equeue_sema_t *s) {
Bogdan Marinescu 0:a792d4bf36c2 114 *s = 1;
Bogdan Marinescu 0:a792d4bf36c2 115 }
Bogdan Marinescu 0:a792d4bf36c2 116
Bogdan Marinescu 0:a792d4bf36c2 117 static void equeue_sema_timeout(equeue_sema_t *s) {
Bogdan Marinescu 0:a792d4bf36c2 118 *s = -1;
Bogdan Marinescu 0:a792d4bf36c2 119 }
Bogdan Marinescu 0:a792d4bf36c2 120
Bogdan Marinescu 0:a792d4bf36c2 121 bool equeue_sema_wait(equeue_sema_t *s, int ms) {
Bogdan Marinescu 0:a792d4bf36c2 122 int signal = 0;
Bogdan Marinescu 0:a792d4bf36c2 123 Timeout timeout;
Bogdan Marinescu 0:a792d4bf36c2 124 timeout.attach_us(s, equeue_sema_timeout, ms*1000);
Bogdan Marinescu 0:a792d4bf36c2 125
Bogdan Marinescu 0:a792d4bf36c2 126 core_util_critical_section_enter();
Bogdan Marinescu 0:a792d4bf36c2 127 while (!*s) {
Bogdan Marinescu 0:a792d4bf36c2 128 sleep();
Bogdan Marinescu 0:a792d4bf36c2 129 core_util_critical_section_exit();
Bogdan Marinescu 0:a792d4bf36c2 130 core_util_critical_section_enter();
Bogdan Marinescu 0:a792d4bf36c2 131 }
Bogdan Marinescu 0:a792d4bf36c2 132
Bogdan Marinescu 0:a792d4bf36c2 133 signal = *s;
Bogdan Marinescu 0:a792d4bf36c2 134 *s = false;
Bogdan Marinescu 0:a792d4bf36c2 135 core_util_critical_section_exit();
Bogdan Marinescu 0:a792d4bf36c2 136
Bogdan Marinescu 0:a792d4bf36c2 137 return (signal > 0);
Bogdan Marinescu 0:a792d4bf36c2 138 }
Bogdan Marinescu 0:a792d4bf36c2 139
Bogdan Marinescu 0:a792d4bf36c2 140 #endif
Bogdan Marinescu 0:a792d4bf36c2 141
Bogdan Marinescu 0:a792d4bf36c2 142 #endif