Keypad-klass

Sådär, den här är jag rätt nöjd med. Jag hittar inga (större) minnesläckor och allt beter sig som det skall.

#include <Arduino.h>
#include <Button.h>
#include <LinkedList.h>

typedef struct
{
  Button *_key;
  uint8_t _keyCode;
  uint8_t _keyModifiers;
  uint8_t _flag = 0;
  void (*_keyPressCallback)(uint8_t keyCode, uint8_t keyModifiers);
} _KEYPAD_KEY;

class KEYPAD
{
public:
  ~KEYPAD();
  bool addKey(Button *key, uint8_t keyCode, uint8_t keyModifiers, void (*_keyPressCallback)(uint8_t keyCode, uint8_t keyModifiers));
  void deleteAllKeys();
  void update();

private:
  LinkedList<_KEYPAD_KEY*> _keyPad = LinkedList<_KEYPAD_KEY*>();
};

KEYPAD::~KEYPAD()
{
  deleteAllKeys();
}

bool KEYPAD::addKey(Button *key, uint8_t keyCode, uint8_t keyModifiers, void (*_keyPressCallback)(uint8_t keyCode, uint8_t keyModifiers))
{
  _KEYPAD_KEY *k = new _KEYPAD_KEY;
  k->_key = key;
  k->_keyCode = keyCode;
  k->_keyModifiers = keyModifiers;
  k->_keyPressCallback = _keyPressCallback;

  _keyPad.add(k);
  return  true;
}

void KEYPAD::deleteAllKeys()
{
  _KEYPAD_KEY *k;

  for(int i = 0; i < _keyPad.size(); i++)
  {
    k = _keyPad.get(i);

    // remove button object and set pointers to null
    delete k->_key;
    k->_key = NULL;
    k->_keyPressCallback = NULL;

    // delete _KEYPAD_KEY object that is saved in the list.
    delete k;
    k = NULL;
  }

  // remove all _KEYPAD_KEY objects from list
  _keyPad.clear();

  return;
}

void KEYPAD::update()
{
  _KEYPAD_KEY *k = NULL;

  for(int i = 0; i < _keyPad.size(); i++)
  {
    k = _keyPad.get(i);
    k->_key->read();

    if(k->_key->wasPressed())
    {
      k->_keyPressCallback(k->_keyCode, k->_keyModifiers);
    }

    if(k->_key->wasReleased())
    {

    }
  }
}

Inte så dumt att ha en callback som ropas på när knapparna trycks ned. Skall bli spännande att provköra “på riktigt”..