Compare commits
24 Commits
aa140fd4ec
...
db954ffdaa
| Author | SHA1 | Date | |
|---|---|---|---|
| db954ffdaa | |||
| 8d6ae976a3 | |||
| e767fae934 | |||
| 5db97ca959 | |||
| daab41e41e | |||
| a61c8477c7 | |||
| 788ad8f2c0 | |||
| 78afc179c4 | |||
| 69ec4c9837 | |||
| 2368de6e93 | |||
| e5df76ab1d | |||
| fdec0e66a8 | |||
| 5f3baa5580 | |||
| 7083b2c32b | |||
| af02684dc5 | |||
| 2806086558 | |||
| ce962bfb40 | |||
| dcdd7db33d | |||
| 3c72db2de8 | |||
| 53faaeb396 | |||
| 2928a690b8 | |||
| 220ce225f8 | |||
| ac89c499ab | |||
| 8d1c97da04 |
@@ -134,8 +134,8 @@ JavaScriptQuotes: Leave
|
||||
JavaScriptWrapImports: true
|
||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||
LambdaBodyIndentation: Signature
|
||||
MacroBlockBegin: "PRIVATE_DEFINITION_START|STATIC_INITIALIZER_BEGIN"
|
||||
MacroBlockEnd: "PRIVATE_DEFINITION_END|STATIC_INITIALIZER_END"
|
||||
MacroBlockBegin: "PRIVATE_DEFINITION_START|STATIC_INITIALIZER_BEGIN|DECLARE_UNIT_CLASS_BEGIN"
|
||||
MacroBlockEnd: "PRIVATE_DEFINITION_END|PRIVATE_DEFINITION_END_NO_INITIALIZE|STATIC_INITIALIZER_END|DECLARE_UNIT_CLASS_END"
|
||||
MaxEmptyLinesToKeep: 2
|
||||
NamespaceIndentation: None
|
||||
ObjCBinPackProtocolList: Auto
|
||||
|
||||
@@ -5,7 +5,7 @@ if (POLICY CMP0177)
|
||||
endif()
|
||||
project(PIP)
|
||||
set(PIP_MAJOR 5)
|
||||
set(PIP_MINOR 2)
|
||||
set(PIP_MINOR 5)
|
||||
set(PIP_REVISION 0)
|
||||
set(PIP_SUFFIX )
|
||||
set(PIP_COMPANY SHS)
|
||||
@@ -69,6 +69,9 @@ option(STD_IOSTREAM "Building with std iostream operators support" OFF)
|
||||
option(INTROSPECTION "Build with introspection" OFF)
|
||||
option(TESTS "Build tests and perform their before install step" OFF)
|
||||
option(COVERAGE "Build project with coverage info" OFF)
|
||||
option(PIP_FFTW_F "Support fftw module for float" ON)
|
||||
option(PIP_FFTW_L "Support fftw module for long double" ON)
|
||||
option(PIP_FFTW_Q "Support fftw module for quad double" OFF)
|
||||
set(PIP_UTILS 1)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
@@ -328,7 +331,7 @@ if(NOT PIP_FREERTOS)
|
||||
if(WIN32)
|
||||
if(${C_COMPILER} STREQUAL "cl.exe")
|
||||
else()
|
||||
list(APPEND LIBS_MAIN ws2_32 iphlpapi psapi cfgmgr32 setupapi)
|
||||
list(APPEND LIBS_MAIN ws2_32 iphlpapi psapi cfgmgr32 setupapi hid)
|
||||
endif()
|
||||
else()
|
||||
list(APPEND LIBS_MAIN dl)
|
||||
@@ -436,8 +439,23 @@ if (NOT CROSSTOOLS)
|
||||
if (PIP_BUILD_FFTW)
|
||||
# Check if PIP support fftw3 for PIFFT using in math module
|
||||
set(FFTW_LIB_NAME fftw3)
|
||||
set(FFTW_LIB_SUFFIXES "" "f" "l" "q")
|
||||
set(FFTW_LIB_SUFFIXES "")
|
||||
if (PIP_FFTW_F)
|
||||
list(APPEND FFTW_LIB_SUFFIXES "f")
|
||||
endif()
|
||||
if (PIP_FFTW_L)
|
||||
list(APPEND FFTW_LIB_SUFFIXES "l")
|
||||
endif()
|
||||
if (PIP_FFTW_Q)
|
||||
list(APPEND FFTW_LIB_SUFFIXES "q")
|
||||
endif()
|
||||
if (NOT "${FFTW_LIB_SUFFIXES}" STREQUAL "")
|
||||
set(FFTW_LIB_SUFFIXES ";${FFTW_LIB_SUFFIXES}")
|
||||
else()
|
||||
list(APPEND FFTW_LIB_SUFFIXES "" "_")
|
||||
endif()
|
||||
set(FFTW_LIB_SUFFIXES2 "" "-3")
|
||||
set(FFTW_MSG "")
|
||||
set(FFTW_LIBS)
|
||||
set(FFTW_ABS_LIBS)
|
||||
set(CMAKE_REQUIRED_INCLUDES fftw3.h)
|
||||
@@ -452,6 +470,10 @@ if (NOT CROSSTOOLS)
|
||||
set(${FFTW_CLN}_FOUND FALSE)
|
||||
set(${FFTW_CLNT}_FOUND FALSE)
|
||||
if(${FFTW_CLN}_LIBRARIES)
|
||||
if (NOT "${FFTW_MSG}" STREQUAL "")
|
||||
set(FFTW_MSG "${FFTW_MSG}, ")
|
||||
endif()
|
||||
set(FFTW_MSG "${FFTW_MSG}${FFTW_CLN}")
|
||||
set(${FFTW_CLN}_FOUND TRUE)
|
||||
list(APPEND FFTW_LIBS "${FFTW_CLN}")
|
||||
list(APPEND FFTW_ABS_LIBS "${${FFTW_CLN}_LIBRARIES}")
|
||||
@@ -475,7 +497,7 @@ if (NOT CROSSTOOLS)
|
||||
endforeach()
|
||||
endforeach()
|
||||
if(FFTW_LIBS)
|
||||
pip_module(fftw "${FFTW_LIBS}" "PIP FFTW support" "" "" "")
|
||||
pip_module(fftw "${FFTW_LIBS}" "PIP FFTW support" "" "" " (${FFTW_MSG})")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
||||
BIN
lang/pip_ru.btf
BIN
lang/pip_ru.btf
Binary file not shown.
419
lang/pip_ru.ts
419
lang/pip_ru.ts
@@ -20,7 +20,7 @@
|
||||
<context>
|
||||
<name>PIFile</name>
|
||||
<message>
|
||||
<location filename="../libs/main/io_devices/pifile.cpp" line="300"/>
|
||||
<location filename="../libs/main/io_devices/pifile.cpp" line="296"/>
|
||||
<source>Downsize is not supported yet :-(</source>
|
||||
<translation>Уменьшение размера не поддерживается</translation>
|
||||
</message>
|
||||
@@ -66,6 +66,239 @@
|
||||
<translation type="vanished">Предупреждение: PICrypt неактивен, для активации установите библиотеку sodium и пересоберите PIP</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PIUnits</name>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="88"/>
|
||||
<source>E</source>
|
||||
<translation>Э</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="85"/>
|
||||
<source>G</source>
|
||||
<translation>Г</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="84"/>
|
||||
<source>M</source>
|
||||
<translation>М</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="87"/>
|
||||
<source>P</source>
|
||||
<translation>П</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="92"/>
|
||||
<source>Q</source>
|
||||
<translation>Кв</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="91"/>
|
||||
<source>R</source>
|
||||
<translation>Рн</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="86"/>
|
||||
<source>T</source>
|
||||
<translation>Т</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="90"/>
|
||||
<source>Y</source>
|
||||
<translation>И</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="89"/>
|
||||
<source>Z</source>
|
||||
<translation>З</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="101"/>
|
||||
<source>a</source>
|
||||
<translation>а</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="95"/>
|
||||
<source>c</source>
|
||||
<translation>с</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="94"/>
|
||||
<source>d</source>
|
||||
<translation>д</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="100"/>
|
||||
<source>f</source>
|
||||
<translation>ф</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="82"/>
|
||||
<source>h</source>
|
||||
<translation>г</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="83"/>
|
||||
<source>k</source>
|
||||
<translation>к</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="96"/>
|
||||
<source>m</source>
|
||||
<translation>м</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="98"/>
|
||||
<source>n</source>
|
||||
<translation>н</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="99"/>
|
||||
<source>p</source>
|
||||
<translation>п</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="104"/>
|
||||
<source>r</source>
|
||||
<translation>рн</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="97"/>
|
||||
<source>u</source>
|
||||
<translation>мк</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="103"/>
|
||||
<source>y</source>
|
||||
<translation>и</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="102"/>
|
||||
<source>z</source>
|
||||
<translation>з</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="81"/>
|
||||
<source>da</source>
|
||||
<translation>да</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="88"/>
|
||||
<source>exa</source>
|
||||
<translation>экса</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="101"/>
|
||||
<source>atto</source>
|
||||
<translation>атто</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="81"/>
|
||||
<source>deca</source>
|
||||
<translation>дека</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="94"/>
|
||||
<source>deci</source>
|
||||
<translation>деци</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="85"/>
|
||||
<source>giga</source>
|
||||
<translation>гига</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="83"/>
|
||||
<source>kilo</source>
|
||||
<translation>кило</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="84"/>
|
||||
<source>mega</source>
|
||||
<translation>мега</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="98"/>
|
||||
<source>nano</source>
|
||||
<translation>нано</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="87"/>
|
||||
<source>peta</source>
|
||||
<translation>пета</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="99"/>
|
||||
<source>pico</source>
|
||||
<translation>пико</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="86"/>
|
||||
<source>tera</source>
|
||||
<translation>тера</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="95"/>
|
||||
<source>centi</source>
|
||||
<translation>санти</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="100"/>
|
||||
<source>femto</source>
|
||||
<translation>фемто</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="82"/>
|
||||
<source>hecto</source>
|
||||
<translation>гекто</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="97"/>
|
||||
<source>micro</source>
|
||||
<translation>микро</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="96"/>
|
||||
<source>milli</source>
|
||||
<translation>милли</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="91"/>
|
||||
<source>ronna</source>
|
||||
<translation>ронна</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="104"/>
|
||||
<source>ronto</source>
|
||||
<translation>ронто</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="103"/>
|
||||
<source>yocto</source>
|
||||
<translation>иокто</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="90"/>
|
||||
<source>yotta</source>
|
||||
<translation>иотта</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="102"/>
|
||||
<source>zepto</source>
|
||||
<translation>зепто</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="89"/>
|
||||
<source>zetta</source>
|
||||
<translation>зетта</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_prefix.cpp" line="92"/>
|
||||
<source>quetta</source>
|
||||
<translation>кветта</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PIBinLog</name>
|
||||
<message>
|
||||
@@ -253,47 +486,47 @@
|
||||
<context>
|
||||
<name>PIString</name>
|
||||
<message>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1787"/>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1807"/>
|
||||
<source>B</source>
|
||||
<translation>Б</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1807"/>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1827"/>
|
||||
<source>EiB</source>
|
||||
<translation>ЭиБ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1804"/>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1824"/>
|
||||
<source>GiB</source>
|
||||
<translation>ГиБ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1802"/>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1822"/>
|
||||
<source>KiB</source>
|
||||
<translation>КиБ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1803"/>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1823"/>
|
||||
<source>MiB</source>
|
||||
<translation>МиБ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1806"/>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1826"/>
|
||||
<source>PiB</source>
|
||||
<translation>ПиБ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1805"/>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1825"/>
|
||||
<source>TiB</source>
|
||||
<translation>ТиБ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1809"/>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1829"/>
|
||||
<source>YiB</source>
|
||||
<translation>ЙиБ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1808"/>
|
||||
<location filename="../libs/main/text/pistring.cpp" line="1828"/>
|
||||
<source>ZiB</source>
|
||||
<translation>ЗиБ</translation>
|
||||
</message>
|
||||
@@ -319,7 +552,7 @@
|
||||
<context>
|
||||
<name>PIProcess</name>
|
||||
<message>
|
||||
<location filename="../libs/main/system/piprocess.cpp" line="200"/>
|
||||
<location filename="../libs/main/system/piprocess.cpp" line="316"/>
|
||||
<source>"CreateProcess" error: %1</source>
|
||||
<translation>Ошибка "CreateProcess": %1</translation>
|
||||
</message>
|
||||
@@ -327,12 +560,12 @@
|
||||
<context>
|
||||
<name>PIVariant</name>
|
||||
<message>
|
||||
<location filename="../libs/main/types/pivariant.cpp" line="415"/>
|
||||
<location filename="../libs/main/types/pivariant.cpp" line="418"/>
|
||||
<source>Can`t initialize PIVariant from unregistered type "%1"!</source>
|
||||
<translation>Невозможно инициализировать PIVariant из незарегистрированного типа "%1"!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/types/pivariant.cpp" line="393"/>
|
||||
<location filename="../libs/main/types/pivariant.cpp" line="396"/>
|
||||
<source>Can`t initialize PIVariant from unregistered typeID "%1"!</source>
|
||||
<translation>Невозможно инициализировать PIVariant из незарегистрированного ID типа "%1"!</translation>
|
||||
</message>
|
||||
@@ -358,7 +591,7 @@
|
||||
<context>
|
||||
<name>PIEthernet</name>
|
||||
<message>
|
||||
<location filename="../libs/main/io_devices/piethernet.cpp" line="1272"/>
|
||||
<location filename="../libs/main/io_devices/piethernet.cpp" line="1275"/>
|
||||
<source>Can`t get interfaces: %1</source>
|
||||
<translation>Невозможно получить интерфейсы: %1</translation>
|
||||
</message>
|
||||
@@ -389,6 +622,34 @@
|
||||
<translation>Ошибка: Режим ReadWrite не поддерживается, используйте WriteOnly или ReadOnly</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PIUnitsTime</name>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_time.cpp" line="34"/>
|
||||
<source>s</source>
|
||||
<translation>с</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_time.cpp" line="35"/>
|
||||
<source>Hz</source>
|
||||
<translation>Гц</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_time.cpp" line="26"/>
|
||||
<source>hertz</source>
|
||||
<translation>герц</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_time.cpp" line="25"/>
|
||||
<source>second</source>
|
||||
<translation>секунд</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_time.cpp" line="25"/>
|
||||
<source>secons</source>
|
||||
<translation type="vanished">секунд</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PIConnection</name>
|
||||
<message>
|
||||
@@ -455,6 +716,29 @@
|
||||
<translation>toSystemTime() Предупреждение: неверная частота: %1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PIUnitsAngle</name>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_angle.cpp" line="36"/>
|
||||
<source>°</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_angle.cpp" line="37"/>
|
||||
<source>rad</source>
|
||||
<translation>рад</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_angle.cpp" line="27"/>
|
||||
<source>degree</source>
|
||||
<translation>градусы</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_angle.cpp" line="28"/>
|
||||
<source>radian</source>
|
||||
<translation>радиан</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PIEthUtilBase</name>
|
||||
<message>
|
||||
@@ -528,4 +812,111 @@
|
||||
<translation>Невозможно открыть процесс с ID = %1, %2!</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PIUnitsDistance</name>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_distance.cpp" line="33"/>
|
||||
<source>m</source>
|
||||
<translation>м</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_distance.cpp" line="25"/>
|
||||
<source>meter</source>
|
||||
<translation>метр</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PIUnitsPressure</name>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="36"/>
|
||||
<source>Pa</source>
|
||||
<translation>Па</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="37"/>
|
||||
<source>atm</source>
|
||||
<translation>атм</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="38"/>
|
||||
<source>bar</source>
|
||||
<translation>бар</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="39"/>
|
||||
<source>mmHg</source>
|
||||
<translation>мм рт. ст.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="28"/>
|
||||
<source>mm Hg</source>
|
||||
<translation>мм рт. ст.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="25"/>
|
||||
<source>pascal</source>
|
||||
<translation>паскаль</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_pressure.cpp" line="26"/>
|
||||
<source>atmosphere</source>
|
||||
<translation>атмосфер</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PIUnitsInformation</name>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_information.cpp" line="35"/>
|
||||
<source>B</source>
|
||||
<translation>Б</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_information.cpp" line="34"/>
|
||||
<source>b</source>
|
||||
<translation>б</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_information.cpp" line="25"/>
|
||||
<source>bit</source>
|
||||
<translation>бит</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_information.cpp" line="26"/>
|
||||
<source>byte</source>
|
||||
<translation>байт</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>PIUnitsTemperature</name>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_temperature.cpp" line="35"/>
|
||||
<source>K</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_temperature.cpp" line="36"/>
|
||||
<source>°C</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_temperature.cpp" line="37"/>
|
||||
<source>°F</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_temperature.cpp" line="25"/>
|
||||
<source>Kelvin</source>
|
||||
<translation>Кельвин</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_temperature.cpp" line="26"/>
|
||||
<source>Celsius</source>
|
||||
<translation>Цельсий</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../libs/main/units/piunits_class_temperature.cpp" line="27"/>
|
||||
<source>Fahrenheit</source>
|
||||
<translation>Фаренгейт</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
||||
@@ -189,8 +189,8 @@ void PIScreen::SystemConsole::print() {
|
||||
for (int j = 0; j < dh; ++j) {
|
||||
int k = j * dw + i;
|
||||
Cell & c(cells[j + dy0][i + dx0]);
|
||||
PRIVATE->chars[k].Char.UnicodeChar = 0;
|
||||
PRIVATE->chars[k].Char.AsciiChar = c.symbol.toConsole1Byte();
|
||||
PRIVATE->chars[k].Char.UnicodeChar = c.symbol.unicode16Code();
|
||||
// PRIVATE->chars[k].Char.AsciiChar = c.symbol.toConsole1Byte();
|
||||
PRIVATE->chars[k].Attributes = attributes(c);
|
||||
}
|
||||
// piCout << "draw" << dw << dh;
|
||||
@@ -200,7 +200,7 @@ void PIScreen::SystemConsole::print() {
|
||||
PRIVATE->srect.Top += dy0;
|
||||
PRIVATE->srect.Right -= width - dx1 - 1;
|
||||
PRIVATE->srect.Bottom -= height - dy1 - 1;
|
||||
WriteConsoleOutput(PRIVATE->hOut, PRIVATE->chars.data(), PRIVATE->bs, PRIVATE->bc, &PRIVATE->srect);
|
||||
WriteConsoleOutputW(PRIVATE->hOut, PRIVATE->chars.data(), PRIVATE->bs, PRIVATE->bc, &PRIVATE->srect);
|
||||
#else
|
||||
PIString s;
|
||||
int si = 0, sj = 0;
|
||||
|
||||
@@ -363,5 +363,5 @@ void MicrohttpdServer::addFixedHeaders(MessageMutable & msg) {
|
||||
msg.addHeader(Header::ContentType, "application/json; charset=utf-8");
|
||||
}
|
||||
}
|
||||
msg.addHeader(Header::AccessControlAllowOrigin, "*");
|
||||
// msg.addHeader(Header::AccessControlAllowOrigin, "*");
|
||||
}
|
||||
|
||||
@@ -55,11 +55,12 @@ PIVariant PICodeInfo::getMemberAsVariant(const void * p, const char * class_name
|
||||
|
||||
|
||||
PICodeInfo::__Storage__::__Storage__() {
|
||||
classesInfo = new PIMap<PIConstChars, ClassInfo *>;
|
||||
enumsInfo = new PIMap<PIConstChars, EnumInfo *>;
|
||||
accessValueFunctions = new PIMap<PIConstChars, AccessValueFunction>;
|
||||
accessTypeFunctions = new PIMap<PIConstChars, AccessTypeFunction>;
|
||||
(*enumsInfo)[""] = new EnumInfo();
|
||||
classesInfo = new PIMap<PIConstChars, ClassInfo *>;
|
||||
enumsInfo = new PIMap<PIConstChars, EnumInfo *>;
|
||||
accessValueFunctions = new PIMap<PIConstChars, AccessValueFunction>;
|
||||
accessTypeFunctions = new PIMap<PIConstChars, AccessTypeFunction>;
|
||||
accessOffsetFunctions = new PIMap<PIConstChars, AccessOffsetFunction>;
|
||||
(*enumsInfo)[""] = new EnumInfo();
|
||||
}
|
||||
|
||||
|
||||
@@ -70,6 +71,7 @@ PICodeInfo::__Storage__::~__Storage__() {
|
||||
piDeleteSafety(enumsInfo);
|
||||
piDeleteSafety(accessValueFunctions);
|
||||
piDeleteSafety(accessTypeFunctions);
|
||||
piDeleteSafety(accessOffsetFunctions);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -58,6 +58,7 @@ typedef PIFlags<PICodeInfo::TypeFlag> TypeFlags;
|
||||
typedef PIMap<PIString, PIString> MetaMap;
|
||||
typedef PIByteArray (*AccessValueFunction)(const void *, const char *);
|
||||
typedef const char * (*AccessTypeFunction)(const char *);
|
||||
typedef int (*AccessOffsetFunction)(const char *);
|
||||
|
||||
|
||||
//! \~english Type information
|
||||
@@ -120,15 +121,15 @@ struct PIP_EXPORT FunctionInfo {
|
||||
//! \~english Class or struct information
|
||||
//! \~russian Информация о классе или структуре
|
||||
struct PIP_EXPORT ClassInfo {
|
||||
ClassInfo() { has_name = true; }
|
||||
ClassInfo() { is_anonymous = false; }
|
||||
|
||||
//! \~english Custom PIMETA content
|
||||
//! \~russian Произвольное содержимое PIMETA
|
||||
MetaMap meta;
|
||||
|
||||
//! \~english Has name or not
|
||||
//! \~russian Имеет или нет имя
|
||||
bool has_name;
|
||||
//! \~english Anonymous or not
|
||||
//! \~russian Анонимный или нет
|
||||
bool is_anonymous;
|
||||
|
||||
//! \~english Type
|
||||
//! \~russian Тип
|
||||
@@ -289,66 +290,77 @@ public:
|
||||
PIMap<PIConstChars, PICodeInfo::EnumInfo *> * enumsInfo;
|
||||
PIMap<PIConstChars, PICodeInfo::AccessValueFunction> * accessValueFunctions;
|
||||
PIMap<PIConstChars, PICodeInfo::AccessTypeFunction> * accessTypeFunctions;
|
||||
PIMap<PIConstChars, PICodeInfo::AccessOffsetFunction> * accessOffsetFunctions;
|
||||
|
||||
private:
|
||||
NO_COPY_CLASS(__Storage__)
|
||||
};
|
||||
|
||||
class PIP_EXPORT __StorageAccess__ {
|
||||
public:
|
||||
//! \~english Getter for single storage of PICodeInfo::ClassInfo, access by name
|
||||
//! \~russian Доступ к единому хранилищу PICodeInfo::ClassInfo, доступ по имени
|
||||
static const PIMap<PIConstChars, PICodeInfo::ClassInfo *> & classes() { return *(__Storage__::instance()->classesInfo); }
|
||||
class PIP_EXPORT
|
||||
__StorageAccess__{public:
|
||||
//! \~english Getter for single storage of PICodeInfo::ClassInfo, access by name
|
||||
//! \~russian Доступ к единому хранилищу PICodeInfo::ClassInfo, доступ по имени
|
||||
static const PIMap<PIConstChars, PICodeInfo::ClassInfo *> & classes(){return *(__Storage__::instance()->classesInfo);
|
||||
} // namespace PICodeInfo
|
||||
|
||||
//! \~english Getter for single storage of PICodeInfo::EnumInfo, access by name
|
||||
//! \~russian Доступ к единому хранилищу хранилище PICodeInfo::EnumInfo, доступ по имени
|
||||
static const PIMap<PIConstChars, PICodeInfo::EnumInfo *> & enums() { return *(__Storage__::instance()->enumsInfo); }
|
||||
//! \~english Getter for single storage of PICodeInfo::EnumInfo, access by name
|
||||
//! \~russian Доступ к единому хранилищу хранилище PICodeInfo::EnumInfo, доступ по имени
|
||||
static const PIMap<PIConstChars, PICodeInfo::EnumInfo *> & enums() {
|
||||
return *(__Storage__::instance()->enumsInfo);
|
||||
}
|
||||
|
||||
static const PIMap<PIConstChars, PICodeInfo::AccessValueFunction> & accessValueFunctions() {
|
||||
return *(__Storage__::instance()->accessValueFunctions);
|
||||
}
|
||||
static const PIMap<PIConstChars, PICodeInfo::AccessValueFunction> & accessValueFunctions() {
|
||||
return *(__Storage__::instance()->accessValueFunctions);
|
||||
}
|
||||
|
||||
static const PIMap<PIConstChars, PICodeInfo::AccessTypeFunction> & accessTypeFunctions() {
|
||||
return *(__Storage__::instance()->accessTypeFunctions);
|
||||
}
|
||||
};
|
||||
static const PIMap<PIConstChars, PICodeInfo::AccessTypeFunction> & accessTypeFunctions() {
|
||||
return *(__Storage__::instance()->accessTypeFunctions);
|
||||
}
|
||||
|
||||
static const PIMap<PIConstChars, PICodeInfo::AccessOffsetFunction> & accessOffsetFunctions() {
|
||||
return *(__Storage__::instance()->accessOffsetFunctions);
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
#define PICODEINFO PICodeInfo::__StorageAccess__
|
||||
|
||||
|
||||
class PIP_EXPORT ClassInfoInterface {
|
||||
public:
|
||||
const PIMap<PIConstChars, PICodeInfo::ClassInfo *> * operator->() const DEPRECATEDM("use PICODEINFO::classes()") {
|
||||
return __Storage__::instance()->classesInfo;
|
||||
}
|
||||
};
|
||||
class PIP_EXPORT
|
||||
ClassInfoInterface{public: const PIMap<PIConstChars, PICodeInfo::ClassInfo *> * operator->() const DEPRECATEDM("use PICODEINFO::classes()"){
|
||||
return __Storage__::instance() -> classesInfo;
|
||||
}
|
||||
}
|
||||
;
|
||||
static ClassInfoInterface classesInfo;
|
||||
|
||||
|
||||
class PIP_EXPORT EnumsInfoInterface {
|
||||
public:
|
||||
const PIMap<PIConstChars, PICodeInfo::EnumInfo *> * operator->() const DEPRECATEDM("use PICODEINFO::enums()") {
|
||||
return __Storage__::instance()->enumsInfo;
|
||||
}
|
||||
};
|
||||
class PIP_EXPORT
|
||||
EnumsInfoInterface{public: const PIMap<PIConstChars, PICodeInfo::EnumInfo *> * operator->() const DEPRECATEDM("use PICODEINFO::enums()"){
|
||||
return __Storage__::instance() -> enumsInfo;
|
||||
}
|
||||
}
|
||||
;
|
||||
static EnumsInfoInterface enumsInfo;
|
||||
|
||||
|
||||
class PIP_EXPORT AccessValueFunctionInterface {
|
||||
public:
|
||||
const PIMap<PIConstChars, PICodeInfo::AccessValueFunction> * operator->() const DEPRECATEDM("use PICODEINFO::accessValueFunctions()") {
|
||||
return __Storage__::instance()->accessValueFunctions;
|
||||
}
|
||||
};
|
||||
class PIP_EXPORT AccessValueFunctionInterface{
|
||||
public: const PIMap<PIConstChars, PICodeInfo::AccessValueFunction> * operator->()
|
||||
const DEPRECATEDM("use PICODEINFO::accessValueFunctions()"){
|
||||
return __Storage__::instance() -> accessValueFunctions;
|
||||
}
|
||||
}
|
||||
;
|
||||
static AccessValueFunctionInterface accessValueFunctions;
|
||||
|
||||
|
||||
class PIP_EXPORT AccessTypeFunctionInterface {
|
||||
public:
|
||||
const PIMap<PIConstChars, PICodeInfo::AccessTypeFunction> * operator->() const DEPRECATEDM("use PICODEINFO::accessTypeFunctions()") {
|
||||
return __Storage__::instance()->accessTypeFunctions;
|
||||
}
|
||||
};
|
||||
class PIP_EXPORT AccessTypeFunctionInterface{
|
||||
public: const PIMap<PIConstChars, PICodeInfo::AccessTypeFunction> * operator->()
|
||||
const DEPRECATEDM("use PICODEINFO::accessTypeFunctions()"){
|
||||
return __Storage__::instance() -> accessTypeFunctions;
|
||||
}
|
||||
}
|
||||
;
|
||||
static AccessTypeFunctionInterface accessTypeFunctions;
|
||||
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
|
||||
#include "picodeparser.h"
|
||||
|
||||
#include "piliterals_string.h"
|
||||
|
||||
|
||||
PIString PICodeParser::Macro::expand(PIString args_, bool * ok) const {
|
||||
PIStringList arg_vals;
|
||||
@@ -92,10 +94,10 @@ void PICodeParser::parseFile(const PIString & file, bool follow_includes) {
|
||||
if (c->parent_scope)
|
||||
piCout << "parent" << c->parent_scope->name;
|
||||
piCout << "Functions:";
|
||||
for (const auto & m: c->functions)
|
||||
for (const auto & m: c->functions)
|
||||
piCout << m.type << m.name << m.meta;
|
||||
piCout << "Members:";
|
||||
for (const auto & m: c->members)
|
||||
for (const auto & m: c->members)
|
||||
piCout << m.type << m.name << m.meta;
|
||||
}
|
||||
piCout << "\n\nDefines:";
|
||||
@@ -108,7 +110,7 @@ void PICodeParser::parseFile(const PIString & file, bool follow_includes) {
|
||||
piCout << "\n\nEnums:";
|
||||
for (const auto & c: enums) {
|
||||
piCout << PIStringAscii("enum") << c.name << c.meta;
|
||||
for (const auto & e: c.members)
|
||||
for (const auto & e: c.members)
|
||||
piCout << " " << e.name << '=' << e.value << e.meta;
|
||||
}
|
||||
piCout << "\n\nTypedefs:";
|
||||
@@ -135,7 +137,7 @@ void PICodeParser::parseFiles(const PIStringList & files, bool follow_includes)
|
||||
piCout << PIStringAscii("enum") << c.name << c.members;
|
||||
piCout << "\n\nTypedefs:";
|
||||
for (const auto & c: typedefs)
|
||||
piCout << PIStringAscii("typedef") << c;*/
|
||||
piCout << PIStringAscii("typedef") << c;*/
|
||||
}
|
||||
|
||||
|
||||
@@ -328,7 +330,7 @@ void PICodeParser::clear() {
|
||||
<< "a2"
|
||||
<< "n2"
|
||||
<< "a3"
|
||||
<< "n3");
|
||||
<< "n3");
|
||||
}
|
||||
|
||||
|
||||
@@ -454,7 +456,7 @@ bool PICodeParser::parseFileContent(PIString & fc, bool main) {
|
||||
cur_namespace += pfc.takeCWord() + s_ns;
|
||||
ccmn = pfc.takeRange('{', '}');
|
||||
// piCout << "namespace" << cur_namespace;
|
||||
parseClass(0, ccmn, true);
|
||||
parseClass(nullptr, ccmn, true);
|
||||
cur_namespace = prev_namespace;
|
||||
continue;
|
||||
}
|
||||
@@ -483,8 +485,8 @@ bool PICodeParser::parseFileContent(PIString & fc, bool main) {
|
||||
continue;
|
||||
}
|
||||
ccmn = pfc.left(dind) + s_bo + pfc.mid(dind).takeRange('{', '}') + s_bc;
|
||||
pfc.remove(0, ccmn.size());
|
||||
parseClass(0, ccmn, false);
|
||||
pfc.remove(0, ccmn.size() - 2);
|
||||
parseClass(nullptr, ccmn, false);
|
||||
continue;
|
||||
}
|
||||
if (pfc.left(4) == s_enum) {
|
||||
@@ -499,17 +501,59 @@ bool PICodeParser::parseFileContent(PIString & fc, bool main) {
|
||||
meta << smeta;
|
||||
}
|
||||
// piCout << "pfc E" << cur_namespace << "," << tmp;
|
||||
parseEnum(0, cur_namespace + tmp, pfc.takeRange('{', '}'), meta);
|
||||
parseEnum(nullptr, cur_namespace + tmp, pfc.takeRange('{', '}'), meta);
|
||||
pfc.takeSymbol();
|
||||
continue;
|
||||
}
|
||||
if (pfc.left(7) == s_typedef) {
|
||||
pfc.cutLeft(7);
|
||||
typedefs << parseTypedef(pfc.takeLeft(pfc.find(';')));
|
||||
if (typedefs.back().first.isEmpty())
|
||||
typedefs.pop_back();
|
||||
else
|
||||
root_.typedefs << typedefs.back();
|
||||
PIString typedef_type = pfc.takeCWord();
|
||||
if (typedef_type == s_class || typedef_type == s_struct || typedef_type == s_union) {
|
||||
int dind = pfc.find('{', 0), find = pfc.find(';', 0);
|
||||
if (dind < 0 && find < 0) {
|
||||
pfc.cutLeft(6);
|
||||
continue;
|
||||
}
|
||||
if (dind < 0 || find < dind) {
|
||||
pfc.cutLeft(find + 1);
|
||||
continue;
|
||||
}
|
||||
PIString cname = pfc.left(dind);
|
||||
ccmn = cname + s_bo + pfc.mid(dind).takeRange('{', '}') + s_bc;
|
||||
pfc.remove(0, ccmn.size() - 3);
|
||||
if (cname.trimmed().isEmpty()) {
|
||||
cname = pfc.takeCWord();
|
||||
ccmn.prepend(cname);
|
||||
}
|
||||
ccmn.prepend(typedef_type + " "_a);
|
||||
parseClass(nullptr, ccmn, false);
|
||||
} else if (typedef_type == s_enum) {
|
||||
tmp = pfc.takeCWord();
|
||||
pfc.trim();
|
||||
MetaMap meta = maybeMeta(pfc);
|
||||
if (tmp == s_class || tmp == s_struct) {
|
||||
tmp = pfc.takeCWord();
|
||||
pfc.trim();
|
||||
MetaMap smeta = maybeMeta(pfc);
|
||||
meta << smeta;
|
||||
}
|
||||
ccmn = pfc.takeRange('{', '}');
|
||||
if (tmp.isEmpty()) {
|
||||
tmp = pfc.takeCWord();
|
||||
}
|
||||
// piCout << "pfc E" << cur_namespace << "," << tmp;
|
||||
parseEnum(nullptr, cur_namespace + tmp, ccmn, meta);
|
||||
} else {
|
||||
pfc.prepend(typedef_type);
|
||||
}
|
||||
PIString last = pfc.takeLeft(pfc.find(';')).trim();
|
||||
if (last.isNotEmpty()) {
|
||||
typedefs << parseTypedef(last);
|
||||
if (typedefs.back().first.isEmpty())
|
||||
typedefs.pop_back();
|
||||
else
|
||||
root_.typedefs << typedefs.back();
|
||||
}
|
||||
pfc.takeSymbol();
|
||||
continue;
|
||||
}
|
||||
@@ -567,24 +611,23 @@ PICodeParser::Entity * PICodeParser::parseClassDeclaration(const PIString & fc)
|
||||
Visibility vis = cur_def_vis;
|
||||
cur_def_vis = (is_class ? Private : Public);
|
||||
PIString cn = cd.mid(6).trim();
|
||||
bool has_name = !cn.isEmpty();
|
||||
bool is_anonymous = cn.isEmpty();
|
||||
if (cn.isEmpty()) cn = PIStringAscii("<unnamed_") + PIString::fromNumber(anon_num++) + '>';
|
||||
// piCout << "found " << typename_ << cn;
|
||||
if (cn.isEmpty()) return nullptr;
|
||||
Entity * e = new Entity();
|
||||
e->meta = meta;
|
||||
e->name = cur_namespace + cn;
|
||||
e->type = typename_;
|
||||
e->has_name = has_name;
|
||||
e->parents = parents;
|
||||
e->visibility = vis;
|
||||
e->file = cur_file;
|
||||
Entity * e = new Entity();
|
||||
e->meta = meta;
|
||||
e->name = cur_namespace + cn;
|
||||
e->type = typename_;
|
||||
e->is_anonymous = is_anonymous;
|
||||
e->parents = parents;
|
||||
e->visibility = vis;
|
||||
e->file = cur_file;
|
||||
entities << e;
|
||||
return e;
|
||||
}
|
||||
|
||||
|
||||
void PICodeParser::parseClass(Entity * parent, PIString & fc, bool is_namespace) {
|
||||
PICodeParser::Entity * PICodeParser::parseClass(Entity * parent, PIString & fc, bool is_namespace) {
|
||||
static const PIString s_ns = PIStringAscii("::");
|
||||
static const PIString s_public = PIStringAscii("public");
|
||||
static const PIString s_protected = PIStringAscii("protected");
|
||||
@@ -599,7 +642,7 @@ void PICodeParser::parseClass(Entity * parent, PIString & fc, bool is_namespace)
|
||||
static const PIString s_template = PIStringAscii("template");
|
||||
Visibility prev_vis = cur_def_vis;
|
||||
int dind = fc.find('{'), find = fc.find(';'), end = 0;
|
||||
if (dind < 0 && find < 0) return;
|
||||
if (dind < 0 && find < 0) return nullptr;
|
||||
// piCout << "parse class <****\n" << fc << "\n****>";
|
||||
Entity * ce = parent;
|
||||
if (!is_namespace) {
|
||||
@@ -608,7 +651,6 @@ void PICodeParser::parseClass(Entity * parent, PIString & fc, bool is_namespace)
|
||||
}
|
||||
// piCout << "found class <****\n" << fc << "\n****>";
|
||||
if (ce) {
|
||||
if (parent) parent->children << ce;
|
||||
ce->parent_scope = parent;
|
||||
}
|
||||
int ps = -1;
|
||||
@@ -650,11 +692,29 @@ void PICodeParser::parseClass(Entity * parent, PIString & fc, bool is_namespace)
|
||||
fc.takeSymbol();
|
||||
continue;
|
||||
}
|
||||
tmp = fc.takeLeft(fc.find('{'));
|
||||
stmp = fc.takeRange('{', '}');
|
||||
fc.takeSymbol();
|
||||
stmp = cw + ' ' + tmp + '{' + stmp + '}';
|
||||
parseClass(ce, stmp, false);
|
||||
tmp = fc.takeLeft(fc.find('{')).trim();
|
||||
stmp = fc.takeRange('{', '}');
|
||||
stmp = cw + ' ' + tmp + '{' + stmp + '}';
|
||||
auto new_entity = parseClass(ce, stmp, false);
|
||||
// piCout << "!!! > \"" << fc << "\"";
|
||||
PIStringList vars;
|
||||
PIString var;
|
||||
do {
|
||||
var = fc.takeCWord();
|
||||
if (var.isNotEmpty()) vars << var;
|
||||
if (fc.takeSymbol() == ";") break;
|
||||
} while (var.isNotEmpty());
|
||||
if (new_entity) {
|
||||
Member me;
|
||||
me.visibility = cur_def_vis;
|
||||
me.type = new_entity->name;
|
||||
if (tmp.isEmpty() && vars.isEmpty()) vars = {""};
|
||||
for (const auto & v: vars) {
|
||||
me.name = v;
|
||||
ce->members << me;
|
||||
}
|
||||
}
|
||||
// piCout << "!!! <" << vars;
|
||||
continue;
|
||||
}
|
||||
if (cw == s_enum) {
|
||||
@@ -710,6 +770,7 @@ void PICodeParser::parseClass(Entity * parent, PIString & fc, bool is_namespace)
|
||||
}
|
||||
cur_def_vis = prev_vis;
|
||||
cur_namespace = prev_namespace;
|
||||
return ce;
|
||||
}
|
||||
|
||||
|
||||
@@ -766,7 +827,7 @@ bool PICodeParser::parseEnum(Entity * parent, const PIString & name, PIString fc
|
||||
|
||||
|
||||
PICodeParser::Typedef PICodeParser::parseTypedef(PIString fc) {
|
||||
// piCout << "parse typedef" << fc;
|
||||
// piCout << "parse typedef \"" << fc << "\"";
|
||||
Typedef td;
|
||||
fc.replaceAll('\t', ' ');
|
||||
|
||||
@@ -1197,7 +1258,7 @@ void PICodeParser::replaceMeta(PIString & dn) {
|
||||
PICodeParser::Entity * PICodeParser::findEntityByName(const PIString & en) {
|
||||
for (auto * e: entities)
|
||||
if (e->name == en) return e;
|
||||
return 0;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
struct PIP_EXPORT Entity {
|
||||
Entity() {
|
||||
visibility = Global;
|
||||
has_name = true;
|
||||
is_anonymous = false;
|
||||
size = 0;
|
||||
parent_scope = 0;
|
||||
}
|
||||
@@ -110,10 +110,9 @@ public:
|
||||
PIString file;
|
||||
Visibility visibility;
|
||||
int size;
|
||||
bool has_name;
|
||||
bool is_anonymous;
|
||||
Entity * parent_scope;
|
||||
PIVector<Entity *> parents;
|
||||
PIVector<Entity *> children;
|
||||
PIVector<Member> functions;
|
||||
PIVector<Member> members;
|
||||
PIVector<Typedef> typedefs;
|
||||
@@ -164,7 +163,7 @@ private:
|
||||
bool parseFileContent(PIString & fc, bool main);
|
||||
bool parseDirective(PIString d);
|
||||
Entity * parseClassDeclaration(const PIString & fc);
|
||||
void parseClass(Entity * parent, PIString & fc, bool is_namespace);
|
||||
Entity * parseClass(Entity * parent, PIString & fc, bool is_namespace);
|
||||
MetaMap parseMeta(PIString & fc);
|
||||
bool parseEnum(Entity * parent, const PIString & name, PIString fc, const MetaMap & meta);
|
||||
Typedef parseTypedef(PIString fc);
|
||||
|
||||
@@ -365,8 +365,8 @@ public:
|
||||
return *this;
|
||||
}
|
||||
if (other.size() == 2) {
|
||||
insert(other.pim_index[0].key, other.pim_content[0]);
|
||||
insert(other.pim_index[1].key, other.pim_content[1]);
|
||||
insert(other.pim_index[0].key, other.pim_content[other.pim_index[0].index]);
|
||||
insert(other.pim_index[1].key, other.pim_content[other.pim_index[1].index]);
|
||||
return *this;
|
||||
}
|
||||
for (int i = 0; i < other.pim_index.size_s(); ++i) {
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Base macros
|
||||
Base macros
|
||||
Ivan Pelipenko peri4ko@yandex.ru
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
@@ -333,9 +333,10 @@ typedef long long ssize_t;
|
||||
__PrivateInitializer__ __privateinitializer__;
|
||||
|
||||
# define PRIVATE_DEFINITION_START(c) struct c::__Private__ {
|
||||
# define PRIVATE_DEFINITION_END(c) \
|
||||
} \
|
||||
; \
|
||||
# define PRIVATE_DEFINITION_END_NO_INITIALIZE(c) \
|
||||
} \
|
||||
;
|
||||
# define PRIVATE_DEFINITION_INITIALIZE(c) \
|
||||
c::__PrivateInitializer__::__PrivateInitializer__() { \
|
||||
p = new c::__Private__(); \
|
||||
} \
|
||||
@@ -350,6 +351,10 @@ typedef long long ssize_t;
|
||||
p = new c::__Private__(); \
|
||||
return *this; \
|
||||
}
|
||||
# define PRIVATE_DEFINITION_END(c) \
|
||||
PRIVATE_DEFINITION_END_NO_INITIALIZE \
|
||||
(c) PRIVATE_DEFINITION_INITIALIZE(c)
|
||||
|
||||
|
||||
# define PRIVATE (__privateinitializer__.p)
|
||||
# define PRIVATEWB __privateinitializer__.p
|
||||
|
||||
@@ -13,51 +13,51 @@ public:
|
||||
};
|
||||
|
||||
|
||||
//! ~english Main HTTP client class for performing requests with event callbacks.
|
||||
//! ~russian Основной класс HTTP-клиента для выполнения запросов с callback-ми событий.
|
||||
//! \~english Main HTTP client class for performing requests with event callbacks.
|
||||
//! \~russian Основной класс HTTP-клиента для выполнения запросов с callback-ми событий.
|
||||
class PIP_HTTP_CLIENT_EXPORT PIHTTPClient: private PIHTTPClientBase {
|
||||
friend class PIHTTPClientBase;
|
||||
friend class CurlThreadPool;
|
||||
|
||||
public:
|
||||
//! ~english Creates a new HTTP request instance with the specified URL, method and message.
|
||||
//! ~russian Создает новый экземпляр HTTP-запроса с указанным URL, методом и сообщением.
|
||||
//! \~english Creates a new HTTP request instance with the specified URL, method and message.
|
||||
//! \~russian Создает новый экземпляр HTTP-запроса с указанным URL, методом и сообщением.
|
||||
static PIHTTPClient * create(const PIString & url, PIHTTP::Method method = PIHTTP::Method::Get, const PIHTTP::MessageConst & req = {});
|
||||
|
||||
//! ~english Sets a callback for successful request completion (no parameters).
|
||||
//! ~russian Устанавливает callback для успешного завершения запроса (без параметров).
|
||||
//! \~english Sets a callback for successful request completion (no parameters).
|
||||
//! \~russian Устанавливает callback для успешного завершения запроса (без параметров).
|
||||
PIHTTPClient * onFinish(std::function<void()> f);
|
||||
|
||||
//! ~english Sets a callback for successful request completion (with response).
|
||||
//! ~russian Устанавливает callback для успешного завершения запроса (с ответом).
|
||||
//! \~english Sets a callback for successful request completion (with response).
|
||||
//! \~russian Устанавливает callback для успешного завершения запроса (с ответом).
|
||||
PIHTTPClient * onFinish(std::function<void(const PIHTTP::MessageConst &)> f);
|
||||
|
||||
//! ~english Sets a callback for request errors (no parameters).
|
||||
//! ~russian Устанавливает callback для ошибок запроса (без параметров).
|
||||
//! \~english Sets a callback for request errors (no parameters).
|
||||
//! \~russian Устанавливает callback для ошибок запроса (без параметров).
|
||||
PIHTTPClient * onError(std::function<void()> f);
|
||||
|
||||
//! ~english Sets a callback for request errors (with error response).
|
||||
//! ~russian Устанавливает callback для ошибок запроса (с ответом об ошибке).
|
||||
//! \~english Sets a callback for request errors (with error response).
|
||||
//! \~russian Устанавливает callback для ошибок запроса (с ответом об ошибке).
|
||||
PIHTTPClient * onError(std::function<void(const PIHTTP::MessageConst &)> f);
|
||||
|
||||
//! ~english Sets a callback for request abortion (no parameters).
|
||||
//! ~russian Устанавливает callback для прерывания запроса (без параметров).
|
||||
//! \~english Sets a callback for request abortion (no parameters).
|
||||
//! \~russian Устанавливает callback для прерывания запроса (без параметров).
|
||||
PIHTTPClient * onAbort(std::function<void()> f);
|
||||
|
||||
//! ~english Sets a callback for request abortion (with abort response).
|
||||
//! ~russian Устанавливает callback для прерывания запроса (с ответом о прерывании).
|
||||
//! \~english Sets a callback for request abortion (with abort response).
|
||||
//! \~russian Устанавливает callback для прерывания запроса (с ответом о прерывании).
|
||||
PIHTTPClient * onAbort(std::function<void(const PIHTTP::MessageConst &)> f);
|
||||
|
||||
//! ~english Starts the HTTP request execution.
|
||||
//! ~russian Начинает выполнение HTTP-запроса.
|
||||
//! \~english Starts the HTTP request execution.
|
||||
//! \~russian Начинает выполнение HTTP-запроса.
|
||||
void start();
|
||||
|
||||
//! ~english Aborts the current HTTP request.
|
||||
//! ~russian Прерывает текущий HTTP-запрос.
|
||||
//! \~english Aborts the current HTTP request.
|
||||
//! \~russian Прерывает текущий HTTP-запрос.
|
||||
void abort();
|
||||
|
||||
//! ~english Returns the last error message.
|
||||
//! ~russian Возвращает последнее сообщение об ошибке.
|
||||
//! \~english Returns the last error message.
|
||||
//! \~russian Возвращает последнее сообщение об ошибке.
|
||||
PIString lastError() const { return last_error; }
|
||||
|
||||
private:
|
||||
|
||||
@@ -9,68 +9,68 @@
|
||||
namespace PIHTTP {
|
||||
|
||||
|
||||
//! ~english Immutable HTTP message container with accessors for message components
|
||||
//! ~russian Контейнер для неизменяемого HTTP-сообщения с методами доступа к компонентам
|
||||
//! \~english Immutable HTTP message container with accessors for message components
|
||||
//! \~russian Контейнер для неизменяемого HTTP-сообщения с методами доступа к компонентам
|
||||
class PIP_EXPORT MessageConst {
|
||||
public:
|
||||
//! ~english Gets the HTTP method used in the message
|
||||
//! ~russian Возвращает HTTP-метод, использованный в сообщении
|
||||
//! \~english Gets the HTTP method used in the message
|
||||
//! \~russian Возвращает HTTP-метод, использованный в сообщении
|
||||
PIHTTP::Method method() const { return m_method; }
|
||||
|
||||
//! ~english Gets the HTTP status code
|
||||
//! ~russian Возвращает HTTP-статус код
|
||||
//! \~english Gets the HTTP status code
|
||||
//! \~russian Возвращает HTTP-статус код
|
||||
PIHTTP::Code code() const { return m_code; }
|
||||
|
||||
//! ~english Checks if status code is informational (1xx)
|
||||
//! ~russian Проверяет, является ли статус код информационным (1xx)
|
||||
//! \~english Checks if status code is informational (1xx)
|
||||
//! \~russian Проверяет, является ли статус код информационным (1xx)
|
||||
bool isCodeInformational() const;
|
||||
|
||||
//! ~english Checks if status code indicates success (2xx)
|
||||
//! ~russian Проверяет, указывает ли статус код на успех (2xx)
|
||||
//! \~english Checks if status code indicates success (2xx)
|
||||
//! \~russian Проверяет, указывает ли статус код на успех (2xx)
|
||||
bool isCodeSuccess() const;
|
||||
|
||||
//! ~english Checks if status code indicates redirection (3xx)
|
||||
//! ~russian Проверяет, указывает ли статус код на перенаправление (3xx)
|
||||
//! \~english Checks if status code indicates redirection (3xx)
|
||||
//! \~russian Проверяет, указывает ли статус код на перенаправление (3xx)
|
||||
bool isCodeRedirection() const;
|
||||
|
||||
//! ~english Checks if status code indicates client error (4xx)
|
||||
//! ~russian Проверяет, указывает ли статус код на ошибку клиента (4xx)
|
||||
//! \~english Checks if status code indicates client error (4xx)
|
||||
//! \~russian Проверяет, указывает ли статус код на ошибку клиента (4xx)
|
||||
bool isCodeClientError() const;
|
||||
|
||||
//! ~english Checks if status code indicates server error (5xx)
|
||||
//! ~russian Проверяет, указывает ли статус код на ошибку сервера (5xx)
|
||||
//! \~english Checks if status code indicates server error (5xx)
|
||||
//! \~russian Проверяет, указывает ли статус код на ошибку сервера (5xx)
|
||||
bool isCodeServerError() const;
|
||||
|
||||
//! ~english Checks if status code indicates any error (4xx or 5xx)
|
||||
//! ~russian Проверяет, указывает ли статус код на любую ошибку (4xx или 5xx)
|
||||
//! \~english Checks if status code indicates any error (4xx or 5xx)
|
||||
//! \~russian Проверяет, указывает ли статус код на любую ошибку (4xx или 5xx)
|
||||
bool isCodeError() const { return isCodeClientError() || isCodeServerError(); }
|
||||
|
||||
//! ~english Gets the request/response path
|
||||
//! ~russian Возвращает путь запроса/ответа
|
||||
//! \~english Gets the request/response path
|
||||
//! \~russian Возвращает путь запроса/ответа
|
||||
const PIString & path() const { return m_path; }
|
||||
|
||||
//! ~english Gets path components as list
|
||||
//! ~russian Возвращает компоненты пути в виде списка
|
||||
//! \~english Gets path components as list
|
||||
//! \~russian Возвращает компоненты пути в виде списка
|
||||
PIStringList pathList() const { return m_path.split('/').removeAll({}); }
|
||||
|
||||
//! ~english Gets the message body
|
||||
//! ~russian Возвращает тело сообщения
|
||||
//! \~english Gets the message body
|
||||
//! \~russian Возвращает тело сообщения
|
||||
const PIByteArray & body() const { return m_body; }
|
||||
|
||||
//! ~english Gets all message headers
|
||||
//! ~russian Возвращает все заголовки сообщения
|
||||
//! \~english Gets all message headers
|
||||
//! \~russian Возвращает все заголовки сообщения
|
||||
const PIMap<PIString, PIString> & headers() const { return m_headers; }
|
||||
|
||||
//! ~english Gets URL query arguments
|
||||
//! ~russian Возвращает URL query аргументы
|
||||
//! \~english Gets URL query arguments
|
||||
//! \~russian Возвращает URL query аргументы
|
||||
const PIMap<PIString, PIString> & queryArguments() const { return m_query_arguments; }
|
||||
|
||||
//! ~english Gets URL path arguments
|
||||
//! ~russian Возвращает URL path аргументы
|
||||
//! \~english Gets URL path arguments
|
||||
//! \~russian Возвращает URL path аргументы
|
||||
const PIMap<PIString, PIString> & pathArguments() const { return m_path_arguments; }
|
||||
|
||||
//! ~english Gets all message arguments (query + path)
|
||||
//! ~russian Возвращает все аргументы сообщения (query + path)
|
||||
//! \~english Gets all message arguments (query + path)
|
||||
//! \~russian Возвращает все аргументы сообщения (query + path)
|
||||
const PIMap<PIString, PIString> & arguments() const { return m_arguments; }
|
||||
|
||||
protected:
|
||||
@@ -83,24 +83,24 @@ protected:
|
||||
};
|
||||
|
||||
|
||||
//! ~english Mutable HTTP message container with modifiers for message components
|
||||
//! ~russian Контейнер для изменяемого HTTP-сообщения с методами модификации
|
||||
//! \~english Mutable HTTP message container with modifiers for message components
|
||||
//! \~russian Контейнер для изменяемого HTTP-сообщения с методами модификации
|
||||
class PIP_EXPORT MessageMutable: public MessageConst {
|
||||
public:
|
||||
//! ~english Sets the HTTP method
|
||||
//! ~russian Устанавливает HTTP-метод
|
||||
//! \~english Sets the HTTP method
|
||||
//! \~russian Устанавливает HTTP-метод
|
||||
MessageMutable & setMethod(PIHTTP::Method m);
|
||||
|
||||
//! ~english Sets the HTTP status code
|
||||
//! ~russian Устанавливает HTTP-статус код
|
||||
//! \~english Sets the HTTP status code
|
||||
//! \~russian Устанавливает HTTP-статус код
|
||||
MessageMutable & setCode(PIHTTP::Code c);
|
||||
|
||||
//! ~english Sets the request/response path
|
||||
//! ~russian Устанавливает путь запроса/ответа
|
||||
//! \~english Sets the request/response path
|
||||
//! \~russian Устанавливает путь запроса/ответа
|
||||
MessageMutable & setPath(PIString p);
|
||||
|
||||
//! ~english Sets the message body
|
||||
//! ~russian Устанавливает тело сообщения
|
||||
//! \~english Sets the message body
|
||||
//! \~russian Устанавливает тело сообщения
|
||||
MessageMutable & setBody(PIByteArray b);
|
||||
|
||||
const PIMap<PIString, PIString> & headers() const { return m_headers; }
|
||||
@@ -111,50 +111,50 @@ public:
|
||||
|
||||
PIMap<PIString, PIString> & headers() { return m_headers; }
|
||||
|
||||
//! ~english Adds a header to the message
|
||||
//! ~russian Добавляет заголовок к сообщению
|
||||
//! \~english Adds a header to the message
|
||||
//! \~russian Добавляет заголовок к сообщению
|
||||
MessageMutable & addHeader(const PIString & header, const PIString & value);
|
||||
|
||||
//! ~english Removes a header from the message
|
||||
//! ~russian Удаляет заголовок из сообщения
|
||||
//! \~english Removes a header from the message
|
||||
//! \~russian Удаляет заголовок из сообщения
|
||||
MessageMutable & removeHeader(const PIString & header);
|
||||
|
||||
//! ~english Gets reference to URL query arguments
|
||||
//! ~russian Возвращает ссылку на URL query аргументы
|
||||
//! \~english Gets reference to URL query arguments
|
||||
//! \~russian Возвращает ссылку на URL query аргументы
|
||||
PIMap<PIString, PIString> & queryArguments() { return m_query_arguments; }
|
||||
|
||||
//! ~english Adds an URL query argument to the message
|
||||
//! ~russian Добавляет URL query аргумент к сообщению
|
||||
//! \~english Adds an URL query argument to the message
|
||||
//! \~russian Добавляет URL query аргумент к сообщению
|
||||
MessageMutable & addQueryArgument(const PIString & arg, const PIString & value);
|
||||
|
||||
//! ~english Removes an URL query argument from the message
|
||||
//! ~russian Удаляет URL query аргумент из сообщения
|
||||
//! \~english Removes an URL query argument from the message
|
||||
//! \~russian Удаляет URL query аргумент из сообщения
|
||||
MessageMutable & removeQueryArgument(const PIString & arg);
|
||||
|
||||
//! ~english Gets reference to URL path arguments
|
||||
//! ~russian Возвращает ссылку на URL path аргументы
|
||||
//! \~english Gets reference to URL path arguments
|
||||
//! \~russian Возвращает ссылку на URL path аргументы
|
||||
PIMap<PIString, PIString> & pathArguments() { return m_path_arguments; }
|
||||
|
||||
//! ~english Adds an URL path argument to the message
|
||||
//! ~russian Добавляет URL path аргумент к сообщению
|
||||
//! \~english Adds an URL path argument to the message
|
||||
//! \~russian Добавляет URL path аргумент к сообщению
|
||||
MessageMutable & addPathArgument(const PIString & arg, const PIString & value);
|
||||
|
||||
//! ~english Removes an URL path argument from the message
|
||||
//! ~russian Удаляет URL query path из сообщения
|
||||
//! \~english Removes an URL path argument from the message
|
||||
//! \~russian Удаляет URL query path из сообщения
|
||||
MessageMutable & removePathArgument(const PIString & arg);
|
||||
|
||||
//! ~english Creates message from HTTP status code
|
||||
//! ~russian Создает сообщение из HTTP-статус кода
|
||||
//! \~english Creates message from HTTP status code
|
||||
//! \~russian Создает сообщение из HTTP-статус кода
|
||||
static MessageMutable fromCode(PIHTTP::Code c);
|
||||
|
||||
//! ~english Creates message from HTTP method
|
||||
//! ~russian Создает сообщение из HTTP-метода
|
||||
//! \~english Creates message from HTTP method
|
||||
//! \~russian Создает сообщение из HTTP-метода
|
||||
static MessageMutable fromMethod(PIHTTP::Method m);
|
||||
};
|
||||
|
||||
|
||||
//! ~english Gets string representation of HTTP method
|
||||
//! ~russian Возвращает строковое представление HTTP-метода
|
||||
//! \~english Gets string representation of HTTP method
|
||||
//! \~russian Возвращает строковое представление HTTP-метода
|
||||
PIP_EXPORT const char * methodName(Method m);
|
||||
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
|
||||
struct MicrohttpdServerConnection;
|
||||
|
||||
//! ~english Base HTTP server class implementing core functionality
|
||||
//! ~runnan Базовый класс HTTP сервера, реализующий основную функциональность
|
||||
//! \~english Base HTTP server class implementing core functionality
|
||||
//! \~russian Базовый класс HTTP сервера, реализующий основную функциональность
|
||||
class PIP_HTTP_SERVER_EXPORT MicrohttpdServer: public PIObject {
|
||||
PIOBJECT(MicrohttpdServer)
|
||||
friend struct MicrohttpdServerConnection;
|
||||
@@ -17,75 +17,75 @@ public:
|
||||
MicrohttpdServer();
|
||||
virtual ~MicrohttpdServer();
|
||||
|
||||
//! ~english Server configuration options
|
||||
//! ~russian Опции конфигурации сервера
|
||||
//! \~english Server configuration options
|
||||
//! \~russian Опции конфигурации сервера
|
||||
enum class Option {
|
||||
ConnectionLimit, //!< ~english Maximum concurrent connections
|
||||
//!< ~russian Максимальное количество соединений
|
||||
ConnectionTimeout, //!< ~english Connection timeout in seconds
|
||||
//!< ~russian Таймаут соединения в секундах
|
||||
HTTPSEnabled, //!< ~english Enable HTTPS support
|
||||
//!< ~russian Включить поддержку HTTPS
|
||||
HTTPSMemKey, //!< ~english SSL key in memory (PIByteArray)
|
||||
//!< ~russian SSL ключ в памяти (PIByteArray)
|
||||
HTTPSMemCert, //!< ~english SSL certificate in memory (PIByteArray)
|
||||
//!< ~russian SSL сертификат в памяти (PIByteArray)
|
||||
HTTPSKeyPassword //!< ~english SSL key password (PIByteArray)
|
||||
//!< ~russian Пароль SSL ключа (PIByteArray)
|
||||
ConnectionLimit, //!< \~english Maximum concurrent connections
|
||||
//!< \~russian Максимальное количество соединений
|
||||
ConnectionTimeout, //!< \~english Connection timeout in seconds
|
||||
//!< \~russian Таймаут соединения в секундах
|
||||
HTTPSEnabled, //!< \~english Enable HTTPS support
|
||||
//!< \~russian Включить поддержку HTTPS
|
||||
HTTPSMemKey, //!< \~english SSL key in memory (PIByteArray)
|
||||
//!< \~russian SSL ключ в памяти (PIByteArray)
|
||||
HTTPSMemCert, //!< \~english SSL certificate in memory (PIByteArray)
|
||||
//!< \~russian SSL сертификат в памяти (PIByteArray)
|
||||
HTTPSKeyPassword //!< \~english SSL key password (PIByteArray)
|
||||
//!< \~russian Пароль SSL ключа (PIByteArray)
|
||||
};
|
||||
|
||||
//! ~english Sets server option
|
||||
//! ~russian Устанавливает опцию сервера
|
||||
//! \~english Sets server option
|
||||
//! \~russian Устанавливает опцию сервера
|
||||
void setOption(Option o, PIVariant v);
|
||||
|
||||
//! ~english Sets server favicon
|
||||
//! ~russian Устанавливает фавикон сервера
|
||||
//! \~english Sets server favicon
|
||||
//! \~russian Устанавливает фавикон сервера
|
||||
void setFavicon(const PIByteArray & im);
|
||||
|
||||
|
||||
//! ~english Starts server on specified address
|
||||
//! ~russian Запускает сервер на указанном адресе
|
||||
//! \~english Starts server on specified address
|
||||
//! \~russian Запускает сервер на указанном адресе
|
||||
bool listen(PINetworkAddress addr);
|
||||
|
||||
//! ~english Starts server on all interfaces
|
||||
//! ~russian Запускает сервер на всех интерфейсах
|
||||
//! \~english Starts server on all interfaces
|
||||
//! \~russian Запускает сервер на всех интерфейсах
|
||||
bool listenAll(ushort port) { return listen({0, port}); }
|
||||
|
||||
//! ~english Checks if server is running
|
||||
//! ~russian Проверяет, работает ли сервер
|
||||
//! \~english Checks if server is running
|
||||
//! \~russian Проверяет, работает ли сервер
|
||||
bool isListen() const;
|
||||
|
||||
//! ~english Stops the server
|
||||
//! ~russian Останавливает сервер
|
||||
//! \~english Stops the server
|
||||
//! \~russian Останавливает сервер
|
||||
void stop();
|
||||
|
||||
|
||||
//! ~english Enables basic authentication
|
||||
//! ~russian Включает базовую аутентификацию
|
||||
//! \~english Enables basic authentication
|
||||
//! \~russian Включает базовую аутентификацию
|
||||
void enableBasicAuth() { setBasicAuthEnabled(true); }
|
||||
|
||||
//! ~english Disables basic authentication
|
||||
//! ~russian Выключает базовую аутентификацию
|
||||
//! \~english Disables basic authentication
|
||||
//! \~russian Выключает базовую аутентификацию
|
||||
void disableBasicAuth() { setBasicAuthEnabled(false); }
|
||||
|
||||
//! ~english Set basic authentication enabled to "yes"
|
||||
//! ~russian Устанавливает базовую аутентификацию в "yes"
|
||||
//! \~english Set basic authentication enabled to "yes"
|
||||
//! \~russian Устанавливает базовую аутентификацию в "yes"
|
||||
void setBasicAuthEnabled(bool yes) { use_basic_auth = yes; }
|
||||
|
||||
//! ~english Return if basic authentication enabled
|
||||
//! ~russian Возвращает включена ли базовая аутентификация
|
||||
//! \~english Return if basic authentication enabled
|
||||
//! \~russian Возвращает включена ли базовая аутентификация
|
||||
bool isBasicAuthEnabled() const { return use_basic_auth; }
|
||||
|
||||
//! ~english Sets basic authentication realm
|
||||
//! ~russian Устанавливает область аутентификации
|
||||
//! \~english Sets basic authentication realm
|
||||
//! \~russian Устанавливает область аутентификации
|
||||
void setBasicAuthRealm(const PIString & r) { realm = r; }
|
||||
|
||||
//! ~english Sets request processing callback
|
||||
//! ~russian Устанавливает callback для обработки запросов
|
||||
//! \~english Sets request processing callback
|
||||
//! \~russian Устанавливает callback для обработки запросов
|
||||
void setRequestCallback(std::function<PIHTTP::MessageMutable(const PIHTTP::MessageConst &)> c) { callback = c; }
|
||||
|
||||
//! ~english Sets basic authentication callback
|
||||
//! ~russian Устанавливает callback для базовой аутентификации
|
||||
//! \~english Sets basic authentication callback
|
||||
//! \~russian Устанавливает callback для базовой аутентификации
|
||||
void setBasicAuthCallback(std::function<bool(const PIString &, const PIString &)> c) { callback_auth = c; }
|
||||
|
||||
private:
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
#include "microhttpd_server.h"
|
||||
|
||||
//! ~english HTTP server
|
||||
//! ~russian HTTP сервер
|
||||
//! \~english HTTP server
|
||||
//! \~russian HTTP сервер
|
||||
class PIP_HTTP_SERVER_EXPORT PIHTTPServer: public MicrohttpdServer {
|
||||
PIOBJECT_SUBCLASS(PIHTTPServer, MicrohttpdServer)
|
||||
|
||||
@@ -15,12 +15,12 @@ public:
|
||||
using RequestFunction = std::function<PIHTTP::MessageMutable(const PIHTTP::MessageConst &)>;
|
||||
|
||||
|
||||
//! ~english Registers handler for specific path and HTTP method
|
||||
//! ~russian Регистрирует обработчик для указанного пути и HTTP метода
|
||||
//! \~english Registers handler for specific path and HTTP method
|
||||
//! \~russian Регистрирует обработчик для указанного пути и HTTP метода
|
||||
bool registerPath(const PIString & path, PIHTTP::Method method, RequestFunction functor);
|
||||
|
||||
//! ~english Registers handler for specific path and HTTP method
|
||||
//! ~russian Регистрирует обработчик для указанного пути и HTTP метода
|
||||
//! \~english Registers handler for specific path and HTTP method
|
||||
//! \~russian Регистрирует обработчик для указанного пути и HTTP метода
|
||||
template<typename T>
|
||||
bool
|
||||
registerPath(const PIString & path, PIHTTP::Method method, T * o, PIHTTP::MessageMutable (T::*function)(const PIHTTP::MessageConst &)) {
|
||||
@@ -28,36 +28,36 @@ public:
|
||||
}
|
||||
|
||||
|
||||
//! ~english Registers handler for unregistered pathes
|
||||
//! ~russian Регистрирует обработчик для незарегистрированных путей
|
||||
//! \~english Registers handler for unregistered pathes
|
||||
//! \~russian Регистрирует обработчик для незарегистрированных путей
|
||||
void registerUnhandled(RequestFunction functor);
|
||||
|
||||
//! ~english Registers handler for unregistered pathes
|
||||
//! ~russian Регистрирует обработчик для незарегистрированных путей
|
||||
//! \~english Registers handler for unregistered pathes
|
||||
//! \~russian Регистрирует обработчик для незарегистрированных путей
|
||||
template<typename T>
|
||||
void registerUnhandled(T * o, PIHTTP::MessageMutable (T::*function)(const PIHTTP::MessageConst &)) {
|
||||
registerUnhandled([o, function](const PIHTTP::MessageConst & m) { return (o->*function)(m); });
|
||||
}
|
||||
|
||||
//! ~english Unregisters handler for specific path and method
|
||||
//! ~russian Удаляет обработчик для указанного пути и метода
|
||||
//! \~english Unregisters handler for specific path and method
|
||||
//! \~russian Удаляет обработчик для указанного пути и метода
|
||||
void unregisterPath(const PIString & path, PIHTTP::Method method);
|
||||
|
||||
//! ~english Unregisters all handlers for specific path
|
||||
//! ~russian Удаляет все обработчики для указанного пути
|
||||
//! \~english Unregisters all handlers for specific path
|
||||
//! \~russian Удаляет все обработчики для указанного пути
|
||||
void unregisterPath(const PIString & path);
|
||||
|
||||
|
||||
//! ~english Adds header to all server responses
|
||||
//! ~russian Добавляет заголовок ко всем ответам сервера
|
||||
//! \~english Adds header to all server responses
|
||||
//! \~russian Добавляет заголовок ко всем ответам сервера
|
||||
void addReplyHeader(const PIString & name, const PIString & value) { reply_headers[name] = value; }
|
||||
|
||||
//! ~english Removes header from server responses
|
||||
//! ~russian Удаляет заголовок из ответов сервера
|
||||
//! \~english Removes header from server responses
|
||||
//! \~russian Удаляет заголовок из ответов сервера
|
||||
void removeReplyHeader(const PIString & name) { reply_headers.remove(name); }
|
||||
|
||||
//! ~english Clears all custom response headers
|
||||
//! ~russian Очищает все пользовательские заголовки ответов
|
||||
//! \~english Clears all custom response headers
|
||||
//! \~russian Очищает все пользовательские заголовки ответов
|
||||
void clearReplyHeaders() { reply_headers.clear(); }
|
||||
|
||||
private:
|
||||
|
||||
@@ -938,7 +938,7 @@ PIString PIBinaryLog::constructFullPathDevice() const {
|
||||
void PIBinaryLog::configureFromFullPathDevice(const PIString & full_path) {
|
||||
const PIStringList pl = full_path.split(":");
|
||||
for (int i = 0; i < pl.size_s(); ++i) {
|
||||
const PIString p(pl[i]);
|
||||
const PIString p(pl[i].trimmed());
|
||||
switch (i) {
|
||||
case 0: setLogDir(p); break;
|
||||
case 1: setFilePrefix(p); break;
|
||||
|
||||
@@ -181,7 +181,7 @@ void PICAN::configureFromFullPathDevice(const PIString & full_path) {
|
||||
PIString p(pl[i]);
|
||||
switch (i) {
|
||||
case 0: setPath(p); break;
|
||||
case 1: setCANID(p.toInt(16)); break;
|
||||
case 1: setCANID(p.trimmed().toInt(16)); break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1047,7 +1047,7 @@ void PIEthernet::configureFromFullPathDevice(const PIString & full_path) {
|
||||
PIStringList pl = full_path.split(":");
|
||||
bool mcast = false;
|
||||
for (int i = 0; i < pl.size_s(); ++i) {
|
||||
PIString p(pl[i]);
|
||||
PIString p(pl[i].trimmed());
|
||||
switch (i) {
|
||||
case 0:
|
||||
p = p.toLowerCase();
|
||||
|
||||
@@ -390,7 +390,7 @@ void PIIODevice::read_func() {
|
||||
ssize_t readed_ = read(buffer_tr.data(), buffer_tr.size_s());
|
||||
if (read_thread.isStopping()) return;
|
||||
if (readed_ <= 0) {
|
||||
piMSleep(10);
|
||||
piMSleep(threaded_read_timeout_ms);
|
||||
// cout << readed_ << ", " << errno << ", " << errorString() << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -271,6 +271,10 @@ public:
|
||||
bool waitThreadedReadFinished(PISystemTime timeout = {});
|
||||
|
||||
|
||||
uint threadedReadTimeout() const { return threaded_read_timeout_ms; }
|
||||
void setThreadedReadTimeout(uint ms) { threaded_read_timeout_ms = ms; }
|
||||
|
||||
|
||||
//! \~english Returns if threaded write is started
|
||||
//! \~russian Возвращает запущен ли поток записи
|
||||
bool isThreadedWrite() const;
|
||||
@@ -591,7 +595,7 @@ private:
|
||||
PIQueue<PIPair<PIByteArray, ullong>> write_queue;
|
||||
PISystemTime reopen_timeout;
|
||||
ullong tri = 0;
|
||||
uint threaded_read_buffer_size;
|
||||
uint threaded_read_buffer_size, threaded_read_timeout_ms = 10;
|
||||
bool reopen_enabled = true, destroying = false;
|
||||
|
||||
static PIMutex nfp_mutex;
|
||||
|
||||
@@ -1067,7 +1067,7 @@ PIString PIPeer::constructFullPathDevice() const {
|
||||
void PIPeer::configureFromFullPathDevice(const PIString & full_path) {
|
||||
PIStringList pl = full_path.split(":");
|
||||
for (int i = 0; i < pl.size_s(); ++i) {
|
||||
PIString p(pl[i]);
|
||||
PIString p(pl[i].trimmed());
|
||||
switch (i) {
|
||||
case 0: changeName(p); break;
|
||||
case 1: setTrustPeerName(p); break;
|
||||
|
||||
@@ -983,7 +983,7 @@ void PISerial::configureFromFullPathDevice(const PIString & full_path) {
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < pl.size_s(); ++i) {
|
||||
PIString p(pl[i]);
|
||||
PIString p(pl[i].trimmed());
|
||||
switch (i) {
|
||||
case 0: setProperty("path", p); break;
|
||||
case 1:
|
||||
|
||||
@@ -182,7 +182,7 @@ void PISharedMemory::configureFromFullPathDevice(const PIString & full_path) {
|
||||
initPrivate();
|
||||
PIStringList pl = full_path.split(":");
|
||||
for (int i = 0; i < pl.size_s(); ++i) {
|
||||
PIString p(pl[i]);
|
||||
PIString p(pl[i].trimmed());
|
||||
switch (i) {
|
||||
case 0: setPath(p); break;
|
||||
case 1: dsize = p.toInt(); break;
|
||||
|
||||
@@ -187,7 +187,7 @@ PIString PISPI::constructFullPathDevice() const {
|
||||
void PISPI::configureFromFullPathDevice(const PIString & full_path) {
|
||||
PIStringList pl = full_path.split(":");
|
||||
for (int i = 0; i < pl.size_s(); ++i) {
|
||||
PIString p(pl[i]);
|
||||
PIString p(pl[i].trimmed());
|
||||
switch (i) {
|
||||
case 0: setPath(p); break;
|
||||
case 1: setSpeed(p.toInt()); break;
|
||||
|
||||
@@ -315,7 +315,7 @@ public:
|
||||
}
|
||||
|
||||
static _CVector cross(const _CVector & v1, const _CVector & v2) { return v1.cross(v2); }
|
||||
static _CVector dot(const _CVector & v1, const _CVector & v2) { return v1.dot(v2); }
|
||||
static Type dot(const _CVector & v1, const _CVector & v2) { return v1.dot(v2); }
|
||||
static _CVector mul(const _CVector & v1, const _CVector & v2) { return v1.mul(v2); }
|
||||
static _CVector mul(const Type & v1, const _CVector & v2) { return v2 * v1; }
|
||||
static _CVector mul(const _CVector & v1, const Type & v2) { return v1 * v2; }
|
||||
@@ -581,7 +581,7 @@ public:
|
||||
|
||||
|
||||
static _CVector cross(const _CVector & v1, const _CVector & v2) { return v1.cross(v2); }
|
||||
static _CVector dot(const _CVector & v1, const _CVector & v2) { return v1.dot(v2); }
|
||||
static Type dot(const _CVector & v1, const _CVector & v2) { return v1.dot(v2); }
|
||||
static _CVector mul(const _CVector & v1, const _CVector & v2) { return v1.mul(v2); }
|
||||
static _CVector mul(const Type & v1, const _CVector & v2) { return v2 * v1; }
|
||||
static _CVector mul(const _CVector & v1, const Type & v2) { return v1 * v2; }
|
||||
|
||||
643
libs/main/system/pihidevice.cpp
Normal file
643
libs/main/system/pihidevice.cpp
Normal file
@@ -0,0 +1,643 @@
|
||||
#include "pihidevice.h"
|
||||
|
||||
#include "piliterals_string.h"
|
||||
#include "piliterals_time.h"
|
||||
#ifndef WINDOWS
|
||||
# include "pidir.h"
|
||||
# include "pifile.h"
|
||||
# include "piiostream.h"
|
||||
|
||||
# include <fcntl.h>
|
||||
# include <linux/input-event-codes.h>
|
||||
# include <linux/input.h>
|
||||
# include <sys/ioctl.h>
|
||||
# include <sys/time.h>
|
||||
# include <unistd.h>
|
||||
#else
|
||||
// clang-format off
|
||||
# include <windows.h>
|
||||
# include <setupapi.h>
|
||||
extern "C" {
|
||||
# include <hidsdi.h>
|
||||
}
|
||||
// clang-format on
|
||||
#endif
|
||||
|
||||
|
||||
bool PIHIDeviceInfo::match(const PIString & str) const {
|
||||
if (product.toLowerCase().contains(str.toLowerCase())) return true;
|
||||
if (path.toLowerCase().contains(str.toLowerCase())) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
int PIHIDeviceInfo::axesAbsoluteCount() const {
|
||||
int ret = 0;
|
||||
for (const auto & a: axes)
|
||||
if (!a.is_relative) ++ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int PIHIDeviceInfo::axesRelativeCount() const {
|
||||
int ret = 0;
|
||||
for (const auto & a: axes)
|
||||
if (a.is_relative) ++ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void PIHIDeviceInfo::prepare() {
|
||||
axis_by_dataindex.clear();
|
||||
button_by_dataindex.clear();
|
||||
for (const auto & i: axes)
|
||||
axis_by_dataindex[i.data_index] = i;
|
||||
for (const auto & i: buttons)
|
||||
button_by_dataindex[i.data_index] = i;
|
||||
}
|
||||
|
||||
|
||||
PICout operator<<(PICout s, const PIHIDeviceInfo & v) {
|
||||
s.saveAndSetControls(0);
|
||||
s << "PIHIDeviceInfo(" << v.product << " (" << v.manufacturer << "), " << v.VID << ":" << v.PID
|
||||
<< ", " //<< "path \"" << v.path << "\", "
|
||||
<< v.axesAbsoluteCount() << " abs axes, " << v.axesRelativeCount() << " rel axes, " << v.buttonsCount() << " buttons)";
|
||||
s.restoreControls();
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
PRIVATE_DEFINITION_START(PIHIDevice)
|
||||
#ifndef WINDOWS
|
||||
PIFile file;
|
||||
bool is_js = false;
|
||||
#else
|
||||
PIByteArray buffer;
|
||||
HANDLE deviceHandle = nullptr;
|
||||
PHIDP_PREPARSED_DATA preparsed = nullptr;
|
||||
#endif
|
||||
PRIVATE_DEFINITION_END(PIHIDevice)
|
||||
|
||||
|
||||
PIHIDevice::~PIHIDevice() {
|
||||
close();
|
||||
}
|
||||
|
||||
bool PIHIDevice::isOpened() const {
|
||||
#ifndef WINDOWS
|
||||
return PRIVATE->file.isOpened();
|
||||
#else
|
||||
return PRIVATE->deviceHandle;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
bool PIHIDevice::open(const PIHIDeviceInfo & device) {
|
||||
close();
|
||||
cur_axes.clear();
|
||||
cur_buttons.clear();
|
||||
di = device;
|
||||
di.prepare();
|
||||
if (device.isNull()) return false;
|
||||
#ifndef WINDOWS
|
||||
if (!PRIVATE->file.open(di.path, PIIODevice::ReadOnly)) {
|
||||
piCout << "PIHIDevice::open" << di.path << "error:" << errorString();
|
||||
return false;
|
||||
}
|
||||
PRIVATE->is_js = PIFile::FileInfo(di.path).name().startsWith("js"_a);
|
||||
return true;
|
||||
#else
|
||||
PRIVATE->deviceHandle = CreateFileA(di.path.dataAscii(),
|
||||
GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
nullptr,
|
||||
OPEN_EXISTING,
|
||||
0,
|
||||
nullptr);
|
||||
if (PRIVATE->deviceHandle == INVALID_HANDLE_VALUE) {
|
||||
piCoutObj << "PIHIDevice::open" << di.path << "error:" << errorString();
|
||||
PRIVATE->deviceHandle = nullptr;
|
||||
return false;
|
||||
}
|
||||
HidD_GetPreparsedData(PRIVATE->deviceHandle, &PRIVATE->preparsed);
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
bool PIHIDevice::open() {
|
||||
return open(di);
|
||||
}
|
||||
|
||||
|
||||
void PIHIDevice::close() {
|
||||
stop();
|
||||
#ifndef WINDOWS
|
||||
PRIVATE->file.close();
|
||||
#else
|
||||
if (PRIVATE->deviceHandle) {
|
||||
CloseHandle(PRIVATE->deviceHandle);
|
||||
PRIVATE->deviceHandle = nullptr;
|
||||
}
|
||||
if (PRIVATE->preparsed) {
|
||||
HidD_FreePreparsedData(PRIVATE->preparsed);
|
||||
PRIVATE->preparsed = nullptr;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void PIHIDevice::start() {
|
||||
if (!isOpened()) return;
|
||||
PIThread::start(200_Hz);
|
||||
#ifndef WINDOWS
|
||||
#else
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void PIHIDevice::stop() {
|
||||
PIThread::stop();
|
||||
#ifdef WINDOWS
|
||||
if (PRIVATE->deviceHandle) {
|
||||
CancelIoEx(PRIVATE->deviceHandle, nullptr);
|
||||
}
|
||||
#endif
|
||||
if (!waitForFinish(1000_ms)) terminate();
|
||||
}
|
||||
|
||||
|
||||
void PIHIDevice::run() {
|
||||
Event e;
|
||||
#ifndef WINDOWS
|
||||
# pragma pack(push, 1)
|
||||
struct input_event {
|
||||
struct timeval time;
|
||||
ushort type;
|
||||
ushort code;
|
||||
uint value;
|
||||
};
|
||||
struct js_event {
|
||||
uint time; /* event timestamp in milliseconds */
|
||||
short value; /* value */
|
||||
uchar type; /* event type */
|
||||
uchar number; /* axis/button number */
|
||||
};
|
||||
# pragma pack(pop)
|
||||
if (PRIVATE->is_js) {
|
||||
js_event ie;
|
||||
while (PRIVATE->file.read(&ie, sizeof(ie)) == sizeof(ie)) {
|
||||
if (ie.type == 0) continue;
|
||||
bool ok = false;
|
||||
switch (ie.type) {
|
||||
case 2: {
|
||||
// piCout << ie.value;
|
||||
cur_axes[ie.number] = procDeadZone(ie.value / 32767. / 2. + 0.5);
|
||||
ok = true;
|
||||
} break;
|
||||
case 1:
|
||||
// piCout << ie.code;
|
||||
cur_buttons[ie.number] = ie.value;
|
||||
ok = true;
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
// piCout << ok << ie.type << ie.code << ie.value;
|
||||
if (!ok) continue;
|
||||
}
|
||||
} else {
|
||||
input_event ie;
|
||||
while (PRIVATE->file.read(&ie, sizeof(ie)) == sizeof(ie)) {
|
||||
if (ie.type == 0) continue;
|
||||
bool ok = false;
|
||||
switch (ie.type) {
|
||||
case 2: { // rel axis
|
||||
auto vi = di.axis_by_dataindex.value(ie.code);
|
||||
if (vi.isValid()) {
|
||||
e.type = Event::tAxisMove;
|
||||
e.axis = vi;
|
||||
e.value = static_cast<int>(ie.value);
|
||||
event(e);
|
||||
}
|
||||
ok = true;
|
||||
} break;
|
||||
case 3: { // abs axis
|
||||
auto vi = di.axis_by_dataindex.value(ie.code);
|
||||
float fv = (ie.value - vi.min) / piMaxf(1.f, (float)(vi.max - vi.min));
|
||||
cur_axes[ie.code] = procDeadZone(fv);
|
||||
ok = true;
|
||||
} break;
|
||||
case 1: // button
|
||||
// piCout << ie.code;
|
||||
cur_buttons[ie.code] = ie.value;
|
||||
ok = true;
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
// piCout << ok << ie.type << ie.code << ie.value;
|
||||
if (!ok) continue;
|
||||
}
|
||||
}
|
||||
#else
|
||||
PRIVATE->buffer.resize(di.input_report_size).fill(0);
|
||||
DWORD readed = 0;
|
||||
// piCout << "read" << PRIVATE->deviceHandle << PRIVATE->buffer.size();
|
||||
HIDP_DATA gdd[256];
|
||||
ULONG gdd_len = 256;
|
||||
if (ReadFile(PRIVATE->deviceHandle, PRIVATE->buffer.data(), PRIVATE->buffer.size_s(), &readed, nullptr) != TRUE) return;
|
||||
// piCout << readed << PRIVATE->buffer.size();
|
||||
if (readed != PRIVATE->buffer.size()) return;
|
||||
auto gd = HidP_GetData(HidP_Input, gdd, &gdd_len, PRIVATE->preparsed, (PCHAR)PRIVATE->buffer.data(), PRIVATE->buffer.size_s());
|
||||
NO_UNUSED(gd);
|
||||
// piCout << "readed" << PRIVATE->buffer << gdd_len;
|
||||
auto cbit = cur_buttons.makeIterator();
|
||||
while (cbit.next())
|
||||
cbit.value() = 0;
|
||||
for (ULONG i = 0; i < gdd_len; ++i) {
|
||||
const auto & cd(gdd[i]);
|
||||
// piCout << cd.DataIndex << cd.RawValue;
|
||||
auto vi = di.axis_by_dataindex.value(cd.DataIndex);
|
||||
if (vi.isValid()) {
|
||||
if (vi.is_relative) {
|
||||
e.type = Event::tAxisMove;
|
||||
e.axis = vi;
|
||||
e.value = static_cast<LONG>(cd.RawValue);
|
||||
event(e);
|
||||
} else {
|
||||
// auto & axis(cur_axes[cd.DataIndex]);
|
||||
float fv = (cd.RawValue - vi.min) / piMaxf(1.f, (float)(vi.max - vi.min));
|
||||
cur_axes[vi.data_index] = procDeadZone(fv);
|
||||
}
|
||||
// piCout << "axis" << vi.data_index << "->" << cur_axes[vi.data_index];
|
||||
continue;
|
||||
}
|
||||
auto bi = di.button_by_dataindex.value(cd.DataIndex);
|
||||
if (bi.isValid()) {
|
||||
cur_buttons[bi.data_index] = 1;
|
||||
// piCout << "button" << bi.data_index << "-> 1";
|
||||
continue;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
auto ait = cur_axes.makeIterator();
|
||||
e.type = Event::tAxisMove;
|
||||
while (ait.next()) {
|
||||
if (ait.value() != prev_axes.value(ait.key())) {
|
||||
e.axis = di.axis_by_dataindex.value(ait.key());
|
||||
e.value = ait.value();
|
||||
event(e);
|
||||
}
|
||||
}
|
||||
prev_axes = cur_axes;
|
||||
|
||||
auto bit = cur_buttons.makeIterator();
|
||||
e.type = Event::tButton;
|
||||
while (bit.next()) {
|
||||
if (bit.value() != prev_buttons.value(bit.key())) {
|
||||
e.button = di.button_by_dataindex.value(bit.key());
|
||||
e.value = bit.value();
|
||||
event(e);
|
||||
}
|
||||
}
|
||||
prev_buttons = cur_buttons;
|
||||
}
|
||||
|
||||
|
||||
double PIHIDevice::procDeadZone(double in) {
|
||||
double cv = (in - 0.5) * 2.;
|
||||
if (piAbsd(cv) < dead_zone) return 0.;
|
||||
if (cv < 0)
|
||||
return (cv + dead_zone) / (1. - dead_zone);
|
||||
else
|
||||
return (cv - dead_zone) / (1. - dead_zone);
|
||||
return cv;
|
||||
}
|
||||
|
||||
|
||||
PIVector<PIHIDeviceInfo> PIHIDevice::allDevices(bool try_open) {
|
||||
PIVector<PIHIDeviceInfo> ret;
|
||||
|
||||
#ifndef WINDOWS
|
||||
|
||||
auto readFile = [](const PIString & path) {
|
||||
auto ba = PIFile::readAll(path);
|
||||
PIString ret;
|
||||
for (const auto & b: ba) {
|
||||
if (!PIChar(b).isAscii()) break;
|
||||
ret += PIChar(b);
|
||||
}
|
||||
return ret.trim();
|
||||
};
|
||||
auto isDir = [](const PIFile::FileInfo & fi) {
|
||||
return fi.isDir() && !fi.flags[PIFile::FileInfo::Dot] && !fi.flags[PIFile::FileInfo::DotDot];
|
||||
};
|
||||
auto checkBit = [](const ullong & flags, ullong bit, const PIString & name) { return (flags & (1ULL << bit)) > 0; };
|
||||
|
||||
PIDir hid_dir("/sys/bus/hid/devices"_a);
|
||||
auto hid_devs = hid_dir.entries();
|
||||
for (auto hd: hid_devs) {
|
||||
// piCout << d.path;
|
||||
if (!isDir(hd)) continue;
|
||||
PIDir dir_input(hd.path + "/input"_a);
|
||||
auto hid_inputs = dir_input.entries();
|
||||
for (auto hd_i: hid_inputs) {
|
||||
if (!isDir(hd_i)) continue;
|
||||
// now in /sys/bus/hid/devices/<dev>/input/input<N>
|
||||
// piCout << hd_i.path;
|
||||
PIHIDeviceInfo dev;
|
||||
dev.product = readFile(hd_i.path + "/name"_a);
|
||||
// piCout << readFile(hd_i.path + "/name"_a);
|
||||
dev.VID = readFile(hd_i.path + "/id/vendor"_a);
|
||||
dev.PID = readFile(hd_i.path + "/id/product"_a);
|
||||
dev.version = readFile(hd_i.path + "/id/version"_a);
|
||||
dev.manufacturer = readFile(hd_i.path + "/id/manufacturer"_a);
|
||||
|
||||
// piCout << dev.product;
|
||||
dev.input_report_size = 24;
|
||||
PIDir dir_e(hd_i.path);
|
||||
PIStringList devs;
|
||||
auto dl_e = dir_e.entries();
|
||||
for (auto d_e: dl_e) {
|
||||
if (!d_e.isDir() || d_e.flags[PIFile::FileInfo::Dot] || d_e.flags[PIFile::FileInfo::DotDot]) continue;
|
||||
devs << d_e.name();
|
||||
}
|
||||
/*bool dev_found = false;
|
||||
for (const auto & d: devs) {
|
||||
if (d.startsWith("js"_a)) {
|
||||
dev.path = "/dev/input/"_a + d;
|
||||
dev_found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!dev_found) {*/
|
||||
// search for event<N> dir
|
||||
for (const auto & d: devs) {
|
||||
if (d.startsWith("event"_a)) {
|
||||
dev.path = "/dev/input/"_a + d;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (dev.path.isEmpty()) continue;
|
||||
|
||||
if (try_open) {
|
||||
PIFile test_f(dev.path, PIIODevice::ReadOnly);
|
||||
if (test_f.isClosed()) continue;
|
||||
}
|
||||
|
||||
ullong ev = readFile(hd_i.path + "/capabilities/ev"_a).toULLong(16);
|
||||
|
||||
auto readAxes = [readFile, checkBit, &hd_i, &dev](const PIString & file, bool is_relative) {
|
||||
PIVector<PIHIDeviceInfo::AxisInfo> ret;
|
||||
ullong bits = readFile(hd_i.path + file).toULLong(16);
|
||||
// piCout<< PICoutManipulators::Bin << abs;
|
||||
if (bits > 0) {
|
||||
int fd = ::open(dev.path.dataAscii(), O_RDONLY);
|
||||
if (fd < 0) {
|
||||
// piCout << "Warning: can`t open" << dev.path << errorString();
|
||||
}
|
||||
PIHIDeviceInfo::AxisInfo ai;
|
||||
ai.is_relative = is_relative;
|
||||
for (int bit = 0; bit < 64; ++bit) {
|
||||
if (checkBit(bits, bit, PIString::fromNumber(bit))) {
|
||||
ai.data_index = bit;
|
||||
if (fd >= 0) {
|
||||
struct input_absinfo abs_info;
|
||||
if (ioctl(fd, EVIOCGABS(bit), &abs_info) != -1) {
|
||||
ai.min = abs_info.minimum;
|
||||
ai.max = abs_info.maximum;
|
||||
// piCout << "axis" << bit << abs_info.minimum << abs_info.maximum << abs_info.flat << abs_info.fuzz;
|
||||
} else {
|
||||
ai.min = 0;
|
||||
ai.max = 1024;
|
||||
}
|
||||
}
|
||||
ret << ai;
|
||||
}
|
||||
}
|
||||
if (fd >= 0) ::close(fd);
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
|
||||
dev.axes << readAxes("/capabilities/abs"_a, false) << readAxes("/capabilities/rel"_a, true);
|
||||
for (int i = 0; i < dev.axes.size_s(); ++i)
|
||||
dev.axes[i].index = i;
|
||||
|
||||
PIString key_str = readFile(hd_i.path + "/capabilities/key"_a);
|
||||
PIVector<ulong> key_words;
|
||||
while (key_str.isNotEmpty()) {
|
||||
PIString w = key_str.takeWord().trimmed();
|
||||
if (w.isEmpty()) break;
|
||||
key_words.prepend(w.toULong(16));
|
||||
}
|
||||
PIBitArray key_bits((const uchar *)key_words.data(), key_words.size_s() * sizeof(ulong));
|
||||
|
||||
PIHIDeviceInfo::ButtonInfo bi;
|
||||
for (uint b = 0; b < key_bits.bitSize(); ++b) {
|
||||
if (!key_bits[b]) continue;
|
||||
bi.index = dev.buttons.size_s();
|
||||
bi.code = b;
|
||||
bi.data_index = b;
|
||||
dev.buttons << bi;
|
||||
}
|
||||
|
||||
if (dev.manufacturer.isEmpty()) {
|
||||
for (const auto * hwp: {"/usr/share/hwdata/usb.ids", "/var/lib/usbutils/usb.ids"}) {
|
||||
PIFile hwf(hwp, PIIODevice::ReadOnly);
|
||||
if (hwf.isClosed()) continue;
|
||||
// piCout << "search" << dev.VID << "in" << hwp;
|
||||
PIString line;
|
||||
PIIOTextStream ts(&hwf);
|
||||
while (!hwf.isEnd()) {
|
||||
line = ts.readLine();
|
||||
if (line.startsWith(dev.VID)) {
|
||||
line.takeWord();
|
||||
line.trim();
|
||||
dev.manufacturer = line;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (dev.isNotNull() && (dev.buttonsCount() > 0 || dev.axesCount() > 0)) ret << dev;
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
GUID guid;
|
||||
HidD_GetHidGuid(&guid);
|
||||
HDEVINFO deviceInfoSet = SetupDiGetClassDevs(&guid, nullptr, nullptr, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
|
||||
if (deviceInfoSet == INVALID_HANDLE_VALUE) {
|
||||
piCout << "SetupDiGetClassDevs error:" << errorString();
|
||||
return ret;
|
||||
}
|
||||
|
||||
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
|
||||
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
|
||||
for (DWORD i = 0; SetupDiEnumDeviceInterfaces(deviceInfoSet, nullptr, &guid, i, &deviceInterfaceData); ++i) {
|
||||
PIHIDeviceInfo dev;
|
||||
|
||||
DWORD requiredSize = 0;
|
||||
SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, nullptr, 0, &requiredSize, nullptr);
|
||||
PSP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData =
|
||||
reinterpret_cast<PSP_DEVICE_INTERFACE_DETAIL_DATA>(new BYTE[requiredSize]);
|
||||
PIScopeExitCall exit_call([&deviceInterfaceDetailData]() { delete[] reinterpret_cast<BYTE *>(deviceInterfaceDetailData); });
|
||||
deviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
|
||||
if (!SetupDiGetDeviceInterfaceDetail(deviceInfoSet,
|
||||
&deviceInterfaceData,
|
||||
deviceInterfaceDetailData,
|
||||
requiredSize,
|
||||
nullptr,
|
||||
nullptr)) {
|
||||
piCout << "SetupDiGetDeviceInterfaceDetail error:" << errorString();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (try_open) {
|
||||
auto test_f = CreateFileA(deviceInterfaceDetailData->DevicePath,
|
||||
GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
nullptr,
|
||||
OPEN_EXISTING,
|
||||
0,
|
||||
nullptr);
|
||||
if (test_f == INVALID_HANDLE_VALUE) continue;
|
||||
CloseHandle(test_f);
|
||||
}
|
||||
|
||||
HANDLE deviceHandle =
|
||||
CreateFileA(deviceInterfaceDetailData->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr);
|
||||
if (deviceHandle == INVALID_HANDLE_VALUE) {
|
||||
piCout << "CreateFileA error:" << errorString();
|
||||
continue;
|
||||
}
|
||||
|
||||
// piCout << i << deviceHandle;
|
||||
|
||||
PHIDP_PREPARSED_DATA preparsed = nullptr;
|
||||
if (HidD_GetPreparsedData(deviceHandle, &preparsed) == FALSE) {
|
||||
piCout << "HidD_GetPreparsedData error:" << errorString();
|
||||
continue;
|
||||
}
|
||||
// auto pp = PIByteArray(preparsed, 64);
|
||||
// piCout << piChangedEndian(pp.dataAs<ushort>(7)) << piChangedEndian(pp.dataAs<ushort>(8)) <<
|
||||
// piChangedEndian(pp.dataAs<ushort>(9));
|
||||
// piCout << pp;
|
||||
|
||||
dev.path = deviceInterfaceDetailData->DevicePath;
|
||||
|
||||
HIDD_ATTRIBUTES attr;
|
||||
PIByteArray str_buff(1024);
|
||||
HidD_GetAttributes(deviceHandle, &attr);
|
||||
dev.VID.setNumber(attr.VendorID, 16).expandLeftTo(4, '0').toLowerCase();
|
||||
dev.PID.setNumber(attr.ProductID, 16).expandLeftTo(4, '0').toLowerCase();
|
||||
dev.version.setNumber(attr.VersionNumber);
|
||||
|
||||
HIDP_CAPS caps;
|
||||
HidP_GetCaps(preparsed, &caps);
|
||||
dev.input_report_size = caps.InputReportByteLength;
|
||||
|
||||
str_buff.fill(0);
|
||||
HidD_GetManufacturerString(deviceHandle, str_buff.data(), str_buff.size_s());
|
||||
dev.manufacturer = PIString(reinterpret_cast<wchar_t *>(str_buff.data()));
|
||||
|
||||
str_buff.fill(0);
|
||||
HidD_GetProductString(deviceHandle, str_buff.data(), str_buff.size_s());
|
||||
dev.product = PIString(reinterpret_cast<wchar_t *>(str_buff.data()));
|
||||
|
||||
str_buff.fill(0);
|
||||
HidD_GetSerialNumberString(deviceHandle, str_buff.data(), str_buff.size_s());
|
||||
dev.serial = PIString(reinterpret_cast<wchar_t *>(str_buff.data()));
|
||||
|
||||
PIVector<PIHIDeviceInfo::AxisInfo> axes_abs, axes_rel;
|
||||
HIDP_VALUE_CAPS value_caps[1024];
|
||||
USHORT _cnt = caps.NumberInputValueCaps;
|
||||
memset(value_caps, 0, sizeof(value_caps[0]) * 1024);
|
||||
HidP_GetValueCaps(HidP_Input, value_caps, &_cnt, preparsed);
|
||||
for (int i = 0; i < caps.NumberInputValueCaps; ++i) {
|
||||
const auto & vc(value_caps[i]);
|
||||
PIHIDeviceInfo::AxisInfo vi;
|
||||
vi.bits = vc.BitSize;
|
||||
vi.min = vc.LogicalMin;
|
||||
vi.max = vc.LogicalMax;
|
||||
vi.is_relative = vc.IsAbsolute == 0;
|
||||
if (vi.max == vi.min) ++vi.max;
|
||||
if (vc.IsRange == 1) {
|
||||
int count = vc.Range.UsageMax - vc.Range.UsageMin + 1;
|
||||
int cur_index = vc.Range.DataIndexMin;
|
||||
for (int v = 0; v < count; ++v) {
|
||||
vi.data_index = cur_index;
|
||||
if (vi.is_relative)
|
||||
axes_rel << vi;
|
||||
else
|
||||
axes_abs << vi;
|
||||
++cur_index;
|
||||
}
|
||||
} else {
|
||||
vi.data_index = vc.NotRange.DataIndex;
|
||||
if (vi.is_relative)
|
||||
axes_rel << vi;
|
||||
else
|
||||
axes_abs << vi;
|
||||
}
|
||||
// piCout << vc.LinkCollection << vc.LinkUsage << vc.LinkUsagePage;
|
||||
}
|
||||
dev.axes << axes_abs << axes_rel;
|
||||
for (int i = 0; i < dev.axes.size_s(); ++i)
|
||||
dev.axes[i].index = i;
|
||||
|
||||
HIDP_BUTTON_CAPS button_caps[1024];
|
||||
_cnt = caps.NumberInputButtonCaps;
|
||||
memset(button_caps, 0, sizeof(button_caps[0]) * 1024);
|
||||
HidP_GetButtonCaps(HidP_Input, button_caps, &_cnt, preparsed);
|
||||
for (int i = 0; i < _cnt; ++i) {
|
||||
const auto & bc(button_caps[i]);
|
||||
PIHIDeviceInfo::ButtonInfo bi;
|
||||
// dev.values.append(PIHIDeviceInfo::ValueInfo{value_caps[i].BitSize, value_caps[i].LogicalMin, value_caps[i].LogicalMax});
|
||||
if (bc.IsRange == 1) {
|
||||
int count = bc.Range.UsageMax - bc.Range.UsageMin + 1;
|
||||
int cur_index = bc.Range.DataIndexMin;
|
||||
for (int b = 0; b < count; ++b) {
|
||||
bi.index = dev.buttons.size_s();
|
||||
bi.data_index = cur_index;
|
||||
dev.buttons << bi;
|
||||
++cur_index;
|
||||
// piCout << b << (start_bit / 8) << (start_bit % 8);
|
||||
}
|
||||
} else {
|
||||
bi.index = dev.buttons.size_s();
|
||||
bi.data_index = bc.NotRange.DataIndex;
|
||||
dev.buttons << bi;
|
||||
// piCout << (bi.bit / 8) << (bi.bit % 8);
|
||||
}
|
||||
// piCout << bc.IsRange << bc.Range.UsageMin << bc.Range.UsageMax
|
||||
// << bc.Range.DataIndexMin << bc.Range.DataIndexMax;
|
||||
}
|
||||
|
||||
HidD_FreePreparsedData(preparsed);
|
||||
CloseHandle(deviceHandle);
|
||||
|
||||
if (dev.buttonsCount() > 0 || dev.axesCount() > 0) ret << dev;
|
||||
}
|
||||
|
||||
SetupDiDestroyDeviceInfoList(deviceInfoSet);
|
||||
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
PIHIDeviceInfo PIHIDevice::findDevice(const PIString & name) {
|
||||
if (name.isEmpty()) return PIHIDeviceInfo();
|
||||
auto devices = PIHIDevice::allDevices();
|
||||
for (auto d: devices) {
|
||||
if (d.match(name)) return d;
|
||||
}
|
||||
return PIHIDeviceInfo();
|
||||
}
|
||||
122
libs/main/system/pihidevice.h
Normal file
122
libs/main/system/pihidevice.h
Normal file
@@ -0,0 +1,122 @@
|
||||
/*! \file pihidevice.h
|
||||
* \ingroup System
|
||||
* \~\brief
|
||||
* \~english HID device
|
||||
* \~russian HID устройство
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
HID device
|
||||
Ivan Pelipenko peri4ko@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 PIHIDEVICE_H
|
||||
#define PIHIDEVICE_H
|
||||
|
||||
#include "pithread.h"
|
||||
|
||||
|
||||
struct PIP_EXPORT PIHIDeviceInfo {
|
||||
friend class PIHIDevice;
|
||||
struct PIP_EXPORT ValueInfoBase {
|
||||
bool isValid() const { return index >= 0; }
|
||||
int index = -1;
|
||||
int data_index = -1;
|
||||
};
|
||||
struct PIP_EXPORT AxisInfo: public ValueInfoBase {
|
||||
int bits = 0;
|
||||
int min = 0;
|
||||
int max = 1;
|
||||
bool is_relative = false;
|
||||
};
|
||||
struct PIP_EXPORT ButtonInfo: public ValueInfoBase {
|
||||
int code = 0;
|
||||
};
|
||||
PIString path;
|
||||
PIString manufacturer;
|
||||
PIString product;
|
||||
PIString serial;
|
||||
PIString version;
|
||||
PIString VID;
|
||||
PIString PID;
|
||||
PIVector<AxisInfo> axes;
|
||||
PIVector<ButtonInfo> buttons;
|
||||
bool isNull() const { return path.isEmpty(); }
|
||||
bool isNotNull() const { return !isNull(); }
|
||||
bool match(const PIString & str) const;
|
||||
int axesCount() const { return axes.size_s(); }
|
||||
int axesAbsoluteCount() const;
|
||||
int axesRelativeCount() const;
|
||||
int buttonsCount() const { return buttons.size_s(); }
|
||||
|
||||
private:
|
||||
void prepare();
|
||||
PIMap<int, AxisInfo> axis_by_dataindex;
|
||||
PIMap<int, ButtonInfo> button_by_dataindex;
|
||||
int input_report_size = 0;
|
||||
int output_report_size = 0;
|
||||
int feature_report_size = 0;
|
||||
};
|
||||
|
||||
PIP_EXPORT PICout operator<<(PICout s, const PIHIDeviceInfo & v);
|
||||
|
||||
|
||||
class PIP_EXPORT PIHIDevice: public PIThread {
|
||||
PIOBJECT_SUBCLASS(PIHIDevice, PIThread)
|
||||
|
||||
public:
|
||||
~PIHIDevice();
|
||||
|
||||
struct PIP_EXPORT Event {
|
||||
enum Type {
|
||||
tNone,
|
||||
tButton,
|
||||
tAxisMove,
|
||||
};
|
||||
Type type = tNone;
|
||||
PIHIDeviceInfo::AxisInfo axis;
|
||||
PIHIDeviceInfo::ButtonInfo button;
|
||||
float value = 0.;
|
||||
};
|
||||
|
||||
bool isOpened() const;
|
||||
bool open(const PIHIDeviceInfo & device);
|
||||
bool open();
|
||||
void close();
|
||||
void start();
|
||||
void stop();
|
||||
|
||||
void setDeadZone(float v) { dead_zone = v; }
|
||||
float deadZone() const { return dead_zone; }
|
||||
|
||||
EVENT1(event, PIHIDevice::Event, e);
|
||||
|
||||
static PIVector<PIHIDeviceInfo> allDevices(bool try_open = true);
|
||||
static PIHIDeviceInfo findDevice(const PIString & name);
|
||||
|
||||
private:
|
||||
void run() override;
|
||||
double procDeadZone(double in);
|
||||
|
||||
PRIVATE_DECLARATION(PIP_EXPORT)
|
||||
PIHIDeviceInfo di;
|
||||
PIMap<int, float> prev_axes, cur_axes;
|
||||
PIMap<int, int> prev_buttons, cur_buttons;
|
||||
float dead_zone = 0.f;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -22,13 +22,13 @@
|
||||
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 PILIBRARY_H
|
||||
# define PILIBRARY_H
|
||||
#define PILIBRARY_H
|
||||
|
||||
# ifndef MICRO_PIP
|
||||
#ifndef MICRO_PIP
|
||||
|
||||
# include "pistring.h"
|
||||
# include "pistring.h"
|
||||
|
||||
//! \ingroup System
|
||||
//! \~\brief
|
||||
@@ -82,5 +82,5 @@ private:
|
||||
PIString libpath, liberror;
|
||||
};
|
||||
|
||||
# endif // MICRO_PIP
|
||||
#endif // PILIBRARY_H
|
||||
#endif // MICRO_PIP
|
||||
#endif // PILIBRARY_H
|
||||
|
||||
@@ -211,14 +211,14 @@ PRIVATE_DEFINITION_START(PIProcess)
|
||||
while (1) {
|
||||
# ifdef WINDOWS
|
||||
DWORD available = 0;
|
||||
bytes_read = 0;
|
||||
bytes_read = 0;
|
||||
PeekNamedPipe(pipes[pipe_type][PipeRead], nullptr, 0, nullptr, &available, nullptr);
|
||||
if (available > 0) {
|
||||
BOOL ok = ReadFile(pipes[pipe_type][PipeRead],
|
||||
read_buffer.data(offset),
|
||||
piMini(available, read_buffer.size() - offset),
|
||||
&bytes_read,
|
||||
nullptr);
|
||||
read_buffer.data(offset),
|
||||
piMini(available, read_buffer.size() - offset),
|
||||
&bytes_read,
|
||||
nullptr);
|
||||
if (!ok) bytes_read = 0;
|
||||
}
|
||||
# else
|
||||
@@ -244,7 +244,7 @@ PRIVATE_DEFINITION_START(PIProcess)
|
||||
# else
|
||||
sz = ::write(pipes[StdIn][PipeWrite], data.data(), data.size());
|
||||
# endif
|
||||
return sz == data.size_s();
|
||||
return sz == (SizeType)data.size_s();
|
||||
}
|
||||
|
||||
PRIVATE_DEFINITION_END(PIProcess)
|
||||
@@ -354,7 +354,7 @@ void PIProcess::startProc(bool detached) {
|
||||
if (WIFEXITED(exit_code)) {
|
||||
exec_finished = WEXITSTATUS(exit_code) != 127;
|
||||
}
|
||||
pid_ = 0;
|
||||
pid_ = 0;
|
||||
if (!detached) PRIVATE->pid = pid_;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
#ifndef PISYSTEMMODULE_H
|
||||
#define PISYSTEMMODULE_H
|
||||
|
||||
#include "pihidevice.h"
|
||||
#include "pilibrary.h"
|
||||
#include "piplugin.h"
|
||||
#include "piprocess.h"
|
||||
|
||||
@@ -196,7 +196,7 @@ public:
|
||||
if (isNull() && s.isNull()) return true;
|
||||
if (isNull() xor s.isNull()) return false;
|
||||
if (size() != s.size()) return false;
|
||||
return strcmp(str, s.str) == 0;
|
||||
return strncmp(str, s.str, size()) == 0;
|
||||
}
|
||||
|
||||
//! \~english Compare operator.
|
||||
@@ -209,7 +209,7 @@ public:
|
||||
if (isNull() && s.isNull()) return false;
|
||||
if (isNull() && !s.isNull()) return true;
|
||||
if (!isNull() && s.isNull()) return false;
|
||||
if (size() == s.size()) return strcmp(str, s.str) < 0;
|
||||
if (size() == s.size()) return strncmp(str, s.str, size()) < 0;
|
||||
return size() < s.size();
|
||||
}
|
||||
|
||||
@@ -219,7 +219,7 @@ public:
|
||||
if (isNull() && s.isNull()) return false;
|
||||
if (isNull() && !s.isNull()) return false;
|
||||
if (!isNull() && s.isNull()) return true;
|
||||
if (size() == s.size()) return strcmp(str, s.str) > 0;
|
||||
if (size() == s.size()) return strncmp(str, s.str, size()) > 0;
|
||||
return size() > s.size();
|
||||
}
|
||||
|
||||
|
||||
@@ -493,8 +493,8 @@ public:
|
||||
inline const uchar * data(size_t index = 0) const { return d.data(index); }
|
||||
|
||||
template<typename T>
|
||||
inline T dataAs(size_t index = 0) {
|
||||
return *(T *)d.data(index);
|
||||
inline T dataAs(size_t index = 0) const {
|
||||
return *(const T *)d.data(index);
|
||||
}
|
||||
|
||||
//! \~english Clear array, remove all elements.
|
||||
|
||||
@@ -225,17 +225,20 @@ bool PIVariant::operator==(const PIVariant & v) const {
|
||||
PIVariant::Type PIVariant::typeFromName(const PIString & tname) {
|
||||
PIString s = tname.trimmed().toLowerCase().replaceAll(" ", "");
|
||||
if (s == "bool" || s == "boolean") return PIVariant::pivBool;
|
||||
if (s == "char" || s == "sbyte") return PIVariant::pivChar;
|
||||
if (s == "short" || s == "shortint" || s == "signedshort" || s == "signedshortint" || s == "sword") return PIVariant::pivShort;
|
||||
if (s == "int" || s == "signed" || s == "signedint") return PIVariant::pivInt;
|
||||
if (s == "char" || s == "sbyte" || s == "int8_t") return PIVariant::pivChar;
|
||||
if (s == "short" || s == "shortint" || s == "signedshort" || s == "signedshortint" || s == "sword" || s == "int16_t")
|
||||
return PIVariant::pivShort;
|
||||
if (s == "int" || s == "signed" || s == "signedint" || s == "int32_t") return PIVariant::pivInt;
|
||||
if (s == "long" || s == "longint" || s == "signedlong" || s == "signedlongint" || s == "sdword") return PIVariant::pivInt;
|
||||
if (s == "llong" || s == "longlong" || s == "longlongint" || s == "signedlonglong" || s == "signedlonglongint" || s == "sqword")
|
||||
if (s == "llong" || s == "longlong" || s == "longlongint" || s == "signedlonglong" || s == "signedlonglongint" || s == "sqword" ||
|
||||
s == "int64_t")
|
||||
return PIVariant::pivLLong;
|
||||
if (s == "uchar" || s == "byte") return PIVariant::pivUChar;
|
||||
if (s == "ushort" || s == "unsignedshort" || s == "unsignedshortint" || s == "word") return PIVariant::pivUShort;
|
||||
if (s == "uint" || s == "unsigned" || s == "unsignedint") return PIVariant::pivUInt;
|
||||
if (s == "uchar" || s == "byte" || s == "uint8_t") return PIVariant::pivUChar;
|
||||
if (s == "ushort" || s == "unsignedshort" || s == "unsignedshortint" || s == "word" || s == "uint16_t") return PIVariant::pivUShort;
|
||||
if (s == "uint" || s == "unsigned" || s == "unsignedint" || s == "uint32_t") return PIVariant::pivUInt;
|
||||
if (s == "ulong" || s == "unsignedlong" || s == "unsignedlongint" || s == "dword") return PIVariant::pivUInt;
|
||||
if (s == "ullong" || s == "unsignedlonglong" || s == "unsignedlonglongint" || s == "qword") return PIVariant::pivULLong;
|
||||
if (s == "ullong" || s == "unsignedlonglong" || s == "unsignedlonglongint" || s == "qword" || s == "uint64_t")
|
||||
return PIVariant::pivULLong;
|
||||
if (s == "float") return PIVariant::pivFloat;
|
||||
if (s == "double" || s == "real") return PIVariant::pivDouble;
|
||||
if (s == "ldouble" || s == "longdouble") return PIVariant::pivLDouble;
|
||||
@@ -709,6 +712,11 @@ int PIVariant::toInt() const {
|
||||
ba >> r;
|
||||
return (int)r.rgba;
|
||||
}
|
||||
case PIVariant::pivMathVector: {
|
||||
PIMathVectord r;
|
||||
ba >> r;
|
||||
return r.size() > 0 ? r[0] : 0;
|
||||
}
|
||||
case PIVariant::pivCustom: return getAsValue<int>(*this);
|
||||
default: break;
|
||||
}
|
||||
@@ -814,6 +822,11 @@ llong PIVariant::toLLong() const {
|
||||
ba >> r;
|
||||
return llong(r.selectedValue());
|
||||
}
|
||||
case PIVariant::pivMathVector: {
|
||||
PIMathVectord r;
|
||||
ba >> r;
|
||||
return r.size() > 0 ? r[0] : 0L;
|
||||
}
|
||||
case PIVariant::pivCustom: return getAsValue<llong>(*this);
|
||||
default: break;
|
||||
}
|
||||
@@ -919,6 +932,11 @@ float PIVariant::toFloat() const {
|
||||
ba >> r;
|
||||
return float(r.selectedValue());
|
||||
}
|
||||
case PIVariant::pivMathVector: {
|
||||
PIMathVectord r;
|
||||
ba >> r;
|
||||
return r.size() > 0 ? r[0] : 0.f;
|
||||
}
|
||||
case PIVariant::pivCustom: return getAsValue<float>(*this);
|
||||
default: break;
|
||||
}
|
||||
@@ -1024,6 +1042,11 @@ double PIVariant::toDouble() const {
|
||||
ba >> r;
|
||||
return double(r.selectedValue());
|
||||
}
|
||||
case PIVariant::pivMathVector: {
|
||||
PIMathVectord r;
|
||||
ba >> r;
|
||||
return r.size() > 0 ? r[0] : 0.;
|
||||
}
|
||||
case PIVariant::pivCustom: return getAsValue<double>(*this);
|
||||
default: break;
|
||||
}
|
||||
@@ -1129,6 +1152,11 @@ ldouble PIVariant::toLDouble() const {
|
||||
ba >> r;
|
||||
return ldouble(r.selectedValue());
|
||||
}
|
||||
case PIVariant::pivMathVector: {
|
||||
PIMathVectord r;
|
||||
ba >> r;
|
||||
return r.size() > 0 ? r[0] : 0.;
|
||||
}
|
||||
case PIVariant::pivCustom: return getAsValue<float>(*this);
|
||||
default: break;
|
||||
}
|
||||
@@ -1754,16 +1782,24 @@ PIVariantTypes::IODevice PIVariant::toIODevice() const {
|
||||
//!
|
||||
PIPointd PIVariant::toPoint() const {
|
||||
PIByteArray ba(_content);
|
||||
if (_type == PIVariant::pivPoint) {
|
||||
PIPointd r;
|
||||
ba >> r;
|
||||
return r;
|
||||
}
|
||||
if (_type == PIVariant::pivString) {
|
||||
PIString r;
|
||||
ba >> r;
|
||||
PIStringList l = r.split(';');
|
||||
if (l.size() >= 2) return PIPointd(l[0].toDouble(), l[1].toDouble());
|
||||
}
|
||||
if (_type == PIVariant::pivPoint) {
|
||||
PIPointd r;
|
||||
if (_type == PIVariant::pivMathVector) {
|
||||
PIMathVectord r;
|
||||
ba >> r;
|
||||
return r;
|
||||
PIPointd ret;
|
||||
if (r.size() > 0) ret.x = r[0];
|
||||
if (r.size() > 1) ret.y = r[1];
|
||||
return ret;
|
||||
}
|
||||
return PIPointd();
|
||||
}
|
||||
@@ -1880,6 +1916,14 @@ PIMathVectord PIVariant::toMathVector() const {
|
||||
ba >> r;
|
||||
return r;
|
||||
}
|
||||
if (_type == PIVariant::pivPoint) {
|
||||
PIPointd r;
|
||||
ba >> r;
|
||||
PIMathVectord ret(2);
|
||||
ret[0] = r.x;
|
||||
ret[1] = r.y;
|
||||
return ret;
|
||||
}
|
||||
return PIMathVectord();
|
||||
}
|
||||
|
||||
|
||||
37
libs/main/units/piunits.h
Normal file
37
libs/main/units/piunits.h
Normal file
@@ -0,0 +1,37 @@
|
||||
/*! \file piunits.h
|
||||
* \ingroup Core
|
||||
* \~\brief
|
||||
* \~english Unit conversions
|
||||
* \~russian Преобразование единиц измерения
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Unit conversions
|
||||
Ivan Pelipenko peri4ko@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 PIUNITS_H
|
||||
#define PIUNITS_H
|
||||
|
||||
#include "piunits_class_angle.h"
|
||||
#include "piunits_class_distance.h"
|
||||
#include "piunits_class_information.h"
|
||||
#include "piunits_class_pressure.h"
|
||||
#include "piunits_class_temperature.h"
|
||||
#include "piunits_class_time.h"
|
||||
#include "piunits_value.h"
|
||||
|
||||
#endif
|
||||
52
libs/main/units/piunits_base.cpp
Normal file
52
libs/main/units/piunits_base.cpp
Normal file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Unit conversions
|
||||
Ivan Pelipenko peri4ko@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/>.
|
||||
*/
|
||||
|
||||
#include "piunits_base.h"
|
||||
|
||||
#include "piliterals_string.h"
|
||||
|
||||
PIMap<int, PIUnits::Class::Internal::ClassBase *> PIUnits::Class::Internal::typeClasses;
|
||||
PIVector<PIUnits::Class::Internal::ClassBase *> PIUnits::Class::Internal::allTypeClasses;
|
||||
const PIString PIUnits::Class::Internal::unknown = "?"_a;
|
||||
|
||||
|
||||
PIString PIUnits::className(int type) {
|
||||
auto * uc = Class::Internal::typeClasses.value(type);
|
||||
if (!uc) return Class::Internal::unknown;
|
||||
return uc->className();
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::name(int type) {
|
||||
auto * uc = Class::Internal::typeClasses.value(type);
|
||||
if (!uc) return Class::Internal::unknown;
|
||||
return uc->name(type);
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::unit(int type) {
|
||||
auto * uc = Class::Internal::typeClasses.value(type);
|
||||
if (!uc) return Class::Internal::unknown;
|
||||
return uc->unit(type);
|
||||
}
|
||||
|
||||
|
||||
PIVector<PIUnits::Class::Internal::ClassBase *> PIUnits::allClasses() {
|
||||
return Class::Internal::allTypeClasses;
|
||||
}
|
||||
124
libs/main/units/piunits_base.h
Normal file
124
libs/main/units/piunits_base.h
Normal file
@@ -0,0 +1,124 @@
|
||||
/*! \file piunits_base.h
|
||||
* \ingroup Core
|
||||
* \~\brief
|
||||
* \~english Unit conversions
|
||||
* \~russian Преобразование единиц измерения
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Unit conversions
|
||||
Ivan Pelipenko peri4ko@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 PIUNITS_BASE_H
|
||||
#define PIUNITS_BASE_H
|
||||
|
||||
#include "pitranslator.h"
|
||||
|
||||
#define DECLARE_UNIT_CLASS_BEGIN(Name, StartIndex) \
|
||||
namespace PIUnits { \
|
||||
namespace Class { \
|
||||
class PIP_EXPORT Name \
|
||||
: public Internal::ClassBase \
|
||||
, public Internal::Registrator<Name> { \
|
||||
private: \
|
||||
friend class Internal::Registrator<Name>; \
|
||||
constexpr static int typeStart = StartIndex; \
|
||||
PIString name(int type) const override; \
|
||||
PIString unit(int type) const override; \
|
||||
PIString valueToString(double v, char format, int prec) const override; \
|
||||
double convert(double v, int from, int to) const override; \
|
||||
bool supportPrefixes(int type) const override; \
|
||||
bool supportPrefixesNon3(int type) const override; \
|
||||
bool supportPrefixesGreater(int type) const override; \
|
||||
bool supportPrefixesSmaller(int type) const override; \
|
||||
\
|
||||
public: \
|
||||
PIString className() const override { \
|
||||
return piTr(#Name, "PIUnits"); \
|
||||
} \
|
||||
uint classID() const override { \
|
||||
static uint ret = PIStringAscii(#Name).hash(); \
|
||||
return ret; \
|
||||
}
|
||||
|
||||
|
||||
#define DECLARE_UNIT_CLASS_END(Name) \
|
||||
} \
|
||||
; \
|
||||
} \
|
||||
} \
|
||||
STATIC_INITIALIZER_BEGIN \
|
||||
PIUnits::Class::Name::registerSelf(); \
|
||||
STATIC_INITIALIZER_END
|
||||
|
||||
namespace PIUnits {
|
||||
|
||||
PIP_EXPORT PIString className(int type);
|
||||
PIP_EXPORT PIString name(int type);
|
||||
PIP_EXPORT PIString unit(int type);
|
||||
|
||||
namespace Class {
|
||||
|
||||
enum {
|
||||
Invalid = -1
|
||||
};
|
||||
|
||||
class PIP_EXPORT Internal {
|
||||
public:
|
||||
class PIP_EXPORT ClassBase {
|
||||
public:
|
||||
virtual uint classID() const = 0;
|
||||
virtual PIString className() const = 0;
|
||||
virtual PIString name(int type) const = 0;
|
||||
virtual PIString unit(int type) const = 0;
|
||||
virtual PIString valueToString(double v, char format = 'g', int prec = 5) const = 0;
|
||||
virtual double convert(double v, int from, int to) const = 0;
|
||||
virtual bool supportPrefixes(int type) const { return true; }
|
||||
virtual bool supportPrefixesNon3(int type) const { return false; }
|
||||
virtual bool supportPrefixesGreater(int type) const { return true; }
|
||||
virtual bool supportPrefixesSmaller(int type) const { return true; }
|
||||
const PIVector<int> & allTypes() const { return types; }
|
||||
|
||||
protected:
|
||||
PIVector<int> types;
|
||||
};
|
||||
template<typename P>
|
||||
class Registrator {
|
||||
public:
|
||||
static void registerSelf() {
|
||||
auto * uc = new P();
|
||||
for (int t = P::typeStart; t < P::_LastType; ++t) {
|
||||
uc->types << t;
|
||||
Internal::typeClasses[t] = uc;
|
||||
}
|
||||
if (!Internal::allTypeClasses.contains(uc)) Internal::allTypeClasses << uc;
|
||||
}
|
||||
};
|
||||
static PIMap<int, ClassBase *> typeClasses;
|
||||
static PIVector<ClassBase *> allTypeClasses;
|
||||
static const PIString unknown;
|
||||
};
|
||||
|
||||
|
||||
} // namespace Class
|
||||
|
||||
PIP_EXPORT PIVector<Class::Internal::ClassBase *> allClasses();
|
||||
|
||||
} // namespace PIUnits
|
||||
|
||||
|
||||
#endif
|
||||
74
libs/main/units/piunits_class_angle.cpp
Normal file
74
libs/main/units/piunits_class_angle.cpp
Normal file
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Angle units
|
||||
Ivan Pelipenko peri4ko@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/>.
|
||||
*/
|
||||
|
||||
#include "piunits_class_angle.h"
|
||||
|
||||
#include "pimathbase.h"
|
||||
|
||||
|
||||
PIString PIUnits::Class::Angle::name(int type) const {
|
||||
switch (type) {
|
||||
case Degree: return "degree"_tr("PIUnitsAngle");
|
||||
case Radian: return "radian"_tr("PIUnitsAngle");
|
||||
}
|
||||
return Class::Internal::unknown;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Class::Angle::unit(int type) const {
|
||||
switch (type) {
|
||||
case Degree: return "°"_tr("PIUnitsAngle");
|
||||
case Radian: return "rad"_tr("PIUnitsAngle");
|
||||
}
|
||||
return Class::Internal::unknown;
|
||||
}
|
||||
|
||||
|
||||
double PIUnits::Class::Angle::convert(double v, int from, int to) const {
|
||||
switch (to) {
|
||||
case Degree: return toDeg(v);
|
||||
case Radian: return toRad(v);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Class::Angle::valueToString(double v, char format, int prec) const {
|
||||
return PIString::fromNumber(v, format, prec);
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Angle::supportPrefixes(int type) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Angle::supportPrefixesNon3(int type) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Angle::supportPrefixesGreater(int type) const {
|
||||
return ClassBase::supportPrefixesGreater(type);
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Angle::supportPrefixesSmaller(int type) const {
|
||||
return ClassBase::supportPrefixesSmaller(type);
|
||||
}
|
||||
39
libs/main/units/piunits_class_angle.h
Normal file
39
libs/main/units/piunits_class_angle.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*! \file piunits_class_angle.h
|
||||
* \ingroup Core
|
||||
* \~\brief
|
||||
* \~english Angle units
|
||||
* \~russian Единицы измерения угла
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Angle units
|
||||
Ivan Pelipenko peri4ko@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 PIUNITS_CLASS_ANGLE_H
|
||||
#define PIUNITS_CLASS_ANGLE_H
|
||||
|
||||
#include "piunits_base.h"
|
||||
|
||||
DECLARE_UNIT_CLASS_BEGIN(Angle, 0x200)
|
||||
enum {
|
||||
Degree = typeStart,
|
||||
Radian,
|
||||
_LastType,
|
||||
};
|
||||
DECLARE_UNIT_CLASS_END(Angle)
|
||||
|
||||
#endif
|
||||
69
libs/main/units/piunits_class_distance.cpp
Normal file
69
libs/main/units/piunits_class_distance.cpp
Normal file
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Distance units
|
||||
Ivan Pelipenko peri4ko@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/>.
|
||||
*/
|
||||
|
||||
#include "piunits_class_distance.h"
|
||||
|
||||
|
||||
PIString PIUnits::Class::Distance::name(int type) const {
|
||||
switch (type) {
|
||||
case Meter: return "meter"_tr("PIUnitsDistance");
|
||||
}
|
||||
return Class::Internal::unknown;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Class::Distance::unit(int type) const {
|
||||
switch (type) {
|
||||
case Meter: return "m"_tr("PIUnitsDistance");
|
||||
}
|
||||
return Class::Internal::unknown;
|
||||
}
|
||||
|
||||
|
||||
double PIUnits::Class::Distance::convert(double v, int from, int to) const {
|
||||
switch (to) {
|
||||
case Meter: return v;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Class::Distance::valueToString(double v, char format, int prec) const {
|
||||
return PIString::fromNumber(v, format, prec);
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Distance::supportPrefixes(int type) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Distance::supportPrefixesNon3(int type) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Distance::supportPrefixesGreater(int type) const {
|
||||
return ClassBase::supportPrefixesGreater(type);
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Distance::supportPrefixesSmaller(int type) const {
|
||||
return ClassBase::supportPrefixesSmaller(type);
|
||||
}
|
||||
38
libs/main/units/piunits_class_distance.h
Normal file
38
libs/main/units/piunits_class_distance.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*! \file piunits_class_distance.h
|
||||
* \ingroup Core
|
||||
* \~\brief
|
||||
* \~english Distance units
|
||||
* \~russian Единицы измерения расстояния
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Distance units
|
||||
Ivan Pelipenko peri4ko@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 PIUNITS_CLASS_DISTANCE_H
|
||||
#define PIUNITS_CLASS_DISTANCE_H
|
||||
|
||||
#include "piunits_base.h"
|
||||
|
||||
DECLARE_UNIT_CLASS_BEGIN(Distance, 0x600)
|
||||
enum {
|
||||
Meter = typeStart,
|
||||
_LastType,
|
||||
};
|
||||
DECLARE_UNIT_CLASS_END(Distance)
|
||||
|
||||
#endif
|
||||
72
libs/main/units/piunits_class_information.cpp
Normal file
72
libs/main/units/piunits_class_information.cpp
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Information units
|
||||
Ivan Pelipenko peri4ko@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/>.
|
||||
*/
|
||||
|
||||
#include "piunits_class_information.h"
|
||||
|
||||
|
||||
PIString PIUnits::Class::Information::name(int type) const {
|
||||
switch (type) {
|
||||
case Bit: return "bit"_tr("PIUnitsInformation");
|
||||
case Byte: return "byte"_tr("PIUnitsInformation");
|
||||
}
|
||||
return Class::Internal::unknown;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Class::Information::unit(int type) const {
|
||||
switch (type) {
|
||||
case Bit: return "b"_tr("PIUnitsInformation");
|
||||
case Byte: return "B"_tr("PIUnitsInformation");
|
||||
}
|
||||
return Class::Internal::unknown;
|
||||
}
|
||||
|
||||
|
||||
double PIUnits::Class::Information::convert(double v, int from, int to) const {
|
||||
switch (to) {
|
||||
case Bit: return v * 8;
|
||||
case Byte: return v / 8;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Class::Information::valueToString(double v, char format, int prec) const {
|
||||
return PIString::fromNumber(static_cast<llong>(v));
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Information::supportPrefixes(int type) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Information::supportPrefixesNon3(int type) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Information::supportPrefixesGreater(int type) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Information::supportPrefixesSmaller(int type) const {
|
||||
return false;
|
||||
}
|
||||
39
libs/main/units/piunits_class_information.h
Normal file
39
libs/main/units/piunits_class_information.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*! \file piunits_class_information.h
|
||||
* \ingroup Core
|
||||
* \~\brief
|
||||
* \~english Information units
|
||||
* \~russian Единицы измерения информации
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Information units
|
||||
Ivan Pelipenko peri4ko@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 PIUNITS_CLASS_INFORMATION_H
|
||||
#define PIUNITS_CLASS_INFORMATION_H
|
||||
|
||||
#include "piunits_base.h"
|
||||
|
||||
DECLARE_UNIT_CLASS_BEGIN(Information, 0x100)
|
||||
enum {
|
||||
Bit = typeStart,
|
||||
Byte,
|
||||
_LastType,
|
||||
};
|
||||
DECLARE_UNIT_CLASS_END(Information)
|
||||
|
||||
#endif
|
||||
86
libs/main/units/piunits_class_pressure.cpp
Normal file
86
libs/main/units/piunits_class_pressure.cpp
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Pressure units
|
||||
Ivan Pelipenko peri4ko@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/>.
|
||||
*/
|
||||
|
||||
#include "piunits_class_pressure.h"
|
||||
|
||||
|
||||
PIString PIUnits::Class::Pressure::name(int type) const {
|
||||
switch (type) {
|
||||
case Pascal: return "pascal"_tr("PIUnitsPressure");
|
||||
case Atmosphere: return "atmosphere"_tr("PIUnitsPressure");
|
||||
case Bar: return "bar"_tr("PIUnitsPressure");
|
||||
case MillimetreOfMercury: return "mm Hg"_tr("PIUnitsPressure");
|
||||
}
|
||||
return Class::Internal::unknown;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Class::Pressure::unit(int type) const {
|
||||
switch (type) {
|
||||
case Pascal: return "Pa"_tr("PIUnitsPressure");
|
||||
case Atmosphere: return "atm"_tr("PIUnitsPressure");
|
||||
case Bar: return "bar"_tr("PIUnitsPressure");
|
||||
case MillimetreOfMercury: return "mmHg"_tr("PIUnitsPressure");
|
||||
}
|
||||
return Class::Internal::unknown;
|
||||
}
|
||||
|
||||
|
||||
double PIUnits::Class::Pressure::convert(double v, int from, int to) const {
|
||||
double pa = v;
|
||||
switch (from) {
|
||||
case Atmosphere: pa /= 9.86923E-6; break;
|
||||
case Bar: pa /= 1.E-5; break;
|
||||
case MillimetreOfMercury: pa *= 133.322387415; break;
|
||||
default: break;
|
||||
}
|
||||
switch (to) {
|
||||
case Atmosphere: return pa * 9.86923E-6;
|
||||
case Bar: return pa * 1.E-5;
|
||||
case MillimetreOfMercury: return pa / 133.322387415;
|
||||
default: break;
|
||||
}
|
||||
return pa;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Class::Pressure::valueToString(double v, char format, int prec) const {
|
||||
return PIString::fromNumber(v, format, prec);
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Pressure::supportPrefixes(int type) const {
|
||||
if (type == Pascal) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Pressure::supportPrefixesNon3(int type) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Pressure::supportPrefixesGreater(int type) const {
|
||||
return ClassBase::supportPrefixesGreater(type);
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Pressure::supportPrefixesSmaller(int type) const {
|
||||
return ClassBase::supportPrefixesSmaller(type);
|
||||
}
|
||||
41
libs/main/units/piunits_class_pressure.h
Normal file
41
libs/main/units/piunits_class_pressure.h
Normal file
@@ -0,0 +1,41 @@
|
||||
/*! \file piunits_class_pressure.h
|
||||
* \ingroup Core
|
||||
* \~\brief
|
||||
* \~english Pressure units
|
||||
* \~russian Единицы измерения давления
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Pressure units
|
||||
Ivan Pelipenko peri4ko@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 PIUNITS_CLASS_PRESSURE_H
|
||||
#define PIUNITS_CLASS_PRESSURE_H
|
||||
|
||||
#include "piunits_base.h"
|
||||
|
||||
DECLARE_UNIT_CLASS_BEGIN(Pressure, 0x500)
|
||||
enum {
|
||||
Pascal = typeStart,
|
||||
Atmosphere,
|
||||
Bar,
|
||||
MillimetreOfMercury,
|
||||
_LastType,
|
||||
};
|
||||
DECLARE_UNIT_CLASS_END(Pressure)
|
||||
|
||||
#endif
|
||||
82
libs/main/units/piunits_class_temperature.cpp
Normal file
82
libs/main/units/piunits_class_temperature.cpp
Normal file
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Temperature units
|
||||
Ivan Pelipenko peri4ko@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/>.
|
||||
*/
|
||||
|
||||
#include "piunits_class_temperature.h"
|
||||
|
||||
|
||||
PIString PIUnits::Class::Temperature::name(int type) const {
|
||||
switch (type) {
|
||||
case Kelvin: return "Kelvin"_tr("PIUnitsTemperature");
|
||||
case Celsius: return "Celsius"_tr("PIUnitsTemperature");
|
||||
case Fahrenheit: return "Fahrenheit"_tr("PIUnitsTemperature");
|
||||
}
|
||||
return Class::Internal::unknown;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Class::Temperature::unit(int type) const {
|
||||
switch (type) {
|
||||
case Kelvin: return "K"_tr("PIUnitsTemperature");
|
||||
case Celsius: return "°C"_tr("PIUnitsTemperature");
|
||||
case Fahrenheit: return "°F"_tr("PIUnitsTemperature");
|
||||
}
|
||||
return Class::Internal::unknown;
|
||||
}
|
||||
|
||||
|
||||
double PIUnits::Class::Temperature::convert(double v, int from, int to) const {
|
||||
double K = v;
|
||||
switch (from) {
|
||||
case Celsius: K += 273.15; break;
|
||||
case Fahrenheit: K = (v + 459.67) * (5. / 9.); break;
|
||||
default: break;
|
||||
}
|
||||
switch (to) {
|
||||
case Celsius: return K - 273.15;
|
||||
case Fahrenheit: return (K * (9. / 5.) - 459.67);
|
||||
default: break;
|
||||
}
|
||||
return K;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Class::Temperature::valueToString(double v, char format, int prec) const {
|
||||
return PIString::fromNumber(v, format, prec);
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Temperature::supportPrefixes(int type) const {
|
||||
if (type == Kelvin) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Temperature::supportPrefixesNon3(int type) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Temperature::supportPrefixesGreater(int type) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Temperature::supportPrefixesSmaller(int type) const {
|
||||
return false;
|
||||
}
|
||||
40
libs/main/units/piunits_class_temperature.h
Normal file
40
libs/main/units/piunits_class_temperature.h
Normal file
@@ -0,0 +1,40 @@
|
||||
/*! \file piunits_class_temperature.h
|
||||
* \ingroup Core
|
||||
* \~\brief
|
||||
* \~english Temperature units
|
||||
* \~russian Единицы измерения температуры
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Temperature units
|
||||
Ivan Pelipenko peri4ko@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 PIUNITS_CLASS_TEMPERATURE_H
|
||||
#define PIUNITS_CLASS_TEMPERATURE_H
|
||||
|
||||
#include "piunits_base.h"
|
||||
|
||||
DECLARE_UNIT_CLASS_BEGIN(Temperature, 0x400)
|
||||
enum {
|
||||
Kelvin = typeStart,
|
||||
Celsius,
|
||||
Fahrenheit,
|
||||
_LastType,
|
||||
};
|
||||
DECLARE_UNIT_CLASS_END(Temperature)
|
||||
|
||||
#endif
|
||||
75
libs/main/units/piunits_class_time.cpp
Normal file
75
libs/main/units/piunits_class_time.cpp
Normal file
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Time units
|
||||
Ivan Pelipenko peri4ko@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/>.
|
||||
*/
|
||||
|
||||
#include "piunits_class_time.h"
|
||||
|
||||
|
||||
PIString PIUnits::Class::Time::name(int type) const {
|
||||
switch (type) {
|
||||
case Second: return "second"_tr("PIUnitsTime");
|
||||
case Hertz: return "hertz"_tr("PIUnitsTime");
|
||||
}
|
||||
return Class::Internal::unknown;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Class::Time::unit(int type) const {
|
||||
switch (type) {
|
||||
case Second: return "s"_tr("PIUnitsTime");
|
||||
case Hertz: return "Hz"_tr("PIUnitsTime");
|
||||
}
|
||||
return Class::Internal::unknown;
|
||||
}
|
||||
|
||||
|
||||
double PIUnits::Class::Time::convert(double v, int from, int to) const {
|
||||
if (piCompared(v, 0.)) return 0.;
|
||||
switch (to) {
|
||||
case Second: return 1. / v;
|
||||
case Hertz: return 1. / v;
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Class::Time::valueToString(double v, char format, int prec) const {
|
||||
return PIString::fromNumber(v, format, prec);
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Time::supportPrefixes(int type) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Time::supportPrefixesNon3(int type) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Time::supportPrefixesGreater(int type) const {
|
||||
if (type == Hertz) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Class::Time::supportPrefixesSmaller(int type) const {
|
||||
if (type == Second) return true;
|
||||
return false;
|
||||
}
|
||||
39
libs/main/units/piunits_class_time.h
Normal file
39
libs/main/units/piunits_class_time.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*! \file piunits_class_time.h
|
||||
* \ingroup Core
|
||||
* \~\brief
|
||||
* \~english Time units
|
||||
* \~russian Единицы измерения времени
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Time units
|
||||
Ivan Pelipenko peri4ko@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 PIUNITS_CLASS_TIME_H
|
||||
#define PIUNITS_CLASS_TIME_H
|
||||
|
||||
#include "piunits_base.h"
|
||||
|
||||
DECLARE_UNIT_CLASS_BEGIN(Time, 0x300)
|
||||
enum {
|
||||
Second = typeStart,
|
||||
Hertz,
|
||||
_LastType,
|
||||
};
|
||||
DECLARE_UNIT_CLASS_END(Time)
|
||||
|
||||
#endif
|
||||
137
libs/main/units/piunits_prefix.cpp
Normal file
137
libs/main/units/piunits_prefix.cpp
Normal file
@@ -0,0 +1,137 @@
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Unit prefix
|
||||
Ivan Pelipenko peri4ko@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/>.
|
||||
*/
|
||||
|
||||
#include "piunits_prefix.h"
|
||||
|
||||
#include "piliterals_string.h"
|
||||
#include "pimathbase.h"
|
||||
#include "pitranslator.h"
|
||||
#include "piunits_base.h"
|
||||
|
||||
// quetta Q 10^30 1000000000000000000000000000000
|
||||
// ronna R 10^27 1000000000000000000000000000
|
||||
// yotta Y 10^24 1000000000000000000000000
|
||||
// zetta Z 10^21 1000000000000000000000
|
||||
// exa E 10^18 1000000000000000000
|
||||
// peta P 10^15 1000000000000000
|
||||
// tera T 10^12 1000000000000
|
||||
// giga G 10^9 1000000000
|
||||
// mega M 10^6 1000000
|
||||
// kilo k 10^3 1000
|
||||
// hecto h 10^2 100
|
||||
// deca da 10^1 10
|
||||
// — — 100 1 —
|
||||
// deci d 10^−1 0.1
|
||||
// centi c 10^−2 0.01
|
||||
// milli m 10^−3 0.001
|
||||
// micro μ 10^−6 0.000001
|
||||
// nano n 10^−9 0.000000001
|
||||
// pico p 10^−12 0.000000000001
|
||||
// femto f 10^−15 0.000000000000001
|
||||
// atto a 10^−18 0.000000000000000001
|
||||
// zepto z 10^−21 0.000000000000000000001
|
||||
// yocto y 10^−24 0.000000000000000000000001
|
||||
// ronto r 10^−27 0.000000000000000000000000001
|
||||
|
||||
|
||||
PIString PIUnits::Prefix::name(int prefix) {
|
||||
return instance().getPrefix(prefix).name;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Prefix::prefix(int prefix) {
|
||||
return instance().getPrefix(prefix).prefix;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Prefix::valueToString(double v, void * type_class, int type, char format, int prec) {
|
||||
auto * tc = reinterpret_cast<PIUnits::Class::Internal::ClassBase *>(type_class);
|
||||
auto p =
|
||||
instance().getPrefixForValue(v, tc->supportPrefixesNon3(type), tc->supportPrefixesGreater(type), tc->supportPrefixesSmaller(type));
|
||||
return PIString::fromNumber(v / p.divider, format, prec) + " "_a + p.prefix;
|
||||
}
|
||||
|
||||
|
||||
double PIUnits::Prefix::multiplier(int prefix) {
|
||||
return instance().getPrefix(prefix).divider;
|
||||
}
|
||||
|
||||
|
||||
PIUnits::Prefix::Prefix() {
|
||||
def_prefix = {"", "", 0, 1., false};
|
||||
// clang-format off
|
||||
prefixes = {
|
||||
|
||||
{Deca, {"deca"_tr ("PIUnits"), "da"_tr("PIUnits") , 1 , pow10(1. ), true }},
|
||||
{Hecto, {"hecto"_tr ("PIUnits"), "h"_tr ("PIUnits") , 2 , pow10(2. ), true }},
|
||||
{Kilo, {"kilo"_tr ("PIUnits"), "k"_tr ("PIUnits") , 3 , pow10(3. ), false}},
|
||||
{Mega, {"mega"_tr ("PIUnits"), "M"_tr ("PIUnits") , 6 , pow10(6. ), false}},
|
||||
{Giga, {"giga"_tr ("PIUnits"), "G"_tr ("PIUnits") , 9 , pow10(9. ), false}},
|
||||
{Tera, {"tera"_tr ("PIUnits"), "T"_tr ("PIUnits") , 12 , pow10(12. ), false}},
|
||||
{Peta, {"peta"_tr ("PIUnits"), "P"_tr ("PIUnits") , 15 , pow10(15. ), false}},
|
||||
{Exa, {"exa"_tr ("PIUnits"), "E"_tr ("PIUnits") , 18 , pow10(18. ), false}},
|
||||
{Zetta, {"zetta"_tr ("PIUnits"), "Z"_tr ("PIUnits") , 21 , pow10(21. ), false}},
|
||||
{Yotta, {"yotta"_tr ("PIUnits"), "Y"_tr ("PIUnits") , 24 , pow10(24. ), false}},
|
||||
{Ronna, {"ronna"_tr ("PIUnits"), "R"_tr ("PIUnits") , 27 , pow10(27. ), false}},
|
||||
{Quetta, {"quetta"_tr("PIUnits"), "Q"_tr ("PIUnits") , 30 , pow10(30. ), false}},
|
||||
|
||||
{Deci, {"deci"_tr ("PIUnits"), "d"_tr ("PIUnits") , -1 , pow10(-1. ), true }},
|
||||
{Centi, {"centi"_tr ("PIUnits"), "c"_tr ("PIUnits") , -2 , pow10(-2. ), true }},
|
||||
{Milli, {"milli"_tr ("PIUnits"), "m"_tr ("PIUnits") , -3 , pow10(-3. ), false}},
|
||||
{Micro, {"micro"_tr ("PIUnits"), "u"_tr ("PIUnits") , -6 , pow10(-6. ), false}},
|
||||
{Nano, {"nano"_tr ("PIUnits"), "n"_tr ("PIUnits") , -9 , pow10(-9. ), false}},
|
||||
{Pico, {"pico"_tr ("PIUnits"), "p"_tr ("PIUnits") , -12, pow10(-12.), false}},
|
||||
{Femto, {"femto"_tr ("PIUnits"), "f"_tr ("PIUnits") , -15, pow10(-15.), false}},
|
||||
{Atto, {"atto"_tr ("PIUnits"), "a"_tr ("PIUnits") , -18, pow10(-18.), false}},
|
||||
{Zepto, {"zepto"_tr ("PIUnits"), "z"_tr ("PIUnits") , -21, pow10(-21.), false}},
|
||||
{Yocto, {"yocto"_tr ("PIUnits"), "y"_tr ("PIUnits") , -24, pow10(-24.), false}},
|
||||
{Ronto, {"ronto"_tr ("PIUnits"), "r"_tr ("PIUnits") , -27, pow10(-27.), false}},
|
||||
};
|
||||
// clang-format on
|
||||
auto it = prefixes.makeIterator();
|
||||
while (it.next()) {
|
||||
prefixes_by_pow[it.value().pow] = &it.value();
|
||||
}
|
||||
prefixes_by_pow[0] = &def_prefix;
|
||||
}
|
||||
|
||||
|
||||
const PIUnits::Prefix::P PIUnits::Prefix::getPrefixForValue(double v, bool use_non3, bool use_greater, bool use_smaller) const {
|
||||
auto it = prefixes_by_pow.makeIterator();
|
||||
const P * ret = &def_prefix;
|
||||
while (it.next()) {
|
||||
if (it.value()->pow < 0 && !use_smaller) continue;
|
||||
if (it.value()->pow > 0 && !use_greater) continue;
|
||||
if (it.value()->non3 && !use_non3) continue;
|
||||
if (v < it.value()->divider) return *ret;
|
||||
ret = it.value();
|
||||
}
|
||||
return def_prefix;
|
||||
}
|
||||
|
||||
|
||||
const PIUnits::Prefix::P PIUnits::Prefix::getPrefix(int p) const {
|
||||
return prefixes.value(p, def_prefix);
|
||||
}
|
||||
|
||||
|
||||
PIUnits::Prefix & PIUnits::Prefix::instance() {
|
||||
static Prefix ret;
|
||||
return ret;
|
||||
}
|
||||
95
libs/main/units/piunits_prefix.h
Normal file
95
libs/main/units/piunits_prefix.h
Normal file
@@ -0,0 +1,95 @@
|
||||
/*! \file piunits_prefix.h
|
||||
* \ingroup Core
|
||||
* \~\brief
|
||||
* \~english Unit prefixes
|
||||
* \~russian Префиксы единиц измерения
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Unit prefix
|
||||
Ivan Pelipenko peri4ko@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 PIUNITS_PREFIX_H
|
||||
#define PIUNITS_PREFIX_H
|
||||
|
||||
#include "pistring.h"
|
||||
|
||||
namespace PIUnits {
|
||||
|
||||
class PIP_EXPORT Prefix {
|
||||
friend class Value;
|
||||
|
||||
public:
|
||||
enum {
|
||||
None,
|
||||
|
||||
Deca = 0x100, // da 10^1 10
|
||||
Hecto, // h 10^2 100
|
||||
Kilo, // k 10^3 1000
|
||||
Mega, // M 10^6 1000000
|
||||
Giga, // G 10^9 1000000000
|
||||
Tera, // T 10^12 1000000000000
|
||||
Peta, // P 10^15 1000000000000000
|
||||
Exa, // E 10^18 1000000000000000000
|
||||
Zetta, // Z 10^21 1000000000000000000000
|
||||
Yotta, // Y 10^24 1000000000000000000000000
|
||||
Ronna, // R 10^27 1000000000000000000000000000
|
||||
Quetta, // Q 10^30 1000000000000000000000000000000
|
||||
|
||||
Deci = 0x200, // d 10^−1 0.1
|
||||
Centi, // c 10^−2 0.01
|
||||
Milli, // m 10^−3 0.001
|
||||
Micro, // μ 10^−6 0.000001
|
||||
Nano, // n 10^−9 0.000000001
|
||||
Pico, // p 10^−12 0.000000000001
|
||||
Femto, // f 10^−15 0.000000000000001
|
||||
Atto, // a 10^−18 0.000000000000000001
|
||||
Zepto, // z 10^−21 0.000000000000000000001
|
||||
Yocto, // y 10^−24 0.000000000000000000000001
|
||||
Ronto, // r 10^−27 0.000000000000000000000000001
|
||||
};
|
||||
|
||||
static PIString name(int prefix);
|
||||
static PIString prefix(int prefix);
|
||||
static double multiplier(int prefix);
|
||||
|
||||
private:
|
||||
Prefix();
|
||||
NO_COPY_CLASS(Prefix);
|
||||
static Prefix & instance();
|
||||
static PIString valueToString(double v, void * type_class, int type, char format = 'g', int prec = 5);
|
||||
|
||||
struct P {
|
||||
PIString name;
|
||||
PIString prefix;
|
||||
int pow;
|
||||
double divider;
|
||||
bool non3;
|
||||
};
|
||||
|
||||
const P getPrefix(int p) const;
|
||||
const P getPrefixForValue(double v, bool use_non3, bool use_greater, bool use_smaller) const;
|
||||
|
||||
PIMap<int, P> prefixes;
|
||||
PIMap<int, P *> prefixes_by_pow;
|
||||
P def_prefix;
|
||||
};
|
||||
|
||||
} // namespace PIUnits
|
||||
|
||||
|
||||
#endif
|
||||
60
libs/main/units/piunits_value.cpp
Normal file
60
libs/main/units/piunits_value.cpp
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Unit value
|
||||
Ivan Pelipenko peri4ko@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/>.
|
||||
*/
|
||||
|
||||
#include "piunits_value.h"
|
||||
|
||||
#include "piliterals_string.h"
|
||||
#include "piunits_prefix.h"
|
||||
|
||||
|
||||
PIUnits::Value::Value(double v, int t) {
|
||||
m_value = v;
|
||||
m_class = Class::Internal::typeClasses.value(t);
|
||||
if (m_class) m_type = t;
|
||||
}
|
||||
|
||||
|
||||
PIString PIUnits::Value::toString(char format, int prec) const {
|
||||
if (isNotValid()) return Class::Internal::unknown;
|
||||
PIString ret;
|
||||
if (m_class->supportPrefixes(m_type)) {
|
||||
ret = Prefix::valueToString(m_value, m_class, m_type, format, prec);
|
||||
} else
|
||||
ret = m_class->valueToString(m_value, format, prec) + " "_a;
|
||||
ret += m_class->unit(m_type);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
bool PIUnits::Value::convert(int type_to) {
|
||||
if (m_type == type_to) return true;
|
||||
auto * class_to = Class::Internal::typeClasses.value(type_to);
|
||||
if (!class_to) return false;
|
||||
if (m_class->classID() != class_to->classID()) return false;
|
||||
m_value = m_class->convert(m_value, m_type, type_to);
|
||||
m_type = type_to;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
PIUnits::Value PIUnits::Value::converted(int type_to) {
|
||||
Value ret(*this);
|
||||
if (!ret.convert(type_to)) return {};
|
||||
return ret;
|
||||
}
|
||||
60
libs/main/units/piunits_value.h
Normal file
60
libs/main/units/piunits_value.h
Normal file
@@ -0,0 +1,60 @@
|
||||
/*! \file piunits_value.h
|
||||
* \ingroup Core
|
||||
* \~\brief
|
||||
* \~english Unit value
|
||||
* \~russian Единица измерения
|
||||
*/
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Unit value
|
||||
Ivan Pelipenko peri4ko@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 PIUNITS_VALUE_H
|
||||
#define PIUNITS_VALUE_H
|
||||
|
||||
#include "piunits_base.h"
|
||||
|
||||
|
||||
namespace PIUnits {
|
||||
|
||||
class PIP_EXPORT Value {
|
||||
public:
|
||||
Value(double v = 0., int t = Class::Invalid);
|
||||
|
||||
bool isValid() const { return m_type >= 0 && m_class; }
|
||||
bool isNotValid() const { return m_type < 0 || !m_class; }
|
||||
|
||||
double value() const { return m_value; }
|
||||
PIString toString(char format = 'g', int prec = 5) const;
|
||||
|
||||
bool convert(int type_to);
|
||||
Value converted(int type_to);
|
||||
|
||||
private:
|
||||
double m_value = 0.;
|
||||
int m_type = -1;
|
||||
Class::Internal::ClassBase * m_class = nullptr;
|
||||
};
|
||||
|
||||
}; // namespace PIUnits
|
||||
|
||||
inline PICout operator<<(PICout s, const PIUnits::Value & v) {
|
||||
s << v.toString();
|
||||
return s;
|
||||
}
|
||||
|
||||
#endif
|
||||
437
main.cpp
437
main.cpp
@@ -3,410 +3,71 @@
|
||||
#include "pidigest.h"
|
||||
#include "pihttpclient.h"
|
||||
#include "pip.h"
|
||||
#include "piunits.h"
|
||||
#include "pivaluetree_conversions.h"
|
||||
|
||||
using namespace PICoutManipulators;
|
||||
using namespace PIHTTP;
|
||||
|
||||
|
||||
struct SN {
|
||||
int _ii;
|
||||
complexf _co;
|
||||
PIIODevice::DeviceMode m;
|
||||
};
|
||||
struct S {
|
||||
bool _b;
|
||||
int _i;
|
||||
float _f;
|
||||
PIString str;
|
||||
// SN _sn;
|
||||
PIVector2D<bool> v2d;
|
||||
PIByteArray ba;
|
||||
PISystemTime st;
|
||||
PINetworkAddress na;
|
||||
PIPointd po;
|
||||
PILined li;
|
||||
PIRectd re;
|
||||
};
|
||||
|
||||
template<>
|
||||
PIJSON piSerializeJSON(const SN & v) {
|
||||
PIJSON ret;
|
||||
ret["_ii"] = piSerializeJSON(v._ii);
|
||||
ret["_co"] = piSerializeJSON(v._co);
|
||||
ret["m"] = piSerializeJSON(v.m);
|
||||
return ret;
|
||||
}
|
||||
template<>
|
||||
PIJSON piSerializeJSON(const S & v) {
|
||||
PIJSON ret;
|
||||
ret["_b"] = piSerializeJSON(v._b);
|
||||
ret["_i"] = piSerializeJSON(v._i);
|
||||
ret["_f"] = piSerializeJSON(v._f);
|
||||
ret["str"] = piSerializeJSON(v.str);
|
||||
// ret["_sn"] = piSerializeJSON(v._sn);
|
||||
ret["v2d"] = piSerializeJSON(v.v2d);
|
||||
ret["ba"] = piSerializeJSON(v.ba);
|
||||
ret["st"] = piSerializeJSON(v.st);
|
||||
ret["na"] = piSerializeJSON(v.na);
|
||||
ret["po"] = piSerializeJSON(v.po);
|
||||
ret["li"] = piSerializeJSON(v.li);
|
||||
ret["re"] = piSerializeJSON(v.re);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
template<>
|
||||
void piDeserializeJSON(SN & v, const PIJSON & js) {
|
||||
v = {};
|
||||
piDeserializeJSON(v._ii, js["_ii"]);
|
||||
piDeserializeJSON(v._co, js["_co"]);
|
||||
piDeserializeJSON(v.m, js["m"]);
|
||||
}
|
||||
template<>
|
||||
void piDeserializeJSON(S & v, const PIJSON & js) {
|
||||
v = {};
|
||||
piDeserializeJSON(v._b, js["_b"]);
|
||||
piDeserializeJSON(v._i, js["_i"]);
|
||||
piDeserializeJSON(v._f, js["_f"]);
|
||||
piDeserializeJSON(v.str, js["str"]);
|
||||
// piDeserializeJSON(v._sn, js["_sn"]);
|
||||
piDeserializeJSON(v.v2d, js["v2d"]);
|
||||
piDeserializeJSON(v.ba, js["ba"]);
|
||||
piDeserializeJSON(v.st, js["st"]);
|
||||
piDeserializeJSON(v.na, js["na"]);
|
||||
piDeserializeJSON(v.po, js["po"]);
|
||||
piDeserializeJSON(v.li, js["li"]);
|
||||
piDeserializeJSON(v.re, js["re"]);
|
||||
}
|
||||
|
||||
PIKbdListener kbd;
|
||||
using namespace PIUnits::Class;
|
||||
|
||||
int main(int argc, char * argv[]) {
|
||||
if (argc < 2) return 0;
|
||||
PIFile f(argv[1], PIIODevice::ReadOnly);
|
||||
piCout << "read" << f.path();
|
||||
auto fc = f.readAll();
|
||||
piCout << fc.size();
|
||||
if (!fc.isEmpty()) piCout << PIString::fromUTF8(fc.resized(32));
|
||||
return 0;
|
||||
|
||||
|
||||
PIHTTPServer server;
|
||||
server.listen({"127.0.0.1:7777"});
|
||||
// server.setBasicAuthRealm("pip");
|
||||
// server.setBasicAuthEnabled(true);
|
||||
// server.setBasicAuthCallback([](const PIString & u, const PIString & p) -> bool {
|
||||
// piCout << "basic auth" << u << p;
|
||||
// return (u == "u" && p == "p");
|
||||
auto reg = [&server](const PIString & path) {
|
||||
server.registerPath(path, Method::Get, [path](const PIHTTP::MessageConst & msg) -> PIHTTP::MessageMutable {
|
||||
piCout << "\nserver rec:\n\tpath: %1\n\t url: %2\n\t args: %3\n\tQ args: %4\n\tP args: %5"_a.arg(path)
|
||||
.arg(msg.path())
|
||||
.arg(piStringify(msg.arguments()))
|
||||
.arg(piStringify(msg.queryArguments()))
|
||||
.arg(piStringify(msg.pathArguments()));
|
||||
return MessageMutable().setCode(Code::Accepted);
|
||||
});
|
||||
};
|
||||
// });
|
||||
|
||||
reg(" /*/a/get ");
|
||||
reg(" /*/{ID}/get ");
|
||||
reg(" /*/*/get ");
|
||||
reg(" /*/*_b/get ");
|
||||
|
||||
reg("/api/{ID}/get");
|
||||
reg("/api/1/get");
|
||||
// reg("/api/1/bort{bortID}/get");
|
||||
// reg("/api/**");
|
||||
// reg("/api/1/bort2/get");
|
||||
// reg("/api/**/bort2/get");
|
||||
|
||||
/*server.registerPath("api/{ID}/bort{bortID}/get", Method::Get, [](const PIHTTP::MessageConst & msg) -> PIHTTP::MessageMutable {
|
||||
piCout << "server rec:\n\tpath: %1\n\targs: %2\n\tQ args: %3\n\tP args: %4\n"_a.arg(msg.path())
|
||||
.arg(piStringify(msg.arguments()))
|
||||
.arg(piStringify(msg.queryArguments()))
|
||||
.arg(piStringify(msg.pathArguments()));
|
||||
return MessageMutable().setCode(Code::Accepted);
|
||||
});
|
||||
server.registerPath("sendMessage", Method::Post, [](const PIHTTP::MessageConst & msg) -> PIHTTP::MessageMutable {
|
||||
return MessageMutable().setCode(Code::Accepted);
|
||||
});
|
||||
server.registerUnhandled([](const PIHTTP::MessageConst & msg) -> PIHTTP::MessageMutable {
|
||||
PIHTTP::MessageMutable ret;
|
||||
piCout << "server rec:\n\tpath: %1\n\tmethod: %2\n\targs: %3\n\theaders: %4\n\tbody: %5\n"_a.arg(msg.path())
|
||||
.arg(PIHTTP::methodName(msg.method()))
|
||||
.arg(piStringify(msg.arguments()))
|
||||
.arg(PIStringList(msg.headers().map<PIString>([](PIString k, PIString v) { return k + " = " + v; })).join("\n\t\t "))
|
||||
.arg(PIString::fromUTF8(msg.body()));
|
||||
ret.setCode(PIHTTP::Code::BadRequest);
|
||||
ret.setBody(PIByteArray::fromAscii("hello client! 0123456789"));
|
||||
return ret;
|
||||
});*/
|
||||
kbd.enableExitCapture('Q');
|
||||
WAIT_FOR_EXIT;
|
||||
return 0;
|
||||
|
||||
// PIRegularExpression pire("привет"_u8, PIRegularExpression::CaseInsensitive);
|
||||
// PIString subj = "the dog ПриВет sat on the cat"_u8;
|
||||
// PIRegularExpression pire("^(?<date>\\d\\d)/(?<month>\\d\\d)/(?<year>\\d\\d\\d\\d)$"_u8);
|
||||
// PIString subj = "08/12/1985"_u8;
|
||||
|
||||
|
||||
PIString pat = "*.Exe";
|
||||
PIRegularExpression re_g = PIRegularExpression::fromGlob(pat, PIRegularExpression::CaseInsensitive);
|
||||
PIRegularExpression re_p = PIRegularExpression::fromPOSIX(pat, PIRegularExpression::CaseInsensitive);
|
||||
PIStringList files = {
|
||||
"(Audio) 20250318-0852-16.8641941.m4a",
|
||||
"dxwebsetup.exe",
|
||||
"Firefox Installer.exe",
|
||||
"LTA8092XS8_R8.pdf",
|
||||
"SteamSetup.exe",
|
||||
"TBT_1.41.1325.0.exe",
|
||||
};
|
||||
piCout << " src pat" << pat.quoted();
|
||||
piCout << " Glob pat" << re_g.pattern().quoted();
|
||||
piCout << "POSIX pat" << re_p.pattern().quoted();
|
||||
piCout << "\nG P File";
|
||||
for (auto f: files) {
|
||||
piCout << (re_g.match(f) ? 1 : 0) << (re_p.match(f) ? 1 : 0) << f;
|
||||
}
|
||||
// return 0;
|
||||
PIRegularExpression pire("(?:\\/\\/\\s*)?.*\\n?(?:\\bfunction\\b)\\s*(?<name>\\b\\w+\\b)\\s*(?:\\((?<args>[^;()]*?)\\))",
|
||||
PIRegularExpression::Multiline);
|
||||
PIString subj = PIString::fromUTF8(PIFile::readAll("telegram.qs"));
|
||||
|
||||
piCout << "Pattern:" << pire.pattern();
|
||||
piCout << "Valid:" << pire.isValid();
|
||||
piCout << "Error at" << pire.errorPosition() << ":" << pire.errorString();
|
||||
piCout << "Groups count:" << pire.captureGroupsCount();
|
||||
piCout << "Named groups:" << pire.captureGroupNames();
|
||||
piCout << "";
|
||||
|
||||
auto mr = pire.matchIterator(subj);
|
||||
auto pire2 = pire;
|
||||
|
||||
while (mr.next()) {
|
||||
// piCout << "Subject" << subj;
|
||||
piCout << "Matched:" << mr.hasMatch();
|
||||
|
||||
piCout << "By number";
|
||||
for (int i = 0; i <= pire.captureGroupsCount(); ++i)
|
||||
piCout << i << "=" << mr.matchedString(i).trimmed();
|
||||
|
||||
piCout << "By name";
|
||||
for (auto g: pire.captureGroupNames())
|
||||
piCout << g.quoted() << "=" << mr.matchedString(g);
|
||||
|
||||
piCout << "";
|
||||
}
|
||||
|
||||
piCout << "!!!!!!!!!!!!!!!!!";
|
||||
|
||||
pire.match("vfsmndvbjbdlgdvb gdgf");
|
||||
pire.match(subj);
|
||||
|
||||
{
|
||||
PIVector<complexf> vec;
|
||||
vec << complexf{0.1, 0.2} << complexf{-1, 0.5};
|
||||
auto js = PIJSON::serialize(vec);
|
||||
piCout << vec;
|
||||
piCout << js;
|
||||
piCout << PIJSON::deserialize<typeof(vec)>(js);
|
||||
}
|
||||
|
||||
return 0;
|
||||
/*PICodeParser parser;
|
||||
parser.parseFile("c:/work/shstk/pip/test_header.h", false);
|
||||
|
||||
for (const auto * e: parser.entities) {
|
||||
piCout << e->type << e->name << "{";
|
||||
for (const auto & m: e->members) {
|
||||
piCout << " " << m.type << m.name;
|
||||
PITranslator::loadLang("ru");
|
||||
/*auto ucl = PIUnits::allClasses();
|
||||
for (auto c: ucl) {
|
||||
piCout << (c->className() + ":");
|
||||
for (auto t: c->allTypes()) {
|
||||
piCout << " " << c->name(t) << "->" << c->unit(t);
|
||||
}
|
||||
piCout << "}";
|
||||
}
|
||||
}*/
|
||||
|
||||
return 0;*/
|
||||
// PIUnits::Value(1);
|
||||
// piCout << PIUnits::name(PIUnits::Class::Information::Bit);
|
||||
// piCout << PIUnits::name(PIUnits::Class::Information::Byte);
|
||||
// piCout << PIUnits::name(PIUnits::Class::Information::_LastType);
|
||||
// piCout << PIUnits::name((int)PIUnits::Class::Angle::Degree);
|
||||
|
||||
// PIJSON j = piSerializeJSON(s);
|
||||
// piDeserializeJSON(s, j);
|
||||
PIVector<complexf> vec;
|
||||
vec << complexf{0.1, 0.2} << complexf{-1, 0.5};
|
||||
auto js = PIJSON::serialize(vec);
|
||||
piCout << vec;
|
||||
piCout << js;
|
||||
piCout << PIJSON::deserialize<typeof(vec)>(js);
|
||||
// piCout << PIUnits::unit(PIUnits::Class::Information::Bit);
|
||||
// piCout << PIUnits::unit(PIUnits::Class::Information::Byte);
|
||||
// piCout << PIUnits::unit(PIUnits::Class::Information::_LastType);
|
||||
// piCout << PIUnits::unit((int)PIUnits::Class::Angle::Degree);
|
||||
|
||||
/*PIVector<S> s;
|
||||
s << S{false, 0, 0.1} << S{true, 1, -10.1};
|
||||
PIMap<int, S> m;
|
||||
m[1] = S{false, 0, 0.15};
|
||||
m[2] = S{true, 1, -10.1};
|
||||
// m[1]._sn._co = {3, 4};
|
||||
PIJSON j = piSerializeJSON(m);
|
||||
piCout << j;
|
||||
piDeserializeJSON(m, j);
|
||||
piCout << m[1]._f;*/
|
||||
// piCout << m[1]._sn._co;
|
||||
// for (int i = -10; i < 10; ++i)
|
||||
// piCout << PIUnits::Value(pow10(i * 0.99), PIUnits::Class::Distance::Meter).toString();
|
||||
|
||||
/*PIVector<int> v({-1, 0, 10, 200});
|
||||
PIMap<int, float> m({
|
||||
{-1, -0.1 },
|
||||
{0, 0.1 },
|
||||
{100, 200.2}
|
||||
});
|
||||
auto v = PIUnits::Value(M_PI, Angle::Radian);
|
||||
piCout << v << "=" << v.converted(Angle::Degree);
|
||||
|
||||
piCout << v;
|
||||
piCout << piSerializeJSON(v);
|
||||
piDeserializeJSON(v, piSerializeJSON(v));
|
||||
piCout << v;
|
||||
piCout << m;
|
||||
piDeserializeJSON(m, piSerializeJSON(m));
|
||||
piCout << piSerializeJSON(m);*/
|
||||
v = PIUnits::Value(45, Angle::Degree);
|
||||
piCout << v << "=" << v.converted(Angle::Radian);
|
||||
|
||||
return 0;
|
||||
piCout << PIUnits::Value(5E-5, Time::Second);
|
||||
piCout << PIUnits::Value(3E-3, Time::Second);
|
||||
piCout << PIUnits::Value(0.8, Time::Second);
|
||||
piCout << PIUnits::Value(1.2, Time::Second);
|
||||
piCout << PIUnits::Value(1001, Time::Second);
|
||||
piCout << PIUnits::Value(1000001, Time::Second);
|
||||
|
||||
/*auto src = PIByteArray::fromAscii("The quick brown fox jumps over the lazy dog");
|
||||
auto key = PIByteArray::fromAscii("key");
|
||||
piCout << PIUnits::Value(1_KB, Information::Byte);
|
||||
piCout << PIUnits::Value(1_MB, Information::Byte);
|
||||
piCout << PIUnits::Value(1_MiB, Information::Byte);
|
||||
piCout << PIUnits::Value(1_MB, Information::Byte).converted(Information::Bit);
|
||||
piCout << PIUnits::Value(1_MiB, Information::Byte).converted(Information::Bit);
|
||||
|
||||
PIStringList tnl;
|
||||
int max_size = 0;
|
||||
for (int t = 0; t < (int)PIDigest::Type::C ount; ++t) {
|
||||
tnl << PIDigest::typeName((PIDigest::Type)t);
|
||||
max_size = piMaxi(max_size, tnl.back().size_s());
|
||||
}
|
||||
PIByteArray hs;
|
||||
piCout << PIString::fromAscii(src);
|
||||
for (int t = 0; t < (int)PIDigest::Type::Count; ++t) {
|
||||
hs = PIDigest::calculate(src, (PIDigest::Type)t);
|
||||
piCout << tnl[t].expandLeftTo(max_size, ' ') << "->" << hs.toHex();
|
||||
}
|
||||
for (int t = 0; t < (int)PIDigest::Type::Count; ++t) {
|
||||
const int bench_count = 100000;
|
||||
PITimeMeasurer tm;
|
||||
piForTimes(bench_count) {
|
||||
hs = PIDigest::calculate(src, (PIDigest::Type)t);
|
||||
}
|
||||
auto el = tm.elapsed();
|
||||
piCout << tnl[t].expandLeftTo(max_size, ' ') << "time" << el.toMilliseconds();
|
||||
}
|
||||
piCout << PIUnits::Value(0., Temperature::Celsius).converted(Temperature::Kelvin);
|
||||
piCout << PIUnits::Value(0., Temperature::Celsius).converted(Temperature::Fahrenheit);
|
||||
piCout << PIUnits::Value(100., Temperature::Celsius).converted(Temperature::Fahrenheit);
|
||||
|
||||
// src.clear();
|
||||
// crypto_hash_sha512(sout.data(), src.data(), src.size());
|
||||
// piCout << "sod:" << sout.toHex();
|
||||
// piCout << "512:" << sha5xx(src, initial_512, 64).toHex();
|
||||
return 0;*/
|
||||
|
||||
/*PIHTTP::MessageMutable req;
|
||||
req.setBody(PIByteArray::fromAscii("hello server!")).addArgument("a0", "val.0").addArgument("a~r1", "знач,1"_u8);
|
||||
auto * c = PIHTTPClient::create("http://u:p@127.0.0.1:7777/api", PIHTTP::Method::Get, req);
|
||||
c->onFinish([](PIHTTP::MessageConst msg) {
|
||||
piCout << "client rec:\n\tpath: %1\n\tmethod: %2\n\targs: %3\n\theaders: %4\n\tbody: %5\n"_a.arg(msg.path())
|
||||
.arg(PIHTTP::methodName(msg.method()))
|
||||
.arg(piStringify(msg.arguments()))
|
||||
.arg(
|
||||
PIStringList(msg.headers().map<PIString>([](PIString k, PIString v) { return k + " = " + v; })).join("\n\t\t
|
||||
")) .arg(PIString::fromUTF8(msg.body()));
|
||||
})
|
||||
->onError([c](PIHTTP::MessageConst r) {
|
||||
piCout << "error" << (int)r.code();
|
||||
piCout << "msg" << c->lastError();
|
||||
})
|
||||
->onAbort([c](PIHTTP::MessageConst r) {
|
||||
piCout << "abort" << (int)r.code();
|
||||
piCout << "msg" << c->lastError();
|
||||
})
|
||||
->start();*/
|
||||
auto * c = PIHTTPClient::create(
|
||||
PIString("127.0.0.1:7777/%1").arg("sendMessag"),
|
||||
Method::Post,
|
||||
MessageMutable().addHeader(Header::ContentType, "application/json").setBody(PIByteArray::fromAscii("{hello}")));
|
||||
c->onFinish([](const PIHTTP::MessageConst & msg) { piCout << "message finish" << (int)msg.code() << PIString::fromUTF8(msg.body()); })
|
||||
->onError([c](const PIHTTP::MessageConst & msg) { piCout << "message error" << c->lastError(); })
|
||||
->onAbort([c](const PIHTTP::MessageConst & msg) { piCout << "aborted"; })
|
||||
->start();
|
||||
|
||||
piMSleep(1000);
|
||||
// CurlThreadPool::instance()->destroy();
|
||||
// kbd.enableExitCapture();
|
||||
// WAIT_FOR_EXIT
|
||||
// kbd.stopAndWait();
|
||||
|
||||
// server.stop();
|
||||
c->abort();
|
||||
piMSleep(10);
|
||||
|
||||
return 0;
|
||||
|
||||
// piCout << PIString::readableSize(PISystemMonitor::usedRAM());
|
||||
|
||||
/*PIVector<int> vi;
|
||||
piForTimes(10) {
|
||||
piSleep(2.);
|
||||
vi.enlarge(1000000);
|
||||
piCout << "now" << vi.size() << vi.capacity();
|
||||
}
|
||||
|
||||
piSleep(5.);*/
|
||||
/*kbd.enableExitCapture();
|
||||
|
||||
PIHTTPServer server;
|
||||
|
||||
server.setFavicon(PIFile::readAll("logo.png", false));
|
||||
// server.setOption(MicrohttpdServer::Option::HTTPSEnabled, true);
|
||||
server.listen({"127.0.0.1", 7777});
|
||||
// server.listen({"192.168.1.10", 7778});
|
||||
|
||||
server.registerPath("/", MicrohttpdServer::Method::Get, [](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
|
||||
MicrohttpdServer::Reply ret;
|
||||
ret.setBody(PIByteArray::fromAscii(pageTitle));
|
||||
return ret;
|
||||
});
|
||||
|
||||
server.registerPath("/html", MicrohttpdServer::Method::Get, [](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
|
||||
MicrohttpdServer::Reply ret;
|
||||
ret.setBody("<!DOCTYPE html><html><body><p>arg=%1</p></body></html>"_a.arg(r.args.value("a0")).toUTF8());
|
||||
return ret;
|
||||
});
|
||||
|
||||
server.registerPath("/api", MicrohttpdServer::Method::Put, [](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
|
||||
MicrohttpdServer::Reply ret;
|
||||
ret.setBody(PIByteArray::fromAscii("<!DOCTYPE html><html><body>API</body></html>"));
|
||||
return ret;
|
||||
});
|
||||
|
||||
server.registerPath("/api/", MicrohttpdServer::Method::Post, [](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
|
||||
MicrohttpdServer::Reply ret;
|
||||
ret.setBody("<!DOCTYPE html><html><body>API etry %1</body></html>"_a.arg(r.path).toUTF8());
|
||||
ret.setCode(405);
|
||||
return ret;
|
||||
});
|
||||
|
||||
server.registerUnhandled([](const MicrohttpdServer::Request & r) -> MicrohttpdServer::Reply {
|
||||
MicrohttpdServer::Reply ret;
|
||||
ret.setBody("<!DOCTYPE html><html><body>Unknown</body></html>"_a.arg(r.path).toUTF8());
|
||||
ret.setCode(404);
|
||||
return ret;
|
||||
});*/
|
||||
|
||||
/*server.setRequestCallback([](MicrohttpdServer::Request r) -> MicrohttpdServer::Reply {
|
||||
MicrohttpdServer::Reply rep;
|
||||
piCout << "request" << r.path;
|
||||
piCout << " header" << r.headers;
|
||||
piCout << " args" << r.args;
|
||||
piCout << " body" << r.body;
|
||||
piCout << "";
|
||||
rep.setBody(PIByteArray::fromAscii("[{\"value1\": true, \"value2\": \"ыекштп\"}]"));
|
||||
return rep;
|
||||
});*/
|
||||
|
||||
/*piCout << "start" << server.isListen();
|
||||
|
||||
WAIT_FOR_EXIT
|
||||
|
||||
server.stop();*/
|
||||
piCout << PIUnits::Value(1., Pressure::Atmosphere).converted(Pressure::Pascal);
|
||||
piCout << PIUnits::Value(1., Pressure::Atmosphere).converted(Pressure::MillimetreOfMercury);
|
||||
piCout << PIUnits::Value(766., Pressure::MillimetreOfMercury).converted(Pressure::Atmosphere);
|
||||
|
||||
piCout << PIUnits::Value(5E-5, Time::Second).converted(Time::Hertz);
|
||||
piCout << PIUnits::Value(3E-3, Time::Second).converted(Time::Hertz);
|
||||
piCout << PIUnits::Value(0.8, Time::Second).converted(Time::Hertz);
|
||||
piCout << PIUnits::Value(1.2, Time::Second).converted(Time::Hertz);
|
||||
piCout << PIUnits::Value(1001, Time::Second).converted(Time::Hertz);
|
||||
piCout << PIUnits::Value(1000001, Time::Second).converted(Time::Hertz);
|
||||
// piCout << PIUnits::Value(0.2, Time::Second).converted(Time::Hertz);
|
||||
// piCout << PIUnits::Value(5E-5, Time::Second).converted(Time::Hertz);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -46,8 +46,15 @@ const char help_string[] = "-M (Metainfo)\n"
|
||||
"with simple << and >> operators.\n"
|
||||
"If PIMETA(no-stream) presence, then class or struct ignored.\n"
|
||||
"\n"
|
||||
"-J (JSON serialization)\n"
|
||||
"Generate serialize/deserialize methods for classes and structures.\n"
|
||||
"These methods uses by PIJSON::serialize(T v) and PIJSON::deserialize(json)\n"
|
||||
"allow automatic conversion to/from PIJSON. Use member name as key.\n"
|
||||
"Member can be skipped by providing PIMETA(id=-).\n"
|
||||
"If PIMETA(no-json) presence, then class or struct ignored.\n"
|
||||
"\n"
|
||||
"-G (Getter functions)\n"
|
||||
"Generate anonymous access methods for member typenames and values.\n"
|
||||
"Generate anonymous access methods for member typenames, values and offsets.\n"
|
||||
"Every class or struct member typename can be obtained with:\n"
|
||||
"const char * getMemberType(const char * class_name, const char * member_name)\n"
|
||||
"Member value can be obtained with:\n"
|
||||
@@ -55,6 +62,7 @@ const char help_string[] = "-M (Metainfo)\n"
|
||||
"where \"p\" - class or struct pointer, and returns serialized value.\n"
|
||||
"PIVariant getMemberAsVariant(const void * p, const char * class_name, const char * member_name)\n"
|
||||
"where \"p\" - class or struct pointer, and returns value as registered PIVariant.\n"
|
||||
"If PIMETA(no-getter) presence, then class or struct ignored.\n"
|
||||
"";
|
||||
|
||||
|
||||
@@ -126,3 +134,8 @@ PIString toCName(const PIString & s) {
|
||||
ret.replaceAll("__", "_");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
PICodeParser::Entity * findEntity(Runtime & rt, const PIString & type) {
|
||||
return rt.parser.findEntityByName(type);
|
||||
}
|
||||
|
||||
@@ -35,5 +35,6 @@ void usage();
|
||||
void help();
|
||||
|
||||
PIString toCName(const PIString & s);
|
||||
PICodeParser::Entity * findEntity(Runtime & rt, const PIString & type);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -22,27 +22,100 @@
|
||||
#include "stream.h"
|
||||
|
||||
|
||||
void writeGetterTypeMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) {
|
||||
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
|
||||
PISet<int> used_id;
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || !m.dims.isEmpty() || (m.visibility != PICodeParser::Public)) continue;
|
||||
auto type = findEntity(rt, m.type);
|
||||
if (type) {
|
||||
if (type->is_anonymous) {
|
||||
writeGetterTypeMembers(rt, type, var_prefix + m.name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
rt.ts << "\tif (strcmp(name, \"" << var_prefix << m.name << "\") == 0) return \"" << m.type;
|
||||
// if (m.isBitfield()) rt.ts << ":" << m.bits;
|
||||
rt.ts << "\";\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void writeGetterValueMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) {
|
||||
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
|
||||
PISet<int> used_id;
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || !m.dims.isEmpty() || (m.visibility != PICodeParser::Public)) continue;
|
||||
auto type = findEntity(rt, m.type);
|
||||
if (type) {
|
||||
if (type->is_anonymous) {
|
||||
writeGetterValueMembers(rt, type, var_prefix + m.name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
rt.ts << "\tif (strcmp(name, \"" << var_prefix << m.name << "\") == 0) {";
|
||||
if (m.isBitfield()) {
|
||||
rt.ts << "ret = piSerialize(static_cast<" << m.type << ">(o->" << var_prefix << m.name << "));";
|
||||
} else
|
||||
rt.ts << "serialize(ret, o->" << var_prefix << m.name << ");";
|
||||
rt.ts << " return ret;}\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void writeGetterOffsetMembers(Runtime & rt, const PICodeParser::Entity * e, PIString entity_name, PIString var_prefix) {
|
||||
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
|
||||
PISet<int> used_id;
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || !m.dims.isEmpty() || m.isBitfield() || (m.visibility != PICodeParser::Public)) continue;
|
||||
auto type = findEntity(rt, m.type);
|
||||
if (type) {
|
||||
if (type->is_anonymous) {
|
||||
writeGetterOffsetMembers(rt, type, entity_name, var_prefix + m.name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
rt.ts << "\tif (strcmp(name, \"" << var_prefix << m.name << "\") == 0) ";
|
||||
rt.ts << "return PICODEINFO_OFFSET(" << entity_name << ", " << var_prefix << m.name << ");\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void makeGetterType(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
if (!needClassStream(e)) return;
|
||||
if (!needClassGetter(e)) return;
|
||||
rt.ts << "\nconst char * getterType" << toCName(e->name) << "(const char * name) {\n";
|
||||
rt.ts << "\tif (!name) return \"\";\n";
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || m.isBitfield() || !m.dims.isEmpty() || (m.visibility != PICodeParser::Public)) continue;
|
||||
rt.ts << "\tif (strcmp(name, \"" << m.name << "\") == 0) return \"" << m.type << "\";\n";
|
||||
}
|
||||
writeGetterTypeMembers(rt, e);
|
||||
rt.ts << "\treturn \"\";\n}\n";
|
||||
}
|
||||
|
||||
|
||||
void makeGetterValue(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
if (!needClassStream(e)) return;
|
||||
if (!needClassGetter(e)) return;
|
||||
rt.ts << "\nPIByteArray getterValue" << toCName(e->name) << "(const void * p, const char * name) {\n";
|
||||
rt.ts << "\tPIByteArray ret;\n";
|
||||
rt.ts << "\tif (!p || !name) return ret;\n";
|
||||
rt.ts << "\t" << e->name << " * o = (" << e->name << "*)p;\n";
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || m.isBitfield() || !m.dims.isEmpty() || (m.visibility != PICodeParser::Public)) continue;
|
||||
rt.ts << "\tif (strcmp(name, \"" << m.name << "\") == 0) {serialize(ret, o->" << m.name << "); return ret;}\n";
|
||||
}
|
||||
writeGetterValueMembers(rt, e);
|
||||
rt.ts << "\treturn ret;\n}\n";
|
||||
}
|
||||
|
||||
|
||||
void makeGetterOffset(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
if (!needClassGetter(e)) return;
|
||||
rt.ts << "\nint getterOffset" << toCName(e->name) << "(const char * name) {\n";
|
||||
rt.ts << "\tif (!name) return 0;\n";
|
||||
writeGetterOffsetMembers(rt, e, e->name);
|
||||
rt.ts << "\treturn 0;\n}\n";
|
||||
}
|
||||
|
||||
|
||||
bool needClassGetter(const PICodeParser::Entity * e) {
|
||||
if (e->meta.contains("no-getter")) return false;
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || !m.dims.isEmpty() || (m.visibility != PICodeParser::Public)) continue;
|
||||
if (m.attributes[PICodeParser::Static]) continue;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -22,7 +22,12 @@
|
||||
|
||||
#include "common.h"
|
||||
|
||||
void writeGetterTypeMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix = {});
|
||||
void writeGetterValueMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix = {});
|
||||
void writeGetterOffsetMembers(Runtime & rt, const PICodeParser::Entity * e, PIString entity_name, PIString var_prefix = {});
|
||||
void makeGetterType(Runtime & rt, const PICodeParser::Entity * e);
|
||||
void makeGetterValue(Runtime & rt, const PICodeParser::Entity * e);
|
||||
void makeGetterOffset(Runtime & rt, const PICodeParser::Entity * e);
|
||||
bool needClassGetter(const PICodeParser::Entity * e);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
#include "pitranslator.h"
|
||||
|
||||
|
||||
bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) {
|
||||
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
|
||||
PIVector<PICodeParser::Member> ml;
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue;
|
||||
@@ -30,12 +31,19 @@ bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
}
|
||||
bool is_union = e->type == "union";
|
||||
for (const PICodeParser::Member & m: ml) {
|
||||
if (is_union && m.isBitfield()) continue;
|
||||
if (m.isBitfield()) continue;
|
||||
if (m.attributes[PICodeParser::Static]) continue;
|
||||
if (m.meta.value("id") == "-") continue;
|
||||
// if (m.meta.contains("id")) cnt = m.meta.value("id").toInt();
|
||||
auto type = findEntity(rt, m.type);
|
||||
if (type) {
|
||||
if (type->is_anonymous) {
|
||||
writeClassJSONMembersOut(rt, type, var_prefix + m.name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (m.dims.isEmpty()) {
|
||||
rt.ts << "\tret[\"" << m.name << "\"] = piSerializeJSON(v." << m.name << ");\n";
|
||||
rt.ts << "\tret[\"" << var_prefix << m.name << "\"] = piSerializeJSON(v." << var_prefix << m.name << ");\n";
|
||||
} else {
|
||||
PIString ptype = m.type.left(m.type.find('[')).trim();
|
||||
PIString size = m.dims[0];
|
||||
@@ -43,21 +51,22 @@ bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
size += " * ";
|
||||
size += m.dims[i];
|
||||
}
|
||||
rt.ts << "\tret[\"" << m.name << "\"] = piSerializeJSON(PIVector<" << ptype << " >((const " << ptype << " *)(v." << m.name
|
||||
<< "), " << size << "));\n";
|
||||
rt.ts << "\tret[\"" << var_prefix << m.name << "\"] = piSerializeJSON(PIVector<" << ptype << " >((const " << ptype << " *)(v."
|
||||
<< var_prefix << m.name << "), " << size << "));\n";
|
||||
}
|
||||
if (is_union) break;
|
||||
}
|
||||
if (is_union) return true;
|
||||
for (const PICodeParser::Entity * ce: e->children) {
|
||||
if (ce->has_name) continue;
|
||||
/*for (const PICodeParser::Entity * ce: e->children) {
|
||||
if (!ce->is_anonymous) continue;
|
||||
if (!writeClassJSONMembersOut(rt, ce)) return false;
|
||||
}
|
||||
}*/
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) {
|
||||
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
|
||||
PIVector<PICodeParser::Member> ml;
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue;
|
||||
@@ -66,12 +75,19 @@ bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
bool is_union = e->type == "union";
|
||||
PISet<int> used_id;
|
||||
for (const PICodeParser::Member & m: ml) {
|
||||
if (is_union && m.isBitfield()) continue;
|
||||
if (m.isBitfield()) continue;
|
||||
if (m.attributes[PICodeParser::Static]) continue;
|
||||
if (m.meta.value("id") == "-") continue;
|
||||
auto type = findEntity(rt, m.type);
|
||||
if (type) {
|
||||
if (type->is_anonymous) {
|
||||
writeClassJSONMembersIn(rt, type, var_prefix + m.name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// if (m.meta.contains("id")) cnt = m.meta.value("id").toInt();
|
||||
if (m.dims.isEmpty()) {
|
||||
rt.ts << "\tpiDeserializeJSON(v." << m.name << ", js[\"" << m.name << "\"]);\n";
|
||||
rt.ts << "\tpiDeserializeJSON(v." << var_prefix << m.name << ", js[\"" << var_prefix << m.name << "\"]);\n";
|
||||
} else {
|
||||
PIString ptype = m.type.left(m.type.find('[')).trim();
|
||||
PIString size = m.dims[0];
|
||||
@@ -80,19 +96,19 @@ bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
size += m.dims[i];
|
||||
}
|
||||
rt.ts << "\t{\n\t\tPIVector<" << ptype << " > d;\n";
|
||||
rt.ts << "\t\tpiDeserializeJSON(d, js[\"" << m.name << "\"]);\n";
|
||||
rt.ts << "\t\tpiDeserializeJSON(d, js[\"" << var_prefix << m.name << "\"]);\n";
|
||||
rt.ts << "\t\tint cnt = piMini(d.size_s(), " << size << ");\n";
|
||||
rt.ts << "\t\tfor (int i = 0; i < cnt; ++i)\n";
|
||||
rt.ts << "\t\t\t((" << ptype << " *)(v." << m.name << "))[i] = d[i];\n";
|
||||
rt.ts << "\t\t\t((" << ptype << " *)(v." << var_prefix << m.name << "))[i] = d[i];\n";
|
||||
rt.ts << "\t}\n";
|
||||
}
|
||||
if (is_union) break;
|
||||
}
|
||||
if (is_union) return true;
|
||||
for (const PICodeParser::Entity * ce: e->children) {
|
||||
if (ce->has_name) continue;
|
||||
/*for (const PICodeParser::Entity * ce: e->children) {
|
||||
if (!ce->is_anonymous) continue;
|
||||
if (!writeClassJSONMembersIn(rt, ce)) return false;
|
||||
}
|
||||
}*/
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
|
||||
#include "common.h"
|
||||
|
||||
bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e);
|
||||
bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e);
|
||||
bool writeClassJSONMembersOut(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix = {});
|
||||
bool writeClassJSONMembersIn(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix = {});
|
||||
bool needClassJSON(const PICodeParser::Entity * e);
|
||||
bool makeClassJSON(Runtime & rt, const PICodeParser::Entity * e);
|
||||
|
||||
|
||||
@@ -66,11 +66,15 @@ bool writeModel(PICodeParser & parser,
|
||||
if (meta || enums || getters) {
|
||||
if (getters) {
|
||||
ts << "\n\n// Getter funtions\n";
|
||||
ts << "\n#define PICODEINFO_OFFSET(type, member) reinterpret_cast<size_t>(&reinterpret_cast<const char &>((((type "
|
||||
"*)nullptr)->member)))\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (!e->has_name || e->name.startsWith("_PI")) continue;
|
||||
if (e->is_anonymous || e->name.startsWith("_PI")) continue;
|
||||
makeGetterType(rt, e);
|
||||
makeGetterValue(rt, e);
|
||||
makeGetterOffset(rt, e);
|
||||
}
|
||||
ts << "\n#undef PICODEINFO_OFFSET\n";
|
||||
}
|
||||
ts << "\n\n// Metainformation\n\n__ClassInfo_" << defname << "_Initializer__::__ClassInfo_" << defname << "_Initializer__() {\n";
|
||||
ts << "\tstatic __ClassInfo_" << defname << "_Initializer__::Content content;\n";
|
||||
@@ -83,6 +87,7 @@ bool writeModel(PICodeParser & parser,
|
||||
if (getters) {
|
||||
ts << "\tauto & ci_avf(*ci_ins->accessValueFunctions);\n";
|
||||
ts << "\tauto & ci_atf(*ci_ins->accessTypeFunctions);\n";
|
||||
ts << "\tauto & ci_aof(*ci_ins->accessOffsetFunctions);\n";
|
||||
}
|
||||
|
||||
if (meta) {
|
||||
@@ -95,7 +100,7 @@ bool writeModel(PICodeParser & parser,
|
||||
if (meta) {
|
||||
ts << "\n\n// Classes\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (e->name.startsWith("_PI")) continue;
|
||||
if (e->name.startsWith("_PI") || e->is_anonymous) continue;
|
||||
makeClassInfo(rt, e);
|
||||
}
|
||||
}
|
||||
@@ -108,9 +113,11 @@ bool writeModel(PICodeParser & parser,
|
||||
ts << "\n// Getters\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (!needClassStream(e)) continue;
|
||||
if (!e->has_name || e->name.startsWith("_PI")) continue;
|
||||
ts << "\tci_avf[\"" << e->name << "\"] = getterValue" << toCName(e->name) << ";\n";
|
||||
ts << "\tci_atf[\"" << e->name << "\"] = getterType" << toCName(e->name) << ";\n";
|
||||
if (e->is_anonymous || e->name.startsWith("_PI")) continue;
|
||||
auto cname = toCName(e->name);
|
||||
ts << "\tci_avf[\"" << e->name << "\"] = getterValue" << cname << ";\n";
|
||||
ts << "\tci_atf[\"" << e->name << "\"] = getterType" << cname << ";\n";
|
||||
ts << "\tci_aof[\"" << e->name << "\"] = getterOffset" << cname << ";\n";
|
||||
}
|
||||
}
|
||||
ts << "}\n\n";
|
||||
@@ -121,11 +128,12 @@ bool writeModel(PICodeParser & parser,
|
||||
if (getters) {
|
||||
ts << "\tauto & ci_avf(*ci_ins->accessValueFunctions);\n";
|
||||
ts << "\tauto & ci_atf(*ci_ins->accessTypeFunctions);\n";
|
||||
ts << "\tauto & ci_aof(*ci_ins->accessOffsetFunctions);\n";
|
||||
}
|
||||
if (meta) {
|
||||
ts << "\n// Classes clean\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (e->name.startsWith("_PI")) continue;
|
||||
if (e->name.startsWith("_PI") || e->is_anonymous) continue;
|
||||
ts << "\tpiDeleteSafety(ci_ci[\"" << e->name << "\"]);\n";
|
||||
ts << "\tci_ins->classesInfo->remove(\"" << e->name << "\");\n";
|
||||
}
|
||||
@@ -143,9 +151,10 @@ bool writeModel(PICodeParser & parser,
|
||||
ts << "\n// Getters clean\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (!needClassStream(e)) continue;
|
||||
if (!e->has_name || e->name.startsWith("_PI")) continue;
|
||||
if (e->is_anonymous || e->name.startsWith("_PI")) continue;
|
||||
ts << "\tci_avf.remove(\"" << e->name << "\");\n";
|
||||
ts << "\tci_atf.remove(\"" << e->name << "\");\n";
|
||||
ts << "\tci_aof.remove(\"" << e->name << "\");\n";
|
||||
}
|
||||
}
|
||||
ts << "}\n";
|
||||
@@ -173,7 +182,7 @@ bool writeModel(PICodeParser & parser,
|
||||
if (streams) {
|
||||
ts << "\n\n// Stream operators\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (!e->has_name || e->name.startsWith("_PI") ||
|
||||
if (e->is_anonymous || e->name.startsWith("_PI") ||
|
||||
!(e->visibility == PICodeParser::Global || e->visibility == PICodeParser::Public))
|
||||
continue;
|
||||
if (!makeClassStream(rt, e)) return false;
|
||||
@@ -182,7 +191,7 @@ bool writeModel(PICodeParser & parser,
|
||||
if (json) {
|
||||
ts << "\n\n// JSON serialization\n";
|
||||
for (const PICodeParser::Entity * e: parser.entities) {
|
||||
if (!e->has_name || e->name.startsWith("_PI") ||
|
||||
if (e->is_anonymous || e->name.startsWith("_PI") ||
|
||||
!(e->visibility == PICodeParser::Global || e->visibility == PICodeParser::Public))
|
||||
continue;
|
||||
if (!makeClassJSON(rt, e)) return false;
|
||||
|
||||
@@ -20,27 +20,17 @@
|
||||
#include "metainfo.h"
|
||||
|
||||
|
||||
void makeClassInfo(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
rt.ts << "\n\t{\n\tClassInfo * ci = new ClassInfo();\n";
|
||||
rt.ts << "\tci->type = \"" << e->type << "\";\n";
|
||||
rt.ts << "\tci->name = \"" << e->name << "\";\n";
|
||||
rt.ts << "\tci->has_name = " << (e->has_name ? "true" : "false") << ";\n";
|
||||
if (!e->meta.isEmpty()) {
|
||||
auto i = e->meta.makeIterator();
|
||||
while (i.next())
|
||||
rt.ts << "\tci->meta[\"" << i.key() << "\"] = PIString::fromUTF8(\"" << i.value() << "\");\n";
|
||||
}
|
||||
rt.ts << "\tci_ci[ci->name] = ci;\n";
|
||||
if (e->parent_scope) {
|
||||
rt.ts << "\tpci = "
|
||||
<< "ci_ci.value(\"" << e->parent_scope->name << "\", 0);\n";
|
||||
rt.ts << "\tif (pci) pci->children_info << ci;\n";
|
||||
}
|
||||
for (const PICodeParser::Entity * p: e->parents)
|
||||
rt.ts << "\tci->parents << \"" << p->name << "\";\n";
|
||||
if (!e->members.isEmpty()) rt.ts << "\n\tTypeInfo ti;\n";
|
||||
void writeClassInfoMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix) {
|
||||
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
rt.ts << "\tti = TypeInfo(\"" << m.name << "\", \"" << m.type << "\"";
|
||||
auto type = findEntity(rt, m.type);
|
||||
if (type) {
|
||||
if (type->is_anonymous) {
|
||||
writeClassInfoMembers(rt, type, var_prefix + m.name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
rt.ts << "\tti = TypeInfo(\"" << var_prefix << m.name << "\", \"" << m.type << "\"";
|
||||
if (m.attributes != 0) {
|
||||
bool fir = true;
|
||||
rt.ts << ", ";
|
||||
@@ -97,6 +87,29 @@ void makeClassInfo(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
}
|
||||
rt.ts << "\tci->variables << ti;\n";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void makeClassInfo(Runtime & rt, const PICodeParser::Entity * e) {
|
||||
rt.ts << "\n\t{\n\tClassInfo * ci = new ClassInfo();\n";
|
||||
rt.ts << "\tci->type = \"" << e->type << "\";\n";
|
||||
rt.ts << "\tci->name = \"" << e->name << "\";\n";
|
||||
// rt.ts << "\tci->is_anonymous = " << (e->is_anonymous ? "true" : "false") << ";\n";
|
||||
if (!e->meta.isEmpty()) {
|
||||
auto i = e->meta.makeIterator();
|
||||
while (i.next())
|
||||
rt.ts << "\tci->meta[\"" << i.key() << "\"] = PIString::fromUTF8(\"" << i.value() << "\");\n";
|
||||
}
|
||||
rt.ts << "\tci_ci[ci->name] = ci;\n";
|
||||
if (e->parent_scope) {
|
||||
rt.ts << "\tpci = "
|
||||
<< "ci_ci.value(\"" << e->parent_scope->name << "\", 0);\n";
|
||||
rt.ts << "\tif (pci) pci->children_info << ci;\n";
|
||||
}
|
||||
for (const PICodeParser::Entity * p: e->parents)
|
||||
rt.ts << "\tci->parents << \"" << p->name << "\";\n";
|
||||
if (!e->members.isEmpty()) rt.ts << "\n\tTypeInfo ti;\n";
|
||||
writeClassInfoMembers(rt, e);
|
||||
PIString arg;
|
||||
bool has_fi = false;
|
||||
for (const PICodeParser::Member & m: e->functions) {
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include "common.h"
|
||||
|
||||
void writeClassInfoMembers(Runtime & rt, const PICodeParser::Entity * e, PIString var_prefix = {});
|
||||
void makeClassInfo(Runtime & rt, const PICodeParser::Entity * e);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
#include "pitranslator.h"
|
||||
|
||||
|
||||
bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple) {
|
||||
bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple, PIString var_prefix) {
|
||||
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
|
||||
PIVector<PICodeParser::Member> ml;
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue;
|
||||
@@ -31,9 +32,16 @@ bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, in
|
||||
bool is_union = e->type == "union";
|
||||
PISet<int> used_id;
|
||||
for (const PICodeParser::Member & m: ml) {
|
||||
if (is_union && m.isBitfield()) continue;
|
||||
if (m.isBitfield()) continue;
|
||||
if (m.attributes[PICodeParser::Static]) continue;
|
||||
if (m.meta.value("id") == "-") continue;
|
||||
auto type = findEntity(rt, m.type);
|
||||
if (type) {
|
||||
if (type->is_anonymous) {
|
||||
if (!writeClassStreamMembersOut(rt, type, cnt, simple, var_prefix + m.name)) return false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
++cnt;
|
||||
if (m.meta.contains("id")) cnt = m.meta.value("id").toInt();
|
||||
if (used_id[cnt]) {
|
||||
@@ -44,11 +52,11 @@ bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, in
|
||||
if (simple) {
|
||||
rt.ts << "\ts << ";
|
||||
if (rt.parser.isEnum(m.type)) rt.ts << "(int)";
|
||||
rt.ts << "v." << m.name << ";\n";
|
||||
rt.ts << "v." << var_prefix << m.name << ";\n";
|
||||
} else {
|
||||
rt.ts << "\tcs.add(" << cnt << ", ";
|
||||
if (rt.parser.isEnum(m.type)) rt.ts << "(int)";
|
||||
rt.ts << "v." << m.name << ");\n";
|
||||
rt.ts << "v." << var_prefix << m.name << ");\n";
|
||||
}
|
||||
} else {
|
||||
PIString ptype = m.type.left(m.type.find('[')).trim();
|
||||
@@ -59,24 +67,22 @@ bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, in
|
||||
}
|
||||
if (simple) {
|
||||
rt.ts << "\tfor (int i = 0; i < " << size << "; ++i)\n";
|
||||
rt.ts << "\t\ts << ((const " << ptype << " *)(v." << m.name << "))[i];\n";
|
||||
rt.ts << "\t\ts << ((const " << ptype << " *)(" << "v." << var_prefix << m.name << "))[i];\n";
|
||||
} else {
|
||||
rt.ts << "\tcs << cs.chunk(" << cnt << ", PIVector<" << ptype << " >((const " << ptype << " *)(v." << m.name << "), ";
|
||||
rt.ts << "\tcs << cs.chunk(" << cnt << ", PIVector<" << ptype << " >((const " << ptype << " *)(" << "v." << var_prefix
|
||||
<< m.name << "), ";
|
||||
rt.ts << size << "));\n";
|
||||
}
|
||||
}
|
||||
if (is_union) break;
|
||||
}
|
||||
if (is_union) return true;
|
||||
for (const PICodeParser::Entity * ce: e->children) {
|
||||
if (ce->has_name) continue;
|
||||
if (!writeClassStreamMembersOut(rt, ce, cnt, simple)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple) {
|
||||
bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple, PIString var_prefix) {
|
||||
if (var_prefix.isNotEmpty() && !var_prefix.endsWith('.')) var_prefix += ".";
|
||||
PIVector<PICodeParser::Member> ml;
|
||||
for (const PICodeParser::Member & m: e->members) {
|
||||
if (m.is_type_ptr || (m.visibility != PICodeParser::Public)) continue;
|
||||
@@ -85,9 +91,16 @@ bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int
|
||||
bool is_union = e->type == "union";
|
||||
PISet<int> used_id;
|
||||
for (const PICodeParser::Member & m: ml) {
|
||||
if (is_union && m.isBitfield()) continue;
|
||||
if (m.isBitfield()) continue;
|
||||
if (m.attributes[PICodeParser::Static]) continue;
|
||||
if (m.meta.value("id") == "-") continue;
|
||||
auto type = findEntity(rt, m.type);
|
||||
if (type) {
|
||||
if (type->is_anonymous) {
|
||||
if (!writeClassStreamMembersIn(rt, type, cnt, simple, var_prefix + m.name)) return false;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
++cnt;
|
||||
if (m.meta.contains("id")) cnt = m.meta.value("id").toInt();
|
||||
if (used_id[cnt]) {
|
||||
@@ -104,8 +117,8 @@ bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int
|
||||
if (is_enum)
|
||||
rt.ts << "i;";
|
||||
else
|
||||
rt.ts << "v." << m.name << ";";
|
||||
if (is_enum) rt.ts << " v." << m.name << " = (" << m.type << ")i;}";
|
||||
rt.ts << "v." << var_prefix << m.name << ";";
|
||||
if (is_enum) rt.ts << " v. << var_prefix" << m.name << " = (" << m.type << ")i;}";
|
||||
rt.ts << "\n";
|
||||
} else {
|
||||
rt.ts << "\t\tcase " << cnt << ":";
|
||||
@@ -114,9 +127,9 @@ bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int
|
||||
if (is_enum)
|
||||
rt.ts << "i";
|
||||
else
|
||||
rt.ts << "v." << m.name;
|
||||
rt.ts << "v." << var_prefix << m.name;
|
||||
rt.ts << ");";
|
||||
if (is_enum) rt.ts << " v." << m.name << " = (" << m.type << ")i;}";
|
||||
if (is_enum) rt.ts << " v." << var_prefix << m.name << " = (" << m.type << ")i;}";
|
||||
rt.ts << " break;\n";
|
||||
}
|
||||
} else {
|
||||
@@ -128,12 +141,12 @@ bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int
|
||||
}
|
||||
if (simple) {
|
||||
rt.ts << "\tfor (int i = 0; i < " << size << "; ++i)\n";
|
||||
rt.ts << "\t\ts >> ((" << ptype << " *)(v." << m.name << "))[i];\n";
|
||||
rt.ts << "\t\ts >> ((" << ptype << " *)(" << "v." << var_prefix << m.name << "))[i];\n";
|
||||
} else {
|
||||
rt.ts << "\t\tcase " << cnt << ": {\n\t\t\tPIVector<" << ptype << " > d; cs.get(d);\n";
|
||||
rt.ts << "\t\t\tint cnt = piMini(d.size_s(), " << size << ");\n";
|
||||
rt.ts << "\t\t\tfor (int i = 0; i < cnt; ++i)\n";
|
||||
rt.ts << "\t\t\t\t((" << ptype << " *)(v." << m.name << "))[i] = d[i];\n";
|
||||
rt.ts << "\t\t\t\t((" << ptype << " *)(" << "v." << var_prefix << m.name << "))[i] = d[i];\n";
|
||||
rt.ts << "\t\t\t}\n";
|
||||
rt.ts << "\t\t\tbreak;\n";
|
||||
}
|
||||
@@ -141,10 +154,6 @@ bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int
|
||||
if (is_union) break;
|
||||
}
|
||||
if (is_union) return true;
|
||||
for (const PICodeParser::Entity * ce: e->children) {
|
||||
if (ce->has_name) continue;
|
||||
if (!writeClassStreamMembersIn(rt, ce, cnt, simple)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
|
||||
#include "common.h"
|
||||
|
||||
bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple);
|
||||
bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple);
|
||||
bool writeClassStreamMembersOut(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple, PIString var_prefix = {});
|
||||
bool writeClassStreamMembersIn(Runtime & rt, const PICodeParser::Entity * e, int & cnt, bool simple, PIString var_prefix = {});
|
||||
bool needClassStream(const PICodeParser::Entity * e);
|
||||
bool makeClassStream(Runtime & rt, const PICodeParser::Entity * e);
|
||||
|
||||
|
||||
@@ -462,13 +462,15 @@ bool procDpkg(const PIString & l) {
|
||||
PIFile::FileInfo fi;
|
||||
fi.path = l;
|
||||
PIString cmd = dpkg + dpkgdir + " -S " + fi.name() + ign_err_suffix;
|
||||
// PICout(true) << cmd;
|
||||
// PICout(true) << "** dpkg:" << cmd;
|
||||
PIString vs = execute(cmd).trim();
|
||||
if (!vs.isEmpty()) {
|
||||
PIStringList lines = vs.split('\n').reverse();
|
||||
for (auto l: lines) {
|
||||
l = l.left(l.find(":"));
|
||||
if (!l.isEmpty() && !l.endsWith("-cross")) all_deps << l;
|
||||
auto sl = l;
|
||||
l = l.left(l.find(":"));
|
||||
if (!l.isEmpty() && !l.endsWith("-cross") && !l.contains(' ')) all_deps << l;
|
||||
// PICout(true) << "** found \"" << l << "\" in \"" << sl << "\"";
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user