MQTT client to test the ENC28J60-EMAC on NUCLEO-F446RE.

Dependencies:   ENC28J60-EMAC

Committer:
hudakz
Date:
Mon Mar 29 09:32:44 2021 +0000
Revision:
5:d9570dbf2f82
Parent:
0:238f0d0c0ba3
MQTT client to test the ENC28J60-EMAC on NUCLEO-F446RE.

Who changed what in which revision?

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