Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться с ГУЯми.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
zheka
Господа требуется совет.
Осваиваю STM32F. Есть платка китайская - MINI-STM32 V3.0. С дисплеем на контролере ILI9230. Когда она приехала, на ней была установлена демка от Micrium. А на прилагаемом диске исходников не оказалось. На мой вопрос о библиотеках распространитель ответил: "Хрен...".

Порыскал я в интернете в поисках ГУЕв. Набрел на страницу http://makesystem.net/?p=457.

Красота, да все платное.
Да и в структуру всего этого я не въехал из-за отсутствия опыта, наверное.
В описаниях указаны типы дисплеев, типы платформ и типы камней, с которыми эти библиотеки совместимы, однако в исходниках я так и не нашел участков кода, отвечающих за низкоуровневую работу с дислпеями. Ну или хотя бы шаблоны, куда можно дописать эти функции под конкретный дисплей... В прилагающихс примерах есть файлы проектов под Visual C.... Можно ли это как-то пересобрать под KEIL - непонятно... Да и обещанные конструкторы форм я нашел только в одном из этих ГУЕв. В общем, в обилии информации я вчера утонул..

Порекомендуйте пожалуйста какие-нибудь бесплатные библиотеки, если таковые имеются, которые можно без труда запустить в связке KEIL+STM32F+ILI9230 (контроллер дисплея).
Чисто внешне из перечисленного в ссылке мне конечно понравился PEG Pro, но он, гад, платный.
AlexandrY
Цитата(zheka @ Jul 25 2012, 10:34) *
Порекомендуйте пожалуйста какие-нибудь бесплатные библиотеки, если таковые имеются, которые можно без труда запустить в связке KEIL+STM32F+ILI9230 (контроллер дисплея).


Почему-то проигнорировали .NET Micro Framework
А ведь там лучший графический построитель основанный на Visual Studio, а главное бесплатный.

А с Segger-ом ввели в заблуждение.
Показанный скриншот с примером графика в построителе сегера сделать невозможно.

Но зато построитель GUIBuilder абсолютно совместим с ucGUI которую тут много раз выкладывали и которою тоже в той статье не упомянули.
zheka
ucGUI я скачал.
Структура папок в ней абсолютно идентична одному из тех что есть в статье, кажется Segger.

Я не могу понять, без Visual Studio никак не обойтись?

Может я хочу слишком легкого пути, но я представляю себе это следующим образом: набор исходников, которые можно прикрепить к проекту (в частности к Keil), в этих исходниках есть функции типа LCDInit, LCD_PutPixel и пр, которые дописываются ручками в зависимости от конкретного дисплея. Ну и приложение типа GUIBuilder, в котором редактируешь форму, а на выходе код.
В приведенном списке что-то похоже было, но она полностью платная.
ucGUI по этому принципу построена?


Если я правильно понял, то ucGUI - это наиболее распространенная рабочая лошадка. Ее стоит освоить хотя бы из-за того, что по ней много информации? Мне особых выкрутаосв с графикой не надо.

Ткните носом, где ее качать?
Тут искал - там только uc-OS
http://micrium.com/page/downloads/ports/st/stm32
aT-DeviLru
Исходные коды демки с ucGUI и uCOS-II (плюс куча других примеров) для отладочной платы POWERAVR-HY-mini-STM32F103VCT6 - http://182.50.148.34/download/boardata/POW...M32F103VCT6.zip.
AlexandrY
Цитата(aT-DeviLru @ Jul 25 2012, 14:11) *
Исходные коды демки с ucGUI и uCOS-II (плюс куча других примеров) для отладочной платы POWERAVR-HY-mini-STM32F103VCT6 - http://182.50.148.34/download/boardata/POW...M32F103VCT6.zip.


Хм, китайцы молодцы. wink.gif
Аккуратно вычистили все драйвера и подсунули старую версию. Таких на pudn.com во всех вариантах найти можно.
GUIBuilder будет с ней не совсем совместим.
zheka
Скачал....

ПОпробовал запустить ucOS+ucGUI -видимо памяти в камне не хватило (у меня STM32F103RBT6).

Нашел папку GLCD. Все скомпилировалось отлично. Но при запуске отладчика вылазит окошко "Error: flash download failed - "Сortex M3"

Что делать и кто виноват?
_Артём_
Цитата(zheka @ Jul 25 2012, 18:43) *
Что делать и кто виноват?

