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.

101 lines
3.3 KiB

12 months ago
  1. #pragma once
  2. #include "base/appdep.hpp"
  3. namespace iflytop {
  4. using namespace transmit_disfection_protocol;
  5. class PXXPSBus {
  6. PXXPressureSensorBus psbus;
  7. bool m_isInitialized = false;
  8. osTimerId reportTimerId; // 压力传感器数值上报
  9. public:
  10. void initialize(UART_HandleTypeDef* huart) {
  11. psbus.init(huart);
  12. m_isInitialized = true;
  13. osTimerDef(reportTimer, onTimer);
  14. reportTimerId = osTimerCreate(osTimer(reportTimer), osTimerPeriodic, this);
  15. BIND_FN(PXXPSBus, this, fn_psbus_read_data);
  16. BIND_FN(PXXPSBus, this, fn_psbus_scan);
  17. BIND_FN(PXXPSBus, this, fn_psbus_start_report);
  18. BIND_FN(PXXPSBus, this, fn_psbus_stop_report);
  19. }
  20. bool isInitialized() { return m_isInitialized; }
  21. private:
  22. void fn_psbus_read_data(ProcessContext* cxt) {
  23. CHECK_PARAM_LEN(PRAAM_LEN(), 1);
  24. int32_t index = GET_PARAM(0);
  25. int16_t val = 0;
  26. int32_t reportVal = 0;
  27. bool suc = psbus.readData(index, &val);
  28. reportVal = val;
  29. if (suc) {
  30. zcanbus_send_ack(cxt->packet, (uint8_t*)&reportVal, sizeof(reportVal));
  31. } else {
  32. zcanbus_send_errorack(cxt->packet, kerr_subdevice_offline);
  33. }
  34. }
  35. void fn_psbus_scan(ProcessContext* cxt) {
  36. auto* sensors = psbus.sensors;
  37. int numSensor = psbus.sensorNum;
  38. static ack_psbus_scan_t result;
  39. memset(&result, 0, sizeof(result));
  40. static_assert(ZARRAY_SIZE(result.sensor) == ZARRAY_SIZE(psbus.sensors));
  41. result.numOnlineId = numSensor;
  42. for (int i = 0; i < PXX_PRESSURE_SENSOR_NUM; i++) {
  43. if (sensors[i].online) {
  44. result.sensor[i].ptype = sensors[i].type;
  45. result.sensor[i].subid = sensors[i].id;
  46. result.sensor[i].isOnline = 1;
  47. result.sensor[i].precision = sensors[i].p100_sensor_info.precision;
  48. result.sensor[i].uint = sensors[i].p100_sensor_info.pressure_unit;
  49. result.sensor[i].zero = sensors[i].p100_sensor_info.zero_point;
  50. result.sensor[i].full = sensors[i].p100_sensor_info.range_full_point;
  51. }
  52. }
  53. zcanbus_send_ack(cxt->packet, (uint8_t*)&result, sizeof(result));
  54. }
  55. void fn_psbus_start_report(ProcessContext* cxt) {
  56. int period = GET_PARAM(0);
  57. if (period < 100) period = 100;
  58. osTimerStop(reportTimerId);
  59. osTimerStart(reportTimerId, period);
  60. zcanbus_send_ack(cxt->packet, nullptr, 0);
  61. }
  62. void fn_psbus_stop_report(ProcessContext* cxt) {
  63. osTimerStop(reportTimerId);
  64. zcanbus_send_ack(cxt->packet, nullptr, 0);
  65. }
  66. public:
  67. static void onTimer(const void* tid) {
  68. PXXPSBus* bus = (PXXPSBus*)pvTimerGetTimerID((TimerHandle_t)tid);
  69. bus->onTimer();
  70. }
  71. void onTimer() {
  72. int16_t val = 0;
  73. static uint8_t report_buf[100];
  74. report_pressure_data_t* reportData = (report_pressure_data_t*)report_buf;
  75. reportData->sensorDataNum = 0;
  76. for (int i = 0; i < PXX_PRESSURE_SENSOR_NUM; i++) {
  77. if (psbus.sensors[i].online) {
  78. psbus.readData(i, &val);
  79. reportData->data[reportData->sensorDataNum].subid = psbus.sensors[i].id;
  80. reportData->data[reportData->sensorDataNum].pressureVal = val;
  81. reportData->sensorDataNum++;
  82. }
  83. }
  84. zcanbus_send_report(kreport_pressure_data, (uint8_t*)reportData, //
  85. sizeof(*reportData) + sizeof(reportData->data[0]) * reportData->sensorDataNum, 30);
  86. }
  87. };
  88. } // namespace iflytop