Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: TSI USBDevice mbed-dev
Fork of SmartWheels by
Diff: Hardwares/ArduTouch.cpp
- Branch:
- Drift
- Revision:
- 79:bdbac82c979b
- Parent:
- 78:9f20bf037db6
- Child:
- 80:c85cb93713b3
--- a/Hardwares/ArduTouch.cpp Mon Apr 17 16:02:48 2017 +0000
+++ b/Hardwares/ArduTouch.cpp Tue Apr 18 17:43:12 2017 +0000
@@ -1,11 +1,173 @@
#include "ArduTouch.h"
+#include "GlobalVariable.h"
+#include "PinAssignment.h"
+
+#define SW_DEBUG
+#include "SWCommon.h"
#ifdef __cplusplus
extern "C" {
#endif
+#define TOUCH_PREC 10
+#define PixSizeX 13.78
+#define PixOffsX 411
+#define PixSizeY 4.5
+#define PixOffsY 378
+
+static DigitalOut touch_cs(PIN_ATC_TOUCH_CS, 1);
+static InterruptIn touch_irq(PIN_ATC_TOUCH_IRQ);
+static uint16_t touch_x = 0;
+static uint16_t touch_y = 0;
+
+static Timeout touch_recover_timer;
+
+void ardu_touch_recover();
+void ardu_touch_read();
+
+void ardu_touch_recover()
+{
+ touch_irq.fall(&ardu_touch_read);
+}
+
+inline uint16_t ardu_touch_read_data_16(uint8_t address)
+{
+ uint16_t result;
+
+ touch_cs = 0;
+ g_spi_port.write(address);
+ result = static_cast<uint8_t>(g_spi_port.write(0x00)) << 8;
+ result |= static_cast<uint8_t>(g_spi_port.write(0x00));
+ result = result >> 4;
+ touch_cs = 1;
+
+ return result;
+}
+
+void ardu_touch_read()
+{
+ touch_irq.fall(NULL);
+ unsigned long tx = 0;
+ unsigned long ty = 0;
+
+ for (int i = 0; i < TOUCH_PREC; ++i)
+ {
+ ty+=ardu_touch_read_data_16(0x90);
+ tx+=ardu_touch_read_data_16(0xD0);
+ }
+
+ touch_x = tx / TOUCH_PREC;
+ touch_y = ty / TOUCH_PREC;
+
+ int value_x, value_y;
+
+ value_x = ((touch_y - PixOffsY) / PixSizeY);
+
+ if (value_x < 0)
+ value_x = 0;
+ else if(value_x > 320)
+ value_x = 320;
+
+ value_y = ((240 - ((touch_x - PixOffsX) / PixSizeX)) - 150) * 2;
+
+ if (value_y < 0)
+ value_y = 0;
+ else if(value_y > 240)
+ value_x = 240;
+
+ LOGI("#%d, %d#", value_x, value_y);
+
+ touch_recover_timer.attach(&ardu_touch_recover, 0.5f);
+}
+
+/*
+inline uint16_t ardu_touch_read_data_16(uint8_t cmd)
+{
+ uint16_t result;
+ touch_cs = 0;
+ g_spi_port.write(cmd);
+ wait_us(1);
+ result = static_cast<uint8_t>(g_spi_port.write(0x00)) << 8;
+ result |= static_cast<uint8_t>(g_spi_port.write(0x00));
+ result = result >> 4;
+ touch_cs = 1;
+ return result;
+}
+
+#define LOST_VAL 1
+inline uint16_t ardu_touch_read_pos(uint8_t cmd)
+{
+ uint16_t buf[TOUCH_PREC];
+ uint16_t sum = 0;
+ uint16_t temp;
+ for(int i = 0; i < TOUCH_PREC; ++i)
+ {
+ buf[i] = ardu_touch_read_data_16(cmd);
+ }
+ for(int i = 0; i < TOUCH_PREC - 1; ++i)
+ {
+ for(int j = i + 1; j < TOUCH_PREC; ++j)
+ {
+ if(buf[i] > buf[j])
+ {
+ temp = buf[i];
+ buf[i] = buf[j];
+ buf[j] = temp;
+ }
+ }
+ }
+ for(int i = LOST_VAL; i < TOUCH_PREC - LOST_VAL; ++i)
+ {
+ sum += buf[i];
+ }
+ return (sum / (TOUCH_PREC - (2 * LOST_VAL)));
+}
+
+void ardu_touch_read()
+{
+ touch_irq.fall(NULL);
+
+ touch_x = ardu_touch_read_pos(0X90);
+ touch_y = ardu_touch_read_pos(0XD0);
+
+ int value_x, value_y;
+
+ if (PixSizeY<0)
+ value_x = 400 - ((touch_y - PixOffsY) / -PixSizeY);
+ else
+ value_x = ((touch_y - PixOffsY) / PixSizeY);
+
+ if (value_x < 0)
+ value_x = 0;
+
+ if (PixSizeX>=0)
+ {
+ value_y = 240 - ((touch_x - PixOffsX) / PixSizeX);
+ }
+ else
+ {
+ value_y = (touch_x - PixOffsX) / -(PixSizeX);
+ }
+
+ if (value_y < 0)
+ value_y = 0;
+
+ LOGI("#%d, %d#", value_x, value_y);
+
+ touch_recover_timer.attach(&ardu_touch_recover, 0.5f);
+}
+*/
+void ardu_touch_init()
+{
+ touch_irq.fall(&ardu_touch_read);
+}
+
+void ardu_touch_get_pos(int16_t* x, int16_t* y)
+{
+
+}
#ifdef __cplusplus
}
