Compare commits

..

67 Commits

Author SHA1 Message Date
b92a1fa558 moved to shstk 2020-08-25 22:24:02 +03:00
d4f1c78a6e pip 2020-08-24 13:23:50 +03:00
274fb20103 microchange 2020-08-22 01:04:46 +03:00
acef4db1db QAD and PIQt overall messages (as at recent PIP) 2020-08-22 00:58:46 +03:00
9f84e5c3df new "qt_generate_export_header" macro 2020-08-21 22:13:06 +03:00
aa009c36b0 work with QGL* 2020-08-21 20:16:02 +03:00
e4340a7215 qglengine/CMakeLists.txt fix 2020-08-20 13:25:37 +03:00
f7eabd1a85 export headers for QAD, PIQt and cd_utils 2020-08-19 22:42:37 +03:00
3ca32f4972 Merge branch 'master' of https://git.shs.tools/SHS/libs 2020-08-19 19:55:42 +03:00
68512b6c08 move qpiconnection 2020-08-19 19:55:32 +03:00
5d32c02b5f forget cd_utils
fixed dangling piconnedit
2020-08-19 17:27:22 +03:00
d0148bf460 tree changes 2020-08-19 16:22:10 +03:00
76d9604282 missing CMakeLists.txt on previous commit 2020-08-19 00:48:38 +03:00
3e1768b418 tree changes 2020-08-19 00:47:44 +03:00
4b7c513f7f flags() 2020-08-18 17:03:13 +03:00
0f6bc121aa ImageView fix 2020-08-18 17:02:14 +03:00
0ec173d9bb improve ImageView quality 2020-08-18 16:59:58 +03:00
cabacdd908 BlockView trace fix 2020-08-17 12:10:13 +03:00
f66138593c BlockView tracing fix 2020-08-17 00:57:44 +03:00
c49454bb03 another version of tracing across buses 2020-08-17 00:32:59 +03:00
efb5cbe484 blockview migrate to "deploy*" 2020-08-16 16:36:46 +03:00
ddc4da54be pip
BlockBusItem paint fix
2020-08-14 18:00:58 +03:00
d6cc5f0033 QAD 1.7.0
backport PIChunkStream optimizations to ChunkStream
2020-08-14 14:18:20 +03:00
055b8a9480 bus joint paint now configured with BlockView::setBusSquareNodes(), square or round. By default round 2020-08-14 14:08:31 +03:00
8fbed9f427 revert busitem paint 2020-08-13 18:09:04 +03:00
e43ae02e48 Merge branch 'master' of https://git.signalmodelling.ru/SHS/libs 2020-08-13 18:04:02 +03:00
a9b9061475 binlog and PathEdit fixes 2020-08-13 18:03:52 +03:00
b37318a5a5 BlockView draw bus joint changed 2020-08-13 14:13:23 +03:00
6f97d849e9 Merge branch 'master' of https://git.shs.tools/SHS/libs 2020-08-13 13:00:59 +03:00
58432fa62e version 1.6.0
QAD::File add "is_save" flag
2020-08-13 13:00:52 +03:00
aa2ea1eda6 binlog user header 2020-08-12 20:01:46 +03:00
11e665c419 pip 2020-08-11 21:19:02 +03:00
1312f950c7 pip 2020-08-11 20:59:25 +03:00
56b3dcad7c Merge remote-tracking branch 'remotes/origin/release' 2020-08-11 20:20:24 +03:00
75464792ba Merge remote-tracking branch 'remotes/origin/master' into release
Some checks failed
SHS Gitea/libs/pipeline/head There was a failure building this commit
2020-08-11 20:16:10 +03:00
8b86f93e38 pip 2.0.0 2020-08-11 20:11:10 +03:00
3e0ec72e7d Blockview changes:
1) Теперь для создания сегмента не надо держать Shift, а перемешение шины теперь с нажатой клавишей Shift
2) Режим трассировки шин теперь пытается проложить маршрут с возможностью пересечения шины под прямым углом
3) Теперь рисуются точки соединения сегментов если их больше 2х
4) Обновлена подсказка в tooltip

p.s. update pip)
2020-08-11 17:35:18 +03:00
b45bfca826 getSaveFileName for QAD::File editor 2020-08-11 10:15:09 +03:00
6a9b1751ac android docker
All checks were successful
SHS Gitea/libs/pipeline/head This commit looks good
2020-08-10 22:13:31 +03:00
ede780249a android docker 2020-08-10 22:12:52 +03:00
067839f02b Dockerfile ENV patch
All checks were successful
SHS Gitea/libs/pipeline/head This commit looks good
2020-08-10 17:55:07 +03:00
da9237e74b Dockerfile ENV patch 2020-08-10 17:48:35 +03:00
905eb77091 windows PIP -> QtBin install fix 2020-08-05 12:06:56 +03:00
2974967790 TouchButtFrame fix 2020-08-04 17:57:11 +03:00
4a567dbba4 pip 2020-08-03 09:05:06 +03:00
0c7619d00b new pip 2020-08-03 01:43:47 +03:00
fa4634b0c7 last pip 2020-08-02 12:16:14 +03:00
0f1825bf33 merged to PIP 1.99.3 2020-08-01 21:30:25 +03:00
562cb280f7 Merge branch 'master' of https://git.shs.tools/SHS/libs 2020-07-30 00:25:33 +03:00
5ec9c22d46 pip 2020-07-30 00:25:24 +03:00
d78a1f532b Merge branch 'master' of https://git.signalmodelling.ru/SHS/libs 2020-07-29 14:36:30 +03:00
0d9ecc9ceb Dockerfile, clone only one branch 2020-07-29 14:36:21 +03:00
7baa7916f7 pip v2 2020-07-29 01:32:19 +03:00
7ecf33a908 Merge branch 'master' of https://git.shs.tools/SHS/libs 2020-07-24 21:54:44 +03:00
c3f921ea6a FindQAD.cmake patch for piqt and piqt_utils 2020-07-24 21:54:38 +03:00
2251caf12c clean qglengine/qglview.h 2020-07-23 17:14:22 +03:00
c76608abf0 QGLEngine license 2020-07-22 11:24:42 +03:00
06c99dd105 Merge pull request 'pip' (#55) from master into release
Some checks failed
SHS Gitea/libs/pipeline/head There was a failure building this commit
2020-07-16 13:59:20 +03:00
caf149ed28 pip 2020-07-16 13:59:07 +03:00
13a543bfd5 Merge pull request 'pip 24' (#54) from master into release
Some checks failed
SHS Gitea/libs/pipeline/head There was a failure building this commit
2020-07-16 13:51:49 +03:00
16e52701be pip 2020-07-16 13:44:26 +03:00
09ed9a9907 compile fixes 2020-07-16 13:41:50 +03:00
a5d75fec09 includes 2020-07-16 13:05:49 +03:00
afd15e20f6 fix warning 2020-07-16 12:58:31 +03:00
77c2296320 pip 24 2020-07-16 12:52:59 +03:00
1c8d2d5c5f Merge branch 'master' of https://git.signalmodelling.ru/SHS/libs 2020-07-16 12:50:49 +03:00
f6a9e44805 piSwap 2020-07-16 12:50:24 +03:00
1173 changed files with 12314 additions and 47249 deletions

3
.gitignore vendored
View File

@@ -1,5 +1,2 @@
/.svn /.svn
CMakeLists.txt.user* CMakeLists.txt.user*
/project_fs_build
/qad/qad_version.h
/qglengine/core/qglengine_version.h

3
.gitmodules vendored
View File

@@ -1,3 +0,0 @@
[submodule "pip"]
path = pip
url = https://git.shs.tools/SHS/pip.git

View File

@@ -1,188 +1,63 @@
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
cmake_policy(SET CMP0011 NEW) # don`t affect includer policies
cmake_policy(SET CMP0017 NEW) # need include() with .cmake cmake_policy(SET CMP0017 NEW) # need include() with .cmake
cmake_policy(SET CMP0020 NEW) # Automatically link Qt executables to qtmain target on Windows project(qad)
if (POLICY CMP0053)
cmake_policy(SET CMP0053 NEW) # simpler variable expansion and escape sequence evaluation rules find_package(MinGW REQUIRED)
if (NOT DEFINED ANDROID_PLATFORM)
find_package(OpenGL REQUIRED)
endif() endif()
project(libs) include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
set(PIP_CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/pip/cmake")
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}" "${PIP_CMAKE_MODULE_PATH}" "${CMAKE_CURRENT_SOURCE_DIR}/qad/cmake") if(STATIC_LIB)
set(LIBPROJECT 1) set(QAD_LIB_TYPE STATIC)
include(SDKMacros) add_definitions(-DQAD_STATIC_DEFINE)
include(DeployMacros) set(QAD_LIB_TYPE_MSG "Static")
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
if(NOT DEFINED BUILD_NUMBER)
set(BUILD_NUMBER 9999)
endif()
if("x${BUILD_NUMBER}" STREQUAL "x")
set(BUILD_NUMBER 0)
endif()
set(_COMPANY SHS)
set(_DOMAIN org.SHS)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/pip)
if(MINGW)
find_package(MinGW REQUIRED)
else() else()
if(APPLE) set(QAD_LIB_TYPE SHARED)
set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks;@executable_path/lib;@loader_path/../lib") set(QAD_LIB_TYPE_MSG "Shared")
set(CMAKE_MACOSX_RPATH TRUE)
if(CMAKE_CROSSCOMPILING)
set(CMAKE_INSTALL_NAME_DIR "@rpath")
else()
include_directories(/usr/local/include)
link_directories(/usr/local/lib)
endif()
else()
set(CMAKE_INSTALL_RPATH "\$ORIGIN;\$ORIGIN/lib")
endif()
endif()
if (DEFINED ANDROID_PLATFORM)
include_directories(${ANDROID_SYSTEM_LIBRARY_PATH}/usr/include)
#set(TARGET_INSTALL_PATH "${ANDROID_SYSTEM_LIBRARY_PATH}/usr/")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${ANDROID_NDK}/sysroot/usr/include")
#message("${ANDROID_SYSTEM_LIBRARY_PATH}/usr/include")
#message("${ANDROID_NDK}/sysroot/usr/include")
endif()
set(INSTALL_PREFIX "")
set(_plugins_default_ 1)
if(CMAKE_CROSSCOMPILING)
if (DEFINED ANDROID_PLATFORM)
set(_plugins_default_ 0)
set(INSTALL_PREFIX "${CMAKE_FIND_ROOT_PATH}/")
else()
set(INSTALL_PREFIX "${CMAKE_STAGING_PREFIX}")
endif()
endif()
option(CROSSTOOLS "Crosstools minimal build" 0)
option(LIB "System install" 1)
option(QGLVIEW "Build QGLview library and utils" 0)
option(QGLENGINE "Build QGLENGINE library and utils" 0)
option(UTILS "Build various utils" ${_plugins_default_})
option(DESIGNER_PLUGINS "Build qt designer plugins" ${_plugins_default_})
if (CROSSTOOLS)
set(LIB 1)
set(QGLVIEW 0)
set(QGLENGINE 0)
set(UTILS 0)
set(DESIGNER_PLUGINS 0)
endif()
if (CMAKE_BUILD_TYPE MATCHES Debug)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3 -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3 -Wall")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -Wall")
endif()
set(CMAKE_CXX_STANDARD 11)
set(PIP_LIBRARY pip)
set(PIP_FOLDERS "." "core" "containers" "thread" "system" "io_devices" "io_utils" "console" "math" "code" "geo" "resources" "opencl" "crypt" "introspection" "concurrent" "cloud")
set(PIP_INCLUDES)
if(LIB)
if(WIN32)
if(MINGW)
set(CMAKE_INSTALL_PREFIX ${MINGW_DIR})
endif()
else()
if (DEFINED ANDROID_PLATFORM)
set(CMAKE_INSTALL_PREFIX ${ANDROID_SYSTEM_LIBRARY_PATH}/usr)
else()
if(CMAKE_CROSSCOMPILING)
set(CMAKE_INSTALL_PREFIX ${CMAKE_STAGING_PREFIX})
else()
set(CMAKE_INSTALL_PREFIX ${INSTALL_PREFIX}/usr/local)
endif()
endif()
endif()
message(STATUS "Install ${PROJECT_NAME} to system \"${CMAKE_INSTALL_PREFIX}\"")
else()
message(STATUS "Install ${PROJECT_NAME} to local \"bin\", \"lib\" and \"include\"")
endif() endif()
foreach(F ${PIP_FOLDERS}) set(_QAD_MAJOR 1)
list(APPEND PIP_INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}/pip/lib/main/${F}") set(_QAD_MINOR 7)
endforeach(F) set(_QAD_REVISION 0)
#message(${PIP_INCLUDES}) set(_QAD_SUFFIX )
if(CMAKE_CROSSCOMPILING OR (DEFINED ANDROID_PLATFORM)) set(_QAD_COMPANY SHS)
set(PIP_CMG "pip_cmg") set(_QAD_DOMAIN org.SHS)
set(PIP_RC "pip_rc") set(QAD_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/qad/qad_version.h")
set(PIP_DEPLOY_TOOL "deploy_tool") set_version(QAD
else() MAJOR "${_QAD_MAJOR}"
set(PIP_CMG "${CMAKE_CURRENT_BINARY_DIR}/pip/utils/code_model_generator/pip_cmg") MINOR "${_QAD_MINOR}"
set(PIP_RC "${CMAKE_CURRENT_BINARY_DIR}/pip/utils/resources_compiler/pip_rc") REVISION "${_QAD_REVISION}"
set(PIP_DEPLOY_TOOL "${CMAKE_CURRENT_BINARY_DIR}/pip/utils/deploy_tool/deploy_tool") BUILD "${BUILD_NUMBER}"
endif() SUFFIX "${_QAD_SUFFIX}"
if(WIN32) OUTPUT "${QAD_VERSION_FILE}")
set(PIP_DLL_DIR "${CMAKE_CURRENT_BINARY_DIR}/pip") set_deploy_property(QAD ${QAD_LIB_TYPE}
FULLNAME "${_QAD_DOMAIN}.*"
COMPANY "${_QAD_COMPANY}")
# Version
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/qad_version.h")
file(REMOVE "${CMAKE_CURRENT_SOURCE_DIR}/qad_version.h")
endif() endif()
#message(STATUS "Building QAD version ${QAD_VERSION} (${QAD_LIB_TYPE})")
set(QAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/qad) file(GLOB CMAKES "cmake/*.cmake" "cmake/*.in")
if (CROSSTOOLS) if (LIB)
add_subdirectory(pip)
file(GLOB CMAKES "qad/cmake/*.cmake" "qad/cmake/*.in")
install(FILES ${CMAKES} DESTINATION ${CMAKE_ROOT}/Modules) install(FILES ${CMAKES} DESTINATION ${CMAKE_ROOT}/Modules)
if (WIN32)
install(FILES ${QAD_VERSION_FILE} DESTINATION ${MINGW_INCLUDE}/qad)
else()
install(FILES ${QAD_VERSION_FILE} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/qad)
endif()
else() else()
install(FILES ${QAD_VERSION_FILE} DESTINATION include/qad)
include(QtWraps)
find_qt(Core QUIET)
set(QtVersions)
set(SomeQtFound 0)
foreach(_v ${_QT_VERSIONS_})
option(Qt${_v} "Build for Qt${_v}" 1)
if (Qt${_v})
#message("Qt${_v} -> ${LOCAL_FOUND${_v}}")
if (LOCAL_FOUND${_v})
list(APPEND QtVersions Qt${_v})
set(SomeQtFound 1)
endif()
endif()
endforeach()
if(UTILS)
message(STATUS "Building with utils")
else()
message(STATUS "Building only libraries")
endif()
add_subdirectory(pip)
set(_DIRS)
if (SomeQtFound)
message(STATUS "Building Qt-derived targets for ${QtVersions}")
add_subdirectory(qad)
set(_DIRS piqt piqt_utils qcd_utils)
if (Qt5)
list(APPEND _DIRS)
if (QGLVIEW)
list(APPEND _DIRS qglview)
endif()
if (QGLENGINE)
list(APPEND _DIRS qglengine)
endif()
endif()
foreach(_D ${_DIRS})
list(APPEND QT_MULTILIB_LIST ${_D})
endforeach(_D)
include_directories(piqt)
else()
message(STATUS "None of Qt found, skip Qt-derived targets")
endif()
include_directories(cd_utils)
list(INSERT _DIRS 0 cd_utils)
foreach(_D ${_DIRS})
add_subdirectory(${_D})
endforeach(_D)
endif() endif()
if(WIN32) add_subdirectory(libs)
foreach(PIP_LT ${PIP_LIBS_TARGETS}) if (UTILS)
if (SomeQtFound) add_subdirectory(utils)
qt_install(FILES "${CMAKE_CURRENT_BINARY_DIR}/pip/lib${PIP_LT}.dll" DESTINATION QtBin)
endif()
endforeach()
endif() endif()
copy_to_parent(qad_includes)

62
Jenkinsfile vendored
View File

@@ -1,62 +0,0 @@
def build_docker(name) {
def image = "${name}-libs"
echo "Build image ${image}"
def pref = ""
if (env.DOCKER_PREFIX) {
pref = "--build-arg DOCKER_PREFIX=${env.DOCKER_PREFIX}/"
}
def jobs = 4
if (env.JOBS_COUNT) {
jobs = "${env.JOBS_COUNT}"
}
def args = "${pref} --build-arg LIBS_BUILD_NUMBER=${env.BUILD_NUMBER} --build-arg JOBS_COUNT=${jobs}"
dir ("docker/${image}") {
sh "docker build ${args} --no-cache -t ${image} ."
}
return "\n - ${image}"
}
node {
stage("checkout") {
checkout scm
}
def _envmap = [:]
def _env = sh(script: "env", returnStdout: true).trim().split("\n")
_env.each{ l ->
def _ind = l.indexOf('=');
def _n = l.substring(0, _ind);
def _v = l.substring(_ind + 1);
_envmap["${_n}"] = "${_v}";
}
def _msg = "Built images:"
def platforms = ['debian', 'osx', 'windows', 'android', 'pi']
for (int i = 0; i < platforms.size(); ++i) {
if (_envmap["BUILD_${platforms[i]}"] == "1") {
stage("${platforms[i]}-libs") {
_msg += build_docker("${platforms[i]}")
}
}
}
sh "docker system prune -f"
echo "${_msg}"
}
pipeline {
agent {
label 'master'
}
stages {
stage("PIP doc") {
steps {
checkout scm
sh "rm -rf share"
sh "rm -vf *.zip"
sh "mkdir -p build"
sh "cd build && cmake -DLIB=0 -DCMAKE_INSTALL_PREFIX=`pwd` ../"
sh "cd build && make doc"
sh "cd share/doc && zip -r ../../pip_doc.zip pip"
sh "cp share/doc/pip/html/pip.qch ./"
archiveArtifacts 'pip_doc.zip'
archiveArtifacts 'pip.qch'
}
}
}
}

View File

@@ -1,54 +1,10 @@
# Main SHS SDK libraries repo # Qt for ADvanced
## Introduction ## Introduction
This repo contains PIP, QAD and derived projects: This repo contains QAD and PIQt projects:
* cd_utils - PIP-based client/server library for read, transmit and use custom structures of coefficients
* qcd_utils - Qt bindings to CDUtils and "CD Pult" executable - full-featured CD client * qcd_utils - Qt bindings to CDUtils and "CD Pult" executable - full-featured CD client
* piqt - helpers to convert PIP <-> Qt types * piqt - helpers to convert PIP <-> Qt types
* piqt_utils - Gui libraries and executables to edit PIConnection configs and watch PIIntrospection * piqt_utils - Gui libraries and executables to edit PIConnection configs and watch PIIntrospection
* qglview - old Qt-base OpenGL engine * qglview - old Qt-base OpenGL engine
* qglengine - new Qt-base OpenGL engine
## Compile
This repo can be compile with GCC/MinGW/Clang, for Qt 4/5.
If there is no Qt found, builds only PIP and cd_utils.
CMake options:
* **LIB** - if 1 then install to system directories: MinGW on Windows, /usr/local on Linux/MacOS, ${ANDROID_SYSTEM_LIBRARY_PATH} on Android. If 0 then install to ${CMAKE_INSTALL_PREFIX}. Enabled by default
* **UTILS** - build or not executable utilites, enabled by default
* **DESIGNER_PLUGINS** - build or not Qt Designer plugins, enabled by default
* **QGLVIEW** - build or not QGLView, disabled by default
* **QGLENGINE** - build or not QGLEngine, disabled by default
## Windows scripts
Build steps for i686 architecture:
1. unzip mingw.7z to C:\mingw
2. unzip qt.7z to C:\qt
3. download and install cmake from https://cmake.org/download/
4. Prepare environment
- set prefix for mingw e.g.: for C:\mingw\7_1_x32\
set SDK_MINGW_DIR=C:\mingw\7_1_x
- set prefix for Qt5 e.g.: for C:\qt\qt5120_win32\
set SDK_QT5_DIR=C:\qt\qt5120_win
- set SDK_CMAKE_DIR=C:\cmake
5. run make_libs32.bat
Build steps for amd64 architecture:
-- follow previos steps, but replace '32' to '64'
Build steps for both architectures:
-- follow previos steps, but on '4' state run make_libs_all.bat
## Non-Windows scripts
Script "make_libs.sh" compile and install SDK for current environment, e.g.
`./make_libs.sh -j4`
## Docker
This repo provide Dockerfile, so you can exec `docker build -t libs .` in this directory
and make docker image "libs" with installed SHS SDK for:
* Debian 10
* Windows x64
* MacOS
* Android ndk 21 armeabi-v71, arm64-v8a, x86, x86_64

View File

@@ -1,35 +0,0 @@
macro(sdk_install _DIR _TARGET _H_FILES _QM_FILES)
#message("QM=${_QM_FILES}")
if(LIB)
if(WIN32)
if(NOT "x${_H_FILES}" STREQUAL "x")
install(FILES ${_H_FILES} DESTINATION ${MINGW_INCLUDE}/${_DIR})
endif()
qt_install(TARGETS ${_TARGET} ARCHIVE DESTINATION ${MINGW_LIB})
qt_install(TARGETS ${_TARGET} RUNTIME DESTINATION ${MINGW_BIN})
qt_install(TARGETS ${_TARGET} RUNTIME DESTINATION QtBin)
else()
if (NOT "x${_H_FILES}" STREQUAL "x")
install(FILES ${_H_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${_DIR})
endif()
qt_install(TARGETS ${_TARGET} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
endif()
if(NOT "x${_QM_FILES}" STREQUAL "x")
qt_install(LANG ${_QM_FILES} DESTINATION QtLang)
endif()
else()
if(NOT "x${_H_FILES}" STREQUAL "x")
install(FILES ${_H_FILES} DESTINATION include/${_DIR})
endif()
if(WIN32)
qt_install(TARGETS ${_TARGET} RUNTIME DESTINATION bin)
qt_install(TARGETS ${_TARGET} ARCHIVE DESTINATION lib)
else()
qt_install(TARGETS ${_TARGET} DESTINATION lib)
endif()
if(NOT "x${_QM_FILES}" STREQUAL "x")
qt_install(LANG ${_QM_FILES} DESTINATION lang)
endif()
endif()
endmacro()

View File

@@ -1,6 +0,0 @@
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY FIRST)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE FIRST)
set(CMAKE_PREFIX_PATH /soft/android/${ANDROID_ABI})
list(APPEND CMAKE_FIND_ROOT_PATH ${CMAKE_PREFIX_PATH}/lib)
include_directories(${CMAKE_PREFIX_PATH}/include)

View File

@@ -1,86 +0,0 @@
cmake_minimum_required(VERSION 3.0)
project(cd_utils)
if (NOT LIBPROJECT)
find_package(PIP REQUIRED)
option(LIB "System install" 1)
option(DEBUG "Build with -g3" 0)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -Wall")
if (DEBUG)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3")
endif()
endif()
if (MINGW)
find_package(MinGW REQUIRED)
endif()
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${PIP_INCLUDES})
#file(GLOB HDRS_UTILS "*.h")
#file(GLOB CPPS_UTILS "*.cpp")
file(GLOB CPPS_UTILS "cdutils_*.cpp")
file(GLOB HDRS_UTILS "cdutils_*.h")
if (DEFINED ENV{QNX_HOST})
add_library(${PROJECT_NAME} STATIC ${CPPS_UTILS} ${HDRS_UTILS})
else()
add_library(${PROJECT_NAME} SHARED ${CPPS_UTILS} ${HDRS_UTILS})
endif()
target_link_libraries(${PROJECT_NAME} ${PIP_LIBRARY})
# # Apple crosscompiling rpath patch
# if (APPLE AND CMAKE_CROSSCOMPILING AND CMAKE_MACOSX_RPATH)
# foreach(_RP ${CMAKE_INSTALL_RPATH})
# add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
# COMMAND "${CMAKE_INSTALL_NAME_TOOL}"
# "-add_rpath" "${_RP}"
# "$<TARGET_FILE_DIR:${PROJECT_NAME}>/$<TARGET_FILE_NAME:${PROJECT_NAME}>"
# COMMENT "Add to ${PROJECT_NAME} rpath \"${_RP}\"")
# endforeach()
# endif()
add_executable(cdutilstest "cdutilstest.cpp" "cdtest.h")
target_link_libraries(cdutilstest ${PIP_LIBRARY} ${PROJECT_NAME})
message(STATUS "Building ${PROJECT_NAME}")
if(NOT LIBPROJECT)
if(LIB)
if(WIN32)
if(MINGW)
set(CMAKE_INSTALL_PREFIX ${MINGW_DIR})
endif()
else()
if (DEFINED ANDROID_PLATFORM)
set(CMAKE_INSTALL_PREFIX ${ANDROID_SYSTEM_LIBRARY_PATH}/usr)
else()
if(CMAKE_CROSSCOMPILING)
set(CMAKE_INSTALL_PREFIX ${CMAKE_STAGING_PREFIX})
else()
set(CMAKE_INSTALL_PREFIX ${INSTALL_PREFIX}/usr/local)
endif()
endif()
endif()
message(STATUS "Install ${PROJECT_NAME} to system \"${CMAKE_INSTALL_PREFIX}\"")
else()
message(STATUS "Install ${PROJECT_NAME} to local \"bin\", \"lib\" and \"include\"")
endif()
endif()
if(LIB)
list(APPEND _ALL_TARGETS ${PROJECT_NAME})
set(_ALL_TARGETS ${_ALL_TARGETS} PARENT_SCOPE)
if(WIN32)
install(FILES ${HDRS_UTILS} DESTINATION ${MINGW_INCLUDE})
install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${MINGW_LIB})
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ${MINGW_BIN})
else()
install(FILES ${HDRS_UTILS} DESTINATION ${CMAKE_INSTALL_PREFIX}/include)
install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
endif()
#message(STATUS "Install ${PROJECT_NAME} to system \"${CMAKE_INSTALL_PREFIX}\"")
else()
if(WIN32)
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION lib)
else()
install(TARGETS ${PROJECT_NAME} DESTINATION lib)
endif()
install(FILES ${HDRS_UTILS} DESTINATION include)
#message(STATUS "Install ${PROJECT_NAME} to local \"bin\"")
endif()

