QNX 6.3 и два монитора

Делаем мы тут один проектег для одного из наших любимых заказчиков — ВНИИРТ. Имеется стоечка с тремя телевизерами подключенными к платкам VR9 пендостанской организации SBS Technologics. Платки, надо сказать, хорошие — имеют по два ethernet канала и по две головы видео. Мегакорпорация, вскоре выпустит свои, такие же.
На стоечке крутится QNX. 

Необходимо написать программу, которая выдает видео картинку на два монитора. Один мониторчег будет находится снизу, а другой сверху.

Для того чтобы вкурить, что за графическая карта стоит на борту чудо платы вводим команду

# pci

в окошко терминала и видим две головы, первая из которых имеет такие вот параметры:

pci_vendor_id = 0x1002
pci_device_id = 0x4c66

Записываем их на бумажку и создаем файл конфигурации iograph.cfg:

panel_format=1,use_rmx=1,skip_edid=0

[GLOBAL]
devices = radeon

[DEVICE.radeon]
dllpath = devg-radeon.so
pci_vendor_id = 0x1002
pci_device_id = 0x4c66
pci_index = 0
displays = 2
plugins = photon
photon =

[DEVICE.radeon.0]
xres = 1024
yres = 768
refresh = 60
bitpp = 32
region_x = 0

[DEVICE.radeon.1]
xres = 1024
yres = 768
refresh = 60
bitpp = 32
region_x = 1024
[PLUGIN.photon]
dllpath = gri-photon.so
hwcursor

Сохраняем его например в /root

Открываем файлег /etc/system/config/grafics-modes первой строкой записываем:

io-graphics -c/root/iograph.cfg

Сохраняим все и жмакаим кнопачку ресет.

После загрузки видим чудеснейшую вещь — изображение есть на обоих дисплеях и разное, водим мышкой и видем что один монитор как бы слева а другой как бы справа, но зачем нам такое?

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

[DEVICE.radeon.1]
xres = 1024
yres = 768
refresh = 60
bitpp = 32
region_x = 0
region_y = 768

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

После этого пишем тестовую программу которая выводит два окошка, вот кусок ее кода:

PtWidget_t *
createWin2( void )
{
	PtWidget_t*	window = NULL, *offscreen = NULL, *group = NULL, *pane = NULL;
	PtArg_t    	args[15];
	int			arg_cnt = 0;
	PhDim_t		dim;
	PhPoint_t 	pos;
	//PtCallback_t win_callbacks[] = { {win_gotFocus_cb, NULL} };

	pos.x=0;
	pos.y=768;

	PtSetArg( &args[arg_cnt++], Pt_ARG_WINDOW_TITLE, "Нижнее окошко", 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_COLOR, Pg_GREEN, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, Ph_WM_APP_DEF_RENDER );
	window = PtCreateWidget(PtWindow, Pt_NO_PARENT, arg_cnt, args );

	/* Create a Offscreen-context container for flicker-free drawing. */
   	pos.x = pos.y = 0;
   	dim.w = SCREEN_W;
   	dim.h = SCREEN_H;
	arg_cnt = 0;
   	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
   	PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
   	PtSetArg( &args[arg_cnt++], Pt_ARG_FILL_COLOR, WIN_BG_COLOR, 0 );
   	offscreen = PtCreateWidget( PtOSContainer , window, arg_cnt, args );

	/* верхняя портянка */
	arg_cnt = 0;
	dim.w = 900; dim.h = 100;
	pos.x = 62;  pos.y = 20;
	PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_FONT, TextFont16bold, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_COLOR, Pg_BLACK, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_BASIC_FLAGS, Pt_FALSE,
				Pt_ALL_ETCHES | Pt_ALL_OUTLINES | Pt_ALL_INLINES );
	PtSetArg( &args[arg_cnt++], Pt_ARG_HIGHLIGHT_ROUNDNESS, 10, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_MARGIN_HEIGHT, 0, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_MARGIN_TOP, 10, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_HORIZONTAL_ALIGNMENT, Pt_CENTER, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_SECONDARY_H_ALIGN , Pt_CENTER, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_STRING,
		"ПРЕВЕД ОЛЕНЯМ", 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_FILL_COLOR, Pg_YELLOW, 0 );
	PtCreateWidget(PtLabel, offscreen, arg_cnt, args );

	return window;
}

