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.
Fork of SeeedStudioTFTv2 by
SeeedStudioTFTv2.cpp
- Committer:
- mazgch
- Date:
- 2013-10-19
- Revision:
- 4:4542d1ff81e4
- Child:
- 5:366bdc7a8315
File content as of revision 4:4542d1ff81e4:
/* mbed library for resistive touch pads
* uses 4 pins - 2 IO and 2 Analog
* c 2011 Peter Drescher - DC2PD
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "mbed.h"
#include "SeeedStudioTFTv2.h"
SeeedStudioTFTv2::SeeedStudioTFTv2(PinName xp, PinName xm, PinName yp, PinName ym,
PinName mosi, PinName miso, PinName sclk,
PinName csTft, PinName rstTft, PinName dcTft, PinName blTft,
PinName csSd):
SPI_TFT_ILI9341(mosi,miso,sclk,csTft,rstTft,dcTft, "tft")
#ifdef USE_SDCARD
,SDFileSystem(mosi,miso,sclk,csSd, "sdc")
#endif
{
#ifndef USE_SDCARD
// sd card
DigitalOut cs(csSd);
cs = 1;
#endif
// backlight
DigitalOut bl(blTft);
bl = 1;
// touch screen pins
_xp = xp;
_yp = yp;
_xm = xm;
_ym = ym;
// default touch calibration
// orientation // 0 1 2 3
x_off = 108000; // 17252 16605 108755 108000
y_off = 22000; // 22330 105819 97167 22000
pp_tx = -291; // 378 289 -390 -291
pp_ty = 356; // 261 -355 -239 356
}
int SeeedStudioTFTv2::readTouch(PinName p, PinName m, PinName a, PinName i)
{
DigitalOut _p(p);
_p = 1;
DigitalOut _m(m);
_m = 0;
AnalogIn _a(a);
DigitalIn _i(i);
wait_us(10);
return _a.read_u16();
}
SeeedStudioTFTv2::TOUCH SeeedStudioTFTv2::getTouch(point& p)
{
int y2 = readTouch(_xp,_xm,_yp,_ym);
int x2 = readTouch(_yp,_ym,_xp,_xm);
int y1 = readTouch(_xp,_xm,_yp,_ym);
int x1 = readTouch(_yp,_ym,_xp,_xm);
int xd = x1 - x2;
int yd = y1 - y2;
xd = (xd > 0) ? xd : -xd;
yd = (yd > 0) ? xd : -xd;
p.x = x1 + x2;
p.y = y1 + y2;
#if 0
DigitalOut _p(_xp);
_p = 1;
DigitalOut _m(_ym);
_m = 0;
AnalogIn _ax(_xm);
AnalogIn _ay(_yp);
wait_us(20);
int ax = _ax.read_u16();
int ay = _ay.read_u16();
float z = 0;
z = (float)ay / ax / x / 2 * 0x10000;
#endif
const int th = 8000;
const int df = 100;
TOUCH touch;
if (x1 < th || x2 < th ||
y1 < th || y2 < th) {
p.x = 0;
p.y = 0;
touch = NO;
} else if (xd > df || yd > df) {
touch = MAYBE;
} else {
touch = YES;
}
//locate(0,50);
//printf("x: %6i y: %6i",p.x,p.y);
return touch;
}
void SeeedStudioTFTv2::calibrate(void)
{
int i;
int a = 0,b = 0,c = 0, d = 0;
int pos_x, pos_y;
point p;
cls();
foreground(White); // set chars to white
line(0,3,6,3,White);
line(3,0,3,6,White);
// get the center of the screen
pos_x = columns() / 2 - 3;
pos_x = pos_x * font[1];
pos_y = (rows() / 2) - 1;
pos_y = pos_y * font[2];
locate(pos_x,pos_y);
printf("press cross ");
locate(pos_x,pos_y + font[2]);
printf("to calibrate ");
for (i=0; i<5; i++) {
while (getTouch(p) != YES)
/*nothing*/;
a += p.x;
b += p.y;
}
a = a / 5;
b = b / 5;
locate(pos_x,pos_y);
printf("ok ");
locate(pos_x,pos_y + font[2]);
printf("release touch ");
while (getTouch(p) != NO)
/*nothing*/;
cls();
line(width() -5, height() - 8,width() - 5,height() -1,White); // paint cross
line(width() - 8,height() - 5,width() - 1,height() - 5,White);
locate(pos_x,pos_y);
printf("press cross ");
locate(pos_x,pos_y + font[2]);
printf("to calibrate ");
for (i=0; i<5; i++) {
while (getTouch(p) != YES)
/*nothing*/;
c+= p.x;
d+= p.y;
}
c = c / 5;
d = d / 5;
locate(pos_x, pos_y);
x_off = a;
y_off = b;
i = c-a; // delta x
pp_tx = i / (width() - 6);
i = d-b; // delta y
pp_ty = i / (height() - 6);
locate(pos_x,pos_y);
printf("Calibrated ");
locate(pos_x,pos_y + font[2]);
printf("x %6i %4i", x_off, pp_tx);
locate(pos_x,pos_y + 2*font[2]);
printf("y %6i %4i", y_off, pp_ty);
while (getTouch(p) != NO)
/*nothing*/;
cls();
}
point SeeedStudioTFTv2::toPixel(point p)
{
p.x -= x_off;
p.x /= pp_tx;
int w = width();
if (p.x > w) p.x = w;
if (p.x < 0) p.x = 0;
p.y -= y_off;
p.y /= pp_ty;
int h = height();
if (p.y > h) p.y = h;
if (p.y < 0) p.y = 0;
return (p);
}
bool SeeedStudioTFTv2::getPixel(point& p)
{
TOUCH touch = getTouch(p);
p = toPixel(p);
return touch == YES;
}
