Fork of my original MQTTGateway

Dependencies:   mbed-http

Committer:
vpcola
Date:
Sat Apr 08 14:43:14 2017 +0000
Revision:
0:a1734fe1ec4b
Initial commit

Who changed what in which revision?

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