1 /*
2  * Copyright (c) 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 
16 #include "sensor_callback_impl.h"
17 #include "sensor_type.h"
18 #include "osal_mem.h"
19 
20 namespace OHOS {
21 namespace HDI {
22 namespace Sensor {
23 namespace V2_0 {
24 uint32_t SensorCallbackImpl::sensorDataFlag = 1;
25 namespace {
26 struct SensorValueRange {
27     float highThreshold;
28     float lowThreshold;
29 };
30 
31 struct SensorDevelopmentList {
32     int32_t sensorTypeId;
33     char sensorName[SENSOR_NAME_MAX_LEN];
34     int32_t dataForm; // 0: fixed, 1: range
35     int32_t dataDimension;
36     struct SensorValueRange *valueRange;
37 };
38 
39 struct SensorValueRange g_testRange[] = {{1e5, 0.0}};
40 struct SensorValueRange g_accelRange[] = {{78.0, -78.0}, {78.0, -78.0}, {78.0, -78.0}};
41 struct SensorValueRange g_alsRange[] = {{10000.0, 0.0}};
42 struct SensorValueRange g_pedometerRange[] = {{10000.0, 0.0}};
43 struct SensorValueRange g_proximityRange[] = {{5.0, 0.0}};
44 struct SensorValueRange g_hallRange[] = {{1.0, 0.0}};
45 struct SensorValueRange g_barometerRange[] = {{1100.0, -1100.0}, {1100.0, -1100.0}};
46 struct SensorValueRange g_magneticRange[] = {{2000.0, -2000.0}, {2000.0, -2000.0}, {2000.0, -2000.0}};
47 struct SensorValueRange g_gyroscopeRange[] = {{35.0, -35.0}, {35.0, -35.0}, {35.0, -35.0}};
48 struct SensorValueRange g_gravityRange[] = {{78.0, -78.0}, {78.0, -78.0}, {78.0, -78.0}};
49 
50 struct SensorDevelopmentList g_sensorList[] = {{SENSOR_TYPE_NONE, "sensor_test", 1, 1, g_testRange},
51                                                {SENSOR_TYPE_ACCELEROMETER, "accelerometer", 1, 3, g_accelRange},
52                                                {SENSOR_TYPE_PEDOMETER, "pedometer", 1, 1, g_pedometerRange},
53                                                {SENSOR_TYPE_PROXIMITY, "proximity", 0, 1, g_proximityRange},
54                                                {SENSOR_TYPE_HALL, "hallrometer", 0, 1, g_hallRange},
55                                                {SENSOR_TYPE_BAROMETER, "barometer", 1, 2, g_barometerRange},
56                                                {SENSOR_TYPE_AMBIENT_LIGHT, "als", 1, 1, g_alsRange},
57                                                {SENSOR_TYPE_MAGNETIC_FIELD, "magnetometer", 1, 3, g_magneticRange},
58                                                {SENSOR_TYPE_GYROSCOPE, "gyroscope", 1, 3, g_gyroscopeRange},
59                                                {SENSOR_TYPE_GRAVITY, "gravity", 1, 3, g_gravityRange}};
60 
61 constexpr int LIST_NUM = sizeof(g_sensorList) / sizeof(g_sensorList[0]);
62 constexpr float EPSINON = 1e-6;
63 
SensorDataVerification(const float &data, const struct SensorDevelopmentList &sensorNode)64 void SensorDataVerification(const float &data, const struct SensorDevelopmentList &sensorNode)
65 {
66     for (int32_t j = 0; j < sensorNode.dataDimension; ++j) {
67         printf("sensor id :[%d], data[%d]: %f\n\r", sensorNode.sensorTypeId, j + 1, *(&data + j));
68         if (sensorNode.dataForm == 0) {
69             if (abs(*(&data + j) - sensorNode.valueRange[j].highThreshold) < EPSINON ||
70                 abs(*(&data + j) - sensorNode.valueRange[j].lowThreshold) < EPSINON) {
71                 SensorCallbackImpl::sensorDataFlag &= 1;
72             } else {
73                 SensorCallbackImpl::sensorDataFlag = 0;
74                 printf("%s: %s Not expected\n\r", __func__, sensorNode.sensorName);
75             }
76         }
77 
78         if (sensorNode.dataForm == 1) {
79             if (*(&data + j) >= sensorNode.valueRange[j].lowThreshold &&
80                 *(&data + j) <= sensorNode.valueRange[j].highThreshold) {
81                 SensorCallbackImpl::sensorDataFlag &= 1;
82                 printf("sensorDataFlag = 1;");
83             } else {
84                 SensorCallbackImpl::sensorDataFlag = 0;
85                 printf("%s: %s Not expected\n\r", __func__, sensorNode.sensorName);
86             }
87         }
88     }
89 }
90 } // namespace
91 
OnDataEvent(const HdfSensorEvents &event)92 int32_t SensorCallbackImpl::OnDataEvent(const HdfSensorEvents &event)
93 {
94     void *origin = OsalMemCalloc(sizeof(uint8_t) * (event.dataLen));
95     uint8_t *tmp = static_cast<uint8_t *>(origin);
96     uint8_t *eventData = tmp;
97     float *data;
98     for (auto value : event.data) {
99         *tmp++ = value;
100     }
101 
102     for (int i = 0; i < LIST_NUM; ++i) {
103         if (event.sensorId == g_sensorList[i].sensorTypeId) {
104             data = reinterpret_cast<float *>(eventData);
105             SensorDataVerification(*data, g_sensorList[i]);
106         }
107     }
108     OsalMemFree(origin);
109     return HDF_SUCCESS;
110 }
111 } // V2_0
112 } // Sensor
113 } // HDI
114 } // OHOS
115