1 /*
2 * Copyright (c) 2021 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_file_descriptor_listener.h"
17 #include "print_sensor_data.h"
18 #include "sensor_agent_type.h"
19 #include "sensor_basic_data_channel.h"
20 #include "sensor_errors.h"
21 #include "sys/socket.h"
22
23 #undef LOG_TAG
24 #define LOG_TAG "SensorFileDescriptorListener"
25
26 namespace OHOS {
27 namespace Sensors {
28 using namespace OHOS::HiviewDFX;
29 using namespace OHOS::AppExecFwk;
30
31 namespace {
32 constexpr int32_t RECEIVE_DATA_SIZE = 100;
33 } // namespace
34
SensorFileDescriptorListener()35 SensorFileDescriptorListener::SensorFileDescriptorListener()
36 {
37 receiveDataBuff_ = new (std::nothrow) SensorData[RECEIVE_DATA_SIZE];
38 CHKPL(receiveDataBuff_);
39 }
40
~SensorFileDescriptorListener()41 SensorFileDescriptorListener::~SensorFileDescriptorListener()
42 {
43 CALL_LOG_ENTER;
44 if (receiveDataBuff_ != nullptr) {
45 delete[] receiveDataBuff_;
46 receiveDataBuff_ = nullptr;
47 }
48 }
49
OnReadable(int32_t fileDescriptor)50 void SensorFileDescriptorListener::OnReadable(int32_t fileDescriptor)
51 {
52 if (fileDescriptor < 0) {
53 SEN_HILOGE("fileDescriptor:%{public}d", fileDescriptor);
54 return;
55 }
56 CHKPV(channel_);
57 if (receiveDataBuff_ == nullptr) {
58 SEN_HILOGE("Receive data buff_ is null");
59 return;
60 }
61 channel_->ReceiveData([this] (int32_t length) {
62 this->ExcuteCallback(length);
63 }, receiveDataBuff_, sizeof(SensorData) * RECEIVE_DATA_SIZE);
64 }
65
ExcuteCallback(int32_t length)66 void SensorFileDescriptorListener::ExcuteCallback(int32_t length)
67 {
68 int32_t eventSize = static_cast<int32_t>(sizeof(SensorData));
69 int32_t num = length / eventSize;
70 for (int i = 0; i < num; i++) {
71 SensorEvent event = {
72 .sensorTypeId = receiveDataBuff_[i].sensorTypeId,
73 .version = receiveDataBuff_[i].version,
74 .timestamp = receiveDataBuff_[i].timestamp,
75 .option = receiveDataBuff_[i].option,
76 .mode = receiveDataBuff_[i].mode,
77 .data = receiveDataBuff_[i].data,
78 .dataLen = receiveDataBuff_[i].dataLen
79 };
80 if (receiveDataBuff_[i].sensorTypeId == SENSOR_TYPE_ID_HALL_EXT) {
81 PrintSensorData::GetInstance().PrintSensorDataLog("ExcuteCallback", receiveDataBuff_[i]);
82 }
83 channel_->dataCB_(&event, 1, channel_->privateData_);
84 }
85 }
86
SetChannel(SensorDataChannel * channel)87 void SensorFileDescriptorListener::SetChannel(SensorDataChannel *channel)
88 {
89 SEN_HILOGI("In");
90 channel_ = channel;
91 }
92
OnShutdown(int32_t fileDescriptor)93 void SensorFileDescriptorListener::OnShutdown(int32_t fileDescriptor)
94 {
95 if (fileDescriptor < 0) {
96 SEN_HILOGE("Invalid fd:%{public}d", fileDescriptor);
97 }
98 if (receiveDataBuff_ != nullptr) {
99 delete[] receiveDataBuff_;
100 receiveDataBuff_ = nullptr;
101 }
102 CHKPV(channel_);
103 channel_->DestroySensorDataChannel();
104 }
105
OnException(int32_t fileDescriptor)106 void SensorFileDescriptorListener::OnException(int32_t fileDescriptor)
107 {
108 if (fileDescriptor < 0) {
109 SEN_HILOGE("Invalid fd:%{public}d", fileDescriptor);
110 }
111 if (receiveDataBuff_ != nullptr) {
112 delete[] receiveDataBuff_;
113 receiveDataBuff_ = nullptr;
114 }
115 CHKPV(channel_);
116 channel_->DestroySensorDataChannel();
117 }
118 } // namespace Sensors
119 } // namespace OHOS