Инверсия текста на LCD5110 с библиотекой LCD5110_Graph.h

Semka_2005
Offline
Зарегистрирован: 15.06.2017

Доброго времени суток!

Всем известкая библиотека "LCD5110_Graph.h" имеет функцию инверсии текста. Выглядит она так:

myGLCD.invertText(true);  - Функция ВКЛючает инверсию текста 

myGLCD.invertText(false); - Функция ВЫКЛючаетинверсию текста 

Особенность этой инверсии в том, что любой текст, помещенный после функции myGLCD.invertText(true) + любое количество строк с текстом будут инвертироваться до тех пор пока не будет вставленна функция myGLCD.invertText(false). Это меня крайне не устраивает, так как при создании меню на LCD5110 я полузуюсь этими функциями чтобы обозначить в каком месте на экране мы находимся и какое значение меняем.

В связи с особенностью этой инверсии приходится много раз дублировать одни и те же надписи и строки для понятного отображения на дисплее. Это приводит к транжирству драгоценной памяти в МК. 

Вот кусок примера который который демонстрирует как это дело выглядит.

void loop()
{
if (value < 3) {value = 0;}
  myGLCD.clrScr();                                  //Очистка экрана
  myGLCD.drawLine(0, 9, 83, 9);                     //Рисует линию
  myGLCD.print("Intervals Set", CENTER, 1);         //Выводим внизу на дисплей LCD5110 "Interval" 
   if (value == 0) {
    myGLCD.invertText(true);                           //Вкл. инвертиртный текст
  myGLCD.print("Interval 1   ", LEFT, 11);        //Выводим внизу на дисплей LCD5110 "Interval 1"
    myGLCD.invertText(false);                           //Выкл. инвертиртный текст
  myGLCD.print("Interval 2   ", LEFT, 20);        //Выводим внизу на дисплей LCD5110 "Interval 2" 
  myGLCD.print("Interval 3   ", LEFT, 30);        //Выводим внизу на дисплей LCD5110 "Interval 3" 
  myGLCD.print("Interval 4   ", LEFT, 40);        //Выводим внизу на дисплей LCD5110 "Interval 4" 
  }
  else if (value == 1) {
  myGLCD.print("Interval 1   ", LEFT, 11);        //Выводим внизу на дисплей LCD5110 "Interval 1"
     myGLCD.invertText(true);                           //Вкл. инвертиртный текст
  myGLCD.print("Interval 2   ", LEFT, 20);        //Выводим внизу на дисплей LCD5110 "Interval 2" 
    myGLCD.invertText(false);                           //Выкл. инвертиртный текст
  myGLCD.print("Interval 3   ", LEFT, 30);        //Выводим внизу на дисплей LCD5110 "Interval 3" 
  myGLCD.print("Interval 4   ", LEFT, 40);        //Выводим внизу на дисплей LCD5110 "Interval 4" 
  }
  else if (value == 2) {
  myGLCD.print("Interval 1   ", LEFT, 11);        //Выводим внизу на дисплей LCD5110 "Interval 1"
  myGLCD.print("Interval 2   ", LEFT, 20);        //Выводим внизу на дисплей LCD5110 "Interval 2" 
     myGLCD.invertText(true);                           //Вкл. инвертиртный текст
  myGLCD.print("Interval 3   ", LEFT, 30);        //Выводим внизу на дисплей LCD5110 "Interval 3" 
    myGLCD.invertText(false);                           //Выкл. инвертиртный текст
  myGLCD.print("Interval 4   ", LEFT, 40);        //Выводим внизу на дисплей LCD5110 "Interval 4" 
    }
  else if (value == 3) {
  myGLCD.print("Interval 1   ", LEFT, 11);         //Выводим внизу на дисплей LCD5110 "Interval 1"
  myGLCD.print("Interval 2   ", LEFT, 20);         //Выводим внизу на дисплей LCD5110 "Interval 2" 
  myGLCD.print("Interval 3   ", LEFT, 30);         //Выводим внизу на дисплей LCD5110 "Interval 3" 
    myGLCD.invertText(true);                           //Вкл. инвертиртный текст
  myGLCD.print("Interval 4   ", LEFT, 40);         //Выводим внизу на дисплей LCD5110 "Interval 4" 
    myGLCD.invertText(false);                           //Выкл. инвертиртный текст
  }
    if (value > 3) {value = 0;}
  myGLCD.update();                                 //Выгружаем из буфера в микроконтроллер
}
}