А вообще что-нибудь зашить удаётся?
В последние времы часто попадаются сообщения на тему глюков-недоработок в Keil, IAR-е, ST-Link-e (может прошивальщик надо обновить или наоборот) и тп.
Может у вас такой случай.
zheka
Да, зашивается. И запускается.
ПРоект правда под V серию, чип в настройкая я поменял и сделал Rebuild target. При этом компилится даже без Warings, значит дело не в левом чипе.

Артем, у вас есть куда попробовать зашить? Если есть время попробуйте

Скомпилировал дургой проект - тоже компилит и линкует нормально, а вот при отладке пишет "No Algorithm found for: 08000000H - 08002FF7H"

ПРичем в обоих случайх когда убираешь из main() все кроме SystemInit() - чип шьется.

Хорошие библитеки, но эти гре...е комментарии на китайском....

У меня клон J-Link 7 если что. Cortex M3 поддерживают.
_Артём_
Цитата(zheka @ Jul 25 2012, 20:05) *
ПРоект правда под V серию, чип в настройкая я поменял и сделал Rebuild target. При этом компилится даже без Warings, значит дело не в левом чипе.
Скомпилировал дургой проект - тоже компилит и линкует нормально, а вот при отладке пишет "No Algorithm found for: 08000000H - 08002FF7H"

Настройки Options - Debug - Flash Download меняли?
По ссылке ссылка похожие симптомы описываются.
zheka
Артем, спасибо, информация по ссылке помогла. Все запускается, но не работает пока. В библиотеке дисплей рулится через FSMC, а у меня на плате похоже даже разводка под это не заточена. В одной их китаезных низкоуровненвых библиотек, что я раздобыл там обычный ногодрыг.

Если я ucGUI переделаю на ногодрыг, какие нибудь подводные камни ожидаются?
grand1987
.. можете попробовать GUI от ST Microelectronics. Вот небольшой туториал по нему http://www.emcu.it/STM32/Embedded-GUIandTO...UIandTOUCH.html , правда я с ним не имел дела
kan35
Я в это теме http://electronix.ru/forum/index.php?showtopic=94313 выложил универсальный проект (SPI и FMC).
SeregaB
Цитата(zheka @ Jul 25 2012, 19:43) *
(у меня STM32F103RBT6).
В библиотеке дисплей рулится через FSMC,


У 64 выводных корпусов нет FSMC. sm.gif Ногодрыг или SPI (если поддерживает экран) помогут.
zheka
Цитата(kan35 @ Jul 26 2012, 10:06) *
Я в это теме http://electronix.ru/forum/index.php?showtopic=94313 выложил универсальный проект (SPI и FMC).


Спасибо за ссылку.
zheka
Чертовы китайцы... они не предусмотрели в разводке дисплейной платы управление дисплеем по SPI..
kan35
Я скачал схему на вашу пату отсюда https://sites.google.com/site/ministm32/
Там SPI присутствует. Правда SPI1 а не SPI3 под который меня все было сделано. Но поменять порт и канал DMA не так уж долго. Если SPI не разведен, то его не так долго и прогинуть проводами.
zheka
kan35, я тоже эту схему откуда-то скачивал.
Вы где увидели SPI? На разъеме TFT ? Так это не к дисплею а к переходной плате дисплея. На ней еще контрллер тачскрина и разъем SD карты напаяны.


Вопрос есть. Читал доку на ILI9320, там про SPI написано. Но неясно - они сидят на отдельных выводах дисплея или там есть многофункциональные выводы.... по поиску по маркировке дисплея ничего не нашлось. Подохреваю, что устроены однотипно. КТо-нибудь, кто имел опыт с ILI9320, может прояснить ситуацию?

Второй вопрос - а быстро ли по SPI? Параллельным интерфейсом ногодрыгом (50МГц) не быстрее будет?
kan35
Ну у меня есть опыт же:-) SPI на дисплее отдельный, если у вас он не подведен к самому контроллеру ILI9320, то остается по GPIO управлять. В таком случае смотрите как сделано в таргете FSMC и делайте по аналогии.
паралельно по GPIO будет может и побыстрее (нужно пробовать), чем SPI, но ресурсов уйдет много. Потому что ни о каком DMA говорить не приходится.
Лично мне очень понравилось подключение по SPI - скорость 18мбит вполне достаточно чтобы комфортно отрисовывать окошки, а на STM32F4 при 40МГц можно и видео гонять (320*240*16 24fps).
zheka
Вот тема http://electronix.ru/forum/index.php?showtopic=104442 с дисплеем почти таким же как у меня.
Где там выводя для SPI?
А я видел такие же схемы в разных уголках интернета.

