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