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:
Sam Grove
Date:
Sat Oct 01 02:11:36 2016 -0500
Revision:
2:a60d8117d0e0
Parent:
0:a792d4bf36c2
Child:
9:a372bff82709
For drivers, events, hal, platform, rtos and mbed.h add one level of path to make sure specific and unique includes files are found.

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 */
Sam Grove 2:a60d8117d0e0 19 #include "equeue/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