Basically i glued Peter Drescher and Simon Ford libs in a GraphicsDisplay class, then derived TFT or LCD class (which inherits Protocols class), then the most derived ones (Inits), which are per-display and are the only part needed to be adapted to diff hw.
Fork of UniGraphic by
TouchADS7843/Touch.h@22:62f3bed03503, 2015-05-06 (annotated)
- Committer:
- rakware
- Date:
- Wed May 06 16:52:07 2015 +0000
- Revision:
- 22:62f3bed03503
added touch for ADS7843 bound to TFT class
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rakware | 22:62f3bed03503 | 1 | /****************************************************************** |
rakware | 22:62f3bed03503 | 2 | ***** ***** |
rakware | 22:62f3bed03503 | 3 | ***** Name: Touch.h ***** |
rakware | 22:62f3bed03503 | 4 | ***** Ver.: 1.0 ***** |
rakware | 22:62f3bed03503 | 5 | ***** Date: 04/01/2013 ***** |
rakware | 22:62f3bed03503 | 6 | ***** Auth: Frank Vannieuwkerke ***** |
rakware | 22:62f3bed03503 | 7 | ***** Erik Olieman ***** |
rakware | 22:62f3bed03503 | 8 | ***** Func: Touch driver for use with ADS7843 ***** |
rakware | 22:62f3bed03503 | 9 | ***** ***** |
rakware | 22:62f3bed03503 | 10 | ******************************************************************/ |
rakware | 22:62f3bed03503 | 11 | |
rakware | 22:62f3bed03503 | 12 | #ifndef MBED_Touch_H |
rakware | 22:62f3bed03503 | 13 | #define MBED_Touch_H |
rakware | 22:62f3bed03503 | 14 | |
rakware | 22:62f3bed03503 | 15 | #include "TFT.h" |
rakware | 22:62f3bed03503 | 16 | #include "mbed.h" |
rakware | 22:62f3bed03503 | 17 | |
rakware | 22:62f3bed03503 | 18 | typedef struct |
rakware | 22:62f3bed03503 | 19 | { |
rakware | 22:62f3bed03503 | 20 | int x; |
rakware | 22:62f3bed03503 | 21 | int y; |
rakware | 22:62f3bed03503 | 22 | } Coordinate; |
rakware | 22:62f3bed03503 | 23 | |
rakware | 22:62f3bed03503 | 24 | typedef struct |
rakware | 22:62f3bed03503 | 25 | { |
rakware | 22:62f3bed03503 | 26 | int An, |
rakware | 22:62f3bed03503 | 27 | Bn, |
rakware | 22:62f3bed03503 | 28 | Cn, |
rakware | 22:62f3bed03503 | 29 | Dn, |
rakware | 22:62f3bed03503 | 30 | En, |
rakware | 22:62f3bed03503 | 31 | Fn, |
rakware | 22:62f3bed03503 | 32 | Divider ; |
rakware | 22:62f3bed03503 | 33 | } Matrix; |
rakware | 22:62f3bed03503 | 34 | |
rakware | 22:62f3bed03503 | 35 | class TouchScreenADS7843 { |
rakware | 22:62f3bed03503 | 36 | public: |
rakware | 22:62f3bed03503 | 37 | Coordinate display; |
rakware | 22:62f3bed03503 | 38 | Coordinate screen; |
rakware | 22:62f3bed03503 | 39 | |
rakware | 22:62f3bed03503 | 40 | /* |
rakware | 22:62f3bed03503 | 41 | * Create a Touchscreen object connected to SPI and two pins. |
rakware | 22:62f3bed03503 | 42 | * |
rakware | 22:62f3bed03503 | 43 | * @param mosi,miso,sclk SPI |
rakware | 22:62f3bed03503 | 44 | * @param cs pin connected to CS of ADS7843 |
rakware | 22:62f3bed03503 | 45 | * @param irq pin connected to IRQ of ADS7843 |
rakware | 22:62f3bed03503 | 46 | * @param pointer to SPI_TFT constructor |
rakware | 22:62f3bed03503 | 47 | * |
rakware | 22:62f3bed03503 | 48 | */ |
rakware | 22:62f3bed03503 | 49 | TouchScreenADS7843(PinName tp_mosi, PinName tp_miso, PinName tp_sclk, PinName tp_cs, PinName tp_irq, TFT *_LCD); |
rakware | 22:62f3bed03503 | 50 | |
rakware | 22:62f3bed03503 | 51 | /* |
rakware | 22:62f3bed03503 | 52 | * Draw a 2 by 2 dot on the LCD screen. |
rakware | 22:62f3bed03503 | 53 | * |
rakware | 22:62f3bed03503 | 54 | * @param x (horizontal position) |
rakware | 22:62f3bed03503 | 55 | * @param y (vertical position) |
rakware | 22:62f3bed03503 | 56 | * @param color (16 bit pixel color) |
rakware | 22:62f3bed03503 | 57 | * |
rakware | 22:62f3bed03503 | 58 | */ |
rakware | 22:62f3bed03503 | 59 | void TP_DrawPoint(unsigned int Xpos,unsigned int Ypos,unsigned int color); |
rakware | 22:62f3bed03503 | 60 | |
rakware | 22:62f3bed03503 | 61 | /* |
rakware | 22:62f3bed03503 | 62 | * Obtain averaged data from ADS7846. |
rakware | 22:62f3bed03503 | 63 | * does 9 consecutive reads and only stores averaged data |
rakware | 22:62f3bed03503 | 64 | * when the 9 points are within the treshold limits. |
rakware | 22:62f3bed03503 | 65 | * |
rakware | 22:62f3bed03503 | 66 | * @param screenPTR (pointer to store data) |
rakware | 22:62f3bed03503 | 67 | * @returns 1 on success |
rakware | 22:62f3bed03503 | 68 | * @returns 0 on failure |
rakware | 22:62f3bed03503 | 69 | * |
rakware | 22:62f3bed03503 | 70 | * If called with screenPTR = NULL - 'screen' variable is used, otherwise (parameter) is used. |
rakware | 22:62f3bed03503 | 71 | * |
rakware | 22:62f3bed03503 | 72 | */ |
rakware | 22:62f3bed03503 | 73 | unsigned char Read_Ads7843(Coordinate * screenPtr = NULL); |
rakware | 22:62f3bed03503 | 74 | |
rakware | 22:62f3bed03503 | 75 | /* |
rakware | 22:62f3bed03503 | 76 | * Calibrate the touch panel. |
rakware | 22:62f3bed03503 | 77 | * Three crosshairs are drawn and need to be touched in sequence. |
rakware | 22:62f3bed03503 | 78 | * A calibration matrix is set accordingly. |
rakware | 22:62f3bed03503 | 79 | * |
rakware | 22:62f3bed03503 | 80 | */ |
rakware | 22:62f3bed03503 | 81 | void TouchPanel_Calibrate(void); |
rakware | 22:62f3bed03503 | 82 | |
rakware | 22:62f3bed03503 | 83 | /* |
rakware | 22:62f3bed03503 | 84 | * Obtain real x,y coordinates. |
rakware | 22:62f3bed03503 | 85 | * The x,y coordinates are calculated using the calibration matrix. |
rakware | 22:62f3bed03503 | 86 | * |
rakware | 22:62f3bed03503 | 87 | */ |
rakware | 22:62f3bed03503 | 88 | unsigned char getDisplayPoint(void); |
rakware | 22:62f3bed03503 | 89 | |
rakware | 22:62f3bed03503 | 90 | /* |
rakware | 22:62f3bed03503 | 91 | * Read touchpanel screensample and matrix values. |
rakware | 22:62f3bed03503 | 92 | * |
rakware | 22:62f3bed03503 | 93 | * In your code, create 2 structures using Matrix and screenPtr |
rakware | 22:62f3bed03503 | 94 | * and call this function with these structures. |
rakware | 22:62f3bed03503 | 95 | * the calibration values are returned into these structures. |
rakware | 22:62f3bed03503 | 96 | * Example: |
rakware | 22:62f3bed03503 | 97 | * Matrix matrix; |
rakware | 22:62f3bed03503 | 98 | * Coordinate ScreenSample[3]; |
rakware | 22:62f3bed03503 | 99 | * GetCalibration(&matrix, &ScreenSample[0]); |
rakware | 22:62f3bed03503 | 100 | */ |
rakware | 22:62f3bed03503 | 101 | void GetCalibration(Matrix * matrixPtr, Coordinate * screenPtr); |
rakware | 22:62f3bed03503 | 102 | |
rakware | 22:62f3bed03503 | 103 | /* |
rakware | 22:62f3bed03503 | 104 | * Set touchpanel calibration using screensample and matrix values. |
rakware | 22:62f3bed03503 | 105 | * |
rakware | 22:62f3bed03503 | 106 | * In your code, create 2 structures based on Matrix and screenPtr, |
rakware | 22:62f3bed03503 | 107 | * copy saved calibration values into these structures |
rakware | 22:62f3bed03503 | 108 | * and call this function with these structures. |
rakware | 22:62f3bed03503 | 109 | * Example: |
rakware | 22:62f3bed03503 | 110 | * Matrix matrix; |
rakware | 22:62f3bed03503 | 111 | * Coordinate ScreenSample[3]; |
rakware | 22:62f3bed03503 | 112 | * <pseudocode> load matrix with values from external storage (eg eeprom). |
rakware | 22:62f3bed03503 | 113 | * <pseudocode> load ScreenSample with values from external storage (eg eeprom). |
rakware | 22:62f3bed03503 | 114 | * SetCalibration(&matrix, &ScreenSample[0]); |
rakware | 22:62f3bed03503 | 115 | */ |
rakware | 22:62f3bed03503 | 116 | void SetCalibration(Matrix * matrixPtr, Coordinate * screenPtr); |
rakware | 22:62f3bed03503 | 117 | |
rakware | 22:62f3bed03503 | 118 | TFT *LCD; |
rakware | 22:62f3bed03503 | 119 | SPI _tp_spi; |
rakware | 22:62f3bed03503 | 120 | DigitalOut _tp_cs; |
rakware | 22:62f3bed03503 | 121 | DigitalIn _tp_irq; |
rakware | 22:62f3bed03503 | 122 | |
rakware | 22:62f3bed03503 | 123 | protected: |
rakware | 22:62f3bed03503 | 124 | |
rakware | 22:62f3bed03503 | 125 | #define SPI_RD_DELAY 1 |
rakware | 22:62f3bed03503 | 126 | #define CHX 0xd0 // 12 bit mode |
rakware | 22:62f3bed03503 | 127 | #define CHY 0x90 |
rakware | 22:62f3bed03503 | 128 | |
rakware | 22:62f3bed03503 | 129 | Coordinate DisplaySample[3]; |
rakware | 22:62f3bed03503 | 130 | Coordinate ScreenSample[3]; |
rakware | 22:62f3bed03503 | 131 | Matrix matrix; |
rakware | 22:62f3bed03503 | 132 | |
rakware | 22:62f3bed03503 | 133 | /* |
rakware | 22:62f3bed03503 | 134 | * Obtain raw x,y data from ADS7846 |
rakware | 22:62f3bed03503 | 135 | * |
rakware | 22:62f3bed03503 | 136 | * @param pointer to raw x and y coordinates (pointer to store data) |
rakware | 22:62f3bed03503 | 137 | * @returns x (horizontal position) |
rakware | 22:62f3bed03503 | 138 | * @returns y (vertical position) |
rakware | 22:62f3bed03503 | 139 | * |
rakware | 22:62f3bed03503 | 140 | */ |
rakware | 22:62f3bed03503 | 141 | void TP_GetAdXY(int *x,int *y); |
rakware | 22:62f3bed03503 | 142 | |
rakware | 22:62f3bed03503 | 143 | /* |
rakware | 22:62f3bed03503 | 144 | * Obtain raw single channel data from ADS7846 (Called by TP_GetADXY) |
rakware | 22:62f3bed03503 | 145 | * |
rakware | 22:62f3bed03503 | 146 | * @param channel to be read (CHX or CHY) |
rakware | 22:62f3bed03503 | 147 | * @returns raw scaled down value (return value range must be between 0 and 1024) |
rakware | 22:62f3bed03503 | 148 | * |
rakware | 22:62f3bed03503 | 149 | */ |
rakware | 22:62f3bed03503 | 150 | int Read_XY(unsigned char XY); |
rakware | 22:62f3bed03503 | 151 | |
rakware | 22:62f3bed03503 | 152 | /* |
rakware | 22:62f3bed03503 | 153 | * Draw a calibration crosshair on the LCD screen |
rakware | 22:62f3bed03503 | 154 | * |
rakware | 22:62f3bed03503 | 155 | * @param x (horizontal position) |
rakware | 22:62f3bed03503 | 156 | * @param y (vertical position) |
rakware | 22:62f3bed03503 | 157 | * |
rakware | 22:62f3bed03503 | 158 | */ |
rakware | 22:62f3bed03503 | 159 | void DrawCross(unsigned int Xpos,unsigned int Ypos); |
rakware | 22:62f3bed03503 | 160 | |
rakware | 22:62f3bed03503 | 161 | /* |
rakware | 22:62f3bed03503 | 162 | * Set the calibration matrix |
rakware | 22:62f3bed03503 | 163 | * |
rakware | 22:62f3bed03503 | 164 | * @param displayPTR (pointer to display data) |
rakware | 22:62f3bed03503 | 165 | * @param screenPTR (pointer to screen data) |
rakware | 22:62f3bed03503 | 166 | * @param matrixPTR (pointer to calibration matrix) |
rakware | 22:62f3bed03503 | 167 | * |
rakware | 22:62f3bed03503 | 168 | * @returns 0 when matrix.divider != 0 |
rakware | 22:62f3bed03503 | 169 | * @returns 1 when matrix.divider = 0 |
rakware | 22:62f3bed03503 | 170 | * |
rakware | 22:62f3bed03503 | 171 | */ |
rakware | 22:62f3bed03503 | 172 | unsigned char setCalibrationMatrix( Coordinate * displayPtr,Coordinate * screenPtr,Matrix * matrixPtr); |
rakware | 22:62f3bed03503 | 173 | |
rakware | 22:62f3bed03503 | 174 | }; |
rakware | 22:62f3bed03503 | 175 | #endif |