events.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include <cstdlib>
  2. #include <ctime>
  3. #include "Crown.h"
  4. #include "EventBuffer.h"
  5. #include "OsTypes.h"
  6. #include "Mouse.h"
  7. #include "OsThread.h"
  8. #include "Log.h"
  9. using namespace crown;
  10. EventBuffer* g_buffer_1;
  11. EventBuffer* g_buffer_2;
  12. EventBuffer* g_tmp;
  13. OsThread g_thread("consumer-thread");
  14. Semaphore g_process_sem;
  15. Semaphore g_thread_sem;
  16. bool g_exit = false;
  17. //-----------------------------------------------------------------------------
  18. void push_event()
  19. {
  20. uint32_t x = (rand() % 100) + 1;
  21. uint32_t y = (rand() % 100) + 1;
  22. OsMouseEvent ome;
  23. ome.button = MouseButton::LEFT;
  24. ome.x = x;
  25. ome.y = y;
  26. ome.pressed = true;
  27. g_buffer_1->push_event((uint32_t)OsEvent::MOUSE, &ome, sizeof(OsMouseEvent));
  28. Log::i("Event pushed");
  29. }
  30. //-----------------------------------------------------------------------------
  31. void swap()
  32. {
  33. g_tmp = g_buffer_1;
  34. g_buffer_1 = g_buffer_2;
  35. g_buffer_2 = g_tmp;
  36. Log::i("Buffers swapped");
  37. }
  38. //-----------------------------------------------------------------------------
  39. int32_t thread_proc(void* /*user_data*/)
  40. {
  41. OsMouseEvent* result;
  42. uint32_t et; size_t es;
  43. while (true)
  44. {
  45. while (!g_buffer_1->is_empty())
  46. {
  47. result = (OsMouseEvent*)g_buffer_1->get_next_event(et, es);
  48. if (result != NULL)
  49. {
  50. Log::d("x: %d, y: %d", result->x, result->y);
  51. }
  52. else
  53. {
  54. g_buffer_1->clear();
  55. swap();
  56. g_process_sem.post();
  57. g_thread_sem.wait();
  58. }
  59. }
  60. }
  61. return 0;
  62. }
  63. //-----------------------------------------------------------------------------
  64. int main()
  65. {
  66. memory::init();
  67. srand(time(NULL));
  68. g_buffer_1 = CE_NEW(default_allocator(), EventBuffer);
  69. g_buffer_2 = CE_NEW(default_allocator(), EventBuffer);
  70. g_thread.start(thread_proc);
  71. while (!g_exit)
  72. {
  73. push_event();
  74. g_thread_sem.post();
  75. g_process_sem.wait();
  76. }
  77. g_thread.stop();
  78. memory::shutdown();
  79. return 0;
  80. }