uechosearch.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /******************************************************************
  2. *
  3. * uEcho for C
  4. *
  5. * Copyright (C) Satoshi Konno 2015
  6. *
  7. * This is licensed under BSD-style license, see file COPYING.
  8. *
  9. ******************************************************************/
  10. #include <stdio.h>
  11. #include <unistd.h>
  12. #include <uecho/uecho.h>
  13. #define UNKNOWN_STRING "?"
  14. #define SEARCH_WAIT_MTIME 200
  15. void usage()
  16. {
  17. printf("Usage : uechosearch [options]\n");
  18. printf(" -v : Enable verbose output\n");
  19. printf(" -h : Print this message\n");
  20. printf(" -d : Enable debug output\n");
  21. }
  22. uEchoMessage* create_readpropertymessagebycode(int obj_code, byte prop_code)
  23. {
  24. uEchoMessage* msg;
  25. msg = uecho_message_new();
  26. uecho_message_setesv(msg, uEchoEsvReadRequest);
  27. uecho_message_setdestinationobjectcode(msg, obj_code);
  28. uecho_message_setproperty(msg, prop_code, NULL, 0);
  29. return msg;
  30. }
  31. uEchoMessage* create_readpropertymessage(uEchoProperty* prop)
  32. {
  33. return create_readpropertymessagebycode(
  34. uecho_object_getcode(uecho_property_getparentobject(prop)),
  35. uecho_property_getcode(prop));
  36. }
  37. uEchoMessage* create_readmanufacturecodemessage()
  38. {
  39. return create_readpropertymessagebycode(
  40. 0x0EF001,
  41. 0x8A);
  42. }
  43. const char* get_nodemanufacturename(uEchoController* ctrl, uEchoDatabase* db, uEchoNode* node)
  44. {
  45. uEchoMessage* req_msg;
  46. uEchoMessage* res_msg;
  47. uEchoProperty* res_prop;
  48. uEchoManufacture* manufacture;
  49. const char* manufacture_name;
  50. int manufacture_code;
  51. manufacture_name = NULL;
  52. req_msg = create_readmanufacturecodemessage();
  53. res_msg = uecho_message_new();
  54. if (uecho_controller_postmessage(ctrl, node, req_msg, res_msg) && (uecho_message_getopc(res_msg) == 1)) {
  55. res_prop = uecho_message_getproperty(res_msg, 0);
  56. if (res_prop) {
  57. manufacture_code = uecho_bytes_toint(uecho_property_getdata(res_prop), uecho_property_getdatasize(res_prop));
  58. manufacture = uecho_database_getmanufacture(db, manufacture_code);
  59. if (manufacture) {
  60. manufacture_name = uecho_manufacture_getname(manufacture);
  61. }
  62. }
  63. }
  64. uecho_message_delete(req_msg);
  65. uecho_message_delete(res_msg);
  66. return manufacture_name;
  67. }
  68. void print_founddevices(uEchoController* ctrl, bool verbose)
  69. {
  70. uEchoDatabase* db;
  71. uEchoNode* node;
  72. uEchoObject* obj;
  73. uEchoProperty* prop;
  74. uEchoProperty* res_prop;
  75. uEchoMessage* req_msg;
  76. uEchoMessage* res_msg;
  77. int obj_no;
  78. int prop_no;
  79. int res_prop_no;
  80. int n;
  81. const char* manufacture_name;
  82. byte* res_prop_bytes;
  83. bool has_res_prop;
  84. db = uecho_standard_getdatabase();
  85. for (node = uecho_controller_getnodes(ctrl); node; node = uecho_node_next(node)) {
  86. if (!verbose) {
  87. printf("%-15s ", uecho_node_getaddress(node));
  88. obj_no = 0;
  89. for (obj = uecho_node_getobjects(node); obj; obj = uecho_object_next(obj)) {
  90. printf("[%d] %06X ", obj_no, uecho_object_getcode(obj));
  91. obj_no++;
  92. }
  93. printf("\n");
  94. continue;
  95. }
  96. manufacture_name = get_nodemanufacturename(ctrl, db, node);
  97. printf("%-15s (%s)\n", uecho_node_getaddress(node), (manufacture_name ? manufacture_name : UNKNOWN_STRING));
  98. obj_no = 0;
  99. for (obj = uecho_node_getobjects(node); obj; obj = uecho_object_next(obj)) {
  100. printf("[%d] %06X (%s)\n", obj_no, uecho_object_getcode(obj), (uecho_object_getname(obj) ? uecho_object_getname(obj) : UNKNOWN_STRING));
  101. prop_no = 0;
  102. for (prop = uecho_object_getproperties(obj); prop; prop = uecho_property_next(prop)) {
  103. if (uecho_property_isreadrequired(prop)) {
  104. req_msg = create_readpropertymessage(prop);
  105. res_msg = uecho_message_new();
  106. has_res_prop = uecho_controller_postmessage(ctrl, node, req_msg, res_msg);
  107. printf("[%d] [%d] %02X (%s) ", obj_no, prop_no, uecho_property_getcode(prop), uecho_property_getname(prop));
  108. if (has_res_prop) {
  109. for (res_prop_no = 0; res_prop_no < uecho_message_getopc(res_msg); res_prop_no++) {
  110. res_prop = uecho_message_getproperty(res_msg, res_prop_no);
  111. if (!res_prop)
  112. continue;
  113. res_prop_bytes = uecho_property_getdata(res_prop);
  114. for (n = 0; n < uecho_property_getdatasize(res_prop); n++) {
  115. printf("%02X", res_prop_bytes[n]);
  116. }
  117. }
  118. }
  119. printf("\n");
  120. uecho_message_delete(req_msg);
  121. uecho_message_delete(res_msg);
  122. }
  123. prop_no++;
  124. }
  125. obj_no++;
  126. }
  127. if (uecho_node_next(node))
  128. printf("\n");
  129. }
  130. }
  131. int main(int argc, char* argv[])
  132. {
  133. bool verbose_mode;
  134. bool debug_mode;
  135. uEchoController* ctrl;
  136. size_t found_node_cnt;
  137. int c;
  138. // Parse options
  139. verbose_mode = false;
  140. debug_mode = false;
  141. while ((c = getopt(argc, argv, "vhd")) != -1) {
  142. switch (c) {
  143. case 'v': {
  144. verbose_mode = true;
  145. } break;
  146. case 'd': {
  147. debug_mode = true;
  148. } break;
  149. case 'h': {
  150. usage();
  151. return EXIT_SUCCESS;
  152. }
  153. default: {
  154. usage();
  155. return EXIT_FAILURE;
  156. }
  157. }
  158. }
  159. argc -= optind;
  160. argv += optind;
  161. // Debug mode
  162. if (debug_mode) {
  163. uecho_log_setlevel(UECHO_LOG_DEBUG);
  164. }
  165. // Start controller
  166. ctrl = uecho_controller_new();
  167. if (!ctrl)
  168. return EXIT_FAILURE;
  169. if (!uecho_controller_start(ctrl))
  170. return EXIT_FAILURE;
  171. uecho_controller_search(ctrl);
  172. uecho_sleep(SEARCH_WAIT_MTIME);
  173. found_node_cnt = uecho_controller_getnodecount(ctrl);
  174. if (0 < found_node_cnt) {
  175. print_founddevices(ctrl, verbose_mode);
  176. }
  177. uecho_controller_stop(ctrl);
  178. uecho_controller_delete(ctrl);
  179. return EXIT_SUCCESS;
  180. }