11

Dependents:   Program_R11

keypad.cpp

Committer:
gj_schoneveld
Date:
2012-11-02
Revision:
10:9a9ec143840b
Parent:
0:2df66331c109
Child:
11:a45e64141ce6

File content as of revision 10:9a9ec143840b:

#include "keypad.h"

Keypad::Keypad(PinName row3, PinName row2, PinName row1, PinName row0,
               PinName col3, PinName col2, PinName col1, PinName col0,
               int debounce_ms):
    _row0(row0), _row1(row1), _row2(row2), _row3(row3),
    _cols(col0, col1, col2, col3)
{
    _debounce = debounce_ms;
    _row0.mode(PullUp);
    _row1.mode(PullUp);
    _row2.mode(PullUp);
    _row3.mode(PullUp);
    _cols.mode(OpenDrain);
    _cols.output();
    _setupFallTrigger();
}

void Keypad::Start(void)
{
    _cols = 0x00;
}

void Keypad::Stop(void)
{
    _cols = 0x0F;
}

void Keypad::CallAfterInput(uint32_t (*fptr)(uint32_t index))
{
    _input.attach(fptr);
}

void Keypad::_callback(int row, InterruptIn &therow)
{
    wait_ms(_debounce);
    if (therow != 0)
        return;

    int c = -1;
    _cols = 0x0E;
    if (therow == 0)
        c = 0;
    else {
        _cols = 0x0D;
        if (therow == 0)
            c = 1;
        else {
            _cols = 0x0B;
            if (therow == 0)
                c = 2;
            else
                c = 3;
        }
    }
    _input.call(row * 4 + c);
    Start(); // Re-energize all columns
}

void Keypad::_cbRow0Fall(void)
{
    _callback(0, _row0);
}
void Keypad::_cbRow1Fall(void)
{
    _callback(1, _row1);
}
void Keypad::_cbRow2Fall(void)
{
    _callback(2, _row2);
}
void Keypad::_cbRow3Fall(void)
{
    _callback(3, _row3);
}

void Keypad::_setupFallTrigger(void)
{
    _row0.fall(this, &Keypad::_cbRow0Fall);
    _row1.fall(this, &Keypad::_cbRow1Fall);
    _row2.fall(this, &Keypad::_cbRow2Fall);
    _row3.fall(this, &Keypad::_cbRow3Fall);
}