Jump to content

    

Помогите разобраться с ГУЯми.

kan35, все лучше и лучше! В проекте, что вы выложили уже всего 30 ошибок. И все ищет core_cm3.h

Я только что проверил - полная перекомпиляция:

Total number of errors: 0

Total number of warnings: 48

IAR 6.30

Edited by kan35

Share this post


Link to post
Share on other sites

Скомпилировалось. Я просто увлекся и удалил файл там где не надо.

Share this post


Link to post
Share on other sites

Возвращаясь к SPI - вот даташит на дисплей - в упор не вижу, где в нем выведены линии SPI. Дисплей китайский, 12 баксов стоит, может там просто не разведен SPI?

http://electronix.ru/forum/index.php?showt...30&start=30

2.8TP.zip

Share this post


Link to post
Share on other sites

Последние два года работал выдирая нужный исходный код из ГУИ. Требования все растут и растут... Думаю полностью перейти на emWin. С ней кто нибуть работал? Много рисурсов отжирает?

Share this post


Link to post
Share on other sites

emWin смог прикрутить от NXP. Они ее бесплатно распространяют, правда уже в откомпилированном виде. Но STM это ведь тот же Cortex. Пришлось только дрова ему свои подсунуть (GUIDRV_CompactColor_16.C). Исходники дров переделывал из примеров от PSoC5/PSoC3. Я делал STM32F4 с внешним ОЗУ и соломоновским контроллером SSD1963. Динамика на 640х480 иногда подтормаживает, сказывается скорость обмена по мультиплексированной параллельной шине.

 

Недавно Томаш (представитель STM, который с семинарами ездит) сболтнул, что STишники тоже с Segger договариваются. И вероятно emWIN для тех кто работает на этом процессоре станет доступна легально и бесплатно. Я думаю, они это приурочат к выходу проца с TFT контроллером на борту и DDR (обещали такой).

 

Share this post


Link to post
Share on other sites

Всем доброго времени суток. Я использую графику от Seggera (emWin). Что касается Micrium-а (ucGUI) это тот же самый сегер.

Что касается проекта emWin под Visual Studio, то этот проект сделан для отладки, причем довольно хорошей отладки( Пишу код в вижуале, смотрю что получается на экране отладчика потом этот же самый код уже заливаю в микроконтроллер). Довольно удобно при начале работы с либой.

 

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

Кстати говоря где то я читал что Keil начал включать либу сеггера в свою MDK.

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

Добрый день!

 

Тоже приобрел плату 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.

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

Share this post


Link to post
Share on other sites

Извиняюсь, опечатался в предыдущем сообщении. Надо читать как:

"Хотя, согласно даташиту на ILI9320, при 16-битном режиме передачи используются биты DB1-DB8 и DB10-DB17."

Share this post


Link to post
Share on other sites

Подскажите пожалуйста, мне в предкомпиленном emWIN нехватает функциональности видгета graph. Типа нужны дополнительные курсоры и другие плюшки. Если с доп курсорами я надеюсь справится с помощью GRAPH_SetUserDraw- дорисовывать курсоры ручками, то для функционала типа логарифмической сетки или полярных координат требуется полностью переписать видгет. Смогу ли я скомпилить свой собственный видгет, например взяв за основу исходники того же Grap из ucGUI 3.98? Есть ли примеры от seggera реализации таких самописных видгетов?

Share this post


Link to post
Share on other sites
Если необходимы исходники enWin 3.90 могу выложить.

 

Выложите, пожалуйста, очень интересно.

Share this post


Link to post
Share on other sites

Выкладываю две версии 3.9 и 3.98. В версии 3.98 не хватает некоторых модулей- 3.9 вроде бы полная. Если мне были необходимы виджеты или функции которых не хватет в версии 3.9 находил нужные файлы с функциями в версии 3.98 и добавлял из в проект. Что касается написания собственных виджетов то получалось написать самому взяв за основу стандартные. Но писал для самых простых виджетов: кнопой и скролбаров. Получалось довольно симпатично. С кнопками было довольно просто со скролбаром пришлось повозиться)).

ucGUI_3.9.zip

uC_GUI_V3_98.zip

Edited by jt777

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

>можно ли виджет, написанный "по мотивам" исходников 3.98 заставить работать с предкомпиленной версией emWIN из Кейла (4.16 кажется сейчас)

Не могу ответить на этот вопрос т.к не пробовал. Что касается самописного виджета то я довольствовался написанием собственной функции для отрисовки виджета. Код привожу ниже.

 


/*********************************************************************
*
*       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;
   }

 }

 

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

 

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);
 }
}

}

 

 

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

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this