Facebook
From Jittery Eider, 7 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 253
  1. #include <time.h>
  2. #include <sys/siginfo.h>
  3. #include <sys/netmgr.h>
  4. #include <sys/neutrino.h>
  5. #include <sys/time.h>
  6. #include <pthread.h>
  7. #include <stdio.h>
  8. #include <signal.h>
  9. #include <stdlib.h>
  10.  
  11. //ID pulsow
  12. #define PULSE_ID2 10
  13. #define PULSE_ID3 11
  14.  
  15. //czas startu programu
  16. struct timeval start;
  17.  
  18. //struktura wiadomosci
  19. typedef struct{
  20.         struct _pulse pulse;
  21. } msg;
  22.  
  23. //do zapewnienia sekcji krytycznej
  24. pthread_mutex_t mut;
  25.  
  26. //identyfikatory timerow
  27. timer_t timer1, timer2, timer3, timer4;
  28.  
  29. //identyfikator kanalu
  30. int chid;
  31.  
  32. //identyfikatory polaczen dla T2 i T3
  33. int coid2, coid3;
  34.  
  35. //funkcja wypisujaca komunikat oznaczony timestampem
  36. void timestamp(char* msg)
  37. {
  38.         pthread_mutex_lock(&mut);       //terminal jest chroniony mutexem
  39.         struct timeval time;
  40.        
  41.         //pobranie aktualnego czasu
  42.         gettimeofday(&time, NULL);
  43.         int miliseconds = ((time.tv_sec-start.tv_sec)*1000000 + time.tv_usec-start.tv_usec)/1000;       //czas od startu
  44.     int seconds = miliseconds/1000;     //sekundy
  45.     miliseconds = miliseconds%1000;     //milisekundy
  46.     printf("%d:%03ld\t - %s\n", seconds, miliseconds , msg);
  47.     pthread_mutex_unlock(&mut);
  48. }
  49.  
  50. //watek T1
  51. void thread1(void* args)
  52. {
  53.         timestamp("Timer T1.");
  54. }
  55.  
  56. //handler sygnalu SIGINT - zamyka program
  57. void signalHandler(int sigid)
  58. {
  59.            //usuwanie timerow
  60.     timer_delete(timer1);
  61.     timer_delete(timer2);
  62.     timer_delete(timer3);
  63.     timer_delete(timer4);
  64.    
  65.     //zamykanie polaczen i kanalu
  66.     ConnectDetach(coid2);
  67.     ConnectDetach(coid3);
  68.     ChannelDestroy(chid);
  69.    
  70.     timestamp("Timer T4. Koniec programu.");
  71.     exit(EXIT_SUCCESS);
  72. }
  73.  
  74. int main()
  75. {
  76.            //eventy dla timerow
  77.     struct sigevent event1, event2, event3, event4;
  78.    
  79.     //parametry timerow
  80.     struct itimerspec itimerspec1, itimerspec2, itimerspec3, itimerspec4;
  81.     int rcvid;
  82.     msg message;
  83.    
  84.            //ustawienie handlera sygnalu
  85.     signal(SIGINT, signalHandler);
  86.    
  87.     chid = ChannelCreate(0);
  88.        
  89.            //stworzenie eventu tworzacego watek
  90.     SIGEV_THREAD_INIT (&event1, (void*)thread1, NULL, NULL);
  91.    
  92.     //czas pierwszego uruchomienia i powtarzania 0.5s
  93.     itimerspec1.it_value.tv_sec = 0;
  94.     itimerspec1.it_value.tv_nsec = 500000000;
  95.     itimerspec1.it_interval.tv_sec = 0;
  96.     itimerspec1.it_interval.tv_nsec = 500000000;
  97.  
  98.  
  99.            //stworzenie eventu wywolujacego puls 2
  100.     coid2 = ConnectAttach(ND_LOCAL_NODE, 0, chid, _NTO_SIDE_CHANNEL, 0);
  101.     SIGEV_PULSE_INIT (&event2, coid2, SIGEV_PULSE_PRIO_INHERIT, PULSE_ID2, NULL);
  102.        
  103.            //czas pierwszego uruchomienia i powtarzania 2s
  104.     itimerspec2.it_value.tv_sec = 2;
  105.     itimerspec2.it_value.tv_nsec = 0;
  106.     itimerspec2.it_interval.tv_sec = 2;
  107.     itimerspec2.it_interval.tv_nsec = 0;
  108.  
  109.            //stworzenie eventu wywolujacego puls 3
  110.     coid3 =  ConnectAttach(ND_LOCAL_NODE, 0, chid, _NTO_SIDE_CHANNEL, 0);
  111.     SIGEV_PULSE_INIT (&event3, coid3, SIGEV_PULSE_PRIO_INHERIT, PULSE_ID3, NULL);
  112.  
  113.            //czas pierwszego uruchomienia 5s, powtarzania 1s
  114.     itimerspec3.it_value.tv_sec = 5;
  115.     itimerspec3.it_value.tv_nsec = 0;
  116.     itimerspec3.it_interval.tv_sec = 1;
  117.     itimerspec3.it_interval.tv_nsec = 0;
  118.  
  119.  
  120.            //stworzenie eventu wywolujacego SIGINT
  121.     SIGEV_SIGNAL_INIT (&event4, SIGINT);
  122.        
  123.            //czas pierwszego i jedynego uruchomienia - 10s
  124.     itimerspec4.it_value.tv_sec = 10;
  125.     itimerspec4.it_value.tv_nsec = 0;
  126.     itimerspec4.it_interval.tv_sec = 0;
  127.     itimerspec4.it_interval.tv_nsec = 0;
  128.  
  129.            //stworzenie timerow dla eventow i zapamietanie ich id
  130.     timer_create(CLOCK_REALTIME, &event1, &timer1);
  131.     timer_create(CLOCK_REALTIME, &event2, &timer2);
  132.     timer_create(CLOCK_REALTIME, &event3, &timer3);
  133.     timer_create(CLOCK_REALTIME, &event4, &timer4);
  134.        
  135.            //ustawienie czasow timerow
  136.     timer_settime(timer1, 0, &itimerspec1, NULL);
  137.     timer_settime(timer2, 0, &itimerspec2, NULL);
  138.     timer_settime(timer3, 0, &itimerspec3, NULL);
  139.     timer_settime(timer4, 0, &itimerspec4, NULL);
  140.  
  141.            //zapisanie poczatkowego czasu programu
  142.     gettimeofday(&start, NULL);
  143.     timestamp("Start");
  144.  
  145.            //odbieranie wiadomosci  
  146.     while(1)
  147.     {
  148.         rcvid = MsgReceive(chid, &message, sizeof(message), NULL);
  149.         if(rcvid == 0)
  150.         {
  151.             if(message.pulse.code == PULSE_ID2)
  152.             {
  153.                 timestamp("Timer T2.");
  154.             }
  155.             else if(message.pulse.code == PULSE_ID3)
  156.             {
  157.                 timestamp("Timer T3.");
  158.             }
  159.         }
  160.     }
  161.  
  162.     return 0;
  163. }
  164.