7 changed files with 284 additions and 118 deletions
-
60README.md
-
2iflytoplinuxsdk
-
121src/service/device_io_control_service.cpp
-
26src/service/device_io_control_service.hpp
-
43src/utils/moving_average_filter.hpp
-
81src/utils/volume_convertor.cpp
-
69src/utils/volume_convertor.hpp
@ -1 +1 @@ |
|||||
Subproject commit 45bd079bb5f10f36ecfd610a0de0148cafc97bb5 |
|
||||
|
Subproject commit 279b7054fe46618b4084fba61bcef40763f7b269 |
@ -0,0 +1,43 @@ |
|||||
|
#pragma once
|
||||
|
#include <fstream>
|
||||
|
#include <functional>
|
||||
|
#include <iostream>
|
||||
|
#include <list>
|
||||
|
#include <map>
|
||||
|
#include <memory>
|
||||
|
#include <set>
|
||||
|
#include <sstream>
|
||||
|
#include <string>
|
||||
|
#include <vector>
|
||||
|
namespace iflytop { |
||||
|
using namespace std; |
||||
|
|
||||
|
class MovingAverageFilter { |
||||
|
size_t size_; |
||||
|
float sum_ = 0; |
||||
|
std::list<float> values_; |
||||
|
|
||||
|
public: |
||||
|
MovingAverageFilter(size_t size) : size_(size) { |
||||
|
if (size_ <= 0) { |
||||
|
throw std::invalid_argument("size must be greater than 0"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
float filter(float value) { |
||||
|
if (values_.size() < size_) { |
||||
|
values_.push_back(value); |
||||
|
sum_ += value; |
||||
|
return sum_ / values_.size(); |
||||
|
} |
||||
|
|
||||
|
sum_ -= values_.front(); |
||||
|
values_.pop_front(); |
||||
|
values_.push_back(value); |
||||
|
sum_ += value; |
||||
|
return sum_ / size_; |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
}; |
||||
|
} // namespace iflytop
|
@ -0,0 +1,81 @@ |
|||||
|
#include "volume_convertor.hpp"
|
||||
|
|
||||
|
using namespace iflytop; |
||||
|
|
||||
|
float VolumeConvertor::pa2high(float pa) { |
||||
|
/**
|
||||
|
* @brief kpa 转换成液面高度 |
||||
|
* |
||||
|
* p = h*density*g |
||||
|
* |
||||
|
* h = p/(density*g) |
||||
|
* |
||||
|
* p :压强, 单位 pa |
||||
|
* density:液体密度, 单位 kg/m^3 |
||||
|
* g :重力加速度, 单位 |
||||
|
* h :液面高度, 单位 m |
||||
|
* |
||||
|
* 过氧化氢 浓度30.5%时密度=1.11331981022045g/cm^3 = 1113.31981022045kg/m^3 |
||||
|
* |
||||
|
*/ |
||||
|
// 计算液面高度
|
||||
|
float h_m = pa / (density * 9.78); // 液体密度最后会被约掉,大小不影响结果
|
||||
|
float h_dm = h_m * 10; |
||||
|
|
||||
|
return h_dm; |
||||
|
} |
||||
|
/**
|
||||
|
* @brief 计算倒圆锥体积 |
||||
|
* |
||||
|
* @param rb 圆锥体底部半径 |
||||
|
* @param ru 圆锥体顶部半径 |
||||
|
* @param h 圆锥体高度 |
||||
|
* @param nowh 圆锥内液面高度 |
||||
|
* @return float |
||||
|
*/ |
||||
|
float VolumeConvertor::computeConeVolume(float rb, float ru, float h, float nowh) { |
||||
|
if (nowh > h) nowh = h; |
||||
|
if (nowh < 0) nowh = 0; |
||||
|
|
||||
|
float rb_now = rb + (ru - rb) * nowh / h; |
||||
|
float v = PI * nowh * (rb_now * rb_now + rb_now * ru + ru * ru) / 3; |
||||
|
return v; |
||||
|
} |
||||
|
|
||||
|
float VolumeConvertor::pressurePa2VolumeG(float _pa) { |
||||
|
float pa = _pa - 90; |
||||
|
if (pa < 0) { |
||||
|
pa = 0; |
||||
|
} |
||||
|
|
||||
|
// 计算液面高度
|
||||
|
float h_dm = pa2high(pa); |
||||
|
|
||||
|
float h1_dm = h_dm; |
||||
|
float h2_dm = h_dm - container_h1; |
||||
|
float h3_dm = h_dm - container_h2 - container_h1; |
||||
|
float h4_dm = h_dm - container_h3 - container_h2 - container_h1; |
||||
|
|
||||
|
h1_dm = h1_dm < 0 ? 0 : h1_dm; |
||||
|
h2_dm = h2_dm < 0 ? 0 : h2_dm; |
||||
|
h3_dm = h3_dm < 0 ? 0 : h3_dm; |
||||
|
h4_dm = h4_dm < 0 ? 0 : h4_dm; |
||||
|
|
||||
|
h1_dm = h1_dm > container_h1 ? container_h1 : h1_dm; |
||||
|
h2_dm = h2_dm > container_h2 ? container_h2 : h2_dm; |
||||
|
h3_dm = h3_dm > container_h3 ? container_h3 : h3_dm; |
||||
|
h4_dm = h4_dm > container_h4 ? container_h4 : h4_dm; |
||||
|
|
||||
|
// printf("h_dm:%f h1_dm:%f, h2_dm:%f, h3_dm:%f, h4_dm:%f\n",h_dm, h1_dm, h2_dm, h3_dm, h4_dm);
|
||||
|
|
||||
|
float v1 = computeConeVolume(container_rb1, container_ru1, container_h1, h1_dm); |
||||
|
float v2 = computeConeVolume(container_rb2, container_ru2, container_h2, h2_dm); |
||||
|
float v3 = computeConeVolume(container_rb3, container_ru3, container_h3, h3_dm); |
||||
|
float v4 = computeConeVolume(container_rb4, container_ru4, container_h4, h4_dm); |
||||
|
// printf("v1:%f, v2:%f, v3:%f, v4:%f\n", v1, v2, v3, v4);
|
||||
|
|
||||
|
// h4_dm * (double)(2.1124069002737764)
|
||||
|
float V_L = v1 + v2 + v3 + v4; // 0.001m^3
|
||||
|
float g = V_L * density; // 1m^3 = 1000L
|
||||
|
return g; |
||||
|
} |
@ -0,0 +1,69 @@ |
|||||
|
|
||||
|
#pragma once
|
||||
|
#include <stdio.h>
|
||||
|
|
||||
|
namespace iflytop { |
||||
|
|
||||
|
#define PI 3.14159265358979323846
|
||||
|
|
||||
|
class VolumeConvertor { |
||||
|
/**
|
||||
|
* @brief |
||||
|
* |
||||
|
* | <--r4_2 -->| |
||||
|
* _____________ |
||||
|
* | | |
||||
|
* | | |
||||
|
* | | h4 |
||||
|
* | | |
||||
|
* | r4_1 | |
||||
|
* \ / h3 |
||||
|
* | | h2 |
||||
|
* \ _____ / h1 |
||||
|
* |
||||
|
* |
||||
|
* | ru | |
||||
|
* ----------- |
||||
|
* \ / |
||||
|
* \ / h |
||||
|
* \_____/ |
||||
|
* |rb| |
||||
|
* |
||||
|
*/ |
||||
|
|
||||
|
float container_h4 = 2.2069; |
||||
|
float container_ru4 = 0.82; |
||||
|
float container_rb4 = 0.82; |
||||
|
|
||||
|
float container_h3 = 0.15; |
||||
|
float container_ru3 = 0.82; |
||||
|
float container_rb3 = 0.67; |
||||
|
|
||||
|
float container_h2 = 0.0845; |
||||
|
float container_ru2 = 0.67; |
||||
|
float container_rb2 = 0.67; |
||||
|
|
||||
|
float container_h1 = 0.0845; |
||||
|
float container_ru1 = 0.67; |
||||
|
float container_rb1 = 0.05; |
||||
|
|
||||
|
float density = 1000; // kg/m^3
|
||||
|
|
||||
|
public: |
||||
|
float pressurePa2VolumeG(float _pa); |
||||
|
|
||||
|
private: |
||||
|
float pa2high(float pa); |
||||
|
/**
|
||||
|
* @brief 计算倒圆锥体积 |
||||
|
* |
||||
|
* @param rb 圆锥体底部半径 |
||||
|
* @param ru 圆锥体顶部半径 |
||||
|
* @param h 圆锥体高度 |
||||
|
* @param nowh 圆锥内液面高度 |
||||
|
* @return float |
||||
|
*/ |
||||
|
float computeConeVolume(float rb, float ru, float h, float nowh); |
||||
|
}; |
||||
|
|
||||
|
} // namespace iflytop
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue