Browse Source

修改部分设备ID

storage-in-realtime
zhaohe 12 months ago
parent
commit
99510a0e36
  1. 45
      README.md
  2. 111
      appsrc/appsetting/project_port/project_port.cpp
  3. 30
      appsrc/appsetting/project_port/project_port.hpp
  4. 6
      appsrc/service/app/add_liquid_service.cpp
  5. 4
      appsrc/service/app/drain_liquid_service.cpp
  6. 4
      appsrc/service/disinfection_logs_service.cpp
  7. 8
      appsrc/service/hardware/base/h2o2_sensor_data_mgr.cpp
  8. 7
      doc/压力传感器.md

45
README.md

@ -28,4 +28,49 @@ TODO:
iconv iconv
sudo apt install fonts-noto-cjk sudo apt install fonts-noto-cjk
```
# 多设备编码规范,异常处理规范
```
0. 单片机按照当前产品真实安装的设备编写代码。有设备则实现对应的协议,没有该设备则不实现。
1. LinuxID路由,则只路由真实存在的设备。
2. app目录下的代码,根据项目的不同,写不同的代码。
3. 整个程序根据Host名字自动生成不同的配置。
4. config.json中在正式代码中应该为空。
5. Hardware启动时,校验单片机的板子类型,如果板子类型不匹配,则设置标志位。
```
# 设备异常处理和前端现实
```
1.状态异常
2.事件异常
--------------------------------------------
1.存在一个服务,主动上报全局状态(传感器状态,设备工作状态,设备状态异常,等状态信息),不可停止。
2.每个页面,根据自身的业务逻辑,会存在一个上报状态的接口,该上报接口,会上报当前页面需要动态更新的状态。
1.后台服务
2.前端直驱
1.异常属于代码严重错误,如果发生异常,则停止设备运行,通过广播板子复位指令,尽可能的让设备停下来。
2.后台服务运行中,如果触发异常,则
```
```
TODO:
--------------------------------------------
1. 整理大空间,小空间,管道式的单片机代码,满足多设备编码规范。(按照真实的设备情况编写代码)OK
2. 整理大空间,小空间,管道式的ID路由代码。
3. 填充硬件测试页面。
4. 指令重发代码功能。
6. 所有后台程序添加异常检查,当异常发生过,则设置全局标志位(硬件异常)。此时后台程序相应的线程将不再继续工作。(直到设备重启)
7. 所有后台程序(有前端启动的),则是检查全局标志位,如果触发错误,则报错。
8. 添加消毒日志打印程序
8. 消毒测试
8. 添加一个程序根据全局异常标志位,对设备进行相应的检查,如果检查通过则清空标志位。同时如果发生异常,则发送板子复位指令,对板子进行复位。
5. 单片机支持自动过滤掉重发的指令。
``` ```

111
appsrc/appsetting/project_port/project_port.cpp

