mbed OS5に対応したMilkcocoaライブラリのテストバージョンです。

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
jksoft
Date:
Tue Jan 24 13:41:36 2017 +0000
Revision:
24:6ba1245bf049
??????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 24:6ba1245bf049 1 /**
jksoft 24:6ba1245bf049 2 * @file FP.h
jksoft 24:6ba1245bf049 3 * @brief Core Utility - Templated Function Pointer Class
jksoft 24:6ba1245bf049 4 * @author sam grove
jksoft 24:6ba1245bf049 5 * @version 1.1
jksoft 24:6ba1245bf049 6 * @see http://mbed.org/users/sam_grove/code/FP/
jksoft 24:6ba1245bf049 7 *
jksoft 24:6ba1245bf049 8 * Copyright (c) 2013
jksoft 24:6ba1245bf049 9 *
jksoft 24:6ba1245bf049 10 * Licensed under the Apache License, Version 2.0 (the "License");
jksoft 24:6ba1245bf049 11 * you may not use this file except in compliance with the License.
jksoft 24:6ba1245bf049 12 * You may obtain a copy of the License at
jksoft 24:6ba1245bf049 13 *
jksoft 24:6ba1245bf049 14 * http://www.apache.org/licenses/LICENSE-2.0
jksoft 24:6ba1245bf049 15 *
jksoft 24:6ba1245bf049 16 * Unless required by applicable law or agreed to in writing, software
jksoft 24:6ba1245bf049 17 * distributed under the License is distributed on an "AS IS" BASIS,
jksoft 24:6ba1245bf049 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
jksoft 24:6ba1245bf049 19 * See the License for the specific language governing permissions and
jksoft 24:6ba1245bf049 20 * limitations under the License.
jksoft 24:6ba1245bf049 21 */
jksoft 24:6ba1245bf049 22
jksoft 24:6ba1245bf049 23 #ifndef FP_H
jksoft 24:6ba1245bf049 24 #define FP_H
jksoft 24:6ba1245bf049 25
jksoft 24:6ba1245bf049 26 /** Example using the FP Class with global functions
jksoft 24:6ba1245bf049 27 * @code
jksoft 24:6ba1245bf049 28 * #include "mbed.h"
jksoft 24:6ba1245bf049 29 * #include "FP.h"
jksoft 24:6ba1245bf049 30 *
jksoft 24:6ba1245bf049 31 * FP<void,bool>fp;
jksoft 24:6ba1245bf049 32 * DigitalOut myled(LED1);
jksoft 24:6ba1245bf049 33 *
jksoft 24:6ba1245bf049 34 * void handler(bool value)
jksoft 24:6ba1245bf049 35 * {
jksoft 24:6ba1245bf049 36 * myled = value;
jksoft 24:6ba1245bf049 37 * return;
jksoft 24:6ba1245bf049 38 * }
jksoft 24:6ba1245bf049 39 *
jksoft 24:6ba1245bf049 40 * int main()
jksoft 24:6ba1245bf049 41 * {
jksoft 24:6ba1245bf049 42 * fp.attach(&handler);
jksoft 24:6ba1245bf049 43 *
jksoft 24:6ba1245bf049 44 * while(1)
jksoft 24:6ba1245bf049 45 * {
jksoft 24:6ba1245bf049 46 * fp(1);
jksoft 24:6ba1245bf049 47 * wait(0.2);
jksoft 24:6ba1245bf049 48 * fp(0);
jksoft 24:6ba1245bf049 49 * wait(0.2);
jksoft 24:6ba1245bf049 50 * }
jksoft 24:6ba1245bf049 51 * }
jksoft 24:6ba1245bf049 52 * @endcode
jksoft 24:6ba1245bf049 53 */
jksoft 24:6ba1245bf049 54
jksoft 24:6ba1245bf049 55 /** Example using the FP Class with different class member functions
jksoft 24:6ba1245bf049 56 * @code
jksoft 24:6ba1245bf049 57 * #include "mbed.h"
jksoft 24:6ba1245bf049 58 * #include "FP.h"
jksoft 24:6ba1245bf049 59 *
jksoft 24:6ba1245bf049 60 * FP<void,bool>fp;
jksoft 24:6ba1245bf049 61 * DigitalOut myled(LED4);
jksoft 24:6ba1245bf049 62 *
jksoft 24:6ba1245bf049 63 * class Wrapper
jksoft 24:6ba1245bf049 64 * {
jksoft 24:6ba1245bf049 65 * public:
jksoft 24:6ba1245bf049 66 * Wrapper(){}
jksoft 24:6ba1245bf049 67 *
jksoft 24:6ba1245bf049 68 * void handler(bool value)
jksoft 24:6ba1245bf049 69 * {
jksoft 24:6ba1245bf049 70 * myled = value;
jksoft 24:6ba1245bf049 71 * return;
jksoft 24:6ba1245bf049 72 * }
jksoft 24:6ba1245bf049 73 * };
jksoft 24:6ba1245bf049 74 *
jksoft 24:6ba1245bf049 75 * int main()
jksoft 24:6ba1245bf049 76 * {
jksoft 24:6ba1245bf049 77 * Wrapper wrapped;
jksoft 24:6ba1245bf049 78 * fp.attach(&wrapped, &Wrapper::handler);
jksoft 24:6ba1245bf049 79 *
jksoft 24:6ba1245bf049 80 * while(1)
jksoft 24:6ba1245bf049 81 * {
jksoft 24:6ba1245bf049 82 * fp(1);
jksoft 24:6ba1245bf049 83 * wait(0.2);
jksoft 24:6ba1245bf049 84 * fp(0);
jksoft 24:6ba1245bf049 85 * wait(0.2);
jksoft 24:6ba1245bf049 86 * }
jksoft 24:6ba1245bf049 87 * }
jksoft 24:6ba1245bf049 88 * @endcode
jksoft 24:6ba1245bf049 89 */
jksoft 24:6ba1245bf049 90
jksoft 24:6ba1245bf049 91 /** Example using the FP Class with member FP and member function
jksoft 24:6ba1245bf049 92 * @code
jksoft 24:6ba1245bf049 93 * #include "mbed.h"
jksoft 24:6ba1245bf049 94 * #include "FP.h"
jksoft 24:6ba1245bf049 95 *
jksoft 24:6ba1245bf049 96 * DigitalOut myled(LED2);
jksoft 24:6ba1245bf049 97 *
jksoft 24:6ba1245bf049 98 * class Wrapper
jksoft 24:6ba1245bf049 99 * {
jksoft 24:6ba1245bf049 100 * public:
jksoft 24:6ba1245bf049 101 * Wrapper()
jksoft 24:6ba1245bf049 102 * {
jksoft 24:6ba1245bf049 103 * fp.attach(this, &Wrapper::handler);
jksoft 24:6ba1245bf049 104 * }
jksoft 24:6ba1245bf049 105 *
jksoft 24:6ba1245bf049 106 * void handler(bool value)
jksoft 24:6ba1245bf049 107 * {
jksoft 24:6ba1245bf049 108 * myled = value;
jksoft 24:6ba1245bf049 109 * return;
jksoft 24:6ba1245bf049 110 * }
jksoft 24:6ba1245bf049 111 *
jksoft 24:6ba1245bf049 112 * FP<void,bool>fp;
jksoft 24:6ba1245bf049 113 * };
jksoft 24:6ba1245bf049 114 *
jksoft 24:6ba1245bf049 115 * int main()
jksoft 24:6ba1245bf049 116 * {
jksoft 24:6ba1245bf049 117 * Wrapper wrapped;
jksoft 24:6ba1245bf049 118 *
jksoft 24:6ba1245bf049 119 * while(1)
jksoft 24:6ba1245bf049 120 * {
jksoft 24:6ba1245bf049 121 * wrapped.fp(1);
jksoft 24:6ba1245bf049 122 * wait(0.2);
jksoft 24:6ba1245bf049 123 * wrapped.fp(0);
jksoft 24:6ba1245bf049 124 * wait(0.2);
jksoft 24:6ba1245bf049 125 * }
jksoft 24:6ba1245bf049 126 * }
jksoft 24:6ba1245bf049 127 * @endcode
jksoft 24:6ba1245bf049 128 */
jksoft 24:6ba1245bf049 129
jksoft 24:6ba1245bf049 130 /**
jksoft 24:6ba1245bf049 131 * @class FP
jksoft 24:6ba1245bf049 132 * @brief API for managing Function Pointers
jksoft 24:6ba1245bf049 133 */
jksoft 24:6ba1245bf049 134 template<class retT, class argT>
jksoft 24:6ba1245bf049 135 class FP
jksoft 24:6ba1245bf049 136 {
jksoft 24:6ba1245bf049 137 public:
jksoft 24:6ba1245bf049 138 /** Create the FP object - only one callback can be attached to the object, that is
jksoft 24:6ba1245bf049 139 * a member function or a global function, not both at the same time
jksoft 24:6ba1245bf049 140 */
jksoft 24:6ba1245bf049 141 FP()
jksoft 24:6ba1245bf049 142 {
jksoft 24:6ba1245bf049 143 obj_callback = 0;
jksoft 24:6ba1245bf049 144 c_callback = 0;
jksoft 24:6ba1245bf049 145 }
jksoft 24:6ba1245bf049 146
jksoft 24:6ba1245bf049 147 /** Add a callback function to the object
jksoft 24:6ba1245bf049 148 * @param item - Address of the initialized object
jksoft 24:6ba1245bf049 149 * @param member - Address of the member function (dont forget the scope that the function is defined in)
jksoft 24:6ba1245bf049 150 */
jksoft 24:6ba1245bf049 151 template<class T>
jksoft 24:6ba1245bf049 152 void attach(T *item, retT (T::*method)(argT))
jksoft 24:6ba1245bf049 153 {
jksoft 24:6ba1245bf049 154 obj_callback = (FPtrDummy *)(item);
jksoft 24:6ba1245bf049 155 method_callback = (retT (FPtrDummy::*)(argT))(method);
jksoft 24:6ba1245bf049 156 return;
jksoft 24:6ba1245bf049 157 }
jksoft 24:6ba1245bf049 158
jksoft 24:6ba1245bf049 159 /** Add a callback function to the object
jksoft 24:6ba1245bf049 160 * @param function - The address of a globally defined function
jksoft 24:6ba1245bf049 161 */
jksoft 24:6ba1245bf049 162 void attach(retT (*function)(argT))
jksoft 24:6ba1245bf049 163 {
jksoft 24:6ba1245bf049 164 c_callback = function;
jksoft 24:6ba1245bf049 165 }
jksoft 24:6ba1245bf049 166
jksoft 24:6ba1245bf049 167 /** Invoke the function attached to the class
jksoft 24:6ba1245bf049 168 * @param arg - An argument that is passed into the function handler that is called
jksoft 24:6ba1245bf049 169 * @return The return from the function hanlder called by this class
jksoft 24:6ba1245bf049 170 */
jksoft 24:6ba1245bf049 171 retT operator()(argT arg) const
jksoft 24:6ba1245bf049 172 {
jksoft 24:6ba1245bf049 173 if( 0 != c_callback ) {
jksoft 24:6ba1245bf049 174 return obj_callback ? (obj_callback->*method_callback)(arg) : (*c_callback)(arg);
jksoft 24:6ba1245bf049 175 }
jksoft 24:6ba1245bf049 176 return (retT)0;
jksoft 24:6ba1245bf049 177 }
jksoft 24:6ba1245bf049 178
jksoft 24:6ba1245bf049 179 /** Determine if an callback is currently hooked
jksoft 24:6ba1245bf049 180 * @return 1 if a method is hooked, 0 otherwise
jksoft 24:6ba1245bf049 181 */
jksoft 24:6ba1245bf049 182 bool attached()
jksoft 24:6ba1245bf049 183 {
jksoft 24:6ba1245bf049 184 return obj_callback || c_callback;
jksoft 24:6ba1245bf049 185 }
jksoft 24:6ba1245bf049 186
jksoft 24:6ba1245bf049 187 /** Release a function from the callback hook
jksoft 24:6ba1245bf049 188 */
jksoft 24:6ba1245bf049 189 void detach()
jksoft 24:6ba1245bf049 190 {
jksoft 24:6ba1245bf049 191 obj_callback = 0;
jksoft 24:6ba1245bf049 192 c_callback = 0;
jksoft 24:6ba1245bf049 193 }
jksoft 24:6ba1245bf049 194
jksoft 24:6ba1245bf049 195 private:
jksoft 24:6ba1245bf049 196
jksoft 24:6ba1245bf049 197 // empty type used for casting
jksoft 24:6ba1245bf049 198 class FPtrDummy;
jksoft 24:6ba1245bf049 199
jksoft 24:6ba1245bf049 200 FPtrDummy *obj_callback;
jksoft 24:6ba1245bf049 201
jksoft 24:6ba1245bf049 202 /**
jksoft 24:6ba1245bf049 203 * @union Funciton
jksoft 24:6ba1245bf049 204 * @brief Member or global callback function
jksoft 24:6ba1245bf049 205 */
jksoft 24:6ba1245bf049 206 union {
jksoft 24:6ba1245bf049 207 retT (*c_callback)(argT); /*!< Footprint for a global function */
jksoft 24:6ba1245bf049 208 retT (FPtrDummy::*method_callback)(argT); /*!< Footprint for a member function */
jksoft 24:6ba1245bf049 209 };
jksoft 24:6ba1245bf049 210 };
jksoft 24:6ba1245bf049 211
jksoft 24:6ba1245bf049 212 #endif