Marc Bax / Mbed 2 deprecated Flexbook180111a

Dependencies:   SDFileSystem app epson mbed msp430 pl tests

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?

UserRevisionLine numberNew 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 *) &reg, 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