customized mbed library sources for nrf51822

Dependents:   Grove_Node Potentiometer BLE_Beacon I2C_Scanner

Committer:
yihui
Date:
Tue Nov 04 07:38:53 2014 +0000
Revision:
0:700cadd8b708
customized mbed-src library for nrf51822

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yihui 0:700cadd8b708 1 #include "CallChain.h"
yihui 0:700cadd8b708 2 #include "cmsis.h"
yihui 0:700cadd8b708 3
yihui 0:700cadd8b708 4 namespace mbed {
yihui 0:700cadd8b708 5
yihui 0:700cadd8b708 6 CallChain::CallChain(int size) : _chain(), _size(size), _elements(0) {
yihui 0:700cadd8b708 7 _chain = new pFunctionPointer_t[size]();
yihui 0:700cadd8b708 8 }
yihui 0:700cadd8b708 9
yihui 0:700cadd8b708 10 CallChain::~CallChain() {
yihui 0:700cadd8b708 11 clear();
yihui 0:700cadd8b708 12 delete _chain;
yihui 0:700cadd8b708 13 }
yihui 0:700cadd8b708 14
yihui 0:700cadd8b708 15 pFunctionPointer_t CallChain::add(void (*function)(void)) {
yihui 0:700cadd8b708 16 return common_add(new FunctionPointer(function));
yihui 0:700cadd8b708 17 }
yihui 0:700cadd8b708 18
yihui 0:700cadd8b708 19 pFunctionPointer_t CallChain::add_front(void (*function)(void)) {
yihui 0:700cadd8b708 20 return common_add_front(new FunctionPointer(function));
yihui 0:700cadd8b708 21 }
yihui 0:700cadd8b708 22
yihui 0:700cadd8b708 23 int CallChain::size() const {
yihui 0:700cadd8b708 24 return _elements;
yihui 0:700cadd8b708 25 }
yihui 0:700cadd8b708 26
yihui 0:700cadd8b708 27 pFunctionPointer_t CallChain::get(int i) const {
yihui 0:700cadd8b708 28 if (i < 0 || i >= _elements)
yihui 0:700cadd8b708 29 return NULL;
yihui 0:700cadd8b708 30 return _chain[i];
yihui 0:700cadd8b708 31 }
yihui 0:700cadd8b708 32
yihui 0:700cadd8b708 33 int CallChain::find(pFunctionPointer_t f) const {
yihui 0:700cadd8b708 34 for (int i = 0; i < _elements; i++)
yihui 0:700cadd8b708 35 if (f == _chain[i])
yihui 0:700cadd8b708 36 return i;
yihui 0:700cadd8b708 37 return -1;
yihui 0:700cadd8b708 38 }
yihui 0:700cadd8b708 39
yihui 0:700cadd8b708 40 void CallChain::clear() {
yihui 0:700cadd8b708 41 for(int i = 0; i < _elements; i ++) {
yihui 0:700cadd8b708 42 delete _chain[i];
yihui 0:700cadd8b708 43 _chain[i] = NULL;
yihui 0:700cadd8b708 44 }
yihui 0:700cadd8b708 45 _elements = 0;
yihui 0:700cadd8b708 46 }
yihui 0:700cadd8b708 47
yihui 0:700cadd8b708 48 bool CallChain::remove(pFunctionPointer_t f) {
yihui 0:700cadd8b708 49 int i;
yihui 0:700cadd8b708 50
yihui 0:700cadd8b708 51 if ((i = find(f)) == -1)
yihui 0:700cadd8b708 52 return false;
yihui 0:700cadd8b708 53 if (i != _elements - 1)
yihui 0:700cadd8b708 54 memmove(_chain + i, _chain + i + 1, (_elements - i - 1) * sizeof(pFunctionPointer_t));
yihui 0:700cadd8b708 55 delete f;
yihui 0:700cadd8b708 56 _elements --;
yihui 0:700cadd8b708 57 return true;
yihui 0:700cadd8b708 58 }
yihui 0:700cadd8b708 59
yihui 0:700cadd8b708 60 void CallChain::call() {
yihui 0:700cadd8b708 61 for(int i = 0; i < _elements; i++)
yihui 0:700cadd8b708 62 _chain[i]->call();
yihui 0:700cadd8b708 63 }
yihui 0:700cadd8b708 64
yihui 0:700cadd8b708 65 void CallChain::_check_size() {
yihui 0:700cadd8b708 66 if (_elements < _size)
yihui 0:700cadd8b708 67 return;
yihui 0:700cadd8b708 68 _size = (_size < 4) ? 4 : _size + 4;
yihui 0:700cadd8b708 69 pFunctionPointer_t* new_chain = new pFunctionPointer_t[_size]();
yihui 0:700cadd8b708 70 memcpy(new_chain, _chain, _elements * sizeof(pFunctionPointer_t));
yihui 0:700cadd8b708 71 delete _chain;
yihui 0:700cadd8b708 72 _chain = new_chain;
yihui 0:700cadd8b708 73 }
yihui 0:700cadd8b708 74
yihui 0:700cadd8b708 75 pFunctionPointer_t CallChain::common_add(pFunctionPointer_t pf) {
yihui 0:700cadd8b708 76 _check_size();
yihui 0:700cadd8b708 77 _chain[_elements] = pf;
yihui 0:700cadd8b708 78 _elements ++;
yihui 0:700cadd8b708 79 return pf;
yihui 0:700cadd8b708 80 }
yihui 0:700cadd8b708 81
yihui 0:700cadd8b708 82 pFunctionPointer_t CallChain::common_add_front(pFunctionPointer_t pf) {
yihui 0:700cadd8b708 83 _check_size();
yihui 0:700cadd8b708 84 memmove(_chain + 1, _chain, _elements * sizeof(pFunctionPointer_t));
yihui 0:700cadd8b708 85 _chain[0] = pf;
yihui 0:700cadd8b708 86 _elements ++;
yihui 0:700cadd8b708 87 return pf;
yihui 0:700cadd8b708 88 }
yihui 0:700cadd8b708 89
yihui 0:700cadd8b708 90 } // namespace mbed