A 5-wire resistive touch screen controller.

Committer:
Generic
Date:
Wed Oct 26 10:39:37 2016 +0000
Revision:
4:140d6bff4860
Parent:
2:a4ebeb3ba49c
Updated

Who changed what in which revision?

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