diff --git a/CMakeLists.txt b/CMakeLists.txt index 843a2c1..c177ac4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,10 @@ cmake_minimum_required(VERSION 3.5.1) + +find_program(CCACHE_PROGRAM ccache) +if(CCACHE_PROGRAM) + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") +endif() + project(openauto CXX) set(CMAKE_AUTOMOC ON) @@ -22,10 +28,15 @@ set(Boost_USE_STATIC_RUNTIME OFF) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake_modules/") SET(CMAKE_CXX_STANDARD 14) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_INIT} -Wall -pedantic -fPIC") + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_INIT} -Wall -pedantic") set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") set(CMAKE_CXX_FLAGS_RELEASE "-g -O3") +if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 6.3) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi") +endif() + add_definitions(-DBOOST_ALL_DYN_LINK) find_package(Boost REQUIRED COMPONENTS system log OPTIONAL_COMPONENTS unit_test_framework) @@ -34,6 +45,8 @@ find_package(Qt5 COMPONENTS Multimedia MultimediaWidgets Bluetooth Qml Quick Qui find_package(Protobuf REQUIRED) find_package(OpenSSL REQUIRED) find_package(rtaudio REQUIRED) +find_package(aasdk REQUIRED) +find_package(ZLIB REQUIRED) find_package(GObject) if(WIN32) @@ -73,12 +86,9 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR} ${Qt5Bluetooth_INCLUDE_DIRS} ${QTGSTREAMER_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} - ${LIBUSB_1_INCLUDE_DIRS} ${PROTOBUF_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${RTAUDIO_INCLUDE_DIRS} - ${AASDK_PROTO_INCLUDE_DIRS} - ${AASDK_INCLUDE_DIRS} ${BCM_HOST_INCLUDE_DIRS} ${ILCLIENT_INCLUDE_DIRS} ${GST_INCLUDE_DIRS} @@ -94,26 +104,20 @@ file(GLOB_RECURSE autoapp_source_files ${autoapp_sources_directory}/*.ui ${autoa add_executable(autoapp ${autoapp_source_files}) -file(GLOB_RECURSE autoapp_lib_source_files ${autoapp_sources_directory}/App.cpp ${autoapp_sources_directory}/Configuration/*.cpp ${autoapp_sources_directory}/Projection/*.cpp ${autoapp_sources_directory}/Service/*.cpp) -file(GLOB_RECURSE autoapp_lib_inlcude_files ${autoapp_include_directory}/App.hpp ${autoapp_include_directory}/Configuration/*.hpp ${autoapp_include_directory}/Projection/*.hpp ${autoapp_include_directory}/Service/*.hpp) -add_library(auto SHARED ${autoapp_lib_source_files} ${autoapp_lib_inlcude_files}) message(STATUS "${GST_LIBRARIES}") - -target_link_libraries(autoapp +target_link_libraries(autoapp aasdk libusb ${GST_LIBRARIES} ${Boost_LIBRARIES} ${Qt5Multimedia_LIBRARIES} ${Qt5MultimediaWidgets_LIBRARIES} ${Qt5QuickWidgets_LIBRARIES} ${Qt5Bluetooth_LIBRARIES} - ${LIBUSB_1_LIBRARIES} ${PROTOBUF_LIBRARIES} + ${ZLIB_LIBRARIES} ${BCM_HOST_LIBRARIES} ${ILCLIENT_LIBRARIES} ${WINSOCK2_LIBRARIES} ${RTAUDIO_LIBRARIES} - ${AASDK_PROTO_LIBRARIES} - ${AASDK_LIBRARIES} ${QTGLIB_LIBRARY} ${QTGLIB_LIBRARIES} ${QTGSTREAMER_LIBRARY} @@ -122,7 +126,8 @@ target_link_libraries(autoapp ${QTGSTREAMER_UI_LIBRARIES} ${QTGSTREAMER_QUICK_LIBRARIES} ${QTGSTREAMER_QUICK_LIBRARY} - ${GOBJECT_LIBRARIES}) + ${GOBJECT_LIBRARIES} + ) set(btservice_sources_directory ${sources_directory}/btservice) set(btservice_include_directory ${include_directory}/f1x/openauto/btservice) @@ -135,4 +140,7 @@ target_link_libraries(btservice ${Qt5Bluetooth_LIBRARIES} ${Qt5MultimediaWidgets_LIBRARIES} ${PROTOBUF_LIBRARIES} - ${AASDK_PROTO_LIBRARIES}) +) + +install(TARGETS autoapp btservice + RUNTIME DESTINATION bin) diff --git a/Readme.md b/Readme.md index d9db82d..ec2b073 100644 --- a/Readme.md +++ b/Readme.md @@ -1,15 +1,6 @@ # OpenAuto -### Support project -[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=R4HXE5ESDR4U4) - -**OpenAuto Pro version** provides features like brightness control, volume control, support of Kodi and integration with the Raspberry PI OS (Raspbian Desktop). [See how it works at OpenAuto Pro overview video](https://www.youtube.com/watch?v=9sTOMI1qTiA) - -If you are looking for the car power supply with ignition state detection [go to the Blue Wave Studio page](https://bluewavestudio.io/index.php/bluewave-shop) - -For support of other platforms please contact me at f1xstudiopl@gmail.com - ### Community [![Join the chat at https://gitter.im/publiclab/publiclab](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/openauto_androidauto/Lobby) @@ -18,6 +9,28 @@ OpenAuto is an AndroidAuto(tm) headunit emulator based on aasdk library and Qt l [See demo video](https://www.youtube.com/watch?v=k9tKRqIkQs8) +### Build Guide +#### Local build instructions for Raspberry Pi + +Having aasdk built and install first is a prequisite for this task. Please complete the necessary aasdk steps before proceeding here. + +```sudo apt-get update +sudo apt-get -y install cmake build-essential git + +sudo apt-get install libboost-all-dev libusb-1.0.0-dev libssl-dev cmake libprotobuf-dev protobuf-c-compiler protobuf-compiler libqt5multimedia5 libqt5multimedia5-plugins libqt5multimediawidgets5 qtmultimedia5-dev libqt5bluetooth5 libqt5bluetooth5-bin qtconnectivity5-dev pulseaudio librtaudio-dev + +git clone https://github.com/OpenDsh/openauto + +mkdir openauto_build; cd openauto_build + +cmake -DCMAKE_BUILD_TYPE=Release -DRPI3_BUILD=TRUE -DAASDK_INCLUDE_DIRS="../aasdk/include" -DAASDK_LIBRARIES="../aasdk/lib/libaasdk.so" -DAASDK_PROTO_INCLUDE_DIRS="../aasdk" -DAASDK_PROTO_LIBRARIES="../aasdk/lib/libaasdk_proto.so" ../openauto + +make -j2 +sudo make install +``` + +The executable binary can then be found at ~/openauto/bin/autoapp + ### Supported functionalities - 480p, 720p and 1080p with 30 or 60 FPS - RaspberryPI 3 hardware acceleration support to decode video stream (up to 1080p@60!) @@ -53,4 +66,4 @@ Copyrights (c) 2018 f1x.studio (Michal Szwaj) - OpenMAX IL API ### Remarks -**This software is not certified by Google Inc. It is created for R&D purposes and may not work as expected by the original authors. Do not use while driving. You use this software at your own risk.** +**This software is not certified by Google Inc. It is created for R&D purposes and may not work as expected by the original authors. Do not use while driving. You use this software at your own risk.** \ No newline at end of file diff --git a/cmake_modules/Findaasdk.cmake b/cmake_modules/Findaasdk.cmake new file mode 100644 index 0000000..e254703 --- /dev/null +++ b/cmake_modules/Findaasdk.cmake @@ -0,0 +1,43 @@ +set (AASDK_DIR ~/aasdk) + +find_path(AASDK_INCLUDE_DIR + f1x/aasdk/Version.hpp + PATHS ${AASDK_DIR} + PATH_SUFFIXES include +) + +find_path(AASDK_PROTO_INCLUDE_DIR + aasdk_proto/AbsoluteInputEventData.pb.h + PATHS ${AASDK_DIR} +) + +find_path(AASDK_LIB_DIR + libaasdk.so + PATHS ${AASDK_DIR} + PATH_SUFFIXES lib +) + +if (AASDK_INCLUDE_DIR AND AASDK_PROTO_INCLUDE_DIR AND AASDK_LIB_DIR) + set(AASDK_FOUND TRUE) +endif() + +if (AASDK_FOUND) + if (NOT aasdk_FIND_QUIETLY) + message(STATUS "Found aasdk:") + message(STATUS " - Includes: ${AASDK_INCLUDE_DIR}") + message(STATUS " - Libraries: ${AASDK_LIBRARIES}") + endif() + add_library(aasdk INTERFACE) + target_include_directories(aasdk INTERFACE ${AASDK_INCLUDE_DIR} ${AASDK_PROTO_INCLUDE_DIR}) + target_link_libraries(aasdk INTERFACE ${AASDK_LIB_DIR}/libaasdk.so ${AASDK_LIB_DIR}/libaasdk_proto.so) +else() + if (aasdk_FIND_REQUIRED) + if(AASDK_INCLUDE_DIR AND NOT AASDK_PROTO_INCLUDE_DIR) + message(FATAL_ERROR "aasdk was found but not built. Perform an in-source build.") + else() + message(FATAL_ERROR "Could not find aasdk") + endif() + endif() +endif() + +mark_as_advanced(AASDK_INCLUDE_DIRS AASDK_LIBRARIES) diff --git a/cmake_modules/Findlibomx.cmake b/cmake_modules/Findlibomx.cmake new file mode 100644 index 0000000..278831e --- /dev/null +++ b/cmake_modules/Findlibomx.cmake @@ -0,0 +1,67 @@ +set (OMX_DIR /opt/vc/) + +find_path(BCM_HOST_INCLUDE_DIR + bcm_host.h + PATHS + ${OMX_DIR} + PATH_SUFFIXES + include +) + +find_path(BCM_HOST_LIB_DIR + libbcm_host.so + PATHS + ${OMX_DIR} + PATH_SUFFIXES + lib +) + +find_path(ILCLIENT_INCLUDE_DIR + ilclient.h + PATHS + ${OMX_DIR} + PATH_SUFFIXES + src/hello_pi/libs/ilclient +) + +find_path(ILCLIENT_LIB_DIR + libilclient.a + PATHS + ${OMX_DIR} + PATH_SUFFIXES + src/hello_pi/libs/ilclient +) + +if (BCM_HOST_INCLUDE_DIR AND ILCLIENT_INCLUDE_DIR AND BCM_HOST_LIB_DIR AND ILCLIENT_LIB_DIR) + set(libomx_FOUND TRUE) +endif() + +if (libomx_FOUND) + if (NOT libomx_FIND_QUIETLY) + message(STATUS "Found omx:") + message(STATUS " - Bcm Host: ${BCM_HOST_INCLUDE_DIR}") + message(STATUS " - ilclient: ${ILCLIENT_INCLUDE_DIR}") + endif() + + add_library(omx INTERFACE) + + target_include_directories(omx SYSTEM INTERFACE + ${BCM_HOST_INCLUDE_DIR} + ${ILCLIENT_INCLUDE_DIR} + ) + + target_link_libraries(omx INTERFACE + ${BCM_HOST_LIB_DIR}/libbcm_host.so + ${ILCLIENT_LIB_DIR}/libilclient.a + ${BCM_HOST_LIB_DIR}/libvcos.so + ${BCM_HOST_LIB_DIR}/libvcilcs.a + ${BCM_HOST_LIB_DIR}/libvchiq_arm.so + ) + + target_compile_definitions(omx INTERFACE + -DUSE_OMX + -DOMX_SKIP64BIT + -DRASPBERRYPI3 + ) + +endif() diff --git a/cmake_modules/Findlibusb-1.0.cmake b/cmake_modules/Findlibusb-1.0.cmake index ec40055..8c52b20 100644 --- a/cmake_modules/Findlibusb-1.0.cmake +++ b/cmake_modules/Findlibusb-1.0.cmake @@ -83,8 +83,11 @@ else (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS) if (LIBUSB_1_FOUND) if (NOT libusb_1_FIND_QUIETLY) message(STATUS "Found libusb-1.0:") - message(STATUS " - Includes: ${LIBUSB_1_INCLUDE_DIRS}") - message(STATUS " - Libraries: ${LIBUSB_1_LIBRARIES}") + message(STATUS " - Includes: ${LIBUSB_1_INCLUDE_DIRS}") + message(STATUS " - Libraries: ${LIBUSB_1_LIBRARIES}") + add_library(libusb INTERFACE) + target_include_directories(libusb SYSTEM INTERFACE ${LIBUSB_1_INCLUDE_DIR}) + target_link_libraries(libusb INTERFACE ${LIBUSB_1_LIBRARY}) endif (NOT libusb_1_FIND_QUIETLY) else (LIBUSB_1_FOUND) if (libusb_1_FIND_REQUIRED) diff --git a/src/autoapp/Projection/OMXVideoOutput.cpp b/src/autoapp/Projection/OMXVideoOutput.cpp index 9bc9f49..6be68e7 100644 --- a/src/autoapp/Projection/OMXVideoOutput.cpp +++ b/src/autoapp/Projection/OMXVideoOutput.cpp @@ -269,19 +269,19 @@ void OMXVideoOutput::setDestRect(DestRect destRect) bool OMXVideoOutput::createComponents() { - if(ilclient_create_component(client_, &components_[VideoComponent::DECODER], "video_decode", static_cast(ILCLIENT_DISABLE_ALL_PORTS | ILCLIENT_ENABLE_INPUT_BUFFERS)) != 0) + if(ilclient_create_component(client_, &components_[VideoComponent::DECODER], const_cast("video_decode"), static_cast(ILCLIENT_DISABLE_ALL_PORTS | ILCLIENT_ENABLE_INPUT_BUFFERS)) != 0) { OPENAUTO_LOG(error) << "[OMXVideoOutput] video decode component creation failed."; return false; } - if(ilclient_create_component(client_, &components_[VideoComponent::RENDERER], "video_render", ILCLIENT_DISABLE_ALL_PORTS) != 0) + if(ilclient_create_component(client_, &components_[VideoComponent::RENDERER], const_cast("video_render"), ILCLIENT_DISABLE_ALL_PORTS) != 0) { OPENAUTO_LOG(error) << "[OMXVideoOutput] video renderer component creation failed."; return false; } - if(ilclient_create_component(client_, &components_[VideoComponent::CLOCK], "clock", ILCLIENT_DISABLE_ALL_PORTS) != 0) + if(ilclient_create_component(client_, &components_[VideoComponent::CLOCK], const_cast("clock"), ILCLIENT_DISABLE_ALL_PORTS) != 0) { OPENAUTO_LOG(error) << "[OMXVideoOutput] clock component creation failed."; return false; @@ -293,7 +293,7 @@ bool OMXVideoOutput::createComponents() return false; } - if(ilclient_create_component(client_, &components_[VideoComponent::SCHEDULER], "video_scheduler", ILCLIENT_DISABLE_ALL_PORTS) != 0) + if(ilclient_create_component(client_, &components_[VideoComponent::SCHEDULER], const_cast("video_scheduler"), ILCLIENT_DISABLE_ALL_PORTS) != 0) { OPENAUTO_LOG(error) << "[OMXVideoOutput] video scheduler component creation failed."; return false;