A controller for a 5 wire resistive touch screen
TouchController.cpp
- Committer:
- Generic
- Date:
- 2016-09-22
- Revision:
- 5:519187025bb4
- Parent:
- 4:ab2e56595286
File content as of revision 5:519187025bb4:
#include "TouchController.hpp" TouchController::TouchController(PinName ur, PinName lr, PinName s, PinName ul, PinName ll, int num_of_samples, int settle) : _UR(ur), _LR(lr), _UL(ul), _LL(ll) { _UR.output(); _UR.mode(PullNone); _UL.output(); _UL.mode(PullNone); _LR.output(); _LR.mode(PullNone); _LL.output(); _LL.mode(PullNone); _S = s; n_samples = num_of_samples; _settle = settle; A = 1660.540541f; B = 20.5005005f; C = -334.0556557f; D = 0.0f; E = 1517.037037f; F = -246.5185185; } int TouchController::TouchDetected() { DigitalIn S(_S, PullUp); ConfigPins(DETECT); Thread::wait(_settle); return (S.read() == 1 ? 0 : 1); } float TouchController::RawX() { ConfigPins(X); Thread::wait(_settle); return MeasureS(); } float TouchController::RawY() { ConfigPins(Y); Thread::wait(_settle); return MeasureS(); } float TouchController::GetX() { ConfigPins(X); Thread::wait(_settle); float x_t = MeasureS(); ConfigPins(Y); Thread::wait(_settle); float y_t = MeasureS(); return (A*x_t+B*y_t+C); } float TouchController::GetY() { ConfigPins(X); Thread::wait(_settle); float x_t = MeasureS(); ConfigPins(Y); Thread::wait(_settle); float y_t = MeasureS(); return (D*x_t+E*y_t+F); } void TouchController::Calibrate(float t[3][2], float d[3][2]) { A = (X_D1*(Y_T2-Y_T3)+X_D2*(Y_T3-Y_T1)+X_D3*(Y_T1-Y_T2))/(X_T1*(Y_T2-Y_T3)+X_T2*(Y_T3-Y_T1)+X_T3*(Y_T1-Y_T2)); B = (A*(X_T3-X_T2)+X_D2-X_D3)/(Y_T2-Y_T3); C = X_D3-A*X_T3-B*Y_T3; D = (Y_D1*(Y_T2-Y_T3)+Y_D2*(Y_T3-Y_T1)+Y_D3*(Y_T1-Y_T2))/(X_T1*(Y_T2-Y_T3)+X_T2*(Y_T3-Y_T1)+X_T3*(Y_T1-Y_T2)); E = (D*(X_T3-X_T2)+Y_D2-Y_D3)/(Y_T2-Y_T3); F = Y_D3-D*X_T3-E*Y_T3; } void TouchController::ConfigPins(char mode) { switch (mode) { case DETECT: _UR.write(0); _UL.write(0); _LR.write(0); _LL.write(0); break; case X: _UR.write(1); _UL.write(0); _LR.write(1); _LL.write(0); break; case Y: _UR.write(1); _UL.write(1); _LR.write(0); _LL.write(0); break; } } float TouchController::MeasureS() { AnalogIn S(_S); float measured_val = 0.0f; for( int i = 0; i < n_samples; i++) { measured_val += S.read(); } return ( measured_val/n_samples); } void TouchController::SetSettleTime(int settle) { _settle = settle; }