Hover!( Microchip MGC3130 ) library. Now, it is development version. http://www.hoverlabs.co/#hover https://www.switch-science.com/catalog/2124/
Revision 7:a3b72910732d, committed 2015-04-04
- Comitter:
- matsujirushi
- Date:
- Sat Apr 04 14:51:27 2015 +0000
- Parent:
- 6:8d68ac1bab97
- Commit message:
- Added MjHover2 class.
Changed in this revision
--- a/MjHover.cpp Fri Apr 03 13:56:44 2015 +0000 +++ b/MjHover.cpp Sat Apr 04 14:51:27 2015 +0000 @@ -8,7 +8,7 @@ void MjHover::begin() { - this->Reset(); + MjHoverBase::Reset(); wait_ms(1000); } @@ -18,7 +18,7 @@ bool MjHover::getStatus() { - if (this->DataAvailable()) + if (MjHoverBase::DataAvailable()) { return false; } @@ -30,7 +30,7 @@ uint8_t id; uint8_t payload[255 - 4]; uint8_t readPayloadSize; - if (!ReadMessage(&id, payload, sizeof (payload), &readPayloadSize)) + if (!MjHoverBase::ReadMessage(&id, payload, sizeof (payload), &readPayloadSize)) { return 0x00; } @@ -90,7 +90,3 @@ } // namespace matsujirushi - - - -
--- a/MjHover.h Fri Apr 03 13:56:44 2015 +0000 +++ b/MjHover.h Sat Apr 04 14:51:27 2015 +0000 @@ -53,6 +53,63 @@ }; +class MjHover2 : private MjHoverBase +{ +public: + enum GestureInfoType + { + FLICK_WEST_TO_EAST , + FLICK_EAST_TO_WEST , + FLICK_SOUTH_TO_NORTH , + FLICK_NORTH_TO_SOUTH , + EDGE_FLICK_WEST_TO_EAST , + EDGE_FLICK_EAST_TO_WEST , + EDGE_FLICK_SOUTH_TO_NORTH, + EDGE_FLICK_NORTH_TO_SOUTH, + }; + enum TouchInfoType + { + TOUCH_SOUTH = 0x00000001, + TOUCH_WEST = 0x00000002, + TOUCH_NORTH = 0x00000004, + TOUCH_EAST = 0x00000008, + TOUCH_CENTER = 0x00000010, + TAP_SOUTH = 0x00000020, + TAP_WEST = 0x00000040, + TAP_NORTH = 0x00000080, + TAP_EAST = 0x00000100, + TAP_CENTER = 0x00000200, + DOUBLE_TAP_SOUTH = 0x00000400, + DOUBLE_TAP_WEST = 0x00000800, + DOUBLE_TAP_NORTH = 0x00001000, + DOUBLE_TAP_EAST = 0x00002000, + DOUBLE_TAP_CENTER = 0x00004000, + }; + struct XyzPositionType + { + uint16_t X; + uint16_t Y; + uint16_t Z; + }; + struct + { + bool GestureInfoValid; + GestureInfoType GestureInfo; + + bool TouchInfoValid; + TouchInfoType TouchInfo; + + bool XyzPositionValid; + XyzPositionType XyzPosition; + } + SensorData; + + + MjHover2(I2C* i2c, uint8_t address, DigitalInOut* ts_n, DigitalInOut* reset_n); + void Reset(); + void Task(); +}; + } // namespace matsujirushi #endif @@ -60,3 +117,4 @@ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MjHover2.cpp Sat Apr 04 14:51:27 2015 +0000 @@ -0,0 +1,104 @@ +#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