Как написать алгоритм, который получает символы один за другим и отображает их в виде книги со страницами? - PullRequest
0 голосов
/ 23 апреля 2020

Мой код в настоящее время получает символы книги по одному и обрабатывает их так, чтобы он отображался в виде:

Я пошел в библиотеку
, чтобы взять
моя любимая
бейсбольная шляпа

вместо

Я отправился в искусство 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, ​​а не на компьютере. Я ограничен памятью и емкостью хранения.

**

РЕШЕНИЕ! Я могу выполнить всю предварительную обработку в приложении для телефона, откуда я отправляю текст.

**

1 Ответ

0 голосов
/ 23 апреля 2020

Отсутствие платы stm32f103c8t6 или какого-либо другого способа отладки вашего точного кода, который я могу дать, - это решение с псевдокодом.

если вы предварительно обработаете файл так, чтобы каждая «страница» представляла собой ровно столько символов, сколько вы можете поместившись на экране (заполняя конец каждой строки пробелами), вы сможете использовать номер страницы в качестве смещения в файле.

#define line_size 26
// line_size * 4 lines?
#define page_size 104

void open_book_page(String file_name, int page){
    File myFile = SD.open(file_name);

    if( myFile.available() ){
        if( myFile.seek(page * page_size) ){
            // read page_size characters and put on screen
        }
        myFile.close();
    }
}

Надеюсь, это достаточно полезно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...