xref: /aosp_15_r20/hardware/interfaces/automotive/can/1.0/default/CanBus.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #pragma once
18*4d7e907cSAndroid Build Coastguard Worker 
19*4d7e907cSAndroid Build Coastguard Worker #include "CanSocket.h"
20*4d7e907cSAndroid Build Coastguard Worker 
21*4d7e907cSAndroid Build Coastguard Worker #include <android-base/unique_fd.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/automotive/can/1.0/ICanBus.h>
23*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/automotive/can/1.0/ICanController.h>
24*4d7e907cSAndroid Build Coastguard Worker #include <utils/Mutex.h>
25*4d7e907cSAndroid Build Coastguard Worker 
26*4d7e907cSAndroid Build Coastguard Worker #include <atomic>
27*4d7e907cSAndroid Build Coastguard Worker #include <mutex>
28*4d7e907cSAndroid Build Coastguard Worker #include <thread>
29*4d7e907cSAndroid Build Coastguard Worker 
30*4d7e907cSAndroid Build Coastguard Worker namespace android::hardware::automotive::can::V1_0::implementation {
31*4d7e907cSAndroid Build Coastguard Worker 
32*4d7e907cSAndroid Build Coastguard Worker struct CanBus : public ICanBus {
33*4d7e907cSAndroid Build Coastguard Worker     using ErrorCallback = std::function<void()>;
34*4d7e907cSAndroid Build Coastguard Worker 
35*4d7e907cSAndroid Build Coastguard Worker     virtual ~CanBus();
36*4d7e907cSAndroid Build Coastguard Worker 
37*4d7e907cSAndroid Build Coastguard Worker     Return<Result> send(const CanMessage& message) override;
38*4d7e907cSAndroid Build Coastguard Worker     Return<void> listen(const hidl_vec<CanMessageFilter>& filter,
39*4d7e907cSAndroid Build Coastguard Worker                         const sp<ICanMessageListener>& listener, listen_cb _hidl_cb) override;
40*4d7e907cSAndroid Build Coastguard Worker     Return<sp<ICloseHandle>> listenForErrors(const sp<ICanErrorListener>& listener) override;
41*4d7e907cSAndroid Build Coastguard Worker 
42*4d7e907cSAndroid Build Coastguard Worker     void setErrorCallback(ErrorCallback errcb);
43*4d7e907cSAndroid Build Coastguard Worker     ICanController::Result up();
44*4d7e907cSAndroid Build Coastguard Worker     bool down();
45*4d7e907cSAndroid Build Coastguard Worker 
46*4d7e907cSAndroid Build Coastguard Worker   protected:
47*4d7e907cSAndroid Build Coastguard Worker     /**
48*4d7e907cSAndroid Build Coastguard Worker      * Blank constructor, since some interface types (such as SLCAN) don't get a name until after
49*4d7e907cSAndroid Build Coastguard Worker      * being initialized.
50*4d7e907cSAndroid Build Coastguard Worker      *
51*4d7e907cSAndroid Build Coastguard Worker      * If using this constructor, you MUST initialize mIfname prior to the completion of preUp().
52*4d7e907cSAndroid Build Coastguard Worker      */
53*4d7e907cSAndroid Build Coastguard Worker     CanBus();
54*4d7e907cSAndroid Build Coastguard Worker 
55*4d7e907cSAndroid Build Coastguard Worker     CanBus(const std::string& ifname);
56*4d7e907cSAndroid Build Coastguard Worker 
57*4d7e907cSAndroid Build Coastguard Worker     /**
58*4d7e907cSAndroid Build Coastguard Worker      * Prepare the SocketCAN interface.
59*4d7e907cSAndroid Build Coastguard Worker      *
60*4d7e907cSAndroid Build Coastguard Worker      * After calling this method, mIfname network interface is available and ready to be brought up.
61*4d7e907cSAndroid Build Coastguard Worker      *
62*4d7e907cSAndroid Build Coastguard Worker      * \return OK on success, or an error state on failure. See ICanController::Result
63*4d7e907cSAndroid Build Coastguard Worker      */
64*4d7e907cSAndroid Build Coastguard Worker     virtual ICanController::Result preUp();
65*4d7e907cSAndroid Build Coastguard Worker 
66*4d7e907cSAndroid Build Coastguard Worker     /**
67*4d7e907cSAndroid Build Coastguard Worker      * Cleanup after bringing the interface down.
68*4d7e907cSAndroid Build Coastguard Worker      *
69*4d7e907cSAndroid Build Coastguard Worker      * This is a counterpart to preUp().
70*4d7e907cSAndroid Build Coastguard Worker      *
71*4d7e907cSAndroid Build Coastguard Worker      * \return true upon success and false upon failure
72*4d7e907cSAndroid Build Coastguard Worker      */
73*4d7e907cSAndroid Build Coastguard Worker     virtual bool postDown();
74*4d7e907cSAndroid Build Coastguard Worker 
75*4d7e907cSAndroid Build Coastguard Worker     /** Network interface name. */
76*4d7e907cSAndroid Build Coastguard Worker     std::string mIfname;
77*4d7e907cSAndroid Build Coastguard Worker 
78*4d7e907cSAndroid Build Coastguard Worker   private:
79*4d7e907cSAndroid Build Coastguard Worker     struct CanMessageListener {
80*4d7e907cSAndroid Build Coastguard Worker         sp<ICanMessageListener> callback;
81*4d7e907cSAndroid Build Coastguard Worker         hidl_vec<CanMessageFilter> filter;
82*4d7e907cSAndroid Build Coastguard Worker         wp<ICloseHandle> closeHandle;
83*4d7e907cSAndroid Build Coastguard Worker         bool failedOnce = false;
84*4d7e907cSAndroid Build Coastguard Worker     };
85*4d7e907cSAndroid Build Coastguard Worker     void clearMsgListeners();
86*4d7e907cSAndroid Build Coastguard Worker     void clearErrListeners();
87*4d7e907cSAndroid Build Coastguard Worker 
88*4d7e907cSAndroid Build Coastguard Worker     void notifyErrorListeners(ErrorEvent err, bool isFatal);
89*4d7e907cSAndroid Build Coastguard Worker 
90*4d7e907cSAndroid Build Coastguard Worker     void onRead(const struct canfd_frame& frame, std::chrono::nanoseconds timestamp);
91*4d7e907cSAndroid Build Coastguard Worker     void onError(int errnoVal);
92*4d7e907cSAndroid Build Coastguard Worker 
93*4d7e907cSAndroid Build Coastguard Worker     std::mutex mMsgListenersGuard;
94*4d7e907cSAndroid Build Coastguard Worker     std::vector<CanMessageListener> mMsgListeners GUARDED_BY(mMsgListenersGuard);
95*4d7e907cSAndroid Build Coastguard Worker 
96*4d7e907cSAndroid Build Coastguard Worker     std::mutex mErrListenersGuard;
97*4d7e907cSAndroid Build Coastguard Worker     std::vector<sp<ICanErrorListener>> mErrListeners GUARDED_BY(mErrListenersGuard);
98*4d7e907cSAndroid Build Coastguard Worker 
99*4d7e907cSAndroid Build Coastguard Worker     std::unique_ptr<CanSocket> mSocket;
100*4d7e907cSAndroid Build Coastguard Worker     bool mDownAfterUse;
101*4d7e907cSAndroid Build Coastguard Worker 
102*4d7e907cSAndroid Build Coastguard Worker     /**
103*4d7e907cSAndroid Build Coastguard Worker      * Guard for up flag is required to be held for entire time when the interface is being used
104*4d7e907cSAndroid Build Coastguard Worker      * (i.e. message being sent), because we don't want the interface to be torn down while
105*4d7e907cSAndroid Build Coastguard Worker      * executing that operation.
106*4d7e907cSAndroid Build Coastguard Worker      */
107*4d7e907cSAndroid Build Coastguard Worker     std::mutex mIsUpGuard;
108*4d7e907cSAndroid Build Coastguard Worker     bool mIsUp GUARDED_BY(mIsUpGuard) = false;
109*4d7e907cSAndroid Build Coastguard Worker 
110*4d7e907cSAndroid Build Coastguard Worker     ErrorCallback mErrCb;
111*4d7e907cSAndroid Build Coastguard Worker };
112*4d7e907cSAndroid Build Coastguard Worker 
113*4d7e907cSAndroid Build Coastguard Worker }  // namespace android::hardware::automotive::can::V1_0::implementation
114