PokittoLib is the library needed for programming the Pokitto DIY game console (www.pokitto.com)

Dependents:   YATTT sd_map_test cPong SnowDemo ... more

PokittoLib

Library for programming Pokitto hardware

How to Use

  1. Import this library to online compiler (see button "import" on the right hand side
  2. DO NOT import mbed-src anymore, a better version is now included inside PokittoLib
  3. Change My_settings.h according to your project
  4. Start coding!

mbed-pokitto/common/CallChain.cpp

Committer:
Pokitto
Date:
2019-12-25
Revision:
71:531419862202
Parent:
5:ea7377f3d1af

File content as of revision 71:531419862202:

#include "CallChain.h"
#include "cmsis.h"

namespace mbed {

CallChain::CallChain(int size) : _chain(), _size(size), _elements(0) {
    _chain = new pFunctionPointer_t[size]();
}

CallChain::~CallChain() {
    clear();
    delete _chain;
}

pFunctionPointer_t CallChain::add(void (*function)(void)) {
    return common_add(new FunctionPointer(function));
}

pFunctionPointer_t CallChain::add_front(void (*function)(void)) {
    return common_add_front(new FunctionPointer(function));
}

int CallChain::size() const {
    return _elements;
}

pFunctionPointer_t CallChain::get(int i) const {
    if (i < 0 || i >= _elements)
        return NULL;
    return _chain[i];
}

int CallChain::find(pFunctionPointer_t f) const {
    for (int i = 0; i < _elements; i++)
        if (f == _chain[i])
            return i;
    return -1;
}

void CallChain::clear() {
    for(int i = 0; i < _elements; i ++) {
        delete _chain[i];
        _chain[i] = NULL;
    }
    _elements = 0;
}

bool CallChain::remove(pFunctionPointer_t f) {
    int i;

    if ((i = find(f)) == -1)
        return false;
    if (i != _elements - 1)
        memmove(_chain + i, _chain + i + 1, (_elements - i - 1) * sizeof(pFunctionPointer_t));
    delete f;
    _elements --;
    return true;
}

void CallChain::call() {
    for(int i = 0; i < _elements; i++)
        _chain[i]->call();
}

void CallChain::_check_size() {
    if (_elements < _size)
        return;
    _size = (_size < 4) ? 4 : _size + 4;
    pFunctionPointer_t* new_chain = new pFunctionPointer_t[_size]();
    memcpy(new_chain, _chain, _elements * sizeof(pFunctionPointer_t));
    delete _chain;
    _chain = new_chain;
}

pFunctionPointer_t CallChain::common_add(pFunctionPointer_t pf) {
    _check_size();
    _chain[_elements] = pf;
    _elements ++;
    return pf;
}

pFunctionPointer_t CallChain::common_add_front(pFunctionPointer_t pf) {
    _check_size();
    memmove(_chain + 1, _chain, _elements * sizeof(pFunctionPointer_t));
    _chain[0] = pf;
    _elements ++;
    return pf;
}

} // namespace mbed