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.

91 lines
3.0 KiB

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