Browse Source

XPT2046: Handle MKS touchscreen w/out PenIRQ pin (#14640)

Tanguy Pruvot 5 years ago
parent
commit
9dfa5ba3a5

+ 18
- 5
Marlin/src/feature/touch/xpt2046.cpp View File

44
 extern int8_t encoderDiff;
44
 extern int8_t encoderDiff;
45
 
45
 
46
 void XPT2046::init(void) {
46
 void XPT2046::init(void) {
47
-  SET_INPUT(TOUCH_INT_PIN); // Pendrive interrupt pin, used as polling in getInTouch
48
   SET_INPUT(TOUCH_MISO_PIN);
47
   SET_INPUT(TOUCH_MISO_PIN);
49
   SET_OUTPUT(TOUCH_MOSI_PIN);
48
   SET_OUTPUT(TOUCH_MOSI_PIN);
50
-
51
-  OUT_WRITE(TOUCH_SCK_PIN, 0);
49
+  SET_OUTPUT(TOUCH_SCK_PIN);
52
   OUT_WRITE(TOUCH_CS_PIN, 1);
50
   OUT_WRITE(TOUCH_CS_PIN, 1);
53
 
51
 
52
+  #if PIN_EXISTS(TOUCH_INT)
53
+    // Optional Pendrive interrupt pin
54
+    SET_INPUT(TOUCH_INT_PIN);
55
+  #endif
56
+
54
   // Read once to enable pendrive status pin
57
   // Read once to enable pendrive status pin
55
   getInTouch(XPT2046_X);
58
   getInTouch(XPT2046_X);
56
 }
59
 }
74
 
77
 
75
   // We rely on XPT2046 compatible mode to ADS7843, hence no Z1 and Z2 measurements possible.
78
   // We rely on XPT2046 compatible mode to ADS7843, hence no Z1 and Z2 measurements possible.
76
 
79
 
77
-  if (READ(TOUCH_INT_PIN)) return 0; // If HIGH there are no screen presses.
80
+  if (!isTouched()) return 0;
78
   const uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1],
81
   const uint16_t x = uint16_t(((uint32_t(getInTouch(XPT2046_X))) * tsoffsets[0]) >> 16) + tsoffsets[1],
79
                  y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3];
82
                  y = uint16_t(((uint32_t(getInTouch(XPT2046_Y))) * tsoffsets[2]) >> 16) + tsoffsets[3];
80
-  if (READ(TOUCH_INT_PIN)) return 0; // Fingers must still be on the TS for a valid read.
83
+  if (!isTouched()) return 0; // Fingers must still be on the TS for a valid read.
81
 
84
 
82
   if (y < 185 || y > 224) return 0;
85
   if (y < 185 || y > 224) return 0;
83
 
86
 
88
   return 0;
91
   return 0;
89
 }
92
 }
90
 
93
 
94
+bool XPT2046::isTouched() {
95
+  return (
96
+    #if PIN_EXISTS(TOUCH_INT)
97
+      READ(TOUCH_INT_PIN) != HIGH
98
+    #else
99
+      getInTouch(XPT2046_Z1) >= XPT2046_Z1_TRESHHOLD
100
+    #endif
101
+  );
102
+}
103
+
91
 uint16_t XPT2046::getInTouch(const XPTCoordinate coordinate) {
104
 uint16_t XPT2046::getInTouch(const XPTCoordinate coordinate) {
92
   uint16_t data[3];
105
   uint16_t data[3];
93
 
106
 

+ 7
- 2
Marlin/src/feature/touch/xpt2046.h View File

28
 #define XPT2046_CONTROL  0x80
28
 #define XPT2046_CONTROL  0x80
29
 
29
 
30
 enum XPTCoordinate : uint8_t {
30
 enum XPTCoordinate : uint8_t {
31
-  XPT2046_X = 0x10,
32
-  XPT2046_Y = 0x50
31
+  XPT2046_X  = 0x10,
32
+  XPT2046_Y  = 0x50,
33
+  XPT2046_Z1 = 0x30,
34
+  XPT2046_Z2 = 0x40
33
 };
35
 };
34
 
36
 
37
+#define XPT2046_Z1_TRESHHOLD 10
38
+
35
 class XPT2046 {
39
 class XPT2046 {
36
 public:
40
 public:
37
   static void init(void);
41
   static void init(void);
38
   static uint8_t read_buttons();
42
   static uint8_t read_buttons();
39
 private:
43
 private:
44
+  static bool isTouched();
40
   static uint16_t getInTouch(const XPTCoordinate coordinate);
45
   static uint16_t getInTouch(const XPTCoordinate coordinate);
41
 };
46
 };
42
 
47
 

+ 3
- 0
Marlin/src/pins/pinsDebug_list.h View File

1172
 #if PIN_EXISTS(TOUCH_CS)
1172
 #if PIN_EXISTS(TOUCH_CS)
1173
   REPORT_NAME_DIGITAL(__LINE__, TOUCH_CS_PIN)
1173
   REPORT_NAME_DIGITAL(__LINE__, TOUCH_CS_PIN)
1174
 #endif
1174
 #endif
1175
+#if PIN_EXISTS(TOUCH_INT)
1176
+  REPORT_NAME_DIGITAL(__LINE__, TOUCH_INT_PIN)
1177
+#endif

Loading…
Cancel
Save