#1 2020-03-23 02:09:21

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 52

Алгоритмы оптимизации вывода на дисплей

Возможно кто то решит, что здесь будет готовый код. Это не так. Я лишь хочу поделится своими находками в плане оптимизации вывода на не слишком шустрый дисплей.

Пример: вывод величины тока или напряжения на дисплей.
Есть несколько проблем:
1. величина может принимать отрицательные значения
2. количество знаков в значении может меняться как в большую так и в меньшую сторону. Из за чего отображаемое значение может быть некорректным

1я проблема решается использованием функции abs и рисованием или удалением в нужное время текстом знака минус"-".
2я проблема имеет несколько решений:
- перед каждым циклом отображения значения стирать строку пробелами. Не слишком изящное решение, так как дополнительный вывод пробелов отжирает оперативку на количество этих самых пробелов (не критично, если не часто и можно например выводить один пробел в цикле for), но работает медленно и видно как строка стирается и потом заполняется данными.
- перед каждым циклом отображения рисовать прямоугольник с цветом фона, работает более красиво, но все равно медленно, если нужно стереть много.
- самый удачный на мой взгляд вариант, это перед выводом на дисплей посчитать количество символов в значении и стирать любым из первых двух вариантов только лишние символы. Например величина тока была 1999 мА, а стала 888мА, то стереть нужно только место под четвертую цифру.
Нарыл 4 алгоритма как посчитать количество знаков числе. Как говорит автор - метод "сравнения" самый быстрый, а как по мне, так и самый простой для понимания, несмотря на длину кода.

Если у кого то есть еще варианты по оптимизации отображения, прошу поделится smile

Неактивний

#2 2020-03-23 14:15:31

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Алгоритмы оптимизации вывода на дисплей

" 1я проблема решается использованием функции abs и рисованием или удалением в нужное время текстом знака минус"-". "
===  очень вредное решение !!!

Неактивний

#3 2020-03-23 16:29:47

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Алгоритмы оптимизации вывода на дисплей

Бред какой-то. К любой библиотеке дисплея можно присобачить уже готовую в системе printf и выводить туда что и как надо.

Остання редакція Kaka (2020-03-23 23:23:33)

Неактивний

#4 2020-03-23 16:47:05

г0сть
Гість

Re: Алгоритмы оптимизации вывода на дисплей

Kaka пише:

Бред какой-то.

Согласен

#5 2020-03-24 00:28:44

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 52

Re: Алгоритмы оптимизации вывода на дисплей

г0сть пише:
Kaka пише:

Бред какой-то.

Согласен

Kaka предложил толковую идею, про которую я не знал, а вы могли бы предложить свою или воздержаться.
Покурил я printf - интересная вещица, ща сбацаю все хотелки  lol

Неактивний

#6 2020-03-24 06:58:55

Watchdog
Гість

Re: Алгоритмы оптимизации вывода на дисплей

luminofor пише:
г0сть пише:
Kaka пише:

Бред какой-то.

Согласен

Kaka предложил толковую идею, про которую я не знал, а вы могли бы предложить свою или воздержаться.
Покурил я printf - интересная вещица, ща сбацаю все хотелки  lol

Эта толковая идея - классика языка С, неизвестная разве что заядлым курильшикам, прогуливающим уроки. Я вот тоже хотел воздержаться, но передумал. Хочу также предложть вам свою идею, избавящую вас от позра. Не ленитесь читать учебники и справочники. И тогда на вас никто не станет "Какать"!

#7 2020-03-25 14:34:34

Batu
Учасник
З Харьков
Зареєстрований: 2017-11-08
Повідомлень: 301

Re: Алгоритмы оптимизации вывода на дисплей

Та идея очевидная и без учебников чисто из здравого смысла. Если полное изменение обходится дорого, то надо изменять только то, что нужно.

Неактивний

#8 2020-03-25 15:05:23

Watchdog
Гість

Re: Алгоритмы оптимизации вывода на дисплей

Batu пише:

Та идея очевидная и без учебников чисто из здравого смысла. Если полное изменение обходится дорого, то надо изменять только то, что нужно.

А зравый смысл окуда? Из учебников, писменных или неписьменных. Есть и другое очевидное. Создать производный (дочерний) класс от Print, переопределив вывод. Что в стиле Ардуино, будет даже красивше.  wink

#9 2020-03-25 18:03:12

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Алгоритмы оптимизации вывода на дисплей

Watchdog пише:

Что в стиле Ардуино, будет даже красивше.  wink

Не будет, к сожалению. Эти сцуки уже определили глобальную переменную Serial, и ей уже пофиг наши изменения в её родительских классах - ей их не подсунешь (не Питон и Яваскрипт чай. там такое запросто). Так что можно определить своё, но работать будет со всем, акромя предопределённого Serial'а, а это уже не так красиво.