kan35
Попробовал скомпилировать вашу библиотеку в IAR 6.30.1, выдает ошибку
Error[Pe147]: declaration is incompatible with "__interwork __softfp unsigned long __get_PSP(void)" (declared at line 52 of "D:\IAR\arm\inc\c\intrinsics.h") C:\Users\Æåíåê\Desktop\Piter-C\Source\library\CM3\core_cm3.h 1084

Что делать и кто виноват?
kan35
В опциях компилятора убрать строку $PROJ_DIR$\Files\Libraries\CMSIS\CM3\CoreSupport\ и включить "use CMSIS".

В плате STM3210C-EVAl стоит дисплей AM-240320D4TOQW-T00H® на контроллере ILI9320 и там SPI выведен.
zheka
Цитата
$PROJ_DIR$\Files\Libraries\CMSIS\CM3\CoreSupport\


Обыскался....
Хоть в каком она разделе?
C разделе C++Compiler\Preprocessor есть "$PROJ_DIR$\Source\library\CM3" Удалил ее - не помогло

Но ошибок меньше. Было 200, стало 37
kan35
Цитата(kan35 @ Jul 28 2012, 08:35) *
включить "use CMSIS".

Это надо тоже сделать. И ошибок не будет. Галка где то в основных настройках.
zheka
Блин, я включил "Use CMSIS" !!!
СТроку точно такую же не нашел, удалил похожую, число ошибок уменьшилось, но они не исчезли.
zheka
А fps при использовании SPI меряли?
kan35
Тонкости перехода:-) с 5 на 6 иар
Я попробовал у себя и рекомендую сделать так:
1. берете исходный проект
2. Находите и удалаяете файл core_cm3.h
3. Ставите галку "use CMSIS"
4. Должно работать

fps по SPI(18МГц): тест скорости заполнения из демки ucGUI давал что то около 830кпикс/с, то есть на 320*240 получается около 11 экранов в сек. Для окон - выше крыши.
zheka
Цитата
830кпикс/с


Ниче так... У меня 120 кпикс/с....

Блин... [CENSORED] китайцы, у меня слов нет...
Развели схему хуже некуда: 16 бит данных разбили пополам и на разные порты, в результате для запись в порт 16битного слова сгородили целую конструкцию...
Далее - каждую управляющую ногу они включают отдельной командой при прорисовке каждого пиксела.... например CS... на это уходит уйма времени.
Купил эту плат ради уверенности в чем-то... а теперь, чую, придется переделывать и перепаивать.
zheka
Цитата
Для окон - выше крыши.

Окошки - это хорошо. А вот допустим вывел я окошко, и захотел его убрать. Как восстанавливать то, что было за окошком? Есть какой-ниббудь способ кроме цепляния внешней памяти или использования экрана с видеостраницами?

Сделал как вы сказали - все равно не компилится - те же самые 37 ошибок.
Не могли бы вы выложить компилирующийся проект для 6 иара?
kan35
Piter-C6

Вообще говоря GUI сама занимается за подчисткой того, что было под окнами, позволяет даже таскать окна по экрану восстанавливая то, что под окнами. У меня демки работали на 64к RAM.
Я" советую купить плату от ST, в ней будет нормальный процессор (более подходящий под ucGUI) и человеческое подключение дисплея или по SPI или по FMSC.
zheka
kan35, все лучше и лучше! В проекте, что вы выложили уже всего 30 ошибок. И все ищет core_cm3.h

Цитата
Вообще говоря GUI сама занимается за подчисткой того, что было под окнами, позволяет даже таскать окна по экрану восстанавливая то


Вот такскать - понятно.
А целое окно? там наверное для всего экрана нужно 70 кб оперативки?
На STM32F4 наверное и без внешней памяти попрет да и картинки можно чисто во флеше хранить, грузиться будут мгновенно.
loreal1970
Ребята, каой пароль на этот архив.? Вставлял цифры из ссылки непрокатило.
zheka
stm32stm32 пароль
loreal1970
Сенкс! догадался, но поздно. Пора на море.
kan35
Цитата(zheka @ Jul 31 2012, 19:33) *
kan35, все лучше и лучше! В проекте, что вы выложили уже всего 30 ошибок. И все ищет core_cm3.h

