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:
187:0387e8f68319
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 189:f392fc9709a3 1 /*
AnnaBridge 189:f392fc9709a3 2 * Copyright (c) 2018 ARM Limited
AnnaBridge 189:f392fc9709a3 3 * SPDX-License-Identifier: Apache-2.0
AnnaBridge 189:f392fc9709a3 4 *
AnnaBridge 189:f392fc9709a3 5 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 189:f392fc9709a3 6 * you may not use this file except in compliance with the License.
AnnaBridge 189:f392fc9709a3 7 * You may obtain a copy of the License at
AnnaBridge 189:f392fc9709a3 8 *
AnnaBridge 189:f392fc9709a3 9 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 189:f392fc9709a3 10 *
AnnaBridge 189:f392fc9709a3 11 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 189:f392fc9709a3 12 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 189:f392fc9709a3 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 189:f392fc9709a3 14 * See the License for the specific language governing permissions and
AnnaBridge 189:f392fc9709a3 15 * limitations under the License.
AnnaBridge 189:f392fc9709a3 16 */
Anna Bridge 180:96ed750bd169 17
Anna Bridge 180:96ed750bd169 18 // Suppress deprecation warnings since this whole
Anna Bridge 180:96ed750bd169 19 // class is deprecated already
Anna Bridge 180:96ed750bd169 20 #include "mbed_toolchain.h"
Anna Bridge 180:96ed750bd169 21 #undef MBED_DEPRECATED_SINCE
Anna Bridge 180:96ed750bd169 22 #define MBED_DEPRECATED_SINCE(...)
Anna Bridge 180:96ed750bd169 23
<> 149:156823d33999 24 #include "platform/CallChain.h"
<> 149:156823d33999 25 #include "cmsis.h"
<> 160:d5399cc887bb 26 #include "platform/mbed_critical.h"
<> 149:156823d33999 27
<> 149:156823d33999 28 namespace mbed {
<> 149:156823d33999 29
<> 149:156823d33999 30 class CallChainLink {
<> 149:156823d33999 31 public:
AnnaBridge 187:0387e8f68319 32 CallChainLink(): cb(), next(NULL)
AnnaBridge 187:0387e8f68319 33 {
<> 149:156823d33999 34 // No work to do
<> 149:156823d33999 35 }
<> 149:156823d33999 36
AnnaBridge 187:0387e8f68319 37 CallChainLink(Callback<void()> &callback): cb(callback), next(NULL)
AnnaBridge 187:0387e8f68319 38 {
<> 149:156823d33999 39 // No work to do
<> 149:156823d33999 40 }
<> 149:156823d33999 41 Callback<void()> cb;
AnnaBridge 187:0387e8f68319 42 CallChainLink *next;
<> 149:156823d33999 43 };
<> 149:156823d33999 44
AnnaBridge 187:0387e8f68319 45 CallChain::CallChain(int size) : _chain(NULL)
AnnaBridge 187:0387e8f68319 46 {
<> 149:156823d33999 47 // No work to do
<> 149:156823d33999 48 }
<> 149:156823d33999 49
AnnaBridge 187:0387e8f68319 50 CallChain::~CallChain()
AnnaBridge 187:0387e8f68319 51 {
<> 149:156823d33999 52 clear();
<> 149:156823d33999 53 }
<> 149:156823d33999 54
AnnaBridge 187:0387e8f68319 55 pFunctionPointer_t CallChain::add(Callback<void()> func)
AnnaBridge 187:0387e8f68319 56 {
<> 149:156823d33999 57 CallChainLink *new_link = new CallChainLink(func);
<> 149:156823d33999 58 if (NULL == _chain) {
<> 149:156823d33999 59 _chain = new_link;
<> 149:156823d33999 60 return &new_link->cb;
<> 149:156823d33999 61 }
<> 149:156823d33999 62
<> 149:156823d33999 63 CallChainLink *link = _chain;
<> 149:156823d33999 64 while (true) {
<> 149:156823d33999 65 if (NULL == link->next) {
<> 149:156823d33999 66 link->next = new_link;
<> 149:156823d33999 67 return &new_link->cb;
<> 149:156823d33999 68 }
<> 149:156823d33999 69 link = link->next;
<> 149:156823d33999 70 }
<> 149:156823d33999 71 }
<> 149:156823d33999 72
AnnaBridge 187:0387e8f68319 73 pFunctionPointer_t CallChain::add_front(Callback<void()> func)
AnnaBridge 187:0387e8f68319 74 {
<> 149:156823d33999 75 CallChainLink *link = new CallChainLink(func);
<> 149:156823d33999 76 link->next = _chain;
<> 149:156823d33999 77 _chain = link;
<> 149:156823d33999 78 return &link->cb;
<> 149:156823d33999 79 }
<> 149:156823d33999 80
AnnaBridge 187:0387e8f68319 81 int CallChain::size() const
AnnaBridge 187:0387e8f68319 82 {
<> 149:156823d33999 83 CallChainLink *link = _chain;
<> 149:156823d33999 84 int elements = 0;
<> 149:156823d33999 85 while (link != NULL) {
<> 149:156823d33999 86 elements++;
<> 149:156823d33999 87 link = link->next;
<> 149:156823d33999 88 }
<> 149:156823d33999 89 return elements;
<> 149:156823d33999 90 }
<> 149:156823d33999 91
AnnaBridge 187:0387e8f68319 92 pFunctionPointer_t CallChain::get(int idx) const
AnnaBridge 187:0387e8f68319 93 {
<> 149:156823d33999 94 CallChainLink *link = _chain;
<> 149:156823d33999 95 for (int i = 0; i < idx; i++) {
<> 149:156823d33999 96 if (NULL == link) {
<> 149:156823d33999 97 break;
<> 149:156823d33999 98 }
<> 149:156823d33999 99 link = link->next;
<> 149:156823d33999 100 }
<> 149:156823d33999 101 return &link->cb;
<> 149:156823d33999 102 }
<> 149:156823d33999 103
AnnaBridge 187:0387e8f68319 104 int CallChain::find(pFunctionPointer_t f) const
AnnaBridge 187:0387e8f68319 105 {
<> 149:156823d33999 106 CallChainLink *link = _chain;
<> 149:156823d33999 107 int i = 0;
<> 149:156823d33999 108 while (link != NULL) {
<> 149:156823d33999 109 if (f == &link->cb) {
<> 149:156823d33999 110 return i;
<> 149:156823d33999 111 }
<> 149:156823d33999 112 i++;
<> 149:156823d33999 113 link = link->next;
<> 149:156823d33999 114 }
<> 149:156823d33999 115 return -1;
<> 149:156823d33999 116 }
<> 149:156823d33999 117
AnnaBridge 187:0387e8f68319 118 void CallChain::clear()
AnnaBridge 187:0387e8f68319 119 {
<> 149:156823d33999 120 CallChainLink *link = _chain;
<> 149:156823d33999 121 _chain = NULL;
<> 149:156823d33999 122 while (link != NULL) {
<> 149:156823d33999 123 CallChainLink *temp = link->next;
<> 149:156823d33999 124 delete link;
<> 149:156823d33999 125 link = temp;
<> 149:156823d33999 126 }
<> 149:156823d33999 127 }
<> 149:156823d33999 128
AnnaBridge 187:0387e8f68319 129 bool CallChain::remove(pFunctionPointer_t f)
AnnaBridge 187:0387e8f68319 130 {
<> 149:156823d33999 131 CallChainLink *link = _chain;
<> 149:156823d33999 132 while (link != NULL) {
<> 149:156823d33999 133 if (f == &link->cb) {
<> 149:156823d33999 134 delete link;
<> 149:156823d33999 135 return true;
<> 149:156823d33999 136 }
<> 149:156823d33999 137 link = link->next;
<> 149:156823d33999 138 }
<> 149:156823d33999 139 return false;
<> 149:156823d33999 140 }
<> 149:156823d33999 141
AnnaBridge 187:0387e8f68319 142 void CallChain::call()
AnnaBridge 187:0387e8f68319 143 {
<> 149:156823d33999 144 CallChainLink *link = _chain;
<> 149:156823d33999 145 while (link != NULL) {
<> 149:156823d33999 146 link->cb.call();
<> 149:156823d33999 147 link = link->next;
<> 149:156823d33999 148 }
<> 149:156823d33999 149 }
<> 149:156823d33999 150
<> 149:156823d33999 151 } // namespace mbed