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 haofan Zheng

Committer:
hazheng
Date:
Wed Mar 22 23:43:24 2017 +0000
Revision:
40:be98219930e4
Child:
41:7b21c5e3599e
Added code for UTFT screen. Nothing displayed on screen. Maybe screen is broken?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hazheng 40:be98219930e4 1 #include "ArduUTFT.h"
hazheng 40:be98219930e4 2
hazheng 40:be98219930e4 3 #include "GlobalVariable.h"
hazheng 40:be98219930e4 4 #include "SWUSBServer.h"
hazheng 40:be98219930e4 5
hazheng 40:be98219930e4 6 extern SPI g_spi_port;
hazheng 40:be98219930e4 7
hazheng 40:be98219930e4 8 #define UTFT_DISP_X_SIZE 239
hazheng 40:be98219930e4 9 #define UTFT_DISP_Y_SIZE 319
hazheng 40:be98219930e4 10 #define UTFT_DISP_TRANS_MODE 8
hazheng 40:be98219930e4 11
hazheng 40:be98219930e4 12
hazheng 40:be98219930e4 13 #define swap(type, i, j) {type t = i; i = j; j = t;}
hazheng 40:be98219930e4 14
hazheng 40:be98219930e4 15
hazheng 40:be98219930e4 16 namespace
hazheng 40:be98219930e4 17 {
hazheng 40:be98219930e4 18 uint8_t * current_font = NULL;
hazheng 40:be98219930e4 19 uint8_t font_x_size = 0;
hazheng 40:be98219930e4 20 uint8_t font_y_size = 0;
hazheng 40:be98219930e4 21 uint8_t font_offset = 0;
hazheng 40:be98219930e4 22 uint8_t font_numchars = 0;
hazheng 40:be98219930e4 23
hazheng 40:be98219930e4 24 uint8_t front_color_high = 0;
hazheng 40:be98219930e4 25 uint8_t front_color_low = 0;
hazheng 40:be98219930e4 26
hazheng 40:be98219930e4 27 DigitalOut utft_cs(PIN_AUC_CS);
hazheng 40:be98219930e4 28 }
hazheng 40:be98219930e4 29
hazheng 40:be98219930e4 30 inline void ardu_cam_spi_write_8(int address, int value)
hazheng 40:be98219930e4 31 {
hazheng 40:be98219930e4 32 utft_cs = 0;
hazheng 40:be98219930e4 33 g_spi_port.write(address | 0x80);
hazheng 40:be98219930e4 34 g_spi_port.write(value);
hazheng 40:be98219930e4 35 utft_cs = 1;
hazheng 40:be98219930e4 36 }
hazheng 40:be98219930e4 37
hazheng 40:be98219930e4 38 inline uint8_t ardu_cam_spi_read_8(int address)
hazheng 40:be98219930e4 39 {
hazheng 40:be98219930e4 40 utft_cs = 0;
hazheng 40:be98219930e4 41 g_spi_port.write(address & 0x7F);
hazheng 40:be98219930e4 42 uint8_t value = static_cast<uint8_t>(g_spi_port.write(0x00));
hazheng 40:be98219930e4 43 utft_cs = 1;
hazheng 40:be98219930e4 44 return value;
hazheng 40:be98219930e4 45 }
hazheng 40:be98219930e4 46
hazheng 40:be98219930e4 47 inline void ardu_utft_write_COM(uint8_t VL)
hazheng 40:be98219930e4 48 {
hazheng 40:be98219930e4 49 utft_cs = 0;
hazheng 40:be98219930e4 50 g_spi_port.write(0xBE);
hazheng 40:be98219930e4 51 g_spi_port.write(VL);
hazheng 40:be98219930e4 52 utft_cs = 1;
hazheng 40:be98219930e4 53 }
hazheng 40:be98219930e4 54
hazheng 40:be98219930e4 55 inline void ardu_utft_write_DATA(uint8_t VH, uint8_t VL)
hazheng 40:be98219930e4 56 {
hazheng 40:be98219930e4 57 utft_cs = 0;
hazheng 40:be98219930e4 58 g_spi_port.write(0xBF);
hazheng 40:be98219930e4 59 g_spi_port.write(VH);
hazheng 40:be98219930e4 60 g_spi_port.write(0xBF);
hazheng 40:be98219930e4 61 g_spi_port.write(VL);
hazheng 40:be98219930e4 62 utft_cs = 1;
hazheng 40:be98219930e4 63 }
hazheng 40:be98219930e4 64
hazheng 40:be98219930e4 65 inline void ardu_utft_write_COM_DATA(uint8_t com1, uint16_t dat1)
hazheng 40:be98219930e4 66 {
hazheng 40:be98219930e4 67 ardu_utft_write_COM(com1);
hazheng 40:be98219930e4 68 ardu_utft_write_DATA(dat1 >> 8, dat1);
hazheng 40:be98219930e4 69 }
hazheng 40:be98219930e4 70
hazheng 40:be98219930e4 71 void ardu_utft_init()
hazheng 40:be98219930e4 72 {
hazheng 40:be98219930e4 73 char buf[20];
hazheng 40:be98219930e4 74 uint8_t VerNum = ardu_cam_spi_read_8(0x40);
hazheng 40:be98219930e4 75 VerNum = ardu_cam_spi_read_8(0x40);
hazheng 40:be98219930e4 76
hazheng 40:be98219930e4 77
hazheng 40:be98219930e4 78 sprintf(buf, "UTFT Ver %#x", VerNum);
hazheng 40:be98219930e4 79 g_core.GetUSBServer().PushReliableMsg('D', buf);
hazheng 40:be98219930e4 80
hazheng 40:be98219930e4 81 ardu_cam_spi_write_8(ARDUCHIP_TEST1_UTFT, ARDUCHIP_TEST_MSG_UTFT);
hazheng 40:be98219930e4 82 uint8_t testV = ardu_cam_spi_read_8(ARDUCHIP_TEST1_UTFT);
hazheng 40:be98219930e4 83 if(VerNum != ARDUCHIP_VER_NUM_UTFT || testV != ARDUCHIP_TEST_MSG_UTFT)
hazheng 40:be98219930e4 84 {
hazheng 40:be98219930e4 85 g_core.GetUSBServer().PushReliableMsg('D', "UTFTInit Fai");
hazheng 40:be98219930e4 86 }
hazheng 40:be98219930e4 87 else
hazheng 40:be98219930e4 88 {
hazheng 40:be98219930e4 89 g_core.GetUSBServer().PushReliableMsg('D', "UTFTInit Suc");
hazheng 40:be98219930e4 90 }
hazheng 40:be98219930e4 91
hazheng 40:be98219930e4 92 ardu_cam_set_mode(MCU2LCD_MODE);
hazheng 40:be98219930e4 93 utft_cs = 1;
hazheng 40:be98219930e4 94 ardu_utft_write_COM_DATA(0x00,0x0001);
hazheng 40:be98219930e4 95 ardu_utft_write_COM_DATA(0x03,0xA8A4);
hazheng 40:be98219930e4 96 ardu_utft_write_COM_DATA(0x0C,0x0000);
hazheng 40:be98219930e4 97 ardu_utft_write_COM_DATA(0x0D,0x080C);
hazheng 40:be98219930e4 98 ardu_utft_write_COM_DATA(0x0E,0x2B00);
hazheng 40:be98219930e4 99 ardu_utft_write_COM_DATA(0x1E,0x00B7);
hazheng 40:be98219930e4 100 ardu_utft_write_COM_DATA(0x01,0x693F);
hazheng 40:be98219930e4 101 ardu_utft_write_COM_DATA(0x02,0x0600);
hazheng 40:be98219930e4 102 ardu_utft_write_COM_DATA(0x10,0x0000);
hazheng 40:be98219930e4 103 ardu_utft_write_COM_DATA(0x11,0x6078);
hazheng 40:be98219930e4 104 ardu_utft_write_COM_DATA(0x05,0x0000);
hazheng 40:be98219930e4 105 ardu_utft_write_COM_DATA(0x06,0x0000);
hazheng 40:be98219930e4 106 ardu_utft_write_COM_DATA(0x16,0xEF1C);
hazheng 40:be98219930e4 107 ardu_utft_write_COM_DATA(0x17,0x0003);
hazheng 40:be98219930e4 108 ardu_utft_write_COM_DATA(0x07,0x0233);
hazheng 40:be98219930e4 109 ardu_utft_write_COM_DATA(0x0B,0x0000);
hazheng 40:be98219930e4 110 ardu_utft_write_COM_DATA(0x0F,0x0000);
hazheng 40:be98219930e4 111 ardu_utft_write_COM_DATA(0x41,0x0000);
hazheng 40:be98219930e4 112 ardu_utft_write_COM_DATA(0x42,0x0000);
hazheng 40:be98219930e4 113 ardu_utft_write_COM_DATA(0x48,0x0000);
hazheng 40:be98219930e4 114 ardu_utft_write_COM_DATA(0x49,0x013F);
hazheng 40:be98219930e4 115 ardu_utft_write_COM_DATA(0x4A,0x0000);
hazheng 40:be98219930e4 116 ardu_utft_write_COM_DATA(0x4B,0x0000);
hazheng 40:be98219930e4 117 ardu_utft_write_COM_DATA(0x44,0xEF00);
hazheng 40:be98219930e4 118 ardu_utft_write_COM_DATA(0x45,0x0000);
hazheng 40:be98219930e4 119 ardu_utft_write_COM_DATA(0x46,0x013F);
hazheng 40:be98219930e4 120 ardu_utft_write_COM_DATA(0x30,0x0707);
hazheng 40:be98219930e4 121 ardu_utft_write_COM_DATA(0x31,0x0204);
hazheng 40:be98219930e4 122 ardu_utft_write_COM_DATA(0x32,0x0204);
hazheng 40:be98219930e4 123 ardu_utft_write_COM_DATA(0x33,0x0502);
hazheng 40:be98219930e4 124 ardu_utft_write_COM_DATA(0x34,0x0507);
hazheng 40:be98219930e4 125 ardu_utft_write_COM_DATA(0x35,0x0204);
hazheng 40:be98219930e4 126 ardu_utft_write_COM_DATA(0x36,0x0204);
hazheng 40:be98219930e4 127 ardu_utft_write_COM_DATA(0x37,0x0502);
hazheng 40:be98219930e4 128 ardu_utft_write_COM_DATA(0x3A,0x0302);
hazheng 40:be98219930e4 129 ardu_utft_write_COM_DATA(0x3B,0x0302);
hazheng 40:be98219930e4 130 ardu_utft_write_COM_DATA(0x23,0x0000);
hazheng 40:be98219930e4 131 ardu_utft_write_COM_DATA(0x24,0x0000);
hazheng 40:be98219930e4 132 ardu_utft_write_COM_DATA(0x25,0x8000);
hazheng 40:be98219930e4 133 ardu_utft_write_COM_DATA(0x4f,0x0000);
hazheng 40:be98219930e4 134 ardu_utft_write_COM_DATA(0x4e,0x0000);
hazheng 40:be98219930e4 135 ardu_utft_write_COM(0x22);
hazheng 40:be98219930e4 136
hazheng 40:be98219930e4 137 //setColor(255, 255, 255);
hazheng 40:be98219930e4 138 //setBackColor(0, 0, 0);
hazheng 40:be98219930e4 139 current_font = NULL;
hazheng 40:be98219930e4 140 ardu_utft_clr_scr();
hazheng 40:be98219930e4 141
hazheng 40:be98219930e4 142 ardu_utft_set_color(20, 0, 20);
hazheng 40:be98219930e4 143 ardu_utft_draw_rect(150, 150, 20, 20);
hazheng 40:be98219930e4 144
hazheng 40:be98219930e4 145 }
hazheng 40:be98219930e4 146
hazheng 40:be98219930e4 147 void ardu_cam_set_mode(uint8_t mode)
hazheng 40:be98219930e4 148 {
hazheng 40:be98219930e4 149 /////////////////////////////////
hazheng 40:be98219930e4 150 //Careful here!!
hazheng 40:be98219930e4 151 ardu_cam_spi_write_8(ARDUCHIP_MODE, 0x04);
hazheng 40:be98219930e4 152 }
hazheng 40:be98219930e4 153
hazheng 40:be98219930e4 154 void ardu_utft_clr_scr()
hazheng 40:be98219930e4 155 {
hazheng 40:be98219930e4 156 ardu_utft_reset_xy();
hazheng 40:be98219930e4 157
hazheng 40:be98219930e4 158 long i;
hazheng 40:be98219930e4 159 for (i = 0; i < ((UTFT_DISP_X_SIZE + 1) * (UTFT_DISP_Y_SIZE + 1)); ++i)
hazheng 40:be98219930e4 160 {
hazheng 40:be98219930e4 161 //////////////////////////
hazheng 40:be98219930e4 162 //Can be simplified later!!
hazheng 40:be98219930e4 163 if (UTFT_DISP_TRANS_MODE != 1)
hazheng 40:be98219930e4 164 {
hazheng 40:be98219930e4 165 ardu_utft_write_DATA(0x00,0x00);
hazheng 40:be98219930e4 166 }
hazheng 40:be98219930e4 167 else
hazheng 40:be98219930e4 168 {
hazheng 40:be98219930e4 169 ardu_utft_write_DATA(1,0);
hazheng 40:be98219930e4 170 ardu_utft_write_DATA(1,0);
hazheng 40:be98219930e4 171 }
hazheng 40:be98219930e4 172 }
hazheng 40:be98219930e4 173 }
hazheng 40:be98219930e4 174
hazheng 40:be98219930e4 175 void ardu_utft_reset_xy()
hazheng 40:be98219930e4 176 {
hazheng 40:be98219930e4 177 ardu_utft_set_xy(0, 0, UTFT_DISP_Y_SIZE, UTFT_DISP_X_SIZE);
hazheng 40:be98219930e4 178 }
hazheng 40:be98219930e4 179
hazheng 40:be98219930e4 180 void ardu_utft_set_xy(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
hazheng 40:be98219930e4 181 {
hazheng 40:be98219930e4 182 /////////////////////////////
hazheng 40:be98219930e4 183 //Possible to be simplified
hazheng 40:be98219930e4 184 swap(uint16_t, x1, y1);
hazheng 40:be98219930e4 185 swap(uint16_t, x2, y2);
hazheng 40:be98219930e4 186 y1 = UTFT_DISP_Y_SIZE - y1;
hazheng 40:be98219930e4 187 y2 = UTFT_DISP_Y_SIZE - y2;
hazheng 40:be98219930e4 188 swap(uint16_t, y1, y2);
hazheng 40:be98219930e4 189 /////////////////////////////
hazheng 40:be98219930e4 190
hazheng 40:be98219930e4 191 ardu_utft_write_COM_DATA(0x44, (x2 << 8) + x1);
hazheng 40:be98219930e4 192 ardu_utft_write_COM_DATA(0x45, y1);
hazheng 40:be98219930e4 193 ardu_utft_write_COM_DATA(0x46, y2);
hazheng 40:be98219930e4 194 ardu_utft_write_COM_DATA(0x4e, x1);
hazheng 40:be98219930e4 195 ardu_utft_write_COM_DATA(0x4f, y1);
hazheng 40:be98219930e4 196 ardu_utft_write_COM(0x22);
hazheng 40:be98219930e4 197 }
hazheng 40:be98219930e4 198
hazheng 40:be98219930e4 199 void ardu_utft_set_color(uint8_t r, uint8_t g, uint8_t b)
hazheng 40:be98219930e4 200 {
hazheng 40:be98219930e4 201 front_color_high = ((r & 248) | g >> 5);
hazheng 40:be98219930e4 202 front_color_low = ((g & 28) << 3 | b >> 3);
hazheng 40:be98219930e4 203 }
hazheng 40:be98219930e4 204
hazheng 40:be98219930e4 205 void ardu_utft_draw_rect(int x1, int y1, int x2, int y2)
hazheng 40:be98219930e4 206 {
hazheng 40:be98219930e4 207 if (x1>x2)
hazheng 40:be98219930e4 208 {
hazheng 40:be98219930e4 209 swap(int, x1, x2);
hazheng 40:be98219930e4 210 }
hazheng 40:be98219930e4 211 if (y1>y2)
hazheng 40:be98219930e4 212 {
hazheng 40:be98219930e4 213 swap(int, y1, y2);
hazheng 40:be98219930e4 214 }
hazheng 40:be98219930e4 215
hazheng 40:be98219930e4 216 ardu_utft_draw_hline(x1, y1, x2 - x1);
hazheng 40:be98219930e4 217 ardu_utft_draw_hline(x1, y2, x2 - x1);
hazheng 40:be98219930e4 218 ardu_utft_draw_vline(x1, y1, y2 - y1);
hazheng 40:be98219930e4 219 ardu_utft_draw_vline(x2, y1, y2 - y1);
hazheng 40:be98219930e4 220 }
hazheng 40:be98219930e4 221
hazheng 40:be98219930e4 222 void ardu_utft_draw_hline(int x, int y, int l)
hazheng 40:be98219930e4 223 {
hazheng 40:be98219930e4 224 if (l<0)
hazheng 40:be98219930e4 225 {
hazheng 40:be98219930e4 226 l = -l;
hazheng 40:be98219930e4 227 x -= l;
hazheng 40:be98219930e4 228 }
hazheng 40:be98219930e4 229
hazheng 40:be98219930e4 230 ardu_utft_set_xy(x, y, x+l, y);
hazheng 40:be98219930e4 231
hazheng 40:be98219930e4 232 for (int i = 0; i < l + 1; ++i)
hazheng 40:be98219930e4 233 {
hazheng 40:be98219930e4 234 ardu_utft_write_DATA(front_color_high, front_color_low);
hazheng 40:be98219930e4 235 }
hazheng 40:be98219930e4 236
hazheng 40:be98219930e4 237 ardu_utft_reset_xy();
hazheng 40:be98219930e4 238 }
hazheng 40:be98219930e4 239
hazheng 40:be98219930e4 240 void ardu_utft_draw_vline(int x, int y, int l)
hazheng 40:be98219930e4 241 {
hazheng 40:be98219930e4 242 if (l<0)
hazheng 40:be98219930e4 243 {
hazheng 40:be98219930e4 244 l = -l;
hazheng 40:be98219930e4 245 y -= l;
hazheng 40:be98219930e4 246 }
hazheng 40:be98219930e4 247
hazheng 40:be98219930e4 248 ardu_utft_set_xy(x, y, x, y+l);
hazheng 40:be98219930e4 249
hazheng 40:be98219930e4 250 for (int i = 0; i < l + 1; ++i)
hazheng 40:be98219930e4 251 {
hazheng 40:be98219930e4 252 ardu_utft_write_DATA(front_color_high, front_color_low);
hazheng 40:be98219930e4 253 }
hazheng 40:be98219930e4 254
hazheng 40:be98219930e4 255 ardu_utft_reset_xy();
hazheng 40:be98219930e4 256 }