diff options
-rw-r--r-- | lcd.c | 91 |
1 files changed, 29 insertions, 62 deletions
@@ -18,81 +18,43 @@ char LCD_Data[LCD_rows][LCD_cols]; /* shadow copy of LCD display in local RAM, t static void break_up_string (char *in_string, int N, char **str1, char **str2, char **str3) { + gchar** words = g_strsplit(in_string, " ", -1); -#define SUBSTRING_CNT 3 + GString* rows[3]; + rows[0] = g_string_new(NULL); + rows[1] = g_string_new(NULL); + rows[2] = g_string_new(NULL); - int input_length; - int j, k, copypos; - int n; + int row = 0; + int col = 0; + gchar** word; - char *copy_input; - char *p; + for (word = words; *word != NULL; word++) { + int wordlen = strlen(*word); - j=k=copypos=0; - input_length=strlen(in_string); - copy_input = g_strdup(in_string); + if (col + wordlen > N) { + col = 0; + row++; + } - for (j=0; j<SUBSTRING_CNT; j++) { + if (row < 3) { + g_string_append(rows[row], *word); - gchar *interm_str = g_strnfill (N, 0); + col += wordlen; - for (k=0; k<N; k++) { - copypos++; // next symbol - if (copypos>input_length) { - break; - } - if ((*(copy_input+k)==' ')&&(copypos<input_length)) { // space found - //find next space - p=strchr(copy_input+k+1,' '); - if (p!=NULL) { - // next space is beyond N char limit for one line - if((p-copy_input)/sizeof(char)>=N) { - break; - } - } else { - // No more spaces. Does the last chunk of text fit? - if (strlen(copy_input+k+1)>N-k) { - break; - } - } + if (col != 0 && (col + 1) < N) { + g_string_append(rows[row], " "); + col++; } - // valid character, copy to output string - *(interm_str+k)=*(copy_input+k); - } - // remove processed part from the input - if (copypos<=input_length) { - strcpy(copy_input, in_string+copypos); - } - n = strlen(interm_str); - for ((k=n-1); (k=0); k--) { //trim space - if (*(interm_str+k)==' ') { - *(interm_str+k)=0; - } else { - break; - } - } - switch (j) { - case 0: - *str1 = g_strdup(interm_str); - break; - case 1: - *str2 = g_strdup(interm_str); - break; - case 2: - *str3 = g_strdup(interm_str); - break; - } - g_free(interm_str); - } - - g_free(copy_input); + *str1 = g_string_free(rows[0], FALSE); + *str2 = g_string_free(rows[1], FALSE); + *str3 = g_string_free(rows[2], FALSE); + g_strfreev(words); } - - void LCD_clear() { int i; @@ -153,6 +115,11 @@ static void LCD_RAM_write(int RAM_start,int row, int col, char *LCD_string) enable_one_lcd=0x01; } + // bounds check + if ((cur_row >= LCD_rows) || (cur_col >= LCD_cols)) { + break; + } + if (LCD_string[i]!=LCD_Data[cur_row][cur_col]) { if (!last_op_a_write) { /* move to new position */ |