diff --git a/arduino/Screen code/Screen-code-full/displayText.cpp b/arduino/Screen code/Screen-code-full/displayText.cpp index 6c12cab..88dfd70 100644 --- a/arduino/Screen code/Screen-code-full/displayText.cpp +++ b/arduino/Screen code/Screen-code-full/displayText.cpp @@ -16,7 +16,7 @@ void DisplayText::writeText(char* text, int size, int posX, int posY, int screen // } tft.setCursor(posX, posY); tft.setTextSize(size); - printWordsFull(text); + printWordsFull(text, bottom); delay(screenTime); } @@ -39,38 +39,68 @@ int DisplayText::centerText(char* text) { // } //attempt to write the text out in full (wip) -void DisplayText::printWordsFull(char* text) { - const int screenWidth = 320; // replace with your TFT display width - const int lineHeight = 22; // replace with your text line height - - char* word = strtok(text, " "); +void DisplayText::printWordsFull(char* text, bool bottom) { + const int screenWidth = 480; // replace with your TFT display width + const int lineHeight = 30; // replace with your text line height + //the double copy is needed so it doesnt alter the original text + char* newtext1 = strdup(text); // Create a copy of the string for the first strtok_r + char* newtext2 = strdup(text); // Create a second copy for the second strtok_r + char* saveptr1, *saveptr2; + char* word = strtok_r(newtext1, " ", &saveptr1); char line[100] = ""; int lineCount = 0; + int lineWidth = 0; - while (word != NULL) { - char tempLine[100]; - strcpy(tempLine, line); - strcat(tempLine, word); - strcat(tempLine, " "); - + // Calculate total number of lines + int totalLines = 0; + char* tempWord = strtok_r(newtext2, " ", &saveptr2); + while (tempWord != NULL) { int16_t x1, y1; uint16_t w, h; - tft.getTextBounds(tempLine, 0, 0, &x1, &y1, &w, &h); + tft.getTextBounds(tempWord, 0, 0, &x1, &y1, &w, &h); + if (lineWidth + w > screenWidth && strlen(line) > 0) { + //if the line width is greater than the screen width, then we need to add a new line + totalLines++; + lineWidth = w; + //otherwise we just add the width of the word to the line width + } else { + lineWidth += w; + } + tempWord = strtok_r(NULL, " ", &saveptr2); + } + totalLines++; // Add one for the last line - if (w > screenWidth && strlen(line) > 0) { - tft.setCursor(0, lineHeight * lineCount); + // Reset variables for actual printing + strcpy(line, ""); + lineWidth = 0; + + while (word != NULL) { + int16_t x1, y1; + uint16_t w, h; + tft.getTextBounds(word, 0, 0, &x1, &y1, &w, &h); + + if (lineWidth + w > screenWidth && strlen(line) > 0) { + int y = bottom ? tft.height() - lineHeight * (totalLines - lineCount) : lineHeight * lineCount; + tft.setCursor(0, y); tft.println(line); lineCount++; strcpy(line, word); strcat(line, " "); + lineWidth = w; } else { - strcpy(line, tempLine); + strcat(line, word); + strcat(line, " "); + lineWidth += w; } - word = strtok(NULL, " "); + word = strtok_r(NULL, " ", &saveptr1); } // print the last line - tft.setCursor(0, lineHeight * lineCount); + int y = bottom ? tft.height() - lineHeight * (totalLines - lineCount) : lineHeight * lineCount; + tft.setCursor(0, y); tft.println(line); + + free(newtext1); // Free the memory allocated by strdup + free(newtext2); // Free the memory allocated by strdup } \ No newline at end of file diff --git a/arduino/Screen code/Screen-code-full/displayText.h b/arduino/Screen code/Screen-code-full/displayText.h index a29b070..9888068 100644 --- a/arduino/Screen code/Screen-code-full/displayText.h +++ b/arduino/Screen code/Screen-code-full/displayText.h @@ -9,7 +9,7 @@ class DisplayText { Adafruit_ST7796S_kbv& tft; int centerText(char* text); // int bottomText(char* text); - void printWordsFull(char* text); + void printWordsFull(char* text, bool bottom); public: DisplayText(Adafruit_ST7796S_kbv& tftDisplay); diff --git a/docs/node-documentation/TFT-screen.md b/docs/node-documentation/TFT-screen.md index 1b4c733..02ab967 100644 --- a/docs/node-documentation/TFT-screen.md +++ b/docs/node-documentation/TFT-screen.md @@ -99,6 +99,12 @@ class Adafruit_ST7796S_kbv{ } ``` + +## Why did we choose for this screen? + +We chose the screen too fast without going over all the functions and researching what we actually needed. For example we aren't using the touchscreen function of the screen so we could've gotten a different screen without touchscreen. We've attempted to use a screen for the raspberry pi with some pin headers on it but we couldn't get it to work with the esp32. We wanted to have a bigger screen than the small oled screens we already have because it isn't nice to read from and you need to get up close to see what it displays. With a bigger screen thats less of a issue. After the purchase we did some more research for screens but the bottomline was this was the best one we could get because there aren't screens that are this big without touchscreen. + + ## Sources * https://www.tinytronics.nl/en/displays/tft/4-inch-tft-display-320*480-pixels-with-touchscreen-spi-st7796s Source for Driver * https://github.com/prenticedavid/Adafruit_ST7796S_kbv Download link for the library