Мой код в настоящее время получает символы книги по одному и обрабатывает их так, чтобы он отображался в виде:
Я пошел в библиотеку
, чтобы взять
моя любимая
бейсбольная шляпа
вместо
Я отправился в искусство libr
, чтобы взять мою
любимую бейсбольную
l шляпу
, что будет делать опция обтекания Adafruit_ST7735.h по умолчанию. Все работает правильно, но сейчас я пытаюсь реализовать функциональность страниц. Я хочу иметь возможность вводить номер страницы, и функция отображает предварительно обработанный текст только этой страницы (где страницы определяются путем деления всего размера книги на количество символов, которое может уместиться на дисплее). Это довольно сложная система, и я часами бьюсь головой, но, похоже, она выходит за рамки моего IQ. Вот код моей пустоты: (где символы читаются из файла на SD-карте) Я не могу объяснить, как это работает, но быстрое чтение инструкций if должно дать представление о том, что происходит. Я полагаю, что основные проблемы возникают, когда система go -to-new-line-when-word-not-fit вызывает просчеты того, какое место на странице занято, и начинает портить текст. Другая проблема, которую я подозреваю, заключается в том, что ей нужно будет каким-то образом рассчитать пройденные страницы, чтобы правильно отобразить текущую страницу. А также, когда последнее слово не помещается в свободное место в конце страницы, оно переходит на следующую строку, но не отображается на следующей странице. Возможно, есть лучший способ сделать всю эту систему, а может быть, где-нибудь есть библиотека или готовый алгоритм. Я готов переписать все, если придется.
#define line_size 26
void open_book_page(String file_name, int page) {
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(0, 0);
File myFile = SD.open(file_name);
if (myFile) {
int space_left = line_size;
String current_word = "";
int page_space_debug = 0;
while (myFile.available()) {
char c = myFile.read();
// myFile.size() - myFile.available() gives the characters receieved until now
if(myFile.size() - myFile.available() >= page * 401 && myFile.size() - myFile.available() <= (page * 401) + 401) {
if(current_word.length() == space_left + current_word.length()) {
if(c == ' ') {
tft.print(current_word);
tft.println();
current_word = "";
space_left = line_size;
} else {
tft.println();
current_word += c;
current_word.remove(0, 1);
space_left = line_size - current_word.length();
}
} else {
if(c == ' ') {
tft.print(current_word);
current_word = c;
} else {
current_word += c;
}
space_left--;
}
}
}
if(current_word != "") {
if(space_left < current_word.length()) {
tft.println();
tft.print(current_word);
} else {
tft.print(current_word);
}
}
myFile.close();
} else {
tft.print("Error opening file.");
}
}
Если есть какие-либо вопросы, я бы с удовольствием ответил.
Я делаю это все это на плате stm32f103c8t6, а не на компьютере. Я ограничен памятью и емкостью хранения.
**
РЕШЕНИЕ! Я могу выполнить всю предварительную обработку в приложении для телефона, откуда я отправляю текст.
**