ECE 4180 Project for Spring 2020

Dependencies:   mbed mbed-rtos SDFileSystem PinDetect ESP8266NodeMCUInterface

Committer:
kimberlylie99
Date:
Fri May 01 18:43:13 2020 +0000
Revision:
1:5ae291085f75
Parent:
0:b97c07227845
Edit Main.cpp;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kimberlylie99 0:b97c07227845 1 //
kimberlylie99 0:b97c07227845 2 // uLCD_4DGL is a class to drive 4D Systems TFT touch screens
kimberlylie99 0:b97c07227845 3 //
kimberlylie99 0:b97c07227845 4 // Copyright (C) <2010> Stephane ROCHON <stephane.rochon at free.fr>
kimberlylie99 0:b97c07227845 5 // Modifed for Goldelox processor <2013> Jim Hamblen
kimberlylie99 0:b97c07227845 6 //
kimberlylie99 0:b97c07227845 7 // uLCD_4DGL is free software: you can redistribute it and/or modify
kimberlylie99 0:b97c07227845 8 // it under the terms of the GNU General Public License as published by
kimberlylie99 0:b97c07227845 9 // the Free Software Foundation, either version 3 of the License, or
kimberlylie99 0:b97c07227845 10 // (at your option) any later version.
kimberlylie99 0:b97c07227845 11 //
kimberlylie99 0:b97c07227845 12 // uLCD_4DGL is distributed in the hope that it will be useful,
kimberlylie99 0:b97c07227845 13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
kimberlylie99 0:b97c07227845 14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kimberlylie99 0:b97c07227845 15 // GNU General Public License for more details.
kimberlylie99 0:b97c07227845 16 //
kimberlylie99 0:b97c07227845 17 // You should have received a copy of the GNU General Public License
kimberlylie99 0:b97c07227845 18 // along with uLCD_4DGL. If not, see <http://www.gnu.org/licenses/>.
kimberlylie99 0:b97c07227845 19
kimberlylie99 0:b97c07227845 20 #include "mbed.h"
kimberlylie99 0:b97c07227845 21 #include "uLCD_4DGL.h"
kimberlylie99 0:b97c07227845 22
kimberlylie99 0:b97c07227845 23 //****************************************************************************************************
kimberlylie99 0:b97c07227845 24 void uLCD_4DGL :: set_font_size(char width, char height) // set font size
kimberlylie99 0:b97c07227845 25 {
kimberlylie99 0:b97c07227845 26 if (current_orientation == IS_PORTRAIT) {
kimberlylie99 0:b97c07227845 27 current_fx = width;
kimberlylie99 0:b97c07227845 28 current_fy = height;
kimberlylie99 0:b97c07227845 29 } else {
kimberlylie99 0:b97c07227845 30 current_fy = height;
kimberlylie99 0:b97c07227845 31 current_fx = width;
kimberlylie99 0:b97c07227845 32 }
kimberlylie99 0:b97c07227845 33 max_col = current_w / (current_fx*current_wf);
kimberlylie99 0:b97c07227845 34 max_row = current_h / (current_fy*current_hf);
kimberlylie99 0:b97c07227845 35 }
kimberlylie99 0:b97c07227845 36
kimberlylie99 0:b97c07227845 37 //****************************************************************************************************
kimberlylie99 0:b97c07227845 38 void uLCD_4DGL :: set_font(char mode) // set font - system or SD media
kimberlylie99 0:b97c07227845 39 {
kimberlylie99 0:b97c07227845 40 char command[3]= "";
kimberlylie99 0:b97c07227845 41
kimberlylie99 0:b97c07227845 42 command[0] = SETFONT;
kimberlylie99 0:b97c07227845 43 command[1] = 0;
kimberlylie99 0:b97c07227845 44 command[2] = mode;
kimberlylie99 0:b97c07227845 45
kimberlylie99 0:b97c07227845 46 current_font = mode;
kimberlylie99 0:b97c07227845 47
kimberlylie99 0:b97c07227845 48 if (current_orientation == IS_PORTRAIT) {
kimberlylie99 0:b97c07227845 49 current_w = SIZE_X;
kimberlylie99 0:b97c07227845 50 current_h = SIZE_Y;
kimberlylie99 0:b97c07227845 51 } else {
kimberlylie99 0:b97c07227845 52 current_w = SIZE_Y;
kimberlylie99 0:b97c07227845 53 current_h = SIZE_X;
kimberlylie99 0:b97c07227845 54 }
kimberlylie99 0:b97c07227845 55
kimberlylie99 0:b97c07227845 56 switch (mode) {
kimberlylie99 0:b97c07227845 57 case FONT_5X7 :
kimberlylie99 0:b97c07227845 58
kimberlylie99 0:b97c07227845 59 current_fx = 6;
kimberlylie99 0:b97c07227845 60 current_fy = 8;
kimberlylie99 0:b97c07227845 61 break;
kimberlylie99 0:b97c07227845 62 case FONT_7X8 :
kimberlylie99 0:b97c07227845 63 current_fx = 7;
kimberlylie99 0:b97c07227845 64 current_fy = 8;
kimberlylie99 0:b97c07227845 65 break;
kimberlylie99 0:b97c07227845 66 case FONT_8X8 :
kimberlylie99 0:b97c07227845 67 current_fx = 8;
kimberlylie99 0:b97c07227845 68 current_fy = 8;
kimberlylie99 0:b97c07227845 69 break;
kimberlylie99 0:b97c07227845 70 case FONT_8X12 :
kimberlylie99 0:b97c07227845 71 current_fx = 8;
kimberlylie99 0:b97c07227845 72 current_fy = 12;
kimberlylie99 0:b97c07227845 73 break;
kimberlylie99 0:b97c07227845 74 case FONT_12X16 :
kimberlylie99 0:b97c07227845 75 current_fx = 12;
kimberlylie99 0:b97c07227845 76 current_fy = 16;
kimberlylie99 0:b97c07227845 77 break;
kimberlylie99 0:b97c07227845 78 default:
kimberlylie99 0:b97c07227845 79 current_fx = 8;
kimberlylie99 0:b97c07227845 80 current_fy = 8;
kimberlylie99 0:b97c07227845 81 }
kimberlylie99 0:b97c07227845 82
kimberlylie99 0:b97c07227845 83 max_col = current_w / (current_fx*current_wf);
kimberlylie99 0:b97c07227845 84 max_row = current_h / (current_fy*current_hf);
kimberlylie99 0:b97c07227845 85
kimberlylie99 0:b97c07227845 86 writeCOMMAND(command, 3);
kimberlylie99 0:b97c07227845 87 }
kimberlylie99 0:b97c07227845 88
kimberlylie99 0:b97c07227845 89
kimberlylie99 0:b97c07227845 90
kimberlylie99 0:b97c07227845 91 //****************************************************************************************************
kimberlylie99 0:b97c07227845 92 void uLCD_4DGL :: text_mode(char mode) // set text mode
kimberlylie99 0:b97c07227845 93 {
kimberlylie99 0:b97c07227845 94 char command[3]= "";
kimberlylie99 0:b97c07227845 95
kimberlylie99 0:b97c07227845 96 command[0] = TEXTMODE;
kimberlylie99 0:b97c07227845 97 command[1] = 0;
kimberlylie99 0:b97c07227845 98 command[2] = mode;
kimberlylie99 0:b97c07227845 99
kimberlylie99 0:b97c07227845 100 writeCOMMAND(command, 3);
kimberlylie99 0:b97c07227845 101 }
kimberlylie99 0:b97c07227845 102
kimberlylie99 0:b97c07227845 103 //****************************************************************************************************
kimberlylie99 0:b97c07227845 104 void uLCD_4DGL :: text_bold(char mode) // set text mode
kimberlylie99 0:b97c07227845 105 {
kimberlylie99 0:b97c07227845 106 char command[3]= "";
kimberlylie99 0:b97c07227845 107
kimberlylie99 0:b97c07227845 108 command[0] = TEXTBOLD;
kimberlylie99 0:b97c07227845 109 command[1] = 0;
kimberlylie99 0:b97c07227845 110 command[2] = mode;
kimberlylie99 0:b97c07227845 111
kimberlylie99 0:b97c07227845 112 writeCOMMAND(command, 3);
kimberlylie99 0:b97c07227845 113 }
kimberlylie99 0:b97c07227845 114
kimberlylie99 0:b97c07227845 115 //****************************************************************************************************
kimberlylie99 0:b97c07227845 116 void uLCD_4DGL :: text_italic(char mode) // set text mode
kimberlylie99 0:b97c07227845 117 {
kimberlylie99 0:b97c07227845 118 char command[3]= "";
kimberlylie99 0:b97c07227845 119
kimberlylie99 0:b97c07227845 120 command[0] = TEXTITALIC;
kimberlylie99 0:b97c07227845 121 command[1] = 0;
kimberlylie99 0:b97c07227845 122 command[2] = mode;
kimberlylie99 0:b97c07227845 123
kimberlylie99 0:b97c07227845 124 writeCOMMAND(command, 3);
kimberlylie99 0:b97c07227845 125 }
kimberlylie99 0:b97c07227845 126
kimberlylie99 0:b97c07227845 127 //****************************************************************************************************
kimberlylie99 0:b97c07227845 128 void uLCD_4DGL :: text_inverse(char mode) // set text mode
kimberlylie99 0:b97c07227845 129 {
kimberlylie99 0:b97c07227845 130 char command[3]= "";
kimberlylie99 0:b97c07227845 131
kimberlylie99 0:b97c07227845 132 command[0] = TEXTINVERSE;
kimberlylie99 0:b97c07227845 133 command[1] = 0;
kimberlylie99 0:b97c07227845 134 command[2] = mode;
kimberlylie99 0:b97c07227845 135
kimberlylie99 0:b97c07227845 136 writeCOMMAND(command, 3);
kimberlylie99 0:b97c07227845 137 }
kimberlylie99 0:b97c07227845 138
kimberlylie99 0:b97c07227845 139 //****************************************************************************************************
kimberlylie99 0:b97c07227845 140 void uLCD_4DGL :: text_underline(char mode) // set text mode
kimberlylie99 0:b97c07227845 141 {
kimberlylie99 0:b97c07227845 142 char command[3]= "";
kimberlylie99 0:b97c07227845 143
kimberlylie99 0:b97c07227845 144 command[0] = TEXTUNDERLINE;
kimberlylie99 0:b97c07227845 145 command[1] = 0;
kimberlylie99 0:b97c07227845 146 command[2] = mode;
kimberlylie99 0:b97c07227845 147
kimberlylie99 0:b97c07227845 148 writeCOMMAND(command, 3);
kimberlylie99 0:b97c07227845 149 }
kimberlylie99 0:b97c07227845 150
kimberlylie99 0:b97c07227845 151 //****************************************************************************************************
kimberlylie99 0:b97c07227845 152 void uLCD_4DGL :: text_width(char width) // set text width
kimberlylie99 0:b97c07227845 153 {
kimberlylie99 0:b97c07227845 154 char command[3]= "";
kimberlylie99 0:b97c07227845 155
kimberlylie99 0:b97c07227845 156 command[0] = TEXTWIDTH;
kimberlylie99 0:b97c07227845 157 command[1] = 0;
kimberlylie99 0:b97c07227845 158 command[2] = width;
kimberlylie99 0:b97c07227845 159 current_wf = width;
kimberlylie99 0:b97c07227845 160 max_col = current_w / (current_fx*current_wf);
kimberlylie99 0:b97c07227845 161 writeCOMMAND(command, 3);
kimberlylie99 0:b97c07227845 162 }
kimberlylie99 0:b97c07227845 163
kimberlylie99 0:b97c07227845 164 //****************************************************************************************************
kimberlylie99 0:b97c07227845 165 void uLCD_4DGL :: text_height(char height) // set text height
kimberlylie99 0:b97c07227845 166 {
kimberlylie99 0:b97c07227845 167 char command[3]= "";
kimberlylie99 0:b97c07227845 168
kimberlylie99 0:b97c07227845 169 command[0] = TEXTHEIGHT;
kimberlylie99 0:b97c07227845 170 command[1] = 0;
kimberlylie99 0:b97c07227845 171 command[2] = height;
kimberlylie99 0:b97c07227845 172 current_hf = height;
kimberlylie99 0:b97c07227845 173 max_row = current_h / (current_fy*current_hf);
kimberlylie99 0:b97c07227845 174 writeCOMMAND(command, 3);
kimberlylie99 0:b97c07227845 175 }
kimberlylie99 0:b97c07227845 176
kimberlylie99 0:b97c07227845 177
kimberlylie99 0:b97c07227845 178 //****************************************************************************************************
kimberlylie99 0:b97c07227845 179 void uLCD_4DGL :: text_char(char c, char col, char row, int color) // draw a text char
kimberlylie99 0:b97c07227845 180 {
kimberlylie99 0:b97c07227845 181 char command[6]= "";
kimberlylie99 0:b97c07227845 182 command[0] = 0xE4; //move cursor
kimberlylie99 0:b97c07227845 183 command[1] = 0;
kimberlylie99 0:b97c07227845 184 command[2] = row;
kimberlylie99 0:b97c07227845 185 command[3] = 0;
kimberlylie99 0:b97c07227845 186 command[4] = col;
kimberlylie99 0:b97c07227845 187 writeCOMMAND(command, 5);
kimberlylie99 0:b97c07227845 188
kimberlylie99 0:b97c07227845 189 command[0] = 0x7F; //set color
kimberlylie99 0:b97c07227845 190
kimberlylie99 0:b97c07227845 191 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
kimberlylie99 0:b97c07227845 192 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
kimberlylie99 0:b97c07227845 193 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kimberlylie99 0:b97c07227845 194
kimberlylie99 0:b97c07227845 195 command[1] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kimberlylie99 0:b97c07227845 196 command[2] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kimberlylie99 0:b97c07227845 197 writeCOMMAND(command, 3);
kimberlylie99 0:b97c07227845 198
kimberlylie99 0:b97c07227845 199 command[0] = TEXTCHAR; //print char
kimberlylie99 0:b97c07227845 200 command[1] = 0;
kimberlylie99 0:b97c07227845 201 command[2] = c;
kimberlylie99 0:b97c07227845 202 writeCOMMAND(command, 3);
kimberlylie99 0:b97c07227845 203
kimberlylie99 0:b97c07227845 204 }
kimberlylie99 0:b97c07227845 205
kimberlylie99 0:b97c07227845 206
kimberlylie99 0:b97c07227845 207 //****************************************************************************************************
kimberlylie99 0:b97c07227845 208 void uLCD_4DGL :: text_string(char *s, char col, char row, char font, int color) // draw a text string
kimberlylie99 0:b97c07227845 209 {
kimberlylie99 0:b97c07227845 210
kimberlylie99 0:b97c07227845 211 char command[1000]= "";
kimberlylie99 0:b97c07227845 212 int size = strlen(s);
kimberlylie99 0:b97c07227845 213 int i = 0;
kimberlylie99 0:b97c07227845 214
kimberlylie99 0:b97c07227845 215 set_font(font);
kimberlylie99 0:b97c07227845 216
kimberlylie99 0:b97c07227845 217 command[0] = 0xE4; //move cursor
kimberlylie99 0:b97c07227845 218 command[1] = 0;
kimberlylie99 0:b97c07227845 219 command[2] = row;
kimberlylie99 0:b97c07227845 220 command[3] = 0;
kimberlylie99 0:b97c07227845 221 command[4] = col;
kimberlylie99 0:b97c07227845 222 writeCOMMAND(command, 5);
kimberlylie99 0:b97c07227845 223
kimberlylie99 0:b97c07227845 224 command[0] = 0x7F; //set color
kimberlylie99 0:b97c07227845 225 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
kimberlylie99 0:b97c07227845 226 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
kimberlylie99 0:b97c07227845 227 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kimberlylie99 0:b97c07227845 228
kimberlylie99 0:b97c07227845 229 command[1] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kimberlylie99 0:b97c07227845 230 command[2] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kimberlylie99 0:b97c07227845 231 writeCOMMAND(command, 3);
kimberlylie99 0:b97c07227845 232
kimberlylie99 0:b97c07227845 233 command[0] = TEXTSTRING;
kimberlylie99 0:b97c07227845 234 for (i=0; i<size; i++) command[1+i] = s[i];
kimberlylie99 0:b97c07227845 235 command[1+size] = 0;
kimberlylie99 0:b97c07227845 236 writeCOMMANDnull(command, 2 + size);
kimberlylie99 0:b97c07227845 237 }
kimberlylie99 0:b97c07227845 238
kimberlylie99 0:b97c07227845 239
kimberlylie99 0:b97c07227845 240
kimberlylie99 0:b97c07227845 241 //****************************************************************************************************
kimberlylie99 0:b97c07227845 242 void uLCD_4DGL :: locate(char col, char row) // place text curssor at col, row
kimberlylie99 0:b97c07227845 243 {
kimberlylie99 0:b97c07227845 244 char command[5] = "";
kimberlylie99 0:b97c07227845 245 current_col = col;
kimberlylie99 0:b97c07227845 246 current_row = row;
kimberlylie99 0:b97c07227845 247 command[0] = MOVECURSOR; //move cursor
kimberlylie99 0:b97c07227845 248 command[1] = 0;
kimberlylie99 0:b97c07227845 249 command[2] = current_row;
kimberlylie99 0:b97c07227845 250 command[3] = 0;
kimberlylie99 0:b97c07227845 251 command[4] = current_col;
kimberlylie99 0:b97c07227845 252 writeCOMMAND(command, 5);
kimberlylie99 0:b97c07227845 253 }
kimberlylie99 0:b97c07227845 254
kimberlylie99 0:b97c07227845 255 //****************************************************************************************************
kimberlylie99 0:b97c07227845 256 void uLCD_4DGL :: color(int color) // set text color
kimberlylie99 0:b97c07227845 257 {
kimberlylie99 0:b97c07227845 258 char command[5] = "";
kimberlylie99 0:b97c07227845 259 current_color = color;
kimberlylie99 0:b97c07227845 260 command[0] = 0x7F; //set color
kimberlylie99 0:b97c07227845 261
kimberlylie99 0:b97c07227845 262 int red5 = (color >> (16 + 3)) & 0x1F; // get red on 5 bits
kimberlylie99 0:b97c07227845 263 int green6 = (color >> (8 + 2)) & 0x3F; // get green on 6 bits
kimberlylie99 0:b97c07227845 264 int blue5 = (color >> (0 + 3)) & 0x1F; // get blue on 5 bits
kimberlylie99 0:b97c07227845 265
kimberlylie99 0:b97c07227845 266 command[1] = ((red5 << 3) + (green6 >> 3)) & 0xFF; // first part of 16 bits color
kimberlylie99 0:b97c07227845 267 command[2] = ((green6 << 5) + (blue5 >> 0)) & 0xFF; // second part of 16 bits color
kimberlylie99 0:b97c07227845 268 writeCOMMAND(command, 3);
kimberlylie99 0:b97c07227845 269 }
kimberlylie99 0:b97c07227845 270
kimberlylie99 0:b97c07227845 271 //****************************************************************************************************
kimberlylie99 0:b97c07227845 272 void uLCD_4DGL :: putc(char c) // place char at current cursor position
kimberlylie99 0:b97c07227845 273 //used by virtual printf function _putc
kimberlylie99 0:b97c07227845 274 {
kimberlylie99 0:b97c07227845 275 char command[6] ="";
kimberlylie99 0:b97c07227845 276 if(c<0x20) {
kimberlylie99 0:b97c07227845 277 if(c=='\n') {
kimberlylie99 0:b97c07227845 278 current_col = 0;
kimberlylie99 0:b97c07227845 279 current_row++;
kimberlylie99 0:b97c07227845 280 command[0] = MOVECURSOR; //move cursor to start of next line
kimberlylie99 0:b97c07227845 281 command[1] = 0;
kimberlylie99 0:b97c07227845 282 command[2] = current_row;
kimberlylie99 0:b97c07227845 283 command[3] = 0;
kimberlylie99 0:b97c07227845 284 command[4] = current_col;
kimberlylie99 0:b97c07227845 285 writeCOMMAND(command, 5);
kimberlylie99 0:b97c07227845 286 }
kimberlylie99 0:b97c07227845 287 if(c=='\r') {
kimberlylie99 0:b97c07227845 288 current_col = 0;
kimberlylie99 0:b97c07227845 289 command[0] = MOVECURSOR; //move cursor to start of line
kimberlylie99 0:b97c07227845 290 command[1] = 0;
kimberlylie99 0:b97c07227845 291 command[2] = current_row;
kimberlylie99 0:b97c07227845 292 command[3] = 0;
kimberlylie99 0:b97c07227845 293 command[4] = current_col;
kimberlylie99 0:b97c07227845 294 writeCOMMAND(command, 5);
kimberlylie99 0:b97c07227845 295 }
kimberlylie99 0:b97c07227845 296 if(c=='\f') {
kimberlylie99 0:b97c07227845 297 uLCD_4DGL::cls(); //clear screen on form feed
kimberlylie99 0:b97c07227845 298 }
kimberlylie99 0:b97c07227845 299 } else {
kimberlylie99 0:b97c07227845 300 command[0] = PUTCHAR;
kimberlylie99 0:b97c07227845 301 command[1] = 0x00;
kimberlylie99 0:b97c07227845 302 command[2] = c;
kimberlylie99 0:b97c07227845 303 writeCOMMAND(command,3);
kimberlylie99 0:b97c07227845 304 current_col++;
kimberlylie99 0:b97c07227845 305 }
kimberlylie99 0:b97c07227845 306 if (current_col == max_col) {
kimberlylie99 0:b97c07227845 307 current_col = 0;
kimberlylie99 0:b97c07227845 308 current_row++;
kimberlylie99 0:b97c07227845 309 command[0] = MOVECURSOR; //move cursor to next line
kimberlylie99 0:b97c07227845 310 command[1] = 0;
kimberlylie99 0:b97c07227845 311 command[2] = current_row;
kimberlylie99 0:b97c07227845 312 command[3] = 0;
kimberlylie99 0:b97c07227845 313 command[4] = current_col;
kimberlylie99 0:b97c07227845 314 writeCOMMAND(command, 5);
kimberlylie99 0:b97c07227845 315 }
kimberlylie99 0:b97c07227845 316 if (current_row == max_row) {
kimberlylie99 0:b97c07227845 317 current_row = 0;
kimberlylie99 0:b97c07227845 318 command[0] = MOVECURSOR; //move cursor back to start
kimberlylie99 0:b97c07227845 319 command[1] = 0;
kimberlylie99 0:b97c07227845 320 command[2] = current_row;
kimberlylie99 0:b97c07227845 321 command[3] = 0;
kimberlylie99 0:b97c07227845 322 command[4] = current_col;
kimberlylie99 0:b97c07227845 323 writeCOMMAND(command, 5);
kimberlylie99 0:b97c07227845 324 }
kimberlylie99 0:b97c07227845 325 }
kimberlylie99 0:b97c07227845 326
kimberlylie99 0:b97c07227845 327
kimberlylie99 0:b97c07227845 328 //****************************************************************************************************
kimberlylie99 0:b97c07227845 329 void uLCD_4DGL :: puts(char *s) // place string at current cursor position
kimberlylie99 0:b97c07227845 330 {
kimberlylie99 0:b97c07227845 331
kimberlylie99 0:b97c07227845 332 text_string(s, current_col, current_row, current_font, current_color);
kimberlylie99 0:b97c07227845 333
kimberlylie99 0:b97c07227845 334 current_col += strlen(s);
kimberlylie99 0:b97c07227845 335
kimberlylie99 0:b97c07227845 336 if (current_col >= max_col) {
kimberlylie99 0:b97c07227845 337 current_row += current_col / max_col;
kimberlylie99 0:b97c07227845 338 current_col %= max_col;
kimberlylie99 0:b97c07227845 339 }
kimberlylie99 0:b97c07227845 340 if (current_row >= max_row) {
kimberlylie99 0:b97c07227845 341 current_row %= max_row;
kimberlylie99 0:b97c07227845 342 }
kimberlylie99 0:b97c07227845 343 }