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