Error as described in MBs email to MS

Dependencies:   SDFileSystem app epson mbed msp430 pl tests

Committer:
marcbax
Date:
Thu Jan 11 14:12:00 2018 +0000
Revision:
1:5874c1a074a7
Parent:
0:c643d398cdb6
Version 180111a with error as reported to Mark Symonds

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