Неактивний

#10 2020-03-25 18:33:08

Watchdog
Гість

Re: Алгоритмы оптимизации вывода на дисплей

Kaka пише:
Watchdog пише:

Что в стиле Ардуино, будет даже красивше.  wink

Не будет, к сожалению. Эти сцуки уже определили глобальную переменную Serial, и ей уже пофиг наши изменения в её родительских классах - ей их не подсунешь (не Питон и Яваскрипт чай. там такое запросто). Так что можно определить своё, но работать будет со всем, акромя предопределённого Serial'а, а это уже не так красиво.

Serial останется как сериал. Никуда от не денется. Как то так:

class GPrint : public Print
{
//...

public:
   GPrint(/*...*/);
//...

   virtual size_t write(uint8_t)
   {
       // your implementation
       // ...
    }
}

#11 2020-03-25 21:22:19

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Алгоритмы оптимизации вывода на дисплей

Ну, да. А сериал с этим работать не будет. А как раз об этом. Он же от родного Print, а не от нашего GPrint.

На самом деле, не так красиво (зато дешево и практично), можно присобачить потоки  ( << ) ко всему, в том числе и к встроенному сериалу.При помощи переопределения операции << для Print через внешнее переопределение (в сам Print лезть не надо). Тогда можно просто писать Serial << "n=" << n; Причём это как раз будет работать со всем, что от Print произведено.

Также можно присобачить printf к сериалу (или к чему угодно). Тоже удобно.

Остання редакція Kaka (2020-03-25 21:24:08)

Неактивний

#12 2020-03-25 22:17:38

Watchdog
Гість

Re: Алгоритмы оптимизации вывода на дисплей

Kaka пише:

Ну, да. А сериал с этим работать не будет. А как раз об этом. Он же от родного Print, а не от нашего GPrint.

На самом деле, не так красиво (зато дешево и практично), можно присобачить потоки  ( << ) ко всему, в том числе и к встроенному сериалу.При помощи переопределения операции << для Print через внешнее переопределение (в сам Print лезть не надо). Тогда можно просто писать Serial << "n=" << n; Причём это как раз будет работать со всем, что от Print произведено.

Также можно присобачить printf к сериалу (или к чему угодно). Тоже удобно.

Ну, авторитет printf непререкаем. А зачем Serial-у GPrint? Это же класс вывода на графисческий дисплей, наследник Print, как и Serial. А опреаторный ввод-вывод, да как и printf / scanf собственно, имеет  достаточно громоздкий механизм реализации, касательно маленьких микроконтроллеров.

#13 2020-03-26 07:39:04

Batu
Учасник
З Харьков
Зареєстрований: 2017-11-08
Повідомлень: 301

Re: Алгоритмы оптимизации вывода на дисплей

Watchdog пише:
Batu пише:

Та идея очевидная и без учебников чисто из здравого смысла. Если полное изменение обходится дорого, то надо изменять только то, что нужно.

А зравый смысл окуда? Из учебников, писменных или неписьменных. Есть и другое очевидное. Создать производный (дочерний) класс от Print, переопределив вывод. Что в стиле Ардуино, будет даже красивше.  wink

Здравый смысл из здравого смысла и касается абсолютно всего нуждающегося в изменении.

Неактивний

#14 2020-03-26 08:47:57

Watchdog
Гість

Re: Алгоритмы оптимизации вывода на дисплей

Batu пише:
Watchdog пише:
Batu пише:

Та идея очевидная и без учебников чисто из здравого смысла. Если полное изменение обходится дорого, то надо изменять только то, что нужно.

А зравый смысл окуда? Из учебников, писменных или неписьменных. Есть и другое очевидное. Создать производный (дочерний) класс от Print, переопределив вывод. Что в стиле Ардуино, будет даже красивше.  wink

Здравый смысл из здравого смысла и касается абсолютно всего нуждающегося в изменении.

Под здравым смыслом мы понимаем то мировозрение которое усвоили в течении жизни и считаем верным, т.е. здравым, а не больным. Здравый смысл может быть очень разным у различных нездравых умов, самовольно и неправильно мыслящих.  cool Но что из слушать - больных; лечить из надо!  lol

#15 2020-03-26 10:27:09

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Алгоритмы оптимизации вывода на дисплей

Watchdog пише:

А зачем Serial-у GPrint? Это же класс вывода на графисческий дисплей, наследник Print, как и Serial.

Было использовано слово "красиво". Мои представления о красоте - это когда простое изменение работает для всего, в т.ч. и для Serial.

Watchdog пише:

А опреаторный ввод-вывод, да как и printf / scanf собственно, имеет  достаточно громоздкий механизм реализации, касательно маленьких микроконтроллеров.