Я только что проверил - полная перекомпиляция:
Total number of errors: 0
Total number of warnings: 48
IAR 6.30
zheka
Скомпилировалось. Я просто увлекся и удалил файл там где не надо.
zheka
Возвращаясь к SPI - вот даташит на дисплей - в упор не вижу, где в нем выведены линии SPI. Дисплей китайский, 12 баксов стоит, может там просто не разведен SPI?
http://electronix.ru/forum/index.php?showt...30&start=30
AndreyKar
Последние два года работал выдирая нужный исходный код из ГУИ. Требования все растут и растут... Думаю полностью перейти на emWin. С ней кто нибуть работал? Много рисурсов отжирает?
PanovAU
emWin смог прикрутить от NXP. Они ее бесплатно распространяют, правда уже в откомпилированном виде. Но STM это ведь тот же Cortex. Пришлось только дрова ему свои подсунуть (GUIDRV_CompactColor_16.C). Исходники дров переделывал из примеров от PSoC5/PSoC3. Я делал STM32F4 с внешним ОЗУ и соломоновским контроллером SSD1963. Динамика на 640х480 иногда подтормаживает, сказывается скорость обмена по мультиплексированной параллельной шине.

Недавно Томаш (представитель STM, который с семинарами ездит) сболтнул, что STишники тоже с Segger договариваются. И вероятно emWIN для тех кто работает на этом процессоре станет доступна легально и бесплатно. Я думаю, они это приурочат к выходу проца с TFT контроллером на борту и DDR (обещали такой).
jt777
Всем доброго времени суток. Я использую графику от Seggera (emWin). Что касается Micrium-а (ucGUI) это тот же самый сегер.
Что касается проекта emWin под Visual Studio, то этот проект сделан для отладки, причем довольно хорошей отладки( Пишу код в вижуале, смотрю что получается на экране отладчика потом этот же самый код уже заливаю в микроконтроллер). Довольно удобно при начале работы с либой.

Если использовать графику от сеггера (микриума) то низкоуровневыце функции нужно писать самому(я брал примеры и правил под свою плату). Для сеггера (микриума) есть драйвера для работы с дисплеем по SPI (см. доку) но низкоуровневые функции все равно нужно писать самому.
Кстати говоря где то я читал что Keil начал включать либу сеггера в свою MDK.

Что касается опыта работы с emWin в принципе либа неплохая, если не предъявлять к графике серьезных требований. Немного не доработан модуль Memory Device, из-за чего, при большом нагромождении виджетов видно как отрисовываеться окно и виджеты на нем. Также есть нарекания к дизайну самих виджетов, в основном писал свои Callback функции для прорисовки( требовалось "навести красоту")))). Писать Callback функции особой сложности не составляет, но в начале повозился пока разобрался что и как)))

Пользуюсь довольно долго (года 2 так точно). Проц LPC2478. Версия enWin 3.90 - старая, но свежее не нашел. Пробовал скомпиленую либу которую парят NXP под свои процы, не понравилась- сильные тормоза, но особо копаться времени не было - возможно это можно вылечить, да и под кортексы возможно тормозов не будет.

Если необходимы исходники enWin 3.90 могу выложить.
MEXAHuK
Добрый день!

Тоже приобрел плату Mini-STM32-V3.0 c STM32F103RB и дисплеем 2.8" с контроллером ILI9320.
Такая же проблема, как и у zheka: 16-битная шина дисплейного контроллера раскидана пополам на два порта.
Если смотреть соответствия ног процессора битам шины по обозначениям на платах получается такая картина:

Бит шины->Бит порта

1 DB00->PC00
2 DB01->PC01
3 DB02->PC02
4 DB03->PC03
5 DB04->PC04
6 DB05->PC05
7 DB06->PC06
8 DB07->PC07

9 DB10->PB08
10 DB11->PB09
11 DB12->PB10
12 DB13->PB11
13 DB14->PB12
14 DB15->PB13
15 DB16->PB14
16 DB17->PB15

