This library is the modified library of 4DGL by Stephane ROCHON <stephane.rochon at free.fr> modified at drawImage() by Kazushi Mukaiyama <i@kazushi.info>

Committer:
kazushi2008
Date:
Fri Oct 29 02:26:05 2010 +0000
Revision:
0:c2aeac7c2d15

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kazushi2008 0:c2aeac7c2d15 1 //
kazushi2008 0:c2aeac7c2d15 2 // TFT_4DGL is a class to drive 4D Systems TFT touch screens
kazushi2008 0:c2aeac7c2d15 3 //
kazushi2008 0:c2aeac7c2d15 4 // Copyright (C) <2010> Stephane ROCHON <stephane.rochon at free.fr>
kazushi2008 0:c2aeac7c2d15 5 //
kazushi2008 0:c2aeac7c2d15 6 // TFT_4DGL is free software: you can redistribute it and/or modify
kazushi2008 0:c2aeac7c2d15 7 // it under the terms of the GNU General Public License as published by
kazushi2008 0:c2aeac7c2d15 8 // the Free Software Foundation, either version 3 of the License, or
kazushi2008 0:c2aeac7c2d15 9 // (at your option) any later version.
kazushi2008 0:c2aeac7c2d15 10 //
kazushi2008 0:c2aeac7c2d15 11 // TFT_4DGL is distributed in the hope that it will be useful,
kazushi2008 0:c2aeac7c2d15 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
kazushi2008 0:c2aeac7c2d15 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kazushi2008 0:c2aeac7c2d15 14 // GNU General Public License for more details.
kazushi2008 0:c2aeac7c2d15 15 //
kazushi2008 0:c2aeac7c2d15 16 // You should have received a copy of the GNU General Public License
kazushi2008 0:c2aeac7c2d15 17 // along with TFT_4DGL. If not, see <http://www.gnu.org/licenses/>.
kazushi2008 0:c2aeac7c2d15 18
kazushi2008 0:c2aeac7c2d15 19 #include "mbed.h"
kazushi2008 0:c2aeac7c2d15 20 #include "TFT_4DGL.h"
kazushi2008 0:c2aeac7c2d15 21
kazushi2008 0:c2aeac7c2d15 22 //****************************************************************************************************
kazushi2008 0:c2aeac7c2d15 23 void TFT_4DGL :: set_font(char mode) { // set font size
kazushi2008 0:c2aeac7c2d15 24 char command[2]= "";
kazushi2008 0:c2aeac7c2d15 25
kazushi2008 0:c2aeac7c2d15 26 int w, h, fx = 8, fy = 8;
kazushi2008 0:c2aeac7c2d15 27
kazushi2008 0:c2aeac7c2d15 28 command[0] = SETFONT;
kazushi2008 0:c2aeac7c2d15 29 command[1] = mode;
kazushi2008 0:c2aeac7c2d15 30
kazushi2008 0:c2aeac7c2d15 31 current_font = mode;
kazushi2008 0:c2aeac7c2d15 32
kazushi2008 0:c2aeac7c2d15 33 if (current_orientation == IS_PORTRAIT) {
kazushi2008 0:c2aeac7c2d15 34 w = SIZE_X;
kazushi2008 0:c2aeac7c2d15 35 h = SIZE_Y;
kazushi2008 0:c2aeac7c2d15 36 } else {
kazushi2008 0:c2aeac7c2d15 37 w = SIZE_Y;
kazushi2008 0:c2aeac7c2d15 38 h = SIZE_X;
kazushi2008 0:c2aeac7c2d15 39 }
kazushi2008 0:c2aeac7c2d15 40
kazushi2008 0:c2aeac7c2d15 41 switch (mode) {
kazushi2008 0:c2aeac7c2d15 42 case FONT_5X7 :
kazushi2008 0:c2aeac7c2d15 43 fx = 6;
kazushi2008 0:c2aeac7c2d15 44 fy = 8;
kazushi2008 0:c2aeac7c2d15 45 break;
kazushi2008 0:c2aeac7c2d15 46 case FONT_8X8 :
kazushi2008 0:c2aeac7c2d15 47 fx = 8;
kazushi2008 0:c2aeac7c2d15 48 fy = 8;
kazushi2008 0:c2aeac7c2d15 49 break;
kazushi2008 0:c2aeac7c2d15 50 case FONT_8X12 :
kazushi2008 0:c2aeac7c2d15 51 fx = 8;
kazushi2008 0:c2aeac7c2d15 52 fy = 12;
kazushi2008 0:c2aeac7c2d15 53 break;
kazushi2008 0:c2aeac7c2d15 54 case FONT_12X16 :
kazushi2008 0:c2aeac7c2d15 55 fx = 12;
kazushi2008 0:c2aeac7c2d15 56 fy = 16;
kazushi2008 0:c2aeac7c2d15 57 break;
kazushi2008 0:c2aeac7c2d15 58 }
kazushi2008 0:c2aeac7c2d15 59
kazushi2008 0:c2aeac7c2d15 60 max_col = w / fx;
kazushi2008 0:c2aeac7c2d15 61 max_row = h / fy;
kazushi2008 0:c2aeac7c2d15 62
kazushi2008 0:c2aeac7c2d15 63 writeCOMMAND(command, 2);
kazushi2008 0:c2aeac7c2d15 64 }
kazushi2008 0:c2aeac7c2d15 65
kazushi2008 0:c2aeac7c2d15 66 //****************************************************************************************************
kazushi2008 0:c2aeac7c2d15 67 void TFT_4DGL :: text_mode(char mode) { // set text mode
kazushi2008 0:c2aeac7c2d15 68 char command[2]= "";
kazushi2008 0:c2aeac7c2d15 69
kazushi2008 0:c2aeac7c2d15 70 command[0] = TEXTMODE;
kazushi2008 0:c2aeac7c2d15 71 command[1] = mode;
kazushi2008 0:c2aeac7c2d15 72
kazushi2008 0:c2aeac7c2d15 73 writeCOMMAND(command, 2);
kazushi2008 0:c2aeac7c2d15 74 }
kazushi2008 0:c2aeac7c2d15 75
kazushi2008 0:c2aeac7c2d15 76 //****************************************************************************************************
kazushi2008 0:c2aeac7c2d15 77 void TFT_4DGL :: text_char(char c, char col, char row, int color) { // draw a text char
kazushi2008 0:c2aeac7c2d15 78 char command[6]= "";
kazushi2008 0:c2aeac7c2d15 79
kazushi2008 0:c2aeac7c2d15 80 command[0] = TEXTCHAR;
kazushi2008 0:c2aeac7c2d15 81
kazushi2008 0:c2aeac7c2d15 82 command[1] = c;
kazushi2008 0:c2aeac7c2d15 83 command[2] = col;
kazushi2008 0:c2aeac7c2d15 84 command[3] = row;
kazushi2008 0:c2aeac7c2d15 85
kazushi2008 0:c2aeac7c2d15 86 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
kazushi2008 0:c2aeac7c2d15 87 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
kazushi2008 0:c2aeac7c2d15 88 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kazushi2008 0:c2aeac7c2d15 89
kazushi2008 0:c2aeac7c2d15 90 command[4] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kazushi2008 0:c2aeac7c2d15 91 command[5] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kazushi2008 0:c2aeac7c2d15 92
kazushi2008 0:c2aeac7c2d15 93 writeCOMMAND(command, 8);
kazushi2008 0:c2aeac7c2d15 94 }
kazushi2008 0:c2aeac7c2d15 95
kazushi2008 0:c2aeac7c2d15 96 //****************************************************************************************************
kazushi2008 0:c2aeac7c2d15 97 void TFT_4DGL :: graphic_char(char c, int x, int y, int color, char width, char height) { // draw a graphic char
kazushi2008 0:c2aeac7c2d15 98 char command[10]= "";
kazushi2008 0:c2aeac7c2d15 99
kazushi2008 0:c2aeac7c2d15 100 command[0] = GRAPHCHAR;
kazushi2008 0:c2aeac7c2d15 101
kazushi2008 0:c2aeac7c2d15 102 command[1] = c;
kazushi2008 0:c2aeac7c2d15 103
kazushi2008 0:c2aeac7c2d15 104 command[2] = (x >> 8) & 0xFF;
kazushi2008 0:c2aeac7c2d15 105 command[3] = x & 0xFF;
kazushi2008 0:c2aeac7c2d15 106
kazushi2008 0:c2aeac7c2d15 107 command[4] = (y >> 8) & 0xFF;
kazushi2008 0:c2aeac7c2d15 108 command[5] = y & 0xFF;
kazushi2008 0:c2aeac7c2d15 109
kazushi2008 0:c2aeac7c2d15 110 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
kazushi2008 0:c2aeac7c2d15 111 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
kazushi2008 0:c2aeac7c2d15 112 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kazushi2008 0:c2aeac7c2d15 113
kazushi2008 0:c2aeac7c2d15 114 command[6] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kazushi2008 0:c2aeac7c2d15 115 command[7] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kazushi2008 0:c2aeac7c2d15 116
kazushi2008 0:c2aeac7c2d15 117 command[8] = width;
kazushi2008 0:c2aeac7c2d15 118
kazushi2008 0:c2aeac7c2d15 119 command[9] = height;
kazushi2008 0:c2aeac7c2d15 120
kazushi2008 0:c2aeac7c2d15 121 writeCOMMAND(command, 10);
kazushi2008 0:c2aeac7c2d15 122 }
kazushi2008 0:c2aeac7c2d15 123
kazushi2008 0:c2aeac7c2d15 124 //****************************************************************************************************
kazushi2008 0:c2aeac7c2d15 125 void TFT_4DGL :: text_string(char *s, char col, char row, char font, int color) { // draw a text string
kazushi2008 0:c2aeac7c2d15 126
kazushi2008 0:c2aeac7c2d15 127 char command[1000]= "";
kazushi2008 0:c2aeac7c2d15 128 int size = strlen(s);
kazushi2008 0:c2aeac7c2d15 129 int i = 0;
kazushi2008 0:c2aeac7c2d15 130
kazushi2008 0:c2aeac7c2d15 131 command[0] = TEXTSTRING;
kazushi2008 0:c2aeac7c2d15 132
kazushi2008 0:c2aeac7c2d15 133 command[1] = col;
kazushi2008 0:c2aeac7c2d15 134 command[2] = row;
kazushi2008 0:c2aeac7c2d15 135
kazushi2008 0:c2aeac7c2d15 136 command[3] = font;
kazushi2008 0:c2aeac7c2d15 137
kazushi2008 0:c2aeac7c2d15 138 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
kazushi2008 0:c2aeac7c2d15 139 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
kazushi2008 0:c2aeac7c2d15 140 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kazushi2008 0:c2aeac7c2d15 141
kazushi2008 0:c2aeac7c2d15 142 command[4] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kazushi2008 0:c2aeac7c2d15 143 command[5] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kazushi2008 0:c2aeac7c2d15 144
kazushi2008 0:c2aeac7c2d15 145 for (i=0; i<size; i++) command[6+i] = s[i];
kazushi2008 0:c2aeac7c2d15 146
kazushi2008 0:c2aeac7c2d15 147 command[6+size] = 0;
kazushi2008 0:c2aeac7c2d15 148
kazushi2008 0:c2aeac7c2d15 149 writeCOMMAND(command, 7 + size);
kazushi2008 0:c2aeac7c2d15 150 }
kazushi2008 0:c2aeac7c2d15 151
kazushi2008 0:c2aeac7c2d15 152 //****************************************************************************************************
kazushi2008 0:c2aeac7c2d15 153 void TFT_4DGL :: graphic_string(char *s, int x, int y, char font, int color, char width, char height) { // draw a text string
kazushi2008 0:c2aeac7c2d15 154
kazushi2008 0:c2aeac7c2d15 155 char command[1000]= "";
kazushi2008 0:c2aeac7c2d15 156 int size = strlen(s);
kazushi2008 0:c2aeac7c2d15 157 int i = 0;
kazushi2008 0:c2aeac7c2d15 158
kazushi2008 0:c2aeac7c2d15 159 command[0] = GRAPHSTRING;
kazushi2008 0:c2aeac7c2d15 160
kazushi2008 0:c2aeac7c2d15 161 command[1] = (x >> 8) & 0xFF;
kazushi2008 0:c2aeac7c2d15 162 command[2] = x & 0xFF;
kazushi2008 0:c2aeac7c2d15 163
kazushi2008 0:c2aeac7c2d15 164 command[3] = (y >> 8) & 0xFF;
kazushi2008 0:c2aeac7c2d15 165 command[4] = y & 0xFF;
kazushi2008 0:c2aeac7c2d15 166
kazushi2008 0:c2aeac7c2d15 167 command[5] = font;
kazushi2008 0:c2aeac7c2d15 168
kazushi2008 0:c2aeac7c2d15 169 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
kazushi2008 0:c2aeac7c2d15 170 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
kazushi2008 0:c2aeac7c2d15 171 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kazushi2008 0:c2aeac7c2d15 172
kazushi2008 0:c2aeac7c2d15 173 command[6] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kazushi2008 0:c2aeac7c2d15 174 command[7] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kazushi2008 0:c2aeac7c2d15 175
kazushi2008 0:c2aeac7c2d15 176 command[8] = width;
kazushi2008 0:c2aeac7c2d15 177
kazushi2008 0:c2aeac7c2d15 178 command[9] = height;
kazushi2008 0:c2aeac7c2d15 179
kazushi2008 0:c2aeac7c2d15 180 for (i=0; i<size; i++) command[10+i] = s[i];
kazushi2008 0:c2aeac7c2d15 181
kazushi2008 0:c2aeac7c2d15 182 command[10+size] = 0;
kazushi2008 0:c2aeac7c2d15 183
kazushi2008 0:c2aeac7c2d15 184 writeCOMMAND(command, 11 + size);
kazushi2008 0:c2aeac7c2d15 185 }
kazushi2008 0:c2aeac7c2d15 186
kazushi2008 0:c2aeac7c2d15 187 //****************************************************************************************************
kazushi2008 0:c2aeac7c2d15 188 void TFT_4DGL :: text_button(char *s, char mode, int x, int y, int button_color, char font, int text_color, char width, char height) { // draw a text string
kazushi2008 0:c2aeac7c2d15 189
kazushi2008 0:c2aeac7c2d15 190 char command[1000]= "";
kazushi2008 0:c2aeac7c2d15 191 int size = strlen(s);
kazushi2008 0:c2aeac7c2d15 192 int i = 0, red5, green6, blue5;
kazushi2008 0:c2aeac7c2d15 193
kazushi2008 0:c2aeac7c2d15 194 command[0] = TEXTBUTTON;
kazushi2008 0:c2aeac7c2d15 195
kazushi2008 0:c2aeac7c2d15 196 command[1] = mode;
kazushi2008 0:c2aeac7c2d15 197
kazushi2008 0:c2aeac7c2d15 198 command[2] = (x >> 8) & 0xFF;
kazushi2008 0:c2aeac7c2d15 199 command[3] = x & 0xFF;
kazushi2008 0:c2aeac7c2d15 200
kazushi2008 0:c2aeac7c2d15 201 command[4] = (y >> 8) & 0xFF;
kazushi2008 0:c2aeac7c2d15 202 command[5] = y & 0xFF;
kazushi2008 0:c2aeac7c2d15 203
kazushi2008 0:c2aeac7c2d15 204 red5 = (button_color >> (16 + 3)) & 0x1F; // get red on 5 bits
kazushi2008 0:c2aeac7c2d15 205 green6 = (button_color >> (8 + 2)) & 0x3F; // get green on 6 bits
kazushi2008 0:c2aeac7c2d15 206 blue5 = (button_color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kazushi2008 0:c2aeac7c2d15 207
kazushi2008 0:c2aeac7c2d15 208 command[6] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kazushi2008 0:c2aeac7c2d15 209 command[7] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kazushi2008 0:c2aeac7c2d15 210
kazushi2008 0:c2aeac7c2d15 211 command[8] = font;
kazushi2008 0:c2aeac7c2d15 212
kazushi2008 0:c2aeac7c2d15 213 red5 = (text_color >> (16 + 3)) & 0x1F; // get red on 5 bits
kazushi2008 0:c2aeac7c2d15 214 green6 = (text_color >> (8 + 2)) & 0x3F; // get green on 6 bits
kazushi2008 0:c2aeac7c2d15 215 blue5 = (text_color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kazushi2008 0:c2aeac7c2d15 216
kazushi2008 0:c2aeac7c2d15 217 command[9] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kazushi2008 0:c2aeac7c2d15 218 command[10] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kazushi2008 0:c2aeac7c2d15 219
kazushi2008 0:c2aeac7c2d15 220 command[11] = width;
kazushi2008 0:c2aeac7c2d15 221
kazushi2008 0:c2aeac7c2d15 222 command[12] = height;
kazushi2008 0:c2aeac7c2d15 223
kazushi2008 0:c2aeac7c2d15 224 for (i=0; i<size; i++) command[13+i] = s[i];
kazushi2008 0:c2aeac7c2d15 225
kazushi2008 0:c2aeac7c2d15 226 command[13+size] = 0;
kazushi2008 0:c2aeac7c2d15 227
kazushi2008 0:c2aeac7c2d15 228 writeCOMMAND(command, 14 + size);
kazushi2008 0:c2aeac7c2d15 229 }
kazushi2008 0:c2aeac7c2d15 230
kazushi2008 0:c2aeac7c2d15 231 //****************************************************************************************************
kazushi2008 0:c2aeac7c2d15 232 void TFT_4DGL :: locate(char col, char row) { // place text curssor at col, row
kazushi2008 0:c2aeac7c2d15 233 current_col = col;
kazushi2008 0:c2aeac7c2d15 234 current_row = row;
kazushi2008 0:c2aeac7c2d15 235 }
kazushi2008 0:c2aeac7c2d15 236
kazushi2008 0:c2aeac7c2d15 237 //****************************************************************************************************
kazushi2008 0:c2aeac7c2d15 238 void TFT_4DGL :: color(int color) { // set text color
kazushi2008 0:c2aeac7c2d15 239 current_color = color;
kazushi2008 0:c2aeac7c2d15 240 }
kazushi2008 0:c2aeac7c2d15 241
kazushi2008 0:c2aeac7c2d15 242 //****************************************************************************************************
kazushi2008 0:c2aeac7c2d15 243 void TFT_4DGL :: putc(char c) { // place char at current cursor position
kazushi2008 0:c2aeac7c2d15 244
kazushi2008 0:c2aeac7c2d15 245 text_char(c, current_col++, current_row, current_color);
kazushi2008 0:c2aeac7c2d15 246
kazushi2008 0:c2aeac7c2d15 247 if (current_col == max_col) {
kazushi2008 0:c2aeac7c2d15 248 current_col = 0;
kazushi2008 0:c2aeac7c2d15 249 current_row++;
kazushi2008 0:c2aeac7c2d15 250 }
kazushi2008 0:c2aeac7c2d15 251 if (current_row == max_row) {
kazushi2008 0:c2aeac7c2d15 252 current_row = 0;
kazushi2008 0:c2aeac7c2d15 253 }
kazushi2008 0:c2aeac7c2d15 254 }
kazushi2008 0:c2aeac7c2d15 255
kazushi2008 0:c2aeac7c2d15 256 //****************************************************************************************************
kazushi2008 0:c2aeac7c2d15 257 void TFT_4DGL :: puts(char *s) { // place string at current cursor position
kazushi2008 0:c2aeac7c2d15 258
kazushi2008 0:c2aeac7c2d15 259 text_string(s, current_col, current_row, current_font, current_color);
kazushi2008 0:c2aeac7c2d15 260
kazushi2008 0:c2aeac7c2d15 261 current_col += strlen(s);
kazushi2008 0:c2aeac7c2d15 262
kazushi2008 0:c2aeac7c2d15 263 if (current_col >= max_col) {
kazushi2008 0:c2aeac7c2d15 264 current_row += current_col / max_col;
kazushi2008 0:c2aeac7c2d15 265 current_col %= max_col;
kazushi2008 0:c2aeac7c2d15 266 }
kazushi2008 0:c2aeac7c2d15 267 if (current_row >= max_row) {
kazushi2008 0:c2aeac7c2d15 268 current_row %= max_row;
kazushi2008 0:c2aeac7c2d15 269 }
kazushi2008 0:c2aeac7c2d15 270 }