基质喷涂
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

230 lines
6.0 KiB

3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
  1. #include "apphardware.hpp"
  2. #include <can/can_dbg.h>
  3. #include "apphal.hpp"
  4. #include "LED/led.h"
  5. #include "status/motor_manager.h"
  6. using namespace iflytop;
  7. #define TAG "AppHardware"
  8. extern SPI_HandleTypeDef hspi1;
  9. AppHardware::AppHardware()
  10. {
  11. mutex_ = osMutexNew(NULL);
  12. if (mutex_ == NULL) {
  13. // 处理互斥锁创建失败
  14. ZLOGI(TAG, "mutex_ create failed");
  15. }
  16. }
  17. void AppHardware::initialize() {
  18. AppHal::tmc_spi_init();
  19. // 配置MOTO电源引脚
  20. MOTO_POWER_EN.initAsOutput(MOTO_POWER_EN_IO, kxs_gpio_nopull, false, true);
  21. // 初始化 MOTO1 相关引脚
  22. MOTO1_CSN.initAsOutput(MOTO1_CSN_IO, kxs_gpio_nopull, false, true);
  23. MOTO1_DRV_ENN.initAsOutput(MOTO1_DRV_ENN_IO, kxs_gpio_nopull, false, true);
  24. MOTOR1_REF_L.initAsInput(MOTOR1_REF_L_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  25. MOTOR1_REF_R.initAsInput(MOTOR1_REF_R_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  26. // 初始化 MOTO2 相关引脚
  27. MOTO2_CSN.initAsOutput(MOTO2_CSN_IO, kxs_gpio_nopull, false, true);
  28. MOTO2_DRV_ENN.initAsOutput(MOTO2_DRV_ENN_IO, kxs_gpio_nopull, false, true);
  29. MOTOR2_REF_L.initAsInput(MOTOR2_REF_L_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  30. MOTOR2_REF_R.initAsInput(MOTOR2_REF_R_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  31. // 初始化 MOTO3 相关引脚
  32. MOTO3_CSN.initAsOutput(MOTO3_CSN_IO, kxs_gpio_nopull, false, true);
  33. MOTO3_DRV_ENN.initAsOutput(MOTO3_DRV_ENN_IO, kxs_gpio_nopull, false, true);
  34. MOTOR3_REF_L.initAsInput(MOTOR3_REF_L_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  35. MOTOR3_REF_R.initAsInput(MOTOR3_REF_R_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false);
  36. osDelay(1500);
  37. MOTO_POWER_EN.setState(false);
  38. TMC51X0Cfg tmc5130cfg1 = {&MOTOR_SPI_INS, MOTO1_CSN_IO, MOTO1_DRV_ENN_IO};
  39. MOTO1.initialize(0, tmc5130cfg1);
  40. MOTO1.enable(false);
  41. #if 0
  42. MOTO1.setIHOLD_IRUN(0, 7, 100);
  43. #else
  44. MOTO1.setIHOLD_IRUN(5, 10, 100);
  45. #endif
  46. MOTO1.setScale(1000);
  47. MOTO1.setEncResolution(-1000);
  48. // 配置 MOTO2
  49. TMC51X0Cfg tmc5130cfg2 = {&MOTOR_SPI_INS, MOTO2_CSN_IO, MOTO2_DRV_ENN_IO};
  50. MOTO2.initialize(1, tmc5130cfg2);
  51. MOTO2.enable(false);
  52. #if 0
  53. MOTO2.setIHOLD_IRUN(0, 10, 100);
  54. #else
  55. MOTO2.setIHOLD_IRUN(5, 10, 100);
  56. #endif
  57. MOTO2.setScale(1000);
  58. MOTO2.setEncResolution(-1000);
  59. // 配置 MOTO3
  60. TMC51X0Cfg tmc5130cfg3 = {&MOTOR_SPI_INS, MOTO3_CSN_IO, MOTO3_DRV_ENN_IO};
  61. MOTO3.initialize(2, tmc5130cfg3);
  62. MOTO3.enable(false);
  63. MOTO3.setIHOLD_IRUN(5, 10, 100);
  64. MOTO3.setScale(1000);
  65. MOTO3.setEncResolution(-1000);
  66. MOTO1.enable(true);
  67. osDelay(10);
  68. MOTO2.enable(true);
  69. osDelay(10);
  70. MOTO3.enable(true);
  71. osDelay(10);
  72. MOTO1.setGlobalScale(32);
  73. MOTO2.setGlobalScale(32);
  74. MOTO3.setGlobalScale(32);
  75. ZLOGI(TAG, "motor1 initialize TMC51X0: %02X", MOTO1.readICVersion());
  76. ZLOGI(TAG, "motor2 initialize TMC51X0: %02X", MOTO2.readICVersion());
  77. ZLOGI(TAG, "motor3 initialize TMC51X0: %02X", MOTO3.readICVersion());
  78. // GPIO 初始化
  79. AirValve::initGPIO();
  80. three_way_valve.initGPIO();
  81. pump_controller.init();
  82. high_voltage_pack.init(true);
  83. laser_control.init(true);
  84. temp_control_nozzle.init();
  85. temp_control_slide.init();
  86. // 初始化电机索引
  87. MotorManager::ins()->motors[0].setMotorIndex(0);
  88. MotorManager::ins()->motors[1].setMotorIndex(1);
  89. MotorManager::ins()->motors[2].setMotorIndex(2);
  90. #if 1
  91. RK3588_POWER_OFF; // 3588 下电
  92. #else
  93. RK3588_POWER_ON;
  94. #endif
  95. LED_KEY_OFF; // 按键灯关闭
  96. #if CAN_MODULE_ENABLE
  97. ZLOGI(TAG, "===== CAN Controller Start...");
  98. AppHardware::ins()->can0Controller.start(&hcan1); // 启动CAN
  99. ZLOGI(TAG, "===== CAN Controller Start Suc");
  100. #endif
  101. ZLOGI(TAG, "===== UART Controller Start...");
  102. AppHardware::ins()->uart_control.start(); // 启动CAN
  103. ZLOGI(TAG, "===== UART Controller Start Suc");
  104. isLaunched_ = false;
  105. isStarted_ = false;
  106. }
  107. bool AppHardware::isHardInitOk() { return hardwareInitedOK; }
  108. void AppHardware::SystemPowerOn() {
  109. if(isStarted_) {
  110. return;
  111. }
  112. tri_color_light(COLOR_GREEN); // 开启绿灯
  113. LIGHT_FLOOD_ON; // 照明灯开
  114. osDelay(10);
  115. ZLOGI(TAG, "======================= System Start =======================");
  116. isStarted_ = true;
  117. }
  118. void AppHardware::SystemPowerOff(bool is_force) {
  119. if(!is_force) {
  120. if(!isStarted_) {
  121. return;
  122. }
  123. }
  124. tri_color_light(COLOR_OFF); // 关灯
  125. LIGHT_FLOOD_OFF; // 照明灯关闭
  126. high_voltage_pack.turnOffPower();
  127. pump_controller.powerOff();
  128. three_way_valve.setMode(ThreeWayValve::ON_C);
  129. laser_control.powerOff();
  130. AirValve::closeCleaning();
  131. AirValve::closeDehumidification();
  132. AirValve::closeNozzle();
  133. MotorManager::ins()->motors[0].runE_Stop();
  134. osDelay(10);
  135. MotorManager::ins()->motors[1].runE_Stop();
  136. osDelay(10);
  137. MotorManager::ins()->motors[2].runE_Stop();
  138. osDelay(10);
  139. ZLOGI(TAG, "======================= System Shut Down =======================");
  140. isStarted_ = false;
  141. }
  142. void AppHardware::setE_Stop(bool isE_Stop) {
  143. this->isE_Stop_ = isE_Stop;
  144. }
  145. bool AppHardware::isE_Stop() {
  146. // return isE_Stop_;
  147. return false;
  148. }
  149. void AppHardware::toggleLaunched() {
  150. this->isLaunched_ = !isLaunched_;
  151. }
  152. bool AppHardware::isLaunched() {
  153. return isLaunched_;
  154. }
  155. bool AppHardware::isStarted() {
  156. return isStarted_;
  157. }
  158. void AppHardware::setFlowSpeed(uint16_t flowSpeed) {
  159. osMutexAcquire(mutex_, osWaitForever);
  160. osMutexRelease(mutex_);
  161. }
  162. void AppHardware::setHumidity(int16_t humidity) {
  163. osMutexAcquire(mutex_, osWaitForever);
  164. osMutexRelease(mutex_);
  165. }
  166. void AppHardware::setTemp(int16_t temp) {
  167. osMutexAcquire(mutex_, osWaitForever);
  168. osMutexRelease(mutex_);
  169. }
  170. uint16_t AppHardware::getFlowSpeed() {
  171. osMutexAcquire(mutex_, osWaitForever);
  172. osMutexRelease(mutex_);
  173. }
  174. int16_t AppHardware::getHumidity() {
  175. osMutexAcquire(mutex_, osWaitForever);
  176. osMutexRelease(mutex_);
  177. }
  178. int16_t AppHardware::getTemp() {
  179. osMutexAcquire(mutex_, osWaitForever);
  180. osMutexRelease(mutex_);
  181. }