Таким образом, видно, что у контроллера дисплея задействованы биты DB0-DB7 и DB10-DB17.
Хотя, согласно даташиту на ILI9320, при 16-битном режиме передачи используются биты DB1-DB7 и DB10-DB17.
Я хотел изготовить переходник, чтобы повесить шину контроллера дисплея на один порт процессора, но вот теперь не знаю, как быть с несоответствием битов. Есть у кого нибудь соображения по этому поводу?
MEXAHuK
Извиняюсь, опечатался в предыдущем сообщении. Надо читать как:
"Хотя, согласно даташиту на ILI9320, при 16-битном режиме передачи используются биты DB1-DB8 и DB10-DB17."
khach
Подскажите пожалуйста, мне в предкомпиленном emWIN нехватает функциональности видгета graph. Типа нужны дополнительные курсоры и другие плюшки. Если с доп курсорами я надеюсь справится с помощью GRAPH_SetUserDraw- дорисовывать курсоры ручками, то для функционала типа логарифмической сетки или полярных координат требуется полностью переписать видгет. Смогу ли я скомпилить свой собственный видгет, например взяв за основу исходники того же Grap из ucGUI 3.98? Есть ли примеры от seggera реализации таких самописных видгетов?
бомж
Цитата(jt777 @ Sep 11 2012, 09:03) *
Если необходимы исходники enWin 3.90 могу выложить.


Выложите, пожалуйста, очень интересно.
jt777
Выкладываю две версии 3.9 и 3.98. В версии 3.98 не хватает некоторых модулей- 3.9 вроде бы полная. Если мне были необходимы виджеты или функции которых не хватет в версии 3.9 находил нужные файлы с функциями в версии 3.98 и добавлял из в проект. Что касается написания собственных виджетов то получалось написать самому взяв за основу стандартные. Но писал для самых простых виджетов: кнопой и скролбаров. Получалось довольно симпатично. С кнопками было довольно просто со скролбаром пришлось повозиться)).
khach
Спасибо, наконец все лежит в одном месте. А во поводу самописных виджетов вопрос- можно ли виджет, написанный "по мотивам" исходников 3.98 заставить работать с предкомпиленной версией emWIN из Кейла (4.16 кажется сейчас)? заголовочные h-файлы для LIBов есть. Можете ли поделится примером простейшего самописного виджета, чтобы это проверить?
jt777
>можно ли виджет, написанный "по мотивам" исходников 3.98 заставить работать с предкомпиленной версией emWIN из Кейла (4.16 кажется сейчас)
Не могу ответить на этот вопрос т.к не пробовал. Что касается самописного виджета то я довольствовался написанием собственной функции для отрисовки виджета. Код привожу ниже.

CODE


/*********************************************************************
*
* CallBackBut.c
*
*/
#include "GUI.h"
#include "WM.h"
#include "FRAMEWIN.h"
#include "BUTTON.h"
#include "BUTTON_Private.h"
#include "GUI_Protected.h"
#include "mystyle.h"

/*********************************************************************
*
* Defines
*
*/
#define Style_Dark_Blue 1
#define Style_Dark_Blue_1 1+1
#define Style_Light_Blue 3
#define Style_Light_Blue_1 3+1
#define Style_Silver 5
#define Style_Silver_1 5+1
#define Style_Yellow 7
#define Style_Yellow_1 7+1
#define Style_Red 9
#define Style_Red_1 9+1
#define Style_Green 11
#define Style_Green_1 11+1

#define BUTTON_FLASHING_ENABLE WIDGET_STATE_USER1
#define BUTTON_FLASHING_UP WIDGET_STATE_USER2




/*********************************************************************
*
* GetColorPalette
*
*/

static t_2Colors GetColorPalette(int _Style)
{
t_2Colors RetPalette;
switch (_Style)
{
case Style_Dark_Blue:
case Style_Dark_Blue_1:
RetPalette.Col_1=0xFFD192;
RetPalette.Col_2=0xFFB146;
break;
case Style_Light_Blue:
case Style_Light_Blue_1:
RetPalette.Col_1=0xFFF4E5;
RetPalette.Col_2=0xFFE8C9;
break;

case Style_Silver:
case Style_Silver_1:
RetPalette.Col_1=0xECECEC;
RetPalette.Col_2=0xCECECE;
break;

case Style_Yellow:
RetPalette.Col_1=0x86CDE8;
RetPalette.Col_2=0x22C0F1;
break;
case Style_Yellow_1:
RetPalette.Col_2=0x86CDE8;
RetPalette.Col_1=0x22C0F1;
break;
case Style_Red:
RetPalette.Col_1=0x0000ff;
RetPalette.Col_2=0x0000D9;
break;
case Style_Red_1:
RetPalette.Col_2=0x0000ff;
RetPalette.Col_1=0x0000D9;
break;
case Style_Green:
RetPalette.Col_1=0x3Dff3D;
RetPalette.Col_2=0x00D600;
break;
case Style_Green_1:
RetPalette.Col_2=0x3Dff3D;
RetPalette.Col_1=0x00D600;
default: // серый
RetPalette.Col_1=0xEAEAEA;
RetPalette.Col_1=0xEAEAEA;
break;
}
return RetPalette;
}

