GE

From GIMX

Revision as of 11:14, 14 January 2013 by Matlo (talk | contribs) (Polling-driven)

Jump to: navigation, search

The GIMX Event Library

GE is a cross-platform event library that can be used in Windows or Linux.
In Linux, it directly interfaces with evdev.
In Windows, it uses a modified SDL library.

This page gives pseudo-code examples.

Linux

Interrupt-driven, with periodic task

 #include <GE.h>
 
 int process_event(GE_Event* event)
 {
   //handle the event
 }
 
 int main(int argc, char* argv[])
 {
   if (!GE_initialize())
   {
     //handle the error
   }
 
   struct timespec period = {.tv_sec = 0, .tv_nsec = 10000000};
 
   GE_TimerStart(&period);
 
   GE_SetCallback(process_event);
 
   while(!done)
   {
     GE_PumpEvents();//blocks until timer fires
 
     //do something periodically
   }
 
   GE_quit();
   
   return 0;
 }

Interrupt-driven, without periodic task

 #include <GE.h>
 
 int process_event(GE_Event* event)
 {
   //process the event
 }
 
 int main(int argc, char* argv[])
 {
   if (!GE_initialize())
   {
     //handle the error
   }
 
   GE_SetCallback(GE_PushEvent);
 
   while(!done)
   {
     GE_PumpEvents();//retrieve 1 event and return (blocks until event reception)
 
     num_evt = GE_PeepEvents(events, 1);
 
     if (num_evt > 0)
     {
       //process the event
     }
   }
 
   GE_quit();
   
   return 0;
 }

Windows

Polling-driven

 #include <GE.h>
 
 int main(int argc, char* argv[])
 {
   if (!GE_initialize())
   {
     //handle the error
   }
 
   while(!done)
   {
     t0 = get_time();
 
     GE_PumpEvents();//retrieve all pending events and return (does not block)
 
     num_evt = GE_PeepEvents(events, sizeof(events) / sizeof(events[0]));
 
     if (num_evt > 0)
     {
       for (event = events; event < events + num_evt; ++event)
       {
         //process the event
       }
     }
 
     //do something periodically
 
     t1 = get_time();
     time_to_sleep = t1-t0;//avoid the period to drift
 
     usleep(PERIOD - time_to_sleep);//sleep some time (removing this would hug the cpu...)
   }
 
   GE_quit();
   
   return 0;
 }