#include #include #include "src/list/src/list.h" /* typedef struct InfoState { char* info; int len; int fullLines; int Nlines; int lastlinelen; char *pos1, *pos2, *pos3; list_t* wrap; } InfoState; void initInfoState(InfoState* st, char* text) { st->info = text; st->len = strlen(text); st->fullLines = st->len / 15; st->Nlines = (st->len + 14) / 15; st->lastlinelen = st->len % 15; st->pos1 = text; st->pos2 = text; st->pos3 = text; st->wrap = list_new(); char* tmp = text; //list_node_t *c = list_rpush(st->wrap, list_node_new("c")); } void lcd_blank_line() { for (int i = 0; i < 15; ++i) { lcd.print(' '); } } void initInfoScreen(InfoState* st, char* text) { initInfoState(st, text); lcd.setCursor(0, 0); if (*(st->pos1) == '\n' || *(st->pos1) == '\r') { lcd_blank_line(); ++st->pos1; ++st->pos2; } else { st->pos2 += lcd_print_line(st->pos1); } lcd.setCursor(0, 1); if ((*(st->pos2) == '\n' || *(st->pos2) == '\r') && *(st->pos2 - 1) == *(st->pos2)) { lcd_blank_line(); } else { lcd_print_line(st->pos2); } #ifdef DEBUG //Serial.println(String("pos1: ") + st->pos1); //Serial.println(String("pos2: ") + st->pos2); Serial.println("init"); Serial.print(st->pos1-st->info); Serial.println(String(" ")+(st->pos2-st->info)); #endif } */ list_t* aux_gen_wrap_list(list_t* wrap, char* text) { if (wrap == NULL) { wrap = list_new(); } char* curr = text; int suf = 0; list_node_t *node; if (list_rpush(wrap, list_node_new(0)) == NULL) { return NULL; } while (*curr != '\0') { //printf("suf: %d\tpos: %d\n", suf, (unsigned int)(curr-text)); if (suf < 15) { if (*curr != '\n' && *curr != '\r') { ++suf; } else { if (list_rpush(wrap, list_node_new((unsigned int)(curr-text))) == NULL) { return NULL; } suf = 0; } } else { if (list_rpush(wrap, list_node_new((unsigned int)(curr-text))) == NULL) { return NULL; } suf = (*curr != '\n' && *curr != '\r') ? 1 : 0; } ++curr; } return wrap; } /* Separate a substring that can be printed on one line, and return the original string position corresponding to the end of the substring. */ /* char* aux_sub_line(char* str, char substr[16]) { int suf = 0; char* curr = str; memset(substr, 0, 16); while (*curr != '\0' && suf < 15) { if (*curr != '\n' && *curr != '\r') { substr[suf++] = *(curr++); //++curr; } else if (curr == str){ ++curr; } else { break; } } //#if !REFRESH while (suf < 15) { substr[suf++] = ' '; } //#endif return curr; } char* aux_sub_line_rev(char* str, char substr[16]) { int suf = 0; char* curr = str; memset(substr, 0, 16); while (*curr != '\0' && suf < 15) { if (*curr != '\n' && *curr != '\r') { substr[suf++] = *(curr--); } else if (curr == str){ --curr; } else { break; } } { int i = 0; int j = suf - 1; while (i < j) { char temp = substr[i]; substr[i] = substr[j]; substr[j] = temp; i++; j--; } } //#if !REFRESH while (suf < 15) { substr[suf++] = ' '; } //#endif return curr+1; } */ int main() { char* cinfo = "Far far away, a\n\nbehind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts."; list_t *wrap = list_new(); wrap = aux_gen_wrap_list(wrap, cinfo); list_node_t *node; list_iterator_t *it = list_iterator_new(wrap, LIST_HEAD); while ((node = list_iterator_next(it))) { printf("%d\n", (unsigned int)(node->val)); } /* if ((node = list_iterator_next(it))) { char* p = cinfo; list_node_t *test; while (*p != '\0') { //printf("node->val: %d\n", node->val); if (p - cinfo != node->val) { printf("%c", *p); //printf("%d %d\n", (unsigned int)(p - cinfo), (unsigned int)(node->val)); } else { printf("|\n"); if (*p != '\n' && *p != '\r') { printf("%c", *p); } if ((test = list_iterator_next(it))) { node = test; } } ++p; } } else { printf("%s", cinfo); } */ /* char line[16]; char* pos = aux_sub_line(cinfo, line); printf("%d\n%s\n", pos-cinfo, line); for (int i = 0; i < 4; ++i) { pos = aux_sub_line(pos, line); printf("%d\n%s\n", pos-cinfo, line); } for (int i = 0; i < 4; ++i) { pos = aux_sub_line_rev(pos-1, line); printf("%d\n%s\n", pos-cinfo, line); } */ list_iterator_destroy(it); list_destroy(wrap); return 0; }