View File

@@ -1,10 +0,0 @@
#ifndef CDTEST_H
#define CDTEST_H
enum KDescription {
First, //f Первый
Second, //b Второй
};
#endif // CDTEST_H

View File

@@ -1,41 +0,0 @@
#include "cdutils_c.h"
#include "cdutils_core.h"
using namespace CDUtils;
CInterface C;
CInterface::CInterface(): Interface(CDType::cdC) {
}
void CInterface::sendCommand(const CDType & c) {
core->sendCommand(c);
}
void CInterface::connect(const CDType & c, PIObject * o, Handler eh) {
core->registerCHandler(c, o, eh);
}
void CInterface::autoConnect(PIObject * o, const PIString & prefix) {
if (!o) return;
uint cid = o->classNameID();
if (!PIObject::__meta_data().contains(cid)) return;
PIMap<PIString, Handler> eh_map;
PIObject::__MetaData & md(PIObject::__meta_data()[cid]);
PIMap<const void * , __MetaFunc>::const_iterator it;
for (it = md.eh_func.constBegin(); it != md.eh_func.constEnd(); ++it) {
eh_map[it.value().func_name] = (Handler)it.value().addr;
//piCout << "func" << it.value().func_name;
}
PIVector<CDType * > cl = C.root().children();
piForeachC (CDType * c, cl) {
PIString cp = prefix + c->pathString().join("_");
if (cp.isEmpty()) continue;
if (!eh_map.contains(cp)) continue;
connect(*c, o, eh_map[cp]);
}
}

View File

@@ -1,45 +0,0 @@
/*
CD Utils - Control-Debug utilites
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CDUTILS_C_H
#define CDUTILS_C_H
#include "cdutils_interface.h"
namespace CDUtils {
class CInterface: public Interface
{
PIOBJECT_SUBCLASS(CInterface, Interface)
public:
CInterface();
void sendCommand(const CDType & c);
void connect(const CDType & c, PIObject * o, Handler eh);
void autoConnect(PIObject * o, const PIString & prefix = PIStringAscii("c_"));
};
}
extern CDUtils::CInterface C;
#endif // CDUTILS_C_H

View File

@@ -1,606 +0,0 @@
#include "cdutils_core.h"
#include "cdutils_parser.h"
#include "piconfig.h"
#include "piiobytearray.h"
#include "piiostring.h"
#include "pifile.h"
using namespace CDUtils;
const char CDCore::app_config[] =
"include = cd_ip.conf\n\
port_rec = 2\n\
port_send = 1\n\
[connection]\n\
device.cd = peer://cd_app:cd_pult #s\n\
[]\n\
connectionmodel = AAAM2Xja7VXLTttAFD12QpsikKjUSixYlLbKEpIUtVIlVEfqhk2FWuiGRRolUYtoHgrmpYiv6IItf8AveMMH9E/YsG6Ph3sde5hGoQoblLGuPHfunTPjc49nADxDA110+LTYC7FrPCAPeAO+vZu+aX7c/8PGd45WCJC0OGcfT6FDnmfSTPtwhZFt3HjgDs/Qtu5jPbZHtI/x50XfIzMQbdwEolbg9INP4ku++myPaUtCHYRaT2j1ldIh3VP60/Qff8vSfXLu9BP6JX9K/0TVH6jqVe22P1X/fao/oddWu/paDs1vBf9Jv/EZ91clbyHqv7BL6sscDOd4v4WTqs6jzaHGJ8QJerxlpJSpdZ7IWFJvDW7I2JxZqIM62k6A57RZmMQGmlyrxdV+WGBnmR01mXPI267hBKwp4FeBeo9VPtssxyb7rzHg1B7T9nCMU45U8BZlWuVWtIcD/CRGOqtsbW09851tXsHN0UTlLIAdASjSXnLyLn+H7L2+xbGYvC63Ezqg543egkLmn8qnRF6USbM4Qp9godkhzI777Ne5bCIt/5UtGz2o/yGby0nKpjqmbOa1ynkjmyzIrzvIZUeBPjvlUmbh32EFJbGyJZhR8YcvlS+3TpjhqeWSyvUkpbI9plSWtcKLcsK05beOJVEnhaEFfHEH+RwpeMcpn1JKGqWMNOL+G6wZyahlpdVOtufKfbDS+guLke9O\n\
";
const char CDCore::pult_config[] =
"include = cd_ip.conf\n\
port_rec = 1\n\
port_send = 2\n\
[connection]\n\
device.cd = peer://cd_pult:cd_app #s\n\
[]\n\
connectionmodel = AAAM2Xja7VXLTttAFD12QpsikKjUSixYlLbKEpIUtVIlVEfqhk2FWuiGRRolUYtoHgrmpYiv6IItf8AveMMH9E/YsG6Ph3sde5hGoQoblLGuPHfunTPjc49nADxDA110+LTYC7FrPCAPeAO+vZu+aX7c/8PGd45WCJC0OGcfT6FDnmfSTPtwhZFt3HjgDs/Qtu5jPbZHtI/x50XfIzMQbdwEolbg9INP4ku++myPaUtCHYRaT2j1ldIh3VP60/Qff8vSfXLu9BP6JX9K/0TVH6jqVe22P1X/fao/oddWu/paDs1vBf9Jv/EZ91clbyHqv7BL6sscDOd4v4WTqs6jzaHGJ8QJerxlpJSpdZ7IWFJvDW7I2JxZqIM62k6A57RZmMQGmlyrxdV+WGBnmR01mXPI267hBKwp4FeBeo9VPtssxyb7rzHg1B7T9nCMU45U8BZlWuVWtIcD/CRGOqtsbW09851tXsHN0UTlLIAdASjSXnLyLn+H7L2+xbGYvC63Ezqg543egkLmn8qnRF6USbM4Qp9godkhzI777Ne5bCIt/5UtGz2o/yGby0nKpjqmbOa1ynkjmyzIrzvIZUeBPjvlUmbh32EFJbGyJZhR8YcvlS+3TpjhqeWSyvUkpbI9plSWtcKLcsK05beOJVEnhaEFfHEH+RwpeMcpn1JKGqWMNOL+G6wZyahlpdVOtufKfbDS+guLke9O\n\
";
int __Core_Initializer__::count_(0);
CDCore * __Core_Initializer__::__instance__(0);
const uchar header_direct = 0x80;
const uchar header_transfer = 0x81;
__Core_Initializer__::__Core_Initializer__() {
count_++;
if (count_ > 1) return;
__instance__ = new CDCore();
}
__Core_Initializer__::~__Core_Initializer__() {
count_--;
if (count_ < 0) {
count_ = 0;
return;
}
if (count_ > 0) return;
if (__instance__) {
delete __instance__;
__instance__ = 0;
}
}
CDCore::CDCore() {
setName("CDCore");
x_timer.setName("__S__.CDCore.x_timer");
datatr.setPacketSize(960);
CONNECTU(&connection, dataReceivedEvent, this, dataReceived);
CONNECTU(PICout::Notifier::object(), finished, this, piCoutFinished);
/*PIString s(app_config);
connection.configureFromString(&s);
connection.start();*/
need_rebuild_x = x_pult_side = false;
k_.cd_type_ = CDType::cdK;
x_.cd_type_ = CDType::cdX;
c_.cd_type_ = CDType::cdC;
m_.cd_type_ = CDType::cdM;
initRoot(&k_);
initRoot(&x_);
initRoot(&c_);
initRoot(&m_);
CONNECTU(&sendt, started, this, sendThread)
CONNECTU(&datatr, sendRequest, this, dtSendRequest)
CONNECTU(&datatr, receiveFinished, this, dtReceiveFinished)
CONNECTU(&x_timer, tickEvent, this, xTimerTick)
/*k_[1] = KType(1, "123", "120+3", "comment");
k_[2] = KType(2, "1", "2", "comm");
k_[4] = KType(4, "-0.6", "-6/10", "mment");
k_.section(10)[5] = KType(5, "8", "2*2*2", "88");
k_.section(10).section(50)[100] = KType(100, "8", "2*2*2", "88");
k_.section(11)[3] = KType(3, "1", "1", "88");
k_.section(11)[4] = KType(4, "0", "0", "88");
k_.section(11)[6] = KType(6, "0", "0", "88");*/
//piCout << s;
}
CDCore::~CDCore() {
x_timer.stop(true);
datatr.stop();
sendt.stop();
sendt.waitForFinish(10);
connection.stop();
}
void CDCore::cd_write(CDSection * cd, PIIODevice * d) {
cd->write(d, PIString());
}
void CDCore::cd_read(CDSection * cd, PIIODevice * d) {
PIConfig conf(d, PIIODevice::ReadOnly);
cd->read(&(conf.rootEntry()));
if (cd->cd_type_ == CDType::cdX)
x_selected = cd->collectX();
initRoot(cd);
raiseChangedGlobal(cd->cd_type_);
/*PIVector<PIIODevice * > ds = connection.allDevices();
piForeach(PIIODevice * d, ds) {
if (d)
piCoutObj << d->constructFullPath() << d->isOpened();
}*/
}
void CDCore::cd_parse(CDSection * cd, PIIODevice * d) {
*cd = CDParser::parse(d, cd->cd_type_);
initRoot(cd);
raiseChangedGlobal(cd->cd_type_);
}
void CDCore::cd_update(CDSection * cd, PIIODevice * d, UpdateModeFlags mode) {
CDSection ucd = *cd;
cd_parse(cd, d);
/*bool kn = true;
if (!ucd.isEmpty())
if (!ucd.isSameStructure(k_)) {
piCout << "ask for save names";
K_KeepNamesRequest(&kn);
}*/
ucd.update(*cd, mode);
//piCout << k_.count() << ucd.count();
*cd = ucd;
initRoot(cd);
raiseChangedGlobal(cd->cd_type_);
}
void CDCore::cd_calculate(CDSection * cd) {
cd->calculate();
raiseChangedGlobal(cd->cd_type_);
}
void CDCore::cd_send(CDSection * cd, CDPacketType pt, bool direct) {
if (!cd) return;
PIByteArray ba, sba;
PIIOByteArray iob(&ba, PIIODevice::ReadWrite);
cd_write(cd, &iob);
//piCoutObj << PIString(ba);
sba = makeHeader(pt, 0);
sba << ba;
if (direct)
sendDirect(sba);
else
sendThreaded(sba);
}
void CDCore::send(CDType::cdT cdt) {
CDPacketType pt = CD_Ping;
switch (cdt) {
case CDType::cdK: pt = CD_KSend; break;
case CDType::cdX: pt = CD_XSend; break;
case CDType::cdC: pt = CD_CSend; break;
case CDType::cdM: pt = CD_MSend; break;
default: break;
}
piCoutObj << "send" << typeLetter(cdt);
cd_send(root(cdt), pt);
}
void CDCore::request(CDType::cdT cdt) {
CDPacketType pt = CD_Ping;
switch (cdt) {
case CDType::cdK: pt = CD_KQuery; break;
case CDType::cdX: pt = CD_XQuery; break;
case CDType::cdC: pt = CD_CQuery; break;
case CDType::cdM: pt = CD_MQuery; break;
default: break;
}
piCoutObj << "request" << typeLetter(cdt);
PIByteArray sba = makeHeader(pt, 0);
sendThreaded(sba);
}
void CDCore::initApp() {
init(appConfig(), false);
}
void CDCore::initPult() {
init(pultConfig(), true);
}
void CDCore::init(const PIString & configuration, bool pult) {
PIString c = configuration;
//piCoutObj << "init" << c;
connection.stop();
connection.removeAllDevices();
connection.configureFromString(&c);
connection.start();
x_pult_side = pult;
}
void CDCore::stop() {
x_timer.stop();
x_timer.waitForFinish(1000);
connection.stop();
}
void CDCore::release() {
stop();
connection.removeAllDevices();
}
void CDCore::startX(double freq) {
//piCout << "start x" << x_timer.isRunning() << freq;
if (!x_timer.isRunning())
x_timer.start(1000. / piMaxd(freq, 0.01));
}
void CDCore::stopX() {
x_timer.stop();
x_timer.waitForFinish(1000);
}
void CDCore::sendCommand(const CDType & c) {
//piCoutObj << "C_sendCommand" << c;
PIByteArray sba = makeHeader(CD_Command, 0);
sba << c.path();
sendDirect(sba);
}
void CDCore::registerCHandler(const CDType & c, PIObject * o, Handler h) {
PIString sp = pathToString(c.path());
if (sp.isEmpty() || !h) return;
//piCout << "register" << sp;
c_handlers[sp] = OHPair(o, h);
}
void CDCore::sendMessage(const CDType & m, MessageType mt, const PIString & msg) {
if (msg.isEmpty() || (m.cd_type() != CDType::cdM)) return;
PIByteArray sba = makeHeader(CD_Message, 0);
sba << m.path() << int(mt) << msg;
sendDirect(sba);
}
CDSection * CDCore::root(CDType::cdT cdt) {
switch (cdt) {
case CDType::cdK: return &k_; break;
case CDType::cdX: return &x_; break;
case CDType::cdC: return &c_; break;
case CDType::cdM: return &m_; break;
default: break;
}
return 0;
}
PIString CDCore::typeLetter(CDType::cdT cdt) {
switch (cdt) {
case CDType::cdK: return PIStringAscii("k"); break;
case CDType::cdX: return PIStringAscii("x"); break;
case CDType::cdC: return PIStringAscii("c"); break;
case CDType::cdM: return PIStringAscii("m"); break;
default: break;
}
return PIString();
}
CDCore * CDCore::instance() {
/*static CDCore * ret = new CDCore();
return ret;*/
return __Core_Initializer__::__instance__;
}
bool CDCore::destroy() {
if (!__Core_Initializer__::__instance__) return false;
// piCout << "delete Core ...";
delete __Core_Initializer__::__instance__;
// piCout << "delete Core ok";
__Core_Initializer__::__instance__ = 0;
__Core_Initializer__::count_ = 0;
return true;
}
void CDUtils::CDCore::K_DirectChange(PIDeque<int> path, PIString value) {
// piCoutObj << "K_DirectChange";
PacketKDirectChange p;
p.path = path;
p.value = value;
PIByteArray sba = makeHeader(CD_KDirectChange, 0);
sba << p;
sendDirect(sba);
}
void CDCore::sendThread() {
if (send_data.size_s() < 4) return;
PacketHeader h;
memcpy(&h, send_data.data(), sizeof(h));
bool ok = datatr.send(send_data);
switch (h.type) {
case CD_KSend:
if (ok) K_Sended();
else K_SendFail();
break;
case CD_KQuery:
if (!ok) K_ReceiveFail();
break;
case CD_XSend:
if (ok) X_Sended();
else X_SendFail();
break;
case CD_XQuery:
if (!ok) X_ReceiveFail();
break;
case CD_CSend:
if (ok) C_Sended();
else C_SendFail();
break;
case CD_CQuery:
if (!ok) C_ReceiveFail();
break;
case CD_MSend:
if (ok) M_Sended();
else M_SendFail();
break;
case CD_MQuery:
if (!ok) M_ReceiveFail();
break;
default: break;
}
}
void CDCore::xTimerTick() {
//piCout << "x tick" << x_pult_side;
PIByteArray ba;
x_mutex.lock();
if (x_pult_side) {
ba = makeHeader(CD_XRequest, 0);
if (need_rebuild_x) {
x_selected = x_.collectX();
//piCout << "collectX" << x_selected.size();
need_rebuild_x = false;
}
ba << x_selected;
//piCout << "x pult send" << x_selected.size();
} else {
ba = makeHeader(CD_XValues, 0);
ba << x_selected;
piForeachC (PIDeque<int> & p, x_selected) {
x_[p].writeX(ba);
}
//piCout << "x app" << x_selected.size();
}
x_mutex.unlock();
sendDirect(ba);
}
void CDCore::piCoutFinished(int id, PIString * buffer) {
if (!buffer || !(id == 1)) return;
PIString sp = buffer->takeRange("[", "]");
PIDeque<int> p = CDCore::stringToPath(sp);
sendMessage(m_[p], Log, *buffer);
delete buffer;
}
void CDCore::initRoot(CDSection * r) {
r->name = "__root__";
r->alias = "root";
r->makePath();
r->calculate();
}
PIByteArray CDCore::makeHeader(CDPacketType type, int session_id) const {
PacketHeader h;
h.type = type;
h.session_id = session_id;
PIByteArray ret; ret << h;
return ret;
}
void CDCore::sendDirect(PIByteArray & ba) {
ba.push_front(header_direct);
connection.writeByName("cd", ba);
}
void CDCore::sendThreaded(PIByteArray & ba) {
if (sendt.isRunning()) {
piCoutObj << "Send in process, abort";
return;
}
send_data = ba;
sendt.startOnce();
}
void CDCore::procReceivedPacket(PIByteArray & ba) {
PacketHeader h;
ba >> h;
switch(h.type) {
case CD_Ping:
//piCoutObj << "ping";
break;
case CD_KQuery:
send(CDType::cdK);
break;
case CD_KSend: {
PIByteArray k;
ba >> k;
k << uchar(0);
PIString s = PIString::fromUTF8((const char *)k.data());
PIIOString ios(&s);
cd_read(&k_, &ios);
K_Received();
piCoutObj << "K received";
} break;
case CD_KDirectChange: {
PacketKDirectChange p;
ba >> p;
k_[p.path].setValue(p.value);
} break;
case CD_XQuery:
send(CDType::cdX);
break;
case CD_XSend: {
PIByteArray x;
ba >> x;
x << uchar(0);
PIString s = PIString::fromUTF8((const char *)x.data());
PIIOString ios(&s);
cd_read(&x_, &ios);
x_selected = x_.collectX();
X_Received();
piCoutObj << "X received";
} break;
case CD_XRequest: {
if (x_pult_side) break;
//break;
x_mutex.lock();
x_selected.clear();
ba >> x_selected;
//piCout << "X req" << x_selected.size();
x_.setSelectedX(false);
piForeachC (PIDeque<int> & p, x_selected) {
x_[p].x_enabled = true;
}
x_mutex.unlock();
} break;
case CD_XValues: {
if (!x_pult_side) break;
PIVector<PIDeque<int> > x_vals;
ba >> x_vals;
x_mutex.lock();
piForeachC (PIDeque<int> & p, x_vals) {
x_[p].readX(ba);
}
x_mutex.unlock();
X_ReceivedX(x_vals);
} break;
case CD_CQuery:
send(CDType::cdC);
break;
case CD_CSend: {
piCoutObj << "C received";
PIByteArray c;
ba >> c;
c << uchar(0);
PIString s = PIString::fromUTF8((const char *)c.data());
PIIOString ios(&s);
cd_read(&c_, &ios);
C_Received();
} break;
case CD_Command: {
piCoutObj << "C command";
PIDeque<int> p;
ba >> p;
if (p.isEmpty()) return;
PIString sp = pathToString(p);
OHPair h = c_handlers.value(sp, OHPair(0, 0));
//piCoutObj << "found" << sp << h.first;
if (h.first && h.second) h.second(h.first);
} break;
case CD_MQuery:
send(CDType::cdM);
break;
case CD_MSend: {
piCoutObj << "M received";
PIByteArray c;
ba >> c;
c << uchar(0);
PIString s = PIString::fromUTF8((const char *)c.data());
PIIOString ios(&s);
cd_read(&m_, &ios);
M_Received();
} break;
case CD_Message: {
PIDeque<int> p;
ba >> p;
piCoutObj << "M message" << p;
if (p.isEmpty()) return;
int t = 0;
PIString msg;
ba >> t >> msg;
//piCoutObj << "found" << sp << h.first;
//piCoutObj << "M message invoke";
M_Message(p, t, msg);
} break;
default: break;
}
}
void CDCore::raiseChangedGlobal(CDType::cdT cdt) {
switch (cdt) {
case CDType::cdK: K_ChangedGlobal(); break;
case CDType::cdX: X_ChangedGlobal(); break;
case CDType::cdC: C_ChangedGlobal(); break;
case CDType::cdM: M_ChangedGlobal(); break;
default: break;
}
}
PIString CDCore::pathToString(const PIDeque<int> & p) {
PIString ret;
for (int i = 0; i < p.size_s(); ++i) {
if (!ret.isEmpty()) ret += ".";
ret << p[i];
}
return ret;
}
PIDeque<int> CDCore::stringToPath(const PIString & p) {
PIDeque<int> ret;
PIStringList sl = p.split(".");
piForeachC (PIString & s, sl)
ret << s.toInt();
return ret;
}
void CDUtils::CDCore::dataReceived(const PIString & from, const PIByteArray & data) {
//piCoutObj << "dataReceived" << from << data.size();
PIIODevice * d = connection.deviceByName("cd");
if (d && d == connection.deviceByFullPath(from)) {
if (data.size() >= sizeof(4)) {
PIByteArray ba = data;
uchar header = ba.take_front();
if (header == header_transfer) {
datatr.received(ba);
}
if (header == header_direct) {
procReceivedPacket(ba);
}
}
}
}
void CDCore::dtSendRequest(PIByteArray & data) {
data.push_front(header_transfer);
connection.writeByName("cd", data);
//piCoutObj << "send" << data.size() << ret;
}
void CDCore::dtReceiveFinished(bool ok) {
if (!ok) return;
PIByteArray ba = datatr.data();
procReceivedPacket(ba);
}

