A program for IoT demonstration with mbed, EnOcean and MQTT.

Dependencies:   IBMIoTClientEthernetExample C12832 EthernetInterface MQTT USB400Serial USBHost mbed

Fork of IBMIoTClientEthernetExample by IBM Watson IoT

Committer:
samdanbury
Date:
Wed Aug 20 12:45:14 2014 +0000
Revision:
6:37b6d0d56190
Code completely changed to improve the structure, flow and memory usage of the application

Who changed what in which revision?

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