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_dump.h"
17 #include <inttypes.h>
18 #include "devhost_dump_reg.h"
19 #include "sensor_uhdf_log.h"
20 #include "sensor_channel.h"
21 #include "sensor_controller.h"
22 #include "sensor_manager.h"
23
24 #define HDF_LOG_TAG uhdf_sensor_service
25 #define STRING_LEN 2048
26
27 static const char *g_helpComment =
28 " Sensor manager dump options:\n"
29 " -h: [sensor command help]\n"
30 " -l: [show sensor list]\n"
31 " -d: [The data information is displayed 10 times]\n";
32
33 struct SensorDevelopmentList {
34 int32_t sensorTypeId;
35 char sensorName[SENSOR_NAME_MAX_LEN];
36 int32_t dataDimension;
37 };
38
39 struct SensorDevelopmentList g_sensorList[] = {
40 { SENSOR_TYPE_NONE, "sensor_test", DATA_X },
41 { SENSOR_TYPE_ACCELEROMETER, "accelerometer", DATA_XYZ },
42 { SENSOR_TYPE_PEDOMETER, "pedometer", DATA_X },
43 { SENSOR_TYPE_PROXIMITY, "proximity", DATA_X },
44 { SENSOR_TYPE_HALL, "hallrometer", DATA_X },
45 { SENSOR_TYPE_BAROMETER, "barometer", DATA_XY },
46 { SENSOR_TYPE_AMBIENT_LIGHT, "als", DATA_X },
47 { SENSOR_TYPE_MAGNETIC_FIELD, "magnetometer", DATA_XYZ },
48 { SENSOR_TYPE_GYROSCOPE, "gyroscope", DATA_XYZ },
49 { SENSOR_TYPE_GRAVITY, "gravity", DATA_XYZ }
50 };
51
SensorShowList(struct HdfSBuf * reply)52 int32_t SensorShowList(struct HdfSBuf *reply)
53 {
54 int32_t index = -1;
55 int32_t ret = 0;
56 int32_t *sensorStatus = NULL;
57 struct SensorDevManager *sensorList = NULL;
58 char sensorInfoDate[STRING_LEN] = { 0 };
59
60 sensorList = GetSensorDevManager();
61 if ((sensorList == NULL) || (sensorList->sensorInfoEntry == NULL) || (sensorList->sensorSum == 0)) {
62 HDF_LOGE("%{publuc}s: sensorList is failed\n", __func__);
63 return DUMP_NULL_PTR;
64 }
65
66 sensorStatus = GetSensorStatus();
67 if (sensorStatus == NULL) {
68 HDF_LOGE("%{publuc}s: sensorStatus is failed\n", __func__);
69 return DUMP_NULL_PTR;
70 }
71
72 for (index = 0; index < sensorList->sensorSum; index++) {
73 ret = memset_s(sensorInfoDate, STRING_LEN, 0, STRING_LEN);
74 if (ret != DUMP_SUCCESS) {
75 HDF_LOGE("%{publuc}s: memset sensorInfoList is failed\n", __func__);
76 return DUMP_FAILURE;
77 }
78
79 ret = sprintf_s(sensorInfoDate, STRING_LEN,
80 "=================================================\n\r \
81 sensorName: %s \n\r \
82 sensorId: %d \n\r \
83 sensorStatus: %d \n\r \
84 maxRange: %f \n\r \
85 accuracy: %f \n\r \
86 power: %f \n\r \
87 minDelay: %" PRId64 "\n\r \
88 maxDelay: %" PRId64 "\n\r \
89 fifoMaxEventCount: %u \n\r",
90 sensorList->sensorInfoEntry[index].sensorName,
91 sensorList->sensorInfoEntry[index].sensorId,
92 sensorStatus[sensorList->sensorInfoEntry[index].sensorId],
93 sensorList->sensorInfoEntry[index].maxRange,
94 sensorList->sensorInfoEntry[index].accuracy,
95 sensorList->sensorInfoEntry[index].power,
96 sensorList->sensorInfoEntry[index].minDelay,
97 sensorList->sensorInfoEntry[index].maxDelay,
98 sensorList->sensorInfoEntry[index].fifoMaxEventCount);
99 if (ret < DUMP_SUCCESS) {
100 HDF_LOGE("%{publuc}s: sprintf sensorList is failed\n", __func__);
101 return DUMP_FAILURE;
102 }
103
104 (void)HdfSbufWriteString(reply, sensorInfoDate);
105 }
106
107 return DUMP_SUCCESS;
108 }
109
ShowData(const float * data,int64_t timesTamp,const struct SensorDevelopmentList sensorNode,struct HdfSBuf * reply)110 static void ShowData(const float *data, int64_t timesTamp, const struct SensorDevelopmentList sensorNode,
111 struct HdfSBuf *reply)
112 {
113 int32_t ret = 0;
114 char sensorInfoDate[STRING_LEN] = { 0 };
115
116 if (sensorNode.dataDimension == DATA_X) {
117 ret = sprintf_s(sensorInfoDate, STRING_LEN,
118 "sensor name :[%s], sensor id :[%d], ts=[%0.9f], data= [%f]\n\r",
119 sensorNode.sensorName, sensorNode.sensorTypeId, timesTamp / 1e9, *(data));
120 if (ret < DUMP_SUCCESS) {
121 HDF_LOGE("%{publuc}s: sprintf sensorInfoDate is failed\n", __func__);
122 return;
123 }
124 } else {
125 ret = sprintf_s(sensorInfoDate, STRING_LEN,
126 "sensor name :[%s], sensor id :[%d], ts=[%0.9f], data= [%f], [%f], [%f]\n\r",
127 sensorNode.sensorName, sensorNode.sensorTypeId, timesTamp / 1e9, *(data), *(data + DATA_X),
128 *(data + DATA_XY));
129 if (ret < DUMP_SUCCESS) {
130 HDF_LOGE("%{publuc}s: sprintf ShowData is failed\n", __func__);
131 return;
132 }
133 }
134 (void)HdfSbufWriteString(reply, sensorInfoDate);
135 }
136
SensorShowData(struct HdfSBuf * reply)137 int32_t SensorShowData(struct HdfSBuf *reply)
138 {
139 int32_t len;
140 int32_t ret = 0;
141 struct SensorDatePack *eventDumpList;
142 char sensorInfoDate[STRING_LEN] = { 0 };
143
144 eventDumpList = GetEventData();
145
146 ret = sprintf_s(sensorInfoDate, STRING_LEN, "======The last 10 data records======\n\r");
147 if (ret < DUMP_SUCCESS) {
148 HDF_LOGE("%{publuc}s: sprintf SensorShowData is failed\n", __func__);
149 return DUMP_NULL_PTR;
150 }
151 (void)HdfSbufWriteString(reply, sensorInfoDate);
152
153 if (eventDumpList->count < MAX_DUMP_DATA_SIZE) {
154 for (len = 0; len < eventDumpList->count; len++) {
155 float *data = (float *)(eventDumpList->listDumpArr[len].data);
156 ShowData(data, eventDumpList->listDumpArr[len].timestamp,
157 g_sensorList[eventDumpList->listDumpArr[len].sensorId], reply);
158 }
159 } else {
160 int32_t pos = eventDumpList->pos;
161 for (len = 0; len < eventDumpList->count; len++) {
162 pos = pos + 1 > MAX_DUMP_DATA_SIZE ? 1 : pos + 1;
163 float *data = (float *)(eventDumpList->listDumpArr[pos - 1].data);
164 ShowData(data, eventDumpList->listDumpArr[pos - 1].timestamp,
165 g_sensorList[eventDumpList->listDumpArr[pos - 1].sensorId], reply);
166 }
167 }
168
169 return DUMP_SUCCESS;
170 }
171
DevHostSensorDump(struct HdfSBuf * data,struct HdfSBuf * reply)172 static int32_t DevHostSensorDump(struct HdfSBuf *data, struct HdfSBuf *reply)
173 {
174 uint32_t argv = 0;
175
176 if (data == NULL || reply == NULL) {
177 HDF_LOGE("%{public}s data or reply is invalid", __func__);
178 return HDF_FAILURE;
179 }
180
181 if (!HdfSbufReadUint32(data, &argv)) {
182 HDF_LOGE("%{public}s: read &argv failed!", __func__);
183 return DUMP_FAILURE;
184 }
185
186 if (argv == 0) {
187 (void)HdfSbufWriteString(reply, g_helpComment);
188 return HDF_SUCCESS;
189 }
190
191 for (uint32_t i = 0; i < argv; i++) {
192 const char *value = HdfSbufReadString(data);
193 if (value == NULL) {
194 HDF_LOGE("%{public}s value is invalid", __func__);
195 return HDF_FAILURE;
196 }
197 if (strcmp(value, "-h") == 0) {
198 (void)HdfSbufWriteString(reply, g_helpComment);
199 return HDF_SUCCESS;
200 } else if (strcmp(value, "-l") == 0) {
201 SensorShowList(reply);
202 return HDF_SUCCESS;
203 } else if (strcmp(value, "-d") == 0) {
204 SensorShowData(reply);
205 return HDF_SUCCESS;
206 }
207 }
208
209 return HDF_SUCCESS;
210 }
211
SensorDevRegisterDump(void)212 void SensorDevRegisterDump(void)
213 {
214 DevHostRegisterDumpHost(DevHostSensorDump);
215 }
216