View File

@@ -1,146 +0,0 @@
/*
CD Utils - Control-Debug utilites
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CDUTILS_CORE_H
#define CDUTILS_CORE_H
#include "cdutils_types.h"
#include "cdutils_protocol.h"
#include "piconnection.h"
#include "pidatatransfer.h"
namespace CDUtils {
class CDCore;
class __Core_Initializer__ {
public:
__Core_Initializer__();
~__Core_Initializer__();
static int count_;
static CDCore * __instance__;
};
class CDCore: public PIObject
{
PIOBJECT(CDUtils::CDCore)
friend class __Core_Initializer__;
friend class CDSection;
friend class Interface;
friend class XInterface;
public:
static CDCore * instance();
static bool destroy();
EVENT(K_Sended)
EVENT(K_SendFail)
EVENT(K_Received)
EVENT(K_ReceiveFail)
EVENT(K_ChangedGlobal)
EVENT_HANDLER2(void, K_DirectChange, PIDeque<int>, path, PIString, value);
EVENT(X_Sended)
EVENT(X_SendFail)
EVENT(X_Received)
EVENT(X_ReceiveFail)
EVENT(X_ChangedGlobal)
EVENT1(X_ReceivedX, PIVector<PIDeque<int> >, pathes)
EVENT(C_Sended)
EVENT(C_SendFail)
EVENT(C_Received)
EVENT(C_ReceiveFail)
EVENT(C_ChangedGlobal)
EVENT(M_Sended)
EVENT(M_SendFail)
EVENT(M_Received)
EVENT(M_ReceiveFail)
EVENT(M_ChangedGlobal)
EVENT3(M_Message, PIDeque<int>, path, int, type, PIString, msg)
void cd_write (CDSection * cd, PIIODevice * d);
void cd_read (CDSection * cd, PIIODevice * d);
void cd_parse (CDSection * cd, PIIODevice * d);
void cd_update (CDSection * cd, PIIODevice * d, UpdateModeFlags mode);
void cd_calculate(CDSection * cd);
void cd_send (CDSection * cd, CDPacketType pt, bool direct = false);
void send(CDType::cdT cdt);
void request(CDType::cdT cdt);
void initApp();
void initPult();
void init(const PIString & configuration, bool pult = false);
void stop();
void release();
void startX(double freq = 20.);
void stopX();
void sendCommand(const CDType & c);
void registerCHandler(const CDType & c, PIObject * o, Handler h);
bool inProgress() {return sendt.isRunning();}
void sendMessage(const CDType & m, MessageType mt, const PIString & msg);
CDSection * root(CDType::cdT cdt);
PIString typeLetter(CDType::cdT cdt);
static PIString pathToString(const PIDeque<int> & p);
static PIDeque<int> stringToPath(const PIString & p);
static PIString pultConfig() {return PIString(pult_config);}
static PIString appConfig() {return PIString(app_config);}
private:
CDCore();
~CDCore();
EVENT_HANDLER2(void, dataReceived, const PIString &, from, const PIByteArray &, data);
EVENT_HANDLER1(void, dtSendRequest, PIByteArray &, data);
EVENT_HANDLER1(void, dtReceiveFinished, bool, ok);
EVENT_HANDLER(void, sendThread);
EVENT_HANDLER(void, xTimerTick);
EVENT_HANDLER2(void, piCoutFinished, int, id, PIString*, buffer);
void initRoot(CDSection * r);
PIByteArray makeHeader(CDPacketType type, int session_id = 0) const;
void sendDirect(PIByteArray & ba);
void sendThreaded(PIByteArray & ba);
void procReceivedPacket(PIByteArray & ba);
void raiseChangedGlobal(CDType::cdT cdt);
typedef PIPair<PIObject * , Handler> OHPair;
static const char app_config[], pult_config[];
PIConnection connection;
PIDataTransfer datatr;
PIByteArray send_data;
PIThread sendt;
PITimer x_timer;
CDSection k_, x_, c_, m_;
PIMutex x_mutex;
PIVector<PIDeque<int> > x_selected;
PIMap<PIString, OHPair> c_handlers;
bool need_rebuild_x, x_pult_side;
};
static __Core_Initializer__ __Core_initializer__;
}
#endif // CDUTILS_CORE_H

View File

@@ -1,217 +0,0 @@
#include "cdutils_interface.h"
#include "cdutils_core.h"
#include "piconfig.h"
#include "pifile.h"
using namespace CDUtils;
Interface::Interface(CDType::cdT type_) {
core = CDCore::instance();
s = core->root(type_);
type = type_;
//piCoutObj << (void*)this << core;
file_ = core->typeLetter(type_) + PIStringAscii(".dat");
file_size = 0;
switch (type) {
case CDType::cdK:
CONNECTU(core, K_Sended, this, sended);
CONNECTU(core, K_SendFail, this, sendFailed);
CONNECTU(core, K_Received, this, received);
CONNECTU(core, K_ReceiveFail, this, receiveFailed);
CONNECTU(core, K_ChangedGlobal, this, changedGlobal);
break;
case CDType::cdX:
CONNECTU(core, X_Sended, this, sended);
CONNECTU(core, X_SendFail, this, sendFailed);
CONNECTU(core, X_Received, this, received);
CONNECTU(core, X_ReceiveFail, this, receiveFailed);
CONNECTU(core, X_ChangedGlobal, this, changedGlobal);
break;
case CDType::cdC:
CONNECTU(core, C_Sended, this, sended);
CONNECTU(core, C_SendFail, this, sendFailed);
CONNECTU(core, C_Received, this, received);
CONNECTU(core, C_ReceiveFail, this, receiveFailed);
CONNECTU(core, C_ChangedGlobal, this, changedGlobal);
break;
case CDType::cdM:
CONNECTU(core, M_Sended, this, sended);
CONNECTU(core, M_SendFail, this, sendFailed);
CONNECTU(core, M_Received, this, received);
CONNECTU(core, M_ReceiveFail, this, receiveFailed);
CONNECTU(core, M_ChangedGlobal, this, changedGlobal);
break;
default: break;
}
}
bool Interface::test(int v) {
return s->test(v);
}
CDType & Interface::operator [](const PIString & name_) {
return (*s)[name_];
}
const CDType Interface::operator [](const PIString & name_) const {
return (*s)[name_];
}
CDType & Interface::operator [](const PIDeque<int> & path_) {
return (*s)[path_];
}
const CDType Interface::operator [](const PIDeque<int> & path_) const {
return (*s)[path_];
}
CDType & Interface::operator [](int v) {
//piCout << (void*)this << "[]" << core;
return (*s)[v];
}
const CDType Interface::operator [](int v) const {
//piCout << (void*)this << "[]" << core;
return (*s)[v];
}
CDSection & Interface::section(int v) {
// CDSection & ret = s->section(v);
// piCout << "[get section]" << v << ret.name;
return s->section(v);
}
const CDSection Interface::section(int v) const {
return s->section(v);
}
CDSection & Interface::section(const PIDeque<int> &path) {
PIDeque<int> spath = path;
CDSection * rs = s;
while (!spath.isEmpty()) {
rs = &(rs->section(spath.take_front()));
}
return *rs;
}
CDSection & Interface::root() {
return *s;
}
const CDSection & Interface::root() const {
return *s;
}
int Interface::count(bool recursive) const {
return s->count(recursive);
}
bool Interface::exists(PIDeque<int> path) const {
return s->exists(path);
}
void Interface::setFileName(const PIString & _file) {
file_ = _file;
}
bool Interface::configure(const PIString & config) {
PIConfig conf(config, PIIODevice::ReadOnly);
PIConfig::Entry & e(conf.getValue(core->typeLetter(s->cd_type_)));
bool ret = false;
setFileName(e.getValue("file", file(), &ret).toString());
return ret;
}
void Interface::reinitConnection(const PIString & configuration) {
core->init(configuration);
}
void Interface::releaseConnection() {
core->release();
}
void Interface::write(PIIODevice * d) {
core->cd_write(s, d);
}
void Interface::read(PIIODevice * d) {
core->cd_read(s, d);
}
void Interface::parse(PIIODevice * d) {
core->cd_parse(s, d);
}
void Interface::update(PIIODevice * d, UpdateModeFlags mode) {
core->cd_update(s, d, mode);
}
void Interface::calculate() {
core->cd_calculate(s);
}
PIString Interface::appConfig() {
return core->appConfig();
}
PIString Interface::pultConfig() {
return core->pultConfig();
}
void Interface::readFile() {
if (file_.isEmpty()) return;
PIFile f(file_, PIIODevice::ReadOnly);
read(&f);
file_size = f.size();
}
void Interface::writeFile() {
if (file_.isEmpty()) return;
PIFile f(file_, PIIODevice::ReadWrite);
f.clear();
write(&f);
file_size = f.size();
}
bool Interface::inProgress() {
return core->inProgress();
}
void Interface::send() {
core->send(type);
}
void Interface::request() {
core->request(type);
}

View File

@@ -1,95 +0,0 @@
/*
CD Utils - Control-Debug utilites
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CDUTILS_INTERFACE_H
#define CDUTILS_INTERFACE_H
#include "cdutils_types.h"
#include "piobject.h"
namespace CDUtils {
class CDCore;
class Interface: public PIObject
{
PIOBJECT(CDUtils::Interface)
public:
Interface(CDType::cdT type_);
bool test(int v);
CDType & operator [](int v);
const CDType operator [](int v) const;
CDType & operator [](const PIString & name_);
const CDType operator [](const PIString & name_) const;
CDType & operator [](const PIDeque<int> & path_);
const CDType operator [](const PIDeque<int> & path_) const;
CDSection & section(int v);
const CDSection section(int v) const;
CDSection & section(const PIDeque<int> & path);
CDSection & root();
const CDSection & root() const;
int count(bool recursive = true) const;
const PIString file() const {return file_;}
int fileSize() const {return file_size;}
CDType::cdT cdType() const {return type;}
bool exists(PIDeque<int> path) const;
void setFileName(const PIString & _file);
bool configure(const PIString & config);
void reinitConnection(const PIString & configuration);
void releaseConnection();
void write(PIIODevice * d);
void read(PIIODevice * d);
void parse(PIIODevice * d);
void update(PIIODevice * d, UpdateModeFlags mode = SaveByName);
void calculate();
PIString appConfig();
PIString pultConfig();
void readFile();
void writeFile();
bool inProgress();
EVENT(sended)
EVENT(sendFailed)
EVENT(received)
EVENT(receiveFailed)
EVENT(changedGlobal)
EVENT_HANDLER(void, send);
EVENT_HANDLER(void, request);
protected:
CDCore * core;
CDSection * s;
CDType::cdT type;
PIString file_;
int file_size;
};
}
#endif // CDUTILS_INTERFACE_H

View File

@@ -1,20 +0,0 @@
#include "cdutils_k.h"
#include "cdutils_core.h"
using namespace CDUtils;
KInterface K;
KInterface::KInterface(): Interface(CDType::cdK) {
}
void KInterface::directChange(const CDType & k) {
core->K_DirectChange(k.path(), k.value());
}
void KInterface::directChange(const CDType & k, double v) {
core->K_DirectChange(k.path(), PIString::fromNumber(v));
}

View File

@@ -1,46 +0,0 @@
/*
CD Utils - Control-Debug utilites
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CDUTILS_K_H
#define CDUTILS_K_H
#include "cdutils_interface.h"
namespace CDUtils {
class KInterface: public Interface
{
PIOBJECT_SUBCLASS(KInterface, Interface)
public:
KInterface();
EVENT1(keepNamesRequest, bool*, kn)
void directChange(const CDType & k);
void directChange(const CDType & k, double v);
};
}
extern CDUtils::KInterface K;
#endif // CDUTILS_K_H

View File

@@ -1,22 +0,0 @@
#include "cdutils_m.h"
#include "cdutils_core.h"
using namespace CDUtils;
MInterface M;
MInterface::MInterface(): Interface(CDType::cdM) {
CONNECTU(core, M_Message, this, messageReceived);
}
void MInterface::messageBox(const CDType & m, const PIString & msg) {
core->sendMessage(m, MessageBox, msg);
}
PICout MInterface::createPICout(const CDType & m) const {
PIString * buff = new PIString("[" + CDCore::pathToString(m.path()) + "]");
return PICout(buff, 1);
}

View File

@@ -1,55 +0,0 @@
/*
CD Utils - Control-Debug utilites
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CDUTILS_M_H
#define CDUTILS_M_H
#include "cdutils_interface.h"
namespace CDUtils {
class MInterface: public Interface
{
PIOBJECT_SUBCLASS(MInterface, Interface)
public:
MInterface();
PICout operator [](int v) {return createPICout((*s)[v]);}
PICout operator [](int v) const {return createPICout((*s)[v]);}
PICout operator [](const PIString & name_) {return createPICout((*s)[name_]);}
PICout operator [](const PIString & name_) const {return createPICout((*s)[name_]);}
PICout operator [](const PIDeque<int> & path_) {return createPICout((*s)[path_]);}
PICout operator [](const PIDeque<int> & path_) const {return createPICout((*s)[path_]);}
void messageBox(const CDType & m, const PIString & msg);
EVENT3(messageReceived, PIDeque<int>, path, int, type, PIString, msg)
private:
PICout createPICout(const CDType & m) const;
};
}
extern CDUtils::MInterface M;
#endif // CDUTILS_M_H

View File

@@ -1,196 +0,0 @@
#include "cdutils_parser.h"
#include "cdutils_types.h"
#include "piiostring.h"
#include "piiobytearray.h"
#include "pifile.h"
using namespace CDUtils;
enum Phase {
eName = 1,
eBracketOpen,
eBracketClose,
eMemberName,
eMemberEqual,
eMemberValue,
eMemberComma,
eComment,
eMultiComment
};
void removeComment(PIString & line, PIString * type, PIString * comment) {
int ci = line.find("//");
if (ci >= 0) {
if (comment) *comment = line.right(line.size_s() - ci - 2);
line.cutRight(line.size_s() - ci).trim();
if (type && comment && !line.isEmpty()) {
*type = comment->takeLeft(1);
comment->trim();
}
}
}
void parseEnumLine(PIString & line, int * value, PIString * type, PIString * comment) {
removeComment(line, type, comment);
int ci = line.find("=");
if (ci >= 0) {
if (value) *value = line.right(line.size_s() - ci - 1).trim().toInt();
line.cutRight(line.size_s() - ci).trim();
}
if (line.trim().endsWith(",")) line.cutRight(1);
}
void parseInsert(PIString line, PIString & alias, PIStringList & out) {
out.clear();
int ci = line.find("=");
if (ci < 0) return;
alias = line.right(line.size_s() - ci - 1).trim();
line.cutRight(line.size_s() - ci).trim();
while (line.find("[") > 0) {
int is = line.find("["), ie = line.find("]");
PIString arr = line.mid(is + 1, ie - is - 1);
out << arr;
line.cutMid(is, ie - is + 1);
}
if (!line.isEmpty()) out.insert(0, line);
}
PIVector<int> enumValues(const PIString & e, const PIMap<PIString, CDSection> & sections, PIStringList & enames) {
PIVector<int> ret;
enames.clear();
if (sections.contains(e)) {
ret = sections[e].indexes();
enames = sections[e].index_names();
} else {
int v = e.toInt();
if (v < 2) return ret;
for (int i = 0; i < v; ++i) {
ret << i;
enames << "";//PIString::fromNumber(i);
}
}
return ret;
}
CDSection CDParser::parse(PIIODevice * d, int cdsection_type) {
CDType::cdT et = (CDType::cdT)cdsection_type;
if (!d) return CDSection(et);
if (!d->canRead()) return CDSection(et);
//piCout << "[CDSection] parse start";
CDSection cs(et);
CDType ck;
PIMap<PIString, CDSection> sections;
PIMap<PIString, int> enum_values;
PIString content, line, alias, type, comment;
PIStringList iarr;
if (PIStringAscii(d->className()) == PIStringAscii("PIFile")) {
PIByteArray c = ((PIFile*)d)->readAll();
c << uchar(0);
content = PIString::fromUTF8((const char *)c.data());
}
if (PIStringAscii(d->className()) == PIStringAscii("PIIOString")) content = *(((PIIOString*)d)->string());
if (PIStringAscii(d->className()) == PIStringAscii("PIIOByteArray")) content = PIString(*(((PIIOByteArray*)d)->byteArray()));
PIIOString ios(&content);
//int phase = 0;
int cind = -1;
while ((cind = content.find("enum", cind)) >= 0) {
ios.seek(cind);
line = ios.readLine().trim();
type.clear();
comment.clear();
removeComment(line, &type, &comment);
if (line.find("{") < 0) {
cind += 4;
continue;
}
line.cutLeft(line.find("enum") + 4).trim();
line.cutRight(line.size_s() - line.find("{")).trim();
if (line.isEmpty()) {
cind += 4;
continue;
}
cs = CDSection(et);
cs.name = line;
//piCout << "enum" << cs.name;
int cev = 0;
// cevalues.clear();
while (!ios.isEnd()) {
line = ios.readLine().trim();
comment.clear();
removeComment(line, &type, &comment);
if (line.find("}") >= 0) break;
if (line.isEmpty()) {
if (comment.find("=") >= 0) {
parseInsert(comment, alias, iarr);
if (!iarr.isEmpty()) {
// piCout << "#" << enum_values;
if (!enum_values.contains(alias)) {
piCout << "Parse error: can`t find section alias \"" << alias << "\"!";
return CDSection(et);
}
if (!sections.contains(iarr.front())) {
piCout << "Parse error: can`t find section \"" << iarr.front() << "\"!";
return CDSection(et);
}
//piCout << "insert" << alias << iarr;
int aval = enum_values.value(alias);
CDSection is = sections.value(iarr.take_front()), ts;
int ibpos = is.name.size_s();
piForeachRC (PIString & a, iarr) {
PIStringList enames;
PIVector<int> evals = enumValues(a, sections, enames);
//piCout << a << evals;
for (int i = 0; i < evals.size_s(); ++i) {
ts.section(evals[i]) = is;
ts.section(evals[i]).alias = enames[i];
}
ts.name = is.name;
ts.name.insert(ibpos, PIString("[") << a << "]");
is = ts;
ts = CDSection(et);
}
is.alias = alias;
cs.section(aval) = is;
}
}
} else {
parseEnumLine(line, &cev, &type, &comment);
//piCout << line << "=" << cev << "//" << type << comment;
ck = CDType(cev, line, type, "", "", comment, et);
if (type == "e") {
if (comment.startsWith("${")) {
comment.cutLeft(1);
PIString en = comment.inBrackets('{', '}');
comment.cutLeft(en.size_s() + 2).trim();
ck.setEnumValues(sections.value(en).enumValues());
ck.setComment(comment);
//piCout << "enum" << en << ck.enumValues();
}
}
cs[cev] = ck;
//cevalues[line] = cev;
enum_values[line] = cev;
++cev;
}
}
//piCout << cs.name << cs.k;
sections[cs.name] = cs;
// piCout << "#" << cevalues;
// enum_values << cevalues;
cind += 4;
}
// piCout << "[CDSection] parse end";
switch (et) {
case CDType::cdK: return sections.value("KDescription");
case CDType::cdX: return sections.value("XDescription");
case CDType::cdC: return sections.value("CDescription");
case CDType::cdM: return sections.value("MDescription");
default: return CDSection(et);
}
return CDSection(et);
}

View File

@@ -1,38 +0,0 @@
/*
CD Utils - Control-Debug utilites
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CDUTILS_PARSER_H
#define CDUTILS_PARSER_H
class PIIODevice;
namespace CDUtils {
class CDSection;
namespace CDParser {
CDSection parse(PIIODevice * d, int cdsection_type);
}
}
#endif // CDUTILS_PARSER_H

View File

@@ -1,72 +0,0 @@
/*
CD Utils - Control-Debug utilites
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CDUTILS_PROTOCOL_H
#define CDUTILS_PROTOCOL_H
#include "pibytearray.h"
namespace CDUtils {
enum CDPacketType {
CD_Ping,
CD_Pong,
CD_KQuery,
CD_KSend,
CD_KDirectChange,
CD_XQuery,
CD_XSend,
CD_XRequest,
CD_XValues,
CD_CQuery,
CD_CSend,
CD_Command,
CD_MQuery,
CD_MSend,
CD_Message,
};
# pragma pack(push,1)
struct PacketHeader {
int type; // CDPacketType
int session_id;
};
struct PacketKDirectChange {
PIDeque<int> path;
PIString value;
};
# pragma pack(pop)
inline PIByteArray & operator <<(PIByteArray & s, const PacketHeader & v) {s << v.type << v.session_id; return s;}
inline PIByteArray & operator >>(PIByteArray & s, PacketHeader & v) {s >> v.type >> v.session_id; return s;}
inline PIByteArray & operator <<(PIByteArray & s, const PacketKDirectChange & v) {s << v.path << v.value; return s;}
inline PIByteArray & operator >>(PIByteArray & s, PacketKDirectChange & v) {s >> v.path >> v.value; return s;}
}
#endif // CDUTILS_PROTOCOL_H

View File

@@ -1,763 +0,0 @@
#include "cdutils_types.h"
#include "piconfig.h"
#include "pifile.h"
#include "pievaluator.h"
#include "cdutils_core.h"
using namespace CDUtils;
//int cdtype_debug_cnt = 1;
const int cd_x_history_max_size = 4000;
CDType::CDType() {
index_ = -1;
value_d = 0.;
value_i = 0;
value_b = calculated = x_enabled = false;
cd_type_ = cdNull;
parent = 0;
avg_size = 1;
mode_ = rmode_ = X_Current;
// debug_cnt = cdtype_debug_cnt;
// cdtype_debug_cnt++;
// piCout << "[CDType]" << "create Null" << debug_cnt;
}
CDType::CDType(int i, const PIString & n, const PIString & t, const PIString & v, const PIString & f, const PIString & c, cdT cd_t) {
index_ = i;
name_ = n.trimmed();
type_ = t.trimmed();
value_s = v.trimmed();
formula_ = f.trimmed();
comment_ = c.trimmed();
value_d = v.toDouble();
value_i = v.toInt();
value_b = v.toBool();
cd_type_ = cd_t;
calculated = x_enabled = false;
parent = 0;
avg_size = 1;
mode_ = rmode_ = X_Current;
if (type_ == "e") {
enum_values = parseEnumComment(comment_);
// piCout << enum_values.size() << enum_values;
}
// piCout << type_.size() << type_.toUTF8();
// piCout << formula_.size() << formula_.toUTF8();
// piCout << comment_.size() << comment_.toUTF8();
// debug_cnt = cdtype_debug_cnt;
// cdtype_debug_cnt++;
// piCout << "[CDType] create" << name_ << ":" << type_ << ":" << value_s << ":" << value_d << ":" << formula_ << ":" << comment_ << ":" << (cd_type_ == cdK);
}
CDType & CDType::operator =(double x) {
value_d = x;
value_i = x;
value_b = x > 0.;
if (mode_ == X_All_Avg) {
avg_h << x;
double val = 0;
if (avg_h.size_s() >= avg_size) {
for (int i = 0; i < avg_h.size_s(); i++)
val += avg_h[i];
val /= avg_h.size();
avg_h.clear();
if (history.size() < cd_x_history_max_size)
history << val;
}
}
return *this;
}
PIString CDType::type() const {
if (type_.trimmed().isEmpty()) return "f";
// piCout << "type =" << type_.trimmed() << ";" << type_ << "#";
return type_;
}
PIString CDType::value() const {
if (type_ == "b") return PIString::fromBool(value_b);
return value_s;
}
PIVariant CDType::variantValue() const {
if (type_.isEmpty()) return PIVariant(value());
switch (type_[0].toAscii()) {
case 'b': return PIVariant(toBool()); break;
case 'n': return PIVariant(toInt()); break;
case 'f': return PIVariant(toDouble()); break;
case 'c': return PIVariant(PIVariantTypes::Color(toInt())); break;
case 'e': {
PIVariantTypes::Enum e = enum_values;
e.selectValue(toInt());
return PIVariant(e);
break;
}
default: break;
}
return PIVariant(value());
}
void CDType::setValue(const PIString & value_) {
formula_ = value_;
value_d = formula_.toDouble();
value_i = formula_.toInt();
value_b = formula_.toBool();
}
void CDType::setVariantValue(const PIVariant & value_) {
setValue(PIString::fromNumber(value_.toDouble()));
}
void CDType::setFormula(const PIString & f) {
formula_ = f;
calculated = false;
//PIEvaluator e;
//calculate(&e);
}
PIStringList CDType::pathString() const {
PIStringList ret;
CDSection * ps = CDCore::instance()->root(cd_type_);
if (!ps) return ret;
for (int i = 0; i < path_.size_s() - 1; ++i) {
ps = &(ps->section(path_[i]));
if (!ps->alias.isEmpty()) ret << ps->alias;
else ret << PIString::fromNumber(path_[i]);
}
if (!name_.isEmpty()) ret << name_;
else ret << PIString::fromNumber(index_);
return ret;
}
void CDType::readX(PIByteArray & ba) {
if (ba.size() < 5) return;
uchar t(0); ba >> t;
rmode_ = (XMode)t;
switch (rmode_) {
case X_Current:
ba >> value_d;
break;
case X_All_Avg: {
PIVector<double> ah;
ba >> ah;
history << ah;
if (!history.isEmpty())
value_d = history.back();
} break;
default: break;
}
value_i = value_d;
value_b = value_d > 0.;
}
void CDType::writeX(PIByteArray & ba) {
ba << uchar(mode_);
switch (mode_) {
case X_Current:
ba << value_d;
break;
case X_All_Avg:
ba << history;
history.clear();
break;
default: break;
}
}
bool CDType::calculate(PIEvaluator * e, PIVector<const CDType * > stack) {
if (stack.contains(this)) {
error_ = "Circular dependencies: ";
piForeachC (CDType * k, stack)
error_ << k->name() << " -> ";
error_ << name();
//piCout << error_;
return false;
}
stack << this;
if (calculated) return true;
calculated = true;
error_.clear();
if (!parent) return true;
//piCout << "calc" << name_ << (parent ? parent->alias : "root");
value_s = formula_.trimmed();
for (;;) {
int ki = value_s.find("K[");
if (ki < 0) break;
int ke = value_s.find("]", ki + 2);
if (ke < 0) break;
PIString kp = value_s.mid(ki + 2, ke - ki - 2);
//piCout << kp;
CDType & k((*parent)[kp]);
k.calculate(e, stack);
value_s.replace(ki, ke - ki + 1, PIString::fromNumber(k.value_d));
}
value_d = formula_.toDouble();
value_i = formula_.toInt();
value_b = formula_.toBool();
double ev = 0.;
if (!e->check(value_s) && value_d == 0. && value_i == 0 && !value_b) {
PIString f = formula_.trimmed().toLowerCase();
if (f != "off" && f != "false" && f != "no" && !value_b) {
error_ = e->error();
return false;
}
} else
if (e->isCorrect())
ev = e->evaluate().real();
//piCout << value_s << value_i << value_d << ev;
//if ((value_d == 0.) || (piAbsd(value_d) < piAbsd(ev))) value_d = ev;
//if ((value_i == 0) || (piAbsd(value_i) < piAbsd(ev))) value_i = int(ev);
if ((value_d == 0.) || (ev != 0.)) value_d = ev;
if ((value_i == 0) || (ev != 0.)) value_i = int(ev);
value_b = value_b || (ev > 0.);
if (value_i != 0) {
if (value_d == 0.) value_d = value_i;
value_b = value_i > 0;
}
if (value_d != 0.) {
if (value_i == 0) value_i = value_d;
value_b = value_d > 0.;
}
if (value_b) {
if (value_d == 0.) value_d = 1.;
if (value_i == 0) value_i = 1;
}
value_s = PIString::fromNumber(value_d);
return true;
}
PIVariantTypes::Enum CDType::parseEnumComment(PIString c) {
PIVariantTypes::Enum ret;
if (c.isEmpty()) return ret;
if (type_ == "e") {
PIStringList sl = c.inBrackets('{', '}').split(",");
int cval = 0;
piForeach (PIString & s, sl) {
s.trim();
if (s.isEmpty()) continue;
if (s[0].isDigit()) {
int ind = s.find("-");
if (ind > 0) {
cval = s.left(ind).toInt();
s.cutLeft(ind + 1).trim();
}
}
ret << PIVariantTypes::Enumerator(cval, s);
++cval;
}
}
//piCout << c << "=" << ret;
return ret;
}
//CDType::CDType(const CDType &cdt) {
// index_ = cdt.index_;
// name_ = cdt.name_;
// type_ = cdt.type_;
// value_s = cdt.value_s;
// formula_ = cdt.formula_;
// comment_ = cdt.comment_;
// value_d = cdt.value_d;
// value_i = cdt.value_i;
// value_b = cdt.value_b;
// cd_type_ = cdt.cd_type_;
// debug_cnt = cdtype_debug_cnt;
// cdtype_debug_cnt++;
// piCout << "[CDType] copy" << debug_cnt << "->" << cdt.debug_cnt << index_ << ":" << name_ << ":" << type_ << ":" << value_s << ":" << value_d << ":" << formula_ << ":" << comment_ << ":" << (cd_type_ == cdK);
//}
//CDType &CDType::operator =(const CDType &cdt) {
// index_ = cdt.index_;
// name_ = cdt.name_;
// type_ = cdt.type_;
// value_s = cdt.value_s;
// formula_ = cdt.formula_;
// comment_ = cdt.comment_;
// value_d = cdt.value_d;
// value_i = cdt.value_i;
// value_b = cdt.value_b;
// cd_type_ = cdt.cd_type_;
// piCout << "[CDType] assign" << debug_cnt << "=" << cdt.debug_cnt << index_ << ":" << name_ << ":" << type_ << ":" << value_s << ":" << value_d << ":" << formula_ << ":" << comment_ << ":" << (cd_type_ == cdK);
// //debug_cnt = cdt.debug_cnt;
// return *this;
//}
//CDType::~CDType() {
// piCout << "[CDType] delete" << debug_cnt << index_ << ":" << name_ << ":" << type_ << ":" << value_s << ":" << value_d << ":" << formula_ << ":" << comment_ << ":" << (cd_type_ == cdK);
//}
CDSection::CDSection(CDType::cdT type_) {
cd_type_ = type_;
null.cd_type_ = type_;
}
CDSection & CDSection::section(int v) {
CDSection & ret(s[v]);
ret.cd_type_ = cd_type_;
return ret;
}
const CDSection CDSection::section(int v) const {
CDSection & ret(s[v]);
ret.cd_type_ = cd_type_;
return s[v];
}
bool CDSection::exists(PIDeque<int> path) const {
if (path.isEmpty()) return false;
if (path.size_s() == 1) return cd.contains(path[0]);
int si = path[0];
if (!s.contains(si)) return false;
path.remove(0, 1);
return s[si].exists(path);
}
int CDSection::count(bool recursive) const {
int ret = cd.size_s();
if (recursive) {
PIMap<int, CDSection>::const_iterator i;
for (i = s.constBegin(); i != s.constEnd(); ++i)
ret += i->second.count(recursive);
}
return ret;
}
int CDSection::sectionsCount() const {
return s.size();
}
PIStringList CDSection::index_names() const {
PIStringList ret;
PIMap<int, CDType>::const_iterator i;
for (i = cd.begin(); i != cd.end(); ++i)
ret << i->second.name();
return ret;
}
void CDSection::calculate() {
prepareCalculate();
if (cd_type_ != CDType::cdK) return;
PIEvaluator e;
calculateRecursive(&e);
}
CDType & CDSection::getByName(const PIString & name_) {
PIStringList np = name_.split(".");
if (np.isEmpty()) return null;
//piCout << np;
CDSection * cs = this, * ns = 0;
if (np.front().isEmpty()) {
if (np.size_s() < 2) return null;
cs = CDCore::instance()->root(cd_type_);
np.pop_front();
}
for (int i = 0; i < np.size_s() - 1; ++i) {
if (np[i].isEmpty()) return null;
bool isd = np[i][0].isDigit() || (np[i][0] == '-');
int dv = 0;
if (isd) dv = np[i].toInt();
ns = 0;
PIMap<int, CDSection>::iterator it;
//piCout << np[i] << isd << dv;
for (it = cs->s.begin(); it != cs->s.end(); ++it) {
bool f = false;
if (isd) f = (dv == it.key());
else f = (np[i] == it.value().alias);
//piCout << "s..." << it.key() << it.value().alias << f;
if (f) {
ns = &(it.value());
break;
}
}
//piCout << ns;
if (!ns) return null;
cs = ns;
}
PIMap<int, CDType>::iterator it;
if (np.back().isEmpty()) return null;
bool isd = np.back()[0].isDigit() || (np.back()[0] == '-');
int dv = 0;
if (isd) dv = np.back().toInt();
//piCout << np.back() << isd << dv;
for (it = cs->cd.begin(); it != cs->cd.end(); ++it) {
bool f = false;
if (isd) f = (dv == it.key());
else f = (np.back() == it.value().name());
//piCout << "k..." << it.key() << it.value().name() << f;
if (f)
return cs->cd[it.key()];
}
return null;
}
CDType & CDSection::getByPath(const PIDeque<int> & path_) {
if (path_.isEmpty()) return null;
CDSection * s = this;
for (int i = 0; i < path_.size_s() - 1; ++i)
s = &(s->section(path_[i]));
if (!s) return null;
return (*s)[path_.back()];
}
void CDSection::write(PIIODevice * d, const PIString & prefix) {
if (!d) return;
if (cd.isEmpty() && s.isEmpty()) return;
// piCout << "[CDSection] write start";
PIString l;
PIStringList cdtl;
cdtl << "null" << "k" << "x" << "c" << "m";
if (prefix.isEmpty()) l = "[" + cdtl[cd_type_] + "]";
else l = "[" + prefix + "." + cdtl[cd_type_] + "]";
l += "\n";
d->write(l.toUTF8());
l = "name = " + name + " \n";
d->write(l.toUTF8());
l = "alias = " + alias + " \n";
d->write(l.toUTF8());
PIMap<int, CDType>::iterator i;
for (i = cd.begin(); i != cd.end(); ++i) {
CDType & ck(i.value());
if (ck.cd_type() != cd_type_) continue;
switch (cd_type_) {
case CDType::cdNull: break;
case CDType::cdK:
l.clear(); l << ck.index() << ".f = " << ck.formula() << " #s " << ck.comment() << " \n";
d->write(l.toUTF8());
l.clear(); l << ck.index() << ".v = " << ck.value() << " #" << ck.type() << " " << ck.name() << " \n";
d->write(l.toUTF8());
if (!ck.enumValues().enum_list.isEmpty()) {
l.clear(); l << ck.index() << ".ev = {";
//PIVector<CDType::Enumerator> el = ck.enumValues();
piForeachC (PIVariantTypes::Enumerator & e, ck.enumValues().enum_list)
l << e.value << " - " << e.name << ", ";
l.cutRight(2);
l << "} \n";
d->write(l.toUTF8());
}
break;
case CDType::cdX:
l.clear(); l << ck.index() << ".name = " << ck.name() << " #s " << ck.comment() << " \n";
d->write(l.toUTF8());
l.clear(); l << ck.index() << ".mode = " << ck.xmode() << " #e (0 - cur, 1 - all_avg) " << "\n";
d->write(l.toUTF8());
l.clear(); l << ck.index() << ".avg = " << ck.avg() << " #n " << "\n";
d->write(l.toUTF8());
l.clear(); l << ck.index() << ".sel = " << (ck.isSelectedX() ? "1" : "0") << " #n " << "\n";
d->write(l.toUTF8());
break;
case CDType::cdC:
case CDType::cdM:
l.clear(); l << ck.index() << ".name = " << ck.name() << " #s " << ck.comment() << " \n";
d->write(l.toUTF8());
break;
}
}
if (!s.isEmpty()) {
if (prefix.isEmpty()) l = "s";
else l = prefix + ".s";
PIMap<int, CDSection>::iterator j;
for (j = s.begin(); j != s.end(); ++j) {
j.value().write(d, l + "." + PIString::fromNumber(j.key()));
}
}
if (prefix.isEmpty()) {
l = "[]\n";
d->write(l.toUTF8());
}
// piCout << "[CDSection] write end";
}
void CDSection::read(const void * ep) {
// piCout << "[CDSection] read start";
PIStringList cdtl;
cdtl << "null" << "k" << "x" << "c" << "m";
cd.clear();
s.clear();
PIConfig::Entry & e(*(PIConfig::Entry*)ep);
name = e.getValue(cdtl[cd_type_] + ".name").value();
alias = e.getValue(cdtl[cd_type_] + ".alias").value();
PIConfig::Entry & cdl = e.getValue(cdtl[cd_type_]);
for (int i = 0; i < cdl.childCount(); ++i) {
const PIConfig::Entry * e(cdl.child(i));
bool ok = false;
int id = e->name().toInt(-1, &ok);
// piCout << "[read]" << ke->name() << ke->value() << ok;
// PIString n = ke->getValue("v").comment();
// PIString t = n.takeLeft(1);
if (ok) {
CDType c;
PIString ev;
switch (cd_type_) {
case CDType::cdNull: break;
case CDType::cdK:
c = CDType(id, e->getValue("v").comment(), e->getValue("v").type(), e->getValue("v").value(), e->getValue("f").value(), e->getValue("f").comment(), cd_type_);
ev = e->getValue("ev", "").value();
if (!ev.isEmpty())
c.enum_values = c.parseEnumComment(ev);
break;
case CDType::cdX:
c = CDType(id, e->getValue("name").value(), PIString(), PIString(), PIString() , e->getValue("name").comment(), cd_type_);
c.setXMode((CDType::XMode)e->getValue("mode", int(CDType::X_Current)).value().toInt());
c.setAvg((CDType::XMode)e->getValue("avg", 1).value().toInt());
c.x_enabled = e->getValue("sel", false).value().toBool();
break;
case CDType::cdC:
case CDType::cdM:
c = CDType(id, e->getValue("name").value(), PIString(), PIString(), PIString() , e->getValue("name").comment(), cd_type_);
break;
}
cd[id] = c;
}
}
PIConfig::Entry & sl = e.getValue("s");
for (int i = 0; i < sl.childCount(); ++i) {
const PIConfig::Entry * se(sl.child(i));
int sid = se->name().toInt();
CDSection & rs(s[sid]);
rs.cd_type_ = cd_type_;
rs.read(se);
}
// piCout << "[CDSection] read end";
}
void CDSection::update(CDSection & v, UpdateModeFlags mode) {
if (mode[SaveByIndex] && mode[SaveByName]) {
piCout << "[CDSection] update error: SaveByIndex | SaveByName mode is denied!";
return;
}
//piCout << "[CDSection] update start";
//piCout << "before" << k.size() << v.k.size();
PIMap<int, PIString> prev_cd_f_bi;
PIMap<PIString, PIString> prev_cd_f_bn;
PIMap<int, CDType>::iterator i;
if (mode[SaveByIndex]) {
for (i = cd.begin(); i != cd.end(); ++i)
prev_cd_f_bi[i.key()] = i.value().formula();
}
if (mode[SaveByName]) {
for (i = cd.begin(); i != cd.end(); ++i)
prev_cd_f_bn[i.value().name_] = i.value().formula();
}
if (!mode[Merge])
cd.clear();
for (i = v.cd.begin(); i != v.cd.end(); ++i) {
int id = i.key();
PIString n = i.value().name();
cd[id] = i.value();
if (mode[SaveByIndex]) {
if (prev_cd_f_bi.contains(id))
cd[id].setFormula(prev_cd_f_bi[id]);
}
if (mode[SaveByName]) {
if (prev_cd_f_bn.contains(n))
cd[id].setFormula(prev_cd_f_bn[n]);
}
}
PIMap<int, CDSection> prev_s_bi;
PIMap<PIString, CDSection> prev_s_bn;
PIMap<int, CDSection>::iterator j;
if (mode[SaveByIndex]) {
for (j = s.begin(); j != s.end(); ++j)
prev_s_bi[j.key()] = j.value();
}
if (mode[SaveByName]) {
for (j = s.begin(); j != s.end(); ++j)
prev_s_bn[j.value().alias] = j.value();
}
if (!mode[Merge])
s.clear();
for (j = v.s.begin(); j != v.s.end(); ++j) {
int id = j.key();
PIString n = j.value().alias;
s[id] = j.value();
if (mode[SaveByIndex]) {
if (prev_s_bi.contains(id))
s[id] = prev_s_bi[id];
}
if (mode[SaveByName]) {
if (prev_s_bn.contains(n))
s[id] = prev_s_bn[n];
}
s[id].update(j.value(), mode);
}
/*PISet<int> used;
for (i = k.begin(); i != k.end(); ++i) {
if (v.k.contains(i.key())) {
PIString f = k[i.key()].formula_;
CDType & cdt = v.k[i.key()];
cdt.formula_ = f;
k[i.key()] = cdt;
used << i.key();
}
if (mode) {
CDType & ck(k[i.key()]);
if (prev_k_f_bn.contains(ck.name_))
ck.setFormula(prev_k_f_bn[ck.name_]);
}
}
//piCout << " after" << k.size();
for (i = v.k.begin(); i != v.k.end(); ++i) {
if (!used.contains(i.key()))
k[i.key()] = i.value();
CDType & ck(k[i.key()]);
ck.setFormula(prev_k_f_bn.value(ck.name_));
}
used.clear();
PIMap<int, CDSection>::iterator j;
for (j = s.begin(); j != s.end(); ++j) {
if (v.s.contains(j.key()))
j.value().update(v.s[j.key()], mode);
used << j.key();
}
for (j = v.s.begin(); j != v.s.end(); ++j) {
if (!used.contains(j.key()))
s[j.key()] = j.value();
}*/
// piCout << "[CDSection] update end";
}
bool CDSection::isSameStructure(CDSection & v) {
PIMap<PIString, int> cd_ids;
PIMap<int, CDType>::iterator i;
for (i = cd.begin(); i != cd.end(); ++i)
cd_ids[i.value().name()] = i.key();
for (i = v.cd.begin(); i != v.cd.end(); ++i) {
if (!cd_ids.contains(i.value().name())) continue;
//piCout << i.key() << k[i.key()].name() << i.value().name();
if (cd[cd_ids[i.value().name()]].index() != i.key())
return false;
}
PIMap<int, CDSection>::iterator j;
for (j = v.s.begin(); j != v.s.end(); ++j) {
if (!s.contains(j.key())) continue;
if (!s[j.key()].isSameStructure(j.value()))
return false;
}
return true;
}
void CDSection::prepareCalculate() {
PIMap<int, CDType>::iterator i;
for (i = cd.begin(); i != cd.end(); ++i) {
i.value().parent = this;
i.value().calculated = false;
}
PIMap<int, CDSection>::iterator j;
for (j = s.begin(); j != s.end(); ++j)
j.value().prepareCalculate();
}
void CDSection::calculateRecursive(PIEvaluator * e) {
PIMap<int, CDType>::iterator i;
for (i = cd.begin(); i != cd.end(); ++i)
i.value().calculate(e);
PIMap<int, CDSection>::iterator j;
for (j = s.begin(); j != s.end(); ++j)
j.value().calculateRecursive(e);
}
void CDSection::setSelectedX(bool yes) {
PIMap<int, CDType>::iterator i;
for (i = cd.begin(); i != cd.end(); ++i)
i.value().x_enabled = yes;
PIMap<int, CDSection>::iterator j;
for (j = s.begin(); j != s.end(); ++j)
j.value().setSelectedX(yes);
}
PIVector<PIDeque<int> > CDSection::collectX() const {
PIVector<PIDeque<int> > ret;
PIMap<int, CDType>::const_iterator i;
for (i = cd.begin(); i != cd.end(); ++i) {
if (i.value().x_enabled)
ret << i.value().path();
}
PIMap<int, CDSection>::const_iterator j;
for (j = s.constBegin(); j != s.constEnd(); ++j)
ret << j.value().collectX();
return ret;
}
void CDSection::makePath(PIDeque<int> p) {
PIDeque<int> tp;
PIMap<int, CDType>::iterator i;
for (i = cd.begin(); i != cd.end(); ++i) {
tp = p;
tp << i.key();
i.value().path_ = tp;
//piCout << "path for" << i.value().name() << tp;
}
PIMap<int, CDSection>::iterator j;
for (j = s.begin(); j != s.end(); ++j) {
tp = p;
tp << j.key();
j.value().makePath(tp);
}
}
PIVector<CDType * > CDSection::children(bool recursive) const {
PIVector<CDType * > ret;
PIMap<int, CDType>::const_iterator i;
for (i = cd.begin(); i != cd.end(); ++i)
ret << const_cast<CDType * >(&(i.value()));
if (!recursive) return ret;
PIMap<int, CDSection>::const_iterator j;
for (j = s.constBegin(); j != s.constEnd(); ++j)
ret << j.value().children(true);
return ret;
}
PIVariantTypes::Enum CDSection::enumValues() const {
PIVariantTypes::Enum ret;
PIMap<int, CDType>::const_iterator i;
for (i = cd.constBegin(); i != cd.constEnd(); ++i)
ret << PIVariantTypes::Enumerator(i.key(), i.value().name());
return ret;
}

