A controller for a 5 wire resistive touch screen
TouchController.cpp@5:519187025bb4, 2016-09-22 (annotated)
- Committer:
- Generic
- Date:
- Thu Sep 22 21:22:31 2016 +0000
- Revision:
- 5:519187025bb4
- Parent:
- 4:ab2e56595286
Changed settle to _settle
Who changed what in which revision?
User | Revision | Line number | New 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); |
Generic | 5:519187025bb4 | 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); |
Generic | 5:519187025bb4 | 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); |
Generic | 5:519187025bb4 | 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); |
Generic | 5:519187025bb4 | 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); |
Generic | 5:519187025bb4 | 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); |
Generic | 5:519187025bb4 | 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); |
Generic | 5:519187025bb4 | 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 | } |