/*********************************************************************
*
* _WIDGET_EFFECT_3D_DrawDownRec
*
*/

static void _WIDGET_EFFECT_3D_DrawDownRect(const GUI_RECT* pRect) {
GUI_RECT r;
r = *pRect;
LCD_SetColor(0x0); /* TBD: Use halftone */
GUI_DrawHLine(r.y0, r.x0, r.x1);
GUI_DrawVLine(r.x0, r.y0 + 1, r.y1);
GUI_DrawHLine(r.y1, r.x0 + 1, r.x1);
GUI_DrawVLine(r.x1, r.y0 + 1, r.y1);
}

/*********************************************************************
*
* _WIDGET_EFFECT_3D_DrawDown
*
*/

static void _WIDGET_EFFECT_3D_DrawDown(void) {
GUI_RECT r;
WM_GetClientRect(&r);
_WIDGET_EFFECT_3D_DrawDownRect(&r);
}



/*********************************************************************
*
* _OnPaint_1
*
*/

#ifndef BUTTON_BKCOLOR0_DEFAULT
#define BUTTON_BKCOLOR0_DEFAULT 0xAAAAAA
#endif

static void _OnPaint(BUTTON_Handle hObj, int _Style,int Effect)
{
int Index;
const char* s = 0;
GUI_RECT Rect,rInside;
GUI_RECT Rect1;
GUI_RECT Rect2;
t_2Colors Palette;
int height;
BUTTON_Obj * pObj;
GUI_MEMDEV_Handle hMem;
pObj = BUTTON_H2P(hObj);
Index = (WIDGET_GetState(hObj) & BUTTON_STATE_PRESSED) ? 1 : 0;
WM_GetClientRect(&Rect);
if (pObj->hpText) {
s = (const char*) GUI_ALLOC_h2p(pObj->hpText);
}
Palette=GetColorPalette(_Style);

rInside=Rect;
Rect1=Rect;
height=Rect1.y1-Rect1.y0;
Rect1.y1=Rect1.y1-height/2;
Rect2=Rect;
Rect2.y0=Rect2.y0+height/2;


hMem=0;
if(hMem)
{
GUI_MEMDEV_Select(hMem);
}

WM_SetUserClipRect(&rInside);
if(WM__IsEnabled(hObj)) // Если кнопка включена
{
if(Index==0)// кнопка отжата
{
if ((pObj->Widget.State & BUTTON_FLASHING_ENABLE))
{
if ((pObj->Widget.State & BUTTON_FLASHING_UP))
{
Palette=GetColorPalette(_Style+1);
}
else
{
Palette=GetColorPalette(_Style);
}
}

GUI_SetColor(Palette.Col_1);
GUI_FillRect(Rect1.x0,Rect1.y0,Rect1.x1,Rect1.y1);
GUI_SetColor(Palette.Col_2);
GUI_FillRect(Rect2.x0,Rect2.y0,Rect2.x1,Rect2.y1);
}
else
{
GUI_SetColor(Palette.Col_2);
GUI_FillRect(Rect1.x0,Rect1.y0,Rect1.x1,Rect1.y1);
GUI_SetColor(Palette.Col_1);
GUI_FillRect(Rect2.x0,Rect2.y0,Rect2.x1,Rect2.y1);
}
if(_getbitL(Effect,__BORDER_DISABLE)==1)
{
if(Index==0)
{
WIDGET_EFFECT_3D_DrawUp();
}
else
{
_WIDGET_EFFECT_3D_DrawDown();
}
}
}
else
{
GUI_SetColor(BUTTON_BKCOLOR0_DEFAULT);
GUI_FillRect(Rect.x0,Rect.y0,Rect.x1,Rect.y1);
WIDGET_EFFECT_3D_DrawUp();
}

if(_getbitH(Effect,__IS_FOCUS)==1)
{
GUI_RECT Focus;
Focus.x0=Rect2.x0+__LEFT_OFFSET;
Focus.y0=Rect2.y1-__BOTTOM_OFFSET-__SIZE_FOCUS_LINE ;
Focus.x1=Rect2.x1-__RIGHT_OFFSET;
Focus.y1=Rect2.y1-__BOTTOM_OFFSET;
if((Focus.x0>0)&&(Focus.y0>0)&&(Focus.x1>0)&&(Focus.y1>0) && (Focus.x0<Focus.x1)&&(Focus.y0<Focus.y1))
{
GUI_SetColor(GUI_YELLOW);
GUI_FillRect(Focus.x0,Focus.y0,Focus.x1,Focus.y1);
}

}


GUI_SetColor(BUTTON_GetTextColor(hObj, Index));
GUI_SetFont(BUTTON_GetFont(hObj));
GUI_SetTextMode(GUI_TM_TRANS);
GUI_DispStringInRect(s, &rInside, pObj->Props.Align);
if(hMem)
{
GUI_MEMDEV_CopyToLCDAt(hMem, pObj->Widget.Win.Rect.x0,pObj->Widget.Win.Rect.y0);
GUI_MEMDEV_Delete(hMem);
}
WM_SetUserClipRect(0);
}


