The Cayenne MQTT mbed Library provides functions to easily connect to the Cayenne IoT project builder.

Dependents:   Cayenne-ESP8266Interface Cayenne-WIZnet_Library Cayenne-WIZnetInterface Cayenne-X-NUCLEO-IDW01M1 ... more

Committer:
jburhenn
Date:
Fri Oct 07 17:21:45 2016 +0000
Revision:
0:09ef59d2d0f7
Child:
2:c0419dbecfbd
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jburhenn 0:09ef59d2d0f7 1 /*******************************************************************************
jburhenn 0:09ef59d2d0f7 2 * Copyright (c) 2013, 2014
jburhenn 0:09ef59d2d0f7 3 *
jburhenn 0:09ef59d2d0f7 4 * All rights reserved. This program and the accompanying materials
jburhenn 0:09ef59d2d0f7 5 * are made available under the terms of the Eclipse Public License v1.0
jburhenn 0:09ef59d2d0f7 6 * and Eclipse Distribution License v1.0 which accompany this distribution.
jburhenn 0:09ef59d2d0f7 7 *
jburhenn 0:09ef59d2d0f7 8 * The Eclipse Public License is available at
jburhenn 0:09ef59d2d0f7 9 * http://www.eclipse.org/legal/epl-v10.html
jburhenn 0:09ef59d2d0f7 10 * and the Eclipse Distribution License is available at
jburhenn 0:09ef59d2d0f7 11 * http://www.eclipse.org/org/documents/edl-v10.php.
jburhenn 0:09ef59d2d0f7 12 *
jburhenn 0:09ef59d2d0f7 13 * Contributors:
jburhenn 0:09ef59d2d0f7 14 * Sam Grove - initial API and implementation and/or initial documentation
jburhenn 0:09ef59d2d0f7 15 * Ian Craggs - added attached and detached member functions
jburhenn 0:09ef59d2d0f7 16 * Sam Grove - removed need for FP.cpp
jburhenn 0:09ef59d2d0f7 17 *******************************************************************************/
jburhenn 0:09ef59d2d0f7 18
jburhenn 0:09ef59d2d0f7 19 #ifndef FP_H
jburhenn 0:09ef59d2d0f7 20 #define FP_H
jburhenn 0:09ef59d2d0f7 21
jburhenn 0:09ef59d2d0f7 22 /** Example using the FP Class with global functions
jburhenn 0:09ef59d2d0f7 23 * @code
jburhenn 0:09ef59d2d0f7 24 * #include "mbed.h"
jburhenn 0:09ef59d2d0f7 25 * #include "FP.h"
jburhenn 0:09ef59d2d0f7 26 *
jburhenn 0:09ef59d2d0f7 27 * FP<void,bool>fp;
jburhenn 0:09ef59d2d0f7 28 * DigitalOut myled(LED1);
jburhenn 0:09ef59d2d0f7 29 *
jburhenn 0:09ef59d2d0f7 30 * void handler(bool value)
jburhenn 0:09ef59d2d0f7 31 * {
jburhenn 0:09ef59d2d0f7 32 * myled = value;
jburhenn 0:09ef59d2d0f7 33 * return;
jburhenn 0:09ef59d2d0f7 34 * }
jburhenn 0:09ef59d2d0f7 35 *
jburhenn 0:09ef59d2d0f7 36 * int main()
jburhenn 0:09ef59d2d0f7 37 * {
jburhenn 0:09ef59d2d0f7 38 * fp.attach(&handler);
jburhenn 0:09ef59d2d0f7 39 *
jburhenn 0:09ef59d2d0f7 40 * while(1)
jburhenn 0:09ef59d2d0f7 41 * {
jburhenn 0:09ef59d2d0f7 42 * fp(1);
jburhenn 0:09ef59d2d0f7 43 * wait(0.2);
jburhenn 0:09ef59d2d0f7 44 * fp(0);
jburhenn 0:09ef59d2d0f7 45 * wait(0.2);
jburhenn 0:09ef59d2d0f7 46 * }
jburhenn 0:09ef59d2d0f7 47 * }
jburhenn 0:09ef59d2d0f7 48 * @endcode
jburhenn 0:09ef59d2d0f7 49 */
jburhenn 0:09ef59d2d0f7 50
jburhenn 0:09ef59d2d0f7 51 /** Example using the FP Class with different class member functions
jburhenn 0:09ef59d2d0f7 52 * @code
jburhenn 0:09ef59d2d0f7 53 * #include "mbed.h"
jburhenn 0:09ef59d2d0f7 54 * #include "FP.h"
jburhenn 0:09ef59d2d0f7 55 *
jburhenn 0:09ef59d2d0f7 56 * FP<void,bool>fp;
jburhenn 0:09ef59d2d0f7 57 * DigitalOut myled(LED4);
jburhenn 0:09ef59d2d0f7 58 *
jburhenn 0:09ef59d2d0f7 59 * class Wrapper
jburhenn 0:09ef59d2d0f7 60 * {
jburhenn 0:09ef59d2d0f7 61 * public:
jburhenn 0:09ef59d2d0f7 62 * Wrapper(){}
jburhenn 0:09ef59d2d0f7 63 *
jburhenn 0:09ef59d2d0f7 64 * void handler(bool value)
jburhenn 0:09ef59d2d0f7 65 * {
jburhenn 0:09ef59d2d0f7 66 * myled = value;
jburhenn 0:09ef59d2d0f7 67 * return;
jburhenn 0:09ef59d2d0f7 68 * }
jburhenn 0:09ef59d2d0f7 69 * };
jburhenn 0:09ef59d2d0f7 70 *
jburhenn 0:09ef59d2d0f7 71 * int main()
jburhenn 0:09ef59d2d0f7 72 * {
jburhenn 0:09ef59d2d0f7 73 * Wrapper wrapped;
jburhenn 0:09ef59d2d0f7 74 * fp.attach(&wrapped, &Wrapper::handler);
jburhenn 0:09ef59d2d0f7 75 *
jburhenn 0:09ef59d2d0f7 76 * while(1)
jburhenn 0:09ef59d2d0f7 77 * {
jburhenn 0:09ef59d2d0f7 78 * fp(1);
jburhenn 0:09ef59d2d0f7 79 * wait(0.2);
jburhenn 0:09ef59d2d0f7 80 * fp(0);
jburhenn 0:09ef59d2d0f7 81 * wait(0.2);
jburhenn 0:09ef59d2d0f7 82 * }
jburhenn 0:09ef59d2d0f7 83 * }
jburhenn 0:09ef59d2d0f7 84 * @endcode
jburhenn 0:09ef59d2d0f7 85 */
jburhenn 0:09ef59d2d0f7 86
jburhenn 0:09ef59d2d0f7 87 /** Example using the FP Class with member FP and member function
jburhenn 0:09ef59d2d0f7 88 * @code
jburhenn 0:09ef59d2d0f7 89 * #include "mbed.h"
jburhenn 0:09ef59d2d0f7 90 * #include "FP.h"
jburhenn 0:09ef59d2d0f7 91 *
jburhenn 0:09ef59d2d0f7 92 * DigitalOut myled(LED2);
jburhenn 0:09ef59d2d0f7 93 *
jburhenn 0:09ef59d2d0f7 94 * class Wrapper
jburhenn 0:09ef59d2d0f7 95 * {
jburhenn 0:09ef59d2d0f7 96 * public:
jburhenn 0:09ef59d2d0f7 97 * Wrapper()
jburhenn 0:09ef59d2d0f7 98 * {
jburhenn 0:09ef59d2d0f7 99 * fp.attach(this, &Wrapper::handler);
jburhenn 0:09ef59d2d0f7 100 * }
jburhenn 0:09ef59d2d0f7 101 *
jburhenn 0:09ef59d2d0f7 102 * void handler(bool value)
jburhenn 0:09ef59d2d0f7 103 * {
jburhenn 0:09ef59d2d0f7 104 * myled = value;
jburhenn 0:09ef59d2d0f7 105 * return;
jburhenn 0:09ef59d2d0f7 106 * }
jburhenn 0:09ef59d2d0f7 107 *
jburhenn 0:09ef59d2d0f7 108 * FP<void,bool>fp;
jburhenn 0:09ef59d2d0f7 109 * };
jburhenn 0:09ef59d2d0f7 110 *
jburhenn 0:09ef59d2d0f7 111 * int main()
jburhenn 0:09ef59d2d0f7 112 * {
jburhenn 0:09ef59d2d0f7 113 * Wrapper wrapped;
jburhenn 0:09ef59d2d0f7 114 *
jburhenn 0:09ef59d2d0f7 115 * while(1)
jburhenn 0:09ef59d2d0f7 116 * {
jburhenn 0:09ef59d2d0f7 117 * wrapped.fp(1);
jburhenn 0:09ef59d2d0f7 118 * wait(0.2);
jburhenn 0:09ef59d2d0f7 119 * wrapped.fp(0);
jburhenn 0:09ef59d2d0f7 120 * wait(0.2);
jburhenn 0:09ef59d2d0f7 121 * }
jburhenn 0:09ef59d2d0f7 122 * }
jburhenn 0:09ef59d2d0f7 123 * @endcode
jburhenn 0:09ef59d2d0f7 124 */
jburhenn 0:09ef59d2d0f7 125
jburhenn 0:09ef59d2d0f7 126 /**
jburhenn 0:09ef59d2d0f7 127 * @class FP
jburhenn 0:09ef59d2d0f7 128 * @brief API for managing Function Pointers
jburhenn 0:09ef59d2d0f7 129 */
jburhenn 0:09ef59d2d0f7 130 template<class retT, class argT>
jburhenn 0:09ef59d2d0f7 131 class FP
jburhenn 0:09ef59d2d0f7 132 {
jburhenn 0:09ef59d2d0f7 133 public:
jburhenn 0:09ef59d2d0f7 134 /** Create the FP object - only one callback can be attached to the object, that is
jburhenn 0:09ef59d2d0f7 135 * a member function or a global function, not both at the same time
jburhenn 0:09ef59d2d0f7 136 */
jburhenn 0:09ef59d2d0f7 137 FP()
jburhenn 0:09ef59d2d0f7 138 {
jburhenn 0:09ef59d2d0f7 139 obj_callback = 0;
jburhenn 0:09ef59d2d0f7 140 c_callback = 0;
jburhenn 0:09ef59d2d0f7 141 }
jburhenn 0:09ef59d2d0f7 142
jburhenn 0:09ef59d2d0f7 143 /** Add a callback function to the object
jburhenn 0:09ef59d2d0f7 144 * @param item - Address of the initialized object
jburhenn 0:09ef59d2d0f7 145 * @param member - Address of the member function (dont forget the scope that the function is defined in)
jburhenn 0:09ef59d2d0f7 146 */
jburhenn 0:09ef59d2d0f7 147 template<class T>
jburhenn 0:09ef59d2d0f7 148 void attach(T *item, retT (T::*method)(argT))
jburhenn 0:09ef59d2d0f7 149 {
jburhenn 0:09ef59d2d0f7 150 obj_callback = (FPtrDummy *)(item);
jburhenn 0:09ef59d2d0f7 151 method_callback = (retT (FPtrDummy::*)(argT))(method);
jburhenn 0:09ef59d2d0f7 152 return;
jburhenn 0:09ef59d2d0f7 153 }
jburhenn 0:09ef59d2d0f7 154
jburhenn 0:09ef59d2d0f7 155 /** Add a callback function to the object
jburhenn 0:09ef59d2d0f7 156 * @param function - The address of a globally defined function
jburhenn 0:09ef59d2d0f7 157 */
jburhenn 0:09ef59d2d0f7 158 void attach(retT (*function)(argT))
jburhenn 0:09ef59d2d0f7 159 {
jburhenn 0:09ef59d2d0f7 160 c_callback = function;
jburhenn 0:09ef59d2d0f7 161 }
jburhenn 0:09ef59d2d0f7 162
jburhenn 0:09ef59d2d0f7 163 /** Invoke the function attached to the class
jburhenn 0:09ef59d2d0f7 164 * @param arg - An argument that is passed into the function handler that is called
jburhenn 0:09ef59d2d0f7 165 * @return The return from the function hanlder called by this class
jburhenn 0:09ef59d2d0f7 166 */
jburhenn 0:09ef59d2d0f7 167 retT operator()(argT arg) const
jburhenn 0:09ef59d2d0f7 168 {
jburhenn 0:09ef59d2d0f7 169 if( 0 != c_callback ) {
jburhenn 0:09ef59d2d0f7 170 return obj_callback ? (obj_callback->*method_callback)(arg) : (*c_callback)(arg);
jburhenn 0:09ef59d2d0f7 171 }
jburhenn 0:09ef59d2d0f7 172 return (retT)0;
jburhenn 0:09ef59d2d0f7 173 }
jburhenn 0:09ef59d2d0f7 174
jburhenn 0:09ef59d2d0f7 175 /** Determine if an callback is currently hooked
jburhenn 0:09ef59d2d0f7 176 * @return 1 if a method is hooked, 0 otherwise
jburhenn 0:09ef59d2d0f7 177 */
jburhenn 0:09ef59d2d0f7 178 bool attached()
jburhenn 0:09ef59d2d0f7 179 {
jburhenn 0:09ef59d2d0f7 180 return obj_callback || c_callback;
jburhenn 0:09ef59d2d0f7 181 }
jburhenn 0:09ef59d2d0f7 182
jburhenn 0:09ef59d2d0f7 183 /** Release a function from the callback hook
jburhenn 0:09ef59d2d0f7 184 */
jburhenn 0:09ef59d2d0f7 185 void detach()
jburhenn 0:09ef59d2d0f7 186 {
jburhenn 0:09ef59d2d0f7 187 obj_callback = 0;
jburhenn 0:09ef59d2d0f7 188 c_callback = 0;
jburhenn 0:09ef59d2d0f7 189 }
jburhenn 0:09ef59d2d0f7 190
jburhenn 0:09ef59d2d0f7 191 private:
jburhenn 0:09ef59d2d0f7 192
jburhenn 0:09ef59d2d0f7 193 // empty type used for casting
jburhenn 0:09ef59d2d0f7 194 class FPtrDummy;
jburhenn 0:09ef59d2d0f7 195
jburhenn 0:09ef59d2d0f7 196 FPtrDummy *obj_callback;
jburhenn 0:09ef59d2d0f7 197
jburhenn 0:09ef59d2d0f7 198 /**
jburhenn 0:09ef59d2d0f7 199 * @union Funciton
jburhenn 0:09ef59d2d0f7 200 * @brief Member or global callback function
jburhenn 0:09ef59d2d0f7 201 */
jburhenn 0:09ef59d2d0f7 202 union {
jburhenn 0:09ef59d2d0f7 203 retT (*c_callback)(argT); /*!< Footprint for a global function */
jburhenn 0:09ef59d2d0f7 204 retT (FPtrDummy::*method_callback)(argT); /*!< Footprint for a member function */
jburhenn 0:09ef59d2d0f7 205 };
jburhenn 0:09ef59d2d0f7 206 };
jburhenn 0:09ef59d2d0f7 207
jburhenn 0:09ef59d2d0f7 208 #endif