Подскажите идеи как перепахать в библиотеке эту функцию, чтобы это выглядило так:

myGLCD.invertText("Interval 4 ", LEFT, 40);

и после этого я например мог бы писать:

myGLCD.print("Interval 3 ", LEFT, 30);  

А вот так выглядит сама функция в библиотеке:

void LCD5110::invertText(bool mode)
{
	if (mode==true)
		cfont.inverted=1;
	else
		cfont.inverted=0;
}

 

b707
Offline
Зарегистрирован: 26.05.2017

что мешает написать функцию с этими тремя операторами? причем не в библиотеке, а прямо в скетче?

myGLCD.invertText(true);                           
myGLCD.print("Interval 1   ", LEFT, 11);       
myGLCD.invertText(false);

 

Semka_2005
Offline
Зарегистрирован: 15.06.2017

Видимо или я не четко обозначил проблему или вы не внимательно прочитали. 

Такой конструкцией я и пользуюсь но не в отдельной функции. Но это не удобно даже если вынести это в отдельную функци, не дает универсальности и тратит драгоценную память так как приходится задваивать и затраивать и т.д. текст который лаконично мог бы усаживаться в одной функции. Смотрите пример. Там именно так как вы пишите но без функции. Но строк у меня 4 в этом меню. Из-за такой конструкции мне приходется вызывать аж 4 раза одну и туже функцию с одним и тем же текстом. +  текс разный может быть. Это все равно что еще 4 страницы написать на LCD5110

Если я правильно понимаю, то доп функция не уменьшит объем памяти в этом случае. Да и слова могут быть разними. Не только Interval. 

А может я не понимаю что вы хотите мне сказать или не правильно пользую эти функции. 

Semka_2005
Offline
Зарегистрирован: 15.06.2017

Я так понимаю требуется "склеить" функцию:

void LCD5110::invertText(bool mode)
{
	if (mode==true)
		cfont.inverted=1;
	else
		cfont.inverted=0;
}

с одной из... в библиотеке:

void LCD5110::invertText(bool mode)
{
	if (mode==true)
		cfont.inverted=1;
	else
		cfont.inverted=0;
}

void LCD5110::print(char *st, int x, int y)
{
	unsigned char ch;
	int stl;

	stl = strlen(st);
	if (x == RIGHT)
		x = 84-(stl*cfont.x_size);
	if (x == CENTER)
		x = (84-(stl*cfont.x_size))/2;

	for (int cnt=0; cnt<stl; cnt++)
			_print_char(*st++, x + (cnt*(cfont.x_size)), y);
}

void LCD5110::print(String st, int x, int y)
{
	char buf[st.length()+1];

	st.toCharArray(buf, st.length()+1);
	print(buf, x, y);
}

void LCD5110::printNumI(long num, int x, int y, int length, char filler)
{
	char buf[25];
	char st[27];
	boolean neg=false;
	int c=0, f=0;
  
	if (num==0)
	{
		if (length!=0)
		{
			for (c=0; c<(length-1); c++)
				st[c]=filler;
			st[c]=48;
			st[c+1]=0;
		}
		else
		{
			st[0]=48;
			st[1]=0;
		}
	}
	else
	{
		if (num<0)
		{
			neg=true;
			num=-num;
		}
	  
		while (num>0)
		{
			buf[c]=48+(num % 10);
			c++;
			num=(num-(num % 10))/10;
		}
		buf[c]=0;
	  
		if (neg)
		{
			st[0]=45;
		}
	  
		if (length>(c+neg))
		{
			for (int i=0; i<(length-c-neg); i++)
			{
				st[i+neg]=filler;
				f++;
			}
		}

		for (int i=0; i<c; i++)
		{
			st[i+neg+f]=buf[c-i-1];
		}
		st[c+neg+f]=0;

	}

	print(st,x,y);
}

