Официальный форум СВД Встраиваемые Системы
20 Апрель, 2024, 19:10:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Использование Photon в С++ проекте QNX 4.25  (Прочитано 3130 раз)
ad
Пользователь

Сообщений: 70


« : 16 Сентябрь, 2014, 21:59:01 »

1) Есть ли возможность использования Photon в проекте под С++?
2) Есть ли возможность в консольный проект С++ включить photon (для обработки клавиатуры, курсора мыши или еще чего-нибудь)? Как это сделать?

Можете подсказать, как правильно оформить Makefile под каждый из указанных случаев? Заранее спасибо.
Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #1 : 17 Сентябрь, 2014, 14:03:14 »

1) Использовать C++ код при разработке приложения Photon возможно. Но следует учитывать, что сам Photon написан на C.

2) Не очень понятна цель цель такого «включения». Для обработки клавиатуры и мыши в текстовом режиме существуют собственные механизмы.

Правила оформления и составления Makefile'ов для случаев C, C++ или смешанных проектов одни и те же.
Записан
ad
Пользователь

Сообщений: 70


« Ответ #2 : 17 Сентябрь, 2014, 19:11:35 »

1) Использовать C++ код при разработке приложения Photon возможно. Но следует учитывать, что сам Photon написан на C.

2) Не очень понятна цель цель такого «включения». Для обработки клавиатуры и мыши в текстовом режиме существуют собственные механизмы.

Правила оформления и составления Makefile'ов для случаев C, C++ или смешанных проектов одни и те же.
2) Требования функциональных программистов, чтобы принимаемые от кнопок панельной станции обрабатывались как события Photon.
Так в принципе, у меня Makefile есть под С++ и он прекрасно работает, пока не появилось надобность добавления функций Photon(а). Обычного добавления к LDFLAGS опции -l photon не избавило от ошибок. Что еще необходимо? Могу показать Makefile.
1) Проект уже сделан под С++ и не хотелось бы переделывать только из-за нескольких функций и структур Photon переписывать под С.
Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #3 : 17 Сентябрь, 2014, 21:57:38 »

Обычного добавления к LDFLAGS опции -l photon не избавило от ошибок. Что еще необходимо? Могу показать Makefile.

Чтобы посоветовать что-то конкретное, как минимум, надо проанализировать Ваш Makefile и сообщения об ошибках.
Записан
ad
Пользователь

Сообщений: 70


« Ответ #4 : 18 Сентябрь, 2014, 05:55:53 »

Вот Makefile:
Код:
NAMEAPP		= x86/qnx4/dsps_ex1
INCLUDE =

MODEL = -mf
OPTIM = -Osax
DEBUG =

CFLAGS = -Q -3 -w5 $(MODEL) $(OPTIM) $(DEBUG) -I$(INCLUDE) -Wc,-s
CXXFLAGS = $(CFLAGS)
LDFLAGS = -Q -M -3 -T1 $(MODEL) $(DEBUG) -l photon

OBJS = main.o
OLIB =

HDRS =

all : $(NAMEAPP)

$(NAMEAPP) : $(addprefix x86/qnx4/, $(OBJS)) usemsg.cpp
$(CC) $(LDFLAGS) -o $@ $(addprefix x86/qnx4/, $(OBJS)) $(addprefix x86/qnx4/, $(OLIB))
usemsg -c $@ usemsg.cpp
chown root $@
chmod +s $@

x86/qnx4/%.o : %.cpp $(HDRS) Makefile
$(CC) $(CFLAGS) -o $@ -c $*.cpp

install :
make all
cp -c $(NAMEAPP) /usr/opo/

clean :
$(RM) $(addprefix x86/qnx4/, $(OBJS)) $(OBJS:.o=.err) $(NAMEAPP) $(NAMEAPP).map

А вот сообщения об ошибках:
Цитировать
main.cpp(116): Error! E166: (col 20) cannot convert right pointer to type of left operand
main.cpp(116): Note! N630: (col 20) source conversion type is "void *"
main.cpp(116): Note! N631: (col 20) target conversion type is "Ph_ev_raw_key_data *"
main.cpp(162): Error! E166: (col 19) cannot convert right pointer to type of left operand
main.cpp(162): Note! N630: (col 19) source conversion type is "void *"
main.cpp(162): Note! N631: (col 19) target conversion type is "Ph_event *"

А вот код, если он нужен:
Код:
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stddef.h>

#include <Ph.h>

#include <sys/kernel.h>
#include <sys/name.h>
#include <sys/vc.h>
#include <sys/sched.h>

#include <process.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <errno.h>

#define EVENT_SIZE sizeof(PhEvent_t) + 1000

static PhRid_t Rid, ///< region is sensitive to Ph_EV_RAW events
Ptr; ///< region to emits Ph_EV_RAW_PTR events

struct _Ph_ctrl *phChannel;
static int thread_run = 0;