View File

@@ -1,192 +0,0 @@
/*
CD Utils - Control-Debug utilites
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CDUTILS_TYPES_H
#define CDUTILS_TYPES_H
#include "pistring.h"
#include "pimap.h"
#include "pivariant.h"
class PIIODevice;
class PIEvaluator;
class CD_Pult;
class CDItem;
class CDItemModel;
namespace CDUtils {
class CDSection;
enum UpdateMode {
SaveByIndex = 0x01,
SaveByName = 0x02,
Merge = 0x04
};
enum MessageType {
Log = 1,
MessageBox,
};
typedef PIFlags<UpdateMode> UpdateModeFlags;
class CDType {
friend class CDSection;
friend class CDCore;
friend class Interface;
friend class XInterface;
public:
enum cdT {cdNull, cdK, cdX, cdC, cdM};
enum XMode {X_Current, X_All_Avg};
CDType();
CDType(int i, const PIString & n, const PIString & t, const PIString & v, const PIString & f, const PIString & c, cdT cd_t);
CDType & operator =(double x);
int index() const {return index_;}
PIString name() const {return name_;}
PIString type() const;
PIString value() const;
PIVariant variantValue() const;
PIString formula() const {return formula_;}
PIString comment() const {return comment_;}
double toDouble() const {return value_d;}
int toInt() const {return value_i;}
bool toBool() const {return value_b;}
cdT cd_type() const {return cd_type_;}
void setValue(const PIString & value_);
void setVariantValue(const PIVariant & value_);
void setFormula(const PIString & formula);
void setComment(const PIString & comment) {comment_ = comment;}
operator double() const {return value_d;}
const PIVariantTypes::Enum & enumValues() const {return enum_values;}
void setEnumValues(const PIVariantTypes::Enum & ev) {enum_values = ev;}
const PIString & errorString() const {return error_;}
PIDeque<int> path() const {return path_;}
PIStringList pathString() const;
void setXMode(XMode mode) {mode_ = mode;}
void setAvg(int avg) {avg_size = avg;}
XMode xmode() const {return mode_;}
XMode xmode_rec() const {return rmode_;}
int avg() const {return avg_size;}
bool isSelectedX() const {return x_enabled;}
void readX(PIByteArray & ba);
void writeX(PIByteArray & ba);
PIVector<double> history;
protected:
bool calculate(PIEvaluator * e, PIVector<const CDType * > stack = PIVector<const CDType * >());
PIVariantTypes::Enum parseEnumComment(PIString c);
cdT cd_type_;
int index_;
PIString name_, type_;
PIString value_s, formula_, comment_, error_;
PIVariantTypes::Enum enum_values;
CDSection * parent;
PIDeque<int> path_;
double value_d;
int value_i;
bool value_b, calculated, x_enabled;
PIVector<double> avg_h;
int avg_size;
XMode mode_, rmode_;
};
class CDSection {
friend class CDCore;
friend class Interface;
friend class XInterface;
friend class ::CD_Pult;
friend class ::CDItem;
friend class ::CDItemModel;
public:
CDSection(CDType::cdT type_ = CDType::cdNull);
bool test(int v) {return cd.value(v).toBool();}
// CDType & operator [](int v) {if (!k.contains(v)) k[v].index_ = v; return k[v];}
CDType & operator [](int v) {return cd[v];}
const CDType operator [](int v) const {return cd[v];}
CDType & operator [](const PIString & name_) {return getByName(name_);}
const CDType operator [](const PIString & name_) const {return const_cast<CDSection*>(this)->getByName(name_);}
CDType & operator [](const PIDeque<int> & path_) {return getByPath(path_);}
const CDType operator [](const PIDeque<int> & path_) const {return const_cast<CDSection*>(this)->getByPath(path_);}
CDSection & section(int v);
const CDSection section(int v) const;
bool isEmpty() const {return cd.isEmpty() && s.isEmpty();}
bool exists(PIDeque<int> path) const;
int count(bool recursive = true) const;
int sectionsCount() const;
PIVector<int> indexes() const {return cd.keys();}
PIStringList index_names() const;
void calculate();
void makePath(PIDeque<int> p = PIDeque<int>());
PIVector<CDType * > children(bool recursive = true) const;
PIVariantTypes::Enum enumValues() const;
PIString name;
PIString alias;
protected:
CDSection(PIMap<int, CDType> k_, PIMap<int, CDSection> s_) {
cd = k_;
s = s_;
}
CDType & getByName(const PIString & name_);
CDType & getByPath(const PIDeque<int> & path_);
void write(PIIODevice * d, const PIString & prefix = PIString());
void read(const void * ep);
void update(CDSection & v, UpdateModeFlags mode = SaveByName);
bool isSameStructure(CDSection & v);
void prepareCalculate();
void calculateRecursive(PIEvaluator * e);
void setSelectedX(bool yes);
PIVector<PIDeque<int> > collectX() const;
PIMap<int, CDType> cd;
mutable PIMap<int, CDSection> s;
CDType null;
CDType::cdT cd_type_;
};
}
inline PICout operator <<(PICout s, const CDUtils::CDType & v) {
s.space();
s.setControl(0, true);
switch (v.cd_type()) {
case CDUtils::CDType::cdK : s << "K["; break;
case CDUtils::CDType::cdX : s << "X["; break;
case CDUtils::CDType::cdC : s << "C["; break;
case CDUtils::CDType::cdM : s << "M["; break;
default : s << "Null["; break;
}
s << v.name() << "(" << v.index() << ")] = " << v.value();
s.restoreControl();
return s;
}
#endif // CDUTILS_TYPES_H

View File

@@ -1,55 +0,0 @@
#include "cdutils_x.h"
#include "cdutils_core.h"
using namespace CDUtils;
XInterface X;
XInterface::XInterface(): Interface(CDType::cdX) {
CONNECTU(core, X_ReceivedX, this, receivedX);
}
void XInterface::setEnabled(const CDType & x, bool en) {
core->x_mutex.lock();
CDType & t((*s)[x.path()]);
if (t.cd_type() != CDType::cdX) {
core->x_mutex.unlock();
return;
}
t.x_enabled = en;
//piCout << t << "x_enabled" << en;
core->need_rebuild_x = true;
core->x_mutex.unlock();
}
PIVector<PIDeque<int> > XInterface::enabledList() const {
return CDCore::instance()->x_selected;
}
void XInterface::setEnabledList(const PIVector<PIDeque<int> > & l) {
CDCore::instance()->x_selected = l;
}
void XInterface::lock() {
CDCore::instance()->x_mutex.lock();
}
void XInterface::unlock() {
CDCore::instance()->x_mutex.unlock();
}
void XInterface::start(double freq) {
core->startX(freq);
}
void XInterface::stop() {
core->stopX();
}

View File

@@ -1,56 +0,0 @@
/*
CD Utils - Control-Debug utilites
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CDUTILS_X_H
#define CDUTILS_X_H
#include "cdutils_interface.h"
namespace CDUtils {
class XInterface: public Interface
{
PIOBJECT_SUBCLASS(XInterface, Interface)
public:
XInterface();
EVENT1(keepNamesRequest, bool*, xn)
EVENT1(receivedX, PIVector<PIDeque<int> >, pathes)
void enable(const CDType & x) {setEnabled(x, true);}
void disable(const CDType & x) {setEnabled(x, false);}
void setEnabled(const CDType & x, bool en);
void setDisabled(const CDType & x, bool dis) {setEnabled(x, !dis);}
PIVector<PIDeque<int> > enabledList() const;
void setEnabledList(const PIVector<PIDeque<int> > & l);
void lock();
void unlock();
void start(double freq = 20.);
void stop();
};
}
extern CDUtils::XInterface X;
#endif // CDUTILS_X_H

View File

@@ -1,97 +0,0 @@
#include "cdutils_k.h"
#include "cdutils_x.h"
#include "cdutils_c.h"
#include "cdutils_m.h"
#include "cdutils_core.h"
#include "cdtest.h"
#include "pip.h"
#include "k_description.h"
using namespace CDUtils;
class Core : public PIObject
{
PIOBJECT(Core)
public:
Core() {
CDCore::instance()->initApp();
// piCout << "testCore";
CONNECTU(&timer, tickEvent, this, timerDone);
CONNECTU(&X, received, this, xrecv);
CONNECTU(&C, received, this, crecv);
t = 0.;
}
void load() {
rf.open("k.dat", PIIODevice::ReadWrite);
K.read(&rf);
rf.close();
}
void save() {
rf.open("k_out.txt", PIIODevice::ReadWrite);
rf.resize(0);
K.write(&rf);
rf.close();
// rf.open("k_out.txt", PIIODevice::ReadWrite);
// K.read(&rf);
// rf.close();
// rf.open("k_out2.txt", PIIODevice::ReadWrite);
// rf.resize(0);
// K.write(&rf);
// rf.close();
// rf.open("k_out2.txt", PIIODevice::ReadWrite);
// K.read(&rf);
// rf.close();
// rf.open("k_out3.txt", PIIODevice::ReadWrite);
// rf.resize(0);
// K.write(&rf);
// rf.close();
}
void test() {
X.lock();
X[KD::Frequency] = 100;
X.section(KD::Spectrometer)[KD::Temperature_default] = sin(t);
t += 0.01;
X.unlock();
/*piCout << "count" << K.count();
piCout << K[First];
piCout << K[Second];*/
}
EVENT_HANDLER(void, ksend) {piCout << "sended k";}
EVENT_HANDLER(void, crecv) {
piCout << "received c";
C.connect(C.section(KD::Logs).section(KD::Spec).section(KD::Formats)[KD::Binary], this, HANDLER(cmd));
C.autoConnect(this);
}
EVENT_HANDLER(void, xrecv) {
piCout << "received x";
if (!timer.isRunning()) timer.start(10);
X.start();
}
EVENT_HANDLER(void, timerDone) {test();}
EVENT_HANDLER(void, cmd) {piCout << "command cmd";}
EVENT_HANDLER(void, c_Pause) {
piCout << "command pause";
M[KD::Main] << "rec command" << C[KD::Pause];
M.messageBox(M.root()[KD::Core], "init successfull");
}
EVENT_HANDLER(void, c_Spectrometer_Connection) {piCout << "command spec_conn";}
private:
PIFile rf;
PITimer timer;
double t;
};
int main(int argc, char *argv[]) {
X.start();
piSleep(1);
//CDCore::instance()->destroy();
piCout << "DELETED";
return 0;
}