@ -42,26 +42,6 @@ void ProjectPort::initProjectSetting(int projectTypeInt) {
projectTypeInt = projectTypeInt; projectTypeInt = projectTypeInt;
projectType = projectType2Str(projectTypeInt); projectType = projectType2Str(projectTypeInt);
if (projectTypeInt == klarge_space_disinfection_machine) {
extSensorNum = LARGE_SPACE_DM_EXT_SENSOR_NUM;
gpmToSpeedRadio = LARGE_SPACE_DM__GPM_TO_SPEED_RADIO;
disinfectantBucketCapacity = LARGE_SPACE_DM__DISINFECTANT_BUCKET_CAPACITY;
} else if (projectTypeInt == ksmall_space_disinfection_machine) {
extSensorNum = SMALL_SPACE_DM_EXT_SENSOR_NUM;
gpmToSpeedRadio = SMALL_SPACE_DM__GPM_TO_SPEED_RADIO;
disinfectantBucketCapacity = SMALL_SPACE_DM__DISINFECTANT_BUCKET_CAPACITY;
} else if (projectTypeInt == kpipe_disinfection_machine) {
extSensorNum = PIPE_DM_EXT_SENSOR_NUM;
gpmToSpeedRadio = PIPE_DM_GPM_TO_SPEED_RADIO;
disinfectantBucketCapacity = PIPE_DM__DISINFECTANT_BUCKET_CAPACITY;
} else if (projectTypeInt == kdraw_bar_disinfection_box) {
extSensorNum = DRAW_BAR_DM_EXT_SENSOR_NUM;
gpmToSpeedRadio = DRAW_BAR_DM_GPM_TO_SPEED_RADIO;
disinfectantBucketCapacity = DRAW_BAR_DM__DISINFECTANT_BUCKET_CAPACITY;
} else {
ZCHECK(false, "projectTypeInt not support: " + to_string(projectTypeInt));
}
// 设备ID初始化 // 设备ID初始化
if (isLageSpaceDM() || isSmallSpaceDM() || isPipeDM()) { if (isLageSpaceDM() || isSmallSpaceDM() || isPipeDM()) {
// 加液泵 // 加液泵
@ -85,21 +65,17 @@ void ProjectPort::initProjectSetting(int projectTypeInt) {
// 液体重量传感器 // 液体重量传感器
INSERT(HardwareComponent::kLiquidWeightPS, kFixBoardId_LiquidCtrl, 1); INSERT(HardwareComponent::kLiquidWeightPS, kFixBoardId_LiquidCtrl, 1);
// 空压机后压力传感器 // 空压机后压力传感器
INSERT(HardwareComponent::kACPostPS, kFixBoardId_LiquidCtrl, 0);
INSERT(HardwareComponent::kACPostPS, kFixBoardId_LiquidCtrl, 2);
// 喷雾泵后压力传感器 // 喷雾泵后压力传感器
INSERT(HardwareComponent::kSprayPumpPostPS, kFixBoardId_LiquidCtrl, 0);
INSERT(HardwareComponent::kSprayPumpPostPS, kFixBoardId_LiquidCtrl, 3);
// 加液泵后压力传感器 // 加液泵后压力传感器
INSERT(HardwareComponent::kAddLiquidPumpPostPS, kFixBoardId_LiquidCtrl, 0);
INSERT(HardwareComponent::kAddLiquidPumpPostPS, kFixBoardId_LiquidCtrl, 4);
if (isPipeDM()) { if (isPipeDM()) {
// 正压比例阀 // 正压比例阀
INSERT(HardwareComponent::kPositivePressureProportional, kFixBoardId_LiquidCtrl, POSITIVE_PRESSURE_PROPORTIONAL_ID); INSERT(HardwareComponent::kPositivePressureProportional, kFixBoardId_LiquidCtrl, POSITIVE_PRESSURE_PROPORTIONAL_ID);
// 负压比例阀 // 负压比例阀
INSERT(HardwareComponent::kNegativePressureProportional, kFixBoardId_LiquidCtrl, NEGATIVE_PRESSURE_PROPORTIONAL_ID); INSERT(HardwareComponent::kNegativePressureProportional, kFixBoardId_LiquidCtrl, NEGATIVE_PRESSURE_PROPORTIONAL_ID);
// 气密传感器
INSERT(HardwareComponent::kAirLeakDetectPS, kFixBoardId_LiquidCtrl, 0);
// 空气密度测试空压机
INSERT(HardwareComponent::kAirLeakDetectTestAC, kFixBoardId_LiquidCtrl, 0);
// 空气密度测试通道控制 // 空气密度测试通道控制
INSERT(HardwareComponent::kAirLeakDetectTestChannelCtrl, kFixBoardId_LiquidCtrl, 0); INSERT(HardwareComponent::kAirLeakDetectTestChannelCtrl, kFixBoardId_LiquidCtrl, 0);
} }
@ -114,8 +90,30 @@ float ProjectPort::LiquidWeightPS_To_Pa(int rawval) { return rawval; }
float ProjectPort::SprayPumpPostPS_To_Pa(int rawval) { return rawval; } float ProjectPort::SprayPumpPostPS_To_Pa(int rawval) { return rawval; }
float ProjectPort::AddLiquidPumpPostPS_To_Pa(int rawval) { return rawval; } float ProjectPort::AddLiquidPumpPostPS_To_Pa(int rawval) { return rawval; }
double ProjectPort::gpm2speed(double gpm) { return gpm * gpmToSpeedRadio; }
double ProjectPort::speed2gpm(double speed) { return (speed / gpmToSpeedRadio) + 0.5; }
double ProjectPort::getGpm2SpeedRadio() {
float gpmToSpeedRadio = 0;
if (isLageSpaceDM()) {
gpmToSpeedRadio = LARGE_SPACE_DM__GPM_TO_SPEED_RADIO;
} else if (isSmallSpaceDM()) {
gpmToSpeedRadio = SMALL_SPACE_DM__GPM_TO_SPEED_RADIO;
} else if (isPipeDM()) {
gpmToSpeedRadio = PIPE_DM_GPM_TO_SPEED_RADIO;
} else if (isDrawBarDM()) {
gpmToSpeedRadio = DRAW_BAR_DM_GPM_TO_SPEED_RADIO;
} else {
THROW_APP_EXCEPTION(err::kappe_code_error, "project [%s(%d)] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt);
}
return gpmToSpeedRadio;
}
double ProjectPort::gpm2speed(double gpm) {
float gpmToSpeedRadio = getGpm2SpeedRadio();
return gpm * gpmToSpeedRadio;
}
double ProjectPort::speed2gpm(double speed) {
float gpmToSpeedRadio = getGpm2SpeedRadio();
return (speed / gpmToSpeedRadio) + 0.5;
}
float ProjectPort::pressurePa2VolumeG(int pa) { float ProjectPort::pressurePa2VolumeG(int pa) {
if (isLageSpaceDM()) { if (isLageSpaceDM()) {
@ -130,23 +128,68 @@ float ProjectPort::pressurePa2VolumeG(int pa) {
if (isDrawBarDM()) { if (isDrawBarDM()) {
return VolumeConvertor(VolumeConvertor::drawBarBoxParam).pressurePa2VolumeG(pa); return VolumeConvertor(VolumeConvertor::drawBarBoxParam).pressurePa2VolumeG(pa);
} }
THROW_APP_EXCEPTION(err::kappe_code_error, "project [%s(%d)] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt);
return 0; return 0;
//
} }
int32_t ProjectPort::getMainH2O2SensorId() { return getId(HardwareComponent::MainH2O2Sensor).boardId; } int32_t ProjectPort::getMainH2O2SensorId() { return getId(HardwareComponent::MainH2O2Sensor).boardId; }
int32_t ProjectPort::getSprayLiquidPumpMaxRPM() { int32_t ProjectPort::getSprayLiquidPumpMaxRPM() {
if (isLageSpaceDM()) { if (isLageSpaceDM()) {
return 400;
return 600;
}
if (isSmallSpaceDM()) {
return 600;
}
if (isPipeDM()) {
return 600;
}
if (isDrawBarDM()) {
return 100;
}
return 0;
}
int32_t ProjectPort::getEmptyPipeSprayPumpRPM() {
if (isLageSpaceDM()) {
return 600;
} }
if (isSmallSpaceDM()) { if (isSmallSpaceDM()) {
return 400;
return 600;
} }
if (isPipeDM()) { if (isPipeDM()) {
return 400;
return 600;
} }
if (isDrawBarDM()) { if (isDrawBarDM()) {
return 100; return 100;
} }
return 0; return 0;
} }
int32_t ProjectPort::getDisinfectantBucketCapacity() {
if (isLageSpaceDM()) {
return LARGE_SPACE_DM__DISINFECTANT_BUCKET_CAPACITY;
}
if (isSmallSpaceDM()) {
return SMALL_SPACE_DM__DISINFECTANT_BUCKET_CAPACITY;
}
if (isPipeDM()) {
return PIPE_DM__DISINFECTANT_BUCKET_CAPACITY;
}
if (isDrawBarDM()) {
return DRAW_BAR_DM__DISINFECTANT_BUCKET_CAPACITY;
}
return 0;
}
int32_t ProjectPort::getExtH2O2SensorNum() {
if (isLageSpaceDM()) {
return 2;
}
if (isSmallSpaceDM()) {
return 2;
}
if (isPipeDM()) {
return 0;
}
if (isDrawBarDM()) {
return 0;
}
return 0;
}

30
appsrc/appsetting/project_port/project_port.hpp

@ -39,12 +39,7 @@ class ProjectPort {
// //
// some properties // some properties
// //
int extSensorNum = 0;
double gpmToSpeedRadio = 0;
bool isInited = false;
int disinfectantBucketCapacity = 0;
int emptyPipeSprayPumpRPM = 700;
bool isInited = false;
public: public:
static ProjectPort &ins() { static ProjectPort &ins() {
@ -59,9 +54,10 @@ class ProjectPort {
public: public:
int32_t getProjType(); int32_t getProjType();
int32_t getMainH2O2SensorId();
int32_t getSprayLiquidPumpMaxRPM();
/*******************************************************************************
* //设备类型判断 *
*******************************************************************************/
bool isLageSpaceDM() { return projectTypeInt == klarge_space_disinfection_machine; } bool isLageSpaceDM() { return projectTypeInt == klarge_space_disinfection_machine; }
bool isSmallSpaceDM() { return projectTypeInt == ksmall_space_disinfection_machine; } bool isSmallSpaceDM() { return projectTypeInt == ksmall_space_disinfection_machine; }
bool isPipeDM() { return projectTypeInt == kpipe_disinfection_machine; } bool isPipeDM() { return projectTypeInt == kpipe_disinfection_machine; }
@ -72,6 +68,9 @@ class ProjectPort {
bool isProjectType(int id0, int id1, int id2) { return id0 == projectTypeInt || id1 == projectTypeInt || id2 == projectTypeInt; } bool isProjectType(int id0, int id1, int id2) { return id0 == projectTypeInt || id1 == projectTypeInt || id2 == projectTypeInt; }
bool isProjectType(int id0, int id1, int id2, int id3) { return id0 == projectTypeInt || id1 == projectTypeInt || id2 == projectTypeInt || id3 == projectTypeInt; } bool isProjectType(int id0, int id1, int id2, int id3) { return id0 == projectTypeInt || id1 == projectTypeInt || id2 == projectTypeInt || id3 == projectTypeInt; }
/*******************************************************************************
* ID获取 *
*******************************************************************************/
ComponentId getId(HardwareComponent component) { ComponentId getId(HardwareComponent component) {
auto it = componentIdMap.find(component); auto it = componentIdMap.find(component);
if (it != componentIdMap.end()) { if (it != componentIdMap.end()) {
@ -80,7 +79,11 @@ class ProjectPort {
THROW_APP_EXCEPTION(err::kappe_code_error, "ComponentIdMgr::getId: component not found"); THROW_APP_EXCEPTION(err::kappe_code_error, "ComponentIdMgr::getId: component not found");
} }
/*******************************************************************************
* *
*******************************************************************************/
// 单位转换 // 单位转换
double getGpm2SpeedRadio();
double gpm2speed(double gpm); double gpm2speed(double gpm);
double speed2gpm(double speed); double speed2gpm(double speed);
@ -90,10 +93,17 @@ class ProjectPort {
float LiquidWeightPS_To_Pa(int rawval); float LiquidWeightPS_To_Pa(int rawval);
float SprayPumpPostPS_To_Pa(int rawval); float SprayPumpPostPS_To_Pa(int rawval);
float AddLiquidPumpPostPS_To_Pa(int rawval); float AddLiquidPumpPostPS_To_Pa(int rawval);
// 液体重量计算
float pressurePa2VolumeG(int pa); float pressurePa2VolumeG(int pa);
/*******************************************************************************
* *
*******************************************************************************/
int32_t getMainH2O2SensorId();
int32_t getSprayLiquidPumpMaxRPM();
int32_t getDisinfectantBucketCapacity();
int32_t getExtH2O2SensorNum();
int32_t getEmptyPipeSprayPumpRPM();
private: private:
void initProjectSetting(int projectTypeInt); void initProjectSetting(int projectTypeInt);
}; };

6
appsrc/service/app/add_liquid_service.cpp

@ -24,7 +24,7 @@ void AddLiquidService::start(int stopatg) {
int32_t nowvolume = m_dwus->getWeight(); int32_t nowvolume = m_dwus->getWeight();
int maxg = PORT.disinfectantBucketCapacity;
int maxg = PORT.getDisinfectantBucketCapacity();
if (nowvolume > stopatg) { if (nowvolume > stopatg) {
logger->warn("start add liquid fail, nowvolume {} > stopatg {}", nowvolume, stopatg); logger->warn("start add liquid fail, nowvolume {} > stopatg {}", nowvolume, stopatg);
THROW_APP_EXCEPTION(err::kappe_adding_liquid_is_already_in_place, ""); THROW_APP_EXCEPTION(err::kappe_adding_liquid_is_already_in_place, "");
@ -62,7 +62,7 @@ void AddLiquidService::addLiquidWork(int stopatg) {
*/ */
m_workstate = kemptyLineLiquid; m_workstate = kemptyLineLiquid;
logger->info("start drain the liquid from the line"); logger->info("start drain the liquid from the line");
m_dcs->SprayPump_startInRPM(-PORT.emptyPipeSprayPumpRPM);
m_dcs->SprayPump_startInRPM(-PORT.getEmptyPipeSprayPumpRPM());
thisThread.sleepForMs(1000); thisThread.sleepForMs(1000);
m_dcs->AddLiquidPump_run(-23); // @TODO:提取常数到系统配置中 m_dcs->AddLiquidPump_run(-23); // @TODO:提取常数到系统配置中
#define EMTPTY_LINE_WHEN_ADDING_DISINFECTANT_TIMES 1000 #define EMTPTY_LINE_WHEN_ADDING_DISINFECTANT_TIMES 1000
@ -111,7 +111,7 @@ void AddLiquidService::fn_getState(shared_ptr<MsgProcessContext> cxt) { //
} }
void AddLiquidService::fn_getServiceConfig(shared_ptr<MsgProcessContext> cxt) { void AddLiquidService::fn_getServiceConfig(shared_ptr<MsgProcessContext> cxt) {
json cfg; json cfg;
cfg["maxLiquid"] = PORT.disinfectantBucketCapacity;
cfg["maxLiquid"] = PORT.getDisinfectantBucketCapacity();
cfg["show"] = true; cfg["show"] = true;
cfg["updatePeriod"] = 300; cfg["updatePeriod"] = 300;
cxt->content = cfg; cxt->content = cfg;

4
appsrc/service/app/drain_liquid_service.cpp

@ -42,7 +42,7 @@ void DrainLiquidService::fn_getState(shared_ptr<MsgProcessContext> cxt) { //
void DrainLiquidService::fn_getServiceConfig(shared_ptr<MsgProcessContext> cxt) { void DrainLiquidService::fn_getServiceConfig(shared_ptr<MsgProcessContext> cxt) {
json cfg; json cfg;
cfg["maxLiquid"] = PORT.disinfectantBucketCapacity;
cfg["maxLiquid"] = PORT.getDisinfectantBucketCapacity();
cfg["show"] = true; cfg["show"] = true;
cfg["updatePeriod"] = 300; cfg["updatePeriod"] = 300;
cxt->content = cfg; cxt->content = cfg;
@ -52,7 +52,7 @@ void DrainLiquidService::workThread() {
ThisThread thisThread; ThisThread thisThread;
m_dcs->AddLiquidPump_drainLiquid(); m_dcs->AddLiquidPump_drainLiquid();
m_dcs->SprayPump_startInRPM(-PORT.emptyPipeSprayPumpRPM);
m_dcs->SprayPump_startInRPM(-PORT.getEmptyPipeSprayPumpRPM());
logger->info("startDraining "); logger->info("startDraining ");
auto startdrainingtime = zsteady_clock().now(); auto startdrainingtime = zsteady_clock().now();

4
appsrc/service/disinfection_logs_service.cpp

@ -184,14 +184,14 @@ void DisinfectionLogsService::dumpDisinfectionRecord(string sessionId, list<shar
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rh_0), /******************/ formatSensorVal(s->rh[0])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rh_0), /******************/ formatSensorVal(s->rh[0]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rs_0), /******************/ formatSensorVal(s->rs[0])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rs_0), /******************/ formatSensorVal(s->rs[0]));
if (ProjectPort::ins().extSensorNum >= 1) {
if (ProjectPort::ins().getExtH2O2SensorNum() >= 1) {
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::ho2o2_1), /***************/ formatSensorVal(s->h2o2[1])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::ho2o2_1), /***************/ formatSensorVal(s->h2o2[1]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::temp_1), /****************/ formatSensorVal(s->temp[1])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::temp_1), /****************/ formatSensorVal(s->temp[1]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rh_1), /******************/ formatSensorVal(s->rh[1])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rh_1), /******************/ formatSensorVal(s->rh[1]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rs_1), /******************/ formatSensorVal(s->rs[1])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rs_1), /******************/ formatSensorVal(s->rs[1]));
} }
if (ProjectPort::ins().extSensorNum >= 2) {
if (ProjectPort::ins().getExtH2O2SensorNum() >= 2) {
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::ho2o2_2), /***************/ formatSensorVal(s->h2o2[2])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::ho2o2_2), /***************/ formatSensorVal(s->h2o2[2]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::temp_2), /****************/ formatSensorVal(s->temp[2])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::temp_2), /****************/ formatSensorVal(s->temp[2]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rh_2), /******************/ formatSensorVal(s->rh[2])); csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rh_2), /******************/ formatSensorVal(s->rh[2]));

8
appsrc/service/hardware/base/h2o2_sensor_data_mgr.cpp

@ -13,16 +13,16 @@ shared_ptr<H2O2SensorDataCache> H2O2SensorDataMgr::getCacheData(uint8_t sensorId
shared_ptr<H2O2SensorDataSnapshot> H2O2SensorDataMgr::takeSnapshot() { shared_ptr<H2O2SensorDataSnapshot> H2O2SensorDataMgr::takeSnapshot() {
lock_guard<recursive_mutex> lock(m_lock); lock_guard<recursive_mutex> lock(m_lock);
shared_ptr<H2O2SensorDataSnapshot> snapshot = make_shared<H2O2SensorDataSnapshot>(); shared_ptr<H2O2SensorDataSnapshot> snapshot = make_shared<H2O2SensorDataSnapshot>();
ZASSERT(PORT.extSensorNum <= 2);
ZASSERT(PORT.getExtH2O2SensorNum() <= 2);
vector<shared_ptr<H2O2SensorDataCache>> sensorDataList; vector<shared_ptr<H2O2SensorDataCache>> sensorDataList;
if (PORT.extSensorNum == 0) {
if (PORT.getExtH2O2SensorNum() == 0) {
sensorDataList.push_back(getSensorDataCache(0)); sensorDataList.push_back(getSensorDataCache(0));
} else if (PORT.extSensorNum == 1) {
} else if (PORT.getExtH2O2SensorNum() == 1) {
sensorDataList.push_back(getSensorDataCache(0)); sensorDataList.push_back(getSensorDataCache(0));
sensorDataList.push_back(getSensorDataCache(1)); sensorDataList.push_back(getSensorDataCache(1));
} else if (PORT.extSensorNum == 2) {
} else if (PORT.getExtH2O2SensorNum() == 2) {
sensorDataList.push_back(getSensorDataCache(0)); sensorDataList.push_back(getSensorDataCache(0));
sensorDataList.push_back(getSensorDataCache(1)); sensorDataList.push_back(getSensorDataCache(1));
sensorDataList.push_back(getSensorDataCache(2)); sensorDataList.push_back(getSensorDataCache(2));

7
doc/压力传感器.md

@ -0,0 +1,7 @@
```
00003069 INFO [PxxSensor] Sensor[1] id:1 ptype:DP600 detected:1
00003070 INFO [PxxSensor] Sensor[2] id:2 ptype:P100 precision:1 unit:kpa zero:0 full:8000
00003071 INFO [PxxSensor] Sensor[3] id:3 ptype:P100 precision:1 unit:kpa zero:-900 full:1000
00003072 INFO [PxxSensor] Sensor[4] id:4 ptype:P100 precision:1 unit:kpa zero:-900 full:1000
```
Loading…
Cancel
Save