The MGC3130 is the world’s first electrical-field (E-field) based three-dimensional (3D) tracking and gesture controller
Dependents: NucleoMGC3130 i2c_master
MGC3130.h@7:eacd776fce29, 2015-10-15 (annotated)
- 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?
User | Revision | Line number | New 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 |