Facebook
From Baby Bird, 10 Months ago, written in C.
Embed
Download Paste or View Raw
Hits: 760
  1.  
  2.  
  3. int geteventn()                                                                
  4. {
  5.         bitmask = 1;                                                            // 0x000000001  (ustawiony tylko pierwszy bit)
  6.         state_events = events & getmask(state);         // getmask zwraca maske aktywnych zdarzen w danym stanie
  7.  
  8.         for (i = 0; i < EVENTS_SIZE; i++)
  9.         {
  10.                 if (state_events & bitmask)                             // sprawdza czy to zdarzenie jest aktywne
  11.                 {
  12.                         events &= ~bitmask;                                     // jesli jest aktywne to usuwa go z zadan do wykonania i zwraca jego indeks
  13.                         return i;                                                      
  14.                 }
  15.                 bitmask <<= 1;                                                  // przesuwamy maske, bÄ™dziemy sprawdzac kolejne zdarzenie
  16.         }
  17.        
  18.         return ~0;                                                                      // zwraca same 1 (FF) jesli nie wejdzie do tego wczesniejszego returna
  19. }
  20.  
  21. int main()
  22. {
  23.         do
  24.         {
  25.                 key = 0;
  26.                 if ((key = getch() != -1)
  27.                 {
  28.                         if (key == 'A')
  29.                                 do_sth1();
  30.                         if (key == 'B')
  31.                                 do_sth2();
  32.                 }
  33.  
  34.  
  35.                 if ((event = geteventn()) != ~0)                // dekoder (geteventn zwraca same 1, jezeli nie ma zadnego zdarzenia do wykonania, lub indeks zdarzenia)
  36.                 {
  37.                         // dispatcher
  38.                         last_event = event;
  39.                         last_state = state;
  40.                         (*(state_table[event][state].action))();                // reagujemy na dane zdarzenie wywoĹ‚ujÄ…c akcje
  41.                         state = state_table[event][state].nextstate;    // przechodzimy do kolejnego stanu
  42.                         if (state != last_state)                                                // jezeli zmienilismy stan to zerujemy zmienna events, bo w nowym stanie to zdarzenie moze nie byc juz aktywne
  43.                                 events = 0;
  44.                 }
  45.         } while (true);
  46.  
  47.     return 0;
  48. }
  49.  
  50.