mbed-os for GR-LYCHEE

Dependents:   mbed-os-example-blinky-gr-lychee GR-Boads_Camera_sample GR-Boards_Audio_Recoder GR-Boads_Camera_DisplayApp ... more

Committer:
dkato
Date:
Fri Feb 02 05:42:23 2018 +0000
Revision:
0:f782d9c66c49
mbed-os for GR-LYCHEE

Who changed what in which revision?

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