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