jerry_message.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include <jerry_message.h>
  2. #include <jerry_buffer.h>
  3. static jerry_value_t js_message_obj = 0;
  4. static struct js_callback *js_message_cb = NULL;
  5. static js_message_send_func js_msg_send_func = NULL;
  6. struct js_message
  7. {
  8. char *name;
  9. rt_uint8_t *data;
  10. rt_uint32_t size;
  11. };
  12. void js_message_send_func_init(js_message_send_func func)
  13. {
  14. js_msg_send_func = func;
  15. }
  16. rt_bool_t js_message_send(const char *name, rt_uint8_t *data, rt_uint32_t size)
  17. {
  18. rt_bool_t ret = RT_FALSE;
  19. if (js_message_cb)
  20. {
  21. struct js_message msg;
  22. msg.name = rt_strdup(name);
  23. msg.size = size;
  24. msg.data = rt_malloc(msg.size);
  25. if (msg.data)
  26. {
  27. rt_memcpy(msg.data, data, size);
  28. ret = js_send_callback(js_message_cb, &msg, sizeof(struct js_message));
  29. }
  30. if (!ret)
  31. {
  32. rt_free(msg.data);
  33. rt_free(msg.name);
  34. }
  35. }
  36. return ret;
  37. }
  38. static void js_callback_message(const void *args, rt_uint32_t size)
  39. {
  40. struct js_message *msg = (struct js_message *)args;
  41. if (msg)
  42. {
  43. js_buffer_t *buffer;
  44. jerry_value_t buf_obj = jerry_buffer_create(msg->size, &buffer);
  45. if (buffer)
  46. {
  47. rt_memcpy(buffer->buffer, msg->data, msg->size);
  48. js_emit_event(js_message_obj, msg->name, &buf_obj, 1);
  49. }
  50. /* release value */
  51. jerry_release_value(buf_obj);
  52. rt_free(msg->name);
  53. rt_free(msg->data);
  54. rt_free(msg);
  55. }
  56. }
  57. static void js_message_info_free(void *native)
  58. {
  59. js_message_obj = 0;
  60. js_remove_callback(js_message_cb);
  61. js_message_cb = NULL;
  62. }
  63. static const jerry_object_native_info_t js_message_info =
  64. {
  65. .free_cb = js_message_info_free
  66. };
  67. DECLARE_HANDLER(send)
  68. {
  69. bool result = false;
  70. if (js_msg_send_func && args_cnt == 2 && jerry_value_is_string(args[0]))
  71. {
  72. if (jerry_value_is_string(args[1]))
  73. {
  74. char *name = js_value_to_string(args[0]);
  75. if (name)
  76. {
  77. char *str = js_value_to_string(args[1]);
  78. js_msg_send_func(name, (rt_uint8_t *)str, rt_strlen(str));
  79. result = true;
  80. rt_free(str);
  81. rt_free(name);
  82. }
  83. }
  84. else
  85. {
  86. js_buffer_t *buffer = jerry_buffer_find(args[1]);
  87. if (buffer)
  88. {
  89. char *name = js_value_to_string(args[0]);
  90. if (name)
  91. {
  92. js_msg_send_func(name, buffer->buffer, buffer->bufsize);
  93. result = true;
  94. rt_free(name);
  95. }
  96. }
  97. }
  98. }
  99. return jerry_create_boolean(result);
  100. }
  101. DECLARE_HANDLER(Message)
  102. {
  103. jerry_value_t info = 0;
  104. if (js_message_obj != 0)
  105. return jerry_create_undefined();
  106. js_message_obj = jerry_create_object();
  107. if (jerry_value_is_error(js_message_obj))
  108. {
  109. jerry_release_value(js_message_obj);
  110. return jerry_create_undefined();
  111. }
  112. info = jerry_create_object();
  113. if (jerry_value_is_error(js_message_obj))
  114. {
  115. jerry_release_value(js_message_obj);
  116. jerry_release_value(info);
  117. return jerry_create_undefined();
  118. }
  119. js_make_emitter(js_message_obj, jerry_create_undefined());
  120. REGISTER_METHOD(js_message_obj, send);
  121. jerry_set_object_native_pointer(info, NULL, &js_message_info);
  122. js_set_property(js_message_obj, "info", info);
  123. jerry_release_value(info);
  124. js_message_cb = js_add_callback(js_callback_message);
  125. if (js_message_cb)
  126. {
  127. return js_message_obj;
  128. }
  129. else
  130. {
  131. jerry_release_value(js_message_obj);
  132. return jerry_create_undefined();
  133. }
  134. }
  135. int js_message_init(void)
  136. {
  137. REGISTER_HANDLER(Message);
  138. return 0;
  139. }
  140. #ifdef RT_USING_FINSH
  141. #include <finsh.h>
  142. int js_msg_test(int argc, char** argv)
  143. {
  144. if (argc > 2)
  145. {
  146. rt_uint32_t cmd = atoi(argv[2]);
  147. js_message_send(argv[1], (rt_uint8_t *)&cmd, 4);
  148. }
  149. else if (argc > 1)
  150. {
  151. rt_uint32_t cmd = atoi(argv[1]);
  152. js_message_send("test", (rt_uint8_t *)&cmd, 4);
  153. }
  154. return 0;
  155. }
  156. MSH_CMD_EXPORT(js_msg_test, send msg to JS by test);
  157. #endif