A 5-wire resistive touch screen controller.
ResistiveTouchController.cpp@4:140d6bff4860, 2016-10-26 (annotated)
- Committer:
- Generic
- Date:
- Wed Oct 26 10:39:37 2016 +0000
- Revision:
- 4:140d6bff4860
- Parent:
- 2:a4ebeb3ba49c
Updated
Who changed what in which revision?
User | Revision | Line number | New 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 | } |