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

Committer:
yangcq88517
Date:
Thu Oct 15 16:10:55 2015 +0000
Revision:
7:eacd776fce29
Parent:
6:b511421e7dc8
add sample code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yangcq88517 0:92f17b057d6b 1 #ifndef UK_AC_HERTS_SMARTLAB_MGC3130
yangcq88517 0:92f17b057d6b 2 #define UK_AC_HERTS_SMARTLAB_MGC3130
yangcq88517 0:92f17b057d6b 3
yangcq88517 0:92f17b057d6b 4 #include "mbed.h"
yangcq88517 0:92f17b057d6b 5 #include "GestICMsg.h"
yangcq88517 0:92f17b057d6b 6 #include "SensorData.h"
yangcq88517 1:621c4e9238ef 7 #include "Parameter.h"
yangcq88517 1:621c4e9238ef 8 #include "TouchDetection.h"
yangcq88517 1:621c4e9238ef 9 #include "AirWheelDetection.h"
yangcq88517 1:621c4e9238ef 10 #include "ApproachDetection.h"
yangcq88517 1:621c4e9238ef 11 #include "TouchInfo.h"
yangcq88517 1:621c4e9238ef 12 #include "OutputEnable.h"
yangcq88517 3:b657bfcffc0a 13 #include "Trigger.h"
yangcq88517 3:b657bfcffc0a 14 #include "MakePersistent.h"
yangcq88517 3:b657bfcffc0a 15 #include "CalibrationMode.h"
yangcq88517 3:b657bfcffc0a 16 #include "GestureProcessing.h"
yangcq88517 0:92f17b057d6b 17
yangcq88517 2:c7d984193741 18 /**
yangcq88517 2:c7d984193741 19 * Outlines the function of the Library’s I2C message interface, and contains the complete message reference to control and operate the MGC3X30 system.
yangcq88517 7:eacd776fce29 20 *
yangcq88517 7:eacd776fce29 21 * Example:
yangcq88517 7:eacd776fce29 22 * @code
yangcq88517 7:eacd776fce29 23 *#include "mbed.h"
yangcq88517 7:eacd776fce29 24 *#include "MGC3130.h"
yangcq88517 7:eacd776fce29 25 *
yangcq88517 7:eacd776fce29 26 *SensorData * msg = NULL;
yangcq88517 7:eacd776fce29 27 *
yangcq88517 7:eacd776fce29 28 *void init()
yangcq88517 7:eacd776fce29 29 *{
yangcq88517 7:eacd776fce29 30 * AirWheelDetection air(true);
yangcq88517 7:eacd776fce29 31 * device.setRuntimeParameter(&air);
yangcq88517 7:eacd776fce29 32 *
yangcq88517 7:eacd776fce29 33 * TouchDetection touch(true);
yangcq88517 7:eacd776fce29 34 * device.setRuntimeParameter(&touch);
yangcq88517 7:eacd776fce29 35 *
yangcq88517 7:eacd776fce29 36 * OutputEnable setting;
yangcq88517 7:eacd776fce29 37 * setting.enableGestureData(true)->enableTouchInfo(true)->enableAirWheelInfo(true)->enableNoisePower(false)
yangcq88517 7:eacd776fce29 38 * ->enablexyzPosition(false)->enableDSPStatus(false)->enableUncalibratedSignal(false)->enableSignalDeviation(false);
yangcq88517 7:eacd776fce29 39 * device.setRuntimeParameter(&setting);
yangcq88517 7:eacd776fce29 40 *}
yangcq88517 7:eacd776fce29 41 *
yangcq88517 7:eacd776fce29 42 *void touch()
yangcq88517 7:eacd776fce29 43 *{
yangcq88517 7:eacd776fce29 44 * TouchInfo * info = msg->getTouchInfo();
yangcq88517 7:eacd776fce29 45 *
yangcq88517 7:eacd776fce29 46 * if (info == NULL)
yangcq88517 7:eacd776fce29 47 * return;
yangcq88517 7:eacd776fce29 48 *
yangcq88517 7:eacd776fce29 49 * if (info->isTapCenterElectrode() == false)
yangcq88517 7:eacd776fce29 50 * return;
yangcq88517 7:eacd776fce29 51 *}
yangcq88517 7:eacd776fce29 52 *
yangcq88517 7:eacd776fce29 53 *void airWheel()
yangcq88517 7:eacd776fce29 54 *{
yangcq88517 7:eacd776fce29 55 * int * wheel = msg->getAirWheelInfo();
yangcq88517 7:eacd776fce29 56 * if (wheel == NULL)
yangcq88517 7:eacd776fce29 57 * return;
yangcq88517 7:eacd776fce29 58 *}
yangcq88517 7:eacd776fce29 59 *
yangcq88517 7:eacd776fce29 60 *void gesture()
yangcq88517 7:eacd776fce29 61 *{
yangcq88517 7:eacd776fce29 62 * GestureInfo * info = msg->getGestureInfo();
yangcq88517 7:eacd776fce29 63 *
yangcq88517 7:eacd776fce29 64 * if (info == NULL)
yangcq88517 7:eacd776fce29 65 * return;
yangcq88517 7:eacd776fce29 66 *
yangcq88517 7:eacd776fce29 67 * switch (info->getRecognizedGesture()) {
yangcq88517 7:eacd776fce29 68 * //Garbage Model
yangcq88517 7:eacd776fce29 69 * case 1 :
yangcq88517 7:eacd776fce29 70 * break;
yangcq88517 7:eacd776fce29 71 * //Flick West To East
yangcq88517 7:eacd776fce29 72 * case 2 :
yangcq88517 7:eacd776fce29 73 * break;
yangcq88517 7:eacd776fce29 74 * //Flick East To West
yangcq88517 7:eacd776fce29 75 * case 3 :
yangcq88517 7:eacd776fce29 76 * break;
yangcq88517 7:eacd776fce29 77 * //Flick South To North
yangcq88517 7:eacd776fce29 78 * case 4 :
yangcq88517 7:eacd776fce29 79 * break;
yangcq88517 7:eacd776fce29 80 * //Flick North To South
yangcq88517 7:eacd776fce29 81 * case 5 :
yangcq88517 7:eacd776fce29 82 * break;
yangcq88517 7:eacd776fce29 83 * }
yangcq88517 7:eacd776fce29 84 *}
yangcq88517 7:eacd776fce29 85 *
yangcq88517 7:eacd776fce29 86 *int main()
yangcq88517 7:eacd776fce29 87 *{
yangcq88517 7:eacd776fce29 88 * init();
yangcq88517 7:eacd776fce29 89 *
yangcq88517 7:eacd776fce29 90 * while(1) {
yangcq88517 7:eacd776fce29 91 * msg = device.readSensorData();
yangcq88517 7:eacd776fce29 92 *
yangcq88517 7:eacd776fce29 93 * if (msg == NULL)
yangcq88517 7:eacd776fce29 94 * continue;
yangcq88517 7:eacd776fce29 95 *
yangcq88517 7:eacd776fce29 96 * touch();
yangcq88517 7:eacd776fce29 97 *
yangcq88517 7:eacd776fce29 98 * gesture();
yangcq88517 7:eacd776fce29 99 *
yangcq88517 7:eacd776fce29 100 * airWheel();
yangcq88517 7:eacd776fce29 101 * }
yangcq88517 7:eacd776fce29 102 *}
yangcq88517 7:eacd776fce29 103 * @endcode
yangcq88517 7:eacd776fce29 104 *
yangcq88517 2:c7d984193741 105 */
yangcq88517 0:92f17b057d6b 106 class MGC3130
yangcq88517 0:92f17b057d6b 107 {
yangcq88517 0:92f17b057d6b 108 private:
yangcq88517 0:92f17b057d6b 109 static const int FREQUENCY_STANDARD = 100000;
yangcq88517 0:92f17b057d6b 110 static const int FREQUENCY_FULL = 400000;
yangcq88517 0:92f17b057d6b 111 static const int FREQUENCY_FAST = 1000000;
yangcq88517 0:92f17b057d6b 112 static const int FREQUENCY_HIGH = 3200000;
yangcq88517 0:92f17b057d6b 113
yangcq88517 2:c7d984193741 114 /// EI0 Pin: The TS line is used to check whether the I2C data is valid and can be sent from MGC3X30 to the host controller.
yangcq88517 0:92f17b057d6b 115 DigitalInOut TS_Line;
yangcq88517 0:92f17b057d6b 116
yangcq88517 0:92f17b057d6b 117 I2C _i2c_bus;
yangcq88517 0:92f17b057d6b 118 int _speed;
yangcq88517 0:92f17b057d6b 119 int _addr;
yangcq88517 0:92f17b057d6b 120 GestICMsg msg;
yangcq88517 0:92f17b057d6b 121 SensorData sensor;
yangcq88517 0:92f17b057d6b 122
yangcq88517 1:621c4e9238ef 123 protected:
yangcq88517 1:621c4e9238ef 124 GestICMsg * readMsg();
yangcq88517 1:621c4e9238ef 125
yangcq88517 0:92f17b057d6b 126 public:
yangcq88517 2:c7d984193741 127 /** Construct a message with existing @GestICMsg as its base.
yangcq88517 2:c7d984193741 128 * IS2 is available for address selection and enables the user to connect up to two MGC3X30 devices on the same bus without address conflict.
yangcq88517 2:c7d984193741 129 * The MGC3X30 I2C addresses are 0x42 and 0x43. They are given as device addresses without the R/W bit.
yangcq88517 2:c7d984193741 130 * In addition, MGC3X30 requires a dedicated transfer status line (TS), which features a
yangcq88517 2:c7d984193741 131 * data transfer status function. The TS is used by both I2C Master and Slave to control
yangcq88517 2:c7d984193741 132 * the data flow. I2C SCL, I2C SDA and TS lines require an open-drain connection on
yangcq88517 2:c7d984193741 133 * MGC3X30 and the connected host controller. To function properly, I2C SCL and I2C
yangcq88517 2:c7d984193741 134 * SDA need to be pulled up to VCC with 1.8 kΩ resistors and the TS line needs to be
yangcq88517 2:c7d984193741 135 * pulled up to VCC with a 10 kΩ resistor.
yangcq88517 2:c7d984193741 136 *
yangcq88517 2:c7d984193741 137 * @param sda I2C sda signal
yangcq88517 2:c7d984193741 138 * @param scl I2C scl signal
yangcq88517 3:b657bfcffc0a 139 * @param EI0 transfer status line
yangcq88517 2:c7d984193741 140 * @param IS2 High->true, Low->false
yangcq88517 2:c7d984193741 141 *
yangcq88517 2:c7d984193741 142 */
yangcq88517 0:92f17b057d6b 143 MGC3130(PinName sda, PinName scl, PinName EI0, bool IS2);
yangcq88517 0:92f17b057d6b 144
yangcq88517 6:b511421e7dc8 145 /** Get a sensor data payload from the device.
yangcq88517 2:c7d984193741 146 *
yangcq88517 2:c7d984193741 147 * @returns @SensorData NULL means data not avaliable
yangcq88517 2:c7d984193741 148 *
yangcq88517 2:c7d984193741 149 */
yangcq88517 0:92f17b057d6b 150 SensorData * readSensorData();
yangcq88517 1:621c4e9238ef 151
yangcq88517 2:c7d984193741 152 /** Set the system runtime parameters.
yangcq88517 2:c7d984193741 153 *
yangcq88517 2:c7d984193741 154 * @param para @Parameter and any RuntimeParameter classes
yangcq88517 2:c7d984193741 155 *
yangcq88517 2:c7d984193741 156 * @returns
yangcq88517 2:c7d984193741 157 *0x0000 NoError OK
yangcq88517 2:c7d984193741 158 *0x0001 UnknownCommand Message ID is unknown
yangcq88517 2:c7d984193741 159 *0x0002 InvalidSessionId Session ID is invalid or does not match (0x0 is not allowed) (message Fw_Update_Start, Fw_Update_Completed)
yangcq88517 3:b657bfcffc0a 160 *0x0003 InvalidCrc CRC is invalid thrown by messages: Fw_Update_Block, Fw_Update_Start, Fw_Update_Completed
yangcq88517 2:c7d984193741 161 *0x0004 InvalidLength Length is invalid (message Fw_Update_Block)
yangcq88517 2:c7d984193741 162 *0x0005 InvalidAddress Address is invalid (message Fw_Update_Block)
yangcq88517 2:c7d984193741 163 *0x0006 InvalidFunction Function-Id is invalid (message Fw_Update_Start, Fw_Update_Block, Fw_Update_Completed)
yangcq88517 2:c7d984193741 164 *0x0008 ContentMismatch The VerifyOnly function found a mismatch between content and Flash memory (message: Fw_Update_Block)
yangcq88517 2:c7d984193741 165 *0x000B WrongParameterAddr Parameter Start address, contained in the new Library FW to be loaded, does not match Library Loader assumption. The Library Update is therefore aborted. (message: Fw_Update_Start)
yangcq88517 2:c7d984193741 166 *0x0014 WrongParameterValue The value of the Argument/Parameter of a RuntimeParameter command is out of the valid range (message: Request_Message and Set_Runtime_Parameter)
yangcq88517 2:c7d984193741 167 *0x0015 UnknownParameterID The MessageID or RuntimeParameterID is unknown or out of the valid range (message: Request_Message and Set_Runtime_Parameter)
yangcq88517 2:c7d984193741 168 *0x001A WakeupHappend A wake-up by Host was detected
yangcq88517 2:c7d984193741 169 *0x0080 LoaderUpdateStarted The Library Loader update started
yangcq88517 2:c7d984193741 170 *0x0081 LoaderUpdateFinished The Library Loader update finished
yangcq88517 1:621c4e9238ef 171 */
yangcq88517 1:621c4e9238ef 172 int setRuntimeParameter(Parameter * para);
yangcq88517 0:92f17b057d6b 173 };
yangcq88517 0:92f17b057d6b 174
yangcq88517 0:92f17b057d6b 175 #endif