PtWidget_t *
createWin_main( void )
{
	PtWidget_t*	window = NULL, *offscreen = NULL, *group = NULL, *pane = NULL;
	PtArg_t    	args[15];
	int			arg_cnt = 0;
	PhDim_t		dim;
	PhPoint_t 	pos;
	//PtCallback_t win_callbacks[] = { {win_gotFocus_cb, NULL} };

	pos.x=0;
	pos.y=0;

	PtSetArg( &args[arg_cnt++], Pt_ARG_WINDOW_TITLE, "Тестовый стенд", 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_COLOR, Pg_RED, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	//PtSetArg( &args[arg_cnt++], Pt_CB_GOT_FOCUS , win_callbacks, 1 );
	//PtSetArg( &args[arg_cnt++], Pt_ARG_WINDOW_STATE, Ph_WM_STATE_ISMAX, Pt_TRUE );
	PtSetArg( &args[arg_cnt++], Pt_ARG_WINDOW_RENDER_FLAGS, Pt_FALSE, Ph_WM_APP_DEF_RENDER );
	// только для главного окна - запрет закрываться и прочие дергания
	/*PtSetArg( &args[arg_cnt++], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE,
						Ph_WM_CLOSE |
						Ph_WM_COLLAPSE  |
						Ph_WM_MOVE |
						Ph_WM_RESIZE |
						Ph_WM_HIDE );
	*/
	window = PtCreateWidget(PtWindow, Pt_NO_PARENT, arg_cnt, args );

	/* Create a Offscreen-context container for flicker-free drawing. */
   	pos.x = pos.y = 0;
   	dim.w = SCREEN_W;
   	dim.h = SCREEN_H;
	arg_cnt = 0;
   	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
   	PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
   	PtSetArg( &args[arg_cnt++], Pt_ARG_FILL_COLOR, WIN_BG_COLOR, 0 );
   	offscreen = PtCreateWidget( PtOSContainer , window, arg_cnt, args );

	/* верхняя портянка */
	arg_cnt = 0;
	dim.w = 900; dim.h = 100;
	pos.x = 62;  pos.y = 20;
	PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_FONT, TextFont16bold, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_COLOR, Pg_BLACK, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_BASIC_FLAGS, Pt_FALSE,
				Pt_ALL_ETCHES | Pt_ALL_OUTLINES | Pt_ALL_INLINES );
	PtSetArg( &args[arg_cnt++], Pt_ARG_HIGHLIGHT_ROUNDNESS, 10, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_MARGIN_HEIGHT, 0, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_MARGIN_TOP, 10, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_HORIZONTAL_ALIGNMENT, Pt_CENTER, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_SECONDARY_H_ALIGN , Pt_CENTER, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_STRING,
		"СТЕНД ИСПРАВЕН", 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_FILL_COLOR, Pg_YELLOW, 0 );
	PtCreateWidget(PtLabel, offscreen, arg_cnt, args );


	/* выбор изделия */
	arg_cnt = 0;
	//dim.w = 900; dim.h = 100;
	pos.x = 62;  pos.y = 130;
	//PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_FONT, TextFont14bold, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_COLOR, Pg_BLACK, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_STRING, "Выберите изделие...", 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_LIST_FONT, TextFont14bold, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_FLAGS, Pt_FALSE, Pt_CURSOR_VISIBLE |
							Pt_EDITABLE | Pt_INSERT_MODE | Pt_TEXT_BLINKING_CURSOR );
	PtSetArg( &args[arg_cnt++], Pt_ARG_WIDTH, 400, 0 );
	PtCreateWidget(PtComboBox, offscreen, arg_cnt, args );


	/* выбор блоков */
	arg_cnt = 0;
	//dim.w = 900; dim.h = 100;
	pos.x = 62;  pos.y = 170;
	//PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_FONT, TextFont14bold, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_COLOR, Pg_BLACK, 0 );
	//PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_STRING, "Выберите изделие...", 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_LIST_FONT, TextFont14bold, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_FLAGS, Pt_FALSE, Pt_CURSOR_VISIBLE |
							Pt_EDITABLE | Pt_INSERT_MODE | Pt_TEXT_BLINKING_CURSOR );
	PtSetArg( &args[arg_cnt++], Pt_ARG_WIDTH, 400, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_HEIGHT, 150, 0 );
	PtCreateWidget(PtList, offscreen, arg_cnt, args );

	/* дискреты и аналоги */
	pos.x = 500; pos.y = 130;
	dim.h = 100;
	dim.w = 450;
	arg_cnt = 0;

	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_HIGHLIGHT_ROUNDNESS, 10, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_BEVEL_WIDTH, 3, 0 );
	//PtSetArg( &args[arg_cnt++], Pt_ARG_CONTAINER_FLAGS, Pt_TRUE,
	//			Pt_SHOW_TITLE | Pt_ETCH_TITLE_AREA | Pt_GRADIENT_TITLE_AREA );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TITLE_FONT, TextFont11bold, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TITLE, "               Режим тестирования", 0 );
	pane = PtCreateWidget( PtPane, offscreen, arg_cnt, args );


	pos.x = 20; pos.y = 10;
	arg_cnt = 0;
	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_FONT, TextFont14bold, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_WIDTH, 400, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_INDICATOR_TYPE , Pt_TOGGLE_CHECK, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_FLAGS , Pt_TRUE, Pt_SET );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_STRING, "Тестировать дискретные сигналы", 0 );
	PtCreateWidget( PtToggleButton, pane, arg_cnt, args );

	pos.y += 40;
	PtSetArg( &args[arg_cnt-1], Pt_ARG_TEXT_STRING , "Тестировать аналоговые сигналы", 0 );
	PtCreateWidget( PtToggleButton, pane, arg_cnt, args );


	/* режим тестирования */

	pos.x = 500; pos.y = 240;
	dim.h = 130;
	dim.w = 450;
	arg_cnt = 0;

	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_HIGHLIGHT_ROUNDNESS, 10, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_BEVEL_WIDTH, 3, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_CONTAINER_FLAGS, Pt_TRUE,
				Pt_SHOW_TITLE | Pt_ETCH_TITLE_AREA | Pt_GRADIENT_TITLE_AREA );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TITLE_FONT, TextFont11bold, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TITLE, "               Режим тестирования", 0 );
	pane = PtCreateWidget( PtPane, offscreen, arg_cnt, args );


	pos.x = 20; pos.y = 0;
	arg_cnt = 0;
   	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
   	PtSetArg( &args[arg_cnt++], Pt_ARG_GROUP_ORIENTATION, Pt_GROUP_ASIS, 0 );
   	PtSetArg( &args[arg_cnt++], Pt_ARG_GROUP_SPACING_Y, 0, 0 );
   	PtSetArg( &args[arg_cnt++], Pt_ARG_GROUP_SPACING_X, 0, 0 );
   	PtSetArg( &args[arg_cnt++], Pt_ARG_GROUP_ROWS_COLS, 4, 0 );
   	PtSetArg( &args[arg_cnt++], Pt_ARG_GROUP_FLAGS, Pt_TRUE, Pt_GROUP_EXCLUSIVE );
   	group = PtCreateWidget( PtGroup, pane, arg_cnt, args );


	pos.x = 0;pos.y = 0;
	dim.w = 342;dim.h = 30;
	arg_cnt = 0;
	PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_FONT, TextFont14bold, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_INDICATOR_TYPE , Pt_TOGGLE_RADIO, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_FLAGS , Pt_TRUE, Pt_SET );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_STRING , "Останов по первой ошибке", 0 );
	PtCreateWidget( PtToggleButton, group, arg_cnt, args );

	pos.y += dim.h;
	PtSetArg( &args[arg_cnt-2], Pt_ARG_FLAGS , Pt_FALSE, Pt_SET );
	PtSetArg( &args[arg_cnt-1], Pt_ARG_TEXT_STRING , "Циклический тест", 0 );
	PtCreateWidget( PtToggleButton, group, arg_cnt, args );


	pos.x = 90;pos.y = 60;
	arg_cnt = 0;
	//PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_FONT, TextFont12bold, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_NUMERIC_UPDOWN_WIDTH, 100, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_NUMERIC_VALUE, 1, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_NUMERIC_PREFIX, "в течение ", 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_NUMERIC_SUFFIX, " ч.", 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_ORIENTATION, Pt_HORIZONTAL, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_NUMERIC_MIN, 1, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_NUMERIC_MAX, 400, 0 );
	PtCreateWidget( PtNumericInteger, pane, arg_cnt, args );


	/* кнопки */

	dim.w = 550;dim.h = 110;
	pos.x = 62;pos.y = 380;
	arg_cnt = 0;
	PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_FONT, TextFont16bold, 0 );

	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_STRING , "СТАРТ", 0 );
	PtCreateWidget(PtButton, offscreen, arg_cnt, args );

	dim.w = 340;dim.h = 50;
	pos.x = 62+550+10;pos.y = 380;
	PtSetArg( &args[arg_cnt-2], Pt_ARG_TEXT_FONT, TextFont14bold, 0 );
	PtSetArg( &args[arg_cnt-1], Pt_ARG_TEXT_STRING , "Прервать тестирование", 0 );
	PtCreateWidget(PtButton, offscreen, arg_cnt, args );

	pos.x = 62+550+10;pos.y = 380+60;
	PtSetArg( &args[arg_cnt-1], Pt_ARG_TEXT_STRING , "Подробности", 0 );
	PtCreateWidget(PtButton, offscreen, arg_cnt, args );


	/* лог */
	pos.x = 62; pos.y = 500;
	dim.w = 900; dim.h = 200;
	arg_cnt = 0;
	PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_HIGHLIGHT_ROUNDNESS, 5, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_FONT, TextFont12bold, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_FLAGS , Pt_FALSE, Pt_FOCUS_RENDER );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_FLAGS , Pt_FALSE,
								Pt_CHANGE_ACTIVATE | Pt_CURSOR_VISIBLE |
								Pt_EDITABLE | Pt_INSERT_MODE |
								Pt_NO_RANGE_SELECTION | Pt_TEXT_AUTO_HIGHLIGHT |
								Pt_TEXT_BLINKING_CURSOR  );
	PtSetArg( &args[arg_cnt++], Pt_ARG_SCROLLBAR_Y_DISPLAY, Pt_ALWAYS, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_SCROLLBAR_Y_WIDTH, 45, 0 );
	PtCreateWidget( PtMultiText, offscreen, arg_cnt, args );


	/* статус-бар */
	pos.x = 0; pos.y = SCREEN_H-35;
	dim.h = 35;dim.w = SCREEN_W;
	arg_cnt = 0;
	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
	pane = PtCreateWidget( PtPane, offscreen, arg_cnt, args );

	arg_cnt = 0;
	pos.x = 10;  pos.y = 0;
	//PtSetArg( &args[arg_cnt++], Pt_ARG_DIM, &dim, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_POS, &pos, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_FONT, TextFont11bold, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_COLOR, Pg_BLACK, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_MARGIN_HEIGHT, 0, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_MARGIN_TOP, 5, 0 );
	PtSetArg( &args[arg_cnt++], Pt_ARG_BASIC_FLAGS, Pt_FALSE,
				Pt_ALL_ETCHES | Pt_ALL_OUTLINES | Pt_ALL_INLINES );
	PtSetArg( &args[arg_cnt++], Pt_ARG_TEXT_STRING, "Статус:", 0 );
	PtCreateWidget(PtLabel, pane, arg_cnt, args );

	pos.x = 80;
	PtSetArg( &args[arg_cnt-2], Pt_ARG_BASIC_FLAGS, Pt_TRUE,
				Pt_ALL_ETCHES | Pt_ALL_OUTLINES | Pt_ALL_INLINES | Pt_ALL_BEVELS );
	PtSetArg( &args[arg_cnt-1], Pt_ARG_TEXT_STRING, "Пыщ-пыщ!!11", 0 );
	PtCreateWidget(PtLabel, pane, arg_cnt, args );


	return window;
}

