SmartWheels self-driving race car. Designed for NXP Cup. Uses FRDM-KL25Z, area-scan camera, and simple image processing to detect and navigate any NXP spec track.
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 }