11

Dependents:   Program_R11

keypad.cpp

Committer:
yoonghm
Date:
2012-01-30
Revision:
0:2df66331c109
Child:
10:9a9ec143840b

File content as of revision 0:2df66331c109:

#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;
    _setupRiseTrigger();
}

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

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

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

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

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

void Keypad::_cbRow0Rise(void) {
    _callback(0, _row0);
}
void Keypad::_cbRow1Rise(void) {
    _callback(1, _row1);
}
void Keypad::_cbRow2Rise(void) {
    _callback(2, _row2);
}
void Keypad::_cbRow3Rise(void) {
    _callback(3, _row3);
}

void Keypad::_setupRiseTrigger(void) {
    _row0.rise(this, &Keypad::_cbRow0Rise);
    _row1.rise(this, &Keypad::_cbRow1Rise);
    _row2.rise(this, &Keypad::_cbRow2Rise);
    _row3.rise(this, &Keypad::_cbRow3Rise);
}