Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
dsview
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Raptor Engineering Public Development
dsview
Commits
886b847c
Commit
886b847c
authored
May 25, 2017
by
DreamSourceLab
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Warnings fix
parent
83d77b03
Changes
97
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
97 changed files
with
449 additions
and
944 deletions
+449
-944
.gitignore
.gitignore
+1
-0
DSView/CMakeLists.txt
DSView/CMakeLists.txt
+5
-6
DSView/DSView.desktop
DSView/DSView.desktop
+9
-0
DSView/main.cpp
DSView/main.cpp
+1
-1
DSView/pv/data/analogsnapshot.cpp
DSView/pv/data/analogsnapshot.cpp
+1
-1
DSView/pv/data/decode/annotation.cpp
DSView/pv/data/decode/annotation.cpp
+1
-1
DSView/pv/data/decode/decoder.cpp
DSView/pv/data/decode/decoder.cpp
+1
-1
DSView/pv/data/decode/row.cpp
DSView/pv/data/decode/row.cpp
+1
-1
DSView/pv/data/decodermodel.cpp
DSView/pv/data/decodermodel.cpp
+1
-1
DSView/pv/data/decoderstack.cpp
DSView/pv/data/decoderstack.cpp
+0
-12
DSView/pv/data/decoderstack.h
DSView/pv/data/decoderstack.h
+1
-3
DSView/pv/data/logicsnapshot.cpp
DSView/pv/data/logicsnapshot.cpp
+21
-14
DSView/pv/data/mathstack.cpp
DSView/pv/data/mathstack.cpp
+5
-4
DSView/pv/data/mathstack.h
DSView/pv/data/mathstack.h
+1
-1
DSView/pv/device/devinst.cpp
DSView/pv/device/devinst.cpp
+1
-1
DSView/pv/device/devinst.h
DSView/pv/device/devinst.h
+1
-1
DSView/pv/device/file.cpp
DSView/pv/device/file.cpp
+4
-2
DSView/pv/device/inputfile.cpp
DSView/pv/device/inputfile.cpp
+1
-0
DSView/pv/dialogs/fftoptions.cpp
DSView/pv/dialogs/fftoptions.cpp
+1
-1
DSView/pv/dialogs/interval.cpp
DSView/pv/dialogs/interval.cpp
+1
-1
DSView/pv/dock/measuredock.cpp
DSView/pv/dock/measuredock.cpp
+4
-3
DSView/pv/dock/protocoldock.cpp
DSView/pv/dock/protocoldock.cpp
+1
-1
DSView/pv/dock/protocoldock.h
DSView/pv/dock/protocoldock.h
+1
-1
DSView/pv/mainframe.cpp
DSView/pv/mainframe.cpp
+0
-1
DSView/pv/mainwindow.cpp
DSView/pv/mainwindow.cpp
+3
-1
DSView/pv/prop/binding/binding.cpp
DSView/pv/prop/binding/binding.cpp
+3
-1
DSView/pv/prop/binding/binding.h
DSView/pv/prop/binding/binding.h
+1
-1
DSView/pv/prop/binding/decoderoptions.cpp
DSView/pv/prop/binding/decoderoptions.cpp
+1
-1
DSView/pv/prop/binding/deviceoptions.cpp
DSView/pv/prop/binding/deviceoptions.cpp
+1
-1
DSView/pv/prop/binding/deviceoptions.h
DSView/pv/prop/binding/deviceoptions.h
+1
-1
DSView/pv/sigsession.cpp
DSView/pv/sigsession.cpp
+3
-2
DSView/pv/storesession.cpp
DSView/pv/storesession.cpp
+17
-15
DSView/pv/storesession.h
DSView/pv/storesession.h
+1
-1
DSView/pv/toolbars/samplingbar.cpp
DSView/pv/toolbars/samplingbar.cpp
+1
-1
DSView/pv/view/decodetrace.cpp
DSView/pv/view/decodetrace.cpp
+2
-2
DSView/pv/view/dsldial.cpp
DSView/pv/view/dsldial.cpp
+1
-1
DSView/pv/view/dsldial.h
DSView/pv/view/dsldial.h
+1
-1
DSView/pv/view/dsosignal.cpp
DSView/pv/view/dsosignal.cpp
+9
-10
DSView/pv/view/logicsignal.cpp
DSView/pv/view/logicsignal.cpp
+2
-2
DSView/pv/view/mathtrace.cpp
DSView/pv/view/mathtrace.cpp
+1
-1
DSView/pv/view/mathtrace.h
DSView/pv/view/mathtrace.h
+1
-1
DSView/pv/view/ruler.cpp
DSView/pv/view/ruler.cpp
+1
-1
DSView/pv/view/ruler.h
DSView/pv/view/ruler.h
+1
-1
DSView/pv/view/view.cpp
DSView/pv/view/view.cpp
+7
-5
DSView/pv/view/viewport.cpp
DSView/pv/view/viewport.cpp
+0
-1
DSView/pv/widgets/decodergroupbox.cpp
DSView/pv/widgets/decodergroupbox.cpp
+1
-1
DSView/pv/widgets/decodermenu.cpp
DSView/pv/widgets/decodermenu.cpp
+1
-1
DSView/pv/widgets/viewstatus.cpp
DSView/pv/widgets/viewstatus.cpp
+2
-2
DSView/res/DSCope.bin
DSView/res/DSCope.bin
+0
-0
DSView/res/DSCope.fw
DSView/res/DSCope.fw
+0
-0
DSView/res/DSCope1.def.dsc
DSView/res/DSCope1.def.dsc
+0
-0
DSView/res/DSCope20.bin
DSView/res/DSCope20.bin
+0
-0
DSView/res/DSCope20.fw
DSView/res/DSCope20.fw
+0
-0
DSView/res/DSCopeTest.dsc
DSView/res/DSCopeTest.dsc
+43
-0
DSView/res/DSLogic.fw
DSView/res/DSLogic.fw
+0
-0
DSView/res/DSLogic0.def.dsc
DSView/res/DSLogic0.def.dsc
+1
-1
DSView/res/DSLogic1.def.dsc
DSView/res/DSLogic1.def.dsc
+0
-0
DSView/res/DSLogic2.def.dsc
DSView/res/DSLogic2.def.dsc
+0
-0
DSView/res/DSLogic33.bin
DSView/res/DSLogic33.bin
+0
-0
DSView/res/DSLogic50.bin
DSView/res/DSLogic50.bin
+0
-0
DSView/res/DSLogicBasic.bin
DSView/res/DSLogicBasic.bin
+0
-0
DSView/res/DSLogicBasic.fw
DSView/res/DSLogicBasic.fw
+0
-0
DSView/res/DSLogicPlus.bin
DSView/res/DSLogicPlus.bin
+0
-0
DSView/res/DSLogicPlus.fw
DSView/res/DSLogicPlus.fw
+0
-0
DSView/res/DSLogicPro.bin
DSView/res/DSLogicPro.bin
+0
-0
DSView/res/DSLogicPro.fw
DSView/res/DSLogicPro.fw
+0
-0
DSView/res/license.txt
DSView/res/license.txt
+20
-0
libsigrok4DSL/session_driver.c
libsigrok4DSL/session_driver.c
+4
-1
libsigrokdecode4DSL/Makefile.am
libsigrokdecode4DSL/Makefile.am
+6
-6
libsigrokdecode4DSL/configure.ac
libsigrokdecode4DSL/configure.ac
+4
-4
libsigrokdecode4DSL/decoder.c
libsigrokdecode4DSL/decoder.c
+17
-26
libsigrokdecode4DSL/decoders/0-spi/.pd.py.swo
libsigrokdecode4DSL/decoders/0-spi/.pd.py.swo
+0
-0
libsigrokdecode4DSL/decoders/0-spi/.pd.py.swp
libsigrokdecode4DSL/decoders/0-spi/.pd.py.swp
+0
-0
libsigrokdecode4DSL/decoders/0-uart/.pd.py.swo
libsigrokdecode4DSL/decoders/0-uart/.pd.py.swo
+0
-0
libsigrokdecode4DSL/decoders/0-uart/.pd.py.swp
libsigrokdecode4DSL/decoders/0-uart/.pd.py.swp
+0
-0
libsigrokdecode4DSL/decoders/1-i2c/.pd.py.swo
libsigrokdecode4DSL/decoders/1-i2c/.pd.py.swo
+0
-0
libsigrokdecode4DSL/decoders/1-i2c/.pd.py.swp
libsigrokdecode4DSL/decoders/1-i2c/.pd.py.swp
+0
-0
libsigrokdecode4DSL/decoders/1-i2c/pd.py
libsigrokdecode4DSL/decoders/1-i2c/pd.py
+3
-3
libsigrokdecode4DSL/decoders/1-spi/.pd.py.swn
libsigrokdecode4DSL/decoders/1-spi/.pd.py.swn
+0
-0
libsigrokdecode4DSL/decoders/1-spi/.pd.py.swo
libsigrokdecode4DSL/decoders/1-spi/.pd.py.swo
+0
-0
libsigrokdecode4DSL/decoders/1-spi/.pd.py.swp
libsigrokdecode4DSL/decoders/1-spi/.pd.py.swp
+0
-0
libsigrokdecode4DSL/decoders/1-spi/pd.py
libsigrokdecode4DSL/decoders/1-spi/pd.py
+6
-6
libsigrokdecode4DSL/decoders/1-uart/.pd.py.swo
libsigrokdecode4DSL/decoders/1-uart/.pd.py.swo
+0
-0
libsigrokdecode4DSL/decoders/1-uart/.pd.py.swp
libsigrokdecode4DSL/decoders/1-uart/.pd.py.swp
+0
-0
libsigrokdecode4DSL/decoders/1-uart/pd.py
libsigrokdecode4DSL/decoders/1-uart/pd.py
+2
-2
libsigrokdecode4DSL/decoders/jtag/pd.py
libsigrokdecode4DSL/decoders/jtag/pd.py
+91
-43
libsigrokdecode4DSL/decoders/lpc/pd.py
libsigrokdecode4DSL/decoders/lpc/pd.py
+116
-59
libsigrokdecode4DSL/decoders/onewire_link/pd.py.back
libsigrokdecode4DSL/decoders/onewire_link/pd.py.back
+0
-289
libsigrokdecode4DSL/decoders/spi/__init__.py
libsigrokdecode4DSL/decoders/spi/__init__.py
+0
-32
libsigrokdecode4DSL/decoders/spi/pd.py
libsigrokdecode4DSL/decoders/spi/pd.py
+0
-334
libsigrokdecode4DSL/exception.c
libsigrokdecode4DSL/exception.c
+1
-1
libsigrokdecode4DSL/instance.c
libsigrokdecode4DSL/instance.c
+1
-0
libsigrokdecode4DSL/libsigrokdecode-internal.h
libsigrokdecode4DSL/libsigrokdecode-internal.h
+1
-1
libsigrokdecode4DSL/libsigrokdecode.h
libsigrokdecode4DSL/libsigrokdecode.h
+1
-1
libsigrokdecode4DSL/libsigrokdecode.pc.in
libsigrokdecode4DSL/libsigrokdecode.pc.in
+0
-18
libsigrokdecode4DSL/srd.c
libsigrokdecode4DSL/srd.c
+1
-1
libsigrokdecode4DSL/util.c
libsigrokdecode4DSL/util.c
+5
-3
No files found.
.gitignore
View file @
886b847c
...
...
@@ -36,6 +36,7 @@ DSView/ui_*.h
DSView/DSView
DSView/install_manifest.txt
DSView/qrc_DSView.cpp
DSView/qrc_style.cpp
moc_*.cpp
moc_*.cpp_parameters
...
...
DSView/CMakeLists.txt
View file @
886b847c
...
...
@@ -34,7 +34,7 @@ project(DSView)
option
(
DISABLE_WERROR
"Build without -Werror"
TRUE
)
option
(
ENABLE_SIGNALS
"Build with UNIX signals"
TRUE
)
option
(
ENABLE_DECODE
"Build with libsigrokdecode"
TRUE
)
option
(
ENABLE_DECODE
"Build with libsigrokdecode
4DSL
"
TRUE
)
option
(
ENABLE_COTIRE
"Enable cotire"
FALSE
)
option
(
ENABLE_TESTS
"Enable unit tests"
FALSE
)
option
(
STATIC_PKGDEPS_LIBS
"Statically link to (pkg-config) libraries"
FALSE
)
...
...
@@ -65,7 +65,7 @@ list(APPEND PKGDEPS
"libzip >= 0.10"
)
if
(
ENABLE_DECODE
)
list
(
APPEND PKGDEPS
"libsigrokdecode
>=0.3
.0"
)
list
(
APPEND PKGDEPS
"libsigrokdecode
4DSL>=0.4
.0"
)
endif
()
find_package
(
PkgConfig
)
...
...
@@ -148,7 +148,7 @@ set(DSView_SOURCES
pv/view/header.cpp
pv/view/cursor.cpp
pv/view/analogsignal.cpp
pv/prop/binding/
binding_
deviceoptions.cpp
pv/prop/binding/deviceoptions.cpp
pv/toolbars/trigbar.cpp
pv/toolbars/filebar.cpp
pv/dock/protocoldock.cpp
...
...
@@ -267,10 +267,10 @@ set(DSView_FORMS
)
set
(
DSView_RESOURCES
DSView.qrc
DSView.qrc
darkstyle/style.qrc
)
if
(
ENABLE_DECODE
)
list
(
APPEND DSView_SOURCES
pv/dock/protocoldock.cpp
...
...
@@ -399,7 +399,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES INSTALL_RPATH "/usr/local/lib")
# Install the executable.
install
(
TARGETS
${
PROJECT_NAME
}
DESTINATION bin/
)
install
(
DIRECTORY res DESTINATION share/
${
PROJECT_NAME
}
)
install
(
DIRECTORY ../libsigrokdecode4DSL/decoders DESTINATION share/
${
PROJECT_NAME
}
)
install
(
FILES icons/logo.png DESTINATION share/
${
PROJECT_NAME
}
RENAME logo.png
)
install
(
FILES DreamSourceLab.rules DESTINATION /etc/udev/rules.d/
)
install
(
FILES DSView.desktop DESTINATION /usr/share/applications/
)
...
...
DSView/DSView.desktop
0 → 100644
View file @
886b847c
[Desktop Entry]
Version=0.96
Exec=/usr/local/bin/DSView
Name=DSView
Comment=GUI Program for DreamSourceLab USB-based Instruments
Icon=/usr/local/share/DSView/logo.png
Type=Application
Terminal=false
Categories=Development
DSView/main.cpp
View file @
886b847c
...
...
@@ -22,7 +22,7 @@
#ifdef ENABLE_DECODE
#include <libsigrokdecode/libsigrokdecode.h>
/* First, so we avoid a _POSIX_C_SOURCE warning. */
#include <libsigrokdecode
4DSL
/libsigrokdecode.h>
/* First, so we avoid a _POSIX_C_SOURCE warning. */
#endif
#include <stdint.h>
...
...
DSView/pv/data/analogsnapshot.cpp
View file @
886b847c
...
...
@@ -338,7 +338,7 @@ void AnalogSnapshot::append_payload_to_envelope_levels()
int
AnalogSnapshot
::
get_ch_order
(
int
sig_index
)
{
in
t
order
=
0
;
uint16_
t
order
=
0
;
for
(
auto
&
iter
:
_ch_index
)
{
if
(
iter
==
sig_index
)
break
;
...
...
DSView/pv/data/decode/annotation.cpp
View file @
886b847c
...
...
@@ -20,7 +20,7 @@
*/
extern
"C"
{
#include <libsigrokdecode/libsigrokdecode.h>
#include <libsigrokdecode
4DSL
/libsigrokdecode.h>
}
#include <vector>
...
...
DSView/pv/data/decode/decoder.cpp
View file @
886b847c
...
...
@@ -20,7 +20,7 @@
*/
#include <libsigrok4DSL/libsigrok.h>
#include <libsigrokdecode/libsigrokdecode.h>
#include <libsigrokdecode
4DSL
/libsigrokdecode.h>
#include "decoder.h"
...
...
DSView/pv/data/decode/row.cpp
View file @
886b847c
...
...
@@ -20,7 +20,7 @@
#include "row.h"
#include <libsigrokdecode/libsigrokdecode.h>
#include <libsigrokdecode
4DSL
/libsigrokdecode.h>
namespace
pv
{
namespace
data
{
...
...
DSView/pv/data/decodermodel.cpp
View file @
886b847c
...
...
@@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <libsigrokdecode/libsigrokdecode.h>
#include <libsigrokdecode
4DSL
/libsigrokdecode.h>
#include <boost/foreach.hpp>
#include <boost/thread/thread.hpp>
...
...
DSView/pv/data/decoderstack.cpp
View file @
886b847c
...
...
@@ -457,18 +457,6 @@ uint64_t DecoderStack::get_max_sample_count() const
return
max_sample_count
;
}
boost
::
optional
<
uint64_t
>
DecoderStack
::
wait_for_data
()
const
{
//unique_lock<mutex> input_lock(_input_mutex);
while
(
!
boost
::
this_thread
::
interruption_requested
()
&&
!
_frame_complete
&&
(
uint64_t
)
_samples_decoded
>=
_sample_count
)
//_input_cond.wait(input_lock);
return
boost
::
make_optional
(
!
boost
::
this_thread
::
interruption_requested
()
&&
((
uint64_t
)
_samples_decoded
<
_sample_count
||
!
_frame_complete
),
_sample_count
);
}
void
DecoderStack
::
decode_data
(
const
uint64_t
decode_start
,
const
uint64_t
decode_end
,
srd_session
*
const
session
)
...
...
DSView/pv/data/decoderstack.h
View file @
886b847c
...
...
@@ -21,7 +21,7 @@
#ifndef DSVIEW_PV_DATA_DECODERSTACK_H
#define DSVIEW_PV_DATA_DECODERSTACK_H
#include <libsigrokdecode/libsigrokdecode.h>
#include <libsigrokdecode
4DSL
/libsigrokdecode.h>
#include <list>
...
...
@@ -145,8 +145,6 @@ public:
int64_t
get_mark_index
()
const
;
private:
boost
::
optional
<
uint64_t
>
wait_for_data
()
const
;
void
decode_data
(
const
uint64_t
decode_start
,
const
uint64_t
decode_end
,
srd_session
*
const
session
);
void
decode_proc
();
...
...
DSView/pv/data/logicsnapshot.cpp
View file @
886b847c
...
...
@@ -165,7 +165,7 @@ void LogicSnapshot::first_payload(const sr_datafeed_logic &logic, uint64_t total
sr_channel
*
const
probe
=
(
sr_channel
*
)
l
->
data
;
if
(
probe
->
type
==
SR_CHANNEL_LOGIC
&&
probe
->
enabled
)
{
std
::
vector
<
struct
RootNode
>
root_vector
;
for
(
in
t
j
=
0
;
j
<
rootnode_size
;
j
++
)
{
for
(
uint64_
t
j
=
0
;
j
<
rootnode_size
;
j
++
)
{
struct
RootNode
rn
;
rn
.
tog
=
0
;
rn
.
value
=
0
;
...
...
@@ -250,11 +250,16 @@ void LogicSnapshot::append_cross_payload(
// bit align
while
(((
_ch_fraction
!=
0
)
||
(
_byte_fraction
!=
0
))
&&
(
len
!=
0
))
{
uint8_t
*
dp_tmp
=
(
uint8_t
*
)
_dest_ptr
;
uint8_t
*
sp_tmp
=
(
uint8_t
*
)
_src_ptr
;
do
{
*
(
uint8_t
*
)
_dest_ptr
++
=
*
(
uint8_t
*
)
_src_ptr
++
;
//*(uint8_t *)_dest_ptr++ = *(uint8_t *)_src_ptr++;
*
dp_tmp
++
=
*
sp_tmp
++
;
_byte_fraction
=
(
_byte_fraction
+
1
)
%
ScaleSize
;
len
--
;
}
while
((
_byte_fraction
!=
0
)
&&
(
len
!=
0
));
_dest_ptr
=
dp_tmp
;
_src_ptr
=
sp_tmp
;
if
(
_byte_fraction
==
0
)
{
const
uint64_t
index0
=
_ring_sample_count
/
RootNodeSamples
;
const
uint64_t
index1
=
(
_ring_sample_count
>>
LeafBlockPower
)
%
RootScale
;
...
...
@@ -283,7 +288,7 @@ void LogicSnapshot::append_cross_payload(
uint64_t
pre_index0
=
_ring_sample_count
/
RootNodeSamples
;
uint64_t
pre_index1
=
(
_ring_sample_count
>>
LeafBlockPower
)
%
RootScale
;
uint64_t
pre_offset
=
(
_ring_sample_count
%
LeafBlockSamples
)
/
Scale
;
uint64_t
*
src_ptr
;
uint64_t
*
src_ptr
=
NULL
;
uint64_t
*
dest_ptr
;
int
order
=
0
;
const
uint64_t
align_size
=
len
/
ScaleSize
/
_channel_num
;
...
...
@@ -345,15 +350,20 @@ void LogicSnapshot::append_cross_payload(
uint64_t
offset
=
(
_ring_sample_count
%
LeafBlockSamples
)
/
8
;
_dest_ptr
=
(
uint8_t
*
)
_ch_data
[
_ch_fraction
][
index0
].
lbp
[
index1
]
+
offset
;
uint8_t
*
dp_tmp
=
(
uint8_t
*
)
_dest_ptr
;
uint8_t
*
sp_tmp
=
(
uint8_t
*
)
_src_ptr
;
while
(
len
--
!=
0
)
{
*
(
uint8_t
*
)
_dest_ptr
++
=
*
(
uint8_t
*
)
_src_ptr
++
;
//*(uint8_t *)_dest_ptr++ = *(uint8_t *)_src_ptr++;
*
dp_tmp
++
=
*
sp_tmp
++
;
if
(
++
_byte_fraction
==
ScaleSize
)
{
_ch_fraction
=
(
_ch_fraction
+
1
)
%
_channel_num
;
_byte_fraction
=
0
;
_dest_ptr
=
(
uint8_t
*
)
_ch_data
[
_ch_fraction
][
index0
].
lbp
[
index1
]
+
offset
;
//_dest_ptr = (uint8_t *)_ch_data[_ch_fraction][index0].lbp[index1] + offset;
dp_tmp
=
(
uint8_t
*
)
_ch_data
[
_ch_fraction
][
index0
].
lbp
[
index1
]
+
offset
;
}
}
_dest_ptr
=
(
uint8_t
*
)
_dest_ptr
+
_byte_fraction
;
//_dest_ptr = (uint8_t *)_dest_ptr + _byte_fraction;
_dest_ptr
=
dp_tmp
+
_byte_fraction
;
}
}
...
...
@@ -363,7 +373,7 @@ void LogicSnapshot::append_split_payload(
assert
(
logic
.
format
==
LA_SPLIT_DATA
);
uint64_t
samples
=
logic
.
length
*
8
;
in
t
order
=
logic
.
order
;
uint16_
t
order
=
logic
.
order
;
assert
(
order
<
_ch_data
.
size
());
if
(
_sample_cnt
[
order
]
>=
_total_sample_count
)
...
...
@@ -459,9 +469,7 @@ const uint8_t *LogicSnapshot::get_samples(uint64_t start_sample, uint64_t &end_s
int
sig_index
)
{
//assert(data);
assert
(
start_sample
>=
0
);
assert
(
start_sample
<
get_sample_count
());
assert
(
end_sample
>=
0
);
assert
(
end_sample
<
get_sample_count
());
assert
(
start_sample
<=
end_sample
);
...
...
@@ -530,9 +538,9 @@ bool LogicSnapshot::get_display_edges(std::vector<std::pair<bool, bool> > &edges
bool
has_edge
=
get_nxt_edge
(
index
,
last_sample
,
end
,
0
,
sig_index
);
// calc the edge position
int
gap
=
(
index
/
min_length
)
-
pixels_offset
;
int
64_t
gap
=
(
index
/
min_length
)
-
pixels_offset
;
index
=
max
((
uint64_t
)
ceil
((
floor
(
index
/
min_length
)
+
1
)
*
min_length
),
index
+
1
);
while
(
gap
>
edges
.
size
()
&&
edges
.
size
()
<
width
)
while
(
gap
>
(
int64_t
)
edges
.
size
()
&&
edges
.
size
()
<
width
)
edges
.
push_back
(
pair
<
bool
,
bool
>
(
false
,
last_sample
));
if
(
index
>
end
)
...
...
@@ -576,7 +584,7 @@ bool LogicSnapshot::get_nxt_edge(
bool
edge_hit
=
false
;
// linear search for the next transition on the root level
for
(
int64_t
i
=
root_index
;
!
edge_hit
&&
(
index
<=
end
)
&&
i
<
_ch_data
[
order
].
size
();
i
++
)
{
for
(
int64_t
i
=
root_index
;
!
edge_hit
&&
(
index
<=
end
)
&&
i
<
(
int64_t
)
_ch_data
[
order
].
size
();
i
++
)
{
uint64_t
cur_mask
=
(
~
0ULL
<<
root_pos
);
do
{
uint64_t
cur_tog
=
_ch_data
[
order
][
i
].
tog
&
cur_mask
;
...
...
@@ -739,7 +747,6 @@ bool LogicSnapshot::block_pre_edge(uint64_t *lbp, uint64_t &index, bool last_sam
unsigned
int
level
=
min_level
;
bool
fast_forward
=
true
;
bool
within_block
=
true
;
const
uint64_t
last
=
last_sample
?
~
0ULL
:
0
;
uint64_t
block_start
=
index
&
~
LeafMask
;
...
...
@@ -1067,7 +1074,7 @@ uint8_t *LogicSnapshot::get_block_buf(int block_index, int sig_index, bool &samp
int
LogicSnapshot
::
get_ch_order
(
int
sig_index
)
{
in
t
order
=
0
;
uint16_
t
order
=
0
;
for
(
auto
&
iter
:
_ch_index
)
{
if
(
iter
==
sig_index
)
break
;
...
...
DSView/pv/data/mathstack.cpp
View file @
886b847c
...
...
@@ -157,12 +157,13 @@ const std::vector<double> MathStack::get_fft_spectrum() const
return
empty
;
}
const
double
MathStack
::
get_fft_spectrum
(
uint64_t
index
)
const
double
MathStack
::
get_fft_spectrum
(
uint64_t
index
)
{
double
ret
=
-
1
;
if
(
_math_state
==
Stopped
&&
index
<
_power_spectrum
.
size
())
ret
urn
_power_spectrum
[
index
];
else
return
-
1
;
ret
=
_power_spectrum
[
index
];
return
ret
;
}
void
MathStack
::
calc_fft
()
...
...
DSView/pv/data/mathstack.h
View file @
886b847c
...
...
@@ -86,7 +86,7 @@ public:
void
set_sample_interval
(
int
interval
);
const
std
::
vector
<
double
>
get_fft_spectrum
()
const
;
const
double
get_fft_spectrum
(
uint64_t
index
)
const
;
double
get_fft_spectrum
(
uint64_t
index
)
;
void
calc_fft
();
...
...
DSView/pv/device/devinst.cpp
View file @
886b847c
...
...
@@ -83,7 +83,7 @@ GVariant* DevInst::get_config(const sr_channel *ch, const sr_channel_group *grou
return
data
;
}
bool
DevInst
::
set_config
(
const
sr_channel
*
ch
,
const
sr_channel_group
*
group
,
int
key
,
GVariant
*
data
)
bool
DevInst
::
set_config
(
sr_channel
*
ch
,
sr_channel_group
*
group
,
int
key
,
GVariant
*
data
)
{
assert
(
_owner
);
sr_dev_inst
*
const
sdi
=
dev_inst
();
...
...
DSView/pv/device/devinst.h
View file @
886b847c
...
...
@@ -63,7 +63,7 @@ public:
GVariant
*
get_config
(
const
sr_channel
*
ch
,
const
sr_channel_group
*
group
,
int
key
);
bool
set_config
(
const
sr_channel
*
ch
,
const
sr_channel_group
*
group
,
int
key
,
GVariant
*
data
);
bool
set_config
(
sr_channel
*
ch
,
sr_channel_group
*
group
,
int
key
,
GVariant
*
data
);
GVariant
*
list_config
(
const
sr_channel_group
*
group
,
int
key
);
...
...
DSView/pv/device/file.cpp
View file @
886b847c
...
...
@@ -78,10 +78,12 @@ QJsonArray File::get_decoders()
QJsonArray
dec_array
;
QJsonParseError
error
;
if
(
archive
=
zip_open
(
_path
.
toLocal8Bit
().
data
(),
0
,
&
ret
))
{
archive
=
zip_open
(
_path
.
toLocal8Bit
().
data
(),
0
,
&
ret
);
if
(
archive
)
{
/* read "decoders" */
if
(
zip_stat
(
archive
,
"decoders"
,
0
,
&
zs
)
!=
-
1
)
{
if
(
dec_file
=
(
char
*
)
g_try_malloc
(
zs
.
size
))
{
dec_file
=
(
char
*
)
g_try_malloc
(
zs
.
size
);
if
(
dec_file
)
{
zf
=
zip_fopen_index
(
archive
,
zs
.
index
,
0
);
zip_fread
(
zf
,
dec_file
,
zs
.
size
);
zip_fclose
(
zf
);
...
...
DSView/pv/device/inputfile.cpp
View file @
886b847c
...
...
@@ -48,6 +48,7 @@ sr_dev_inst* InputFile::dev_inst() const
void
InputFile
::
use
(
SigSession
*
owner
)
throw
(
QString
)
{
(
void
)
owner
;
assert
(
!
_input
);
// only *.dsl file is valid
...
...
DSView/pv/dialogs/fftoptions.cpp
View file @
886b847c
...
...
@@ -224,7 +224,7 @@ void FftOptions::accept()
mathTrace
->
get_math_stack
()
->
set_sample_num
(
_len_combobox
->
currentData
().
toULongLong
());
mathTrace
->
get_math_stack
()
->
set_sample_interval
(
_interval_combobox
->
currentData
().
toInt
());
mathTrace
->
get_math_stack
()
->
set_windows_index
(
_window_combobox
->
currentData
().
toInt
());
mathTrace
->
set_view_mode
(
_view_combobox
->
currentData
().
toInt
());
mathTrace
->
set_view_mode
(
_view_combobox
->
currentData
().
to
U
Int
());
//mathTrace->init_zoom();
mathTrace
->
set_dbv_range
(
_dbv_combobox
->
currentData
().
toInt
());
mathTrace
->
set_enable
(
_en_checkbox
->
isChecked
());
...
...
DSView/pv/dialogs/interval.cpp
View file @
886b847c
...
...
@@ -27,8 +27,8 @@ namespace pv {
namespace
dialogs
{
Interval
::
Interval
(
SigSession
&
session
,
QWidget
*
parent
)
:
_session
(
session
),
DSDialog
(
parent
),
_session
(
session
),
_button_box
(
QDialogButtonBox
::
Ok
,
Qt
::
Horizontal
,
this
)
{
...
...
DSView/pv/dock/measuredock.cpp
View file @
886b847c
...
...
@@ -445,7 +445,7 @@ void MeasureDock::show_all_coursor()
cursor_dlg
.
setWindowFlags
(
Qt
::
FramelessWindowHint
|
Qt
::
Popup
|
Qt
::
WindowSystemMenuHint
|
Qt
::
WindowMinimizeButtonHint
|
Qt
::
WindowMaximizeButtonHint
);
int
index
=
0
;
QHBoxLayout
*
hlayout
;
QHBoxLayout
*
hlayout
=
NULL
;
QVBoxLayout
*
vlayout
=
new
QVBoxLayout
(
&
cursor_dlg
);
for
(
std
::
list
<
Cursor
*>::
iterator
i
=
_view
.
get_cursorList
().
begin
();
i
!=
_view
.
get_cursorList
().
end
();
i
++
)
{
...
...
@@ -634,7 +634,7 @@ void MeasureDock::update_probe_selector(QComboBox *selector)
void
MeasureDock
::
del_cursor
()
{
int
del_index
=
0
;
Cursor
*
cursor
;
Cursor
*
cursor
=
NULL
;
for
(
QVector
<
QToolButton
*>::
const_iterator
i
=
_cursor_del_btn_vec
.
begin
();
i
!=
_cursor_del_btn_vec
.
end
();
i
++
)
{
if
((
*
i
)
->
isChecked
())
{
...
...
@@ -648,7 +648,8 @@ void MeasureDock::del_cursor()
del_index
++
;
}
_view
.
del_cursor
(
cursor
);
if
(
cursor
)
_view
.
del_cursor
(
cursor
);
if
(
_view
.
get_cursorList
().
empty
())
_view
.
show_cursors
(
false
);
...
...
DSView/pv/dock/protocoldock.cpp
View file @
886b847c
...
...
@@ -615,7 +615,7 @@ void ProtocolDock::export_table_view()
void
ProtocolDock
::
nav_table_view
()
{
uint64_t
row_index
;
uint64_t
row_index
=
0
;
pv
::
data
::
DecoderModel
*
decoder_model
=
_session
.
get_decoder_model
();
boost
::
shared_ptr
<
pv
::
data
::
DecoderStack
>
decoder_stack
=
decoder_model
->
getDecoderStack
();
if
(
decoder_stack
)
{
...
...
DSView/pv/dock/protocoldock.h
View file @
886b847c
...
...
@@ -23,7 +23,7 @@
#ifndef DSVIEW_PV_PROTOCOLDOCK_H
#define DSVIEW_PV_PROTOCOLDOCK_H
#include <libsigrokdecode/libsigrokdecode.h>
#include <libsigrokdecode
4DSL
/libsigrokdecode.h>
#include <QDockWidget>
#include <QPushButton>
...
...
DSView/pv/mainframe.cpp
View file @
886b847c
...
...
@@ -120,7 +120,6 @@ MainFrame::MainFrame(DeviceManager &device_manager,
_layout
->
addWidget
(
_bottom_right
,
2
,
2
);
connect
(
&
_timer
,
SIGNAL
(
timeout
()),
this
,
SLOT
(
unfreezing
()));
connect
(
_mainWindow
,
SIGNAL
(
prgRate
(
int
)),
this
,
SLOT
(
setTaskbarProgress
(
int
)));
//readSettings();
}
...
...
DSView/pv/mainwindow.cpp
View file @
886b847c
...
...
@@ -22,7 +22,7 @@
#ifdef ENABLE_DECODE
#include <libsigrokdecode/libsigrokdecode.h>
#include <libsigrokdecode
4DSL
/libsigrokdecode.h>
#include "dock/protocoldock.h"
#endif
...
...
@@ -819,6 +819,8 @@ bool MainWindow::load_session(QString name)
ss
.
load_decoders
(
_protocol_widget
,
sessionObj
[
"decoder"
].
toArray
());
}
#endif
return
true
;
}
bool
MainWindow
::
store_session
(
QString
name
)
...
...
DSView/pv/prop/binding/binding.cpp
View file @
886b847c
...
...
@@ -80,7 +80,7 @@ QWidget* Binding::get_property_form(QWidget *parent,
}
std
::
map
<
boost
::
shared_ptr
<
Property
>
,
GVariant
*
>
&
Binding
::
get_property_value
()
const
GVariant
*
>
Binding
::
get_property_value
()
const
{
std
::
map
<
boost
::
shared_ptr
<
Property
>
,
GVariant
*
>
pvalue
;
...
...
@@ -89,6 +89,8 @@ std::map< boost::shared_ptr<Property>,
assert
(
p
);
pvalue
[
p
]
=
p
->
get_value
();
}
return
pvalue
;
}
QString
Binding
::
print_gvariant
(
GVariant
*
const
gvar
)
...
...
DSView/pv/prop/binding/binding.h
View file @
886b847c
...
...
@@ -56,7 +56,7 @@ public:
bool
auto_commit
=
false
)
const
;
std
::
map
<
boost
::
shared_ptr
<
Property
>
,
GVariant
*
>
&
get_property_value
()
const
;
GVariant
*
>
get_property_value
()
const
;
static
QString
print_gvariant
(
GVariant
*
const
gvar
);
...
...
DSView/pv/prop/binding/decoderoptions.cpp
View file @
886b847c
...
...
@@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <libsigrokdecode/libsigrokdecode.h>
#include <libsigrokdecode
4DSL
/libsigrokdecode.h>
#include "decoderoptions.h"
...
...
DSView/pv/prop/binding/
binding_
deviceoptions.cpp
→
DSView/pv/prop/binding/deviceoptions.cpp
View file @
886b847c
...
...
@@ -142,7 +142,7 @@ GVariant* DeviceOptions::config_getter(
}
void
DeviceOptions
::
config_setter
(
const
struct
sr_dev_inst
*
sdi
,
int
key
,
GVariant
*
value
)
struct
sr_dev_inst
*
sdi
,
int
key
,
GVariant
*
value
)
{
if
(
sr_config_set
(
sdi
,
NULL
,
NULL
,
key
,
value
)
!=
SR_OK
)
qDebug
()
<<
"WARNING: Failed to set value of sample rate"
;
...
...
DSView/pv/prop/binding/deviceoptions.h
View file @
886b847c
...
...
@@ -47,7 +47,7 @@ private:
static
GVariant
*
config_getter
(
const
struct
sr_dev_inst
*
sdi
,
int
key
);
static
void
config_setter
(
const
struct
sr_dev_inst
*
sdi
,
int
key
,
GVariant
*
value
);
struct
sr_dev_inst
*
sdi
,
int
key
,
GVariant
*
value
);
void
bind_bool
(
const
QString
&
name
,
int
key
);
void
bind_enum
(
const
QString
&
name
,
int
key
,
...
...
DSView/pv/sigsession.cpp
View file @
886b847c
...
...
@@ -21,7 +21,7 @@
*/
#ifdef ENABLE_DECODE
#include <libsigrokdecode/libsigrokdecode.h>
#include <libsigrokdecode
4DSL
/libsigrokdecode.h>
#endif
#include "sigsession.h"
...
...
@@ -861,7 +861,8 @@ void SigSession::feed_in_trigger(const ds_trigger_pos &trigger_pos)
{
_hw_replied
=
true
;
if
(
_dev_inst
->
dev_inst
()
->
mode
!=
DSO
)
{
if
(
_trigger_flag
=
(
trigger_pos
.
status
&
0x01
))
{
_trigger_flag
=
(
trigger_pos
.
status
&
0x01
);
if
(
_trigger_flag
)
{
_trigger_pos
=
trigger_pos
.
real_pos
;
receive_trigger
(
_trigger_pos
);
}
...
...
DSView/pv/storesession.cpp
View file @
886b847c
...
...
@@ -219,15 +219,17 @@ void StoreSession::save_proc(shared_ptr<data::Snapshot> snapshot)
}
}
}
else
{
int
ch_type
;
int
ch_type
=
-
1
;
BOOST_FOREACH
(
const
boost
::
shared_ptr
<
view
::
Signal
>
s
,
_session
.
get_signals
())
{
ch_type
=
s
->
get_type
();
break
;
}
uint64_t
size
=
snapshot
->
get_sample_count
()
*
snapshot
->
get_channel_num
();
uint8_t
*
buf
=
(
uint8_t
*
)
snapshot
->
get_data
();
sr_session_append
(
_file_name
.
toLocal8Bit
().
data
(),
buf
,
size
,
0
,
0
,
ch_type
,
1
);
if
(
ch_type
!=
-
1
)
{
uint64_t
size
=
snapshot
->
get_sample_count
()
*
snapshot
->
get_channel_num
();
uint8_t
*
buf
=
(
uint8_t
*
)
snapshot
->
get_data
();
sr_session_append
(
_file_name
.
toLocal8Bit
().
data
(),
buf
,
size
,
0
,
0
,
ch_type
,
1
);
}
}
progress_updated
();
...
...
@@ -276,7 +278,7 @@ QString StoreSession::meta_gen(boost::shared_ptr<data::Snapshot> snapshot)
/* metadata */
fprintf
(
meta
,
"capturefile = data
\n
"
);
fprintf
(
meta
,
"total samples = %
llu
\n
"
,
snapshot
->
get_sample_count
());
fprintf
(
meta
,
"total samples = %
"
PRIu64
"
\n
"
,
snapshot
->
get_sample_count
());
if
(
sdi
->
mode
==
DSO
)
fprintf
(
meta
,
"total probes = %d
\n
"
,
g_slist_length
(
sdi
->
channels
));
...
...
@@ -300,7 +302,7 @@ QString StoreSession::meta_gen(boost::shared_ptr<data::Snapshot> snapshot)
gvar
=
_session
.
get_device
()
->
get_config
(
NULL
,
NULL
,
SR_CONF_TIMEBASE
);
if
(
gvar
!=
NULL
)
{
uint64_t
tmp_u64
=
g_variant_get_uint64
(
gvar
);
fprintf
(
meta
,
"hDiv = %
llu
\n
"
,
tmp_u64
);
fprintf
(
meta
,
"hDiv = %
"
PRIu64
"
\n
"
,
tmp_u64
);
g_variant_unref
(
gvar
);
}
gvar
=
_session
.
get_device
()
->
get_config
(
NULL
,
NULL
,
SR_CONF_DSO_BITS
);
...
...
@@ -312,7 +314,7 @@ QString StoreSession::meta_gen(boost::shared_ptr<data::Snapshot> snapshot)
}
else
if
(
sdi
->
mode
==
LOGIC
)
{
fprintf
(
meta
,
"trigger time = %lld
\n
"
,
_session
.
get_trigger_time
().
toMSecsSinceEpoch
());
}
fprintf
(
meta
,
"trigger pos = %
llu
\n
"
,
_session
.
get_trigger_pos
());
fprintf
(
meta
,
"trigger pos = %
"
PRIu64
"
\n
"
,
_session
.
get_trigger_pos
());
probecnt
=
1
;
for
(
l
=
sdi
->
channels
;
l
;
l
=
l
->
next
)
{
...
...
@@ -325,19 +327,19 @@ QString StoreSession::meta_gen(boost::shared_ptr<data::Snapshot> snapshot)
if
(
sdi
->
mode
==
DSO
)
{
fprintf
(
meta
,
" enable%d = %d
\n
"
,
probe
->
index
,
probe
->
enabled
);
fprintf
(
meta
,
" coupling%d = %d
\n
"
,
probe
->
index
,
probe
->
coupling
);
fprintf
(
meta
,
" vDiv%d = %
d
\n
"
,
probe
->
index
,
probe
->
vdiv
);
fprintf
(
meta
,
" vDiv%d = %
"
PRIu64
"
\n
"
,
probe
->
index
,
probe
->
vdiv
);
fprintf
(
meta
,
" vFactor%d = %d
\n
"
,
probe
->
index
,
probe
->
vfactor
);
fprintf
(
meta
,
" vPos%d = %lf
\n
"
,
probe
->
index
,
probe
->
vpos
);
fprintf
(
meta
,
" vTrig%d = %d
\n
"
,
probe
->
index
,
probe
->
trig_value
);
if
(
sr_status_get
(
sdi
,
&
status
,
0
,
0
)
==
SR_OK
)
{
if
(
probe
->
index
==
0
)
{
fprintf
(
meta
,
" period%d = %
llu
\n
"
,
probe
->
index
,
status
.
ch0_period
);
fprintf
(
meta
,
" pcnt%d = %
lu
\n
"
,
probe
->
index
,
status
.
ch0_pcnt
);
fprintf
(
meta
,
" period%d = %
"
PRIu64
"
\n
"
,
probe
->
index
,
status
.
ch0_period
);
fprintf
(
meta
,
" pcnt%d = %
"
PRIu32
"
\n
"
,
probe
->
index
,
status
.
ch0_pcnt
);
fprintf
(
meta
,
" max%d = %d
\n
"
,
probe
->
index
,
status
.
ch0_max
);
fprintf
(
meta
,
" min%d = %d
\n
"
,
probe
->
index
,
status
.
ch0_min
);
}
else
{
fprintf
(
meta
,
" period%d = %
llu
\n
"
,
probe
->
index
,
status
.
ch1_period
);
fprintf
(
meta
,
" pcnt%d = %
lu
\n
"
,
probe
->
index
,
status
.
ch1_pcnt
);
fprintf
(
meta
,
" period%d = %
"
PRIu64
"
\n
"
,
probe
->
index
,
status
.
ch1_period
);
fprintf
(
meta
,
" pcnt%d = %
"
PRIu32
"
\n
"
,
probe
->
index
,
status
.
ch1_pcnt
);
fprintf
(
meta
,
" max%d = %d
\n
"
,
probe
->
index
,
status
.
ch1_max
);
fprintf
(
meta
,
" min%d = %d
\n
"
,
probe
->
index
,
status
.
ch1_min
);
}
...
...
@@ -531,7 +533,7 @@ void StoreSession::export_proc(shared_ptr<data::Snapshot> snapshot)
progress_updated
();
}
}
}
else
if
(
channel_type
=
SR_CHANNEL_DSO
)
{
}
else
if
(
channel_type
=
=
SR_CHANNEL_DSO
)
{
_unit_count
=
snapshot
->
get_sample_count
();
unsigned
char
*
datat
=
(
unsigned
char
*
)
snapshot
->
get_data
();
GString
*
data_out
;
...
...
@@ -844,7 +846,7 @@ void StoreSession::load_decoders(dock::ProtocolDock *widget, QJsonArray dec_arra
double
StoreSession
::
get_double
(
GVariant
*
var
)
{
double
val
;
double
val
=
0
;
const
GVariantType
*
const
type
=
g_variant_get_type
(
var
);
assert
(
type
);
...
...
DSView/pv/storesession.h
View file @
886b847c
...
...
@@ -30,7 +30,7 @@
#include <QObject>
#include <libsigrok4DSL/libsigrok.h>
#include <libsigrokdecode/libsigrokdecode.h>
#include <libsigrokdecode
4DSL
/libsigrokdecode.h>
namespace
pv
{
...
...
DSView/pv/toolbars/samplingbar.cpp
View file @
886b847c
...
...
@@ -572,7 +572,7 @@ void SamplingBar::update_sample_count_selector()
const
uint64_t
*
elements
=
NULL
;
gsize
num_elements
;
bool
stream_mode
=
false
;
uint64_t
hw_depth
;
uint64_t
hw_depth
=
0
;
uint64_t
sw_depth
;
if
(
_updating_sample_count
)
...
...
DSView/pv/view/decodetrace.cpp
View file @
886b847c
...
...
@@ -19,7 +19,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
extern
"C"
{
#include <libsigrokdecode/libsigrokdecode.h>
#include <libsigrokdecode
4DSL
/libsigrokdecode.h>
}
#include <extdef.h>
...
...
@@ -495,7 +495,7 @@ void DecodeTrace::draw_annotation(const pv::data::decode::Annotation &a,
if
(
start
>
right
+
DrawPadding
||
end
<
left
-
DrawPadding
)
return
;
if
(
_decoder_stack
->
get_mark_index
()
==
(
a
.
start_sample
()
+
a
.
end_sample
())
/
2
)
{
if
(
_decoder_stack
->
get_mark_index
()
==
(
int64_t
)(
a
.
start_sample
()
+
a
.
end_sample
())
/
2
)
{
p
.
setPen
(
Signal
::
dsBlue
);
int
xpos
=
(
start
+
end
)
/
2
;
int
ypos
=
get_y
()
+
_totalHeight
*
0.5
+
1
;
...
...
DSView/pv/view/dsldial.cpp
View file @
886b847c
...
...
@@ -137,7 +137,7 @@ uint64_t dslDial::get_value()
return
_value
[
_sel
];
}
bool
dslDial
::
set_value
(
uint64_t
value
)
void
dslDial
::
set_value
(
uint64_t
value
)
{
assert
(
_value
.
contains
(
value
));
_sel
=
_value
.
indexOf
(
value
,
0
);
...
...
DSView/pv/view/dsldial.h
View file @
886b847c
...
...
@@ -53,7 +53,7 @@ public:
// get current value
uint64_t
get_value
();
bool
set_value
(
uint64_t
value
);
void
set_value
(
uint64_t
value
);
// set/get factor
void
set_factor
(
uint64_t
factor
);
...
...
DSView/pv/view/dsosignal.cpp
View file @
886b847c
...
...
@@ -211,7 +211,6 @@ void DsoSignal::set_enable(bool enable)
set_vDialActive
(
false
);
_dev_inst
->
set_config
(
_probe
,
NULL
,
SR_CONF_EN_CH
,