The prosthetic control(MIT)

Committer:
ganlikun
Date:
Thu Jun 23 05:23:34 2022 +0000
Revision:
0:20e0c61e0684
01

Who changed what in which revision?

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