esp_modbus_master.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /* Copyright 2018 Espressif Systems (Shanghai) PTE LTD
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. #include "esp_err.h" // for esp_err_t
  16. #include "mbc_master.h" // for master interface define
  17. #include "esp_modbus_master.h" // for public interface defines
  18. #include "esp_modbus_callbacks.h" // for callback functions
  19. // This file implements public API for Modbus master controller.
  20. // These functions are wrappers for interface functions of the controller
  21. static mb_master_interface_t* master_interface_ptr = NULL;
  22. void mbc_master_init_iface(void* handler)
  23. {
  24. master_interface_ptr = (mb_master_interface_t*) handler;
  25. }
  26. /**
  27. * Modbus controller destroy function
  28. */
  29. esp_err_t mbc_master_destroy(void)
  30. {
  31. esp_err_t error = ESP_OK;
  32. MB_MASTER_CHECK((master_interface_ptr != NULL),
  33. ESP_ERR_INVALID_STATE,
  34. "Master interface is not correctly initialized.");
  35. MB_MASTER_CHECK((master_interface_ptr->destroy != NULL),
  36. ESP_ERR_INVALID_STATE,
  37. "Master interface is not correctly initialized.");
  38. error = master_interface_ptr->destroy();
  39. MB_MASTER_CHECK((error == ESP_OK),
  40. error,
  41. "Master destroy failure, error=(0x%x).",
  42. error);
  43. return error;
  44. }
  45. esp_err_t mbc_master_get_cid_info(uint16_t cid, const mb_parameter_descriptor_t** param_info)
  46. {
  47. esp_err_t error = ESP_OK;
  48. MB_MASTER_CHECK((master_interface_ptr != NULL),
  49. ESP_ERR_INVALID_STATE,
  50. "Master interface is not correctly initialized.");
  51. MB_MASTER_CHECK((master_interface_ptr->get_cid_info != NULL),
  52. ESP_ERR_INVALID_STATE,
  53. "Master interface is not correctly initialized.");
  54. error = master_interface_ptr->get_cid_info(cid, param_info);
  55. MB_MASTER_CHECK((error == ESP_OK),
  56. error,
  57. "Master get cid info failure, error=(0x%x).",
  58. error);
  59. return error;
  60. }
  61. /**
  62. * Get parameter data for corresponding characteristic
  63. */
  64. esp_err_t mbc_master_get_parameter(uint16_t cid, char* name, uint8_t* value, uint8_t* type)
  65. {
  66. esp_err_t error = ESP_OK;
  67. MB_MASTER_CHECK((master_interface_ptr != NULL),
  68. ESP_ERR_INVALID_STATE,
  69. "Master interface is not correctly initialized.");
  70. MB_MASTER_CHECK((master_interface_ptr->get_parameter != NULL),
  71. ESP_ERR_INVALID_STATE,
  72. "Master interface is not correctly initialized.");
  73. error = master_interface_ptr->get_parameter(cid, name, value, type);
  74. MB_MASTER_CHECK((error == ESP_OK),
  75. error,
  76. "Master get parameter failure, error=(0x%x) (%s).",
  77. error, esp_err_to_name(error));
  78. return error;
  79. }
  80. /**
  81. * Send custom Modbus request defined as mb_param_request_t structure
  82. */
  83. esp_err_t mbc_master_send_request(mb_param_request_t* request, void* data_ptr)
  84. {
  85. esp_err_t error = ESP_OK;
  86. MB_MASTER_CHECK((master_interface_ptr != NULL),
  87. ESP_ERR_INVALID_STATE,
  88. "Master interface is not correctly initialized.");
  89. MB_MASTER_CHECK((master_interface_ptr->send_request != NULL),
  90. ESP_ERR_INVALID_STATE,
  91. "Master interface is not correctly initialized.");
  92. error = master_interface_ptr->send_request(request, data_ptr);
  93. MB_MASTER_CHECK((error == ESP_OK),
  94. error,
  95. "Master send request failure error=(0x%x) (%s).",
  96. error, esp_err_to_name(error));
  97. return ESP_OK;
  98. }
  99. /**
  100. * Set Modbus parameter description table
  101. */
  102. esp_err_t mbc_master_set_descriptor(const mb_parameter_descriptor_t* descriptor,
  103. const uint16_t num_elements)
  104. {
  105. esp_err_t error = ESP_OK;
  106. MB_MASTER_CHECK((master_interface_ptr != NULL),
  107. ESP_ERR_INVALID_STATE,
  108. "Master interface is not correctly initialized.");
  109. MB_MASTER_CHECK((master_interface_ptr->set_descriptor != NULL),
  110. ESP_ERR_INVALID_STATE,
  111. "Master interface is not correctly initialized.");
  112. error = master_interface_ptr->set_descriptor(descriptor, num_elements);
  113. MB_MASTER_CHECK((error == ESP_OK),
  114. error,
  115. "Master set descriptor failure, error=(0x%x) (%s).",
  116. error, esp_err_to_name(error));
  117. return ESP_OK;
  118. }
  119. /**
  120. * Set parameter value for characteristic selected by name and cid
  121. */
  122. esp_err_t mbc_master_set_parameter(uint16_t cid, char* name, uint8_t* value, uint8_t* type)
  123. {
  124. esp_err_t error = ESP_OK;
  125. MB_MASTER_CHECK((master_interface_ptr != NULL),
  126. ESP_ERR_INVALID_STATE,
  127. "Master interface is not correctly initialized.");
  128. MB_MASTER_CHECK((master_interface_ptr->set_parameter != NULL),
  129. ESP_ERR_INVALID_STATE,
  130. "Master interface is not correctly initialized.");
  131. error = master_interface_ptr->set_parameter(cid, name, value, type);
  132. MB_MASTER_CHECK((error == ESP_OK),
  133. error,
  134. "Master set parameter failure, error=(0x%x) (%s).",
  135. error, esp_err_to_name(error));
  136. return ESP_OK;
  137. }
  138. /**
  139. * Setup Modbus controller parameters
  140. */
  141. esp_err_t mbc_master_setup(void* comm_info)
  142. {
  143. esp_err_t error = ESP_OK;
  144. MB_MASTER_CHECK((master_interface_ptr != NULL),
  145. ESP_ERR_INVALID_STATE,
  146. "Master interface is not correctly initialized.");
  147. MB_MASTER_CHECK((master_interface_ptr->setup != NULL),
  148. ESP_ERR_INVALID_STATE,
  149. "Master interface is not correctly initialized.");
  150. error = master_interface_ptr->setup(comm_info);
  151. MB_MASTER_CHECK((error == ESP_OK),
  152. error,
  153. "Master setup failure, error=(0x%x) (%s).",
  154. error, esp_err_to_name(error));
  155. return ESP_OK;
  156. }
  157. /**
  158. * Modbus controller stack start function
  159. */
  160. esp_err_t mbc_master_start(void)
  161. {
  162. esp_err_t error = ESP_OK;
  163. MB_MASTER_CHECK((master_interface_ptr != NULL),
  164. ESP_ERR_INVALID_STATE,
  165. "Master interface is not correctly initialized.");
  166. MB_MASTER_CHECK((master_interface_ptr->start != NULL),
  167. ESP_ERR_INVALID_STATE,
  168. "Master interface is not correctly initialized.");
  169. error = master_interface_ptr->start();
  170. MB_MASTER_CHECK((error == ESP_OK),
  171. error,
  172. "Master start failure, error=(0x%x) (%s).",
  173. error, esp_err_to_name(error));
  174. return ESP_OK;
  175. }
  176. eMBErrorCode eMBMasterRegDiscreteCB(UCHAR * pucRegBuffer, USHORT usAddress,
  177. USHORT usNDiscrete)
  178. {
  179. eMBErrorCode error = MB_ENOERR;
  180. MB_MASTER_CHECK((master_interface_ptr != NULL),
  181. ESP_ERR_INVALID_STATE,
  182. "Master interface is not correctly initialized.");
  183. MB_MASTER_CHECK((master_interface_ptr->master_reg_cb_discrete != NULL),
  184. ESP_ERR_INVALID_STATE,
  185. "Master interface is not correctly initialized.");
  186. error = master_interface_ptr->master_reg_cb_discrete(pucRegBuffer, usAddress, usNDiscrete);
  187. return error;
  188. }
  189. eMBErrorCode eMBMasterRegCoilsCB(UCHAR* pucRegBuffer, USHORT usAddress,
  190. USHORT usNCoils, eMBRegisterMode eMode)
  191. {
  192. eMBErrorCode error = MB_ENOERR;
  193. MB_MASTER_CHECK((master_interface_ptr != NULL),
  194. ESP_ERR_INVALID_STATE,
  195. "Master interface is not correctly initialized.");
  196. MB_MASTER_CHECK((master_interface_ptr->master_reg_cb_coils != NULL),
  197. ESP_ERR_INVALID_STATE,
  198. "Master interface is not correctly initialized.");
  199. error = master_interface_ptr->master_reg_cb_coils(pucRegBuffer, usAddress,
  200. usNCoils, eMode);
  201. return error;
  202. }
  203. eMBErrorCode eMBMasterRegHoldingCB(UCHAR * pucRegBuffer, USHORT usAddress,
  204. USHORT usNRegs, eMBRegisterMode eMode)
  205. {
  206. eMBErrorCode error = MB_ENOERR;
  207. MB_MASTER_CHECK((master_interface_ptr != NULL),
  208. ESP_ERR_INVALID_STATE,
  209. "Master interface is not correctly initialized.");
  210. MB_MASTER_CHECK((master_interface_ptr->master_reg_cb_holding != NULL),
  211. ESP_ERR_INVALID_STATE,
  212. "Master interface is not correctly initialized.");
  213. error = master_interface_ptr->master_reg_cb_holding(pucRegBuffer, usAddress,
  214. usNRegs, eMode);
  215. return error;
  216. }
  217. eMBErrorCode eMBMasterRegInputCB(UCHAR * pucRegBuffer, USHORT usAddress,
  218. USHORT usNRegs)
  219. {
  220. eMBErrorCode error = MB_ENOERR;
  221. MB_MASTER_CHECK((master_interface_ptr != NULL),
  222. ESP_ERR_INVALID_STATE,
  223. "Master interface is not correctly initialized.");
  224. MB_MASTER_CHECK((master_interface_ptr->master_reg_cb_input != NULL),
  225. ESP_ERR_INVALID_STATE,
  226. "Master interface is not correctly initialized.");
  227. error = master_interface_ptr->master_reg_cb_input(pucRegBuffer, usAddress, usNRegs);
  228. return error;
  229. }