mini_gateway_master.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //
  2. // Created by DELL on 2024/10/16.
  3. //
  4. #include <stdint.h>
  5. #include "mini_gateway_master.h"
  6. #include "usart.h"
  7. #include "modbus.h"
  8. #include "cmsis_os2.h"
  9. #include "modbus_slave.h"
  10. static nmbs_t nmbs;
  11. static int32_t uart_read(uint8_t *buf, uint16_t count, int32_t byte_timeout_ms,
  12. void *arg)
  13. {
  14. HAL_StatusTypeDef status = HAL_UART_Receive(&huart4, buf, count, byte_timeout_ms);
  15. if (status == HAL_OK)
  16. {
  17. return count;
  18. } else
  19. {
  20. return 0;
  21. }
  22. }
  23. static int32_t uart_write(const uint8_t *buf, uint16_t count, int32_t byte_timeout_ms,
  24. void *arg)
  25. {
  26. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
  27. HAL_UART_Transmit(&huart4, buf, count, byte_timeout_ms);
  28. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
  29. return count;
  30. }
  31. void sync_ac_status(ffx_status_t *status)
  32. {
  33. uint16_t power;
  34. uint16_t mode;
  35. uint16_t fan_speed;
  36. uint16_t set_temp;
  37. if (status->power == 0x01)
  38. {
  39. power = 0xAA;
  40. fan_speed = status->fan_speed + 1;
  41. set_temp = status->set_temp;
  42. } else
  43. power = 0x55;
  44. mode = status->mode + 1;
  45. switch (status->mode)
  46. {
  47. case 0://制冷模式
  48. mode = status->mode + 1;
  49. break;
  50. case 1://制热模式
  51. mode = status->mode + 3;
  52. break;
  53. case 2://除湿模式
  54. mode = status->mode;
  55. break;
  56. case 3://送风模式
  57. mode = status->mode;
  58. break;
  59. case 4://加湿模式、送风
  60. mode = 3;
  61. break;
  62. default:
  63. break;
  64. }
  65. uint16_t regs[5] = {power, mode, set_temp, fan_speed, 0};
  66. // nmbs_write_multiple_registers(&nmbs, 102 + 25 * (status->inner_num - 1), 5, regs);
  67. }
  68. _Noreturn void mini_mater_task(void *pv)
  69. {
  70. for (;;)
  71. {
  72. // for (uint8_t i = 0; i < 10; i++)
  73. // {
  74. // bool regs[1] = {0};
  75. // nmbs_error err = nmbs_read_coils(&nmbs, 120 + i, 1, &regs[0]);
  76. // osDelay(300);
  77. // if (err == NMBS_ERROR_NONE)
  78. // {
  79. // set_reg_value(INNER_POWER_REG_ADDRESS + i -1, regs[0]);
  80. // }
  81. // }
  82. osDelay(300);
  83. HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
  84. osDelay(1);
  85. }
  86. }
  87. void mini_gateway_master_init(void)
  88. {
  89. nmbs_platform_conf platformConf;// 配置uart
  90. platformConf.transport = NMBS_TRANSPORT_RTU;// RTU
  91. platformConf.read = &uart_read; // 读写函数
  92. platformConf.write = &uart_write; // 读写函数
  93. nmbs_client_create(&nmbs, &platformConf);// 创建客户端
  94. nmbs_set_read_timeout(&nmbs, 1000);//
  95. nmbs_set_byte_timeout(&nmbs, 1000);
  96. nmbs_set_destination_rtu_address(&nmbs, MINI_GATEWAY_SLAVE_ADDRESS);
  97. for (uint8_t i = 0; i < 2; i++)
  98. {
  99. bool regs[2] = {0};
  100. nmbs_error err = nmbs_read_coils(&nmbs, 120, 8, &regs[0]);
  101. osDelay(300);
  102. nmbs_error err_2 = nmbs_read_coils(&nmbs, 120, 8, &regs[0]);
  103. osDelay(300);
  104. if ((err_2 == NMBS_ERROR_NONE) && (err == NMBS_ERROR_NONE))
  105. {
  106. set_reg_value(INNER_GROUP1_REG_ADDRESS, regs[0]);
  107. set_reg_value(INNER_GROUP2_REG_ADDRESS, regs[1]);
  108. } else
  109. {
  110. i = 0;
  111. }
  112. }
  113. osThreadNew(mini_mater_task, NULL, NULL);
  114. }