A library to send and receive packets over serial, uses MODSERIAL

Dependents:   SimpleSerialProtocolExample SerialFileReceiver

Committer:
p3p
Date:
Thu Jun 28 21:19:58 2012 +0000
Revision:
0:1639507580d5
Child:
1:98ad30934a71
minor tweak

Who changed what in which revision?

UserRevisionLine numberNew contents of line
p3p 0:1639507580d5 1 /*
p3p 0:1639507580d5 2 Copyright (c) 2011 Andy Kirkham
p3p 0:1639507580d5 3
p3p 0:1639507580d5 4 Permission is hereby granted, free of charge, to any person obtaining a copy
p3p 0:1639507580d5 5 of this software and associated documentation files (the "Software"), to deal
p3p 0:1639507580d5 6 in the Software without restriction, including without limitation the rights
p3p 0:1639507580d5 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
p3p 0:1639507580d5 8 copies of the Software, and to permit persons to whom the Software is
p3p 0:1639507580d5 9 furnished to do so, subject to the following conditions:
p3p 0:1639507580d5 10
p3p 0:1639507580d5 11 The above copyright notice and this permission notice shall be included in
p3p 0:1639507580d5 12 all copies or substantial portions of the Software.
p3p 0:1639507580d5 13
p3p 0:1639507580d5 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
p3p 0:1639507580d5 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
p3p 0:1639507580d5 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
p3p 0:1639507580d5 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
p3p 0:1639507580d5 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
p3p 0:1639507580d5 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
p3p 0:1639507580d5 20 THE SOFTWARE.
p3p 0:1639507580d5 21 */
p3p 0:1639507580d5 22
p3p 0:1639507580d5 23 #ifndef AJK_FPOINTER_H
p3p 0:1639507580d5 24 #define AJK_FPOINTER_H
p3p 0:1639507580d5 25
p3p 0:1639507580d5 26 #include "Packet.h"
p3p 0:1639507580d5 27
p3p 0:1639507580d5 28 namespace SimpleSerialProtocol {
p3p 0:1639507580d5 29
p3p 0:1639507580d5 30 class FPointerDummy;
p3p 0:1639507580d5 31
p3p 0:1639507580d5 32 typedef Packet* Packet_ptr;
p3p 0:1639507580d5 33
p3p 0:1639507580d5 34 class FPointer {
p3p 0:1639507580d5 35
p3p 0:1639507580d5 36 protected:
p3p 0:1639507580d5 37
p3p 0:1639507580d5 38 //! C callback function pointer.
p3p 0:1639507580d5 39 void (*c_callback)(Packet_ptr);
p3p 0:1639507580d5 40
p3p 0:1639507580d5 41 //! C++ callback object/method pointer (the object part).
p3p 0:1639507580d5 42 FPointerDummy *obj_callback;
p3p 0:1639507580d5 43
p3p 0:1639507580d5 44 //! C++ callback object/method pointer (the method part).
p3p 0:1639507580d5 45 void (FPointerDummy::*method_callback)(Packet_ptr);
p3p 0:1639507580d5 46
p3p 0:1639507580d5 47 public:
p3p 0:1639507580d5 48
p3p 0:1639507580d5 49 /** Constructor
p3p 0:1639507580d5 50 */
p3p 0:1639507580d5 51 FPointer() {
p3p 0:1639507580d5 52 c_callback = NULL;
p3p 0:1639507580d5 53 obj_callback = NULL;
p3p 0:1639507580d5 54 method_callback = NULL;
p3p 0:1639507580d5 55 }
p3p 0:1639507580d5 56
p3p 0:1639507580d5 57
p3p 0:1639507580d5 58 void attach(void (*function)(Packet_ptr) = 0) {
p3p 0:1639507580d5 59 c_callback = function;
p3p 0:1639507580d5 60 }
p3p 0:1639507580d5 61
p3p 0:1639507580d5 62 template<class T>
p3p 0:1639507580d5 63 void attach(T* item, void (T::*method)(Packet_ptr)) {
p3p 0:1639507580d5 64 obj_callback = (FPointerDummy *)item;
p3p 0:1639507580d5 65 method_callback = (void (FPointerDummy::*)(Packet_ptr))method;
p3p 0:1639507580d5 66 }
p3p 0:1639507580d5 67
p3p 0:1639507580d5 68 void call(Packet_ptr arg) {
p3p 0:1639507580d5 69 if (c_callback != NULL) {
p3p 0:1639507580d5 70 return (*c_callback)(arg);
p3p 0:1639507580d5 71 } else {
p3p 0:1639507580d5 72 if (obj_callback != NULL && method_callback != NULL) {
p3p 0:1639507580d5 73 (obj_callback->*method_callback)(arg);
p3p 0:1639507580d5 74 return;
p3p 0:1639507580d5 75 }
p3p 0:1639507580d5 76 }
p3p 0:1639507580d5 77 return;
p3p 0:1639507580d5 78 }
p3p 0:1639507580d5 79
p3p 0:1639507580d5 80 void call(void) {
p3p 0:1639507580d5 81 if (c_callback != NULL) {
p3p 0:1639507580d5 82 (*c_callback)((Packet_ptr)NULL);
p3p 0:1639507580d5 83 return;
p3p 0:1639507580d5 84 } else {
p3p 0:1639507580d5 85 if (obj_callback != NULL && method_callback != NULL) {
p3p 0:1639507580d5 86 (obj_callback->*method_callback)((Packet_ptr)NULL);
p3p 0:1639507580d5 87 return;
p3p 0:1639507580d5 88 }
p3p 0:1639507580d5 89 }
p3p 0:1639507580d5 90 return;
p3p 0:1639507580d5 91 }
p3p 0:1639507580d5 92 };
p3p 0:1639507580d5 93
p3p 0:1639507580d5 94 };
p3p 0:1639507580d5 95
p3p 0:1639507580d5 96
p3p 0:1639507580d5 97 #endif