Hover!( Microchip MGC3130 ) library. Now, it is development version. http://www.hoverlabs.co/#hover https://www.switch-science.com/catalog/2124/

Dependents:   MjHover_Hello

MjHover2.cpp

Committer:
matsujirushi
Date:
2015-04-04
Revision:
7:a3b72910732d

File content as of revision 7:a3b72910732d:

#include "MjHover.h"

namespace matsujirushi {

MjHover2::MjHover2(I2C* i2c, uint8_t address, DigitalInOut* ts_n, DigitalInOut* reset_n) : MjHoverBase(i2c, address, ts_n, reset_n)
{
}

void MjHover2::Reset()
{
    MjHoverBase::Reset();
    
    while (!MjHoverBase::DataAvailable())
    {
    }
    
    uint8_t id;
    uint8_t payload[255 - 4];
    uint8_t readPayloadSize;
    ReadMessage(&id, payload, sizeof (payload), &readPayloadSize);
}

void MjHover2::Task()
{
    uint8_t id;
    uint8_t payload[255 - 4];
    uint8_t readPayloadSize;
    if (MjHoverBase::ReadMessage(&id, payload, sizeof (payload), &readPayloadSize))
    {
        if (id == 0x91) // SENSOR_DATA_OUTPUT
        {
            this->SensorData.GestureInfoValid = false;
            this->SensorData.TouchInfoValid   = false;
            this->SensorData.XyzPositionValid = false;
            
            uint16_t dataOutputConfigMask = payload[0] | payload[1] << 8;
            uint8_t systemInfo = payload[3];
            uint8_t* data = &payload[4];
            if (dataOutputConfigMask & 0x0001)  // DSPStatus
            {
                data += 2;
            }
            if (dataOutputConfigMask & 0x0002)  // GestureInfo
            {
                uint32_t gestureInfo = data[0] | data[1] << 8 | data[2] << 16 | data[3] << 24;
                uint8_t gesture      =  gestureInfo & 0x0000003f;
                uint8_t gestureClass = (gestureInfo & 0x0000f000) >> 12;
                bool edgeFlick       =  gestureInfo & 0x00010000 ? true : false;

                if (gestureClass == 1)  // Flick gesture
                {
                    if (gesture == 2)
                    {
                        this->SensorData.GestureInfo = edgeFlick ? EDGE_FLICK_WEST_TO_EAST : FLICK_WEST_TO_EAST;
                        this->SensorData.GestureInfoValid = true;
                    }
                    else if (gesture == 3)
                    {
                        this->SensorData.GestureInfo = edgeFlick ? EDGE_FLICK_EAST_TO_WEST : FLICK_EAST_TO_WEST;
                        this->SensorData.GestureInfoValid = true;
                    }
                    else if (gesture == 4)
                    {
                        this->SensorData.GestureInfo = edgeFlick ? EDGE_FLICK_SOUTH_TO_NORTH : FLICK_SOUTH_TO_NORTH;
                        this->SensorData.GestureInfoValid = true;
                    }
                    else if (gesture == 5)
                    {
                        this->SensorData.GestureInfo = edgeFlick ? EDGE_FLICK_NORTH_TO_SOUTH : FLICK_NORTH_TO_SOUTH;
                        this->SensorData.GestureInfoValid = true;
                    }
                }
                data += 4;
            }
            if (dataOutputConfigMask & 0x0004)  // TouchInfo
            {
                TouchInfoType touchInfo = (TouchInfoType)((data[0] | data[1] << 8) & 0x7fff);
                if (touchInfo != 0)
                {
                    this->SensorData.TouchInfo = touchInfo;
                    this->SensorData.TouchInfoValid = true;
                }
                data += 4;
            }
            if (dataOutputConfigMask & 0x0008)  // AirWheelInfo
            {
                data += 2;
            }
            if (dataOutputConfigMask & 0x0010)  // xyzPosition
            {
                if (systemInfo & 0x01)
                {
                    this->SensorData.XyzPosition.X = data[0] | data[1] << 8;
                    this->SensorData.XyzPosition.Y = data[2] | data[3] << 8;
                    this->SensorData.XyzPosition.Z = data[4] | data[5] << 8;
                    this->SensorData.XyzPositionValid = true;
                }
                data += 6;
            }
        }
    }
}

} // namespace matsujirushi