А вот результат работы настоящей программы:
09072009108

И не используйте SDL там, где это не нужно! Photon обладает всеми теми же возможностями, но имеет один плюс — он родной для QNX системы.

Мы выясняли, что нам поможет QT, SDL, GTK или еще что-нибудь, но пришли к выводу, что на Photon все и так гибко.

Если надо писать на нижнем уровне, тупо выводя точки и линии, Photon и это может. Если необходимы сложные виджеты, то тоже нет проблем — КБ13 разработало и свои виджеты (продадим за дорого).

Похожий бред:

QNX 6.3 и два монитора: 4 комментария

  1. Добрый день.
    От НТЦ РИФ пришло письмо с просьбой выслать драйвера монитора. Опишите, пожалуйста, что конкретно не работает.
    Мой е-мейл и телефон ребята, приезжавшие к нам, брали. У меня их контактов нет.

    Евгений, ВНИИРТ

  2. Приветсвую!

    Драйверы монитора более не нужны, был плохо спаян в стойке (вообще неправильно) кабель ПК2, девайс типа «паяльник» помог.
    Хотели исходники взять, поставить в них брекпоинты и посмотреть что у нас не работает прием или передача, сами драйверы были в стойке, правда не запущенные, и qconn на ней тоже был неподнят.
    А так все хорошо, стоечку освоили, работем.

    Один из ребятов это я.
    Можно общаться и тут.

    Павел, Риф.

  3. «Мы выясняли, что нам поможет QT, SDL, GTK или еще что-нибудь, но пришли к выводу, что на Photon все и так гибко.»

    То есть через SDL получилось разнести картинку по мониторам?

  4. Нет мы это выясняли на других проектах без двух мониторов, и пришли к выводу что SDL не оправдывает себя. На этом проекте, как вы видите выше, на два монитора у нас выводит тупой фотон. В проекте который мы делаем Вам, мы пишем под фотон без PhAb. И два монитора работают, если вам нужна картинка в том обьеме что была у вас под SDL мы вам ее отдадим под Photon, и более того у вас хостовый QNX на таргет машинах в ПОЛНОМ размере. Чего то мудрить мы, например, с SDL не будем, если заказчик прямо не закажет HMI под SDL.
    Так что извините, ответить пока не можем.

Добавить комментарий

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

Protected by WP Anti Spam