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
<> 149:156823d33999 1
<> 149:156823d33999 2 /** \addtogroup platform */
<> 149:156823d33999 3 /** @{*/
AnnaBridge 178:79309dc6340a 4 /**
AnnaBridge 178:79309dc6340a 5 * \defgroup platform_CThunk CThunk class
AnnaBridge 178:79309dc6340a 6 * @{
AnnaBridge 178:79309dc6340a 7 */
<> 149:156823d33999 8 /* General C++ Object Thunking class
<> 149:156823d33999 9 *
<> 149:156823d33999 10 * - allows direct callbacks to non-static C++ class functions
<> 149:156823d33999 11 * - keeps track for the corresponding class instance
<> 149:156823d33999 12 * - supports an optional context parameter for the called function
<> 149:156823d33999 13 * - ideally suited for class object receiving interrupts (NVIC_SetVector)
<> 149:156823d33999 14 *
<> 149:156823d33999 15 * Copyright (c) 2014-2015 ARM Limited
AnnaBridge 189:f392fc9709a3 16 * SPDX-License-Identifier: Apache-2.0
<> 149:156823d33999 17 *
<> 149:156823d33999 18 * Licensed under the Apache License, Version 2.0 (the "License");
<> 149:156823d33999 19 * you may not use this file except in compliance with the License.
<> 149:156823d33999 20 * You may obtain a copy of the License at
<> 149:156823d33999 21 *
<> 149:156823d33999 22 * http://www.apache.org/licenses/LICENSE-2.0
<> 149:156823d33999 23 *
<> 149:156823d33999 24 * Unless required by applicable law or agreed to in writing, software
<> 149:156823d33999 25 * distributed under the License is distributed on an "AS IS" BASIS,
<> 149:156823d33999 26 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 149:156823d33999 27 * See the License for the specific language governing permissions and
<> 149:156823d33999 28 * limitations under the License.
<> 149:156823d33999 29 */
<> 149:156823d33999 30
<> 149:156823d33999 31 /* General C++ Object Thunking class
<> 149:156823d33999 32 *
<> 149:156823d33999 33 * - allows direct callbacks to non-static C++ class functions
<> 149:156823d33999 34 * - keeps track for the corresponding class instance
<> 149:156823d33999 35 * - supports an optional context parameter for the called function
<> 149:156823d33999 36 * - ideally suited for class object receiving interrupts (NVIC_SetVector)
<> 149:156823d33999 37 */
<> 149:156823d33999 38
<> 149:156823d33999 39 #ifndef __CTHUNK_H__
<> 149:156823d33999 40 #define __CTHUNK_H__
<> 149:156823d33999 41
AnnaBridge 189:f392fc9709a3 42 #include "CThunkBase.h"
<> 149:156823d33999 43
<> 149:156823d33999 44 /**
<> 149:156823d33999 45 * Class for created a pointer with data bound to it
<> 149:156823d33999 46 *
AnnaBridge 167:e84263d55307 47 * @note Synchronization level: Not protected
<> 149:156823d33999 48 */
<> 149:156823d33999 49 template<class T>
AnnaBridge 189:f392fc9709a3 50 class CThunk: public CThunkBase {
AnnaBridge 187:0387e8f68319 51 public:
AnnaBridge 187:0387e8f68319 52 typedef void (T::*CCallbackSimple)(void);
AnnaBridge 187:0387e8f68319 53 typedef void (T::*CCallback)(void *context);
AnnaBridge 187:0387e8f68319 54
AnnaBridge 187:0387e8f68319 55 inline CThunk(T *instance)
AnnaBridge 187:0387e8f68319 56 {
AnnaBridge 187:0387e8f68319 57 init(instance, NULL, NULL);
AnnaBridge 187:0387e8f68319 58 }
<> 149:156823d33999 59
AnnaBridge 187:0387e8f68319 60 inline CThunk(T *instance, CCallback callback)
AnnaBridge 187:0387e8f68319 61 {
AnnaBridge 187:0387e8f68319 62 init(instance, callback, NULL);
AnnaBridge 187:0387e8f68319 63 }
<> 149:156823d33999 64
AnnaBridge 187:0387e8f68319 65 ~CThunk()
AnnaBridge 187:0387e8f68319 66 {
AnnaBridge 189:f392fc9709a3 67 cthunk_free(_entry);
AnnaBridge 189:f392fc9709a3 68 _entry = NULL;
AnnaBridge 187:0387e8f68319 69 }
<> 149:156823d33999 70
AnnaBridge 187:0387e8f68319 71 inline CThunk(T *instance, CCallbackSimple callback)
AnnaBridge 187:0387e8f68319 72 {
AnnaBridge 187:0387e8f68319 73 init(instance, (CCallback)callback, NULL);
AnnaBridge 187:0387e8f68319 74 }
<> 149:156823d33999 75
AnnaBridge 187:0387e8f68319 76 inline CThunk(T &instance, CCallback callback)
AnnaBridge 187:0387e8f68319 77 {
AnnaBridge 187:0387e8f68319 78 init(instance, callback, NULL);
AnnaBridge 187:0387e8f68319 79 }
<> 149:156823d33999 80
AnnaBridge 187:0387e8f68319 81 inline CThunk(T &instance, CCallbackSimple callback)
AnnaBridge 187:0387e8f68319 82 {
AnnaBridge 187:0387e8f68319 83 init(instance, (CCallback)callback, NULL);
AnnaBridge 187:0387e8f68319 84 }
<> 149:156823d33999 85
AnnaBridge 187:0387e8f68319 86 inline CThunk(T &instance, CCallback callback, void *context)
AnnaBridge 187:0387e8f68319 87 {
AnnaBridge 187:0387e8f68319 88 init(instance, callback, context);
AnnaBridge 187:0387e8f68319 89 }
<> 149:156823d33999 90
AnnaBridge 187:0387e8f68319 91 inline void callback(CCallback callback)
AnnaBridge 187:0387e8f68319 92 {
AnnaBridge 189:f392fc9709a3 93 _callback = callback;
AnnaBridge 187:0387e8f68319 94 }
AnnaBridge 187:0387e8f68319 95
AnnaBridge 187:0387e8f68319 96 inline void callback(CCallbackSimple callback)
AnnaBridge 187:0387e8f68319 97 {
AnnaBridge 189:f392fc9709a3 98 _callback_simple = callback;
AnnaBridge 187:0387e8f68319 99 }
<> 149:156823d33999 100
AnnaBridge 187:0387e8f68319 101 inline void context(void *context)
AnnaBridge 187:0387e8f68319 102 {
AnnaBridge 189:f392fc9709a3 103 _context = context;
AnnaBridge 187:0387e8f68319 104 }
<> 149:156823d33999 105
AnnaBridge 187:0387e8f68319 106 inline void context(uint32_t context)
AnnaBridge 187:0387e8f68319 107 {
AnnaBridge 189:f392fc9709a3 108 _context = (void *)context;
AnnaBridge 187:0387e8f68319 109 }
<> 149:156823d33999 110
AnnaBridge 187:0387e8f68319 111 inline uint32_t entry(void)
AnnaBridge 187:0387e8f68319 112 {
AnnaBridge 189:f392fc9709a3 113 if (_entry == NULL) {
AnnaBridge 189:f392fc9709a3 114 _entry = cthunk_alloc(this);
AnnaBridge 189:f392fc9709a3 115 }
AnnaBridge 189:f392fc9709a3 116 return (uint32_t)_entry;
AnnaBridge 187:0387e8f68319 117 }
<> 149:156823d33999 118
AnnaBridge 187:0387e8f68319 119 /* get thunk entry point for connecting rhunk to an IRQ table */
AnnaBridge 187:0387e8f68319 120 inline operator CThunkEntry(void)
AnnaBridge 187:0387e8f68319 121 {
AnnaBridge 187:0387e8f68319 122 return (CThunkEntry)entry();
AnnaBridge 187:0387e8f68319 123 }
<> 149:156823d33999 124
AnnaBridge 187:0387e8f68319 125 /* get thunk entry point for connecting rhunk to an IRQ table */
AnnaBridge 187:0387e8f68319 126 inline operator uint32_t(void)
AnnaBridge 187:0387e8f68319 127 {
AnnaBridge 187:0387e8f68319 128 return entry();
AnnaBridge 187:0387e8f68319 129 }
<> 149:156823d33999 130
AnnaBridge 187:0387e8f68319 131 /* simple test function */
AnnaBridge 187:0387e8f68319 132 inline void call(void)
AnnaBridge 187:0387e8f68319 133 {
AnnaBridge 187:0387e8f68319 134 (((CThunkEntry)(entry()))());
AnnaBridge 187:0387e8f68319 135 }
<> 149:156823d33999 136
AnnaBridge 187:0387e8f68319 137 private:
AnnaBridge 189:f392fc9709a3 138 T *_instance;
AnnaBridge 189:f392fc9709a3 139 void *_context;
AnnaBridge 189:f392fc9709a3 140 union {
AnnaBridge 189:f392fc9709a3 141 CCallbackSimple _callback_simple;
AnnaBridge 189:f392fc9709a3 142 CCallback _callback;
AnnaBridge 189:f392fc9709a3 143 };
AnnaBridge 189:f392fc9709a3 144
AnnaBridge 189:f392fc9709a3 145 CThunkEntry _entry;
<> 149:156823d33999 146
AnnaBridge 189:f392fc9709a3 147 static void trampoline(CThunkBase *base)
AnnaBridge 189:f392fc9709a3 148 {
AnnaBridge 189:f392fc9709a3 149 CThunk<T> *self = static_cast<CThunk<T>*>(base);
AnnaBridge 189:f392fc9709a3 150 T *instance = self->_instance;
AnnaBridge 189:f392fc9709a3 151 void *context = self->_context;
AnnaBridge 189:f392fc9709a3 152 CCallback callback = self->_callback;
<> 149:156823d33999 153
AnnaBridge 189:f392fc9709a3 154 if (instance && callback) {
AnnaBridge 189:f392fc9709a3 155 (instance->*callback)(context);
<> 149:156823d33999 156 }
AnnaBridge 187:0387e8f68319 157 }
<> 149:156823d33999 158
AnnaBridge 187:0387e8f68319 159 inline void init(T *instance, CCallback callback, void *context)
AnnaBridge 187:0387e8f68319 160 {
AnnaBridge 189:f392fc9709a3 161 _instance = instance;
AnnaBridge 189:f392fc9709a3 162 _context = context;
AnnaBridge 189:f392fc9709a3 163 _callback = callback;
AnnaBridge 189:f392fc9709a3 164 _trampoline = &trampoline;
AnnaBridge 189:f392fc9709a3 165 _entry = 0;
AnnaBridge 187:0387e8f68319 166 }
<> 149:156823d33999 167 };
<> 149:156823d33999 168
AnnaBridge 178:79309dc6340a 169 /**@}*/
AnnaBridge 178:79309dc6340a 170
AnnaBridge 178:79309dc6340a 171 /**@}*/
AnnaBridge 178:79309dc6340a 172
<> 149:156823d33999 173 #endif/*__CTHUNK_H__*/
<> 149:156823d33999 174