General thunking class to allow C-style callbacks to C++ class members - including optional parameters.

Dependents:   cthunk_example

Committer:
meriac
Date:
Thu Aug 21 17:09:11 2014 +0000
Revision:
9:d3b51b06ac54
Added CThunkIRQ class

Who changed what in which revision?

UserRevisionLine numberNew contents of line
meriac 9:d3b51b06ac54 1 /* General C++ Object Thunking class
meriac 9:d3b51b06ac54 2 *
meriac 9:d3b51b06ac54 3 * - allows direct callbacks to non-static C++ class functions
meriac 9:d3b51b06ac54 4 * - keeps track for the corresponding class instance
meriac 9:d3b51b06ac54 5 * - supports an optional context parameter for the called function
meriac 9:d3b51b06ac54 6 * - ideally suited for class object receiving interrupts (NVIC_SetVector)
meriac 9:d3b51b06ac54 7 *
meriac 9:d3b51b06ac54 8 * Copyright (c) 2014 ARM Limited
meriac 9:d3b51b06ac54 9 *
meriac 9:d3b51b06ac54 10 * Licensed under the Apache License, Version 2.0 (the "License");
meriac 9:d3b51b06ac54 11 * you may not use this file except in compliance with the License.
meriac 9:d3b51b06ac54 12 * You may obtain a copy of the License at
meriac 9:d3b51b06ac54 13 *
meriac 9:d3b51b06ac54 14 * http://www.apache.org/licenses/LICENSE-2.0
meriac 9:d3b51b06ac54 15 *
meriac 9:d3b51b06ac54 16 * Unless required by applicable law or agreed to in writing, software
meriac 9:d3b51b06ac54 17 * distributed under the License is distributed on an "AS IS" BASIS,
meriac 9:d3b51b06ac54 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
meriac 9:d3b51b06ac54 19 * See the License for the specific language governing permissions and
meriac 9:d3b51b06ac54 20 * limitations under the License.
meriac 9:d3b51b06ac54 21 */
meriac 9:d3b51b06ac54 22
meriac 9:d3b51b06ac54 23 #ifndef __CTHUNKIRQ_H__
meriac 9:d3b51b06ac54 24 #define __CTHUNKIRQ_H__
meriac 9:d3b51b06ac54 25
meriac 9:d3b51b06ac54 26 #include "CThunk.h"
meriac 9:d3b51b06ac54 27
meriac 9:d3b51b06ac54 28 template<class T>
meriac 9:d3b51b06ac54 29 class CThunkIRQ: CThunk<T> {
meriac 9:d3b51b06ac54 30
meriac 9:d3b51b06ac54 31 public:
meriac 9:d3b51b06ac54 32 typedef void (T::*CCallbackSimple)(void);
meriac 9:d3b51b06ac54 33 typedef void (T::*CCallback)(void* context);
meriac 9:d3b51b06ac54 34
meriac 9:d3b51b06ac54 35 inline CThunkIRQ(T *instance, IRQn_Type IRQn)
meriac 9:d3b51b06ac54 36 :CThunk<T>(instance)
meriac 9:d3b51b06ac54 37 {
meriac 9:d3b51b06ac54 38 register_irq(IRQn);
meriac 9:d3b51b06ac54 39 }
meriac 9:d3b51b06ac54 40
meriac 9:d3b51b06ac54 41 inline CThunkIRQ(T *instance, IRQn_Type IRQn, CCallback callback)
meriac 9:d3b51b06ac54 42 :CThunk<T>(instance, callback)
meriac 9:d3b51b06ac54 43 {
meriac 9:d3b51b06ac54 44 register_irq(IRQn);
meriac 9:d3b51b06ac54 45 }
meriac 9:d3b51b06ac54 46
meriac 9:d3b51b06ac54 47 inline CThunkIRQ(T *instance, IRQn_Type IRQn, CCallbackSimple callback)
meriac 9:d3b51b06ac54 48 :CThunk<T>(instance, callback)
meriac 9:d3b51b06ac54 49 {
meriac 9:d3b51b06ac54 50 register_irq(IRQn);
meriac 9:d3b51b06ac54 51 }
meriac 9:d3b51b06ac54 52
meriac 9:d3b51b06ac54 53 inline CThunkIRQ(T &instance, IRQn_Type IRQn, CCallback callback)
meriac 9:d3b51b06ac54 54 :CThunk<T>(instance, callback)
meriac 9:d3b51b06ac54 55 {
meriac 9:d3b51b06ac54 56 register_irq(IRQn);
meriac 9:d3b51b06ac54 57 }
meriac 9:d3b51b06ac54 58
meriac 9:d3b51b06ac54 59 inline CThunkIRQ(T &instance, IRQn_Type IRQn, CCallbackSimple callback)
meriac 9:d3b51b06ac54 60 :CThunk<T>(instance, callback)
meriac 9:d3b51b06ac54 61 {
meriac 9:d3b51b06ac54 62 register_irq(IRQn);
meriac 9:d3b51b06ac54 63 }
meriac 9:d3b51b06ac54 64
meriac 9:d3b51b06ac54 65 inline CThunkIRQ(T &instance, IRQn_Type IRQn, CCallback callback, void* context)
meriac 9:d3b51b06ac54 66 :CThunk<T>(instance, callback, context)
meriac 9:d3b51b06ac54 67 {
meriac 9:d3b51b06ac54 68 register_irq(IRQn);
meriac 9:d3b51b06ac54 69 }
meriac 9:d3b51b06ac54 70
meriac 9:d3b51b06ac54 71 inline ~CThunkIRQ(void)
meriac 9:d3b51b06ac54 72 {
meriac 9:d3b51b06ac54 73 NVIC_DisableIRQ(m_irqn);
meriac 9:d3b51b06ac54 74 NVIC_SetVector(m_irqn, m_prev_handler);
meriac 9:d3b51b06ac54 75 }
meriac 9:d3b51b06ac54 76
meriac 9:d3b51b06ac54 77 private:
meriac 9:d3b51b06ac54 78 IRQn_Type m_irqn;
meriac 9:d3b51b06ac54 79 uint32_t m_prev_handler;
meriac 9:d3b51b06ac54 80 inline void register_irq(IRQn_Type IRQn)
meriac 9:d3b51b06ac54 81 {
meriac 9:d3b51b06ac54 82 /* remember IRQn for destructor */
meriac 9:d3b51b06ac54 83 m_irqn = IRQn;
meriac 9:d3b51b06ac54 84
meriac 9:d3b51b06ac54 85 /* update IRQ handler atomically */
meriac 9:d3b51b06ac54 86 NVIC_DisableIRQ(IRQn);
meriac 9:d3b51b06ac54 87 m_prev_handler = NVIC_GetVector(IRQn);
meriac 9:d3b51b06ac54 88 NVIC_SetVector(IRQn, CThunk<T>::entry());
meriac 9:d3b51b06ac54 89 NVIC_EnableIRQ(IRQn);
meriac 9:d3b51b06ac54 90 }
meriac 9:d3b51b06ac54 91 };
meriac 9:d3b51b06ac54 92
meriac 9:d3b51b06ac54 93 #endif/*__CTHUNKIRQ_H__*/