pando_subdevice.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #include "../subdevice/pando_subdevice.h"
  2. #include "../gateway/pando_channel.h"
  3. #include "../protocol/common_functions.h"
  4. #include "../protocol/sub_device_protocol.h"
  5. #include "../subdevice/pando_object.h"
  6. #include "../subdevice/pando_event.h"
  7. #include "../subdevice/pando_command.h"
  8. #include "../platform/include/pando_sys.h"
  9. #define CMD_QUERY_STATUS (65528)
  10. static void FUNCTION_ATTRIBUTE
  11. decode_data(struct sub_device_buffer *device_buffer)
  12. {
  13. struct pando_property data_body;
  14. uint8_t *buf_end = device_buffer->buffer + device_buffer->buffer_length;
  15. uint16_t tlv_type, tlv_length;
  16. uint8_t *value = NULL;
  17. PARAMS *object_param = NULL;
  18. while((object_param = get_sub_device_property(device_buffer, &data_body))){
  19. pando_object* obj = find_pando_object(data_body.property_num);
  20. if( NULL == obj )
  21. {
  22. pd_printf("object [%d] not found in list\n", data_body.property_num);
  23. }
  24. obj->unpack(object_param);
  25. }
  26. }
  27. static void FUNCTION_ATTRIBUTE
  28. send_current_status()
  29. {
  30. struct sub_device_buffer* data_buffer;
  31. data_buffer = create_data_package(0);
  32. if(NULL == data_buffer)
  33. {
  34. pd_printf("create data package error\n");
  35. return;
  36. }
  37. pando_object* obj = NULL;
  38. pando_objects_iterator* it = create_pando_objects_iterator();
  39. while((obj = pando_objects_iterator_next(it))){
  40. PARAMS* params = create_params_block();
  41. if (params == NULL)
  42. {
  43. pd_printf("Create params block failed.\n");
  44. return;
  45. }
  46. obj->pack(params);
  47. int ret = add_next_property(data_buffer, obj->no, params);
  48. if (ret != 0)
  49. {
  50. pd_printf("add_next_property failed.");
  51. }
  52. delete_params_block(params);
  53. }
  54. delete_pando_objects_iterator(it);
  55. channel_send_to_device(PANDO_CHANNEL_PORT_1, data_buffer->buffer, data_buffer->buffer_length);
  56. show_package(data_buffer->buffer, data_buffer->buffer_length);
  57. delete_device_package(data_buffer);
  58. }
  59. static void FUNCTION_ATTRIBUTE
  60. decode_command(struct sub_device_buffer *device_buffer)
  61. {
  62. struct pando_command cmd_body;
  63. pd_command *p_cmd_body;
  64. PARAMS *cmd_param = get_sub_device_command(device_buffer, &cmd_body);
  65. if(CMD_QUERY_STATUS == cmd_body.command_num)
  66. {
  67. pd_printf("receive a get request\n");
  68. send_current_status();
  69. }
  70. else
  71. {
  72. pd_printf("\nReceive a command:%d\n", cmd_body.command_num);
  73. p_cmd_body = find_pando_command(cmd_body.command_num);
  74. if(p_cmd_body == NULL)
  75. {
  76. pd_printf("no such command find");
  77. return;
  78. }
  79. if(p_cmd_body->unpack != NULL)
  80. {
  81. p_cmd_body->unpack(cmd_param);
  82. }
  83. }
  84. }
  85. void FUNCTION_ATTRIBUTE
  86. pando_subdevice_recv(uint8_t * buffer, uint16_t length)
  87. {
  88. if(NULL == buffer)
  89. {
  90. return;
  91. }
  92. pd_printf("subdevive receive a package: \n");
  93. show_package(buffer, length);
  94. struct sub_device_buffer *device_buffer = (struct sub_device_buffer *)pd_malloc(sizeof(struct sub_device_buffer));
  95. device_buffer->buffer_length = length;
  96. device_buffer->buffer = (uint8_t *)pd_malloc(length);
  97. pd_memcpy(device_buffer->buffer, buffer, length);
  98. uint16_t payload_type = get_sub_device_payloadtype(device_buffer);
  99. switch (payload_type) {
  100. case PAYLOAD_TYPE_DATA:
  101. decode_data(device_buffer);
  102. break;
  103. case PAYLOAD_TYPE_COMMAND:
  104. decode_command(device_buffer);
  105. break;
  106. default:
  107. pd_printf("unsuported paload type : %d", payload_type);
  108. break;
  109. }
  110. delete_device_package(device_buffer);
  111. }
  112. /******************************************************************************
  113. * FunctionName : report_event.
  114. * Description : report the specify event.
  115. * Parameters : no: the event no.
  116. * Returns : none.
  117. *******************************************************************************/
  118. void FUNCTION_ATTRIBUTE
  119. report_event(uint8_t no)
  120. {
  121. struct sub_device_buffer* event_buffer;
  122. event_buffer = create_event_package(0);
  123. if(NULL == event_buffer)
  124. {
  125. pd_printf("create event package error\n");
  126. return;
  127. }
  128. pd_event* event = find_pando_event(no);
  129. if(event == NULL)
  130. {
  131. pd_printf("no such event find\n");
  132. return;
  133. }
  134. PARAMS* params = create_params_block();
  135. if (params == NULL)
  136. {
  137. pd_printf("Create params block failed.\n");
  138. return;
  139. }
  140. if(event->pack != NULL)
  141. {
  142. event->pack(params);
  143. }
  144. int ret = add_event(event_buffer, no, event->priority, params);
  145. if (ret != 0)
  146. {
  147. pd_printf("add event failed.");
  148. return;
  149. }
  150. delete_params_block(params);
  151. show_package(event_buffer->buffer, event_buffer->buffer_length);
  152. channel_send_to_device(PANDO_CHANNEL_PORT_1, event_buffer->buffer, event_buffer->buffer_length);
  153. delete_device_package(event_buffer);
  154. }
  155. void report_status(void)
  156. {
  157. send_current_status();
  158. }