View File

@@ -1,147 +0,0 @@
#ifndef K_DESCRIPTION_H
#define K_DESCRIPTION_H
namespace KD {
enum Sections {
Startup,
Spectrometer,
Switch,
Formats,
Logs,
Detector,
CoreOutput,
};
enum LogFormat {
Text, //b text
Binary, //b binary
};
enum LogType {
Data, //b write data logs
Spec, //b write spectrogram logs
ARINC, //b ARINC
};
enum KLogConfig {
// LogFormat = Formats
StartupWrite, //b
ApplyBinaryLogHeader, //b Apply settings under ID = 255 for binary log
MaximumWriteFrequency, //f Maximum frequency for log in Hz, or 0 for unlimited
};
enum SwitchType {
BaySpec,
DiCon,
};
enum SpectrometerConnection {
TCP,
USB,
};
enum PeakSearchMode {
Left,
Max,
Right,
};
enum CoreMode {
ModeSpectrometer,
ModePlayer,
ModePeaks,
};
enum KSpectrometer {
Connection, //e ${SpectrometerConnection}
Temperature_compensation, //b Use temperature sensor or default temperature witout compensation
Temperature_default, //f Default temperature using if compensation disabled
};
enum KSwitch {
Enabled, //b 0 or 1 Use optical switch or not
Wait, //n Delay after switching channel, ms
Autoscan, //e {0 - scan with our forces, 1 - SDK autoscan}
Autoscan_offset, //n Offset for SDK autoscan
Type, //e ${SwitchType}
};
enum KDetector {
Threshold_Min, //f
Threshold_Max, //f
SideSize, //f
SideOffset, //f
PeaksSearch, //e ${PeakSearchMode}
};
enum KCoreOutput {
SendSpectrum, //b Send spectrum data or empty vector
SendOnlyCurrentValue, //b Send current values or all stored in 20Hz
};
enum CoreOutputChannel {
GUI,
SecGUI,
ThirdGUI,
};
enum KDescription {
// KSpectrometer = Spectrometer
// KSwitch = Switch
// KDetector = Detector
// KCoreOutput[CoreOutputChannel] = CoreOutput
// KLogConfig[LogType] = Logs
Gratings_history, //n Gratings peak values history, count
Amplitude_history_size, //n Count of history values to calculate sensors amplitude
Fourier_enabled, //b Global fourier enable flag
Fourier_size, //n Size of fourier window, in counts
Fourier_YScale, //f scale for fourier amplitude
Fourier_Max_or_Density, //n 0 - Maximum in fourier window, 1 - Density of fourier window
Mode, //e ${CoreMode} Work mode
SynchronizationEnabled, //b When enabled, start logs and reset time when sync signal received
SynchronizationMode, //e {0 - disabled, 1 - new file, 2 - column in log}
LambdasAutoReset, //b Set lambdas_0 to grating values on first data receive
Gauss_size, //n
//Peak_max_offset, //f in pixels
//Peak_LF_coeff, //f 1. - no filtering
GratingOverloadMax, //n
GratingOverloadMin, //n
SendLED, //b Send to LED Arduino serial port current state
SynchronizationClearValues, //b clear gratings and sensors values and history on sync
PeaksModeFrequency, //f
PeaksModeAdditionNm_1, //f Addition nm to peaks in ModePeaks, channel 1
PeaksModeAdditionNm_2, //f Addition nm to peaks in ModePeaks, channel 2
PeaksModeAdditionNm_3, //f Addition nm to peaks in ModePeaks, channel 3
PeaksModeAdditionNm_4, //f Addition nm to peaks in ModePeaks, channel 4
};
enum XDescription {
// KSpectrometer = Spectrometer
// KSwitch = Switch
// KDetector = Detector
// KCoreOutput[CoreOutputChannel] = CoreOutput
// KLogConfig[LogType] = Logs
State, //b
Frequency, //n cur freq
//Fourier_enabled, //b Global fourier enable flag
};
enum CDescription {
// KSpectrometer = Spectrometer
// KCoreOutput[CoreOutputChannel] = CoreOutput
// KLogConfig[LogType] = Logs
Halt, //b
Reboot, //n cur freq
Pause, //b Global fourier enable flag
};
enum MDescription {
Main, //b
Core, //s
Warnings, //b Global fourier enable flag
};
}
#endif // K_DESCRIPTION_H

View File

@@ -96,6 +96,20 @@ foreach(_Q ${_QAD_LIBS})
#message(STATUS "Library qad_${_Q}5 (${_QU}) -> ${QAD5_${_QU}_LIBRARY} found in ${_SEARCH_DIR}") #message(STATUS "Library qad_${_Q}5 (${_QU}) -> ${QAD5_${_QU}_LIBRARY} found in ${_SEARCH_DIR}")
list(APPEND QT_MULTILIB_LIST qad_${_Q}) list(APPEND QT_MULTILIB_LIST qad_${_Q})
endforeach() endforeach()
set(_PIQT_LIBS piqt piqt_utils)
foreach(_Q ${_PIQT_LIBS})
foreach(_v ${_QT_VERSIONS_})
set(MULTILIB_${_Q}_SUFFIX_Qt${_v} ${_v})
if(hasParent)
set(MULTILIB_${_Q}_SUFFIX_Qt${_v} ${_v} PARENT_SCOPE)
endif()
#message(STATUS "MULTILIB_${_Q}_SUFFIX_Qt${_v} = ${_v}")
endforeach()
#message(STATUS "Library ${_Q}5 (${_QU}) -> ${QAD5_${_QU}_LIBRARY} found in ${_SEARCH_DIR}")
list(APPEND QT_MULTILIB_LIST ${_Q})
endforeach()
foreach(_Q ${_QAD_LIBS}) foreach(_Q ${_QAD_LIBS})
string(TOUPPER ${_Q} _QU) string(TOUPPER ${_Q} _QU)
set(_target QAD::${_ITN_${_Q}}) set(_target QAD::${_ITN_${_Q}})

90
cmake/QADMacros.cmake Normal file
View File

@@ -0,0 +1,90 @@
macro(_qt_install _TARGET IS_APP _DIR _HDR_VAR _QM_FILES)
sdk_install("${_DIR}" ${IS_APP} "${_TARGET}" "${${_HDR_VAR}}" "${_QM_FILES}")
endmacro()
macro(_qt_plugin NAME _MODULES _LIBS)
if (NOT STATIC_LIB)
if(DESIGNER_PLUGINS)
set(PROJ_NAME ${NAME}_plugin)
include_directories("..")
add_definitions(-DQT_PLUGIN)
add_definitions(-DQT_NO_DEBUG)
add_definitions(-DQT_SHARED)
add_definitions(-DQDESIGNER_EXPORT_WIDGETS)
find_qt(${QtVersions} Core Designer ${_MODULES})
qt_sources(SRC)
qt_wrap(${SRC} CPPS out_CPP QMS out_QM)
qt_add_library(${PROJ_NAME} SHARED out_CPP)
qt_target_link_libraries(${PROJ_NAME} ${_LIBS} ${_${NAME}_PLUGIN_LIBS})
if (WIN32)
qt_install(TARGETS ${PROJ_NAME} RUNTIME DESTINATION QtPlugins/designer)
else()
qt_install(TARGETS ${PROJ_NAME} DESTINATION QtPlugins/designer)
endif()
list(APPEND _qt_plugs ${NAME})
copy_to_parent("")
endif()
endif()
endmacro()
macro(_qt_project NAME IS_APP DOMAIN _MODULES _LIBS)
set(PROJ_NAME ${NAME})
find_qt(${QtVersions} Core ${_MODULES})
qt_sources(SRC)
import_version(${PROJ_NAME} ${DOMAIN})
import_deploy_properties(${PROJ_NAME} ${DOMAIN})
if (${IS_APP})
list(APPEND _qt_apps ${PROJ_NAME})
set_deploy_property(${PROJ_NAME}
LABEL ${PROJ_NAME}
FULLNAME "${_${DOMAIN}_DOMAIN}.${PROJ_NAME}"
INFO "${APP_INFO}"
ICON "${APP_ICON}")
else()
list(APPEND _qt_libs ${PROJ_NAME})
set_deploy_property(${PROJ_NAME} SHARED
LABEL ${PROJ_NAME}
FULLNAME "${_${DOMAIN}_DOMAIN}.${PROJ_NAME}"
INFO "${DOMAIN} ${NAME} library")
endif()
make_rc(${PROJ_NAME} out_RC)
qt_wrap(${SRC} HDRS out_HDR CPPS out_CPP QMS out_QM ${out_RC})
if (${IS_APP})
qt_add_executable(${PROJ_NAME} WIN32 out_CPP ${${DOMAIN}_EXPORT_HEADER} ${ARGN})
else()
qt_add_library(${PROJ_NAME} ${${DOMAIN}_LIB_TYPE} out_CPP ${${DOMAIN}_EXPORT_HEADER} ${ARGN})
if(NOT STATIC_LIB)
qt_target_compile_definitions(${PROJ_NAME} PRIVATE ${DOMAIN}_SHARED_DEFINE)
endif()
qt_generate_export_header(${PROJ_NAME})
list(APPEND out_HDR "${CMAKE_CURRENT_BINARY_DIR}/${PROJ_NAME}_export.h")
endif()
qt_target_link_libraries(${PROJ_NAME} ${_LIBS})
list(APPEND QT_MULTILIB_LIST ${PROJ_NAME})
#message(STATUS "Building ${PROJ_NAME}")
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/plugin")
set(_${NAME}_PLUGIN_LIBS "${_LIBS}")
add_subdirectory(plugin)
endif()
copy_to_parent("")
endmacro()
macro(qad_library NAME _MODULES _LIBS)
_qt_project(qad_${NAME} FALSE "QAD" "${_MODULES}" "${_LIBS}")
_qt_install(qad_${NAME} FALSE "qad" "out_HDR" "out_QM")
endmacro()
macro(qad_application NAME _MODULES _LIBS)
_qt_project(${NAME} TRUE "QAD" "${_MODULES}" "${_LIBS}")
_qt_install(${NAME} TRUE "qad" "" "out_QM")
endmacro()
macro(qad_plugin NAME _MODULES _LIBS)
_qt_plugin(qad_${NAME} "${_MODULES}" "qad_${NAME};${_LIBS}")
endmacro()

View File

