A controller for a 5 wire resistive touch screen

Committer:
Kerneels Bezuidenhout
Date:
Thu Sep 22 22:38:32 2016 +0200
Revision:
4:ab2e56595286
Parent:
3:710534c5a240
Child:
5:519187025bb4
Added settle time to constructor and SetSettle(int settle) function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kerneels Bezuidenhout 1:ed8485a78c6a 1 #include "TouchController.hpp"
Kerneels Bezuidenhout 1:ed8485a78c6a 2
Kerneels Bezuidenhout 4:ab2e56595286 3 TouchController::TouchController(PinName ur, PinName lr, PinName s, PinName ul, PinName ll, int num_of_samples, int settle) :
Kerneels Bezuidenhout 1:ed8485a78c6a 4 _UR(ur),
Kerneels Bezuidenhout 1:ed8485a78c6a 5 _LR(lr),
Kerneels Bezuidenhout 1:ed8485a78c6a 6 _UL(ul),
Kerneels Bezuidenhout 1:ed8485a78c6a 7 _LL(ll)
Kerneels Bezuidenhout 1:ed8485a78c6a 8 {
Kerneels Bezuidenhout 1:ed8485a78c6a 9 _UR.output();
Kerneels Bezuidenhout 1:ed8485a78c6a 10 _UR.mode(PullNone);
Kerneels Bezuidenhout 1:ed8485a78c6a 11
Kerneels Bezuidenhout 1:ed8485a78c6a 12 _UL.output();
Kerneels Bezuidenhout 1:ed8485a78c6a 13 _UL.mode(PullNone);
Kerneels Bezuidenhout 1:ed8485a78c6a 14
Kerneels Bezuidenhout 1:ed8485a78c6a 15 _LR.output();
Kerneels Bezuidenhout 1:ed8485a78c6a 16 _LR.mode(PullNone);
Kerneels Bezuidenhout 1:ed8485a78c6a 17
Kerneels Bezuidenhout 1:ed8485a78c6a 18 _LL.output();
Kerneels Bezuidenhout 1:ed8485a78c6a 19 _LL.mode(PullNone);
Kerneels Bezuidenhout 1:ed8485a78c6a 20
Kerneels Bezuidenhout 1:ed8485a78c6a 21 _S = s;
Kerneels Bezuidenhout 2:d0930962a3bb 22 n_samples = num_of_samples;
Kerneels Bezuidenhout 1:ed8485a78c6a 23
Kerneels Bezuidenhout 4:ab2e56595286 24 _settle = settle;
Kerneels Bezuidenhout 1:ed8485a78c6a 25
Kerneels Bezuidenhout 1:ed8485a78c6a 26 A = 1660.540541f;
Kerneels Bezuidenhout 1:ed8485a78c6a 27 B = 20.5005005f;
Kerneels Bezuidenhout 1:ed8485a78c6a 28 C = -334.0556557f;
Kerneels Bezuidenhout 1:ed8485a78c6a 29 D = 0.0f;
Kerneels Bezuidenhout 1:ed8485a78c6a 30 E = 1517.037037f;
Kerneels Bezuidenhout 1:ed8485a78c6a 31 F = -246.5185185;
Kerneels Bezuidenhout 1:ed8485a78c6a 32 }
Kerneels Bezuidenhout 1:ed8485a78c6a 33
Kerneels Bezuidenhout 1:ed8485a78c6a 34 int TouchController::TouchDetected()
Kerneels Bezuidenhout 1:ed8485a78c6a 35 {
Kerneels Bezuidenhout 2:d0930962a3bb 36 DigitalIn S(_S, PullUp);
Kerneels Bezuidenhout 2:d0930962a3bb 37 ConfigPins(DETECT);
Kerneels Bezuidenhout 2:d0930962a3bb 38 Thread::wait(settle);
Kerneels Bezuidenhout 1:ed8485a78c6a 39
Kerneels Bezuidenhout 2:d0930962a3bb 40 return (S.read() == 1 ? 0 : 1);
Kerneels Bezuidenhout 1:ed8485a78c6a 41 }
Kerneels Bezuidenhout 1:ed8485a78c6a 42
Kerneels Bezuidenhout 1:ed8485a78c6a 43 float TouchController::RawX()
Kerneels Bezuidenhout 1:ed8485a78c6a 44 {
Kerneels Bezuidenhout 2:d0930962a3bb 45 ConfigPins(X);
Kerneels Bezuidenhout 2:d0930962a3bb 46 Thread::wait(settle);
Kerneels Bezuidenhout 1:ed8485a78c6a 47
Kerneels Bezuidenhout 1:ed8485a78c6a 48 return MeasureS();
Kerneels Bezuidenhout 1:ed8485a78c6a 49 }
Kerneels Bezuidenhout 1:ed8485a78c6a 50
Kerneels Bezuidenhout 1:ed8485a78c6a 51 float TouchController::RawY()
Kerneels Bezuidenhout 1:ed8485a78c6a 52 {
Kerneels Bezuidenhout 2:d0930962a3bb 53 ConfigPins(Y);
Kerneels Bezuidenhout 2:d0930962a3bb 54 Thread::wait(settle);
Kerneels Bezuidenhout 1:ed8485a78c6a 55 return MeasureS();
Kerneels Bezuidenhout 1:ed8485a78c6a 56 }
Kerneels Bezuidenhout 1:ed8485a78c6a 57
Generic 3:710534c5a240 58 float TouchController::GetX()
Kerneels Bezuidenhout 1:ed8485a78c6a 59 {
Kerneels Bezuidenhout 2:d0930962a3bb 60 ConfigPins(X);
Kerneels Bezuidenhout 2:d0930962a3bb 61 Thread::wait(settle);
Kerneels Bezuidenhout 1:ed8485a78c6a 62 float x_t = MeasureS();
Kerneels Bezuidenhout 1:ed8485a78c6a 63
Kerneels Bezuidenhout 2:d0930962a3bb 64 ConfigPins(Y);
Kerneels Bezuidenhout 2:d0930962a3bb 65 Thread::wait(settle);
Kerneels Bezuidenhout 1:ed8485a78c6a 66 float y_t = MeasureS();
Kerneels Bezuidenhout 1:ed8485a78c6a 67
Kerneels Bezuidenhout 1:ed8485a78c6a 68 return (A*x_t+B*y_t+C);
Kerneels Bezuidenhout 1:ed8485a78c6a 69 }
Kerneels Bezuidenhout 1:ed8485a78c6a 70
Generic 3:710534c5a240 71 float TouchController::GetY()
Kerneels Bezuidenhout 1:ed8485a78c6a 72 {
Kerneels Bezuidenhout 2:d0930962a3bb 73 ConfigPins(X);
Kerneels Bezuidenhout 2:d0930962a3bb 74 Thread::wait(settle);
Kerneels Bezuidenhout 1:ed8485a78c6a 75 float x_t = MeasureS();
Kerneels Bezuidenhout 1:ed8485a78c6a 76
Kerneels Bezuidenhout 2:d0930962a3bb 77 ConfigPins(Y);
Kerneels Bezuidenhout 2:d0930962a3bb 78 Thread::wait(settle);
Kerneels Bezuidenhout 1:ed8485a78c6a 79 float y_t = MeasureS();
Kerneels Bezuidenhout 1:ed8485a78c6a 80
Kerneels Bezuidenhout 1:ed8485a78c6a 81 return (D*x_t+E*y_t+F);
Kerneels Bezuidenhout 1:ed8485a78c6a 82 }
Kerneels Bezuidenhout 1:ed8485a78c6a 83
Kerneels Bezuidenhout 1:ed8485a78c6a 84 void TouchController::Calibrate(float t[3][2], float d[3][2])
Kerneels Bezuidenhout 1:ed8485a78c6a 85 {
Kerneels Bezuidenhout 1:ed8485a78c6a 86 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));
Kerneels Bezuidenhout 2:d0930962a3bb 87 B = (A*(X_T3-X_T2)+X_D2-X_D3)/(Y_T2-Y_T3);
Kerneels Bezuidenhout 2:d0930962a3bb 88 C = X_D3-A*X_T3-B*Y_T3;
Kerneels Bezuidenhout 2:d0930962a3bb 89 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));
Kerneels Bezuidenhout 2:d0930962a3bb 90 E = (D*(X_T3-X_T2)+Y_D2-Y_D3)/(Y_T2-Y_T3);
Kerneels Bezuidenhout 2:d0930962a3bb 91 F = Y_D3-D*X_T3-E*Y_T3;
Kerneels Bezuidenhout 1:ed8485a78c6a 92 }
Kerneels Bezuidenhout 1:ed8485a78c6a 93
Generic 3:710534c5a240 94 void TouchController::ConfigPins(char mode)
Kerneels Bezuidenhout 1:ed8485a78c6a 95 {
Kerneels Bezuidenhout 1:ed8485a78c6a 96 switch (mode)
Kerneels Bezuidenhout 1:ed8485a78c6a 97 {
Kerneels Bezuidenhout 2:d0930962a3bb 98 case DETECT:
Kerneels Bezuidenhout 1:ed8485a78c6a 99 _UR.write(0);
Kerneels Bezuidenhout 1:ed8485a78c6a 100 _UL.write(0);
Kerneels Bezuidenhout 1:ed8485a78c6a 101 _LR.write(0);
Kerneels Bezuidenhout 1:ed8485a78c6a 102 _LL.write(0);
Kerneels Bezuidenhout 1:ed8485a78c6a 103 break;
Kerneels Bezuidenhout 2:d0930962a3bb 104 case X:
Kerneels Bezuidenhout 1:ed8485a78c6a 105 _UR.write(1);
Kerneels Bezuidenhout 1:ed8485a78c6a 106 _UL.write(0);
Kerneels Bezuidenhout 1:ed8485a78c6a 107 _LR.write(1);
Kerneels Bezuidenhout 1:ed8485a78c6a 108 _LL.write(0);
Kerneels Bezuidenhout 1:ed8485a78c6a 109 break;
Kerneels Bezuidenhout 2:d0930962a3bb 110 case Y:
Kerneels Bezuidenhout 1:ed8485a78c6a 111 _UR.write(1);
Kerneels Bezuidenhout 1:ed8485a78c6a 112 _UL.write(1);
Kerneels Bezuidenhout 1:ed8485a78c6a 113 _LR.write(0);
Kerneels Bezuidenhout 1:ed8485a78c6a 114 _LL.write(0);
Kerneels Bezuidenhout 1:ed8485a78c6a 115 break;
Kerneels Bezuidenhout 1:ed8485a78c6a 116 }
Kerneels Bezuidenhout 1:ed8485a78c6a 117 }
Kerneels Bezuidenhout 1:ed8485a78c6a 118
Kerneels Bezuidenhout 1:ed8485a78c6a 119 float TouchController::MeasureS()
Kerneels Bezuidenhout 1:ed8485a78c6a 120 {
Kerneels Bezuidenhout 1:ed8485a78c6a 121 AnalogIn S(_S);
Kerneels Bezuidenhout 1:ed8485a78c6a 122
Kerneels Bezuidenhout 2:d0930962a3bb 123 float measured_val = 0.0f;
Kerneels Bezuidenhout 1:ed8485a78c6a 124
Kerneels Bezuidenhout 2:d0930962a3bb 125 for( int i = 0; i < n_samples; i++)
Kerneels Bezuidenhout 2:d0930962a3bb 126 {
Kerneels Bezuidenhout 2:d0930962a3bb 127 measured_val += S.read();
Kerneels Bezuidenhout 2:d0930962a3bb 128 }
Kerneels Bezuidenhout 1:ed8485a78c6a 129
Kerneels Bezuidenhout 2:d0930962a3bb 130 return ( measured_val/n_samples);
Kerneels Bezuidenhout 1:ed8485a78c6a 131 }
Kerneels Bezuidenhout 4:ab2e56595286 132
Kerneels Bezuidenhout 4:ab2e56595286 133 void TouchController::SetSettleTime(int settle)
Kerneels Bezuidenhout 4:ab2e56595286 134 {
Kerneels Bezuidenhout 4:ab2e56595286 135 _settle = settle;
Kerneels Bezuidenhout 4:ab2e56595286 136 }