Но не понимаю как это сделать

b707
Offline
Зарегистрирован: 26.05.2017

Semka_2005 пишет:

Если я правильно понимаю, то доп функция не уменьшит объем памяти в этом случае. Да и слова могут быть разними. Не только Interval. 

А может я не понимаю что вы хотите мне сказать или не правильно пользую эти функции. 

пока вы не написали фразы, что я выше выделил - я думал, вы понимаете. Теперь вижу. что нет :(

Функцию, ЕСТЕССТВЕННО, надо писать так, чтобы она принимала фразу. направление текста и положение КАК ПАРАМЕТРЫ. Тогда вы сможете ее использовать по всему скетчу, заменив ею бесконечные вызовы этих трех строк.

Semka_2005
Offline
Зарегистрирован: 15.06.2017

b707 пишет:

Semka_2005 пишет:

Если я правильно понимаю, то доп функция не уменьшит объем памяти в этом случае. Да и слова могут быть разними. Не только Interval. 

А может я не понимаю что вы хотите мне сказать или не правильно пользую эти функции. 

пока вы не написали фразы, что я выше выделил - я думал, вы понимаете. Теперь вижу. что нет :(

Функцию, ЕСТЕССТВЕННО, надо писать так, чтобы она принимала фразу. направление текста и положение КАК ПАРАМЕТРЫ. Тогда вы сможете ее использовать по всему скетчу, заменив ею бесконечные вызовы этих трех строк.

Спасибо. я попробую это сделать. А как с объемом памяти? Он уменьшится?

Я правильноВас понял? Если я наделаю максимально допустимые слова в отдельные функции по вашему примеру, то это уменьшит объем расходуемой памяти МК и уменьшит размер писанины одной страницы?

b707
Offline
Зарегистрирован: 26.05.2017

не надо ничего склеивать. Пока вы плохо разбираетесь вообще, что такое функция - не лезте в библиотеку.

Придется все-таки дать вам готовый код, хотя это и не в правилах этого форума. Добавьте эту функцию куда-нибудь в скетч, лучше в начало, перед setup()

void InvertedText(char *st, int x, int y)
{
  myGLCD.invertText(true);              
  myGLCD.print(st, x ,y);       
  myGLCD.invertText(false);
}

Использование: вместо кода

myGLCD.invertText(true);                 
myGLCD.print("Interval 1   ", LEFT, 11);    
 myGLCD.invertText(false); 

вызываем


  InvertedText("Interval 1   ", LEFT, 11);      

 

b707
Offline
Зарегистрирован: 26.05.2017

Semka_2005 пишет:

Если я наделаю максимально допустимые слова в отдельные функции по вашему примеру, то это уменьшит объем расходуемой памяти МК и уменьшит размер писанины одной страницы?

похоже, вы опять ничего не поняли. Какие "допустимые слова", какие "отдельные функции"???? ОДНА ФУНКЦИЯ из трех строк.

Вппрочем, я уже написал вам готовое.

Semka_2005
Offline
Зарегистрирован: 15.06.2017

b707 пишет:

Semka_2005 пишет:

Если я наделаю максимально допустимые слова в отдельные функции по вашему примеру, то это уменьшит объем расходуемой памяти МК и уменьшит размер писанины одной страницы?

похоже, вы опять ничего не поняли. Какие "допустимые слова", какие "отдельные функции"???? ОДНА ФУНКЦИЯ из трех строк.

Вппрочем, я уже написал вам готовое.

Это сообщение я написал до получения готового решения от Вас, уважаемый b707. 

Спасибо Вам за терпение и за готовое решение.