@@ -1,744 +1,811 @@
#[[ #[[
find_qt([<Module1> <Module2> ...] [Qt4] [Qt5]) find_qt([<Module1> <Module2> ...] [Qt4] [Qt5])
Find Qt4 or/and Qt5 packages Find Qt4 or/and Qt5 packages
If Qt4/5 found, set If Qt4/5 found, set
* Qt<4/5>_ROOT var to Qt root dir * Qt<4/5>_ROOT var to Qt root dir
* Qt<4/5>_BIN var to Qt binary dir * Qt<4/5>_BIN var to Qt binary dir
* Qt<4/5>_PLUGINS_DIR var to Qt plugins dir * Qt<4/5>_PLUGINS_DIR var to Qt plugins dir
* Qt<4/5>_LANG_DIR var to Qt translations dir * Qt<4/5>_LANG_DIR var to Qt translations dir
qt_sources(<src_out_var> [NO_DEFAULT] [DIR <dir>] [<regexp> ...]) qt_sources(<src_out_var> [NO_DEFAULT] [DIR <dir>] [<regexp> ...])
Collect all sources, optionally in directory <dir> and Collect all sources, optionally in directory <dir> and
Additional filters <regexp>. By default filter files with regexps Additional filters <regexp>. By default filter files with regexps
"*.h", "*.hpp", "*.c", "*.cpp", "*.ui", "*.qrc", "*.rc", "*.ts" and "lang/*.ts". "*.h", "*.hpp", "*.c", "*.cpp", "*.ui", "*.qrc", "*.rc", "*.ts" and "lang/*.ts".
Default filters disabled with option NO_DEFAULT Default filters disabled with option NO_DEFAULT
qt_wrap(<file0> <file1> ... [HDRS <hrd_var>] [CPPS <cpp_var>] [QMS <qm_var>]) qt_wrap(<file0> <file1> ... [HDRS <hrd_var>] [CPPS <cpp_var>] [QMS <qm_var>])
Prepare sources for compile Prepare sources for compile
Store headers to <hrd_var>, all wrapped Qt4 files to <cpp_var>_Qt4 and Qt5 files to <cpp_var>_Qt5 Store headers to <hrd_var>, all wrapped Qt4 files to <cpp_var>_Qt4 and Qt5 files to <cpp_var>_Qt5
version are automatic detected after find_qt() call version are automatic detected after find_qt() call
qt_add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...]) qt_add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
Add executables for founded Qt versions, target names is <name><TARGET_SUFFIX_Qt?> Add executables for founded Qt versions, target names is <name><TARGET_SUFFIX_Qt?>
All needed Qt includes automatic added to corresponding targets All needed Qt includes automatic added to corresponding targets
<source> cant be CPPS variable passed to qt_wrap() or some list or filename <source> cant be CPPS variable passed to qt_wrap() or some list or filename
qt_add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...]) qt_add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
Add library for founded Qt versions, target names is <name><TARGET_SUFFIX_Qt?> Add library for founded Qt versions, target names is <name><TARGET_SUFFIX_Qt?>
All needed Qt includes automatic added to corresponding targets All needed Qt includes automatic added to corresponding targets
<source> cant be CPPS variable passed to qt_wrap() or some list or filename <source> cant be CPPS variable passed to qt_wrap() or some list or filename
qt_target_link_libraries(<name> ... <item> ...) qt_target_link_libraries(<name> ... <item> ...)
Link targets for founded Qt versions, target names is <name><TARGET_SUFFIX_Qt?> Link targets for founded Qt versions, target names is <name><TARGET_SUFFIX_Qt?>
All needed Qt libraries automatic added to corresponding targets All needed Qt libraries automatic added to corresponding targets
if QT_MULTILIB_LIST contains some linking library, to it name automatic if QT_MULTILIB_LIST contains some linking library, to it name automatic
add <MULTILIB_SUFFIX_Qt?> or individual <MULTILIB_>libname<_SUFFIX_Qt?> add <MULTILIB_SUFFIX_Qt?> or individual <MULTILIB_>libname<_SUFFIX_Qt?>
qt_target_compile_definitions(<name> ...) qt_target_compile_definitions(<name> ...)
Syntax similar to original "target_compile_definitions()" Syntax similar to original "target_compile_definitions()"
Specify compile definitions to use when compiling a given <name> Specify compile definitions to use when compiling a given <name>
qt_target_include_directories(<name> ...) qt_target_include_directories(<name> ...)
Syntax similar to original "target_include_directories()" Syntax similar to original "target_include_directories()"
Add include directories to a target Add include directories to a target
qt_install(...) qt_install(...)
Syntax similar to original "install()" Syntax similar to original "install()"
Install targets for founded Qt versions Install targets for founded Qt versions
if DESTINATION set to "QtBin" files will be installed if DESTINATION set to "QtBin" files will be installed
to corresponding Qt binary directory to corresponding Qt binary directory
if DESTINATION set to "QtLang" files will be installed if DESTINATION set to "QtLang" files will be installed
to corresponding Qt translation directory to corresponding Qt translation directory
if DESTINATION starts with "QtPlugins" files will be installed if DESTINATION starts with "QtPlugins" files will be installed
to corresponding Qt plugins directory to corresponding Qt plugins directory
Add LANG type for first argument - in this case you should Add LANG type for first argument - in this case you should
specify variable name, not variable value! specify variable name, not variable value!
e.g. "qt_install(LANG my_QM DESTINATION QtLang)" e.g. "qt_install(LANG my_QM DESTINATION QtLang)"
qt_install_lang(<name> DESTINATION <dir> [PATHS <path0> [<path1>] [...] ]) qt_install_lang(<name> DESTINATION <dir> [PATHS <path0> [<path1>] [...] ])
Search Qt translations for all <name> dependencies Search Qt translations for all <name> dependencies
in Qt<?>_LANG_DIR for <name>_LANG languages in Qt<?>_LANG_DIR for <name>_LANG languages
and install them to <dir>. PATH are additional search paths. and install them to <dir>. PATH are additional search paths.
You should use "set_lang()" macro before this action You should use "set_lang()" macro before this action
]]
cmake_policy(SET CMP0011 NEW) # don`t affect includer policies qt_get_target(<name> <var> [Qt4 | Qt5])
cmake_policy(SET CMP0020 NEW) # Automatically link Qt executables to qtmain target on Windows
if (POLICY CMP0057) Write real <name> Qt target name to <var>
cmake_policy(SET CMP0057 NEW) # Support if() IN_LIST If Qt4 or Qt5 specified, search for this version,
endif() otherwise returns greatest version
if (POLICY CMP0074)
cmake_policy(SET CMP0074 OLD) # ignore <PackageName>_ROOT variables
endif()
set(__qt_bug_modules "UiTools")
qt_get_targets(<name> <var>)
set(_QT_VERSIONS_ 4 5) Write all real <name> Qt target names to <var>
foreach(_v ${_QT_VERSIONS_})
if (NOT DEFINED TARGET_SUFFIX_Qt${_v})
set(TARGET_SUFFIX_Qt${_v} "${_v}")
set(MULTILIB_SUFFIX_Qt${_v} "${_v}")
endif() qt_generate_export_header(<name> ...)
set(MOC_INC_Qt${_v})
endforeach() Call generate_export_header on Qt multitarget
if (NOT DEFINED QT_MULTILIB_LIST)
set(QT_MULTILIB_LIST)
endif() ]]
#set(TARGET_SUFFIX_Qt4 "")
cmake_policy(SET CMP0011 NEW) # don`t affect includer policies
macro(find_qt) cmake_policy(SET CMP0020 NEW) # Automatically link Qt executables to qtmain target on Windows
set(_QCOMP) if (POLICY CMP0057)
foreach(_v ${_QT_VERSIONS_}) cmake_policy(SET CMP0057 NEW) # Support if() IN_LIST
set(_NEED${_v} 0) endif()
set(LOCAL_FOUND${_v} 0) if (POLICY CMP0074)
set(MOC_INC_Qt${_v}) cmake_policy(SET CMP0074 OLD) # ignore <PackageName>_ROOT variables
set(Qt${_v}_INCLUDES) endif()
set(Qt${_v}_LIBRARIES) set(__qt_bug_modules "UiTools")
set(Qt${_v}_ROOT)
set(Qt${_v}_BIN)
set(Qt${_v}_PLUGINS_DIR) set(_QT_VERSIONS_ 4 5)
set(Qt${_v}_LANG_DIR) foreach(_v ${_QT_VERSIONS_})
endforeach() if (NOT DEFINED TARGET_SUFFIX_Qt${_v})
set(_NEED_SOME 0) set(TARGET_SUFFIX_Qt${_v} "${_v}")
set(_QUIET) set(MULTILIB_SUFFIX_Qt${_v} "${_v}")
foreach(_i ${ARGN}) endif()
set(_FOUND_NEED 0) set(MOC_INC_Qt${_v})
foreach(_v ${_QT_VERSIONS_}) endforeach()
if ("x${_i}" STREQUAL "xQt${_v}") if (NOT DEFINED QT_MULTILIB_LIST)
set(_NEED${_v} 1) set(QT_MULTILIB_LIST)
set(_NEED_SOME 1) endif()
set(_FOUND_NEED 1) #set(TARGET_SUFFIX_Qt4 "")
endif()
if ("x${_i}" STREQUAL "xQUIET")
set(_QUIET QUIET) macro(find_qt)
endif() set(_QCOMP)
endforeach() foreach(_v ${_QT_VERSIONS_})
if (NOT _FOUND_NEED) set(_NEED${_v} 0)
list(APPEND _QCOMP "${_i}") set(LOCAL_FOUND${_v} 0)
endif() set(MOC_INC_Qt${_v})
endforeach() set(Qt${_v}_INCLUDES)
if (NOT _NEED_SOME) set(Qt${_v}_LIBRARIES)
foreach(_v ${_QT_VERSIONS_}) set(Qt${_v}_ROOT)
set(_NEED${_v} 1) set(Qt${_v}_BIN)
endforeach() set(Qt${_v}_PLUGINS_DIR)
endif() set(Qt${_v}_LANG_DIR)
list(REMOVE_DUPLICATES _QCOMP) endforeach()
if (_NEED4) set(_NEED_SOME 0)
find_package(Qt4 ${_QUIET}) set(_QUIET)
if (Qt4_FOUND) foreach(_i ${ARGN})
set(LOCAL_FOUND4 1) set(_FOUND_NEED 0)
get_filename_component(Qt4_BIN ${QT_QMAKE_EXECUTABLE} PATH) foreach(_v ${_QT_VERSIONS_})
set(Qt4_INCLUDES ${QT_INCLUDES}) if ("x${_i}" STREQUAL "xQt${_v}")
foreach(m ${_QCOMP}) set(_NEED${_v} 1)
string(TOUPPER "${m}" _um) set(_NEED_SOME 1)
#message("${QT_QT${_um}_FOUND}") set(_FOUND_NEED 1)
if (${QT_QT${_um}_FOUND}) endif()
list(APPEND Qt4_LIBRARIES ${QT_QT${_um}_LIBRARY}) if ("x${_i}" STREQUAL "xQUIET")
endif() set(_QUIET QUIET)
endforeach() endif()
set(Qt4_PLUGINS_DIR ${QT_PLUGINS_DIR}) endforeach()
set(Qt4_LANG_DIR ${Qt4_BIN}/../translations) if (NOT _FOUND_NEED)
set(Qt4_ROOT "${Qt4_BIN}/../") list(APPEND _QCOMP "${_i}")
endif() endif()
endif() endforeach()
if (_NEED5) if (NOT _NEED_SOME)
#set(_MSG 1) foreach(_v ${_QT_VERSIONS_})
#if (Qt5_FOUND) set(_NEED${_v} 1)
# set(_MSG 0) endforeach()
#endif() endif()
find_package(Qt5 COMPONENTS Core LinguistTools UiPlugin Widgets ${_QCOMP} ${_QUIET}) list(REMOVE_DUPLICATES _QCOMP)
if (DEFINED ANDROID_PLATFORM) if (_NEED4)
set(CMAKE_SHARED_MODULE_SUFFIX_CXX ".so") find_package(Qt4 ${_QUIET})
set(CMAKE_SHARED_LIBRARY_SUFFIX_CXX ".so") if (Qt4_FOUND)
set(CMAKE_SHARED_MODULE_SUFFIX_C ".so") set(LOCAL_FOUND4 1)
set(CMAKE_SHARED_LIBRARY_SUFFIX_C ".so") get_filename_component(Qt4_BIN ${QT_QMAKE_EXECUTABLE} PATH)
endif() set(Qt4_INCLUDES ${QT_INCLUDES})
if (Qt5_FOUND) foreach(m ${_QCOMP})
set(LOCAL_FOUND5 1) string(TOUPPER "${m}" _um)
set(_Qt5Modules) #message("${QT_QT${_um}_FOUND}")
foreach(m ${_QCOMP}) if (${QT_QT${_um}_FOUND})
if (${Qt5${m}_FOUND}) list(APPEND Qt4_LIBRARIES ${QT_QT${_um}_LIBRARY})
set(__lib ${Qt5${m}_LIBRARIES}) endif()
if (DEFINED ANDROID_PLATFORM) endforeach()
if (m IN_LIST __qt_bug_modules) set(Qt4_PLUGINS_DIR ${QT_PLUGINS_DIR})
get_target_property(__lib Qt5::${m} LOCATION) set(Qt4_LANG_DIR ${Qt4_BIN}/../translations)
endif() set(Qt4_ROOT "${Qt4_BIN}/../")
endif() endif()
list(APPEND _Qt5Modules ${m}) endif()
list(APPEND Qt5_INCLUDES ${Qt5${m}_INCLUDE_DIRS}) if (_NEED5)
list(APPEND Qt5_LIBRARIES ${__lib}) #set(_MSG 1)
endif() #if (Qt5_FOUND)
endforeach() # set(_MSG 0)
#get_property(_up_dir TARGET Qt5::UiPlugin PROPERTY INTERFACE_INCLUDE_DIRECTORIES) #endif()
#message("${_up_dir}") find_package(Qt5 COMPONENTS Core LinguistTools UiPlugin Widgets ${_QCOMP} ${_QUIET})
#if (NOT "x${_up_dir}" STREQUAL "x") if (DEFINED ANDROID_PLATFORM)
# list(APPEND Qt5_INCLUDES ${_up_dir}) set(CMAKE_SHARED_MODULE_SUFFIX_CXX ".so")
#endif() set(CMAKE_SHARED_LIBRARY_SUFFIX_CXX ".so")
get_target_property(_Qt5_qmake Qt5::qmake LOCATION) set(CMAKE_SHARED_MODULE_SUFFIX_C ".so")
get_filename_component(Qt5_BIN ${_Qt5_qmake} PATH) set(CMAKE_SHARED_LIBRARY_SUFFIX_C ".so")
foreach(_p ${Qt5Gui_PLUGINS}) endif()
get_target_property(_l ${_p} LOCATION) if (Qt5_FOUND)
get_filename_component(_l ${_l} DIRECTORY) set(LOCAL_FOUND5 1)
string(FIND "${_l}" "/" _ind REVERSE) set(_Qt5Modules)
string(SUBSTRING "${_l}" 0 ${_ind} _l) foreach(m ${_QCOMP})
set(Qt5_PLUGINS_DIR ${_l}) if (${Qt5${m}_FOUND})
#message("Qt5: plugins dir: ${Qt5_PLUGINS_DIR}") set(__lib ${Qt5${m}_LIBRARIES})
break() if (DEFINED ANDROID_PLATFORM)
endforeach() if (m IN_LIST __qt_bug_modules)
string(FIND "${Qt5_BIN}" "/" _ind REVERSE) get_target_property(__lib Qt5::${m} LOCATION)
string(SUBSTRING "${Qt5_BIN}" 0 ${_ind} Qt5_ROOT) endif()
if ("x${Qt5_PLUGINS_DIR}" STREQUAL "x") endif()
set(Qt5_PLUGINS_DIR "${Qt5_ROOT}/plugins") list(APPEND _Qt5Modules ${m})
endif() list(APPEND Qt5_INCLUDES ${Qt5${m}_INCLUDE_DIRS})
if (APPLE) list(APPEND Qt5_LIBRARIES ${__lib})
list(APPEND MOC_INC_Qt5 "-F${Qt5_ROOT}/lib") endif()
endif() endforeach()
set(Qt5_LANG_DIR ${Qt5_BIN}/../translations) #get_property(_up_dir TARGET Qt5::UiPlugin PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
if (NOT _QT5_MSG) #message("${_up_dir}")
message(STATUS "Found Qt5: ${_Qt5_qmake} (version \"${Qt5_VERSION}\")") #if (NOT "x${_up_dir}" STREQUAL "x")
set(_QT5_MSG 1 CACHE BOOL "msg_qt5" FORCE) # list(APPEND Qt5_INCLUDES ${_up_dir})
#message(STATUS "Found Qt5 modules: ${_Qt5Modules}") #endif()
endif() get_target_property(_Qt5_qmake Qt5::qmake LOCATION)
endif() get_filename_component(Qt5_BIN ${_Qt5_qmake} PATH)
endif() foreach(_p ${Qt5Gui_PLUGINS})
foreach(_v ${_QT_VERSIONS_}) get_target_property(_l ${_p} LOCATION)
if (LOCAL_FOUND${_v}) get_filename_component(_l ${_l} DIRECTORY)
foreach(_p ${Qt${_v}_INCLUDES}) string(FIND "${_l}" "/" _ind REVERSE)
list(APPEND MOC_INC_Qt${_v} "-I${_p}") string(SUBSTRING "${_l}" 0 ${_ind} _l)
#message("${_p}") set(Qt5_PLUGINS_DIR ${_l})
endforeach() #message("Qt5: plugins dir: ${Qt5_PLUGINS_DIR}")
endif() break()
#message("${MOC_INC_Qt${_v}}") endforeach()
endforeach() string(FIND "${Qt5_BIN}" "/" _ind REVERSE)
string(SUBSTRING "${Qt5_BIN}" 0 ${_ind} Qt5_ROOT)
endmacro() if ("x${Qt5_PLUGINS_DIR}" STREQUAL "x")
set(Qt5_PLUGINS_DIR "${Qt5_ROOT}/plugins")
endif()
macro(qt_sources OUT) if (APPLE)
set(${OUT}) list(APPEND MOC_INC_Qt5 "-F${Qt5_ROOT}/lib")
set(_DIR "") endif()
set(_IS_DIR 0) set(Qt5_LANG_DIR ${Qt5_BIN}/../translations)
set(_NO_DEFAULT 0) if (NOT _QT5_MSG)
set(_DEFAULT) message(STATUS "Found Qt5: ${_Qt5_qmake} (version \"${Qt5_VERSION}\")")
set(_REGEXP) set(_QT5_MSG 1 CACHE BOOL "msg_qt5" FORCE)
set(_REGEXP_WD) #message(STATUS "Found Qt5 modules: ${_Qt5Modules}")
foreach(_i ${ARGN}) endif()
if (_IS_DIR) endif()
set(_DIR "${_i}") endif()
set(_IS_DIR 0) foreach(_v ${_QT_VERSIONS_})
elseif ("x${_i}" STREQUAL "xDIR") if (LOCAL_FOUND${_v})
set(_IS_DIR 1) foreach(_p ${Qt${_v}_INCLUDES})
elseif ("x${_i}" STREQUAL "xNO_DEFAULT") list(APPEND MOC_INC_Qt${_v} "-I${_p}")
set(_NO_DEFAULT 1) #message("${_p}")
else() endforeach()
list(APPEND _REGEXP ${_i}) endif()
endif() #message("${MOC_INC_Qt${_v}}")
endforeach() endforeach()
if (NOT "x${_DIR}" STREQUAL "x")
#file(TO_CMAKE_PATH "${_DIR}//" _DIR) endmacro()
string(REPLACE "\\" "/" _DIR "${_DIR}/")
string(REPLACE "//" "/" _DIR "${_DIR}")
endif() macro(qt_sources OUT)
foreach(_i ${_REGEXP}) set(${OUT})
list(APPEND _REGEXP_WD "${_DIR}${_i}") set(_DIR "")
endforeach() set(_IS_DIR 0)
if (NOT _NO_DEFAULT) set(_NO_DEFAULT 0)
set(_DEFAULT "${_DIR}*.h" "${_DIR}*.hpp" "${_DIR}*.c" "${_DIR}*.cpp" "${_DIR}*.ui" "${_DIR}*.qrc" "${_DIR}*.rc" "${_DIR}*.ts" "${_DIR}lang/*.ts") set(_DEFAULT)
endif() set(_REGEXP)
#message("${_DEFAULT}, ${_REGEXP_WD}") set(_REGEXP_WD)
file(GLOB ${OUT} ${_DEFAULT} ${_REGEXP_WD}) foreach(_i ${ARGN})
endmacro() if (_IS_DIR)
set(_DIR "${_i}")
set(_IS_DIR 0)
macro(qt_wrap) elseif ("x${_i}" STREQUAL "xDIR")
set(HDR_VAR) set(_IS_DIR 1)
set(CPP_VAR) elseif ("x${_i}" STREQUAL "xNO_DEFAULT")
set(QM_VAR) set(_NO_DEFAULT 1)
set(_HDR_ARG 0) else()
set(_CPP_ARG 0) list(APPEND _REGEXP ${_i})
set(_QM_ARG 0) endif()
set(WAS_HDR_ARG 0) endforeach()
set(WAS_CPP_ARG 0) if (NOT "x${_DIR}" STREQUAL "x")
set(WAS_QM_ARG 0) #file(TO_CMAKE_PATH "${_DIR}//" _DIR)
set(FILE_LIST) string(REPLACE "\\" "/" _DIR "${_DIR}/")
foreach(_i ${ARGN}) string(REPLACE "//" "/" _DIR "${_DIR}")
if (_HDR_ARG) endif()
set(HDR_VAR ${_i}) foreach(_i ${_REGEXP})
set(WAS_HDR_ARG 1) list(APPEND _REGEXP_WD "${_DIR}${_i}")
set(_HDR_ARG 0) endforeach()
elseif (_CPP_ARG) if (NOT _NO_DEFAULT)
set(CPP_VAR ${_i}) set(_DEFAULT "${_DIR}*.h" "${_DIR}*.hpp" "${_DIR}*.c" "${_DIR}*.cpp" "${_DIR}*.ui" "${_DIR}*.qrc" "${_DIR}*.rc" "${_DIR}*.ts" "${_DIR}lang/*.ts")
set(WAS_CPP_ARG 1) endif()
set(_CPP_ARG 0) #message("${_DEFAULT}, ${_REGEXP_WD}")
elseif (_QM_ARG) file(GLOB ${OUT} ${_DEFAULT} ${_REGEXP_WD})
set(QM_VAR ${_i}) endmacro()
set(WAS_QM_ARG 1)
set(_QM_ARG 0)
elseif ("x${_i}" STREQUAL "xHDRS") macro(qt_wrap)
set(_HDR_ARG 1) set(HDR_VAR)
elseif ("x${_i}" STREQUAL "xCPPS") set(CPP_VAR)
set(_CPP_ARG 1) set(QM_VAR)
elseif ("x${_i}" STREQUAL "xQMS") set(_HDR_ARG 0)
set(_QM_ARG 1) set(_CPP_ARG 0)
else() set(_QM_ARG 0)
list(APPEND FILE_LIST "${_i}") set(WAS_HDR_ARG 0)
endif() set(WAS_CPP_ARG 0)
endforeach() set(WAS_QM_ARG 0)
foreach(_v ${_QT_VERSIONS_}) set(FILE_LIST)
set(CPP${_v}_VAR) foreach(_i ${ARGN})
set(QM${_v}_VAR) if (_HDR_ARG)
if (LOCAL_FOUND${_v}) set(HDR_VAR ${_i})
if (WAS_CPP_ARG) set(WAS_HDR_ARG 1)
set(CPP${_v}_VAR ${CPP_VAR}_Qt${_v}) set(_HDR_ARG 0)
endif() elseif (_CPP_ARG)
if (WAS_QM_ARG) set(CPP_VAR ${_i})
set(QM${_v}_VAR ${QM_VAR}_Qt${_v}) set(WAS_CPP_ARG 1)
endif() set(_CPP_ARG 0)
endif() elseif (_QM_ARG)
endforeach() set(QM_VAR ${_i})
#message("found 4: ${LOCAL_FOUND4}, 5: ${LOCAL_FOUND5}") set(WAS_QM_ARG 1)
#message("has HRDS: ${WAS_HDR_ARG}: ${HDR_VAR}") set(_QM_ARG 0)
#message("has CPPS4: ${WAS_CPP_ARG}: ${CPP4_VAR}") elseif ("x${_i}" STREQUAL "xHDRS")
#message("has CPPS5: ${WAS_CPP_ARG}: ${CPP5_VAR}") set(_HDR_ARG 1)
#message("files: ${FILE_LIST}") elseif ("x${_i}" STREQUAL "xCPPS")
set(H_LIST) set(_CPP_ARG 1)
set(CPP_LIST) elseif ("x${_i}" STREQUAL "xQMS")
set(UI_LIST) set(_QM_ARG 1)
set(RES_LIST) else()
set(RC_LIST) list(APPEND FILE_LIST "${_i}")
set(TS_LIST) endif()
foreach(_i ${FILE_LIST}) endforeach()
get_filename_component(_EXT "${_i}" EXT) foreach(_v ${_QT_VERSIONS_})
#message("${_EXT}") set(CPP${_v}_VAR)
if (NOT ("x${_EXT}" STREQUAL "x")) set(QM${_v}_VAR)
if (("x${_EXT}" STREQUAL "x.h") OR ("x${_EXT}" STREQUAL "x.hpp")) if (LOCAL_FOUND${_v})
list(APPEND H_LIST "${_i}") if (WAS_CPP_ARG)
#message("header") set(CPP${_v}_VAR ${CPP_VAR}_Qt${_v})
endif() endif()
if (("x${_EXT}" STREQUAL "x.c") OR ("x${_EXT}" STREQUAL "x.cpp") OR ("x${_EXT}" STREQUAL "x.cxx")) if (WAS_QM_ARG)
list(APPEND CPP_LIST "${_i}") set(QM${_v}_VAR ${QM_VAR}_Qt${_v})
#message("source") endif()
endif() endif()
if ("x${_EXT}" STREQUAL "x.ui") endforeach()
list(APPEND UI_LIST "${_i}") #message("found 4: ${LOCAL_FOUND4}, 5: ${LOCAL_FOUND5}")
endif() #message("has HRDS: ${WAS_HDR_ARG}: ${HDR_VAR}")
if ("x${_EXT}" STREQUAL "x.qrc") #message("has CPPS4: ${WAS_CPP_ARG}: ${CPP4_VAR}")
list(APPEND RES_LIST "${_i}") #message("has CPPS5: ${WAS_CPP_ARG}: ${CPP5_VAR}")
endif() #message("files: ${FILE_LIST}")
if ("x${_EXT}" STREQUAL "x.rc") set(H_LIST)
list(APPEND RC_LIST "${_i}") set(CPP_LIST)
endif() set(UI_LIST)
if ("x${_EXT}" STREQUAL "x.ts") set(RES_LIST)
list(APPEND TS_LIST "${_i}") set(RC_LIST)
endif() set(TS_LIST)
endif() foreach(_i ${FILE_LIST})
endforeach() get_filename_component(_EXT "${_i}" EXT)
if (WAS_HDR_ARG) #message("${_EXT}")
set(${HDR_VAR}) if (NOT ("x${_EXT}" STREQUAL "x"))
list(APPEND ${HDR_VAR} ${H_LIST}) if (("x${_EXT}" STREQUAL "x.h") OR ("x${_EXT}" STREQUAL "x.hpp"))
endif() list(APPEND H_LIST "${_i}")
set(SRC_CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) #message("header")
foreach(_v ${_QT_VERSIONS_}) endif()
if (LOCAL_FOUND${_v} AND WAS_CPP_ARG) if (("x${_EXT}" STREQUAL "x.c") OR ("x${_EXT}" STREQUAL "x.cpp") OR ("x${_EXT}" STREQUAL "x.cxx"))
set(CMAKE_CURRENT_BINARY_DIR ${SRC_CMAKE_CURRENT_BINARY_DIR}/qt${_v}) list(APPEND CPP_LIST "${_i}")
set(${CPP${_v}_VAR}) #message("source")
if (WAS_QM_ARG) endif()
set(${QM${_v}_VAR}) if ("x${_EXT}" STREQUAL "x.ui")
endif() list(APPEND UI_LIST "${_i}")
set(MOCS${_v}) endif()
set(CUIS${_v}) if ("x${_EXT}" STREQUAL "x.qrc")
set(CRES${_v}) list(APPEND RES_LIST "${_i}")
if (${_v} EQUAL 4) endif()
qt4_wrap_cpp(MOCS${_v} ${H_LIST} OPTIONS -nw ${MOC_INC_Qt4}) if ("x${_EXT}" STREQUAL "x.rc")
qt4_wrap_ui(CUIS${_v} ${UI_LIST}) list(APPEND RC_LIST "${_i}")
qt4_add_resources(CRES${_v} ${RES_LIST}) endif()
if (WAS_QM_ARG) if ("x${_EXT}" STREQUAL "x.ts")
set(${QM${_v}_VAR} "") list(APPEND TS_LIST "${_i}")
qt4_add_translation(${QM${_v}_VAR} ${TS_LIST}) endif()
endif() endif()
elseif (${_v} EQUAL 5) endforeach()
qt5_wrap_cpp(MOCS${_v} ${H_LIST} OPTIONS -nw ${MOC_INC_Qt5}) if (WAS_HDR_ARG)
qt5_wrap_ui(CUIS${_v} ${UI_LIST}) set(${HDR_VAR})
qt5_add_resources(CRES${_v} ${RES_LIST}) list(APPEND ${HDR_VAR} ${H_LIST})
if (WAS_QM_ARG) endif()
set(${QM${_v}_VAR} "") set(SRC_CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
qt5_add_translation(${QM${_v}_VAR} ${TS_LIST}) foreach(_v ${_QT_VERSIONS_})
endif() if (LOCAL_FOUND${_v} AND WAS_CPP_ARG)
else() set(CMAKE_CURRENT_BINARY_DIR ${SRC_CMAKE_CURRENT_BINARY_DIR}/qt${_v})
# Qt6 ... set(${CPP${_v}_VAR})
endif() if (WAS_QM_ARG)
#message("${${QM${_v}_VAR}}") set(${QM${_v}_VAR})
list(APPEND ${CPP${_v}_VAR} ${CPP_LIST}) endif()
list(APPEND ${CPP${_v}_VAR} ${RC_LIST}) set(MOCS${_v})
list(APPEND ${CPP${_v}_VAR} ${MOCS${_v}}) set(CUIS${_v})
list(APPEND ${CPP${_v}_VAR} ${CUIS${_v}}) set(CRES${_v})
list(APPEND ${CPP${_v}_VAR} ${CRES${_v}}) if (${_v} EQUAL 4)
if (WAS_QM_ARG) qt4_wrap_cpp(MOCS${_v} ${H_LIST} OPTIONS -nw ${MOC_INC_Qt4})
list(APPEND ${CPP${_v}_VAR} ${${QM${_v}_VAR}}) qt4_wrap_ui(CUIS${_v} ${UI_LIST})
endif() qt4_add_resources(CRES${_v} ${RES_LIST})
#message("${${QM${_v}_VAR}}") if (WAS_QM_ARG)
endif() set(${QM${_v}_VAR} "")
endforeach() qt4_add_translation(${QM${_v}_VAR} ${TS_LIST})
set(CMAKE_CURRENT_BINARY_DIR ${SRC_CMAKE_CURRENT_BINARY_DIR}) endif()
endmacro() elseif (${_v} EQUAL 5)
qt5_wrap_cpp(MOCS${_v} ${H_LIST} OPTIONS -nw ${MOC_INC_Qt5})
qt5_wrap_ui(CUIS${_v} ${UI_LIST})
macro(_qt_split_add_args _P _A) qt5_add_resources(CRES${_v} ${RES_LIST})
set(${_P}) if (WAS_QM_ARG)
set(${_A}) set(${QM${_v}_VAR} "")
foreach(_i ${ARGN}) qt5_add_translation(${QM${_v}_VAR} ${TS_LIST})
if (NOT ("x${${_i}_Qt${_v}}" STREQUAL "x")) endif()
list(APPEND ${_A} ${${_i}_Qt${_v}}) else()
elseif (("x${_i}" STREQUAL "xWIN32") OR # Qt6 ...
("x${_i}" STREQUAL "xMACOSX_BUNDLE") OR endif()
("x${_i}" STREQUAL "xSTATIC") OR #message("${${QM${_v}_VAR}}")
("x${_i}" STREQUAL "xSHARED") OR list(APPEND ${CPP${_v}_VAR} ${CPP_LIST})
("x${_i}" STREQUAL "xMODULE") OR list(APPEND ${CPP${_v}_VAR} ${RC_LIST})
("x${_i}" STREQUAL "xEXCLUDE_FROM_ALL")) list(APPEND ${CPP${_v}_VAR} ${MOCS${_v}})
list(APPEND ${_P} ${_i}) list(APPEND ${CPP${_v}_VAR} ${CUIS${_v}})
elseif ("x${${_i}}" STREQUAL "x") list(APPEND ${CPP${_v}_VAR} ${CRES${_v}})
list(APPEND ${_A} ${_i}) if (WAS_QM_ARG)
else() list(APPEND ${CPP${_v}_VAR} ${${QM${_v}_VAR}})
list(APPEND ${_A} ${${_i}}) endif()
endif() #message("${${QM${_v}_VAR}}")
endforeach() endif()
endmacro() endforeach()
set(CMAKE_CURRENT_BINARY_DIR ${SRC_CMAKE_CURRENT_BINARY_DIR})
endmacro()
macro(__qt_set_defines _NAME _T)
target_compile_definitions(${_T} PRIVATE "__TARGET_NAME__=\"${_NAME}\"")
target_compile_definitions(${_T} PRIVATE "__TARGET_LABEL__=\"${${_NAME}_LABEL}\"") macro(_qt_split_add_args _P _A)
target_compile_definitions(${_T} PRIVATE "__TARGET_COMPANY__=\"${${_NAME}_COMPANY}\"") set(${_P})
target_compile_definitions(${_T} PRIVATE "__TARGET_VERSION__=\"${${_NAME}_VERSION}\"") set(${_A})
endmacro() foreach(_i ${ARGN})
if (NOT ("x${${_i}_Qt${_v}}" STREQUAL "x"))
list(APPEND ${_A} ${${_i}_Qt${_v}})
macro(qt_add_executable _NAME) elseif (("x${_i}" STREQUAL "xWIN32") OR
foreach(_v ${_QT_VERSIONS_}) ("x${_i}" STREQUAL "xMACOSX_BUNDLE") OR
if (LOCAL_FOUND${_v}) ("x${_i}" STREQUAL "xSTATIC") OR
_qt_split_add_args(_PREF _ARGS ${ARGN}) ("x${_i}" STREQUAL "xSHARED") OR
if(APPLE) ("x${_i}" STREQUAL "xMODULE") OR
set(_PREV_CIND "${CMAKE_INSTALL_NAME_DIR}") ("x${_i}" STREQUAL "xEXCLUDE_FROM_ALL"))
set(CMAKE_INSTALL_NAME_DIR "@rpath") list(APPEND ${_P} ${_i})
else() elseif ("x${${_i}}" STREQUAL "x")
if(NOT WIN32) list(APPEND ${_A} ${_i})
set(CMAKE_INSTALL_RPATH "\$ORIGIN;\$ORIGIN/lib") else()
endif() list(APPEND ${_A} ${${_i}})
endif() endif()
set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}}) endforeach()
add_executable(${_TARGET} ${_PREF} ${_ARGS}) endmacro()
set(_${_NAME}_is_qt 1)
target_include_directories(${_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/qt${_v} ${Qt${_v}_INCLUDES})
__qt_set_defines(${_NAME} ${_TARGET}) macro(__qt_set_defines _NAME _T)
target_compile_definitions(${_T} PRIVATE "__TARGET_NAME__=\"${_NAME}\"")
if(APPLE) target_compile_definitions(${_T} PRIVATE "__TARGET_LABEL__=\"${${_NAME}_LABEL}\"")
set(CMAKE_INSTALL_NAME_DIR "${_PREV_CIND}") target_compile_definitions(${_T} PRIVATE "__TARGET_COMPANY__=\"${${_NAME}_COMPANY}\"")
endif() target_compile_definitions(${_T} PRIVATE "__TARGET_VERSION__=\"${${_NAME}_VERSION}\"")
# # Apple crosscompiling rpath patch endmacro()
# if (APPLE AND CMAKE_CROSSCOMPILING AND CMAKE_MACOSX_RPATH)
# foreach(_RP ${CMAKE_INSTALL_RPATH})
# add_custom_command(TARGET ${_TARGET} POST_BUILD macro(qt_add_executable _NAME)
# COMMAND "${CMAKE_INSTALL_NAME_TOOL}" foreach(_v ${_QT_VERSIONS_})
# "-add_rpath" "${_RP}" if (LOCAL_FOUND${_v})
# "$<TARGET_FILE_DIR:${_TARGET}>/$<TARGET_FILE_NAME:${_TARGET}>" _qt_split_add_args(_PREF _ARGS ${ARGN})
# COMMENT "Add to ${_TARGET} rpath \"${_RP}\"") if(APPLE)
# endforeach() set(_PREV_CIND "${CMAKE_INSTALL_NAME_DIR}")
# endif() set(CMAKE_INSTALL_NAME_DIR "@rpath")
else()
#list(APPEND _ALL_TARGETS "${_TARGET}") if(NOT WIN32)
#set(_ALL_TARGETS ${_ALL_TARGETS} PARENT_SCOPE) set(CMAKE_INSTALL_RPATH "\$ORIGIN;\$ORIGIN/lib")
endif() endif()
endforeach() endif()
endmacro() set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}})
add_executable(${_TARGET} ${_PREF} ${_ARGS})
set(_${_NAME}_is_qt 1)
macro(qt_add_library _NAME) target_include_directories(${_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/qt${_v} ${Qt${_v}_INCLUDES})
foreach(_v ${_QT_VERSIONS_}) __qt_set_defines(${_NAME} ${_TARGET})
if (LOCAL_FOUND${_v})
_qt_split_add_args(_PREF _ARGS ${ARGN}) if(APPLE)
if(APPLE) set(CMAKE_INSTALL_NAME_DIR "${_PREV_CIND}")
set(_PREV_CIND "${CMAKE_INSTALL_NAME_DIR}") endif()
set(CMAKE_INSTALL_NAME_DIR "@rpath") # # Apple crosscompiling rpath patch
else() # if (APPLE AND CMAKE_CROSSCOMPILING AND CMAKE_MACOSX_RPATH)
if(NOT WIN32) # foreach(_RP ${CMAKE_INSTALL_RPATH})
set(CMAKE_INSTALL_RPATH "\$ORIGIN;\$ORIGIN/lib") # add_custom_command(TARGET ${_TARGET} POST_BUILD
endif() # COMMAND "${CMAKE_INSTALL_NAME_TOOL}"
endif() # "-add_rpath" "${_RP}"
set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}}) # "$<TARGET_FILE_DIR:${_TARGET}>/$<TARGET_FILE_NAME:${_TARGET}>"
add_library(${_TARGET} ${_PREF} ${_ARGS}) # COMMENT "Add to ${_TARGET} rpath \"${_RP}\"")
set(_${_NAME}_is_qt 1) # endforeach()
target_include_directories(${_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/qt${_v} ${Qt${_v}_INCLUDES}) # endif()
__qt_set_defines(${_NAME} ${_TARGET})
#message("add lib: \"${_TARGET}\"") #list(APPEND _ALL_TARGETS "${_TARGET}")
#set(_ALL_TARGETS ${_ALL_TARGETS} PARENT_SCOPE)
if(APPLE) endif()
set(CMAKE_INSTALL_NAME_DIR "${_PREV_CIND}") endforeach()
endif() endmacro()
# # Apple crosscompiling rpath patch
# if (APPLE AND CMAKE_CROSSCOMPILING AND CMAKE_MACOSX_RPATH)
# foreach(_RP ${CMAKE_INSTALL_RPATH}) macro(qt_add_library _NAME)
# add_custom_command(TARGET ${_TARGET} POST_BUILD foreach(_v ${_QT_VERSIONS_})
# COMMAND "${CMAKE_INSTALL_NAME_TOOL}" if (LOCAL_FOUND${_v})
# "-add_rpath" "${_RP}" _qt_split_add_args(_PREF _ARGS ${ARGN})
# "$<TARGET_FILE_DIR:${_TARGET}>/$<TARGET_FILE_NAME:${_TARGET}>" if(APPLE)
# COMMENT "Add to ${_TARGET} rpath \"${_RP}\"") set(_PREV_CIND "${CMAKE_INSTALL_NAME_DIR}")
# endforeach() set(CMAKE_INSTALL_NAME_DIR "@rpath")
# endif() else()
if(NOT WIN32)
list(APPEND _ALL_TARGETS "${_TARGET}") set(CMAKE_INSTALL_RPATH "\$ORIGIN;\$ORIGIN/lib")
set(_ALL_TARGETS ${_ALL_TARGETS} PARENT_SCOPE) endif()
endif() endif()
endforeach() set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}})
endmacro() add_library(${_TARGET} ${_PREF} ${_ARGS})
set(_${_NAME}_is_qt 1)
target_include_directories(${_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/qt${_v} ${Qt${_v}_INCLUDES})
macro(_qt_multitarget_suffix_ _OUT _IN _v) __qt_set_defines(${_NAME} ${_TARGET})
string(REPLACE ":" "_" _in_str "${_IN}") #message("add lib: \"${_TARGET}\"")
if (NOT "x${MULTILIB_${_in_str}_SUFFIX_Qt${_v}}" STREQUAL "x")
set(${_OUT} "${MULTILIB_${_in_str}_SUFFIX_Qt${_v}}") if(APPLE)
else() set(CMAKE_INSTALL_NAME_DIR "${_PREV_CIND}")
set(${_OUT} "${MULTILIB_SUFFIX_Qt${_v}}") endif()
endif() # # Apple crosscompiling rpath patch
endmacro() # if (APPLE AND CMAKE_CROSSCOMPILING AND CMAKE_MACOSX_RPATH)
# foreach(_RP ${CMAKE_INSTALL_RPATH})
# add_custom_command(TARGET ${_TARGET} POST_BUILD
macro(qt_target_link_libraries _NAME) # COMMAND "${CMAKE_INSTALL_NAME_TOOL}"
foreach(_v ${_QT_VERSIONS_}) # "-add_rpath" "${_RP}"
if (LOCAL_FOUND${_v}) # "$<TARGET_FILE_DIR:${_TARGET}>/$<TARGET_FILE_NAME:${_TARGET}>"
set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}}) # COMMENT "Add to ${_TARGET} rpath \"${_RP}\"")
set(_ARGS) # endforeach()
foreach(_i ${ARGN}) # endif()
set(_ind -1)
list(FIND QT_MULTILIB_LIST "${_i}" _ind) list(APPEND _ALL_TARGETS "${_TARGET}")
if (_ind GREATER -1) set(_ALL_TARGETS ${_ALL_TARGETS} PARENT_SCOPE)
_qt_multitarget_suffix_(_TS ${_i} ${_v}) endif()
#message(STATUS "${_i} in MULTILIB_LIST, suffix = ${_TS}") endforeach()
list(APPEND _ARGS ${_i}${_TS}) endmacro()
else()
list(APPEND _ARGS ${_i})
endif() macro(_qt_multitarget_suffix_ _OUT _IN _v)
endforeach() string(REPLACE ":" "_" _in_str "${_IN}")
target_link_libraries(${_TARGET} ${Qt${_v}_LIBRARIES} ${_ARGS}) if (NOT "x${MULTILIB_${_in_str}_SUFFIX_Qt${_v}}" STREQUAL "x")
#message("link ${_TARGET}: ${Qt${_v}_LIBRARIES} ${_ARGS}") set(${_OUT} "${MULTILIB_${_in_str}_SUFFIX_Qt${_v}}")
endif() else()
endforeach() set(${_OUT} "${MULTILIB_SUFFIX_Qt${_v}}")
endmacro() endif()
endmacro()
macro(qt_target_compile_definitions _NAME)
foreach(_v ${_QT_VERSIONS_}) macro(qt_target_link_libraries _NAME)
if (LOCAL_FOUND${_v}) foreach(_v ${_QT_VERSIONS_})
set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}}) if (LOCAL_FOUND${_v})
target_compile_definitions(${_TARGET} ${ARGN}) set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}})
endif() set(_ARGS)
endforeach() foreach(_i ${ARGN})
endmacro() set(_ind -1)
list(FIND QT_MULTILIB_LIST "${_i}" _ind)
if (_ind GREATER -1)
macro(qt_target_include_directories _NAME) _qt_multitarget_suffix_(_TS ${_i} ${_v})
foreach(_v ${_QT_VERSIONS_}) #message(STATUS "${_i} in MULTILIB_LIST, suffix = ${_TS}")
if (LOCAL_FOUND${_v}) list(APPEND _ARGS ${_i}${_TS})
set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}}) else()
target_include_directories(${_TARGET} ${ARGN}) list(APPEND _ARGS ${_i})
endif() endif()
endforeach() endforeach()
endmacro() target_link_libraries(${_TARGET} ${Qt${_v}_LIBRARIES} ${_ARGS})
#message("link ${_TARGET}: ${Qt${_v}_LIBRARIES} ${_ARGS}")
endif()
macro(qt_install) endforeach()
set(_prev_inst) endmacro()
set(__add_args)
#message("command: ${ARGN}")
foreach(_v ${_QT_VERSIONS_}) macro(qt_target_compile_definitions _NAME)
if (LOCAL_FOUND${_v}) foreach(_v ${_QT_VERSIONS_})
set(_INST_LIST) if (LOCAL_FOUND${_v})
set(_IS_TARGET 0) set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}})
set(_IS_FILES 0) target_compile_definitions(${_TARGET} ${ARGN})
set(_IS_DEST 0) endif()
set(_IS_LANG 0) endforeach()
set(_INVALID 0) endmacro()
foreach(_i ${ARGN})
if ("x${_i}" STREQUAL "xQtLang")
set(_IS_LANG 1) macro(qt_target_include_directories _NAME)
endif() foreach(_v ${_QT_VERSIONS_})
endforeach() if (LOCAL_FOUND${_v})
foreach(_i ${ARGN}) set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}})
if (_IS_TARGET) target_include_directories(${_TARGET} ${ARGN})
set(_IS_TARGET 0) endif()
set(__target ${_i}) endforeach()
if (_${_i}_is_qt) endmacro()
set(__target ${_i}${TARGET_SUFFIX_Qt${_v}})
endif()
if (DEFINED ANDROID_PLATFORM) macro(qt_install)
get_target_property(_TT ${__target} TYPE) set(_prev_inst)
if ("x${_TT}" STREQUAL "xEXECUTABLE") set(__add_args)
list(APPEND __add_args EXCLUDE_FROM_ALL) #message("command: ${ARGN}")
endif() foreach(_v ${_QT_VERSIONS_})
endif() if (LOCAL_FOUND${_v})
list(APPEND _INST_LIST ${__target}) set(_INST_LIST)
elseif (_IS_FILES) set(_IS_TARGET 0)
set(_IS_FILES 0) set(_IS_FILES 0)
if (_IS_LANG) set(_IS_DEST 0)
if (("x${${_i}_Qt${_v}}" STREQUAL "x") OR ("x${_i}" STREQUAL "xDESTINATION")) set(_IS_LANG 0)
set(_INVALID 1) set(_INVALID 0)
else() foreach(_i ${ARGN})
list(APPEND _INST_LIST ${${_i}_Qt${_v}}) if ("x${_i}" STREQUAL "xQtLang")
endif() set(_IS_LANG 1)
else() endif()
list(APPEND _INST_LIST ${_i}) endforeach()
endif() foreach(_i ${ARGN})
else() if (_IS_TARGET)
if (_IS_DEST) set(_IS_TARGET 0)
set(_IS_DEST 0) set(__target ${_i})
if ("x${_i}" STREQUAL "xQtBin") if (_${_i}_is_qt)
list(APPEND _INST_LIST "${Qt${_v}_BIN}") set(__target ${_i}${TARGET_SUFFIX_Qt${_v}})
elseif ("x${_i}" STREQUAL "xQtLang") endif()
list(APPEND _INST_LIST "${Qt${_v}_LANG_DIR}") if (DEFINED ANDROID_PLATFORM)
else() get_target_property(_TT ${__target} TYPE)
set(_ind -1) if ("x${_TT}" STREQUAL "xEXECUTABLE")
string(FIND "${_i}" "QtPlugins" _ind) list(APPEND __add_args EXCLUDE_FROM_ALL)
if (_ind GREATER -1) endif()
string(REPLACE "QtPlugins" "${Qt${_v}_PLUGINS_DIR}" _o "${_i}") endif()
list(APPEND _INST_LIST "${_o}") list(APPEND _INST_LIST ${__target})
else() elseif (_IS_FILES)
string(REPLACE "\\" "/" _o "${_i}") set(_IS_FILES 0)
list(APPEND _INST_LIST ${_o}) if (_IS_LANG)
endif() if (("x${${_i}_Qt${_v}}" STREQUAL "x") OR ("x${_i}" STREQUAL "xDESTINATION"))
endif() set(_INVALID 1)
else() else()
set(_ii ${_i}) list(APPEND _INST_LIST ${${_i}_Qt${_v}})
if ("x${_i}" STREQUAL "xTARGETS") endif()
set(_IS_TARGET 1) else()
elseif ("x${_i}" STREQUAL "xFILES") list(APPEND _INST_LIST ${_i})
set(_IS_FILES 1) endif()
elseif ("x${_i}" STREQUAL "xDESTINATION") else()
set(_IS_DEST 1) if (_IS_DEST)
elseif ("x${_i}" STREQUAL "xLANG") set(_IS_DEST 0)
set(_IS_FILES 1) if ("x${_i}" STREQUAL "xQtBin")
set(_IS_LANG 1) list(APPEND _INST_LIST "${Qt${_v}_BIN}")
set(_ii "FILES") elseif ("x${_i}" STREQUAL "xQtLang")
endif() list(APPEND _INST_LIST "${Qt${_v}_LANG_DIR}")
list(APPEND _INST_LIST ${_ii}) else()
endif() set(_ind -1)
endif() string(FIND "${_i}" "QtPlugins" _ind)
endforeach() if (_ind GREATER -1)
if (NOT _INVALID) string(REPLACE "QtPlugins" "${Qt${_v}_PLUGINS_DIR}" _o "${_i}")
if (NOT ("x${_prev_inst}" STREQUAL "x${_INST_LIST}")) list(APPEND _INST_LIST "${_o}")
#message("install: ${_INST_LIST}") else()
install(${_INST_LIST} ${__add_args}) string(REPLACE "\\" "/" _o "${_i}")
set(_prev_inst "${_INST_LIST}") list(APPEND _INST_LIST ${_o})
endif() endif()
endif() endif()
endif() else()
endforeach() set(_ii ${_i})
endmacro() if ("x${_i}" STREQUAL "xTARGETS")
set(_IS_TARGET 1)
elseif ("x${_i}" STREQUAL "xFILES")
macro(qt_install_lang _NAME) set(_IS_FILES 1)
set(_prev_inst) elseif ("x${_i}" STREQUAL "xDESTINATION")
#message("command: ${ARGN}") set(_IS_DEST 1)
set(_PATHS) elseif ("x${_i}" STREQUAL "xLANG")
set(_DEST) set(_IS_FILES 1)
if(CMAKE_CROSSCOMPILING) set(_IS_LANG 1)
list(APPEND _PATHS "${CMAKE_PREFIX_PATH}/lang") set(_ii "FILES")
endif() endif()
set(_cur_arg) list(APPEND _INST_LIST ${_ii})
set(__args "DESTINATION;PATHS") endif()
foreach(_i ${ARGN}) endif()
if (_i IN_LIST __args) endforeach()
set(_cur_arg "${_i}") if (NOT _INVALID)
elseif("${_cur_arg}" STREQUAL "DESTINATION") if (NOT ("x${_prev_inst}" STREQUAL "x${_INST_LIST}"))
set(_DEST "${_i}") #message("install: ${_INST_LIST}")
elseif("${_cur_arg}" STREQUAL "PATHS") install(${_INST_LIST} ${__add_args})
list(APPEND _PATHS "${_i}") set(_prev_inst "${_INST_LIST}")
endif() endif()
endforeach() endif()
foreach(_v ${_QT_VERSIONS_}) endif()
if (LOCAL_FOUND${_v}) endforeach()
set(_target) endmacro()
if (_${_NAME}_is_qt)
set(_target ${_NAME}${TARGET_SUFFIX_Qt${_v}})
endif() macro(qt_install_lang _NAME)
get_target_property(_LL ${_target} LINK_LIBRARIES) set(_prev_inst)
foreach (_L ${_LL}) #message("command: ${ARGN}")
get_filename_component(_libname "${_L}" NAME_WE) set(_PATHS)
#message("depend on ${_libname}") set(_DEST)
if ("${_libname}" MATCHES "Qt${_v}::.*") if(CMAKE_CROSSCOMPILING)
string(SUBSTRING "${_libname}" 5 -1 _libname) list(APPEND _PATHS "${CMAKE_PREFIX_PATH}/lang")
string(TOLOWER "${_libname}" _libname) endif()
#message("qt lib \"${_libname}\"") set(_cur_arg)
list(APPEND _qt_libs qt${_libname}) set(__args "DESTINATION;PATHS")
else() foreach(_i ${ARGN})
if ("${_libname}" MATCHES "lib.*") if (_i IN_LIST __args)
string(LENGTH ${_libname} _sl) set(_cur_arg "${_i}")
math(EXPR _sl ${_sl}-3) elseif("${_cur_arg}" STREQUAL "DESTINATION")
string(SUBSTRING ${_libname} 3 ${_sl} _libname) set(_DEST "${_i}")
endif() elseif("${_cur_arg}" STREQUAL "PATHS")
if ("${_libname}" MATCHES "qad_.*${_v}") list(APPEND _PATHS "${_i}")
string(LENGTH ${_libname} _sl) endif()
math(EXPR _sl ${_sl}-1) endforeach()
string(SUBSTRING ${_libname} 0 ${_sl} _libname) foreach(_v ${_QT_VERSIONS_})
#message("qad lib \"${_libname}\"") if (LOCAL_FOUND${_v})
list(APPEND _qt_libs ${_libname}) set(_target)
endif() if (_${_NAME}_is_qt)
endif() set(_target ${_NAME}${TARGET_SUFFIX_Qt${_v}})
endforeach() endif()
if (NOT "x${_qt_libs}" STREQUAL "x") get_target_property(_LL ${_target} LINK_LIBRARIES)
list(APPEND _qt_libs "qtbase") foreach (_L ${_LL})
foreach (_i ${${PROJECT_NAME}_LANG}) get_filename_component(_libname "${_L}" NAME_WE)
foreach (_l ${_qt_libs}) #message("depend on ${_libname}")
unset(_qm_path CACHE) if ("${_libname}" MATCHES "Qt${_v}::.*")
find_file(_qm_path "${_l}_${_i}.qm" PATHS "${Qt${_v}_LANG_DIR}" ${_PATHS} NO_DEFAULT_PATH) string(SUBSTRING "${_libname}" 5 -1 _libname)
if (EXISTS "${_qm_path}") string(TOLOWER "${_libname}" _libname)
install(FILES ${_qm_path} DESTINATION "${_DEST}") #message("qt lib \"${_libname}\"")
#message("qm = \"${_qm_path}\"") list(APPEND _qt_libs qt${_libname})
endif() else()
endforeach() if ("${_libname}" MATCHES "lib.*")
endforeach() string(LENGTH ${_libname} _sl)
endif() math(EXPR _sl ${_sl}-3)
endif() string(SUBSTRING ${_libname} 3 ${_sl} _libname)
endforeach() endif()
endmacro() if ("${_libname}" MATCHES "qad_.*${_v}")
string(LENGTH ${_libname} _sl)
math(EXPR _sl ${_sl}-1)
string(SUBSTRING ${_libname} 0 ${_sl} _libname)
#message("qad lib \"${_libname}\"")
list(APPEND _qt_libs ${_libname})
endif()
endif()
endforeach()
if (NOT "x${_qt_libs}" STREQUAL "x")
list(APPEND _qt_libs "qtbase")
foreach (_i ${${PROJECT_NAME}_LANG})
foreach (_l ${_qt_libs})
unset(_qm_path CACHE)
find_file(_qm_path "${_l}_${_i}.qm" PATHS "${Qt${_v}_LANG_DIR}" ${_PATHS} NO_DEFAULT_PATH)
if (EXISTS "${_qm_path}")
install(FILES ${_qm_path} DESTINATION "${_DEST}")
#message("qm = \"${_qm_path}\"")
endif()
endforeach()
endforeach()
endif()
endif()
endforeach()
endmacro()
macro(qt_get_target _NAME _OUT)
set(${_OUT})
set(_ver)
foreach(_i ${ARGN})
foreach(_v ${_QT_VERSIONS_})
if ("x${_i}" STREQUAL "xQt${_v}")
set(_ver ${_v})
break()
endif()
endforeach()
if (NOT "x${_ver}" STREQUAL "x")
break()
endif()
endforeach()
foreach(_v ${_QT_VERSIONS_})
if (LOCAL_FOUND${_v} AND (("x${_ver}" STREQUAL "x") OR ((NOT "x${_ver}" STREQUAL "x") AND ("x${_ver}" STREQUAL "x${_v}"))))
set(${_OUT} ${_NAME}${TARGET_SUFFIX_Qt${_v}})
endif()
endforeach()
endmacro()
macro(qt_get_targets _NAME _OUT)
set(${_OUT})
foreach(_v ${_QT_VERSIONS_})
if (LOCAL_FOUND${_v})
list(APPEND ${_OUT} ${_NAME}${TARGET_SUFFIX_Qt${_v}})
endif()
endforeach()
endmacro()
macro(qt_generate_export_header _NAME)
qt_get_target(${_NAME} _some_target)
qt_get_target(${_NAME} _targets)
foreach(_t ${_targets})
set_target_properties(${_t} PROPERTIES DEFINE_SYMBOL ${_NAME}_EXPORTS)
endforeach()
set_target_properties(${_some_target} PROPERTIES DEFINE_SYMBOL ${_NAME}_EXPORTS)
generate_export_header(${_some_target} BASE_NAME "${_NAME}" ${ARGN})
endmacro()

