TUKS MCU Introductory course / TUKS-COURSE-TIMER
Committer:
elmot
Date:
Fri Feb 24 21:13:56 2017 +0000
Revision:
1:d0dfbce63a89
Ready-to-copy

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elmot 1:d0dfbce63a89 1 #include "platform/CallChain.h"
elmot 1:d0dfbce63a89 2 #include "cmsis.h"
elmot 1:d0dfbce63a89 3 #include "platform/critical.h"
elmot 1:d0dfbce63a89 4
elmot 1:d0dfbce63a89 5 namespace mbed {
elmot 1:d0dfbce63a89 6
elmot 1:d0dfbce63a89 7 class CallChainLink {
elmot 1:d0dfbce63a89 8 public:
elmot 1:d0dfbce63a89 9 CallChainLink(): cb(), next(NULL) {
elmot 1:d0dfbce63a89 10 // No work to do
elmot 1:d0dfbce63a89 11 }
elmot 1:d0dfbce63a89 12
elmot 1:d0dfbce63a89 13 CallChainLink(Callback<void()> &callback): cb(callback), next(NULL) {
elmot 1:d0dfbce63a89 14 // No work to do
elmot 1:d0dfbce63a89 15 }
elmot 1:d0dfbce63a89 16 Callback<void()> cb;
elmot 1:d0dfbce63a89 17 CallChainLink * next;
elmot 1:d0dfbce63a89 18 };
elmot 1:d0dfbce63a89 19
elmot 1:d0dfbce63a89 20 CallChain::CallChain(int size) : _chain(NULL) {
elmot 1:d0dfbce63a89 21 // No work to do
elmot 1:d0dfbce63a89 22 }
elmot 1:d0dfbce63a89 23
elmot 1:d0dfbce63a89 24 CallChain::~CallChain() {
elmot 1:d0dfbce63a89 25 clear();
elmot 1:d0dfbce63a89 26 }
elmot 1:d0dfbce63a89 27
elmot 1:d0dfbce63a89 28 pFunctionPointer_t CallChain::add(Callback<void()> func) {
elmot 1:d0dfbce63a89 29 CallChainLink *new_link = new CallChainLink(func);
elmot 1:d0dfbce63a89 30 if (NULL == _chain) {
elmot 1:d0dfbce63a89 31 _chain = new_link;
elmot 1:d0dfbce63a89 32 return &new_link->cb;
elmot 1:d0dfbce63a89 33 }
elmot 1:d0dfbce63a89 34
elmot 1:d0dfbce63a89 35 CallChainLink *link = _chain;
elmot 1:d0dfbce63a89 36 while (true) {
elmot 1:d0dfbce63a89 37 if (NULL == link->next) {
elmot 1:d0dfbce63a89 38 link->next = new_link;
elmot 1:d0dfbce63a89 39 return &new_link->cb;
elmot 1:d0dfbce63a89 40 }
elmot 1:d0dfbce63a89 41 link = link->next;
elmot 1:d0dfbce63a89 42 }
elmot 1:d0dfbce63a89 43 }
elmot 1:d0dfbce63a89 44
elmot 1:d0dfbce63a89 45 pFunctionPointer_t CallChain::add_front(Callback<void()> func) {
elmot 1:d0dfbce63a89 46 CallChainLink *link = new CallChainLink(func);
elmot 1:d0dfbce63a89 47 link->next = _chain;
elmot 1:d0dfbce63a89 48 _chain = link;
elmot 1:d0dfbce63a89 49 return &link->cb;
elmot 1:d0dfbce63a89 50 }
elmot 1:d0dfbce63a89 51
elmot 1:d0dfbce63a89 52 int CallChain::size() const {
elmot 1:d0dfbce63a89 53 CallChainLink *link = _chain;
elmot 1:d0dfbce63a89 54 int elements = 0;
elmot 1:d0dfbce63a89 55 while (link != NULL) {
elmot 1:d0dfbce63a89 56 elements++;
elmot 1:d0dfbce63a89 57 link = link->next;
elmot 1:d0dfbce63a89 58 }
elmot 1:d0dfbce63a89 59 return elements;
elmot 1:d0dfbce63a89 60 }
elmot 1:d0dfbce63a89 61
elmot 1:d0dfbce63a89 62 pFunctionPointer_t CallChain::get(int idx) const {
elmot 1:d0dfbce63a89 63 CallChainLink *link = _chain;
elmot 1:d0dfbce63a89 64 for (int i = 0; i < idx; i++) {
elmot 1:d0dfbce63a89 65 if (NULL == link) {
elmot 1:d0dfbce63a89 66 break;
elmot 1:d0dfbce63a89 67 }
elmot 1:d0dfbce63a89 68 link = link->next;
elmot 1:d0dfbce63a89 69 }
elmot 1:d0dfbce63a89 70 return &link->cb;
elmot 1:d0dfbce63a89 71 }
elmot 1:d0dfbce63a89 72
elmot 1:d0dfbce63a89 73 int CallChain::find(pFunctionPointer_t f) const {
elmot 1:d0dfbce63a89 74 CallChainLink *link = _chain;
elmot 1:d0dfbce63a89 75 int i = 0;
elmot 1:d0dfbce63a89 76 while (link != NULL) {
elmot 1:d0dfbce63a89 77 if (f == &link->cb) {
elmot 1:d0dfbce63a89 78 return i;
elmot 1:d0dfbce63a89 79 }
elmot 1:d0dfbce63a89 80 i++;
elmot 1:d0dfbce63a89 81 link = link->next;
elmot 1:d0dfbce63a89 82 }
elmot 1:d0dfbce63a89 83 return -1;
elmot 1:d0dfbce63a89 84 }
elmot 1:d0dfbce63a89 85
elmot 1:d0dfbce63a89 86 void CallChain::clear() {
elmot 1:d0dfbce63a89 87 CallChainLink *link = _chain;
elmot 1:d0dfbce63a89 88 _chain = NULL;
elmot 1:d0dfbce63a89 89 while (link != NULL) {
elmot 1:d0dfbce63a89 90 CallChainLink *temp = link->next;
elmot 1:d0dfbce63a89 91 delete link;
elmot 1:d0dfbce63a89 92 link = temp;
elmot 1:d0dfbce63a89 93 }
elmot 1:d0dfbce63a89 94 }
elmot 1:d0dfbce63a89 95
elmot 1:d0dfbce63a89 96 bool CallChain::remove(pFunctionPointer_t f) {
elmot 1:d0dfbce63a89 97 CallChainLink *link = _chain;
elmot 1:d0dfbce63a89 98 while (link != NULL) {
elmot 1:d0dfbce63a89 99 if (f == &link->cb) {
elmot 1:d0dfbce63a89 100 delete link;
elmot 1:d0dfbce63a89 101 return true;
elmot 1:d0dfbce63a89 102 }
elmot 1:d0dfbce63a89 103 link = link->next;
elmot 1:d0dfbce63a89 104 }
elmot 1:d0dfbce63a89 105 return false;
elmot 1:d0dfbce63a89 106 }
elmot 1:d0dfbce63a89 107
elmot 1:d0dfbce63a89 108 void CallChain::call() {
elmot 1:d0dfbce63a89 109 CallChainLink *link = _chain;
elmot 1:d0dfbce63a89 110 while (link != NULL) {
elmot 1:d0dfbce63a89 111 link->cb.call();
elmot 1:d0dfbce63a89 112 link = link->next;
elmot 1:d0dfbce63a89 113 }
elmot 1:d0dfbce63a89 114 }
elmot 1:d0dfbce63a89 115
elmot 1:d0dfbce63a89 116 } // namespace mbed