1 /*
2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include <cmath>
16
17 #include "osal_mem.h"
18 #include "sensor_callback_impl.h"
19 #include "sensor_type.h"
20 #include "hdf_log.h"
21
22 namespace OHOS {
23 namespace HDI {
24 namespace Sensor {
25 namespace V2_0 {
26 uint32_t SensorCallbackImpl::sensorDataFlag = 1;
27 namespace {
28 struct SensorValueRange {
29 float highThreshold;
30 float lowThreshold;
31 };
32
33 struct SensorDevelopmentList {
34 int32_t sensorTypeId;
35 char sensorName[SENSOR_NAME_MAX_LEN];
36 int32_t dataForm; // 0: fixed, 1: range
37 int32_t dataDimension;
38 struct SensorValueRange *valueRange;
39 };
40
41 struct SensorValueRange g_testRange[] = {{1e5, 0.0}};
42 struct SensorValueRange g_accelRange[] = {{78.0, -78.0}, {78.0, -78.0}, {78.0, -78.0}};
43 struct SensorValueRange g_alsRange[] = {{10000000.0, 0.0}};
44 struct SensorValueRange g_pedometerRange[] = {{10000.0, 0.0}};
45 struct SensorValueRange g_proximityRange[] = {{5.0, 0.0}};
46 struct SensorValueRange g_hallRange[] = {{2.0, 0.0}};
47 struct SensorValueRange g_barometerRange[] = {{1100.0, -1100.0}, {1100.0, -1100.0}};
48 struct SensorValueRange g_magneticRange[] = {{2000.0, -2000.0}, {2000.0, -2000.0}, {2000.0, -2000.0}};
49 struct SensorValueRange g_gyroscopeRange[] = {{35.0, -35.0}, {35.0, -35.0}, {35.0, -35.0}};
50 struct SensorValueRange g_gravityRange[] = {{78.0, -78.0}, {78.0, -78.0}, {78.0, -78.0}};
51 struct SensorValueRange g_humidityRange[] = {{100, 0}};
52 struct SensorValueRange g_temperatureRange[] = {{125, -40}};
53
54 struct SensorDevelopmentList g_sensorList[] = {
55 {SENSOR_TYPE_NONE, "sensor_test", 1, 1, g_testRange},
56 {SENSOR_TYPE_ACCELEROMETER, "accelerometer", 1, 3, g_accelRange},
57 {SENSOR_TYPE_PEDOMETER, "pedometer", 1, 1, g_pedometerRange},
58 {SENSOR_TYPE_PROXIMITY, "proximity", 0, 1, g_proximityRange},
59 {SENSOR_TYPE_HALL, "hallrometer", 1, 1, g_hallRange},
60 {SENSOR_TYPE_BAROMETER, "barometer", 1, 2, g_barometerRange},
61 {SENSOR_TYPE_AMBIENT_LIGHT, "als", 1, 1, g_alsRange},
62 {SENSOR_TYPE_MAGNETIC_FIELD, "magnetometer", 1, 3, g_magneticRange},
63 {SENSOR_TYPE_GYROSCOPE, "gyroscope", 1, 3, g_gyroscopeRange},
64 {SENSOR_TYPE_GRAVITY, "gravity", 1, 3, g_gravityRange},
65 {SENSOR_TYPE_HUMIDITY, "humidity", 1, 1, g_humidityRange},
66 {SENSOR_TYPE_TEMPERATURE, "tenperature", 1, 1, g_temperatureRange}
67 };
68
69 constexpr int32_t LIST_NUM = sizeof(g_sensorList) / sizeof(g_sensorList[0]);
70 constexpr float EPSINON = 1e-6;
71
SensorDataVerification(const float & data,const struct SensorDevelopmentList & sensorNode)72 void SensorDataVerification(const float &data, const struct SensorDevelopmentList &sensorNode)
73 {
74 for (int32_t j = 0; j < sensorNode.dataDimension; ++j) {
75 if (sensorNode.dataForm == 0) {
76 if (std::abs(*(&data + j) - sensorNode.valueRange[j].highThreshold) < EPSINON ||
77 std::abs(*(&data + j) - sensorNode.valueRange[j].lowThreshold) < EPSINON) {
78 SensorCallbackImpl::sensorDataFlag &= 1;
79 } else {
80 SensorCallbackImpl::sensorDataFlag = 0;
81 printf("%s: %s Not expected\n\r", __func__, sensorNode.sensorName);
82 }
83 }
84
85 if (sensorNode.dataForm == 1) {
86 if (*(&data + j) >= sensorNode.valueRange[j].lowThreshold &&
87 *(&data + j) <= sensorNode.valueRange[j].highThreshold) {
88 SensorCallbackImpl::sensorDataFlag &= 1;
89 } else {
90 SensorCallbackImpl::sensorDataFlag = 0;
91 printf("%s: %s Not expected\n\r", __func__, sensorNode.sensorName);
92 }
93 }
94 }
95 }
96 }
97
OnDataEvent(const HdfSensorEvents & event)98 int32_t SensorCallbackImpl::OnDataEvent(const HdfSensorEvents& event)
99 {
100 void *origin = OsalMemCalloc(sizeof(uint8_t) * (event.dataLen));
101 if (origin == nullptr) {
102 return HDF_FAILURE;
103 }
104 uint8_t *tmp = static_cast<uint8_t*>(origin);
105 uint8_t *eventData = tmp;
106 for (auto value : event.data) {
107 *tmp++ = value;
108 }
109 HDF_LOGI("%{public}s: event info: sensorId = %{public}d, option = %{public}d, mode = %{public}d\n\r", __func__,
110 event.sensorId, event.option, event.mode);
111
112 for (int32_t i = 0; i < LIST_NUM; ++i) {
113 if (event.sensorId == g_sensorList[i].sensorTypeId) {
114 float *data = reinterpret_cast<float*>(eventData);
115 SensorDataVerification(*data, g_sensorList[i]);
116 }
117 }
118 OsalMemFree(origin);
119 return HDF_SUCCESS;
120 }
121 } // V2_0
122 } // Sensor
123 } // HDI
124 } // OHOS
125