Сначала про операторный вывод ... кто Вам сказал. что у него какой-то особый, громоздкий механизм реализации? Вас жестоко обманули! Сравните ресурсы (а если хотите, то ассемблерный код) вот этих двух скетчей и знайте, что использование потокового вывода не стоит ровным счётом ничего!

void setup(void) {
	Serial.begin(115200);
	Serial.print("Quae est ad aliquid");
}

void loop(void) {}
template <typename T> inline Print & operator << (Print &s, T n) { s.print(n); return s; }

void setup(void) {
	Serial.begin(115200);
	Serial << "Quae est ad aliquid";
}

void loop(void) {}

Ну, а про printf. Это общие слова. Любое решение чего-нибудь стоит в плане ресурсов. Потому говорить "вообще" без указания задачи - сотрясание воздуха. Из тех задач для МК, которые я видел и которые делал, в 95% случаев ресурсов за глаза хватает в т.ч. и для printf. А если хватает - чего париться? Используем то, что удобно.

Остання редакція Kaka (2020-03-26 10:28:42)

Неактивний

#16 2020-03-26 10:54:40

Watchdog
Гість

Re: Алгоритмы оптимизации вывода на дисплей

Kaka пише:
Watchdog пише:

А зачем Serial-у GPrint? Это же класс вывода на графисческий дисплей, наследник Print, как и Serial.

Было использовано слово "красиво". Мои представления о красоте - это когда простое изменение работает для всего, в т.ч. и для Serial.

Watchdog пише:

А опреаторный ввод-вывод, да как и printf / scanf собственно, имеет  достаточно громоздкий механизм реализации, касательно маленьких микроконтроллеров.

Сначала про операторный вывод ... кто Вам сказал. что у него какой-то особый, громоздкий механизм реализации? Вас жестоко обманули! Сравните ресурсы (а если хотите, то ассемблерный код) вот этих двух скетчей и знайте, что использование потокового вывода не стоит ровным счётом ничего!

void setup(void) {
	Serial.begin(115200);
	Serial.print("Quae est ad aliquid");
}

void loop(void) {}
template <typename T> inline Print & operator << (Print &s, T n) { s.print(n); return s; }

void setup(void) {
	Serial.begin(115200);
	Serial << "Quae est ad aliquid";
}

void loop(void) {}

Ну, а про printf. Это общие слова. Любое решение чего-нибудь стоит в плане ресурсов. Потому говорить "вообще" без указания задачи - сотрясание воздуха. Из тех задач для МК, которые я видел и которые делал, в 95% случаев ресурсов за глаза хватает в т.ч. и для printf. А если хватает - чего париться? Используем то, что удобно.

Я больше не буду сторясать воздух, Кака. Но на последок скажу. Во первых, речь не о том чем вы блеснули. Во вторых, в микроконтроллерах приходится считать байты, расходуемые на удобства. А в третьих, задача определмима со слов автора; речь идет о выводе форматированных данных на графический дисплей. Не какайте, пожалуйста, всем на голову, для этого существуют специальные места.

#17 2020-03-26 11:06:26

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Алгоритмы оптимизации вывода на дисплей

Понятно, то, что приведённые коды идентичны по ресурсам и не отличаются ни на один байт, Вы проверили, убедились, но признать ошибку - не по-пацански. Знакомая позиция.

Неактивний

#18 2020-03-26 11:14:50

Watchdog
Гість

Re: Алгоритмы оптимизации вывода на дисплей

Kaka пише:

Понятно, то, что приведённые коды идентичны по ресурсам и не отличаются ни на один байт, Вы проверили, убедились, но признать ошибку - не по-пацански. Знакомая позиция.

Да, если это просто синтаксический сахар. Что касается боле содержательных конструкций то все не так однозначно. Вы правы, я пацан для Бьёрна Страуструпа, но в этом деле кое-чего да смыслю. Это не позиция, а мировозрение, присобаченное. lol

#19 2020-03-26 14:00:39

Batu
Учасник
З Харьков
Зареєстрований: 2017-11-08
Повідомлень: 301

Re: Алгоритмы оптимизации вывода на дисплей

Watchdog пише:

Под здравым смыслом мы понимаем то мировозрение которое усвоили в течении жизни и считаем верным, т.е. здравым, а не больным. Здравый смысл может быть очень разным у различных нездравых умов, самовольно и неправильно мыслящих.  cool Но что из слушать - больных; лечить из надо!  lol

Я не пойму к чему ты прицепился, потому повторюсь подробнее..
"Если полное изменение обходится дорого, то надо изменять только то, без изменения чего нельзя обойтись."

Остання редакція Batu (2020-03-26 14:01:15)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму