ptimer.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include "ptimer.h"
  2. static void com_ptimer_notify_function(union sigval v)
  3. {
  4. ptimer_t *ptimer = (ptimer_t *)v.sival_ptr;
  5. ptimer->timeout_callback(ptimer->priv);
  6. }
  7. void com_ptimer_init(ptimer_t *ptimer, const char* type, void (*timeout_callback)(void* priv), void *priv)
  8. {
  9. if (ptimer)
  10. {
  11. ptimer->priv = priv;
  12. ptimer->timeout_callback = timeout_callback;
  13. memset(&ptimer->evp, 0, sizeof(ptimer->evp));
  14. // ptimer->evp.sigev_value.sival_int = 3;
  15. ptimer->evp.sigev_value.sival_ptr = ptimer;
  16. ptimer->evp.sigev_notify = SIGEV_THREAD;
  17. ptimer->evp.sigev_notify_function = com_ptimer_notify_function;
  18. if (strcmp(type, "systime")==0)
  19. {
  20. if (timer_create(CLOCK_REALTIME, &ptimer->evp, &ptimer->timerid)!=0)
  21. {
  22. printe(":%p\n",ptimer);
  23. }
  24. }else{
  25. if (timer_create(CLOCK_MONOTONIC, &ptimer->evp, &ptimer->timerid)!=0)
  26. {
  27. printe(":%p\n",ptimer);
  28. }
  29. }
  30. }
  31. }
  32. void com_ptimer_reset(ptimer_t *ptimer, int start_ms, int interval_ms)
  33. {
  34. if (ptimer)
  35. {
  36. ptimer->it.it_interval.tv_sec = interval_ms/1000;
  37. ptimer->it.it_interval.tv_nsec = (interval_ms%1000) * 1000;
  38. ptimer->it.it_value.tv_sec = start_ms/1000;
  39. ptimer->it.it_value.tv_nsec = (start_ms%1000) * 1000;
  40. if (timer_settime(ptimer->timerid, TIMER_ABSTIME, &ptimer->it, NULL)!=0)
  41. {
  42. printe(":%p\n",ptimer);
  43. }
  44. }
  45. }
  46. void com_ptimer_exit(ptimer_t *ptimer)
  47. {
  48. if (ptimer)
  49. {
  50. if (timer_delete(ptimer->timerid)!=0)
  51. {
  52. printe(":%p\n",ptimer);
  53. }
  54. }
  55. }