View File

@@ -1,50 +0,0 @@
@echo off
rem Please add to environment ANDROID_QT5_DIR (path to Qt directory) and ANDROID_NDK_HOME (path to android ndk directory)
rem Execute with Android API version and arch e. g. : #cmake_android.bat 24 arm ../libs
rem Arches: arm, arm64, x86, x86_64
set _usage_=0
if [%~1]==[] set _usage_=1
if [%~2]==[] set _usage_=1
if [%~3]==[] set _usage_=1
if %_usage_%==1 (
echo Usage: cmake_android.bat ^<API_LEVEL^> ^<ARCH^> ^<SRC^>
echo ^ ^ ^<API_LEVEL^> - number of API ^(e.g. 19^)
echo ^ ^ ^<ARCH^> - architecture ^(arm, arm64, x86, x86_64^)
echo ^ ^ ^<SRC^> - path to sources
echo.
echo You also have to set next env variables^:
echo ^ ^ ANDROID_QT5_DIR - path to Qt dir, contains subdirs for arch
echo ^ ^ ANDROID_NDK_HOME - path to android ndk directory
exit /b
)
set QARCH=
set AARCH=
set _PLATFORM_=%~1
if %~2==arm (
set QARCH=armv7
set AARCH=armeabi-v7a
)
if %~2==arm64 (
set QARCH=arm64_v8a
set AARCH=arm64-v8a
if /i %_PLATFORM_% LSS 21 set _PLATFORM_=21
)
if %~2==x86 (
set QARCH=x86
set AARCH=x86
)
if %~2==x86_64 (
set QARCH=x86_64
set AARCH=x86_64
if /i %_PLATFORM_% LSS 21 set _PLATFORM_=21
)
rem set Qt5_ROOT=%ANDROID_QT5_DIR%\android_%QARCH%\lib\cmake
set Qt5_ROOT=%ANDROID_QT5_DIR%\lib\cmake
rem set Qt5_DIR=%Qt5_ROOT%\Qt5
if NOT [%QARCH%]==[] (
@echo on
cmake_mgw -Wno-dev -DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK_HOME%\build\cmake\android.toolchain.cmake -DANDROID_STL=c++_shared -DANDROID_PLATFORM=android-%_PLATFORM_% -DANDROID_ABI=%AARCH% -DICU=0 -DQt4=0 -DQt5=1 -DQGLVIEW=0 -DQGLENGINE=0 -DQt5_DIR=%Qt5_ROOT%\Qt5 -DQt5LinguistTools_DIR=%Qt5_ROOT%\Qt5LinguistTools -DQt5UiPlugin_DIR=%Qt5_ROOT%\Qt5UiPlugin -DQt5UiTools_DIR=%Qt5_ROOT%\Qt5UiTools -DQt5Widgets_DIR=%Qt5_ROOT%\Qt5Widgets -DQt5Core_DIR=%Qt5_ROOT%\Qt5Core -DQt5Gui_DIR=%Qt5_ROOT%\Qt5Gui -DQt5Sql_DIR=%Qt5_ROOT%\Qt5Sql -DQt5OpenGL_DIR=%Qt5_ROOT%\Qt5OpenGL -DQt5PrintSupport_DIR=%Qt5_ROOT%\Qt5PrintSupport -DQt5Script_DIR=%Qt5_ROOT%\Qt5Script -DQt5Positioning_DIR=%Qt5_ROOT%\Qt5Positioning -DQt5Network_DIR=%Qt5_ROOT%\Qt5Network -DQt5Qml_DIR=%Qt5_ROOT%\Qt5Qml -DQt5Quick_DIR=%Qt5_ROOT%\Qt5Quick -DQt5QuickWidgets_DIR=%Qt5_ROOT%\Qt5QuickWidgets -DQt5QmlModels_DIR=%Qt5_ROOT%\Qt5QmlModels -DQt5AndroidExtras_DIR=%Qt5_ROOT%\Qt5AndroidExtras %~3 %~4 %~5 %~6
) else (
@echo on
cmake_mgw -Wno-dev -DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK_HOME%\build\cmake\android.toolchain.cmake -DANDROID_STL=c++_shared -DANDROID_PLATFORM=android-%_PLATFORM_% -DANDROID_ABI=%AARCH% -DICU=0 -DQt4=0 -DQt5=0 -DQGLVIEW=0 %~3 %~4 %~5 %~6
)

