Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SDFileSystem app epson mbed msp430 pl tests
at42qt2120.cpp@0:c643d398cdb6, 2018-01-11 (annotated)
- Committer:
- marcbax
- Date:
- Thu Jan 11 13:42:27 2018 +0000
- Revision:
- 0:c643d398cdb6
Marc Bax version 180111. It hangs on the WritePartImage in the RedrawAlphabet routine in hangman.cpp. Within that call it does execute Ypos(), but not Xpos().
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| marcbax | 0:c643d398cdb6 | 1 | // |
| marcbax | 0:c643d398cdb6 | 2 | // Filename: at42qt2120.cpp |
| marcbax | 0:c643d398cdb6 | 3 | // |
| marcbax | 0:c643d398cdb6 | 4 | // Atmel AT42QT2120 12 channel touch sensor. |
| marcbax | 0:c643d398cdb6 | 5 | // |
| marcbax | 0:c643d398cdb6 | 6 | |
| marcbax | 0:c643d398cdb6 | 7 | #include "at42qt2120.h" |
| marcbax | 0:c643d398cdb6 | 8 | |
| marcbax | 0:c643d398cdb6 | 9 | #include "log.h" |
| marcbax | 0:c643d398cdb6 | 10 | |
| marcbax | 0:c643d398cdb6 | 11 | namespace HAL { |
| marcbax | 0:c643d398cdb6 | 12 | |
| marcbax | 0:c643d398cdb6 | 13 | // This chip has a singe fixed I2C address. |
| marcbax | 0:c643d398cdb6 | 14 | const int ADDRESS = 0x1c; |
| marcbax | 0:c643d398cdb6 | 15 | |
| marcbax | 0:c643d398cdb6 | 16 | // Chip Id hardcoded in the silicon. |
| marcbax | 0:c643d398cdb6 | 17 | const int AT42QT2120_ID = 0x3e; |
| marcbax | 0:c643d398cdb6 | 18 | |
| marcbax | 0:c643d398cdb6 | 19 | AT42QT2120::AT42QT2120(I2C &i2cin) |
| marcbax | 0:c643d398cdb6 | 20 | : i2c(i2cin) |
| marcbax | 0:c643d398cdb6 | 21 | { |
| marcbax | 0:c643d398cdb6 | 22 | #ifdef VERBOSE |
| marcbax | 0:c643d398cdb6 | 23 | if(Read((REG_AT42QT2120) QT_CHIP_ID) != AT42QT2120_ID) |
| marcbax | 0:c643d398cdb6 | 24 | Log("AT42QT2120 bad chip id"); |
| marcbax | 0:c643d398cdb6 | 25 | else |
| marcbax | 0:c643d398cdb6 | 26 | Log("AT42QT2120 chip id: Ok"); |
| marcbax | 0:c643d398cdb6 | 27 | |
| marcbax | 0:c643d398cdb6 | 28 | char version[20]; |
| marcbax | 0:c643d398cdb6 | 29 | int ver = Read((REG_AT42QT2120) QT_FIRMWARE_VERSION); |
| marcbax | 0:c643d398cdb6 | 30 | sprintf(version, "AT42QT2120 version: %u.%u", ver >> 4, ver & 0x0f); |
| marcbax | 0:c643d398cdb6 | 31 | Log(version); |
| marcbax | 0:c643d398cdb6 | 32 | #endif |
| marcbax | 0:c643d398cdb6 | 33 | |
| marcbax | 0:c643d398cdb6 | 34 | for(uint8_t key = 0; key < 12; key++) |
| marcbax | 0:c643d398cdb6 | 35 | SetKeyControl(key, false, 0, false, false); |
| marcbax | 0:c643d398cdb6 | 36 | |
| marcbax | 0:c643d398cdb6 | 37 | Calibrate(); |
| marcbax | 0:c643d398cdb6 | 38 | } |
| marcbax | 0:c643d398cdb6 | 39 | |
| marcbax | 0:c643d398cdb6 | 40 | bool AT42QT2120::ReadStatus(Status &status) |
| marcbax | 0:c643d398cdb6 | 41 | { |
| marcbax | 0:c643d398cdb6 | 42 | char buffer[4]; |
| marcbax | 0:c643d398cdb6 | 43 | |
| marcbax | 0:c643d398cdb6 | 44 | buffer[0] = Read(QT_DETECTION_STATUS); |
| marcbax | 0:c643d398cdb6 | 45 | buffer[1] = Read(QT_KEY_STATUS); |
| marcbax | 0:c643d398cdb6 | 46 | buffer[2] = Read(QT_KEY_STATUS2); |
| marcbax | 0:c643d398cdb6 | 47 | buffer[3] = Read(QT_SLIDER_POSITION); |
| marcbax | 0:c643d398cdb6 | 48 | |
| marcbax | 0:c643d398cdb6 | 49 | #ifdef VERBOSE |
| marcbax | 0:c643d398cdb6 | 50 | char msg[32]; |
| marcbax | 0:c643d398cdb6 | 51 | sprintf(msg, "Touch: %x %x %x %x", buffer[0], buffer[1], buffer[2], buffer[3]); |
| marcbax | 0:c643d398cdb6 | 52 | #endif |
| marcbax | 0:c643d398cdb6 | 53 | |
| marcbax | 0:c643d398cdb6 | 54 | status.keyschanged = (buffer[0] & TDET) != 0; |
| marcbax | 0:c643d398cdb6 | 55 | status.keys = buffer[2]; |
| marcbax | 0:c643d398cdb6 | 56 | status.keys = status.keys << 8; |
| marcbax | 0:c643d398cdb6 | 57 | status.keys += buffer[1]; |
| marcbax | 0:c643d398cdb6 | 58 | |
| marcbax | 0:c643d398cdb6 | 59 | status.sliderchanged = (buffer[0] & SDET) != 0; |
| marcbax | 0:c643d398cdb6 | 60 | status.slider = buffer[3]; |
| marcbax | 0:c643d398cdb6 | 61 | |
| marcbax | 0:c643d398cdb6 | 62 | return true; |
| marcbax | 0:c643d398cdb6 | 63 | } |
| marcbax | 0:c643d398cdb6 | 64 | |
| marcbax | 0:c643d398cdb6 | 65 | bool AT42QT2120::Calibrate() |
| marcbax | 0:c643d398cdb6 | 66 | { |
| marcbax | 0:c643d398cdb6 | 67 | #ifdef VERBOSE |
| marcbax | 0:c643d398cdb6 | 68 | Log("AT42QT2120 calibration start"); |
| marcbax | 0:c643d398cdb6 | 69 | #endif |
| marcbax | 0:c643d398cdb6 | 70 | |
| marcbax | 0:c643d398cdb6 | 71 | bool status = Write(QT_CALIBRATE, 0xff); |
| marcbax | 0:c643d398cdb6 | 72 | if(status) |
| marcbax | 0:c643d398cdb6 | 73 | { |
| marcbax | 0:c643d398cdb6 | 74 | while(Read(QT_DETECTION_STATUS) & 0x80); |
| marcbax | 0:c643d398cdb6 | 75 | } |
| marcbax | 0:c643d398cdb6 | 76 | |
| marcbax | 0:c643d398cdb6 | 77 | #ifdef VERBOSE |
| marcbax | 0:c643d398cdb6 | 78 | if(status) |
| marcbax | 0:c643d398cdb6 | 79 | Log("AT42QT2120 calibration finish"); |
| marcbax | 0:c643d398cdb6 | 80 | else |
| marcbax | 0:c643d398cdb6 | 81 | Log("AT42QT2120 calibration fail"); |
| marcbax | 0:c643d398cdb6 | 82 | #endif |
| marcbax | 0:c643d398cdb6 | 83 | return status; |
| marcbax | 0:c643d398cdb6 | 84 | } |
| marcbax | 0:c643d398cdb6 | 85 | |
| marcbax | 0:c643d398cdb6 | 86 | bool AT42QT2120::SetKeyControl(uint8_t key, bool guard, uint8_t group, bool gpo, bool enable) |
| marcbax | 0:c643d398cdb6 | 87 | { |
| marcbax | 0:c643d398cdb6 | 88 | bool status = false; |
| marcbax | 0:c643d398cdb6 | 89 | |
| marcbax | 0:c643d398cdb6 | 90 | if(key < 12 && group < 4) |
| marcbax | 0:c643d398cdb6 | 91 | { |
| marcbax | 0:c643d398cdb6 | 92 | uint8_t config = 0; |
| marcbax | 0:c643d398cdb6 | 93 | if(!enable) |
| marcbax | 0:c643d398cdb6 | 94 | config |= CTRL_EN; |
| marcbax | 0:c643d398cdb6 | 95 | if(gpo) |
| marcbax | 0:c643d398cdb6 | 96 | config |= CTRL_GPO; |
| marcbax | 0:c643d398cdb6 | 97 | if(group) |
| marcbax | 0:c643d398cdb6 | 98 | config |= group << 2; |
| marcbax | 0:c643d398cdb6 | 99 | if(guard) |
| marcbax | 0:c643d398cdb6 | 100 | config |= CTRL_GUARD; |
| marcbax | 0:c643d398cdb6 | 101 | |
| marcbax | 0:c643d398cdb6 | 102 | uint8_t reg = key + 28; // 28 = QT_KEY0_CTRL |
| marcbax | 0:c643d398cdb6 | 103 | status = Write((HAL::REG_AT42QT2120) reg, config); |
| marcbax | 0:c643d398cdb6 | 104 | } |
| marcbax | 0:c643d398cdb6 | 105 | |
| marcbax | 0:c643d398cdb6 | 106 | return status; |
| marcbax | 0:c643d398cdb6 | 107 | } |
| marcbax | 0:c643d398cdb6 | 108 | |
| marcbax | 0:c643d398cdb6 | 109 | void AT42QT2120::SetSliderOptions(SLIDERMODE_AT42QT2120 mode) |
| marcbax | 0:c643d398cdb6 | 110 | { |
| marcbax | 0:c643d398cdb6 | 111 | switch(mode) |
| marcbax | 0:c643d398cdb6 | 112 | { |
| marcbax | 0:c643d398cdb6 | 113 | case SLIDER: |
| marcbax | 0:c643d398cdb6 | 114 | Write(QT_SLIDER_OPTION, 0x80); |
| marcbax | 0:c643d398cdb6 | 115 | break; |
| marcbax | 0:c643d398cdb6 | 116 | |
| marcbax | 0:c643d398cdb6 | 117 | case WHEEL: |
| marcbax | 0:c643d398cdb6 | 118 | Write(QT_SLIDER_OPTION, 0xc0); |
| marcbax | 0:c643d398cdb6 | 119 | break; |
| marcbax | 0:c643d398cdb6 | 120 | |
| marcbax | 0:c643d398cdb6 | 121 | default: |
| marcbax | 0:c643d398cdb6 | 122 | Write(QT_SLIDER_OPTION, 0x0); |
| marcbax | 0:c643d398cdb6 | 123 | break; |
| marcbax | 0:c643d398cdb6 | 124 | } |
| marcbax | 0:c643d398cdb6 | 125 | } |
| marcbax | 0:c643d398cdb6 | 126 | |
| marcbax | 0:c643d398cdb6 | 127 | int AT42QT2120::Read(REG_AT42QT2120 reg) |
| marcbax | 0:c643d398cdb6 | 128 | { |
| marcbax | 0:c643d398cdb6 | 129 | if(i2c.write(ADDRESS << 1, (const char *) ®, 1, true)) |
| marcbax | 0:c643d398cdb6 | 130 | { |
| marcbax | 0:c643d398cdb6 | 131 | i2c.stop(); |
| marcbax | 0:c643d398cdb6 | 132 | return 0; |
| marcbax | 0:c643d398cdb6 | 133 | } |
| marcbax | 0:c643d398cdb6 | 134 | |
| marcbax | 0:c643d398cdb6 | 135 | char data[2]; |
| marcbax | 0:c643d398cdb6 | 136 | i2c.read(ADDRESS << 1, data, 1); |
| marcbax | 0:c643d398cdb6 | 137 | |
| marcbax | 0:c643d398cdb6 | 138 | return data[0]; |
| marcbax | 0:c643d398cdb6 | 139 | } |
| marcbax | 0:c643d398cdb6 | 140 | |
| marcbax | 0:c643d398cdb6 | 141 | bool AT42QT2120::Write(REG_AT42QT2120 reg, uint8_t value) |
| marcbax | 0:c643d398cdb6 | 142 | { |
| marcbax | 0:c643d398cdb6 | 143 | uint8_t regnum = reg; |
| marcbax | 0:c643d398cdb6 | 144 | const char data[2] = { regnum, value }; |
| marcbax | 0:c643d398cdb6 | 145 | |
| marcbax | 0:c643d398cdb6 | 146 | return i2c.write(ADDRESS << 1, data, 2) == 0; |
| marcbax | 0:c643d398cdb6 | 147 | } |
| marcbax | 0:c643d398cdb6 | 148 | |
| marcbax | 0:c643d398cdb6 | 149 | } // End HAL namespace. |
| marcbax | 0:c643d398cdb6 | 150 |