• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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_data_channel.h"
17 
18 #include "errors.h"
19 
20 #include "fd_listener.h"
21 #include "sensor_errors.h"
22 #include "sensor_file_descriptor_listener.h"
23 
24 #undef LOG_TAG
25 #define LOG_TAG "SensorDataChannel"
26 namespace OHOS {
27 namespace Sensors {
28 using namespace OHOS::HiviewDFX;
29 using namespace OHOS::AppExecFwk;
30 
CreateSensorDataChannel(DataChannelCB callBack,void * data)31 int32_t SensorDataChannel::CreateSensorDataChannel(DataChannelCB callBack, void *data)
32 {
33     CHKPR(callBack, SENSOR_NATIVE_REGSITER_CB_ERR);
34     dataCB_ = callBack;
35     privateData_ = data;
36     return InnerSensorDataChannel();
37 }
38 
RestoreSensorDataChannel()39 int32_t SensorDataChannel::RestoreSensorDataChannel()
40 {
41     CHKPR(dataCB_, SENSOR_NATIVE_REGSITER_CB_ERR);
42     if (GetReceiveDataFd() != -1) {
43         SEN_HILOGW("Restore sensor data channel failed, please destroy sensor data channel first");
44         return SENSOR_CHANNEL_RESTORE_FD_ERR;
45     }
46     return InnerSensorDataChannel();
47 }
48 
InnerSensorDataChannel()49 int32_t SensorDataChannel::InnerSensorDataChannel()
50 {
51     std::lock_guard<std::mutex> eventRunnerLock(eventRunnerMutex_);
52     // create basic data channel
53     int32_t ret = CreateSensorBasicChannel();
54     if (ret != ERR_OK) {
55         SEN_HILOGE("Create basic channel failed, ret:%{public}d", ret);
56         return ret;
57     }
58     auto listener = std::make_shared<SensorFileDescriptorListener>();
59     listener->SetChannel(this);
60     if (eventHandler_ == nullptr) {
61         auto myRunner = AppExecFwk::EventRunner::Create(true, AppExecFwk::ThreadMode::FFRT);
62         CHKPR(myRunner, ERROR);
63         eventHandler_ = std::make_shared<SensorEventHandler>(myRunner);
64     }
65     int32_t receiveFd = GetReceiveDataFd();
66     auto inResult = eventHandler_->AddFileDescriptorListener(receiveFd,
67         AppExecFwk::FILE_DESCRIPTOR_INPUT_EVENT, listener, "SensorTask");
68     if (inResult != 0) {
69         SEN_HILOGE("AddFileDescriptorListener fail");
70         return ERROR;
71     }
72     auto pairRet = listenedFdSet_.insert(receiveFd);
73     if (!pairRet.second) {
74         SEN_HILOGE("ListenedFdSet insert fd fail, fd:%{public}d", receiveFd);
75         return ERROR;
76     }
77     return ERR_OK;
78 }
79 
DestroySensorDataChannel()80 int32_t SensorDataChannel::DestroySensorDataChannel()
81 {
82     DelFdListener(GetReceiveDataFd());
83     return DestroySensorBasicChannel();
84 }
85 
~SensorDataChannel()86 SensorDataChannel::~SensorDataChannel()
87 {
88     DestroySensorDataChannel();
89 }
90 
AddFdListener(int32_t fd,ReceiveMessageFun receiveMessage,DisconnectFun disconnect)91 int32_t SensorDataChannel::AddFdListener(int32_t fd, ReceiveMessageFun receiveMessage, DisconnectFun disconnect)
92 {
93     receiveMessage_ = receiveMessage;
94     disconnect_ = disconnect;
95     std::lock_guard<std::mutex> eventRunnerLock(eventRunnerMutex_);
96     if (eventHandler_ == nullptr) {
97         auto myRunner = AppExecFwk::EventRunner::Create(true, AppExecFwk::ThreadMode::FFRT);
98         CHKPR(myRunner, ERROR);
99         eventHandler_ = std::make_shared<SensorEventHandler>(myRunner);
100     }
101     auto listener = std::make_shared<FdListener>();
102     listener->SetChannel(this);
103     auto errCode = eventHandler_->AddFileDescriptorListener(fd, AppExecFwk::FILE_DESCRIPTOR_INPUT_EVENT, listener,
104         "SensorTask");
105     if (errCode != ERR_OK) {
106         SEN_HILOGE("Add fd listener failed, fd:%{public}d, errCode:%{public}u", fd, errCode);
107         return ERROR;
108     }
109     auto pairRet = listenedFdSet_.insert(fd);
110     if (!pairRet.second) {
111         SEN_HILOGE("ListenedFdSet insert fd fail, fd:%{public}d", fd);
112         return ERROR;
113     }
114     return ERR_OK;
115 }
116 
DelFdListener(int32_t fd)117 int32_t SensorDataChannel::DelFdListener(int32_t fd)
118 {
119     std::lock_guard<std::mutex> eventRunnerLock(eventRunnerMutex_);
120     CHKPR(eventHandler_, ERROR);
121     eventHandler_->RemoveFileDescriptorListener(fd);
122     auto it = listenedFdSet_.find(fd);
123     if (it == listenedFdSet_.end()) {
124         SEN_HILOGE("ListenedFdSet not find fd, fd:%{public}d", fd);
125         return ERROR;
126     }
127     listenedFdSet_.erase(it);
128     if (listenedFdSet_.empty() && eventHandler_ != nullptr) {
129         eventHandler_ = nullptr;
130         SEN_HILOGD("Set eventHandler_ nullptr");
131     }
132     return ERR_OK;
133 }
134 
GetReceiveMessageFun() const135 ReceiveMessageFun SensorDataChannel::GetReceiveMessageFun() const
136 {
137     return receiveMessage_;
138 }
139 
GetDisconnectFun() const140 DisconnectFun SensorDataChannel::GetDisconnectFun() const
141 {
142     return disconnect_;
143 }
144 }  // namespace Sensors
145 }  // namespace OHOS
146