View File

@@ -1,3 +0,0 @@
export SDK_DIR=/usr/lib/android-sdk
export PREFIX=/soft/android
rm -rf * && cmake -DCMAKE_TOOLCHAIN_FILE=${SDK_DIR}/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-21 -DQt4=0 -DQt5=1 -DQt5_DIR=${PREFIX}/qt/lib/cmake/Qt5 ../libs

View File

@@ -1,38 +0,0 @@
ARG DOCKER_PREFIX=wapmobil/
FROM ${DOCKER_PREFIX}android
ARG LIBS_BUILD_NUMBER=9999
ARG JOBS_COUNT=4
WORKDIR /soft
RUN git clone -b release --depth 1 --recursive https://git.shs.tools/SHS/libs.git
WORKDIR /soft/libs_build_host
RUN cmake -DICU=0 -DCROSSTOOLS=1 -DBUILD_NUMBER=${LIBS_BUILD_NUMBER} ../libs \
&& make install -j${JOBS_COUNT} \
&& rm -rf * \
&& ldconfig
WORKDIR /soft/libs_build_anroid
ENV _ANDROID_TOOLCHAIN=/usr/lib/android-sdk/ndk-bundle/build/cmake/android.toolchain.cmake
ENV _CUR_ABI=armeabi-v7a
RUN cmake -DCMAKE_INSTALL_PREFIX=/soft/android/${_CUR_ABI} -DICU=0 -DLIB=0 -DQGLENGINE=0 -DQGLVIEW=0 -DBUILD_NUMBER=${LIBS_BUILD_NUMBER} -DCMAKE_TOOLCHAIN_FILE=${_ANDROID_TOOLCHAIN} -DQt5_DIR=/soft/android/qt/lib/cmake/Qt5 -DANDROID_PLATFORM=${NDK_PLATFORM} -DANDROID_ABI=${_CUR_ABI} ../libs/ \
&& make install -j${JOBS_COUNT} && rm -rf *
ENV _CUR_ABI=arm64-v8a
WORKDIR /soft/libs_build_android_${_CUR_ABI}
RUN cmake -DCMAKE_INSTALL_PREFIX=/soft/android/${_CUR_ABI} -DICU=0 -DLIB=0 -DQGLENGINE=0 -DQGLVIEW=0 -DBUILD_NUMBER=${LIBS_BUILD_NUMBER} -DCMAKE_TOOLCHAIN_FILE=${_ANDROID_TOOLCHAIN} -DQt5_DIR=/soft/android/qt/lib/cmake/Qt5 -DANDROID_PLATFORM=${NDK_PLATFORM} -DANDROID_ABI=${_CUR_ABI} ../libs/ \
&& make install -j${JOBS_COUNT} && rm -rf *
ENV _CUR_ABI=x86
WORKDIR /soft/libs_build_android_${_CUR_ABI}
RUN cmake -DCMAKE_INSTALL_PREFIX=/soft/android/${_CUR_ABI} -DICU=0 -DLIB=0 -DQGLENGINE=0 -DQGLVIEW=0 -DBUILD_NUMBER=${LIBS_BUILD_NUMBER} -DCMAKE_TOOLCHAIN_FILE=${_ANDROID_TOOLCHAIN} -DQt5_DIR=/soft/android/qt/lib/cmake/Qt5 -DANDROID_PLATFORM=${NDK_PLATFORM} -DANDROID_ABI=${_CUR_ABI} ../libs/ \
&& make install -j${JOBS_COUNT} && rm -rf *
ENV _CUR_ABI=x86_64
WORKDIR /soft/libs_build_android_${_CUR_ABI}
RUN cmake -DCMAKE_INSTALL_PREFIX=/soft/android/${_CUR_ABI} -DICU=0 -DLIB=0 -DQGLENGINE=0 -DQGLVIEW=0 -DBUILD_NUMBER=${LIBS_BUILD_NUMBER} -DCMAKE_TOOLCHAIN_FILE=${_ANDROID_TOOLCHAIN} -DQt5_DIR=/soft/android/qt/lib/cmake/Qt5 -DANDROID_PLATFORM=${NDK_PLATFORM} -DANDROID_ABI=${_CUR_ABI} ../libs/ \
&& make install -j${JOBS_COUNT} && rm -rf *
WORKDIR /soft/src

View File

@@ -1,16 +0,0 @@
ARG DOCKER_PREFIX=wapmobil/
FROM ${DOCKER_PREFIX}debian
ARG LIBS_BUILD_NUMBER=9999
ARG JOBS_COUNT=4
WORKDIR /soft
RUN git clone -b release --depth 1 --recursive https://git.shs.tools/SHS/libs.git
WORKDIR /soft/libs_build_debian
RUN cmake -DICU=0 -DLIB=1 -DQGLENGINE=1 -DQGLVIEW=1 -DBUILD_NUMBER=${LIBS_BUILD_NUMBER} ../libs \
&& make install -j${JOBS_COUNT} \
&& rm -rf * \
&& ldconfig
WORKDIR /soft/src

View File

@@ -1,20 +0,0 @@
ARG DOCKER_PREFIX=wapmobil/
FROM ${DOCKER_PREFIX}osx
ARG LIBS_BUILD_NUMBER=9999
ARG JOBS_COUNT=4
WORKDIR /soft
RUN git clone -b release --depth 1 --recursive https://git.shs.tools/SHS/libs.git
WORKDIR /soft/libs_build_host
RUN cmake -DICU=0 -DCROSSTOOLS=1 -DBUILD_NUMBER=${LIBS_BUILD_NUMBER} ../libs \
&& make install -j${JOBS_COUNT} \
&& rm -rf * \
&& ldconfig
WORKDIR /soft/libs_build_osx
RUN cmake -DCMAKE_INSTALL_PREFIX=/soft/osx -DICU=0 -DLIB=0 -DQGLENGINE=1 -DQGLVIEW=1 -DBUILD_NUMBER=${LIBS_BUILD_NUMBER} -DCMAKE_TOOLCHAIN_FILE=/soft/toolchain-Darwin.cmake ../libs/ \
&& make install -j${JOBS_COUNT} && rm -rf *
WORKDIR /soft/src

View File

@@ -1,20 +0,0 @@
ARG DOCKER_PREFIX=wapmobil/
FROM ${DOCKER_PREFIX}pi
ARG LIBS_BUILD_NUMBER=9999
ARG JOBS_COUNT=4
WORKDIR /soft
RUN git clone -b release --depth 1 --recursive https://git.shs.tools/SHS/libs.git
WORKDIR /soft/libs_build_host
RUN cmake -DICU=0 -DCROSSTOOLS=1 -DBUILD_NUMBER=${LIBS_BUILD_NUMBER} ../libs \
&& make install -j${JOBS_COUNT} \
&& rm -rf * \
&& ldconfig
WORKDIR /soft/libs_build_pi
RUN cmake -DCMAKE_INSTALL_PREFIX=/soft/pi/usr -DICU=0 -DLIB=0 -DQGLENGINE=0 -DQGLVIEW=0 -DBUILD_NUMBER=${LIBS_BUILD_NUMBER} -DCMAKE_TOOLCHAIN_FILE=/soft/toolchain-RPi.cmake ../libs/ \
&& make install -j${JOBS_COUNT} && rm -rf *
WORKDIR /soft/src

View File

@@ -1,20 +0,0 @@
ARG DOCKER_PREFIX=wapmobil/
FROM ${DOCKER_PREFIX}windows
ARG LIBS_BUILD_NUMBER=9999
ARG JOBS_COUNT=4
WORKDIR /soft
RUN git clone -b release --depth 1 --recursive https://git.shs.tools/SHS/libs.git
WORKDIR /soft/libs_build_host
RUN cmake -DICU=0 -DCROSSTOOLS=1 -DBUILD_NUMBER=${LIBS_BUILD_NUMBER} ../libs \
&& make install -j${JOBS_COUNT} \
&& rm -rf * \
&& ldconfig
WORKDIR /soft/libs_build_windows
RUN cmake -DCMAKE_INSTALL_PREFIX=/soft/windows -DICU=0 -DLIB=0 -DQGLENGINE=1 -DQGLVIEW=1 -DBUILD_NUMBER=${LIBS_BUILD_NUMBER} -DCMAKE_TOOLCHAIN_FILE=/soft/toolchain-Windows.cmake ../libs/ \
&& make install -j${JOBS_COUNT} && rm -rf *
WORKDIR /soft/src

View File

Before

Width:  |  Height:  |  Size: 342 B

After

Width:  |  Height:  |  Size: 342 B

View File

Before

Width:  |  Height:  |  Size: 384 B

After

Width:  |  Height:  |  Size: 384 B

View File

Before

Width:  |  Height:  |  Size: 382 B

After

Width:  |  Height:  |  Size: 382 B

View File

Before

Width:  |  Height:  |  Size: 303 B

After

Width:  |  Height:  |  Size: 303 B

View File

Before

Width:  |  Height:  |  Size: 354 B

After

Width:  |  Height:  |  Size: 354 B

View File

Before

Width:  |  Height:  |  Size: 348 B

After

Width:  |  Height:  |  Size: 348 B

View File

Before

Width:  |  Height:  |  Size: 992 B

After

Width:  |  Height:  |  Size: 992 B

View File

Before

Width:  |  Height:  |  Size: 344 B

After

Width:  |  Height:  |  Size: 344 B

View File

Before

Width:  |  Height:  |  Size: 403 B

After

Width:  |  Height:  |  Size: 403 B

View File

Before

Width:  |  Height:  |  Size: 387 B

After

Width:  |  Height:  |  Size: 387 B

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 158 B

After

Width:  |  Height:  |  Size: 158 B

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 235 B

After

Width:  |  Height:  |  Size: 235 B

View File

Before

Width:  |  Height:  |  Size: 259 B

After

Width:  |  Height:  |  Size: 259 B

View File

Before

Width:  |  Height:  |  Size: 943 B

After

Width:  |  Height:  |  Size: 943 B

View File

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 326 B

After

Width:  |  Height:  |  Size: 326 B

View File

Before

Width:  |  Height:  |  Size: 943 B

After

Width:  |  Height:  |  Size: 943 B

View File

Before

Width:  |  Height:  |  Size: 419 B

After

Width:  |  Height:  |  Size: 419 B

View File

Before

Width:  |  Height:  |  Size: 654 B

After

Width:  |  Height:  |  Size: 654 B

View File

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

View File

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 813 B

After

Width:  |  Height:  |  Size: 813 B

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 717 B

After

Width:  |  Height:  |  Size: 717 B

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

View File

Before

Width:  |  Height:  |  Size: 701 B

After

Width:  |  Height:  |  Size: 701 B

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

BIN
icons/document-revert.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Some files were not shown because too many files have changed in this diff Show More