├── Comms.h ├── README.md ├── Comms.ino ├── reset.h ├── settings.h ├── Speeduino-Serial-ESP32-TFT.ino └── back.h /Comms.h: -------------------------------------------------------------------------------- 1 | #ifndef COMMS_H 2 | #define COMMS_H 3 | 4 | #define DATA_LEN 123 5 | 6 | static uint8_t buffer[DATA_LEN]; 7 | void requestData(uint16_t timeout = 20); 8 | 9 | bool getBit(uint16_t address, uint8_t bit); 10 | uint8_t getByte(uint16_t address); 11 | uint16_t getWord(uint16_t address); 12 | 13 | #endif //COMMS_H -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Speeduino-Serial-ESP32-TFT 2 | 3 | Comms code is from https://github.com/MielArrojado/speeduino-ardugauge 4 | 5 | ![screen](https://user-images.githubusercontent.com/46295168/162586650-f39137a9-696a-4391-805e-a7798a732ed7.jpg) 6 | 7 | Sync loss counter is not exposed on secondary serial by default. I added it to cancomms.ino manually: ```fullStatus[122] = currentStatus.syncLossCounter;``` also increased ```NEW_CAN_PACKET_SIZE``` in cancomms.h from 122 to 123. If you don't need that, you might want to change ```DATA_LEN``` in Comms.h of this project back to 122 and remove fetching this value from main ino file. 8 | -------------------------------------------------------------------------------- /Comms.ino: -------------------------------------------------------------------------------- 1 | #include "Comms.h" 2 | 3 | void requestData(uint16_t timeout) 4 | { 5 | SerialBT.setTimeout(timeout); 6 | 7 | // flush input buffer 8 | 9 | SerialBT.write('n'); 10 | 11 | // wait for data or timeout 12 | uint32_t start = millis(); 13 | uint32_t end = start; 14 | while (SerialBT.available() < 3 && (end - start) < timeout) 15 | { 16 | end = millis(); 17 | } 18 | 19 | // if within timeout, read data 20 | if (end - start < timeout) 21 | { 22 | // skip first two bytes 23 | SerialBT.read(); // 'n' 24 | SerialBT.read(); // 0x32 25 | uint8_t dataLen = SerialBT.read(); 26 | SerialBT.readBytes(buffer, dataLen); 27 | } 28 | } 29 | 30 | bool getBit(uint16_t address, uint8_t bit) 31 | { 32 | return bitRead(buffer[address], bit); 33 | } 34 | 35 | uint8_t getByte(uint16_t address) 36 | { 37 | return buffer[address]; 38 | } 39 | 40 | uint16_t getWord(uint16_t address) 41 | { 42 | return makeWord(buffer[address + 1], buffer[address]); 43 | } -------------------------------------------------------------------------------- /reset.h: -------------------------------------------------------------------------------- 1 | const unsigned short reset[0x400] PROGMEM ={ 2 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0x5AEB, 0x8430, // 0x0010 (16) 3 | 0x8C71, 0x8410, 0x5AEB, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) 4 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2965, 0x8430, 0xCE59, 0xF79E, 0xFFFF, 0xFFFF, // 0x0030 (48) 5 | 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0xCE59, 0x8430, 0x3186, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xA534, // 0x0040 (64) 6 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39C7, 0xB596, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0050 (80) 7 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B6, 0x39C7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD75, 0xFFFF, // 0x0060 (96) 8 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x8C51, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0070 (112) 9 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8C71, 0x0020, 0x0000, 0x0841, 0xB5B6, 0xFFFF, 0xFFFF, // 0x0080 (128) 10 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10A2, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0090 (144) 11 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDF7, 0x2965, 0xBDD7, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00A0 (160) 12 | 0x0000, 0x0000, 0x0000, 0x0000, 0x10A2, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD69A, 0x9CF3, 0x7BCF, // 0x00B0 (176) 13 | 0x6B4D, 0x73AE, 0x9CD3, 0xD69A, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00C0 (192) 14 | 0x0000, 0x0000, 0x0000, 0x0020, 0xC638, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B6, 0x4208, 0x0000, 0x0000, 0x0000, // 0x00D0 (208) 15 | 0x0000, 0x0000, 0x0000, 0x0000, 0x39C7, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x00E0 (224) 16 | 0x0000, 0x0000, 0x0000, 0x8C71, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0x630C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00F0 (240) 17 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A69, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0100 (256) 18 | 0x0000, 0x0000, 0x31A6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x39E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0110 (272) 19 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2965, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0120 (288) 20 | 0x0000, 0x0000, 0xBDD7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x4228, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0130 (304) 21 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0140 (320) 22 | 0x0000, 0x3186, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8430, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0150 (336) 23 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0160 (352) 24 | 0x0000, 0x8C71, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE71C, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0170 (368) 25 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xAD75, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0180 (384) 26 | 0x0020, 0xE71C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x73AE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0190 (400) 27 | 0x0000, 0x0000, 0x0000, 0x0861, 0xB596, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01A0 (416) 28 | 0x0841, 0x4A49, 0x4A69, 0x4A49, 0x4A69, 0x4A69, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01B0 (432) 29 | 0x0000, 0x0000, 0x0000, 0x10A2, 0x5ACB, 0x4A49, 0x4A69, 0x4A69, 0x4A49, 0x4A49, 0x4A69, 0x4A49, 0x4A49, 0x4A69, 0x4A49, 0x4A49, // 0x01C0 (448) 30 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01D0 (464) 31 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01E0 (480) 32 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01F0 (496) 33 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0200 (512) 34 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) 35 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0220 (544) 36 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0230 (560) 37 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0240 (576) 38 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0250 (592) 39 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0260 (608) 40 | 0x39E7, 0x6B4D, 0x6B4D, 0x6B4D, 0x6B4D, 0x6B4D, 0x6B4D, 0x6B4D, 0x6B4D, 0x6B4D, 0x6B4D, 0x6B6D, 0x6B6D, 0x0841, 0x0000, 0x0000, // 0x0270 (624) 41 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0x6B6D, 0x6B4D, 0x6B4D, 0x6B6D, 0x5ACB, // 0x0280 (640) 42 | 0xA514, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x738E, 0x0000, 0x0000, 0x0000, // 0x0290 (656) 43 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB596, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xB5B6, // 0x02A0 (672) 44 | 0x94B2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x5ACB, 0x0000, 0x0000, 0x0000, 0x0000, // 0x02B0 (688) 45 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2965, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x528A, // 0x02C0 (704) 46 | 0x94B2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x52AA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x02D0 (720) 47 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xE73C, 0x0841, // 0x02E0 (736) 48 | 0x94B2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x4228, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x02F0 (752) 49 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C71, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x73AE, 0x0000, // 0x0300 (768) 50 | 0x94B2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x4A69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0310 (784) 51 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8C71, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0x0841, 0x0000, // 0x0320 (800) 52 | 0x94B2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x94B2, 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0330 (816) 53 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xBDD7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x39E7, 0x0000, 0x0000, // 0x0340 (832) 54 | 0x94B2, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x9492, 0x4208, 0x10A2, 0x0000, // 0x0350 (848) 55 | 0x0000, 0x0020, 0x18C3, 0x528A, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x738E, 0x0000, 0x0000, 0x0000, // 0x0360 (864) 56 | 0x94B2, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xBDD7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0xD6BA, // 0x0370 (880) 57 | 0xCE79, 0xDEFB, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x8430, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0380 (896) 58 | 0x94B2, 0xFFFF, 0xFFFF, 0xFFFF, 0x4A69, 0x0000, 0x8430, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0390 (912) 59 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x738E, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03A0 (928) 60 | 0x9492, 0xFFFF, 0xFFFF, 0x52AA, 0x0000, 0x0000, 0x0000, 0x4A69, 0xDEFB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03B0 (944) 61 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD69A, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03C0 (960) 62 | 0xA514, 0xFFFF, 0x5ACB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, 0x7BEF, 0xE73C, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03D0 (976) 63 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0x738E, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03E0 (992) 64 | 0x9492, 0x738D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0x5ACB, 0xA534, 0xDEDB, 0xF7BE, 0xFFFF, // 0x03F0 (1008) 65 | 0xFFFF, 0xFFFF, 0xF79E, 0xD6BA, 0x9CF3, 0x4A69, 0x0841, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0400 (1024) 66 | }; 67 | -------------------------------------------------------------------------------- /settings.h: -------------------------------------------------------------------------------- 1 | const unsigned short settings[0x400] PROGMEM ={ 2 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39C7, 0x94B2, 0x94B2, 0x94B2, // 0x0010 (16) 3 | 0x94B2, 0x94B2, 0x94B2, 0x9492, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) 4 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0xD6BA, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0030 (48) 5 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBDF7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0040 (64) 6 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0xEF7D, 0xEF5D, 0x6B6D, 0x6B6D, // 0x0050 (80) 7 | 0x6B6D, 0x6B6D, 0x738E, 0xFFDF, 0xD6BA, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0060 (96) 8 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF7D, 0xD69A, 0x0000, 0x0000, // 0x0070 (112) 9 | 0x0000, 0x0000, 0x0000, 0xF79E, 0xD69A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0080 (128) 10 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x9CF3, 0xB596, 0x39C7, 0x0000, 0x0000, 0x2945, 0x8C71, 0xFFFF, 0xDEFB, 0x0000, 0x0000, // 0x0090 (144) 11 | 0x0000, 0x0000, 0x0841, 0xF7BE, 0xFFDF, 0x8410, 0x2124, 0x0000, 0x0000, 0x4208, 0xB5B6, 0x9CD3, 0x0020, 0x0000, 0x0000, 0x0000, // 0x00A0 (160) 12 | 0x0000, 0x0000, 0x0000, 0x0000, 0xAD55, 0xFFFF, 0xFFFF, 0xFFFF, 0x8430, 0x8C71, 0xFFFF, 0xFFFF, 0xE73C, 0x9492, 0x0000, 0x0000, // 0x00B0 (176) 13 | 0x0000, 0x0000, 0x0020, 0xA534, 0xEF7D, 0xFFFF, 0xFFFF, 0x8430, 0x9492, 0xFFFF, 0xFFFF, 0xFFFF, 0x9CF3, 0x0000, 0x0000, 0x0000, // 0x00C0 (192) 14 | 0x0000, 0x0000, 0x0000, 0x6B4D, 0xFFFF, 0xBDD7, 0x4A49, 0xDEDB, 0xFFFF, 0xFFFF, 0xD69A, 0x52AA, 0x0861, 0x0000, 0x0000, 0x0000, // 0x00D0 (208) 15 | 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0x5AEB, 0xDEDB, 0xFFFF, 0xFFFF, 0xCE79, 0x4A49, 0xC638, 0xFFFF, 0x5ACB, 0x0000, 0x0000, // 0x00E0 (224) 16 | 0x0000, 0x0000, 0x3186, 0xFFFF, 0xEF7D, 0x18C3, 0x0000, 0x0841, 0x8C71, 0x8C51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00F0 (240) 17 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x8C71, 0x8410, 0x0000, 0x0000, 0x2124, 0xF7BE, 0xF7BE, 0x2124, 0x0000, // 0x0100 (256) 18 | 0x0000, 0x0841, 0xDEDB, 0xFFFF, 0x4A49, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0110 (272) 19 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x5ACB, 0xFFFF, 0xCE79, 0x0020, // 0x0120 (288) 20 | 0x0000, 0xA514, 0xFFFF, 0x8C51, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0130 (304) 21 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9CD3, 0xFFFF, 0x9492, // 0x0140 (320) 22 | 0x632C, 0xFFFF, 0xDEDB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0x8430, 0xCE59, // 0x0150 (336) 23 | 0xDEFB, 0xC638, 0x7BCF, 0x10A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0xEF5D, 0xFFFF, // 0x0160 (352) 24 | 0x39E7, 0xEF7D, 0xFFFF, 0xA534, 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630C, 0xFFFF, 0xFFFF, 0xFFDF, // 0x0170 (368) 25 | 0xE73C, 0xFFFF, 0xFFFF, 0xF79E, 0x4A69, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xBDD7, 0xFFFF, 0xDEFB, // 0x0180 (384) 26 | 0x0000, 0x2124, 0xBDD7, 0xFFFF, 0xEF5D, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x630C, 0xFFFF, 0xDEDB, 0x4A69, 0x1082, // 0x0190 (400) 27 | 0x0000, 0x10A2, 0x5AEB, 0xEF5D, 0xFFFF, 0x4228, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39E7, 0xF7BE, 0xFFFF, 0xA534, 0x18C3, // 0x01A0 (416) 28 | 0x0000, 0x0000, 0x0000, 0xDEFB, 0xFFFF, 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x18E3, 0xFFDF, 0xDEFB, 0x1082, 0x0000, 0x0000, // 0x01B0 (432) 29 | 0x0000, 0x0000, 0x0000, 0x2104, 0xEF7D, 0xEF5D, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x2965, 0xFFFF, 0xC618, 0x0000, 0x0000, // 0x01C0 (448) 30 | 0x0000, 0x0000, 0x0861, 0xFFDF, 0xC638, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8410, 0xFFFF, 0x4A69, 0x0000, 0x0000, 0x0000, // 0x01D0 (464) 31 | 0x0000, 0x0000, 0x0000, 0x0000, 0x6B6D, 0xFFFF, 0x632C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xE71C, 0xE73C, 0x0000, 0x0000, // 0x01E0 (480) 32 | 0x0000, 0x0000, 0x2945, 0xFFFF, 0x9CF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xCE59, 0xFFDF, 0x0861, 0x0000, 0x0000, 0x0000, // 0x01F0 (496) 33 | 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0xFFFF, 0xAD55, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xBDF7, 0xFFFF, 0x10A2, 0x0000, // 0x0200 (512) 34 | 0x0000, 0x0000, 0x3186, 0xFFFF, 0x9492, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xDEDB, 0xEF7D, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0210 (528) 35 | 0x0000, 0x0000, 0x0000, 0x0000, 0x10A2, 0xFFFF, 0xBDF7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5B6, 0xFFFF, 0x18C3, 0x0000, // 0x0220 (544) 36 | 0x0000, 0x0000, 0x2124, 0xFFFF, 0xA514, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC618, 0xFFFF, 0x1082, 0x0000, 0x0000, 0x0000, // 0x0230 (560) 37 | 0x0000, 0x0000, 0x0000, 0x0000, 0x2945, 0xFFFF, 0xA514, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC618, 0xFFFF, 0x1082, 0x0000, // 0x0240 (576) 38 | 0x0000, 0x0000, 0x0841, 0xF7BE, 0xCE79, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x738E, 0xFFFF, 0x630C, 0x0000, 0x0000, 0x0000, // 0x0250 (592) 39 | 0x0000, 0x0000, 0x0000, 0x0000, 0x8410, 0xFFFF, 0x528A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF5D, 0xDEDB, 0x0000, 0x0000, // 0x0260 (608) 40 | 0x0000, 0x0000, 0x0841, 0xE71C, 0xFFFF, 0x18E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0xEF5D, 0xF79E, 0x2945, 0x0000, 0x0000, // 0x0270 (624) 41 | 0x0000, 0x0000, 0x0000, 0x39E7, 0xFFFF, 0xD6BA, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x39C7, 0xFFFF, 0xCE59, 0x0020, 0x0000, // 0x0280 (640) 42 | 0x0000, 0x4228, 0xDEDB, 0xFFFF, 0xD69A, 0x2104, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0xFFFF, 0xFFDF, 0x7BCF, 0x2965, // 0x0290 (656) 43 | 0x18E3, 0x3186, 0x8430, 0xFFFF, 0xF79E, 0x2965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xDEDB, 0xFFFF, 0xCE79, 0x31A6, // 0x02A0 (672) 44 | 0x52AA, 0xFFFF, 0xFFDF, 0x8410, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4208, 0xDEFB, 0xFFFF, 0xFFFF, // 0x02B0 (688) 45 | 0xFFFF, 0xFFFF, 0xFFFF, 0xCE79, 0x2965, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, 0x8C71, 0xFFFF, 0xF7BE, // 0x02C0 (704) 46 | 0x5AEB, 0xFFFF, 0xDEDB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0x5ACB, 0x9CF3, // 0x02D0 (720) 47 | 0xB596, 0x94B2, 0x528A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, 0xEF7D, 0xFFFF, // 0x02E0 (736) 48 | 0x0000, 0x8C71, 0xFFFF, 0x9CF3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x02F0 (752) 49 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC618, 0xFFFF, 0x632C, // 0x0300 (768) 50 | 0x0000, 0x0000, 0xCE59, 0xFFFF, 0x5AEB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0310 (784) 51 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8430, 0xFFFF, 0xA534, 0x0000, // 0x0320 (800) 52 | 0x0000, 0x0000, 0x2104, 0xF7BE, 0xF7BE, 0x2124, 0x0000, 0x2124, 0xBDD7, 0xAD55, 0x10A2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0330 (816) 53 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2124, 0xBDF7, 0xA534, 0x10A2, 0x0000, 0x4228, 0xFFFF, 0xDEFB, 0x0861, 0x0000, // 0x0340 (832) 54 | 0x0000, 0x0000, 0x0000, 0x52AA, 0xFFFF, 0xC638, 0x7BCF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x7BEF, 0x2945, 0x0000, 0x0000, 0x0000, // 0x0350 (848) 55 | 0x0000, 0x0000, 0x0000, 0x0020, 0x3186, 0x8C71, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF5D, 0x6B6D, 0xE73C, 0xFFFF, 0x3186, 0x0000, 0x0000, // 0x0360 (864) 56 | 0x0000, 0x0000, 0x0000, 0x0000, 0x94B2, 0xFFFF, 0xFFFF, 0xEF5D, 0x5ACB, 0x6B4D, 0xEF7D, 0xFFFF, 0xFFFF, 0xAD75, 0x0000, 0x0000, // 0x0370 (880) 57 | 0x0000, 0x0000, 0x0020, 0xC638, 0xFFFF, 0xFFFF, 0xDEFB, 0x5ACB, 0x6B6D, 0xFFDF, 0xFFFF, 0xFFFF, 0x6B6D, 0x0000, 0x0000, 0x0000, // 0x0380 (896) 58 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x7BEF, 0x8410, 0x1082, 0x0000, 0x0000, 0x1082, 0x632C, 0xFFFF, 0xDEDB, 0x0000, 0x0000, // 0x0390 (912) 59 | 0x0000, 0x0000, 0x0841, 0xF79E, 0xEF7D, 0x52AA, 0x0020, 0x0000, 0x0000, 0x2124, 0x8C71, 0x632C, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03A0 (928) 60 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xEF7D, 0xD6BA, 0x0000, 0x0000, // 0x03B0 (944) 61 | 0x0000, 0x0000, 0x0000, 0xF79E, 0xD69A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03C0 (960) 62 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0841, 0xF79E, 0xF79E, 0x9CD3, 0x9CD3, // 0x03D0 (976) 63 | 0x9CD3, 0x9CD3, 0x9CF3, 0xFFFF, 0xDEDB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03E0 (992) 64 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03F0 (1008) 65 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xA534, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0400 (1024) 66 | }; 67 | -------------------------------------------------------------------------------- /Speeduino-Serial-ESP32-TFT.ino: -------------------------------------------------------------------------------- 1 | #include "FS.h" 2 | #include "BluetoothSerial.h" 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "Comms.h" 8 | #include "settings.h" 9 | #include "reset.h" 10 | #include "back.h" 11 | 12 | #define CALIBRATION_FILE "/TouchCalData3" 13 | #define REPEAT_CAL false 14 | #define TFT_GREY 0x5AEB 15 | 16 | /* 17 | This goes to User_Setup.h of TFT_eSPI library 18 | Some pins can be shared between screen and touch panel 19 | #define TFT_DC 2 20 | #define TFT_RST 4 21 | #define TFT_CS 15 22 | #define TFT_SCLK 18 23 | #define TFT_MOSI 23 24 | #define TOUCH_CS 5 25 | #define TOUCH_DO 19 26 | */ 27 | 28 | Preferences Preferences; 29 | TFT_eSPI tft = TFT_eSPI(); 30 | BluetoothSerial SerialBT; 31 | 32 | // Speeduino bluetooth device address 33 | uint8_t address[6] = {0x00, 0x11, 0x35, 0x21, 0x86, 0x02}; 34 | //uint8_t address[6] = {0x00, 0x11, 0x35, 0x82, 0x44, 0x36}; 35 | //uint8_t address[6] = {0x00, 0x11, 0x35, 0x82, 0x44, 0x14}; 36 | // Speeduino bluetooth device pin 37 | char pin[] = "1337"; 38 | 39 | bool connected = 0, mainFilled = 0, settingsFilled = 0; 40 | uint16_t x, y; 41 | int screen, refreshRate, clt, iat, rpm, tps, lps, kpa, ge, ve, adv, iac, vss, sl; 42 | float afr, pw, bat; 43 | 44 | void setup() 45 | { 46 | tft.init(); 47 | tft.fillScreen(TFT_BLACK); 48 | tft.setRotation(1); 49 | tft.setSwapBytes(true); 50 | tft.drawString("Connecting...",20,20,4); 51 | 52 | SerialBT.begin("ESP32", true); 53 | SerialBT.setPin(pin); 54 | SerialBT.register_callback(callback); 55 | connected = SerialBT.connect(address); 56 | 57 | Preferences.begin("ESP32", false); 58 | refreshRate = Preferences.getInt("refreshRate", 30); 59 | Preferences.end(); 60 | 61 | touchCalibrate(); 62 | } 63 | 64 | void loop() 65 | { 66 | if (screen == 0) 67 | { 68 | if (connected) 69 | { 70 | mainScreen(); 71 | } 72 | else 73 | { 74 | tft.drawString("Connection failed",20,20,4); 75 | tft.drawString("Reconnecting...",20,60,4); 76 | delay(2000); 77 | ESP.restart(); 78 | } 79 | if (tft.getTouch(&x, &y)) 80 | { 81 | if ((x > 10) && (x < (10 + 32))) 82 | { 83 | if ((y > 198) && (y <= (198 + 32))) 84 | { 85 | ESP.restart(); 86 | } 87 | } 88 | else if ((x > 278) && (x < (278 + 32))) 89 | { 90 | if ((y > 198) && (y <= (198 + 32))) 91 | { 92 | mainFilled = false; 93 | screen = 1; 94 | return; 95 | } 96 | } 97 | } 98 | } 99 | else if (screen == 1) 100 | { 101 | settingsScreen(); 102 | } 103 | } 104 | 105 | void mainScreen() 106 | { 107 | if (!mainFilled) 108 | { 109 | fillMainScreen(); 110 | } 111 | 112 | static uint32_t lastUpdate = millis(); 113 | if (millis() - lastUpdate > 10) 114 | { 115 | requestData(50); 116 | lastUpdate = millis(); 117 | } 118 | 119 | rpm = getWord(14); 120 | kpa = getWord(4); 121 | tps = getByte(24)/2; 122 | afr = getByte(10)/10.0; 123 | clt = getByte(7) - 40; 124 | iat = getByte(6) - 40; 125 | ge = (int16_t)getByte(17); 126 | ve = getByte(18); 127 | adv = (int8_t)getByte(23); 128 | pw = getWord(20)/1000.0; 129 | bat = getByte(9)/10.0; 130 | iac = getByte(37); 131 | lps = getWord(25); 132 | vss = getWord(100); 133 | sl = getByte(122); 134 | 135 | if (rpm > 10000) ESP.restart(); 136 | 137 | tft.setTextPadding(tft.textWidth("8888", 4)); 138 | 139 | // FIRST LINE 140 | 141 | tft.drawNumber(rpm,110,18,4); 142 | tft.drawNumber(kpa,215,18,4); 143 | tft.drawNumber(tps,317,18,4); 144 | 145 | // SECOND LINE 146 | 147 | tft.drawFloat(afr,1,110,56,4); 148 | tft.drawNumber(clt,215,56,4); 149 | tft.drawNumber(iat,317,56,4); 150 | 151 | // THIRD LINE 152 | 153 | tft.drawNumber(ge,110,93,4); 154 | tft.drawNumber(ve,215,93,4); 155 | tft.drawNumber(adv,317,93,4); 156 | 157 | // FOURTH LINE 158 | 159 | tft.drawFloat(pw,1,110,130,4); 160 | tft.drawFloat(bat,1,215,130,4); 161 | tft.drawNumber(iac,317,130,4); 162 | 163 | // FIFTH LINE 164 | 165 | tft.drawNumber(vss,215,167,4); 166 | tft.drawNumber(sl,317,167,4); 167 | tft.setTextPadding(tft.textWidth("88888", 4)); 168 | tft.drawNumber(lps,110,167,4); 169 | 170 | if (refreshRate == 1) delay(1000); 171 | else if (refreshRate == 5) delay(200); 172 | else if (refreshRate == 10) delay(100); 173 | else if (refreshRate == 15) delay(66); 174 | else if (refreshRate == 30) delay(33); 175 | else if (refreshRate == 100) delay(10); 176 | } 177 | 178 | void settingsScreen() 179 | { 180 | if (!settingsFilled) 181 | { 182 | fillSettingsScreen(); 183 | } 184 | if (tft.getTouch(&x, &y)) 185 | { 186 | if ((x > 5) && (x < (5 + 38))) 187 | { 188 | if ((y > 5) && (y <= (5 + 32))) 189 | { 190 | settingsFilled = false; 191 | screen = 0; 192 | return; 193 | } 194 | } 195 | else if ((x > 170) && (x < (170 + 40))) 196 | { 197 | if ((y > 54) && (y <= (54 + 40))) 198 | { 199 | if (refreshRate == 100) refreshRate = 30; 200 | else if (refreshRate == 30) refreshRate = 15; 201 | else if (refreshRate == 15) refreshRate = 10; 202 | else if (refreshRate == 10) refreshRate = 5; 203 | else if (refreshRate == 5) refreshRate = 1; 204 | redrawRefreshRate(true); 205 | } 206 | } 207 | else if ((x > 270) && (x < (270 + 40))) 208 | { 209 | if ((y > 54) && (y <= (54 + 40))) 210 | { 211 | if (refreshRate == 1) refreshRate = 5; 212 | else if (refreshRate == 5) refreshRate = 10; 213 | else if (refreshRate == 10) refreshRate = 15; 214 | else if (refreshRate == 15) refreshRate = 30; 215 | else if (refreshRate == 30) refreshRate = 100; 216 | redrawRefreshRate(true); 217 | } 218 | } 219 | if ((x > 240) && (x < (240 + 70))) 220 | { 221 | if ((y > 4) && (y <= (4 + 35))) 222 | { 223 | tft.setTextColor(TFT_GREEN, TFT_BLACK); 224 | tft.drawString("SAVE",259,22,2); 225 | Preferences.begin("ESP32", false); 226 | Preferences.putInt("refreshRate", refreshRate); 227 | Preferences.end(); 228 | delay(500); 229 | tft.setTextColor(TFT_CYAN, TFT_BLACK); 230 | tft.drawString("SAVE",259,22,2); 231 | } 232 | } 233 | } 234 | } 235 | 236 | void fillMainScreen() 237 | { 238 | tft.fillScreen(TFT_BLACK); 239 | tft.setTextColor(TFT_CYAN, TFT_BLACK); 240 | tft.setTextDatum(MR_DATUM); 241 | tft.drawLine(115,0,115,182,TFT_GREY); 242 | tft.drawLine(220,0,220,182,TFT_GREY); 243 | tft.drawLine(0,34,320,34,TFT_GREY); 244 | tft.drawLine(0,71,320,71,TFT_GREY); 245 | tft.drawLine(0,108,320,108,TFT_GREY); 246 | tft.drawLine(0,145,320,145,TFT_GREY); 247 | tft.drawLine(0,182,320,182,TFT_GREY); 248 | tft.pushImage(10,198,32,32,reset); 249 | tft.pushImage(278,198,32,32,settings); 250 | 251 | tft.setTextPadding(0); 252 | tft.drawString("RPM",35,16,2); 253 | tft.drawString("MAP",155,16,2); 254 | tft.drawString("TPS",260,16,2); 255 | tft.drawString("AFR",33,54,2); 256 | tft.drawString("CLT",150,54,2); 257 | tft.drawString("IAT",255,54,2); 258 | tft.drawString("GE",25,91,2); 259 | tft.drawString("VE",142,91,2); 260 | tft.drawString("ADV",258,91,2); 261 | tft.drawString("PW",27,128,2); 262 | tft.drawString("BAT",148,128,2); 263 | tft.drawString("IAC",255,128,2); 264 | tft.drawString("LPS",33,165,2); 265 | tft.drawString("VSS",148,165,2); 266 | tft.drawString("SL",250,165,2); 267 | 268 | mainFilled = true; 269 | } 270 | 271 | void fillSettingsScreen() 272 | { 273 | tft.fillScreen(TFT_BLACK); 274 | tft.setTextColor(TFT_CYAN, TFT_BLACK); 275 | tft.setTextDatum(ML_DATUM); 276 | tft.pushImage(5,5,38,32,back); 277 | tft.drawString("SETTINGS",64,25,4); 278 | tft.drawLine(0,44,320,44,TFT_GREY); 279 | 280 | tft.setTextPadding(0); 281 | tft.drawString("Refresh (Hz)",10,75,4); 282 | tft.drawRoundRect(170,54,40,40,10,TFT_WHITE); 283 | tft.drawString("-",186,75,4); 284 | redrawRefreshRate(false); 285 | tft.drawRoundRect(270,54,40,40,10,TFT_WHITE); 286 | tft.drawString("+",284,75,4); 287 | 288 | tft.drawRoundRect(240,4,70,35,10,TFT_WHITE); 289 | tft.drawString("SAVE",259,22,2); 290 | 291 | settingsFilled = true; 292 | } 293 | 294 | void redrawRefreshRate(bool doDelay) 295 | { 296 | tft.setTextDatum(MR_DATUM); 297 | tft.setTextPadding(tft.textWidth("888", 4)); 298 | tft.drawNumber(refreshRate,258,75,4); 299 | tft.setTextDatum(ML_DATUM); 300 | tft.setTextPadding(0); 301 | if (doDelay) delay(50); 302 | } 303 | 304 | void callback(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) 305 | { 306 | if (event == ESP_SPP_CLOSE_EVT) 307 | { 308 | screen = -1; 309 | tft.fillScreen(TFT_BLACK); 310 | tft.drawString("Connection lost",20,20,4); 311 | tft.drawString("Reconnecting...",20,60,4); 312 | delay(1000); 313 | ESP.restart(); 314 | } 315 | } 316 | 317 | void touchCalibrate() 318 | { 319 | uint16_t calData[5]; 320 | uint8_t calDataOK = 0; 321 | 322 | // check file system exists 323 | if (!SPIFFS.begin()) { 324 | Serial.println("Formating file system"); 325 | SPIFFS.format(); 326 | SPIFFS.begin(); 327 | } 328 | 329 | // check if calibration file exists and size is correct 330 | if (SPIFFS.exists(CALIBRATION_FILE)) { 331 | if (REPEAT_CAL) 332 | { 333 | // Delete if we want to re-calibrate 334 | SPIFFS.remove(CALIBRATION_FILE); 335 | } 336 | else 337 | { 338 | File f = SPIFFS.open(CALIBRATION_FILE, "r"); 339 | if (f) { 340 | if (f.readBytes((char *)calData, 14) == 14) 341 | calDataOK = 1; 342 | f.close(); 343 | } 344 | } 345 | } 346 | 347 | if (calDataOK && !REPEAT_CAL) { 348 | // calibration data valid 349 | tft.setTouch(calData); 350 | } else { 351 | // data not valid so recalibrate 352 | tft.fillScreen(TFT_BLACK); 353 | tft.setCursor(20, 0); 354 | tft.setTextFont(2); 355 | tft.setTextSize(1); 356 | tft.setTextColor(TFT_WHITE, TFT_BLACK); 357 | 358 | tft.println("Touch corners as indicated"); 359 | 360 | tft.setTextFont(1); 361 | tft.println(); 362 | 363 | if (REPEAT_CAL) { 364 | tft.setTextColor(TFT_RED, TFT_BLACK); 365 | tft.println("Set REPEAT_CAL to false to stop this running again!"); 366 | } 367 | 368 | tft.calibrateTouch(calData, TFT_MAGENTA, TFT_BLACK, 15); 369 | 370 | tft.setTextColor(TFT_GREEN, TFT_BLACK); 371 | tft.println("Calibration complete!"); 372 | 373 | // store data 374 | File f = SPIFFS.open(CALIBRATION_FILE, "w"); 375 | if (f) { 376 | f.write((const unsigned char *)calData, 14); 377 | f.close(); 378 | } 379 | } 380 | } -------------------------------------------------------------------------------- /back.h: -------------------------------------------------------------------------------- 1 | const unsigned short back[0x4C0] PROGMEM ={ 2 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0861, // 0x0010 (16) 3 | 0x8410, 0xE71C, 0xEF5D, 0x9492, 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0020 (32) 4 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0030 (48) 5 | 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0xB5B6, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xD69A, 0x2945, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0040 (64) 6 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0050 (80) 7 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1082, 0xBDF7, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0060 (96) 8 | 0xFFFF, 0xA534, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0070 (112) 9 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18E3, 0xC618, // 0x0080 (128) 10 | 0xFFFF, 0xFFFF, 0xF7BE, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xEF7D, 0x18C3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0090 (144) 11 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00A0 (160) 12 | 0x0000, 0x0000, 0x0000, 0x18E3, 0xC618, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0x2104, 0x0000, // 0x00B0 (176) 13 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00C0 (192) 14 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18C3, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, // 0x00D0 (208) 15 | 0xFFFF, 0xFFFF, 0xFFFF, 0xD69A, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x00E0 (224) 16 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18E3, 0xC618, 0xFFFF, // 0x00F0 (240) 17 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0x5AEB, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0100 (256) 18 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0110 (272) 19 | 0x0000, 0x0000, 0x18E3, 0xCE59, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0x7BEF, 0x0000, // 0x0120 (288) 20 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0130 (304) 21 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2104, 0xCE59, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x0140 (320) 22 | 0xFFDF, 0xFFFF, 0xFFFF, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0150 (336) 23 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18E3, 0xC638, 0xFFFF, 0xFFFF, // 0x0160 (352) 24 | 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7BEF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, // 0x0170 (368) 25 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0180 (384) 26 | 0x0000, 0x18E3, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0x7BCF, 0x0000, 0x0000, // 0x0190 (400) 27 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x01A0 (416) 28 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x18E3, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01B0 (432) 29 | 0xFFFF, 0xF7BE, 0x7BCF, 0x0000, 0x0000, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0841, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, // 0x01C0 (448) 30 | 0x0841, 0x0020, 0x0020, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2124, 0xCE79, 0xFFFF, 0xFFFF, 0xFFFF, // 0x01D0 (464) 31 | 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF7BE, 0xBDD7, 0xBDD7, 0xC618, 0xBDF7, 0xBDF7, 0xBDF7, 0xBDF7, 0xBDF7, // 0x01E0 (480) 32 | 0xC618, 0xBDF7, 0xC618, 0xBDF7, 0xBDF7, 0xBDF7, 0xC618, 0xBDF7, 0xC618, 0xC618, 0xB5B6, 0x94B2, 0x2124, 0x0000, 0x0000, 0x0000, // 0x01F0 (496) 33 | 0x2104, 0xCE59, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0200 (512) 34 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0210 (528) 35 | 0xFFFF, 0xFFFF, 0xE71C, 0x31A6, 0x0000, 0x2124, 0xCE59, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0220 (544) 36 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0230 (560) 37 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xC618, 0x31A6, 0xD6BA, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, // 0x0240 (576) 38 | 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0250 (592) 39 | 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0260 (608) 40 | 0x5ACB, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0270 (624) 41 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0280 (640) 42 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0x52AA, 0xF7BE, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, // 0x0290 (656) 43 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02A0 (672) 44 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xE71C, 0x0000, 0x0000, 0x5ACB, 0xF7BE, // 0x02B0 (688) 45 | 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02C0 (704) 46 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02D0 (720) 47 | 0xFFFF, 0x6B4D, 0x0000, 0x0000, 0x0000, 0x5ACB, 0xF79E, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x02E0 (736) 48 | 0xFFDF, 0xFFDF, 0xF79E, 0xF7BE, 0xF7BE, 0xFFDF, 0xF7BE, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFDF, 0xF7BE, 0xFFDF, 0xFFDF, // 0x02F0 (752) 49 | 0xFFDF, 0xF7BE, 0xF7BE, 0xF7BE, 0xF7BE, 0xDEFB, 0x6B4D, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0xF79E, 0xFFFF, 0xFFDF, // 0x0300 (768) 50 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xF79E, 0x738E, 0x2945, 0x31A6, 0x39C7, 0x31A6, 0x31A6, 0x31A6, 0x39E7, // 0x0310 (784) 51 | 0x39C7, 0x31A6, 0x31A6, 0x31A6, 0x39C7, 0x31A6, 0x39C7, 0x31A6, 0x31A6, 0x31A6, 0x2965, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0320 (800) 52 | 0x0000, 0x0000, 0x0000, 0x52AA, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xDEDB, 0x39C7, // 0x0330 (816) 53 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0340 (832) 54 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x528A, 0xF79E, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, // 0x0350 (848) 55 | 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xE71C, 0x4208, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0360 (864) 56 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0370 (880) 57 | 0x0000, 0x52AA, 0xF7BE, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFDF, 0xFFFF, 0xEF5D, 0x4228, 0x0000, 0x0000, // 0x0380 (896) 58 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0390 (912) 59 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x52AA, 0xEF7D, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, // 0x03A0 (928) 60 | 0xFFFF, 0xFFDF, 0xFFFF, 0xE73C, 0x39E7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03B0 (944) 61 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A69, // 0x03C0 (960) 62 | 0xF79E, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xE71C, 0x31A6, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03D0 (976) 63 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x03E0 (992) 64 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A69, 0xF79E, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, // 0x03F0 (1008) 65 | 0xFFFF, 0xAD75, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0400 (1024) 66 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A69, 0xF79E, 0xFFFF, // 0x0410 (1040) 67 | 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFFF, 0xFFFF, 0xF79E, 0x18E3, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0420 (1056) 68 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0430 (1072) 69 | 0x0000, 0x0000, 0x0000, 0x0000, 0x4A69, 0xF79E, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0xFFDF, 0xFFFF, 0xFFFF, 0xFFDF, 0x2104, 0x0000, // 0x0440 (1088) 70 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0450 (1104) 71 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4A69, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, // 0x0460 (1120) 72 | 0xFFFF, 0xFFFF, 0xFFFF, 0xC638, 0x0861, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0470 (1136) 73 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0480 (1152) 74 | 0x0000, 0x0000, 0x4A49, 0xEF7D, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFDF, 0x528A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x0490 (1168) 75 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x04A0 (1184) 76 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x39C7, 0xB5B6, 0xF7BE, 0xF7BE, 0xC618, 0x52AA, 0x0000, // 0x04B0 (1200) 77 | 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 0x04C0 (1216) 78 | }; 79 | --------------------------------------------------------------------------------