main.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <time.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <gfatimer.h>
  7. /////////////////////////////////////////////////////////////////////////////////////////
  8. /////////////////////////////////////////////////////////////////////////////////////////
  9. typedef struct _T_PARAMS
  10. {
  11. unsigned long nTriggers;
  12. struct timespec *ptsStart;
  13. }T_PARAMS, *PT_PARAMS;
  14. #define _NANOSECS_PER_SEC 1000000000
  15. static const int g_cpt[GTCP_Last] = {250, 500, 750, 1000, 1500, 2000, 5000, 10000};
  16. /////////////////////////////////////////////////////////////////////////////////////////
  17. static long long _TimeSpecDiffNs(const struct timespec *pts1, const struct timespec *pts2)
  18. {
  19. long long ns1 = (long long)pts1->tv_sec * _NANOSECS_PER_SEC + pts1->tv_nsec;
  20. long long ns2 = (long long)pts2->tv_sec * _NANOSECS_PER_SEC + pts2->tv_nsec;
  21. return (ns2 - ns1);
  22. }
  23. /////////////////////////////////////////////////////////////////////////////////////////
  24. // callback are always called in the thread context of the timer thread!
  25. static void _TimerCallback(int tnum, void *pContext)
  26. {
  27. struct timespec tsCur;
  28. PT_PARAMS ptp = (PT_PARAMS)pContext;
  29. clock_gettime(CLOCK_MONOTONIC, &tsCur);
  30. long long elps = _TimeSpecDiffNs(ptp->ptsStart, &tsCur) / 1000000;
  31. ptp->nTriggers++;
  32. printf("Timer[%d] triggerd (%lu) at: %lld ms.\n", tnum, ptp->nTriggers, elps);
  33. if(ptp->nTriggers < 4)
  34. tw_set(tnum, 1000 * ptp->nTriggers); // restrigger timer
  35. else
  36. {
  37. printf("Timer[%d] released!\n", tnum);
  38. GfaUnregisterTimerCallback(tnum);
  39. }
  40. }
  41. /////////////////////////////////////////////////////////////////////////////////////////
  42. // callback are always called in the thread context of the timer thread!
  43. static void _ClockPulseCallback(GfaTimerClockPulse cp, int state, void *pContext)
  44. {
  45. struct timespec tsCur;
  46. PT_PARAMS ptp = (PT_PARAMS)pContext;
  47. clock_gettime(CLOCK_MONOTONIC, &tsCur);
  48. long long elps = _TimeSpecDiffNs(ptp->ptsStart, &tsCur) / 1000000;
  49. switch(cp)
  50. {
  51. case GTCP_250ms:
  52. ptp->nTriggers++;
  53. printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
  54. break;
  55. case GTCP_500ms:
  56. ptp->nTriggers++;
  57. printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
  58. break;
  59. case GTCP_750ms:
  60. ptp->nTriggers++;
  61. printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
  62. break;
  63. case GTCP_1000ms:
  64. ptp->nTriggers++;
  65. printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
  66. break;
  67. case GTCP_1500ms:
  68. ptp->nTriggers++;
  69. printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
  70. break;
  71. case GTCP_2000ms:
  72. ptp->nTriggers++;
  73. printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
  74. break;
  75. case GTCP_5000ms:
  76. ptp->nTriggers++;
  77. printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
  78. break;
  79. case GTCP_10000ms:
  80. ptp->nTriggers++;
  81. printf("Clock pulse[%dms] triggerd (%s) at: %lld ms.\n", g_cpt[cp], state ? "+" : "-", elps);
  82. break;
  83. default:
  84. printf("Clock pulse %d invalid!\n", cp);
  85. break;
  86. }
  87. }
  88. /////////////////////////////////////////////////////////////////////////////////////////
  89. /////////////////////////////////////////////////////////////////////////////////////////
  90. int main(int argc, char **argv)
  91. {
  92. T_PARAMS tp1, tp2, tp3;
  93. long long elps;
  94. int tnum1 = 0, tnum2 = 2, nPulse, nOldPulse = 0;
  95. unsigned long tw = 1;
  96. struct timespec tsStart, tsCur, tsEnd;
  97. memset(&tsCur, 0, sizeof(tsCur));
  98. memset(&tsEnd, 0, sizeof(tsEnd));
  99. clock_gettime(CLOCK_MONOTONIC, &tsStart);
  100. /////////////////////////////////////////////////////////////////////////////////////
  101. if(!GfaTimerInit(32, GTR_50ms))
  102. {
  103. printf("GfaTimerInit failed!\n");
  104. return 1;
  105. }
  106. /////////////////////////////////////////////////////////////////////////////////////
  107. tp1.nTriggers = 0;
  108. tp1.ptsStart = &tsStart;
  109. GfaRegisterTimerCallback(tnum2, _TimerCallback, &tp1);
  110. tp2.nTriggers = 0;
  111. tp2.ptsStart = &tsStart;
  112. GfaRegisterClockPulseCallback(GTCP_500ms, _ClockPulseCallback, &tp2);
  113. tp3.nTriggers = 0;
  114. tp3.ptsStart = &tsStart;
  115. GfaRegisterClockPulseCallback(GTCP_1500ms, _ClockPulseCallback, &tp3);
  116. /////////////////////////////////////////////////////////////////////////////////////
  117. tf_set(tnum1);
  118. tf_set(tnum2);
  119. tw_set(tnum1, 20000);
  120. tw_set(tnum2, 500);
  121. /////////////////////////////////////////////////////////////////////////////////////
  122. /////////////////////////////////////////////////////////////////////////////////////
  123. do
  124. {
  125. nPulse = cp_test(GTCP_750ms);
  126. if(nOldPulse != nPulse)
  127. {
  128. clock_gettime(CLOCK_MONOTONIC, &tsCur);
  129. elps = _TimeSpecDiffNs(&tsStart, &tsCur);
  130. printf(" Clock pulse[%dms] polled (%s) at: %lld ms.\n", g_cpt[GTCP_750ms], nPulse ? "+" : "-", elps / 1000000);
  131. nOldPulse = nPulse;
  132. }
  133. if(tw && !(tw = tw_read(tnum1)))
  134. {
  135. clock_gettime(CLOCK_MONOTONIC, &tsEnd);
  136. printf(" Timer[%d] (polled) expired.\n", tnum1);
  137. }
  138. // do work ...
  139. usleep(25000);
  140. }
  141. while(tw);
  142. GfaUnregisterTimerCallback(tnum2);
  143. GfaUnregisterClockPulseCallback(GTCP_500ms);
  144. GfaUnregisterClockPulseCallback(GTCP_1500ms);
  145. GfaTimerRelease();
  146. /////////////////////////////////////////////////////////////////////////////////////
  147. elps = _TimeSpecDiffNs(&tsStart, &tsEnd);
  148. printf("\nTimer[%d] (polled) - effective measured time: %lld ms.\n\n", tnum1, elps / 1000000);
  149. return 0;
  150. }