Вот 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(®ion, 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, ®ion, &rect, NULL)) == -1)
{
printf("PhRegionOpen have errors: [%s]\n", strerror(errno));
fflush(stdout);
return -1;
}
PhRegionQuery(Rid, ®ion, NULL, NULL, 0);
region.events_opaque = Ph_EV_RAW;
PhRegionChange(Ph_REGION_EV_OPAQUE, 0, ®ion, 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, ®ion, &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;
}