From: Pierre B. <pie...@ya...> - 2006-11-27 09:26:20
|
Hello Alexander, how are you ? Here are the answers to your questions ; Regarding the status of dgtnix : + the driver is working under Unix/Linux + steps have been made to make it work under OS X but as I don't own a Mac, the progress is very slow. Ideally, a new Mac developer would jump into the project. + the driver compiles under Cygwin/Windows, no more informations are available for that platform. Regarding the event handling, keep in mind that the driver is intended to be integrated in to programs with a graphical user interface (to play chess :). Such programs use libraries such as Qt, Gnome or MFC, ..., that provide mechanisms for tracking activities on files descriptors. These mechanisms are supposed to be used instead of the lower level select() function because they ensure compatibility with the main event loop. In the code tree, you can have a look at eboard for an example of use with gnome (mainly dgtnix_eboard.cc) and QtWidget for an example with Qt. For testing purpose, you can also turn on the debug mode : dgtnixSetDebugMode(2); Well, that said, it doesn't mean that the select() way to track events on FD will not work :) But in your code, there is a problem with result = select(1, &readfds, NULL, NULL, &tv); if (result == BoardDescriptor) {} because select() does not return the file descriptor on which the event has occurred, you have to use the macro FD_ISSET for that. Here is an example from the man page of select : #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int main(void) { fd_set rfds; struct timeval tv; int retval; /* Watch stdin (fd 0) to see when it has input. */ FD_ZERO(&rfds); FD_SET(0, &rfds); /* Wait up to five seconds. */ tv.tv_sec = 5; tv.tv_usec = 0; retval = select(1, &rfds, NULL, NULL, &tv); /* Don’t rely on the value of tv now! */ if (retval == -1) perror("select()"); else if (retval) printf("Data is available now.\n"); /* FD_ISSET(0, &rfds) will be true. */ else printf("No data within five seconds.\n"); return 0; } Best Regards, Pierre Alexander Wagner a écrit : > Hi! > > As I had some spare time this morning I started playing > arround with the dgtnix library trying to set up my engine > based upon dgtnix. > > Actually first parts seem to work I can link against the > lib, figured out how to read some information from the board > and stuff, but I'm currently a bit lost with the new event > handling. If I get it correctly It should look something > like this: > > ---------------------------------------------------------------------- > int BoardDescriptor=dgtnixInit(argv[1]); > > while (1) { > FD_ZERO(&readfds); > FD_SET(BoardDescriptor, &readfds); > tv.tv_sec = delay; > tv.tv_usec = 0; > > result = select(1, &readfds, NULL, NULL, &tv); > > if (result == BoardDescriptor) { > read(BoardDescriptor, msg, 4); > col = msg[1]; > row = msg[2]; > piece = msg[3]; > > switch (msg[0]) { > case DGTNIX_MSG_MV_ADD: > printf("Add: %c%c%c \n", col, row, piece); > break; > case DGTNIX_MSG_MV_REMOVE: > printf("Rem: %c%c%c \n", col, row, piece); > break; > default: > break; > } > printf("board has data %c%c%c%c\n", > msg[0],msg[1],msg[2],msg[3]); > } > ---------------------------------------------------------------------- > > Actually this seems to be a "never do anything" loop. What > am I doing wrong here? Did I missunderstand the message > system (select()) or listen to the wrong descriptor? > > BTW: What's the current status of the project? I never heard > from it for quite some time (but I was pretty busy myself as > well). > > |