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 <android-base/macros.h> 20*4d7e907cSAndroid Build Coastguard Worker #include <android-base/unique_fd.h> 21*4d7e907cSAndroid Build Coastguard Worker #include <linux/can.h> 22*4d7e907cSAndroid Build Coastguard Worker 23*4d7e907cSAndroid Build Coastguard Worker #include <atomic> 24*4d7e907cSAndroid Build Coastguard Worker #include <chrono> 25*4d7e907cSAndroid Build Coastguard Worker #include <functional> 26*4d7e907cSAndroid Build Coastguard Worker #include <thread> 27*4d7e907cSAndroid Build Coastguard Worker 28*4d7e907cSAndroid Build Coastguard Worker namespace android::hardware::automotive::can::V1_0::implementation { 29*4d7e907cSAndroid Build Coastguard Worker 30*4d7e907cSAndroid Build Coastguard Worker /** Wrapper around SocketCAN socket. */ 31*4d7e907cSAndroid Build Coastguard Worker struct CanSocket { 32*4d7e907cSAndroid Build Coastguard Worker using ReadCallback = std::function<void(const struct canfd_frame&, std::chrono::nanoseconds)>; 33*4d7e907cSAndroid Build Coastguard Worker using ErrorCallback = std::function<void(int errnoVal)>; 34*4d7e907cSAndroid Build Coastguard Worker 35*4d7e907cSAndroid Build Coastguard Worker /** 36*4d7e907cSAndroid Build Coastguard Worker * Open and bind SocketCAN socket. 37*4d7e907cSAndroid Build Coastguard Worker * 38*4d7e907cSAndroid Build Coastguard Worker * \param ifname SocketCAN network interface name (such as can0) 39*4d7e907cSAndroid Build Coastguard Worker * \param rdcb Callback on received messages 40*4d7e907cSAndroid Build Coastguard Worker * \param errcb Callback on socket failure 41*4d7e907cSAndroid Build Coastguard Worker * \return Socket instance, or nullptr if it wasn't possible to open one 42*4d7e907cSAndroid Build Coastguard Worker */ 43*4d7e907cSAndroid Build Coastguard Worker static std::unique_ptr<CanSocket> open(const std::string& ifname, ReadCallback rdcb, 44*4d7e907cSAndroid Build Coastguard Worker ErrorCallback errcb); 45*4d7e907cSAndroid Build Coastguard Worker virtual ~CanSocket(); 46*4d7e907cSAndroid Build Coastguard Worker 47*4d7e907cSAndroid Build Coastguard Worker /** 48*4d7e907cSAndroid Build Coastguard Worker * Send CAN frame. 49*4d7e907cSAndroid Build Coastguard Worker * 50*4d7e907cSAndroid Build Coastguard Worker * \param frame Frame to send 51*4d7e907cSAndroid Build Coastguard Worker * \return true in case of success, false otherwise 52*4d7e907cSAndroid Build Coastguard Worker */ 53*4d7e907cSAndroid Build Coastguard Worker bool send(const struct canfd_frame& frame); 54*4d7e907cSAndroid Build Coastguard Worker 55*4d7e907cSAndroid Build Coastguard Worker private: 56*4d7e907cSAndroid Build Coastguard Worker CanSocket(base::unique_fd socket, ReadCallback rdcb, ErrorCallback errcb); 57*4d7e907cSAndroid Build Coastguard Worker void readerThread(); 58*4d7e907cSAndroid Build Coastguard Worker 59*4d7e907cSAndroid Build Coastguard Worker ReadCallback mReadCallback; 60*4d7e907cSAndroid Build Coastguard Worker ErrorCallback mErrorCallback; 61*4d7e907cSAndroid Build Coastguard Worker 62*4d7e907cSAndroid Build Coastguard Worker const base::unique_fd mSocket; 63*4d7e907cSAndroid Build Coastguard Worker std::thread mReaderThread; 64*4d7e907cSAndroid Build Coastguard Worker std::atomic<bool> mStopReaderThread = false; 65*4d7e907cSAndroid Build Coastguard Worker std::atomic<bool> mReaderThreadFinished = false; 66*4d7e907cSAndroid Build Coastguard Worker 67*4d7e907cSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(CanSocket); 68*4d7e907cSAndroid Build Coastguard Worker }; 69*4d7e907cSAndroid Build Coastguard Worker 70*4d7e907cSAndroid Build Coastguard Worker } // namespace android::hardware::automotive::can::V1_0::implementation 71