The MGC3130 is the world’s first electrical-field (E-field) based three-dimensional (3D) tracking and gesture controller

Dependencies:   BufferedArray

Dependents:   NucleoMGC3130 i2c_master

MGC3130.cpp

Committer:
yangcq88517
Date:
2015-10-09
Revision:
4:6d639fd23628
Parent:
3:b657bfcffc0a
Child:
5:4666b36a738d

File content as of revision 4:6d639fd23628:

#include "MGC3130.h"

MGC3130::MGC3130(PinName sda, PinName scl, PinName EI0, bool IS2)
    :TS_Line(EI0), _i2c_bus(sda,scl), msg(255), sensor()
{
    TS_Line.output();
    TS_Line.write(1);
    _i2c_bus.frequency(FREQUENCY_FULL);

    if (IS2)
        _addr = 0x86;
    else
        _addr = 0x84;
}

GestICMsg * MGC3130::readMsg()
{
    int count = 0;
    TS_Line.input();
    while (TS_Line.read() == 0) {
        wait_us(200);
        count++;

        // time out after 20 ms
        if (count > 100)
            return NULL;
    }
    msg.reset();

    TS_Line.output();
    TS_Line.write(0);

    _i2c_bus.start();
    _i2c_bus.write(_addr | 0x01);

    int size = _i2c_bus.read(1);
    msg.set(size);

    for (int i = 1; i < size - 1; i++)
        msg.set(_i2c_bus.read(1));

    msg.set(_i2c_bus.read(0));

    _i2c_bus.stop();
    TS_Line.write(1);
    wait_us(200);
    return &msg;
}

SensorData * MGC3130::readSensorData()
{
    if (readMsg() != NULL && sensor.convert(&msg))
        return &sensor;
    else return NULL;
}

int MGC3130::setRuntimeParameter(Parameter * para)
{
    _i2c_bus.start();
    _i2c_bus.write(_addr);
    _i2c_bus.write(0x10);
    _i2c_bus.write(0x00);
    _i2c_bus.write(0x00);
    _i2c_bus.write(0xA2);

    for (int i =0; i < Parameter::Length; i++)
        _i2c_bus.write(para->gets()[i]);

    _i2c_bus.stop();

    if (readMsg() == NULL)
        setRuntimeParameter(para);

    while (msg.getID() != GestICMsg::System_Status)
        readMsg();

    return msg.get(6) | (msg.get(7) << 8);
}