nbus_slave_sensor_unicast.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #include "nbus_slave.h"
  2. #if MODULE_SLAVE == 1
  3. void nbus_slave_unicastToSensorGet(nBus_TypeDef *nbus)
  4. {
  5. nBus_sensorType_t sensor_type = nbus->interface->getType(nbus->rx_buffer[RX_SA]);
  6. if (sensor_type == TYPE_UNKNOWN) // handle bad sensor address
  7. {
  8. setErrorResponse(nbus, ILLEGAL_DEVICE_ADDRESS);
  9. return;
  10. }
  11. switch (nbus->function_code.function)
  12. {
  13. case CMD_PARAM: {
  14. switch (nbus->rx_length)
  15. {
  16. case RX_META: // get all params
  17. {
  18. for (uint8_t i = 0, j = 0; i < _NBUS_PARAM_COUNT; i++)
  19. {
  20. if (nbus->interface->hasParam(nbus->rx_buffer[RX_SA], i))
  21. {
  22. int32_t param_value = nbus->interface->getParam(nbus->rx_buffer[RX_SA], i);
  23. nbus->tx_buffer[4 + 5 * j] = i; // param id
  24. nbus->tx_buffer[5 + 5 * j] = (uint8_t)(param_value & 0xFF); // param value 4B
  25. nbus->tx_buffer[6 + 5 * j] = (uint8_t)((param_value >> 8) & 0xFF);
  26. nbus->tx_buffer[7 + 5 * j] = (uint8_t)((param_value >> 16) & 0xFF);
  27. nbus->tx_buffer[8 + 5 * j] = (uint8_t)((param_value >> 24) & 0xFF);
  28. nbus->tx_length += 5;
  29. j++;
  30. }
  31. }
  32. }
  33. break;
  34. case RX_META + 1: // get specified parameter: 4 meta + 1 param id
  35. {
  36. if (nbus->interface->hasParam(nbus->rx_buffer[RX_SA], (nBus_param_t)nbus->rx_buffer[RX_DT]) ==
  37. 0) // handle non-existing param
  38. {
  39. setErrorResponse(nbus, PARAM_NOT_IMPLEMENTED);
  40. break;
  41. }
  42. nbus->tx_buffer[4] = nbus->rx_buffer[RX_DT]; // param id
  43. int32_t param_value = nbus->interface->getParam(nbus->rx_buffer[RX_SA],
  44. (nBus_param_t)nbus->rx_buffer[RX_DT]); // param value 4B
  45. nbus->tx_buffer[5] = (uint8_t)(param_value & 0xFF);
  46. nbus->tx_buffer[6] = (uint8_t)((param_value >> 8) & 0xFF);
  47. nbus->tx_buffer[7] = (uint8_t)((param_value >> 16) & 0xFF);
  48. nbus->tx_buffer[8] = (uint8_t)((param_value >> 24) & 0xFF);
  49. nbus->tx_length += 5;
  50. }
  51. break;
  52. default:
  53. setErrorResponse(nbus, ILLEGAL_FUNCTION_PARAM);
  54. break;
  55. }
  56. }
  57. break;
  58. case CMD_DATA: {
  59. if (nbus->interface->device_ready())
  60. {
  61. uint8_t cnt = nbus->interface->getData(nbus->rx_buffer[RX_SA], &nbus->tx_buffer[TX_DT]);
  62. if (cnt == 0)
  63. {
  64. setErrorResponse(nbus, DEVICE_BUSY);
  65. break;
  66. }
  67. nbus->tx_length += cnt;
  68. }
  69. else
  70. {
  71. setErrorResponse(nbus, DEVICE_NOT_READY);
  72. }
  73. }
  74. break;
  75. case CMD_SENSOR_TYPE: {
  76. nbus->tx_buffer[TX_DT] = sensor_type;
  77. nbus->tx_length += 1;
  78. break;
  79. }
  80. case CMD_FORMAT: {
  81. nBus_sensorFormat_t format = nbus->interface->getSensorFormat(nbus->rx_buffer[RX_SA]);
  82. uint8_t *format_ptr = (uint8_t *)&format;
  83. nbus->tx_buffer[4] = nbus->rx_buffer[RX_SA]; // sensor address
  84. nbus->tx_buffer[5] = format_ptr[0];
  85. nbus->tx_buffer[6] = format_ptr[1];
  86. nbus->tx_buffer[7] = format_ptr[2];
  87. nbus->tx_length += 4;
  88. }
  89. break;
  90. default: {
  91. setErrorResponse(nbus, ILLEGAL_FUNCTION);
  92. }
  93. }
  94. }
  95. void nbus_slave_unicastToSensorSet(nBus_TypeDef *nbus)
  96. {
  97. nBus_sensorType_t sensor_type =
  98. nbus->interface->getType(nbus->rx_buffer[RX_SA]); // nbus->rx_buffer[1] is whole address with type
  99. if (sensor_type == TYPE_UNKNOWN) // handle bad sensor address
  100. {
  101. setErrorResponse(nbus, ILLEGAL_DEVICE_ADDRESS);
  102. return;
  103. }
  104. switch (nbus->function_code.function)
  105. {
  106. case CMD_FIND: {
  107. if (nbus->rx_buffer[RX_DT] > 1) // if wrong parameter {0, 1}
  108. {
  109. setErrorResponse(nbus, ILLEGAL_FUNCTION_PARAM);
  110. break;
  111. }
  112. nbus->tx_buffer[TX_DT] = nbus->interface->find(nbus->rx_buffer[RX_DT]);
  113. nbus->tx_length += 1;
  114. }
  115. break;
  116. case CMD_PARAM: {
  117. uint8_t rx_payload = nbus->rx_length - RX_META;
  118. // empty or wrong number of parameters
  119. if (rx_payload == 0 || rx_payload % 5 != 0)
  120. {
  121. setErrorResponse(nbus, ILLEGAL_FUNCTION_PARAM);
  122. break;
  123. }
  124. else
  125. {
  126. uint8_t param_id;
  127. uint32_t param_value;
  128. uint8_t i = 0;
  129. for (; rx_payload > 0; rx_payload -= 5)
  130. {
  131. param_id = nbus->rx_buffer[3 + 5 * i];
  132. param_value = *(int32_t *)&nbus->rx_buffer[4 + 5 * i];
  133. nbus->tx_buffer[4 + 2 * i] = param_id;
  134. nbus->tx_buffer[5 + 2 * i] = nbus->interface->setParam(nbus->rx_buffer[RX_SA], param_id, param_value);
  135. nbus->tx_length += 2;
  136. i++;
  137. }
  138. }
  139. }
  140. break;
  141. case CMD_CALIBRATE: {
  142. nbus->hw_platform->led_on();
  143. nbus->tx_buffer[TX_DT] = nbus->interface->calibrate(nbus->rx_buffer[RX_SA]);
  144. nbus->tx_length += 1;
  145. nbus->hw_platform->led_off();
  146. break;
  147. }
  148. case CMD_DATA: {
  149. if (nbus->sensorInfo.type == 0) // if device is output only (sensor)
  150. {
  151. setErrorResponse(nbus, DEVICE_IS_READ_ONLY);
  152. break;
  153. }
  154. nbus->tx_length +=
  155. nbus->interface->setData(&nbus->rx_buffer[RX_DT], nbus->rx_length - RX_META, &nbus->tx_buffer[TX_DT]);
  156. }
  157. break;
  158. case CMD_STORE: {
  159. for (uint32_t i = 0; i < _NBUS_PARAM_COUNT; i++)
  160. {
  161. if (nbus->interface->hasParam(nbus->rx_buffer[RX_SA], i))
  162. {
  163. sensor_store_param(nbus, nbus->rx_buffer[RX_SA], i);
  164. // param_value = nbus->interface->getParam(nbus->sensorInfo.address,
  165. // all_params[i]);
  166. // nbus->memoryInterface->storeParam(nbus->sensorInfo.address,
  167. // all_params[i], param_value);
  168. }
  169. }
  170. nbus->tx_buffer[TX_DT] = 1;
  171. nbus->tx_length += 1;
  172. }
  173. break;
  174. default: {
  175. setErrorResponse(nbus, ILLEGAL_FUNCTION);
  176. }
  177. }
  178. }
  179. void sensor_store_param(nBus_TypeDef *nbus, uint8_t sensor_index, uint8_t param_name)
  180. {
  181. uint32_t param_value = nbus->interface->getParam(sensor_index, param_name);
  182. nbus->memoryInterface->storeParam(sensor_index, param_name, param_value);
  183. }
  184. #endif