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.

103 lines
3.4 KiB

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