/**
 * @brief The handler of a signals
 * @param sig - number of the signal
**/
static void signal_handler(int sig)
{
    static int warr_count = 0;
    switch(sig)
    {
    case SIGTERM:
        thread_run = 0;
    break;
    case SIGSEGV:
        if(warr_count < 3)
        {
            printf("Application gets signal %i [very bad signal]\n", sig);
            ++warr_count;
        }
    break;
    case SIGWINCH:
        printf("Application gets resize signal %i\n", sig);
    break;
    default:
        printf("Application gets signal %i\n", sig);
    break;
    }
}

/**
 * @brief This function creates two Photon regions. We need one of them, which
 *   covers entire Photon space to listen Ph_EV_RAW events. The second one
 *   is used to emit Ph_EV_RAW_PTR events.
**/
static int create_region()
{
PhRegion_t region;
PhRect_t rect;

memset(&region, 0, sizeof(region));

region.events_sense = Ph_EV_RAW;

region.flags = Ph_KBD_REGION | Ph_PTR_REGION | Ph_FORCE_FRONT;

    region.origin.x = region.origin.y = 0;
region.input_group = 1;

// Cover all Photon space
rect.ul.x = rect.ul.y = SHRT_MIN;
rect.lr.x = rect.lr.y = SHRT_MAX;

if((Rid = PhRegionOpen(Ph_REGION_FLAGS | Ph_REGION_EV_SENSE |
Ph_REGION_RECT, &region, &rect, NULL)) == -1)
{
printf("PhRegionOpen have errors: [%s]\n", strerror(errno));
fflush(stdout);
return -1;
}

PhRegionQuery(Rid, &region, NULL, NULL, 0);
region.events_opaque = Ph_EV_RAW;
PhRegionChange(Ph_REGION_EV_OPAQUE, 0, &region, NULL, NULL);

region.input_group = 1;
region.flags = Ph_PTR_REGION | Ph_FORCE_FRONT;
rect.ul.x = rect.ul.y = rect.lr.x = rect.lr.y = 0;

if((Ptr = PhRegionOpen(Ph_REGION_FLAGS | Ph_REGION_INPUT_GROUP |
Ph_REGION_RECT, &region, &rect, NULL)) == -1)
{
printf("PhRegionOpen have errors: [%s]\n", strerror(errno));
fflush(stdout);
return -1;
}

return 0;
}

/**
 * @brief This function is called every time when the task gets Ph_EV_RAW event.
 * @param event - happened event
**/
static void handler(PhEvent_t* event)
{
PhRawKeyEvent_t* ke;

if((event -> subtype == Ph_EV_RAW_PTR) || (event -> subtype == Ph_EV_RAW_KEY))
{
event -> emitter.rid = Rid;
event -> collector.rid = 0;
ke = PhGetData(event);
if(ke -> key_cap == Pk_F1 || ke -> key_cap == Pk_F2 || ke -> key_cap == Pk_F3 || ke -> key_cap == Pk_F4
|| ke -> key_cap == Pk_F5 || ke -> key_cap == Pk_F6 || ke -> key_cap == Pk_F7 || ke -> key_cap == Pk_F8)
{
if(event -> subtype == Ph_EV_RAW_KEY)
{
PhEventEmit(event, PhGetRects(event), ke);
if(PkIsFirstDown(ke -> key_flags))
printf("key pressed\n");
else if(!PkIsFirstDown(ke -> key_flags) && !PkIsKeyDown(ke -> key_flags))
printf("key release\n");

printf("key_cap = 0x%x, key_flags = 0x%x, key_scan = 0x%x, key_sym = 0x%x, "
"key_mods=0x%x\n", ke -> key_cap, ke -> key_flags, ke -> key_scan,
ke -> key_sym, ke -> key_mods);
}
fflush(stdout);
}
else
PhEventEmit(event, PhGetRects(event), PhGetData(event));
}
}

int main(int argc, char* argv[])
{
PhEvent_t* event;
int k;

/// eliminate the warnings
argc = argc, argv = argv;

for(k=0; k<_SIGMAX; ++k)
signal(k, signal_handler);

if((phChannel = PhAttach(NULL, NULL)) == NULL)
{
fprintf(stderr, "Photon is not running.\n");
exit(-1);


if(create_region() == -1)
{
fprintf(stderr, "Could not create the region 1.\n");
exit(-1);


if((event = malloc(EVENT_SIZE)) == NULL)
{
fprintf( stderr, "Could not allocate event buffer\n" );
exit(-1);
}

thread_run = 1;
while(thread_run)
{
if(PhEventNext(event, EVENT_SIZE) == Ph_EVENT_MSG)
handler(event);
  }

return 0;
}
Записан
Олег Большаков
Легенда

Сообщений: 3140



« Ответ #5 : 18 Сентябрь, 2014, 10:45:45 »

Приведённые Вами ошибки сообщают о необходимости явного приведения типов из void * в Ph_ev_raw_key_data * и Ph_event * соответственно.
Записан
ad
Пользователь

Сообщений: 70


« Ответ #6 : 18 Сентябрь, 2014, 20:48:10 »

Приведённые Вами ошибки сообщают о необходимости явного приведения типов из void * в Ph_ev_raw_key_data * и Ph_event * соответственно.
Спасибо. Уже на работе методом экспериментов и внимательного чтения текста ошибки, исправил! Smiley
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2024 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 19 Апрель, 2024, 10:49:19