/*********************************************************************
*
* BUTTON_Callback_Dark_Blue
*
*/
void BUTTON_Callback_Dark_Blue(WM_MESSAGE *pMsg)
{
switch (pMsg->MsgId) {
case WM_PAINT:
_OnPaint(pMsg->hWin,Style_Dark_Blue,0); //<!!!!!!!!!!- самописная функция для отрисовки виджета
break;
default:
BUTTON_Callback(pMsg);
break;
}

}


далее в калбэк функции диалогового окна где используеться эта кнопка я подставляю свою калбэк функцию кнопки

CODE

static const GUI_WIDGET_CREATE_INFO _aDialogMainMenu[] = {
/* Function Text Id Px Py Dx Dy */
{ WINDOW_CreateIndirect, 0, 0, 0, 229, 480, 43,WM_CF_MEMDEV},
{ BUTTON_CreateIndirect, 0, GUI_ID_USER + 0, 2, 0, 83, 38},
{ BUTTON_CreateIndirect, 0, GUI_ID_USER + 1, 87, 0, 83, 38},
{ BUTTON_CreateIndirect, 0, GUI_ID_USER + 2, 172, 0, 83, 38},
{ BUTTON_CreateIndirect, 0, GUI_ID_USER + 3, 257, 0, 83, 38},
{ BUTTON_CreateIndirect, 0, GUI_ID_USER + 4, 342, 0, 83, 38},
{ BUTTON_CreateIndirect, 0, GUI_ID_USER + 5, 427, 0, 50, 38}

};


static void _cbDialogMainMenu(WM_MESSAGE * pMsg) {
WM_HWIN hDlg, hItem;
hDlg = pMsg->hWin;
switch (pMsg->MsgId) {
case WM_INIT_DIALOG:
hItem = WM_GetDialogItem(hDlg, GUI_ID_USER + 0); // получаю хэндл кнопки
WM_SetCallback(hItem, BUTTON_Callback_Dark_Blue); // устанавливаю свою калбэк функцию
break;

case WM_PAINT:
break;
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */
NCode = pMsg->Data.v; /* Notification code */
switch (NCode) {
case WM_NOTIFICATION_CLICKED: break;

case WM_NOTIFICATION_RELEASED: break;
}
break;


default:
WM_DefaultProc(pMsg);
}
}

}



Эта функция вместо стандартной кнопки отрисовывает кнопку разделенную по горизонтали пополам разными оттенками заданного цвета(в данном случае синим). При нажатии на кнопку оттенки меняются местами. Ну примерно так))). Для более полной информации покопайтесь на сайте сегера. Там, если я не ошибаюсь, были примеры написания собственных калбэк функций)))
бомж
Спасибо большое!
flopix
Есть у кого то пример как прикрутить этот GUI к связке STM32F4 + дисплей на контроллере SSD1289. В выложенных на предыдущей странице архивах в исходниках драйвер на этот дисплй не нашел, хотя на сайте Micrium он значится как поддерживаемый.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.