Start of a microbit mpr121 library

Dependents:   microbitmpr121-example

MicroBitMpr121.cpp

Committer:
owenbrotherwood
Date:
2017-01-16
Revision:
3:a91b1bb396ca
Parent:
2:4e130924a398
Child:
4:f63476855239

File content as of revision 3:a91b1bb396ca:

#include "MicroBit.h"
#include "MicroBitI2C.h"
#include "MicroBitMpr121.h"

#define DEBUG 1

//MicroBitMpr121::MicroBitMpr121(PinName sda, PinName scl, PinName irq, MPR121_ADDR addr)
MicroBitMpr121::MicroBitMpr121()
{
    MicroBitI2C::I2C _i2c(I2C_SDA0, I2C_SCL0);
    uint8_t addr = ADDR_SDA;
//   PinName _irq = irq; //TODO :: use
    uint8_t _i2c_addr = (addr << 1); // To get 8bit address ...?
    return;
}

void MicroBitMpr121::init(void)
{
   // P16.setPull(PullUp); //TODO use _irq and not hard code
    MicroBitMpr121::write(SRST, 0x63);
    MicroBitMpr121::write(MHDR, 0x1);
    MicroBitMpr121::write(NHDR, 0x1);
    MicroBitMpr121::write(NCLR, 0x0);
    MicroBitMpr121::write(FDLR, 0x0);
    MicroBitMpr121::write(MHDF, 0x1);
    MicroBitMpr121::write(NHDF, 0x1);
    MicroBitMpr121::write(NCLF, 0xFF);
    MicroBitMpr121::write(FDLF, 0x2);
    for(int i=0; i<(12*2); i+=2) {
        MicroBitMpr121::write(static_cast<MPR121_REGISTER>(E0TTH+i), 0x20);
    }
    for(int i=0; i<(12*2); i+=2) {
        MicroBitMpr121::write(static_cast<MPR121_REGISTER>(E0RTH+i), 0x10);
    }
    MicroBitMpr121::write(DT_DR, 0x11);
    MicroBitMpr121::write(CDC_CONFIG, 0x10);
    MicroBitMpr121::write(CDT_CONFIG, 0x20);
    MicroBitMpr121::write(AUTO_CFG0, 0x33);
    MicroBitMpr121::write(AUTO_CFG1, 0x07);
    MicroBitMpr121::write(USL, 0xc9);
    MicroBitMpr121::write(LSL, 0x83);
    MicroBitMpr121::write(TL,  0xb5);
    MicroBitMpr121::write(ECR, 0x8f);
    return;
}

void MicroBitMpr121::enable(void)
{
    _button = 0;
    _button_has_changed = 0;
    MicroBitMpr121::write(ECR, 0x8f);
   //TODO _irq->fall(this, &MicroBitMpr121::handler);
    return;
}

void MicroBitMpr121::disable(void)
{
  //TODO  _irq->fall(NULL);
    _button = 0;
    _button_has_changed = 0;
    MicroBitMpr121::write(ECR, 0x0);
    MicroBitMpr121::write(AUTO_CFG0, 0x0);
    MicroBitMpr121::write(AUTO_CFG1, 0x0);
    return;
}

uint32_t MicroBitMpr121::isPressed(void)
{
    return _button_has_changed;
}

uint16_t MicroBitMpr121::buttonPressed(void)
{
    _button_has_changed = 0;
    return _button;
}

void MicroBitMpr121::registerDump() const
{
    uint8_t reg_val = 0;

    for(int i=0; i<0x80; i++) {
        reg_val = MicroBitMpr121::read(static_cast<MPR121_REGISTER>(i));
        printf("Reg 0x%02x: 0x%02x \n", i, reg_val);
    }

    return;
}

void MicroBitMpr121::handler(void)
{
    uint16_t reg_val = 0, oor_val = 0;
    reg_val  = MicroBitMpr121::read(ELE0_7_STAT);
    reg_val |= MicroBitMpr121::read(ELE8_11_STAT) << 8;
    oor_val  = MicroBitMpr121::read(ELE0_7_OOR_STAT);
    oor_val |= MicroBitMpr121::read(ELE8_11_OOR_STAT) << 8;
    if((0 != oor_val) && DEBUG) {
        printf("MPR121 OOR failure - 0x%04x\n", oor_val);
        wait(0.1f);
        NVIC_SystemReset();
    }
    _button = reg_val;
    _button_has_changed = 1;
    return;
}

void MicroBitMpr121::write(MPR121_REGISTER const reg, uint8_t const data) const
{
    char buf[2] = {reg, data};
    uint8_t result = 0;
    result = _i2c.write(_i2c_addr, buf, 2);
    if(result && DEBUG) {
        printf("I2c write failed\n");
    }
    return;
}

uint8_t MicroBitMpr121::read(MPR121_REGISTER const reg) const
{
    char buf[1] = {reg}, data = 0;
    uint8_t result = 1;
    result &= _i2c.write(_i2c_addr, buf, 1, true); //TODO: Correct with true?
    result &= _i2c.read(_i2c_addr, &data, 1);
    if(result && DEBUG) {
        printf("I2c read failed\n");
    }
    return data;
}