Compare commits
519 commits
v1.5.0-alp
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6a7b985fa9 | ||
|
|
7bdbcde9be | ||
|
|
fbef4b364f | ||
|
|
da1228c9b1 | ||
|
|
3aac724298 | ||
|
|
0f9510e7a0 | ||
|
|
65bc247a65 | ||
|
|
d0c8a1ae8e | ||
|
|
9923038d6c | ||
|
|
72d547eb08 | ||
|
|
d853571aea | ||
|
|
64791e6d4e | ||
|
|
b6718c57b2 | ||
|
|
87ab2fccca | ||
|
|
56dbec82d4 | ||
|
|
bbd1bce0b8 | ||
|
|
937b002dfb | ||
|
|
d77215aecb | ||
|
|
7acb847a2b | ||
|
|
92088ec646 | ||
|
|
be123420db | ||
|
|
273dfa8037 | ||
|
|
6e2079fcfb | ||
|
|
ed699cfd6a | ||
|
|
f51c6a0bce | ||
|
|
5d00d4786b | ||
|
|
3e327e7e6b | ||
|
|
b2fd49d800 | ||
|
|
f327a4b4a0 | ||
|
|
5947584e63 | ||
|
|
3071d8de72 | ||
|
|
d882bca547 | ||
|
|
f0c7f289cb | ||
|
|
8b44421ea3 | ||
|
|
66d5bdd91b | ||
|
|
10ba138104 | ||
|
|
2f018e3867 | ||
|
|
68e8d29e0c | ||
|
|
1b3c1c4b3b | ||
|
|
38b4a6ba39 | ||
|
|
abe2aefcf9 | ||
|
|
3483b7baec | ||
|
|
1a21a49dfd | ||
|
|
8f689637ff | ||
|
|
67cffbb69e | ||
|
|
2f256117db | ||
|
|
8e917faed4 | ||
|
|
c1705290ff | ||
|
|
ceaf412c2a | ||
|
|
514fcd180c | ||
|
|
b3eb1735cc | ||
|
|
3330cee2ba | ||
|
|
d8f042dcaa | ||
|
|
d615089afe | ||
|
|
d6020a6a26 | ||
|
|
a2b3146f1c | ||
|
|
b5da8015b5 | ||
|
|
162309e54a | ||
|
|
fde6707c9c | ||
|
|
8a56b36166 | ||
|
|
c808c6d4e4 | ||
|
|
8a172d7f40 | ||
|
|
0cdc4b138a | ||
|
|
6b81b307b7 | ||
|
|
69bb1e493e | ||
|
|
8a5d56ee39 | ||
|
|
199bb7bbd7 | ||
|
|
b3b3fa7718 | ||
|
|
4f63a28b61 | ||
|
|
8a30f95aa7 | ||
|
|
5827f2b927 | ||
|
|
47db70a12e | ||
|
|
0818cda62e | ||
|
|
51c9ef2795 | ||
|
|
b8600be086 | ||
|
|
798ffc4867 | ||
|
|
b1c4c4ffad | ||
|
|
a28dd50e36 | ||
|
|
c296111bcc | ||
|
|
57615f1b39 | ||
|
|
345ab827c0 | ||
|
|
8d219c0523 | ||
|
|
1fb1c85208 | ||
|
|
91e4a87dc0 | ||
|
|
eb3098a2ad | ||
|
|
5ea02a71fe | ||
|
|
c96101960f | ||
|
|
a39b9465a6 | ||
|
|
99d34a39ce | ||
|
|
7370fda2c7 | ||
|
|
b133728f1d | ||
|
|
224b2abc5c | ||
|
|
cbd7d7149c | ||
|
|
cef3b7483d | ||
|
|
05d6112605 | ||
|
|
2d5609b1c5 | ||
|
|
8c3b76e2d0 | ||
|
|
7eaa72529a | ||
|
|
1405d0a599 | ||
|
|
9da7edc31f | ||
|
|
86fbe929d4 | ||
|
|
28150307ca | ||
|
|
d3610011e6 | ||
|
|
a4c1cd5274 | ||
|
|
af26764539 | ||
|
|
b9523b4864 | ||
|
|
72e2a331da | ||
|
|
b6f26eb6dc | ||
|
|
9660b4e58b | ||
|
|
e131c4c996 | ||
|
|
54eb6c8cd3 | ||
|
|
1fa3516612 | ||
|
|
269c7b9859 | ||
|
|
0966466686 | ||
|
|
3c7534a35c | ||
|
|
e47ca98b95 | ||
|
|
fa9e90df24 | ||
|
|
2b9b623dd0 | ||
|
|
351b040237 | ||
|
|
d722f62947 | ||
|
|
705661e322 | ||
|
|
8962cab40c | ||
|
|
3f64653ed3 | ||
|
|
3e0f3df48c | ||
|
|
0205ab494d | ||
|
|
77a3fc5039 | ||
|
|
15db0236a8 | ||
|
|
c56fdf0ce5 | ||
|
|
d4df1c1b22 | ||
|
|
ef8cdeccd7 | ||
|
|
50bde261af | ||
|
|
523946447a | ||
|
|
ab9605cb85 | ||
|
|
185f8a9e16 | ||
|
|
cd83921f49 | ||
|
|
ca25969574 | ||
|
|
733d0ffbf4 | ||
|
|
b77ba278de | ||
|
|
8df7d1b7be | ||
|
|
a4faeb28b0 | ||
|
|
24314e2361 | ||
|
|
a2abc0c2af | ||
|
|
70ac53aa75 | ||
|
|
acb79fa3bc | ||
|
|
4725942727 | ||
|
|
e8482783f7 | ||
|
|
f2b01f71c4 | ||
|
|
a5b9195ac9 | ||
|
|
8be82589c5 | ||
|
|
199975bdd0 | ||
|
|
6ea8869f7f | ||
|
|
0b8e1a7b50 | ||
|
|
9e33a294cd | ||
|
|
b95e966041 | ||
|
|
82e215881a | ||
|
|
57e6812cf8 | ||
|
|
e2bbd6fad3 | ||
|
|
0cc4470cbf | ||
|
|
4dc75c13c5 | ||
|
|
48cc3891cd | ||
|
|
67a186be4f | ||
|
|
69b2fac95f | ||
|
|
64a7ddc455 | ||
|
|
fc717a8f88 | ||
|
|
6d6ffc60ea | ||
|
|
74858c1098 | ||
|
|
2c639d8080 | ||
|
|
392cb6dc3f | ||
|
|
f9d1b0de42 | ||
|
|
5fd77343ac | ||
|
|
b9e4117db1 | ||
|
|
009de1af17 | ||
|
|
b09ea7da44 | ||
|
|
f2df7ad3f0 | ||
|
|
2d0c857a12 | ||
|
|
6a1f6a35b6 | ||
|
|
5f2788467b | ||
|
|
4dea10552c | ||
|
|
8b021cf5d1 | ||
|
|
b4a22176a4 | ||
|
|
2fbfb96dda | ||
|
|
253e2d3517 | ||
|
|
ee1adc0f85 | ||
|
|
45a30a4159 | ||
|
|
6ca54547bb | ||
|
|
2ba954537b | ||
|
|
aeea13347e | ||
|
|
b2d07d532d | ||
|
|
61db859c3d | ||
|
|
fe08937bb7 | ||
|
|
e1168f2a32 | ||
|
|
792a6a4974 | ||
|
|
5ae57bfa9a | ||
|
|
37c1064881 | ||
|
|
1edaceec4b | ||
|
|
cdef035e74 | ||
|
|
5692356e90 | ||
|
|
77efc4d924 | ||
|
|
2a3343d464 | ||
|
|
dbc99c011d | ||
|
|
a6c70e0bfa | ||
|
|
77cd3a9d4b | ||
|
|
0fc6c912fc | ||
|
|
c5d045364c | ||
|
|
2b521c4aaa | ||
|
|
b09f409509 | ||
|
|
6cc83a1aba | ||
|
|
70c44d006d | ||
|
|
f897d98ab0 | ||
|
|
e3b4972025 | ||
|
|
792f678b99 | ||
|
|
a202a10507 | ||
|
|
2963e8b3d5 | ||
|
|
c1d1bc7aed | ||
|
|
15024eb91e | ||
|
|
41033fdecd | ||
|
|
106832624a | ||
|
|
95e59769fd | ||
|
|
3f6dad5b92 | ||
|
|
994b536bc6 | ||
|
|
cdfe95af17 | ||
|
|
3be48bddeb | ||
|
|
645821a9bd | ||
|
|
5e75802bf4 | ||
|
|
73ba0f9692 | ||
|
|
626d4110e2 | ||
|
|
bd781764fb | ||
|
|
de3f3c092a | ||
|
|
5d3ce139b4 | ||
|
|
bb66883de2 | ||
|
|
124feb5b6b | ||
|
|
f2ac39238c | ||
|
|
a77d675a39 | ||
|
|
d99dab35aa | ||
|
|
73a2a64158 | ||
|
|
677415bee8 | ||
|
|
7dd2c0501e | ||
|
|
69f255d181 | ||
|
|
a62f9a77f1 | ||
|
|
2d319bcc76 | ||
|
|
087bd8e4f1 | ||
|
|
b26dc41907 | ||
|
|
6a65966846 | ||
|
|
a7aae7e8c6 | ||
|
|
e93e364079 | ||
|
|
b7c2bf7cdd | ||
|
|
358872904e | ||
|
|
a247d304f1 | ||
|
|
5ce832b7ec | ||
|
|
54149bfcb2 | ||
|
|
83e948803c | ||
|
|
a3223aa08c | ||
|
|
38da235175 | ||
|
|
5fee8ee974 | ||
|
|
21eb612601 | ||
|
|
ef5f9c1ab5 | ||
|
|
542b07f52c | ||
|
|
993957d4d2 | ||
|
|
4aa1564de0 | ||
|
|
82dc84be8a | ||
|
|
0afcbaac5d | ||
|
|
5136418e26 | ||
|
|
15d893d3cc | ||
|
|
2bbb8792d8 | ||
|
|
8c44a8de2d | ||
|
|
56de3dca11 | ||
|
|
3bc9070eea | ||
|
|
8a900600f5 | ||
|
|
ec4828d4c4 | ||
|
|
ee16dbc070 | ||
|
|
ee8188775a | ||
|
|
c8efeea9b3 | ||
|
|
8c1d2d1f06 | ||
|
|
10e31356df | ||
|
|
3c567704ad | ||
|
|
4fcd1abf85 | ||
|
|
186d94fa94 | ||
|
|
67ce6718fe | ||
|
|
99d4d089b9 | ||
|
|
054e7ed995 | ||
|
|
ed0b968752 | ||
|
|
07c2b8961e | ||
|
|
11612e44d5 | ||
|
|
772ef44d49 | ||
|
|
4c0d18b5f4 | ||
|
|
79290d0f36 | ||
|
|
503d689d51 | ||
|
|
ccb71f9650 | ||
|
|
59f3057dd9 | ||
|
|
5a78091f2b | ||
|
|
70a0079f92 | ||
|
|
69fe833715 | ||
|
|
8a6bff5248 | ||
|
|
1c09b8e1cb | ||
|
|
6901278185 | ||
|
|
853cf310c9 | ||
|
|
175cade3da | ||
|
|
d0620287a2 | ||
|
|
94482fe151 | ||
|
|
a697f65de6 | ||
|
|
0ba1493d19 | ||
|
|
7370ed7f17 | ||
|
|
8962965883 | ||
|
|
727040c132 | ||
|
|
1aaba21723 | ||
|
|
5f022c42b6 | ||
|
|
b729600cd8 | ||
|
|
50dd9e6002 | ||
|
|
f422ef1274 | ||
|
|
b0e44b9fcf | ||
|
|
c18845fce5 | ||
|
|
ac2d532b0c | ||
|
|
f84a0f7c1a | ||
|
|
1c1ef29e7b | ||
|
|
84953d23d1 | ||
|
|
3f39a736e0 | ||
|
|
76448e64ee | ||
|
|
daf7218cfd | ||
|
|
714953f8aa | ||
|
|
8b17a445c7 | ||
|
|
7a561224e2 | ||
|
|
7a75a3cfbe | ||
|
|
e12cc850db | ||
|
|
f0d0f3bde2 | ||
|
|
f4b8a0b3ad | ||
|
|
7ebb1ea0c0 | ||
|
|
9eb2a913b7 | ||
|
|
2111f5844a | ||
|
|
4dd477f604 | ||
|
|
54de9fd6b0 | ||
|
|
f6ff4727c8 | ||
|
|
5e46055d3c | ||
|
|
87c1f4d576 | ||
|
|
d30fa8b2ce | ||
|
|
ce50ddc702 | ||
|
|
f5aeca60da | ||
|
|
afda0e2994 | ||
|
|
4caec3989e | ||
|
|
99c6d77ad8 | ||
|
|
a0c45d3c56 | ||
|
|
e05df7ef19 | ||
|
|
76c63e8585 | ||
|
|
1fc9ae0c0d | ||
|
|
9b4865dceb | ||
|
|
83dbfadf20 | ||
|
|
8ac9707242 | ||
|
|
0fd9d35a5d | ||
|
|
289a3909fd | ||
|
|
5544bec231 | ||
|
|
eb81fbdd25 | ||
|
|
ffeebc6ea6 | ||
|
|
a2b8f2a00d | ||
|
|
045cf6cc65 | ||
|
|
483c16bcbb | ||
|
|
952c43073e | ||
|
|
9b5bb1678c | ||
|
|
9e858feeba | ||
|
|
e16b4fca69 | ||
|
|
06912584b0 | ||
|
|
d02efdb146 | ||
|
|
d9b4da3a8f | ||
|
|
a0fbd3ba8f | ||
|
|
169d51d5ba | ||
|
|
fe6ee093cb | ||
|
|
ea4c637842 | ||
|
|
ad9e19c102 | ||
|
|
b701479e87 | ||
|
|
89e46057a5 | ||
|
|
2c86cf1d6c | ||
|
|
80c5fc0ff6 | ||
|
|
cde564299c | ||
|
|
db6d823e0f | ||
|
|
59e30e93c5 | ||
|
|
9776b81b45 | ||
|
|
8aec59f32b | ||
|
|
6aef3fe0ac | ||
|
|
0dbf362f57 | ||
|
|
3d51f1f497 | ||
|
|
b41b3e218e | ||
|
|
77dfabc67f | ||
|
|
d022f944c5 | ||
|
|
cc8256b4cc | ||
|
|
916d6e3e38 | ||
|
|
5bb6fdf686 | ||
|
|
ec5e0e208c | ||
|
|
fc8eee58e7 | ||
|
|
61594d53fb | ||
|
|
795b1eb3fa | ||
|
|
9a23938180 | ||
|
|
a294a92e2f | ||
|
|
08fa3fa0a0 | ||
|
|
5ad44c780c | ||
|
|
e35766c7b8 | ||
|
|
be340f2adc | ||
|
|
0cc5968b12 | ||
|
|
fe340ac620 | ||
|
|
4568be8ff4 | ||
|
|
886be660f6 | ||
|
|
2c62fe71a3 | ||
|
|
0c3046b9c7 | ||
|
|
8778d82576 | ||
|
|
fb347c37ac | ||
|
|
e6678435bd | ||
|
|
a0476d1bf2 | ||
|
|
d674d05083 | ||
|
|
fa8f49086c | ||
|
|
7f5228d934 | ||
|
|
917b33f17d | ||
|
|
89c9f20d16 | ||
|
|
b67275831b | ||
|
|
a84d8de0e6 | ||
|
|
d30d444bc7 | ||
|
|
8db7f003ee | ||
|
|
32a5fac5ef | ||
|
|
77f73d3e05 | ||
|
|
3cf37d17b1 | ||
|
|
251a2a92b0 | ||
|
|
83e9817415 | ||
|
|
f3a05da1eb | ||
|
|
9b38a1fc3d | ||
|
|
35cdfa5922 | ||
|
|
8c29d12e65 | ||
|
|
de33f632e1 | ||
|
|
e6dfc83330 | ||
|
|
f557a059ab | ||
|
|
be433c00cb | ||
|
|
5bf824220e | ||
|
|
cd4698d92f | ||
|
|
8531d399f3 | ||
|
|
bcc3ea87c3 | ||
|
|
b5b758dc87 | ||
|
|
c05b3a5c8b | ||
|
|
73426459ef | ||
|
|
0c17288ece | ||
|
|
ec6fae5822 | ||
|
|
df8fa25935 | ||
|
|
32e2a4d96d | ||
|
|
46b41a4a04 | ||
|
|
6e5f2635d1 | ||
|
|
5536d3b89b | ||
|
|
30aa5f414f | ||
|
|
94fc6ab840 | ||
|
|
69b1d95ab5 | ||
|
|
2b9cc78e55 | ||
|
|
9b0853be01 | ||
|
|
d4d1d2d272 | ||
|
|
a4b1978098 | ||
|
|
aeaf9340d3 | ||
|
|
a29c323556 | ||
|
|
60c280b454 | ||
|
|
b03c8b3958 | ||
|
|
9b7f457aa5 | ||
|
|
879dfab882 | ||
|
|
4ad3d3ac54 | ||
|
|
c4f75916a4 | ||
|
|
7d7bd3a44c | ||
|
|
1a1c9fd345 | ||
|
|
93ade5afe6 | ||
|
|
a0cacdfbef | ||
|
|
e400f62f04 | ||
|
|
aaea3cb3a3 | ||
|
|
5ace021e41 | ||
|
|
22542a81b6 | ||
|
|
f3eb560d61 | ||
|
|
69f7c878b9 | ||
|
|
39a91034d9 | ||
|
|
6500f67b5e | ||
|
|
e58a76c488 | ||
|
|
6c1bc842f0 | ||
|
|
19a5e3f57e | ||
|
|
eff18a22e8 | ||
|
|
2f5cbc80e9 | ||
|
|
dfd1abeea5 | ||
|
|
7889676ac7 | ||
|
|
6f0fb5430d | ||
|
|
1fcf25d060 | ||
|
|
6552100775 | ||
|
|
658e8252b1 | ||
|
|
87429c076f | ||
|
|
5dfe2f02e7 | ||
|
|
514309f477 | ||
|
|
2357052c95 | ||
|
|
2dd4edfae6 | ||
|
|
c343cdf69f | ||
|
|
53702a8154 | ||
|
|
776ccf8d55 | ||
|
|
d2eb15c776 | ||
|
|
f4d69baa7d | ||
|
|
5ee4208c32 | ||
|
|
70488f8262 | ||
|
|
0539dea4ef | ||
|
|
a5e837076b | ||
|
|
44feac6e64 | ||
|
|
3a9d169d46 | ||
|
|
796a8cb3f9 | ||
|
|
cda27314b7 | ||
|
|
b9b501bd00 | ||
|
|
ee3c6274ad | ||
|
|
329f4487ee | ||
|
|
7ca93af620 | ||
|
|
5387019f5f | ||
|
|
168f3beec8 | ||
|
|
c7a99af820 | ||
|
|
1401249d77 | ||
|
|
9a198217b8 | ||
|
|
47b260711a | ||
|
|
7043ba1fee | ||
|
|
a7f3565064 | ||
|
|
735aa1d746 | ||
|
|
615a9adacc | ||
|
|
c5cbc8af20 | ||
|
|
532702f7fb | ||
|
|
3f7fb99f58 | ||
|
|
4ae7b31a48 | ||
|
|
03eac96557 | ||
|
|
61a7a8e352 | ||
|
|
26ba329a0c | ||
|
|
ce84370a03 | ||
|
|
90acbc1ca1 |
2
.github/FUNDING.yml
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
github: [jankae]
|
||||
|
||||
13
.github/ISSUE_TEMPLATE/bugreport.yaml
vendored
|
|
@ -48,10 +48,11 @@ body:
|
|||
validations:
|
||||
required: true
|
||||
|
||||
- type: checkboxes
|
||||
- type: markdown
|
||||
attributes:
|
||||
label: Confirming that you haven´t forgot to include configuration files (if applicable)
|
||||
options:
|
||||
- label: Setup file
|
||||
- label: Calibration file
|
||||
- label: Touchstone file of measurements
|
||||
value: |
|
||||
Please attach the following files if applicable:
|
||||
- Setup file
|
||||
- File->Save Setup
|
||||
- If available, make sure that "include datapoints" under "Window->Preferences->Debug->Trace saving" is enabled
|
||||
- Calibration file
|
||||
|
|
|
|||
152
.github/workflows/Build.yml
vendored
|
|
@ -10,18 +10,19 @@ on:
|
|||
|
||||
jobs:
|
||||
PC_Application_Ubuntu:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libusb-1.0-0-dev qt5-default qt5-qmake qtbase5-dev
|
||||
sudo apt-get install -y libusb-1.0-0-dev qt6-tools-dev qt6-base-dev libqt6svg6-dev libgl-dev
|
||||
qtchooser -install qt6 $(which qmake6)
|
||||
|
||||
- name: Get build timestamp
|
||||
id: id_date
|
||||
run: echo "::set-output name=timestamp::$(date +%Y-%m-%d-%H-%M-%S)"
|
||||
run: echo "timestamp=$(date +%Y-%m-%d-%H-%M-%S)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Get app version
|
||||
id: id_version
|
||||
|
|
@ -30,11 +31,12 @@ jobs:
|
|||
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_patch=`grep -oP '(?<=FW_PATCH=)[0-9]+' LibreVNA-GUI.pro`
|
||||
echo "::set-output name=app_version::v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}"
|
||||
echo "app_version=v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
cd Software/PC_Application/LibreVNA-GUI
|
||||
export QT_SELECT=qt6
|
||||
qmake LibreVNA-GUI.pro
|
||||
make -j9
|
||||
shell: bash
|
||||
|
|
@ -42,35 +44,73 @@ jobs:
|
|||
- name: Upload artifact
|
||||
env:
|
||||
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: LibreVNA-GUI-Ubuntu-${{env.LIBREVNA_VERSION}}
|
||||
path: Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI
|
||||
|
||||
PC_Application_Windows:
|
||||
runs-on: windows-2019
|
||||
PC_Application_RPi5:
|
||||
runs-on: RPi-HIL
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libusb-1.0-0-dev qt6-tools-dev qt6-base-dev libqt6svg6-dev
|
||||
|
||||
- name: Get build timestamp
|
||||
id: id_date
|
||||
run: echo "timestamp=$(date +%Y-%m-%d-%H-%M-%S)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Get app version
|
||||
id: id_version
|
||||
run: |
|
||||
cd Software/PC_Application/LibreVNA-GUI
|
||||
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_patch=`grep -oP '(?<=FW_PATCH=)[0-9]+' LibreVNA-GUI.pro`
|
||||
echo "app_version=v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
cd Software/PC_Application/LibreVNA-GUI
|
||||
qmake6 LibreVNA-GUI.pro
|
||||
make -j9
|
||||
shell: bash
|
||||
|
||||
- name: Upload artifact
|
||||
env:
|
||||
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: LibreVNA-GUI-RPi5-${{env.LIBREVNA_VERSION}}
|
||||
path: Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI
|
||||
|
||||
PC_Application_Windows:
|
||||
runs-on: windows-2022
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: msys2/setup-msys2@v2
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v2
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
version: '5.15.1'
|
||||
arch: 'win64_mingw81'
|
||||
version: '6.2.4'
|
||||
arch: 'win64_mingw'
|
||||
|
||||
- name: Download libusb
|
||||
run: |
|
||||
curl -o libusb.7z -L https://github.com/libusb/libusb/releases/download/v1.0.23/libusb-1.0.23.7z
|
||||
curl -o libusb.7z -L https://github.com/libusb/libusb/releases/download/v1.0.25/libusb-1.0.25.7z
|
||||
7z x libusb.7z -r -olibusb
|
||||
Xcopy /E /I /Y libusb\include ..\Qt\5.15.1\mingw81_64\include
|
||||
Xcopy /E /I /Y libusb\MinGW64\static Software\PC_Application\LibreVNA-GUI
|
||||
Xcopy /E /I /Y libusb\include %QT_ROOT_DIR%\include
|
||||
Xcopy /E /I /Y libusb\MinGW64\static\libusb-1.0.a Software\PC_Application\LibreVNA-GUI
|
||||
shell: cmd
|
||||
|
||||
- name: Get build timestamp
|
||||
shell: msys2 {0}
|
||||
id: id_date
|
||||
run: echo "::set-output name=timestamp::$(date +%Y-%m-%d-%H-%M-%S)"
|
||||
run: echo "timestamp=$(date +%Y-%m-%d-%H-%M-%S)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Get app version
|
||||
id: id_version
|
||||
|
|
@ -80,7 +120,7 @@ jobs:
|
|||
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_patch=`grep -oP '(?<=FW_PATCH=)[0-9]+' LibreVNA-GUI.pro`
|
||||
echo "::set-output name=app_version::v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}"
|
||||
echo "app_version=v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
|
|
@ -94,14 +134,13 @@ jobs:
|
|||
cd Software/PC_Application/LibreVNA-GUI/release
|
||||
del *.o *.cpp
|
||||
windeployqt.exe .
|
||||
copy ..\..\..\..\..\Qt\5.15.1\mingw81_64\bin\libwinpthread-1.dll .
|
||||
copy ..\..\..\..\..\Qt\5.15.1\mingw81_64\bin\libgcc_s_seh-1.dll .
|
||||
copy "..\..\..\..\..\Qt\5.15.1\mingw81_64\bin\libstdc++-6.dll" .
|
||||
copy ..\..\..\..\..\Qt\5.15.1\mingw81_64\bin\Qt5OpenGL.dll .
|
||||
copy %QT_ROOT_DIR%\bin\libwinpthread-1.dll .
|
||||
copy %QT_ROOT_DIR%\bin\libgcc_s_seh-1.dll .
|
||||
copy %QT_ROOT_DIR%\bin\Qt6OpenGL.dll .
|
||||
shell: cmd
|
||||
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
env:
|
||||
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
||||
with:
|
||||
|
|
@ -109,21 +148,21 @@ jobs:
|
|||
path: Software/PC_Application/LibreVNA-GUI/release
|
||||
|
||||
PC_Application_OSX:
|
||||
runs-on: macos-10.15
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
brew install qt@5 libusb
|
||||
brew install qt@6 pcre
|
||||
|
||||
- name: Set Environment
|
||||
run: |
|
||||
echo "/usr/local/opt/qt@5/bin" >> $GITHUB_PATH
|
||||
echo "/usr/local/opt/qt@6/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Get build timestamp
|
||||
id: id_date
|
||||
run: echo "::set-output name=timestamp::$(date +%Y-%m-%d-%H-%M-%S)"
|
||||
run: echo "timestamp=$(date +%Y-%m-%d-%H-%M-%S)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Get app version
|
||||
id: id_version
|
||||
|
|
@ -132,7 +171,7 @@ jobs:
|
|||
fw_major=`pcregrep -o '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_minor=`pcregrep -o '(?<=FW_MINOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_patch=`pcregrep -o '(?<=FW_PATCH=)[0-9]+' LibreVNA-GUI.pro`
|
||||
echo "::set-output name=app_version::v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}"
|
||||
echo "app_version=v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
|
|
@ -146,15 +185,58 @@ jobs:
|
|||
- name: Upload artifact
|
||||
env:
|
||||
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: LibreVNA-GUI-OSX-${{env.LIBREVNA_VERSION}}
|
||||
name: LibreVNA-GUI-OSX-latest-${{env.LIBREVNA_VERSION}}
|
||||
path: Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI.zip
|
||||
|
||||
PC_Application_OSX_13:
|
||||
runs-on: macos-13
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
brew install qt@6 pcre
|
||||
|
||||
- name: Set Environment
|
||||
run: |
|
||||
echo "/usr/local/opt/qt@6/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Get build timestamp
|
||||
id: id_date
|
||||
run: echo "timestamp=$(date +%Y-%m-%d-%H-%M-%S)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Get app version
|
||||
id: id_version
|
||||
run: |
|
||||
cd Software/PC_Application/LibreVNA-GUI
|
||||
fw_major=`pcregrep -o '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_minor=`pcregrep -o '(?<=FW_MINOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_patch=`pcregrep -o '(?<=FW_PATCH=)[0-9]+' LibreVNA-GUI.pro`
|
||||
echo "app_version=v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
cd Software/PC_Application/LibreVNA-GUI
|
||||
qmake LibreVNA-GUI.pro
|
||||
make -j9
|
||||
macdeployqt LibreVNA-GUI.app
|
||||
zip -ry LibreVNA-GUI.zip LibreVNA-GUI.app
|
||||
shell: bash
|
||||
|
||||
- name: Upload artifact
|
||||
env:
|
||||
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: LibreVNA-GUI-OSX-13.7-${{env.LIBREVNA_VERSION}}
|
||||
path: Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI.zip
|
||||
|
||||
Embedded_Firmware:
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install toolchain
|
||||
run: |
|
||||
|
|
@ -162,7 +244,7 @@ jobs:
|
|||
|
||||
- name: Get build timestamp
|
||||
id: id_date
|
||||
run: echo "::set-output name=timestamp::$(date +%Y-%m-%d-%H-%M-%S)"
|
||||
run: echo "timestamp=$(date +%Y-%m-%d-%H-%M-%S)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Get app version
|
||||
id: id_version
|
||||
|
|
@ -172,7 +254,7 @@ jobs:
|
|||
fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' Makefile`
|
||||
fw_patch=`grep -oP '(?<=FW_PATCH=)[0-9]+' Makefile`
|
||||
hw_revision=`grep "DHW_REVISION=" Makefile | sed "s/-DHW_REVISION=\"'//" | sed "sr'\" [\]rr"`
|
||||
echo "::set-output name=app_version::hw-rev-$hw_revision-v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}"
|
||||
echo "app_version=hw-rev-$hw_revision-v$fw_major.$fw_minor.$fw_patch-${{steps.id_date.outputs.timestamp}}" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
|
|
@ -187,7 +269,7 @@ jobs:
|
|||
shell: bash
|
||||
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v4
|
||||
env:
|
||||
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
||||
with:
|
||||
|
|
|
|||
60
.github/workflows/HIL_Tests.yml
vendored
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
name: HIL_Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- HIL_actions
|
||||
|
||||
jobs:
|
||||
Get_Repository:
|
||||
runs-on: RPi-HIL
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
PC_Application_RPi5:
|
||||
runs-on: RPi-HIL
|
||||
needs: Get_Repository
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libusb-1.0-0-dev qt6-tools-dev qt6-base-dev qt6-svg-dev
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
cd Software/PC_Application/LibreVNA-GUI
|
||||
qmake6 LibreVNA-GUI.pro
|
||||
make -j9
|
||||
shell: bash
|
||||
|
||||
Embedded_Firmware:
|
||||
runs-on: RPi-HIL
|
||||
needs: Get_Repository
|
||||
steps:
|
||||
- name: Install toolchain
|
||||
run: |
|
||||
sudo apt-get install -y gcc-arm-none-eabi binutils-arm-none-eabi
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
cd Software/VNA_embedded
|
||||
make -j9
|
||||
cp build/VNA_embedded.elf ../../
|
||||
shell: bash
|
||||
|
||||
- name: Combine with FPGA bitstream
|
||||
run: |
|
||||
python3 AssembleFirmware.py
|
||||
shell: bash
|
||||
|
||||
HIL:
|
||||
runs-on: RPi-HIL
|
||||
needs: [PC_Application_RPi5, Embedded_Firmware]
|
||||
steps:
|
||||
- name: Run HIL tests
|
||||
run: |
|
||||
cd Software/Integrationtests
|
||||
export DISPLAY=:0
|
||||
python3 Integrationtest.py
|
||||
|
||||
137
.github/workflows/Release_tag_stable.yml
vendored
|
|
@ -8,16 +8,17 @@ on:
|
|||
jobs:
|
||||
|
||||
PC_Application_Ubuntu:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-22.04
|
||||
outputs:
|
||||
upload_url: ${{ steps.bump_release.outputs.upload_url }}
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libusb-1.0-0-dev qt5-default qt5-qmake qtbase5-dev zip
|
||||
sudo apt-get install -y libusb-1.0-0-dev qt6-tools-dev qt6-base-dev libqt6svg6-dev libgl-dev zip
|
||||
qtchooser -install qt6 $(which qmake6)
|
||||
|
||||
- name: Get app version
|
||||
id: id_version
|
||||
|
|
@ -26,11 +27,12 @@ jobs:
|
|||
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_patch=`grep -oP '(?<=FW_PATCH=)[0-9]+' LibreVNA-GUI.pro`
|
||||
echo "::set-output name=app_version::v$fw_major.$fw_minor.$fw_patch"
|
||||
echo "app_version=v$fw_major.$fw_minor.$fw_patch" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
cd Software/PC_Application/LibreVNA-GUI
|
||||
export QT_SELECT=qt6
|
||||
qmake LibreVNA-GUI.pro
|
||||
make -j9
|
||||
zip LibreVNA-GUI.zip LibreVNA-GUI
|
||||
|
|
@ -61,36 +63,75 @@ jobs:
|
|||
asset_name: LibreVNA-GUI-Ubuntu-${{env.LIBREVNA_VERSION}}.zip
|
||||
asset_content_type: application/tar+gzip
|
||||
|
||||
PC_Application_RPi5:
|
||||
needs: PC_Application_Ubuntu
|
||||
runs-on: RPi-HIL
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libusb-1.0-0-dev qt6-tools-dev qt6-base-dev qt6-svg-dev
|
||||
|
||||
- name: Get app version
|
||||
id: id_version
|
||||
run: |
|
||||
cd Software/PC_Application/LibreVNA-GUI
|
||||
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_patch=`grep -oP '(?<=FW_PATCH=)[0-9]+' LibreVNA-GUI.pro`
|
||||
echo "app_version=v$fw_major.$fw_minor.$fw_patch" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
cd Software/PC_Application/LibreVNA-GUI
|
||||
qmake6 LibreVNA-GUI.pro
|
||||
make -j9
|
||||
zip LibreVNA-GUI.zip LibreVNA-GUI
|
||||
shell: bash
|
||||
|
||||
- name: 'Upload release asset'
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ needs.PC_Application_Ubuntu.outputs.upload_url }}
|
||||
asset_path: ./Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI.zip
|
||||
asset_name: LibreVNA-GUI-RPi5-${{env.LIBREVNA_VERSION}}.zip
|
||||
asset_content_type: application/tar+gzip
|
||||
|
||||
PC_Application_Windows:
|
||||
needs: PC_Application_Ubuntu
|
||||
runs-on: windows-2019
|
||||
runs-on: windows-2022
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v4
|
||||
- uses: msys2/setup-msys2@v2
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v2
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
version: '5.15.1'
|
||||
arch: 'win64_mingw81'
|
||||
version: '6.2.4'
|
||||
arch: 'win64_mingw'
|
||||
|
||||
- name: Download libusb
|
||||
run: |
|
||||
curl -o libusb.7z -L https://github.com/libusb/libusb/releases/download/v1.0.23/libusb-1.0.23.7z
|
||||
curl -o libusb.7z -L https://github.com/libusb/libusb/releases/download/v1.0.25/libusb-1.0.25.7z
|
||||
7z x libusb.7z -r -olibusb
|
||||
Xcopy /E /I /Y libusb\include ..\Qt\5.15.1\mingw81_64\include
|
||||
Xcopy /E /I /Y libusb\MinGW64\static Software\PC_Application\LibreVNA-GUI
|
||||
Xcopy /E /I /Y libusb\include %QT_ROOT_DIR%\include
|
||||
Xcopy /E /I /Y libusb\MinGW64\static\libusb-1.0.a Software\PC_Application\LibreVNA-GUI
|
||||
shell: cmd
|
||||
|
||||
- name: Get app version
|
||||
id: id_version
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
cd Software/PC_Application
|
||||
cd Software/PC_Application/LibreVNA-GUI
|
||||
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_patch=`grep -oP '(?<=FW_PATCH=)[0-9]+' LibreVNA-GUI.pro`
|
||||
echo "::set-output name=app_version::v$fw_major.$fw_minor.$fw_patch"
|
||||
echo "app_version=v$fw_major.$fw_minor.$fw_patch" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
|
|
@ -104,10 +145,9 @@ jobs:
|
|||
cd Software/PC_Application/LibreVNA-GUI/release
|
||||
del *.o *.cpp
|
||||
windeployqt.exe .
|
||||
copy ..\..\..\..\..\Qt\5.15.1\mingw81_64\bin\libwinpthread-1.dll .
|
||||
copy ..\..\..\..\..\Qt\5.15.1\mingw81_64\bin\libgcc_s_seh-1.dll .
|
||||
copy "..\..\..\..\..\Qt\5.15.1\mingw81_64\bin\libstdc++-6.dll" .
|
||||
copy ..\..\..\..\..\Qt\5.15.1\mingw81_64\bin\Qt5OpenGL.dll .
|
||||
copy %QT_ROOT_DIR%\bin\libwinpthread-1.dll .
|
||||
copy %QT_ROOT_DIR%\bin\libgcc_s_seh-1.dll .
|
||||
copy %QT_ROOT_DIR%\bin\Qt6OpenGL.dll .
|
||||
shell: cmd
|
||||
|
||||
- name: Zip app
|
||||
|
|
@ -130,17 +170,17 @@ jobs:
|
|||
|
||||
PC_Application_OSX:
|
||||
needs: PC_Application_Ubuntu
|
||||
runs-on: macos-10.15
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
brew install qt@5 libusb
|
||||
brew install qt@6 pcre
|
||||
|
||||
- name: Set Environment
|
||||
run: |
|
||||
echo "/usr/local/opt/qt@5/bin" >> $GITHUB_PATH
|
||||
echo "/usr/local/opt/qt@6/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Get app version
|
||||
id: id_version
|
||||
|
|
@ -149,7 +189,7 @@ jobs:
|
|||
fw_major=`pcregrep -o '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_minor=`pcregrep -o '(?<=FW_MINOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_patch=`pcregrep -o '(?<=FW_PATCH=)[0-9]+' LibreVNA-GUI.pro`
|
||||
echo "::set-output name=app_version::v$fw_major.$fw_minor.$fw_patch"
|
||||
echo "app_version=v$fw_major.$fw_minor.$fw_patch" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
|
|
@ -168,14 +208,57 @@ jobs:
|
|||
with:
|
||||
upload_url: ${{ needs.PC_Application_Ubuntu.outputs.upload_url }}
|
||||
asset_path: ./Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI.zip
|
||||
asset_name: LibreVNA-GUI-OSX-${{env.LIBREVNA_VERSION}}.zip
|
||||
asset_name: LibreVNA-GUI-OSX-latest-${{env.LIBREVNA_VERSION}}.zip
|
||||
asset_content_type: application/tar+gzip
|
||||
|
||||
PC_Application_OSX_13:
|
||||
needs: PC_Application_Ubuntu
|
||||
runs-on: macos-13
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
brew install qt@6 pcre
|
||||
|
||||
- name: Set Environment
|
||||
run: |
|
||||
echo "/usr/local/opt/qt@6/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Get app version
|
||||
id: id_version
|
||||
run: |
|
||||
cd Software/PC_Application/LibreVNA-GUI
|
||||
fw_major=`pcregrep -o '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_minor=`pcregrep -o '(?<=FW_MINOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||
fw_patch=`pcregrep -o '(?<=FW_PATCH=)[0-9]+' LibreVNA-GUI.pro`
|
||||
echo "app_version=v$fw_major.$fw_minor.$fw_patch" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
cd Software/PC_Application/LibreVNA-GUI
|
||||
qmake LibreVNA-GUI.pro
|
||||
make -j9
|
||||
macdeployqt LibreVNA-GUI.app
|
||||
zip -ry LibreVNA-GUI.zip LibreVNA-GUI.app
|
||||
shell: bash
|
||||
|
||||
- name: 'Upload release asset'
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ needs.PC_Application_Ubuntu.outputs.upload_url }}
|
||||
asset_path: ./Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI.zip
|
||||
asset_name: LibreVNA-GUI-OSX-13.7-${{env.LIBREVNA_VERSION}}.zip
|
||||
asset_content_type: application/tar+gzip
|
||||
|
||||
Embedded_Firmware:
|
||||
needs: PC_Application_Ubuntu
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install toolchain
|
||||
run: |
|
||||
|
|
@ -189,7 +272,7 @@ jobs:
|
|||
fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' Makefile`
|
||||
fw_patch=`grep -oP '(?<=FW_PATCH=)[0-9]+' Makefile`
|
||||
hw_revision=`grep "DHW_REVISION=" Makefile | sed "s/-DHW_REVISION=\"'//" | sed "sr'\" [\]rr"`
|
||||
echo "::set-output name=app_version::hw-rev-$hw_revision-v$fw_major.$fw_minor.$fw_patch"
|
||||
echo "app_version=hw-rev-$hw_revision-v$fw_major.$fw_minor.$fw_patch" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Build application
|
||||
run: |
|
||||
|
|
|
|||
8
.github/workflows/Test.yml
vendored
|
|
@ -1,4 +1,4 @@
|
|||
name: Build
|
||||
name: Unit_Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
|
|
@ -10,18 +10,20 @@ on:
|
|||
|
||||
jobs:
|
||||
Tests:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libusb-1.0-0-dev qt5-default qt5-qmake qtbase5-dev
|
||||
sudo apt-get install -y libusb-1.0-0-dev qt6-tools-dev qt6-base-dev libqt6svg6-dev libgl-dev
|
||||
qtchooser -install qt6 $(which qmake6)
|
||||
|
||||
- name: Build Tests
|
||||
run: |
|
||||
cd Software/PC_Application/LibreVNA-Test
|
||||
export QT_SELECT=qt6
|
||||
qmake LibreVNA-Test.pro
|
||||
make -j9
|
||||
shell: bash
|
||||
|
|
|
|||
150
CHANGELOG.md
|
|
@ -1,5 +1,155 @@
|
|||
# Changelog
|
||||
|
||||
## v1.6.4
|
||||
|
||||
Critical bugfix for the embedded firmware:
|
||||
|
||||
- Fix SPI flash timing, see #315
|
||||
|
||||
Minor improvement for the GUI:
|
||||
|
||||
- Option to add titles to graphs
|
||||
- Show trace names even when only enabled on secondary Y axis
|
||||
- Add x axis variable to the available variables for formulas in "from math" traces
|
||||
|
||||
|
||||
|
||||
## v1.6.3
|
||||
|
||||
Bugfixes and quality of life improvements
|
||||
|
||||
- Windows and macOS: add icon to GUI application
|
||||
- From math traces:
|
||||
- Validate formula immediately and show error messages
|
||||
- Bugfix: do not reset variable names when opening trace edit dialog again
|
||||
- Fix crash when combining with de-embedding
|
||||
- Calibration:
|
||||
- Interpolate points using mag/phase instead of real/imag (minor improvements in accuracy)
|
||||
- Update widget when changing span
|
||||
- Fix race condition when aborting measurement
|
||||
- Reset LibreCAL port settings when aborting measurement
|
||||
- Manual improvement: typos and wording
|
||||
- Increase USB buffer timeout during sweep (should prevent disconnect when CPU is very busy)
|
||||
- Include actual serial of connected device in SCPI \*IDN? response
|
||||
- Allow group delay plot for reflection traces
|
||||
- Configurable default Y axis limits per Y axis type
|
||||
- Fix streaming server output for zero span sweeps
|
||||
- Synchronization improvements for compound device
|
||||
- Allow name changes for existing modes
|
||||
|
||||
## v1.6.2
|
||||
|
||||
Mostly bugfixes with only minor new features
|
||||
|
||||
- New features:
|
||||
- New SCPI commands:
|
||||
- Temperatures readout
|
||||
- Complete control over manual control via SCPI
|
||||
- Padding option for TDR/DFT to increase resolution
|
||||
- Support for dwell time (adjustable delay before each point in the sweep)
|
||||
- Bugfixes:
|
||||
- Fix crash when deleting traces with TDR/DFT math
|
||||
- Spectrum analyzer: Improve tracking generator frequency accuracy
|
||||
- Fix swapped LO and Source unlock LEDs
|
||||
- Reduce amount of mode switches when starting and loading setups (faster loading time)
|
||||
- Use correct units on spectrum analyzer graphs (dBm instead of dB)
|
||||
- Fix Touchstone export file ending
|
||||
- Update eye diagram when changing settings while the trace data does not change
|
||||
- Keep eye diagram trace visible when other trace is deleted
|
||||
- Resolve math references when duplicating "from math" traces
|
||||
- Update LibreCAL API, detect LibreCALs with bad factory coefficients
|
||||
- Fix impedance renormalization (general formulas for parameter conversions)
|
||||
- Fix rare and random phase reversals of S parameter measurements
|
||||
|
||||
## v1.6.1
|
||||
|
||||
Mostly bugfixes with only minor new features
|
||||
|
||||
- New features:
|
||||
- New SCPI commands:
|
||||
- switch between linear/log sweeps in VNA mode
|
||||
- delete traces
|
||||
- Option to align axis ticks for left and right Y-axes
|
||||
- Import/export options in file menu
|
||||
- User-selectable handling of NaN values for limit checking
|
||||
- drop files on trace list to import them
|
||||
|
||||
- Bugfixes:
|
||||
- center TDR output values at zero (fixes impedance calculations in cases where there is a reflection from before the calibration plane)
|
||||
- fix calibration calculation when non-required S parameters are not available
|
||||
- improve LibreCAL coefficient extraction
|
||||
- use native OS dialogs for opening/saving files
|
||||
- future Qt version fix: prevent crash after taking calibration measurement
|
||||
- SCPI command handling improved
|
||||
- fix menus after loading setup files in certain scenarios
|
||||
|
||||
## v1.6.0
|
||||
|
||||
This update contains API breaking changes to the SCPI server. This was necessary because the previous implementation did not follow the standard completely. If you were talking to the SCPI server directly yourself, you will need to make the required changes. If you are using the provided libreVNA.py class, you just need to update that file.
|
||||
|
||||
- New featues:
|
||||
- New SCPI command: read/write preferences
|
||||
- New API: option to stream live trace data
|
||||
|
||||
- Bugfixes and improvements:
|
||||
- Keep de-embedding active when changing settings
|
||||
- Improvements to trace averaging
|
||||
- adjust SCPI API to conform better with the standard:
|
||||
- new required commands RST, CLS, ESE, ESR, OPC and WAI
|
||||
- no responses to commands, errors are reported through status registers instead
|
||||
- TDR updates happen during a sweep not just afterwards (with configurable update rate)
|
||||
- Additional sanity checks when loading calibration files
|
||||
|
||||
## v1.5.1
|
||||
|
||||
Mostly bugfixes with only minor new features
|
||||
|
||||
- New features:
|
||||
- Z0 of through standard now adjustable
|
||||
- Option to automatically adjust the span to the active calibration
|
||||
- Bugfixes:
|
||||
- Make De-embedding menu visible on MacOS
|
||||
- Detection of handling of LibreCAL in the automatic calibration dialog
|
||||
- Allow updates of devices with older firmwares (a matching older GUI version had to be used previously)
|
||||
- Fix port excitation when not all S-parameters are measured
|
||||
- Do not use DFT in spectrum analyzer when in zero span mode
|
||||
- Readback of certain GUI values on Windows now correct (was stuck on 0 before)
|
||||
- Prevent crash when disconnecting the device while a dialog was open
|
||||
- Prevent occasional crash at the end of calibration measurements
|
||||
- Fix spikes in sweep when a frequency calibration is set
|
||||
- Improve sample timing between ADC and FPGA (resulted in very noisy traces on some devices)
|
||||
|
||||
## v1.5.0
|
||||
|
||||
- New features:
|
||||
- Further abstraction from the LibreVNA hardware. The GUI now supports VNAs with up to 8 ports
|
||||
- Capsulation of communication to the hardware inside of the DeviceDriver class. This simplifies the integration of drivers for other equipment
|
||||
- Experimental drivers for Siglent SSA3000X and SNA5000A series devices as examples
|
||||
- Allow cascading of muliple LibreVNAs, see Preferences->Device Drivers->LibreVNA/Compound. You need to configure a compound device first (consisting of up to 4 LibreVNAs). Afterwards, you are able to use them as one larger, virtual VNA with more ports (or more physical separation between the ports). Measurements within one physical LibreVNA will contain phase information, measurements between different LibreVNAs have their phase set to zero
|
||||
- Support for calibrating with sliding loads
|
||||
- New graph type: Eye Diagram
|
||||
- Restrict markers to a certain frequency range
|
||||
- Switched to a dedicated USB VID/PID thanks to pid.codes
|
||||
- Switched to Qt6
|
||||
- Easier
|
||||
|
||||
- API-breaking changes: Unfortunately, some major rework was required to make the GUI compatible to devices with more than two ports. In some areas, the file storage format and the SCPI API had to change. Almost all changes are within the calibration system.
|
||||
- Calibration kit file format changed (old calibration kits can be imported)
|
||||
- Calibration file format changed (old calibration can be imported)
|
||||
- Calibration API changed significantly, see Programming Guide
|
||||
|
||||
- Lots of bugfixes, for example:
|
||||
- Fix X-label clipping on graphs
|
||||
- Prevent activation of a calibration without defined calibration standards
|
||||
- Fix isolation measurements for calibration
|
||||
- Valgrind issues fixed (mostly variable initializations)
|
||||
- made USB communication more robust
|
||||
- PLL locking issue fixed
|
||||
- no more disappearing device log
|
||||
|
||||
## v1.4.1
|
||||
- Bugfix: Configure voltage regulator for correct voltage at startup
|
||||
|
||||
## v1.4.0
|
||||
|
||||
- New features:
|
||||
|
|
|
|||
|
|
@ -12,17 +12,17 @@ Creating all the different parts from the source code requires quite a few tools
|
|||
## Building the PC application:
|
||||
* Install the required tools (Qt and libusb-1.0):
|
||||
```
|
||||
sudo apt-get install qt5-default qt5-qmake qtbase5-dev libusb-1.0-0-dev
|
||||
sudo apt-get install libusb-1.0-0-dev qt6-tools-dev qt6-base-dev
|
||||
```
|
||||
* Build the application:
|
||||
* either:
|
||||
```
|
||||
cd Software/PC_Application
|
||||
qmake
|
||||
cd Software/PC_Application/LibreVNA-GUI
|
||||
qmake6
|
||||
make
|
||||
```
|
||||
* or:
|
||||
* Open Software/PC_Application/Application.pro with Qt Creator
|
||||
* Open Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI.pro with Qt Creator
|
||||
* Build the application with Qt Creator
|
||||
|
||||
## Building the MCU firmware:
|
||||
|
|
|
|||
BIN
Documentation/DeveloperInfo/Device_protocol_v13.pdf
Normal file
1392
Documentation/DeveloperInfo/Device_protocol_v13.tex
Normal file
27
Documentation/DeveloperInfo/DownloadActionBuilds.md
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
# Download automatically build binaries
|
||||
|
||||
The Github actions are set up in such a way that binary files are created for each commit on the master branch. Feel free to try them out if you want the latest features but be prepared to find some unfinished things in them as well.
|
||||
|
||||
## Finding the binaries
|
||||
|
||||
1. Switch to the `Actions` tab in the repository:
|
||||
|
||||

|
||||
|
||||
2. Each commit will trigger two workflow runs, one for the binaries and one for some automated tests. Pick a commit and chose the workflow run with the higher build number:
|
||||
|
||||

|
||||
|
||||
4. The next window should look like this:
|
||||
|
||||

|
||||
|
||||
If it looks like this instead, you have picked the test workflow run (which does not contain any binaries):
|
||||
|
||||

|
||||
|
||||
5. Scroll down to find the binaries:
|
||||
|
||||

|
||||
|
||||
6. Click on an artifact to download it. If that doesn't seem to work, check that you are logged in on Github (required for the download)
|
||||
|
|
@ -13,6 +13,7 @@
|
|||
{geometry}
|
||||
\usepackage{tikz}
|
||||
\usepackage{siunitx}
|
||||
\usepackage{minibox}
|
||||
\DeclareSIUnit{\belmilliwatt}{Bm}
|
||||
\DeclareSIUnit{\dBm}{\deci\belmilliwatt}
|
||||
|
||||
|
|
@ -534,6 +535,26 @@ $$ f_{firstBin} = \frac{SR_{ADC} * DFT\_FIRST\_BIN}{2^{16}}$$
|
|||
$$ \Delta f = \frac{SR_{ADC} * DFT\_FREQ\_SPACING}{2^{24}}$$
|
||||
\end{itemize}
|
||||
|
||||
\subsection{SETTLING\_TIME: 0x14}
|
||||
\begin{center}
|
||||
\begin{tikzpicture}
|
||||
\bitrect{16}{16-\bit}
|
||||
\rwbits{0}{16}{SETTLING\_TIME[15:0]}
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
\begin{itemize}
|
||||
\item \textbf{SETTLING\_TIME[19:0]:} This value determines the time delay between applying the stimulus signal and the beginning of the ADC sampling.
|
||||
$$ t_{delay} = \frac{1}{\SI{102.4}{\mega\hertz}} SETTLING\_TIME $$
|
||||
\end{itemize}
|
||||
\subsection{SETTLING\_TIME: 0x15}
|
||||
\begin{center}
|
||||
\begin{tikzpicture}
|
||||
\bitrect{16}{16-\bit}
|
||||
\robits{0}{12}{reserved}
|
||||
\rwbits{12}{4}{SETTLING\_TIME[19:16]}
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
|
||||
\section{SweepConfig}
|
||||
\label{sweepconfig}
|
||||
The SweepConfig contains data for the source and LO1 PLL as well as the attenuator and source filter. Each point in the sweep, needs a valid SweepConfig before the sweep is started.
|
||||
|
|
@ -542,7 +563,9 @@ The SweepConfig contains data for the source and LO1 PLL as well as the attenuat
|
|||
\begin{tikzpicture}
|
||||
\bitrect{16}{96-\bit}
|
||||
\rwbits{0}{1}{HS}
|
||||
\rwbits{1}{2}{SettlingTime}
|
||||
%\rwbits{1}{2}{SettlingTime}
|
||||
\rwbits{1}{1}{\tiny LO N[6]}
|
||||
\rwbits{2}{1}{\minibox{\tiny Source\\N[6]}}
|
||||
\rwbits{3}{3}{Samples}
|
||||
\rwbits{6}{2}{SourceFilter}
|
||||
\rwbits{8}{8}{LO M[11:4]}
|
||||
|
|
@ -580,17 +603,17 @@ The SweepConfig contains data for the source and LO1 PLL as well as the attenuat
|
|||
\end{center}
|
||||
\begin{itemize}
|
||||
\item \textbf{HS: Halt sweep.} If set, settling and sampling of this sweep point will be postponed until the sweep resume command is issued.
|
||||
\item \textbf{SettlingTime:} Amount of time between locking of PLLs and beginning of ADC sampling
|
||||
\begin{center}
|
||||
\begin{tabular}{ c|c }
|
||||
Setting & Time\\
|
||||
\hline
|
||||
00 & \SI{20}{\micro\second}\\
|
||||
01 & \SI{60}{\micro\second}\\
|
||||
10 & \SI{180}{\micro\second}\\
|
||||
11 & \SI{540}{\micro\second}\\
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
%\item \textbf{SettlingTime:} Amount of time between locking of PLLs and beginning of ADC sampling
|
||||
%\begin{center}
|
||||
%\begin{tabular}{ c|c }
|
||||
%Setting & Time\\
|
||||
%\hline
|
||||
%00 & \SI{20}{\micro\second}\\
|
||||
%01 & \SI{60}{\micro\second}\\
|
||||
%10 & \SI{180}{\micro\second}\\
|
||||
%11 & \SI{540}{\micro\second}\\
|
||||
%\end{tabular}
|
||||
%\end{center}
|
||||
\item \textbf{Samples:} Number of ADC samples to take
|
||||
\begin{center}
|
||||
\begin{tabular}{ c|c|c }
|
||||
|
|
|
|||
BIN
Documentation/DeveloperInfo/Screenshots/Binaries1.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
Documentation/DeveloperInfo/Screenshots/Binaries2.png
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
Documentation/DeveloperInfo/Screenshots/Binaries3.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
Documentation/DeveloperInfo/Screenshots/Binaries4.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
Documentation/DeveloperInfo/Screenshots/Binaries5.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
Documentation/DeveloperInfo/USB_protocol_v12.pdf
Normal file
1034
Documentation/DeveloperInfo/USB_protocol_v12.tex
Normal file
BIN
Documentation/Pictures/RevisionB6LBottom.JPG
Normal file
|
After Width: | Height: | Size: 509 KiB |
BIN
Documentation/Pictures/RevisionB6LTop.JPG
Normal file
|
After Width: | Height: | Size: 518 KiB |
BIN
Documentation/Pictures/ShieldingBottom.JPG
Normal file
|
After Width: | Height: | Size: 255 KiB |
BIN
Documentation/Pictures/ShieldingCloseup.JPG
Normal file
|
After Width: | Height: | Size: 290 KiB |
BIN
Documentation/Pictures/ShieldingTop.JPG
Normal file
|
After Width: | Height: | Size: 293 KiB |
|
|
@ -123,6 +123,7 @@
|
|||
\usepackage{xifthen}
|
||||
\newcommand{\vna}{LibreVNA}
|
||||
\newcommand{\gui}{\vna{}-GUI}
|
||||
\newcommand{\subsubsubsection}[1]{\paragraph{#1}\mbox{}\\\\}
|
||||
|
||||
\newcommand{\screenshot}[2]{\begin{center}
|
||||
\includegraphics[width=#1\textwidth]{Screenshots/#2}
|
||||
|
|
@ -153,7 +154,8 @@
|
|||
\begin{document}
|
||||
\maketitle
|
||||
|
||||
\setcounter{tocdepth}{3}
|
||||
\setcounter{tocdepth}{4}
|
||||
\setcounter{secnumdepth}{4}
|
||||
\tableofcontents
|
||||
|
||||
\clearpage
|
||||
|
|
@ -177,42 +179,72 @@ The syntax follows the usual SCPI rules:
|
|||
\item All commands are case insensitive (implicitly converted to uppercase before evaluated)
|
||||
\item The command tree is organized in branches, separated by a colon:
|
||||
\begin{lstlisting}
|
||||
:VNA:TRACE:LIST?
|
||||
VNA:TRACE:LIST?
|
||||
\end{lstlisting}
|
||||
\item Multiple commands can be concatenated in one line using a semicolon:
|
||||
\begin{lstlisting}
|
||||
:DEVice:CONNECT;:DEVice:INFo:FWRevision?
|
||||
DEVice:CONNECT;:DEVice:INFo:FWRevision?
|
||||
\end{lstlisting}
|
||||
\item If a command starts with a colon it is evaluated from the root branch, otherwise the last used branch is assumed:
|
||||
\item If a subsequent command starts with a colon it is evaluated from the root branch, otherwise the last used branch is assumed:
|
||||
\begin{lstlisting}
|
||||
:VNA:FREQuency:START 1000000
|
||||
STOP 2000000 #No colon, VNA:FREQuency branch was used before
|
||||
VNA:FREQuency:START 1000000;STOP 2000000 #No colon, VNA:FREQuency branch was used before
|
||||
\end{lstlisting}
|
||||
\item Branches and commands can be abbreviated by using only the uppercase part of their name, the following commands are identical:
|
||||
\begin{lstlisting}
|
||||
:DEVice:INFo:LIMits:MINFrequency?
|
||||
:DEV:INF:LIM:MINF?
|
||||
DEVice:INFo:LIMits:MINFrequency?
|
||||
DEV:INF:LIM:MINF?
|
||||
\end{lstlisting}
|
||||
\item Every command generates a (possibly empty) response, terminated with a newline character.
|
||||
\item Every query generates a response, terminated with a newline character (exceptions exist for a few queries which return more than one line)
|
||||
\item Some commands require additional arguments that have to be passed after the command (separated by spaces):
|
||||
\begin{lstlisting}
|
||||
:DEV:REF:OUT 10
|
||||
DEV:REF:OUT 10
|
||||
\end{lstlisting}
|
||||
\item Two types of commands are available:
|
||||
\begin{itemize}
|
||||
\item \textbf{Events} change a setting or trigger an action. They usually have an empty response (unless there was an error).
|
||||
\item \textbf{Events} change a setting or trigger an action. They have no response
|
||||
\item \textbf{Queries} request information. They end with a question mark.
|
||||
\end{itemize}
|
||||
Some commands are both events and queries, depending on whether the question mark is present:
|
||||
\begin{lstlisting}
|
||||
:VNA:FREQ:SPAN 50000000 # Set the span
|
||||
:VNA:FREQ:SPAN? # Read the current span
|
||||
VNA:FREQ:SPAN 50000000 # Set the span
|
||||
VNA:FREQ:SPAN? # Read the current span
|
||||
\end{lstlisting}
|
||||
\end{itemize}
|
||||
\section{Commands}
|
||||
\subsection{General Commands}
|
||||
\subsubsection{*IDN}
|
||||
\query{Returns the identifications string}{*IDN?}{None}{LibreVNA-GUI}
|
||||
\query{Returns the identifications string}{*IDN?}{None}{LibreVNA,LibreVNA-GUI,<serial>,<software version>}
|
||||
\begin{itemize}
|
||||
\item The serial number is the serial number from the connected LibreVNA. If none is connected, it will be set to ``Not connected''
|
||||
\item The software version is the version of the \gui{}, not the firmware version of the connected \vna{}
|
||||
\end{itemize}
|
||||
\subsubsection{*RST}
|
||||
\event{Resets the GUI (and any connected device) to the default state}{*RST}{None}
|
||||
\subsubsection{*CLS}
|
||||
\event{Clears the event status register}{*CLI}{None}
|
||||
\subsubsection{*ESE}
|
||||
\event{Configures the event status enable register}{*ESE}{<enabled\_bits\_decimal>}
|
||||
\query{Returns the event status enable register}{*ESE?}{None}{<enabled\_bits\_decimal>}
|
||||
\subsubsection{*ESR}
|
||||
\query{Returns the event status register}{*ESR?}{None}{<set\_bits\_decimal>}
|
||||
The bits are used according to IEEE 488:
|
||||
\begin{longtable}{p{.1\textwidth} | p{.1\textwidth} | p{.4\textwidth} }
|
||||
\textbf{Bitvalue} & \textbf{Name} & \textbf{Meaning}\\
|
||||
\hline
|
||||
1 & OPC & Operation complete\\
|
||||
2 & RQC & Request control (not used)\\
|
||||
4 & QYE & Query error (not used)\\
|
||||
8 & DDE & Device dependent error (not used)\\
|
||||
16 & EXE & Execution error (not used)\\
|
||||
32 & CME & Command error\\
|
||||
64 & URQ & User request (not used)\\
|
||||
128 & PON & Power on (not used)\\
|
||||
\end{longtable}
|
||||
\subsubsection{*OPC}
|
||||
\event{Sets the OPC bit in the event status register after all operations are complete}{*OPC}{None}
|
||||
\query{Returns a 1 after every active operation has completed}{*OPC?}{None}{1}
|
||||
\subsubsection{*WAI}
|
||||
\event{Blocks further command parsing until all active operations are complete}{*WAI}{None}
|
||||
\subsubsection{*LST}
|
||||
\query{Lists all available commands}{*LST?}{None}{List of commands, separated by newline}
|
||||
\subsection{Device Commands}
|
||||
|
|
@ -238,6 +270,21 @@ This section contains general device commands, available regardless of the curre
|
|||
206039903350,208939A23350
|
||||
\end{example}
|
||||
|
||||
\subsubsection{DEVice:PREFerences}
|
||||
This command provides read/write access to the preferences. The recommended way is usually to change the preferences manually in the GUI. But if for some reason that is not an option, this is also possible through the SCPI server. There is no complete documentation for all available preferences, refer to the source code.
|
||||
|
||||
\event{Set a preferences entry}{DEVice:PREFerences <name> <value>}{<name> Name of the preferences entry\\ <value> New value for the preferences entry}
|
||||
\begin{example}
|
||||
:DEV:PREF Startup.ConnectToFirstDevice false
|
||||
\end{example}
|
||||
Most settings take effect immediately but some (such as changing the port for the SCPI server) are only applied when the preferences are saved. Also see command~\ref{DEV:APPLYPREF}.
|
||||
|
||||
\query{Returns a preferences entry}{DEVice:PREFerences? <name>}{<name> Name of the preferences entry}{Current value of the preferences entry}
|
||||
|
||||
\subsubsection{DEVice:APPLYPREFerences}
|
||||
\label{DEV:APPLYPREF}
|
||||
\event{Permanently stores the preferences after a setting has been changed}{DEVice:APPLYPREFerences}{None}
|
||||
|
||||
\subsubsection{DEVice:MODE}
|
||||
\event{Switches the device to the specified mode}{DEVice:MODE <mode>}{<mode>:\\ \hspace{1cm} VNA: set to vector analyzer\\ \hspace{1cm} GEN: set to signal generator\\ \hspace{1cm} SA: set to spectrum analyzer}
|
||||
\begin{example}
|
||||
|
|
@ -249,6 +296,22 @@ This section contains general device commands, available regardless of the curre
|
|||
VNA
|
||||
\end{example}
|
||||
|
||||
\subsubsection{DEVice:SETUP:SAVE}
|
||||
\event{Saves the GUI setup to a file}{DEVice:SETUP:SAVE}{<filename>}
|
||||
Important points when saving/loading setup files through SCPI commands:
|
||||
\begin{itemize}
|
||||
\item Filenames must be either absolute or relative to the location of the GUI application.
|
||||
\item If the LibreVNA-GUI (and thus also the SCPI server) is running on a different machine than the SCPI client, the setup files will be saved/loaded from the machine that runs the GUI.
|
||||
\item If no (or a wrong) file ending is specified, ``.setup'' is automatically added to the filename.
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{DEVice:SETUP:LOAD}
|
||||
\query{Loads a setup file}{DEVice:SETUP:LOAD?}{<filename>}{TRUE or FALSE}
|
||||
\begin{itemize}
|
||||
\item Filenames must be either absolute or relative to the location of the GUI application.
|
||||
\item The filename must include the file ending ``.setup''.
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{DEVice:REFerence:OUT}
|
||||
\event{Sets the reference output frequency}{DEVice:REFerence:OUT <freq>}{<freq> in MHz, either 0 (disabled), 10 or 100}
|
||||
\query{Queries the reference output frequency}{DEVice:REFerence:OUT?}{None}{Output frequency in MHz}
|
||||
|
|
@ -278,12 +341,6 @@ VNA
|
|||
:DEV:INF:HWREV?
|
||||
B
|
||||
\end{example}
|
||||
\subsubsection{DEVice:INFo:TEMPeratures}
|
||||
\query{Queries the temperatures of certain chips}{DEVice:INFo:TEMPeratures?}{None}{<source>/<1.LO>/<CPU>}
|
||||
\begin{example}
|
||||
:DEV:INF:TEMP?
|
||||
45/51/31
|
||||
\end{example}
|
||||
|
||||
\subsubsection{DEVice:INFo:LIMits:MINFrequency}
|
||||
\query{Queries the lowest frequency the device can measure}{DEVice:INFo:LIMits:MINFrequency?}{None}{lowest frequency in Hz}
|
||||
|
|
@ -352,6 +409,17 @@ These commands change or query VNA settings. Although most of them are available
|
|||
\event{Sets the stop power of the power sweep}{VNA:POWer:STOP}{<stop power>, in dBm}
|
||||
\query{Queries the currently selected stop power}{VNA:POWer:STOP?}{None}{stop power in dBm}
|
||||
|
||||
\subsubsection{VNA:SWEEPTYPE}
|
||||
\event{Selects between linear and logarithmic sweeps}{VNA:SWEEPTYPE}{<type>, either ``LIN'' or ``LOG''}
|
||||
\query{Queries the currently selected sweep type}{VNA:SWEEPTYPE?}{None}{``LIN'' or ``LOG''}
|
||||
|
||||
\subsubsection{VNA:ACQuisition:RUN}
|
||||
\event{Puts the VNA into run mode (sweep active)}{VNA:ACQuisition:RUN}{None}
|
||||
\query{Queries whether the VNA is in run mode}{VNA:ACQuisition:RUN?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{VNA:ACQuisition:STOP}
|
||||
\event{Puts the VNA into stop mode (sweep inactive)}{VNA:ACQuisition:STOP}{None}
|
||||
|
||||
\subsubsection{VNA:ACQuisition:IFBW}
|
||||
\event{Sets the IF bandwidth}{VNA:ACQuisition:IFBW}{<IF bandwidth>, in Hz}
|
||||
\query{Queries the currently selected IF bandwidth}{VNA:ACQuisition:IFBW?}{None}{IF bandwidth in Hz}
|
||||
|
|
@ -395,6 +463,21 @@ If single sweep is enabled, the acquisition is stopped when the required number
|
|||
\item Issue the command again (i.e. VNA:ACQ:SINGLE TRUE always triggers a new sweep)
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{VNA:ACQuisition:FREQuency}
|
||||
\query{Returns the current frequency of the sweep}{VNA:ACQuisition:FREQuency?}{None}{<Frequency in Hz>}
|
||||
|
||||
This command only returns valid data when a sweep is running and the the sweep is a frequency sweep.
|
||||
|
||||
\subsubsection{VNA:ACQuisition:POWer}
|
||||
\query{Returns the current power of the sweep}{VNA:ACQuisition:POWer?}{None}{<Power in dBm>}
|
||||
|
||||
This command only returns valid data when a sweep is running and the the sweep is a power sweep.
|
||||
|
||||
\subsubsection{VNA:ACQuisition:TIME}
|
||||
\query{Returns the current time of the sweep}{VNA:ACQuisition:TIME?}{None}{<Time in seconds>}
|
||||
|
||||
This command only returns valid data when a sweep is running and the the sweep is a zero-span sweep.
|
||||
|
||||
\subsubsection{VNA:STIMulus:LVL}
|
||||
\event{Sets the output power of the stimulus signal when sweep type is frequency}{VNA:STIMulus:LVL}{<power>, in dBm}
|
||||
\query{Queries the currently selected output power}{VNA:STIMulus:LVL?}{None}{power in dBm}
|
||||
|
|
@ -426,7 +509,7 @@ Depending on the sweep and possible confiigured math operations, x may be either
|
|||
[5.33344e+9,0.13223,-0.00780554],
|
||||
[6e+9,-0.0314859,-0.246024]
|
||||
\end{example}
|
||||
\vspace{-0.6cm}
|
||||
\vspace{-0.3cm}
|
||||
\begin{center}
|
||||
\footnotesize{Note: actual response will not include newlines between data points, only at the end}
|
||||
\end{center}
|
||||
|
|
@ -481,6 +564,9 @@ $$ S_{11}...S_{1n},S_{21}...S_{2n},...,S_{n1}...S_{nn} $$
|
|||
\subsubsection{VNA:TRACe:NEW}
|
||||
\event{Creates a new trace}{VNA:TRACe:NEW}{<trace name>}
|
||||
|
||||
\subsubsection{VNA:TRACe:DELete}
|
||||
\event{Deletes a trace}{VNA:TRACe:DELete}{<trace>, either by name or by index}
|
||||
|
||||
\subsubsection{VNA:TRACe:RENAME}
|
||||
\event{Changes the name of a trace}{VNA:TRACe:RENAME}{<trace>, either by name or by index\\<new name>}
|
||||
|
||||
|
|
@ -493,6 +579,16 @@ $$ S_{11}...S_{1n},S_{21}...S_{2n},...,S_{n1}...S_{nn} $$
|
|||
\subsubsection{VNA:TRACe:PAUSED}
|
||||
\query{Queries whether a trace is paused}{VNA:TRACe:PAUSED?}{<trace>, either by name or by index}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{VNA:TRACe:DEEMBedding:ACTive}
|
||||
\event{Enables/disables de-embedding on a trace}{VNA:TRACe:DEEMBedding:ACTive}{<trace>, either by name or by index\\<enable>, either TRUE or FALSE}
|
||||
|
||||
If no de-embedding is configured for the selected trace, enabling the de-embedding will fail.
|
||||
|
||||
\query{Queries whether de-embedding is active for the selected trace}{VNA:TRACe:DEEMBedding:ACTive?}{<trace>, either by name or by index}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{VNA:TRACe:DEEMBedding:AVAILable}
|
||||
\query{Queries whether de-embedding is available for the selected trace}{VNA:TRACe:DEEMBedding:AVAILable?}{<trace>, either by name or by index}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{VNA:TRACe:PARAMeter}
|
||||
\event{Sets the measurement parameter that is stored in the trace}{VNA:TRACe:PARAMeter}{<trace>, either by name or by index\\<parameter>, options are S11, S12, S21 or S22}
|
||||
\query{Queries the measurement parameter of a trace}{VNA:TRACe:PARAMeter?}{<trace>, either by name or by index}{S11, S12, S21 or S22}
|
||||
|
|
@ -505,6 +601,9 @@ $$ S_{11}...S_{1n},S_{21}...S_{2n},...,S_{n1}...S_{nn} $$
|
|||
\event{Activates a specific calibration. This command fails if the required measurements have not been taken yet}{VNA:CALibration:ACTivate}{<type>}
|
||||
\query{Queries the currently available calibration types}{VNA:CALibration:ACTivate?}{None}{comma-separated list of available calibration types}
|
||||
|
||||
\subsubsection{VNA:CALibration:ACTIVE}
|
||||
\query{Queries the currently active calibration type}{VNA:CALibration:ACTIVE?}{None}{Currently active calibration type}
|
||||
|
||||
\subsubsection{VNA:CALibration:NUMber}
|
||||
\query{Queries the number of available calibration measurements}{VNA:CALibration:NUMber?}{None}{<number of configured measurements>}
|
||||
|
||||
|
|
@ -518,6 +617,9 @@ $$ S_{11}...S_{1n},S_{21}...S_{2n},...,S_{n1}...S_{nn} $$
|
|||
\hspace{1cm}LOAD\\
|
||||
\hspace{1cm}THROUGH\\
|
||||
\hspace{1cm}ISOLATION\\
|
||||
\hspace{1cm}SLIDINGLOAD\\
|
||||
\hspace{1cm}REFLECT\\
|
||||
\hspace{1cm}LINE\\
|
||||
{[<standard>]}, calibration kit standard name, optional\\}
|
||||
|
||||
\subsubsection{VNA:CALibration:TYPE}
|
||||
|
|
@ -526,7 +628,10 @@ $$ S_{11}...S_{1n},S_{21}...S_{2n},...,S_{n1}...S_{nn} $$
|
|||
\hspace{1cm}SHORT\\
|
||||
\hspace{1cm}LOAD\\
|
||||
\hspace{1cm}THROUGH\\
|
||||
\hspace{1cm}ISOLATION\\}
|
||||
\hspace{1cm}ISOLATION\\
|
||||
\hspace{1cm}SLIDINGLOAD\\
|
||||
\hspace{1cm}REFLECT\\
|
||||
\hspace{1cm}LINE\\}
|
||||
|
||||
\subsubsection{VNA:CALibration:PORT}
|
||||
\event{Sets the port for the specified measurement}{VNA:CALibration:PORT}{<measurement number> <port number>}
|
||||
|
|
@ -548,13 +653,377 @@ Any number of measurements can be specified (by their number). These measurement
|
|||
Important points when saving/loading calibration files through SCPI commands:
|
||||
\begin{itemize}
|
||||
\item Filenames must be either absolute or relative to the location of the GUI application.
|
||||
\item SCPI parsing implicitly capitalizes all commands, the file will be saved using only uppercase letters. Similarly, it is not possible to load a file whose filename contains lowercase characters.
|
||||
\item If the LibreVNA-GUI (and thus also the SCPI server) is running on a different machine than the SCPI client, the calibration files will be saved/loaded from the machine that runs the GUI.
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{VNA:CALibration:LOAD}
|
||||
\query{Loads a calibration file}{VNA:CALibration:LOAD?}{<filename>}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{VNA:CALibration:KIT:MANufacturer}
|
||||
\event{Sets the manufacturer name of the calibration kit}{VNA:CALibration:KIT:MANufacturer}{<manufacturer>}
|
||||
\query{Returns the manufacturer name of the calibration kit}{VNA:CALibration:KIT:MANufacturer?}{None}{<manufacturer>}
|
||||
|
||||
\subsubsection{VNA:CALibration:KIT:SERial}
|
||||
\event{Sets the serial number of the calibration kit}{VNA:CALibration:KIT:SERial}{<serial number>}
|
||||
\query{Returns the serial number of the calibration kit}{VNA:CALibration:KIT:SERial?}{None}{<serial number>}
|
||||
|
||||
\subsubsection{VNA:CALibration:KIT:DESCription}
|
||||
\event{Sets the description of the calibration kit}{VNA:CALibration:KIT:DESCription}{<description>}
|
||||
\query{Returns the description of the calibration kit}{VNA:CALibration:KIT:DESCription?}{None}{<description>}
|
||||
|
||||
\subsubsection{VNA:CALibration:KIT:FILEname}
|
||||
\query{Returns the filename of the calibration kit}{VNA:CALibration:KIT:FILEname?}{None}{<filename>}
|
||||
|
||||
The filename is only available if the calibration kit was loaded from a dedicated file. If it was loaded as part of a calibration file or has not been loaded since the GUI started, no filename will be returned.
|
||||
|
||||
\subsubsection{VNA:CALibration:KIT:SAVE}
|
||||
\event{Saves the active calibration kit to a file}{VNA:CALibration:KIT:SAVE}{<filename>}
|
||||
Important points when saving/loading calibration kit files through SCPI commands:
|
||||
\begin{itemize}
|
||||
\item Filenames must be either absolute or relative to the location of the GUI application.
|
||||
\item If the LibreVNA-GUI (and thus also the SCPI server) is running on a different machine than the SCPI client, the calibration kit files will be saved/loaded from the machine that runs the GUI.
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{VNA:CALibration:KIT:LOAD}
|
||||
\query{Loads a calibration kit file}{VNA:CALibration:KIT:LOAD?}{<filename>}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{Common calibration kit standards commands}
|
||||
The calibration kit supports an arbitrary amount of standards. This requires a flexible SCPI API which adjusts to the currently configured standards.
|
||||
|
||||
A few calibration kit standard commands are always available and they can be used to create and delete calibration standards. Every created calibration standard adds their own commands. They can be accessed by including the calibration standard number in the command (shown as ``x'' in the following commands).
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:CLEAR}
|
||||
\event{Resets the calibration kit to default values (ideal standards)}{VNA:CALibration:KIT:STAndard:CLEAR}{None}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:NUMber}
|
||||
\query{Returns the number of configured calibration standards}{VNA:CALibration:KIT:STAndard:NUMber?}{None}{<number of calibration standards>}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:TYPE}
|
||||
\query{Returns the type of a created calibration standard}{VNA:CALibration:KIT:STAndard:TYPE?}{<x> Number of calibration standard}{Type of standard, one of:\\
|
||||
\hspace{1cm}Open\\
|
||||
\hspace{1cm}Short\\
|
||||
\hspace{1cm}Load\\
|
||||
\hspace{1cm}Reflect\\
|
||||
\hspace{1cm}Through\\
|
||||
\hspace{1cm}Line\\}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:NEW}
|
||||
\event{Adds a new calibration standard}{VNA:CALibration:KIT:STAndard:NEW}{<type> Type of calibration standard, one of:\\
|
||||
\hspace{1cm}Open\\
|
||||
\hspace{1cm}Short\\
|
||||
\hspace{1cm}Load\\
|
||||
\hspace{1cm}Reflect\\
|
||||
\hspace{1cm}Through\\
|
||||
\hspace{1cm}Line\\
|
||||
<name> User selectable name of new standard}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:DELete}
|
||||
\event{Removes a calibration standard}{VNA:CALibration:KIT:STAndard:DELete}{<x> Number of standard to delete}
|
||||
|
||||
\subsubsection{OPEN standard commands}
|
||||
The following commands are only valid for a calibration standard of type ``Open''. The ``x'' in the command names must be replaced with the calibration standard number.
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:NAME}
|
||||
\event{Sets the name of the standard}{VNA:CALibration:KIT:STAndard:x:NAME}{<name> User selectable name}
|
||||
\query{Queries the name of the standard}{VNA:CALibration:KIT:STAndard:x:NAME?}{None}{<name> User selectable name}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:Z0}
|
||||
\event{Sets the characteristic impedance of the standard}{VNA:CALibration:KIT:STAndard:x:Z0}{<Z> Characteristic impedance in Ohm}
|
||||
\query{Queries the characteristic impedance of the standard}{VNA:CALibration:KIT:STAndard:x:Z0?}{None}{<Z> Characteristic impedance in Ohm}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:DELAY}
|
||||
\event{Sets the delay of the standard}{VNA:CALibration:KIT:STAndard:x:DELAY}{<delay> Delay in \unit{\pico\second}}
|
||||
\query{Queries the delay of the standard}{VNA:CALibration:KIT:STAndard:x:DELAY?}{None}{<delay> Delay in \unit{\pico\second}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:LOSS}
|
||||
\event{Sets the loss of the standard}{VNA:CALibration:KIT:STAndard:x:LOSS}{<loss> Loss in \unit{\giga\ohm\per\second}}
|
||||
\query{Queries the loss of the standard}{VNA:CALibration:KIT:STAndard:x:LOSS?}{None}{<loss> Loss in \unit{\giga\ohm\per\second}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:C0}
|
||||
\event{Sets the fringing capacitance polynom term 0 of the standard}{VNA:CALibration:KIT:STAndard:x:C0}{<C0> in \num{d-15}\unit{\farad}}
|
||||
\query{Queries the fringing capacitance polynom term 0 of the standard}{VNA:CALibration:KIT:STAndard:x:C0?}{None}{<C0> in \num{d-15}\unit{\farad}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:C1}
|
||||
\event{Sets the fringing capacitance polynom term 1 of the standard}{VNA:CALibration:KIT:STAndard:x:C1}{<C1> in \num{d-27}\unit{\farad\per\hertz}}
|
||||
\query{Queries the fringing capacitance polynom term 1 of the standard}{VNA:CALibration:KIT:STAndard:x:C1?}{None}{<C1> in \num{d-27}\unit{\farad\per\hertz}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:C2}
|
||||
\event{Sets the fringing capacitance polynom term 2 of the standard}{VNA:CALibration:KIT:STAndard:x:C2}{<C2> in \num{d-36}\unit{\farad\per\hertz\squared}}
|
||||
\query{Queries the fringing capacitance polynom term 2 of the standard}{VNA:CALibration:KIT:STAndard:x:C2?}{None}{<C2> in \num{d-36}\unit{\farad\per\hertz\squared}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:C3}
|
||||
\event{Sets the fringing capacitance polynom term 3 of the standard}{VNA:CALibration:KIT:STAndard:x:C3}{<C3> in \num{d-45}\unit{\farad\per\hertz\cubed}}
|
||||
\query{Queries the fringing capacitance polynom term 3 of the standard}{VNA:CALibration:KIT:STAndard:x:C3?}{None}{<C3> in \num{d-45}\unit{\farad\per\hertz\cubed}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:FILE}
|
||||
\event{Loads the coefficients for the calibration standard from a touchstone file}{VNA:CALibration:KIT:STAndard:x:FILE}{<filename>\\<port> sets the port from the file which is used to define the standard, optional}
|
||||
|
||||
\subsubsection{SHORT standard commands}
|
||||
The following commands are only valid for a calibration standard of type ``Short''. The ``x'' in the command names must be replaced with the calibration standard number.
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:NAME}
|
||||
\event{Sets the name of the standard}{VNA:CALibration:KIT:STAndard:x:NAME}{<name> User selectable name}
|
||||
\query{Queries the name of the standard}{VNA:CALibration:KIT:STAndard:x:NAME?}{None}{<name> User selectable name}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:Z0}
|
||||
\event{Sets the characteristic impedance of the standard}{VNA:CALibration:KIT:STAndard:x:Z0}{<Z> Characteristic impedance in Ohm}
|
||||
\query{Queries the characteristic impedance of the standard}{VNA:CALibration:KIT:STAndard:x:Z0?}{None}{<Z> Characteristic impedance in Ohm}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:DELAY}
|
||||
\event{Sets the delay of the standard}{VNA:CALibration:KIT:STAndard:x:DELAY}{<delay> Delay in \unit{\pico\second}}
|
||||
\query{Queries the delay of the standard}{VNA:CALibration:KIT:STAndard:x:DELAY?}{None}{<delay> Delay in \unit{\pico\second}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:LOSS}
|
||||
\event{Sets the loss of the standard}{VNA:CALibration:KIT:STAndard:x:LOSS}{<loss> Loss in \unit{\giga\ohm\per\second}}
|
||||
\query{Queries the loss of the standard}{VNA:CALibration:KIT:STAndard:x:LOSS?}{None}{<loss> Loss in \unit{\giga\ohm\per\second}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:L0}
|
||||
\event{Sets the residual inductance polynom term 0 of the standard}{VNA:CALibration:KIT:STAndard:x:L0}{<L0> in \num{d-12}\unit{\henry}}
|
||||
\query{Queries the residual inductance polynom term 0 of the standard}{VNA:CALibration:KIT:STAndard:x:L0?}{None}{<L0> in \num{d-12}\unit{\henry}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:L1}
|
||||
\event{Sets the residual inductance polynom term 1 of the standard}{VNA:CALibration:KIT:STAndard:x:L1}{<L1> in \num{d-24}\unit{\henry\per\hertz}}
|
||||
\query{Queries the residual inductance polynom term 1 of the standard}{VNA:CALibration:KIT:STAndard:x:L1?}{None}{<L1> in \num{d-24}\unit{\henry\per\hertz}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:L2}
|
||||
\event{Sets the residual inductance polynom term 2 of the standard}{VNA:CALibration:KIT:STAndard:x:L2}{<L2> in \num{d-33}\unit{\henry\per\hertz\squared}}
|
||||
\query{Queries the residual inductance polynom term 2 of the standard}{VNA:CALibration:KIT:STAndard:x:L2?}{None}{<L2> in \num{d-33}\unit{\henry\per\hertz\squared}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:L3}
|
||||
\event{Sets the residual inductance polynom term 3 of the standard}{VNA:CALibration:KIT:STAndard:x:L3}{<L3> in \num{d-42}\unit{\henry\per\hertz\cubed}}
|
||||
\query{Queries the residual inductance polynom term 3 of the standard}{VNA:CALibration:KIT:STAndard:x:L3?}{None}{<L3> in \num{d-42}\unit{\henry\per\hertz\cubed}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:FILE}
|
||||
\event{Loads the coefficients for the calibration standard from a touchstone file}{VNA:CALibration:KIT:STAndard:x:FILE}{<filename>\\<port> sets the port from the file which is used to define the standard, optional}
|
||||
|
||||
\subsubsection{LOAD standard commands}
|
||||
The following commands are only valid for a calibration standard of type ``Load''. The ``x'' in the command names must be replaced with the calibration standard number.
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:NAME}
|
||||
\event{Sets the name of the standard}{VNA:CALibration:KIT:STAndard:x:NAME}{<name> User selectable name}
|
||||
\query{Queries the name of the standard}{VNA:CALibration:KIT:STAndard:x:NAME?}{None}{<name> User selectable name}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:RESistance}
|
||||
\event{Sets the resistance of the standard}{VNA:CALibration:KIT:STAndard:x:RESistance}{<R> in \unit{\ohm}}
|
||||
\query{Queries the resistance of the standard}{VNA:CALibration:KIT:STAndard:x:RESistance?}{None}{<R> in \unit{\ohm}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:Z0}
|
||||
\event{Sets the characteristic impedance of the standard}{VNA:CALibration:KIT:STAndard:x:Z0}{<Z> Characteristic impedance in Ohm}
|
||||
\query{Queries the characteristic impedance of the standard}{VNA:CALibration:KIT:STAndard:x:Z0?}{None}{<Z> Characteristic impedance in Ohm}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:DELAY}
|
||||
\event{Sets the delay of the standard}{VNA:CALibration:KIT:STAndard:x:DELAY}{<delay> Delay in \unit{\pico\second}}
|
||||
\query{Queries the delay of the standard}{VNA:CALibration:KIT:STAndard:x:DELAY?}{None}{<delay> Delay in \unit{\pico\second}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:LOSS}
|
||||
\event{Sets the loss of the standard}{VNA:CALibration:KIT:STAndard:x:LOSS}{<loss> Loss in \unit{\giga\ohm\per\second}}
|
||||
\query{Queries the loss of the standard}{VNA:CALibration:KIT:STAndard:x:LOSS?}{None}{<loss> Loss in \unit{\giga\ohm\per\second}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:CARallel}
|
||||
\event{Sets the residual capacitance polynom of the standard}{VNA:CALibration:KIT:STAndard:x:CARallel}{<C> in \unit{\farad}}
|
||||
\query{Queries the residual capacitance of the standard}{VNA:CALibration:KIT:STAndard:x:CARallel?}{None}{<C> in \unit{\farad}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:LSERies}
|
||||
\event{Sets the residual inductance of the standard}{VNA:CALibration:KIT:STAndard:x:LSERies}{<L> in \unit{\henry}}
|
||||
\query{Queries the residual inductance of the standard}{VNA:CALibration:KIT:STAndard:x:LSERies?}{None}{<L> in \unit{\henry}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:CFIRST}
|
||||
\event{Sets the order of residual capacitance/inductance}{VNA:CALibration:KIT:STAndard:x:CFIRST}{TRUE or FALSE}
|
||||
\query{Queries the order of residual capacitance/inductance}{VNA:CALibration:KIT:STAndard:x:CFIRST?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:FILE}
|
||||
\event{Loads the coefficients for the calibration standard from a touchstone file}{VNA:CALibration:KIT:STAndard:x:FILE}{<filename>\\<port> sets the port from the file which is used to define the standard, optional}
|
||||
|
||||
\subsubsection{REFLECT standard commands}
|
||||
The following commands are only valid for a calibration standard of type ``Reflect''. The ``x'' in the command names must be replaced with the calibration standard number.
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:NAME}
|
||||
\event{Sets the name of the standard}{VNA:CALibration:KIT:STAndard:x:NAME}{<name> User selectable name}
|
||||
\query{Queries the name of the standard}{VNA:CALibration:KIT:STAndard:x:NAME?}{None}{<name> User selectable name}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:SHORT}
|
||||
\event{Sets the type of reflection standard}{VNA:CALibration:KIT:STAndard:x:SHORT}{TRUE for short standard or FALSE for open standard}
|
||||
\query{Queries the type of reflection standard}{VNA:CALibration:KIT:STAndard:x:SHORT?}{None}{TRUE for short standard or FALSE for open standard}
|
||||
|
||||
\subsubsection{THROUGH standard commands}
|
||||
The following commands are only valid for a calibration standard of type ``Through''. The ``x'' in the command names must be replaced with the calibration standard number.
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:NAME}
|
||||
\event{Sets the name of the standard}{VNA:CALibration:KIT:STAndard:x:NAME}{<name> User selectable name}
|
||||
\query{Queries the name of the standard}{VNA:CALibration:KIT:STAndard:x:NAME?}{None}{<name> User selectable name}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:Z0}
|
||||
\event{Sets the characteristic impedance of the standard}{VNA:CALibration:KIT:STAndard:x:Z0}{<Z> Characteristic impedance in Ohm}
|
||||
\query{Queries the characteristic impedance of the standard}{VNA:CALibration:KIT:STAndard:x:Z0?}{None}{<Z> Characteristic impedance in Ohm}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:DELAY}
|
||||
\event{Sets the delay of the standard}{VNA:CALibration:KIT:STAndard:x:DELAY}{<delay> Delay in \unit{\pico\second}}
|
||||
\query{Queries the delay of the standard}{VNA:CALibration:KIT:STAndard:x:DELAY?}{None}{<delay> Delay in \unit{\pico\second}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:LOSS}
|
||||
\event{Sets the loss of the standard}{VNA:CALibration:KIT:STAndard:x:LOSS}{<loss> Loss in \unit{\giga\ohm\per\second}}
|
||||
\query{Queries the loss of the standard}{VNA:CALibration:KIT:STAndard:x:LOSS?}{None}{<loss> Loss in \unit{\giga\ohm\per\second}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:FILE}
|
||||
\event{Loads the coefficients for the calibration standard from a touchstone file}{VNA:CALibration:KIT:STAndard:x:FILE}{<filename>\\
|
||||
<port1> selects the first port from the file which is used to define the standard\\
|
||||
<port1> selects the second port from the file which is used to define the standard}
|
||||
|
||||
\subsubsection{LINE standard commands}
|
||||
The following commands are only valid for a calibration standard of type ``Line''. The ``x'' in the command names must be replaced with the calibration standard number.
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:NAME}
|
||||
\event{Sets the name of the standard}{VNA:CALibration:KIT:STAndard:x:NAME}{<name> User selectable name}
|
||||
\query{Queries the name of the standard}{VNA:CALibration:KIT:STAndard:x:NAME?}{None}{<name> User selectable name}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:Z0}
|
||||
\event{Sets the characteristic impedance of the standard}{VNA:CALibration:KIT:STAndard:x:Z0}{<Z> Characteristic impedance in Ohm}
|
||||
\query{Queries the characteristic impedance of the standard}{VNA:CALibration:KIT:STAndard:x:Z0?}{None}{<Z> Characteristic impedance in Ohm}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:DELAY}
|
||||
\event{Sets the delay of the standard}{VNA:CALibration:KIT:STAndard:x:DELAY}{<delay> Delay in \unit{\pico\second}}
|
||||
\query{Queries the delay of the standard}{VNA:CALibration:KIT:STAndard:x:DELAY?}{None}{<delay> Delay in \unit{\pico\second}}
|
||||
|
||||
\subsubsubsection{VNA:CALibration:KIT:STAndard:x:FILE}
|
||||
\event{Loads the coefficients for the calibration standard from a touchstone file}{VNA:CALibration:KIT:STAndard:x:FILE}{<filename>\\
|
||||
<port1> selects the first port from the file which is used to define the standard\\
|
||||
<port1> selects the second port from the file which is used to define the standard}
|
||||
|
||||
\subsubsection{Common Deembedding Commands}
|
||||
The VNA supports various deembedding options which can also be configured through the SCPI API. Because the deembedding system is flexible and supports any number of deembedding options at the same time, the SCPI API is also flexible. Instead of fixed commands, the available commands change depending on the configured deembedding options.
|
||||
|
||||
A few deembedding commands are always available and they can be used to create, delete and swap deembedding options. Every created deembedding option adds their own commands. They can be accessed by including the option number in the command (shown as ``x'' in the following commands).
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:NUMber}
|
||||
\query{Returns the number of configured deembedding options}{VNA:DEEMBedding:NUMber?}{None}{<number of deembedding options>}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:TYPE}
|
||||
\query{Returns the type of a configured deembedding option}{VNA:DEEMBedding:TYPE?}{<x> Number of deembedding option}{Type of option, one of:\\
|
||||
\hspace{1cm}Port\_Extension\\
|
||||
\hspace{1cm}2xThru\\
|
||||
\hspace{1cm}Matching\_Network\\
|
||||
\hspace{1cm}Impedance\_Renormalization\\}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:NEW}
|
||||
\event{Adds a new deembedding option}{VNA:DEEMBedding:NEW}{<type> Type of option, one of:\\
|
||||
\hspace{1cm}Port\_Extension\\
|
||||
\hspace{1cm}2xThru\\
|
||||
\hspace{1cm}Matching\_Network\\
|
||||
\hspace{1cm}Impedance\_Renormalization\\}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:DELete}
|
||||
\event{Removes a deembedding option}{VNA:DEEMBedding:DELete}{<x> Number of option to delete}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:SWAP}
|
||||
\event{Swaps the order of two deembedding options}{VNA:DEEMBedding:SWAP}{<x1> Number of option 1 to swap\\<x2> Number of option 2 to swap}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:CLEAR}
|
||||
\event{Delete all deembedding options}{VNA:DEEMBedding:CLEAR}{None}
|
||||
|
||||
\subsubsection{Port Extension Deembedding Commands}
|
||||
The following commands are only valid for a deembedding option of type ``Port\_Extension''. The ``x'' in the command names must be replaced with the option number.
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:PORT}
|
||||
\event{Sets the port}{VNA:DEEMBedding:x:PORT}{<port>, 1...n}
|
||||
\query{Queries the selected port}{VNA:DEEMBedding:x:PORT?}{None}{<port>, 1...n}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:DELAY}
|
||||
\event{Sets the delay of the port extension}{VNA:DEEMBedding:x:DELAY}{<delay> Delay in seconds}
|
||||
\query{Queries the delay of the port extension}{VNA:DEEMBedding:x:DELAY?}{None}{<delay> Delay in seconds}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:DCLOSS}
|
||||
\event{Sets the DC loss of the port extension}{VNA:DEEMBedding:x:DCLOSS}{<loss> Loss at DC in dB}
|
||||
\query{Queries the DC loss of the port extension}{VNA:DEEMBedding:x:DCLOSS?}{None}{<loss> Loss at DC in dB}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:LOSS}
|
||||
\event{Sets the loss of the port extension at the configured frequency}{VNA:DEEMBedding:x:LOSS}{<loss> Loss at frequency in dB}
|
||||
\query{Queries the loss of the port extension at the configured frequency}{VNA:DEEMBedding:x:LOSS?}{None}{<loss> Loss at frequency in dB}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:FREQuency}
|
||||
\event{Sets the frequency for the specified loss of the port extension}{VNA:DEEMBedding:x:FREQuency}{<freq> Frequency for loss in Hz}
|
||||
\query{Queries the frequency for the specified loss of the port extension}{VNA:DEEMBedding:x:FREQuency?}{None}{<freq> Frequency for loss in Hz}
|
||||
|
||||
\subsubsection{2xThru Deembedding Commands}
|
||||
The 2xThru deembedding does not have a SCPI API so far because it requires the user to manually make specific connections and take additional measurements.
|
||||
|
||||
\subsubsection{Matching Network Deembedding Commands}
|
||||
The following commands are only valid for a deembedding option of type ``Matching\_Network''. The ``x'' in the command names must be replaced with the option number.
|
||||
|
||||
Similarly to the deembedding options, the matching network itself is also flexible and requires a flexible API as well. A similar approach is used where components in the matching network are given a number. This number is shown as ``y'' in the following commands.
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:PORT}
|
||||
\event{Sets the port at which the matching network is added}{VNA:DEEMBedding:x:PORT}{<port>, 1...n}
|
||||
\query{Queries the port at which the matching network is added}{VNA:DEEMBedding:x:PORT?}{None}{<port>, 1...n}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:ADD}
|
||||
\event{Selects whether the network is added or removed during the deembedding}{VNA:DEEMBedding:x:ADD}{TRUE if the effect of the network should be added. FALSE if the effect of the\\
|
||||
\hspace{1cm}network should be subtracted}
|
||||
\query{Queries whether the network is added or removed during the deembedding}{VNA:DEEMBedding:x:ADD?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:NUMber}
|
||||
\query{Returns the number of configured matching network components}{VNA:DEEMBedding:x:NUMber?}{None}{<number of matching network components>}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:TYPE}
|
||||
\query{Returns the type of a configured matching network component}{VNA:DEEMBedding:x:TYPE? <y>}{<y> Number of matching component}{Type of component, one of:\\
|
||||
\hspace{1cm}SeriesR\\
|
||||
\hspace{1cm}SeriesL\\
|
||||
\hspace{1cm}SeriesC\\
|
||||
\hspace{1cm}ParallelR\\
|
||||
\hspace{1cm}ParallelL\\
|
||||
\hspace{1cm}ParallelC\\
|
||||
\hspace{1cm}Touchstone\_Through\\
|
||||
\hspace{1cm}Touchstone\_Shunt\\}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:NEW}
|
||||
\event{Adds a new matching network component}{VNA:DEEMBedding:x:NEW}{<type> Type of component, one of:\\
|
||||
\hspace{1cm}SeriesR\\
|
||||
\hspace{1cm}SeriesL\\
|
||||
\hspace{1cm}SeriesC\\
|
||||
\hspace{1cm}ParallelR\\
|
||||
\hspace{1cm}ParallelL\\
|
||||
\hspace{1cm}ParallelC\\
|
||||
\hspace{1cm}Touchstone\_Through\\
|
||||
\hspace{1cm}Touchstone\_Shunt\\
|
||||
<pos> position at which the component will be added. A value of 0 adds the\\
|
||||
\hspace{1cm}component closest to the port. This parameter is optional. If it is omitted,\\
|
||||
\hspace{1cm}the component is added closest to the DUT}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:DELete}
|
||||
\event{Removes a matching network component}{VNA:DEEMBedding:x:DELete}{<y> Number of component to delete}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:CLEAR}
|
||||
\event{Removes all matching network components}{VNA:DEEMBedding:x:DELete}{None}
|
||||
|
||||
\subsubsection{Impedance Renormalization Deembedding Commands}
|
||||
The following commands are only valid for a deembedding option of type ``Impedance\_Renormalization''. The ``x'' in the command names must be replaced with the option number.
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:IMPedance}
|
||||
\event{Sets the target impedance}{VNA:DEEMBedding:x:IMPedance}{<impedance> Impedance in Ohm}
|
||||
\query{Queries the target impedance}{VNA:DEEMBedding:x:IMPedance?}{None}{<impedance> Impedance in Ohm}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:y:VALue}
|
||||
\event{Sets the value of a matching network component}{VNA:DEEMBedding:x:y:VALue}{<value>, either in Ohm, Farad or Henry}
|
||||
\query{Queries the value of a matching network component}{VNA:DEEMBedding:x:y:VALue?}{None}{<port>, either in Ohm, Farad or Henry}
|
||||
|
||||
This command is only available for a component of these types:
|
||||
\begin{itemize}
|
||||
\item SeriesR
|
||||
\item SeriesL
|
||||
\item SeriesC
|
||||
\item ParallelR
|
||||
\item ParallelL
|
||||
\item ParallelC
|
||||
\end{itemize}
|
||||
|
||||
\subsubsubsection{VNA:DEEMBedding:x:y:FILE}
|
||||
\event{Loads a matching network component values from a Touchstone file}{VNA:DEEMBedding:x:y:FILE}{<filename>}
|
||||
|
||||
This command is only available for a component of these types:
|
||||
\begin{itemize}
|
||||
\item Touchstone\_Through
|
||||
\item Touchstone\_Shunt
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Signal Generator Commands}
|
||||
These commands change or query signal generator settings. Although most of them are available regardless of the current device mode, they usually only have an effect once the generator mode is active.
|
||||
|
||||
|
|
@ -598,6 +1067,13 @@ These commands change or query spectrum analyzer settings. Although most of them
|
|||
\subsubsection{SA:FREQuency:ZERO}
|
||||
\event{Sets the device to zero span mode}{SA:FREQuency:ZERO}{None}
|
||||
|
||||
\subsubsection{SA:ACQuisition:RUN}
|
||||
\event{Puts the spectrum analyzer into run mode (sweep active)}{SA:ACQuisition:RUN}{None}
|
||||
\query{Queries whether the spectrum analyzer is in run mode}{SA:ACQuisition:RUN?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{SA:ACQuisition:STOP}
|
||||
\event{Puts the spectrum analyzer into stop mode (sweep inactive)}{SA:ACQuisition:STOP}{None}
|
||||
|
||||
\subsubsection{SA:ACQuisition:RBW}
|
||||
\event{Sets the resolution bandwidth}{SA:ACQuisition:IFBW}{<resolution bandwidth>, in Hz}
|
||||
\query{Queries the currently selected resolution bandwidth}{SA:ACQuisition:IFBW?}{None}{resolution bandwidth in Hz}
|
||||
|
|
@ -660,6 +1136,16 @@ If single sweep is enabled, the acquisition is stopped when the required number
|
|||
\event{Enables/disables signal identification}{SA:ACQuisition:SIGid}{<enabled>, option are TRUE, FALSE, 1 or 0}
|
||||
\query{Queries whether signal identification is enabled}{SA:ACQuisition:SIGid?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{SA:ACQuisition:FREQuency}
|
||||
\query{Returns the current frequency of the sweep}{SA:ACQuisition:FREQuency?}{None}{<Frequency in Hz>}
|
||||
|
||||
This command only returns valid data when a sweep is running and the the sweep is a frequency sweep.
|
||||
|
||||
\subsubsection{SA:ACQuisition:TIME}
|
||||
\query{Returns the current time of the sweep}{SA:ACQuisition:TIME?}{None}{<Time in seconds>}
|
||||
|
||||
This command only returns valid data when a sweep is running and the the sweep is a zero-span sweep.
|
||||
|
||||
\subsubsection{SA:TRACKing:ENable}
|
||||
\event{Enables/disables the tracking generator}{SA:TRACKing:ENable}{<enabled>, option are TRUE, FALSE, 1 or 0}
|
||||
\query{Queries whether tracking generator is enabled}{SA:TRACKing:ENable?}{None}{TRUE or FALSE}
|
||||
|
|
@ -740,6 +1226,9 @@ Port1,Port2
|
|||
\subsubsection{SA:TRACe:NEW}
|
||||
\event{Creates a new trace}{SA:TRACe:NEW}{<trace name>}
|
||||
|
||||
\subsubsection{SA:TRACe:DELete}
|
||||
\event{Deletes a trace}{VNA:TRACe:DELete}{<trace>, either by name or by index}
|
||||
|
||||
\subsubsection{SA:TRACe:RENAME}
|
||||
\event{Changes the name of a trace}{SA:TRACe:RENAME}{<trace>, either by name or by index\\<new name>}
|
||||
|
||||
|
|
@ -760,4 +1249,299 @@ Port1,Port2
|
|||
\event{Sets the storage type of a trace}{SA:TRACe:TYPE}{<trace>, either by name or by index\\<type>, options are OVERWRITE, MAXHOLD or MINHOLD}
|
||||
\query{Queries the storage type of a trace}{SA:TRACe:TYPE?}{<trace>, either by name or by index}{OVERWRITE, MAXHOLD or MINHOLD}
|
||||
|
||||
\section{Custom Driver Commands}
|
||||
The \gui{} is mainly intended to be used with the \vna{}. However, the interface between the \gui{} and the actual VNA is abstracting certain hardware features to allow the \gui{} to interact with other devices as well. This is mainly intended for future extensions and only very few other devices are supported for testing and demonstration purposes.
|
||||
|
||||
Each device driver may implement additional SCPI commands that are too specific to be useful with every device. These commands are only available when the \gui{} is connected to the device.
|
||||
|
||||
\subsection{LibreVNA Version 1}
|
||||
The following commands are available when connected to a LibreVNA (hardware version 1):
|
||||
|
||||
\subsubsection{DEVice:UPDATE}
|
||||
\event{Updates the firmware of the connected device}{DEVice:UPDATE <fw\_file>}{<fw\_file> Path to the firmware file}
|
||||
Important points when saving/loading setup files through SCPI commands:
|
||||
\begin{itemize}
|
||||
\item The path must be either absolute or relative to the location of the GUI application.
|
||||
\item If the LibreVNA-GUI (and thus also the SCPI server) is running on a different machine than the SCPI client, the firmware file must be stored on the machine that runs the GUI.
|
||||
\end{itemize}
|
||||
|
||||
\subsubsection{DEVice:INFo:TEMPeratures}
|
||||
\query{Queries the temperatures of certain chips}{DEVice:INFo:TEMPeratures?}{None}{<source>/<1.LO>/<CPU>}
|
||||
\begin{example}
|
||||
:DEV:INF:TEMP?
|
||||
45/51/31
|
||||
\end{example}
|
||||
|
||||
\subsubsection{MANual:STArt}
|
||||
\event{Starts the manual device control dialog}{MANual:STArt}{None}
|
||||
|
||||
The manual device control dialog allows the user to directly access all the hardware components. This can be considered as a forth mode (in addition to VNA, signal generator and spectrum analyzer). As long as it is active, it takes priority over any other mode. After starting the manual control dialog, all hardware components are disabled by default. While the manual control dialog is active, additional SCPI commands are available to configure the hardware and retrieve ADC readings.
|
||||
|
||||
\subsubsection{MANual:STOp}
|
||||
\event{Stops the manual device control dialog}{MANual:STOp}{None}
|
||||
|
||||
\subsubsection{MANual:HSRC\_CE}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Controls the chip enable for the highband source}{MANual:HSRC\_CE}{TRUE or FALSE}
|
||||
\query{Queries the status of the chip enable for the highband source}{MANual:HSRC\_CE?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{MANual:HSRC\_RFEN}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Controls the RF enable for the highband source}{MANual:HSRC\_RFEN}{TRUE or FALSE}
|
||||
\query{Queries the status of the RF enable for the highband source}{MANual:HSRC\_RFEN?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{MANual:HSRC\_LOCKed}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the lock status of the highband source}{MANual:HSRC\_LOCKed?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{MANual:HSRC\_PWR}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Sets the output power of the highband source}{MANual:HSRC\_PWR}{<power>, output power in dBm, allowed values are -4, -1, 2 and 5}
|
||||
\query{Queries the output power of the highband source}{MANual:HSRC\_PWR?}{None}{<power>, output power in dBm}
|
||||
|
||||
\subsubsection{MANual:HSRC\_FREQ}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Sets the target frequency of the highband source}{MANual:HSRC\_FREQ}{<freq>, frequency in Hz}
|
||||
\query{Queries the target frequency of the highband source}{MANual:HSRC\_FREQ?}{None}{<freq>, frequency in Hz}
|
||||
|
||||
\subsubsection{MANual:HSRC\_LPF}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Sets the lowpass filter of the highband source}{MANual:HSRC\_LPF}{<cutoff>, Cutoff frequency in MHz, allowed values are 947, 1880, 3500 and\\0 (no filter)}
|
||||
\query{Queries the lowpass filter setting of the highband source}{MANual:HSRC\_LPF?}{None}{<cutoff>, Cutoff frequency in MHz}
|
||||
|
||||
\subsubsection{MANual:LSRC\_EN}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Controls the enable signal for the lowband source}{MANual:LSRC\_EN}{TRUE or FALSE}
|
||||
\query{Queries the status of the enable signal for the lowband source}{MANual:LSRC\_EN?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{MANual:LSRC\_PWR}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Sets the output power of the lowband source}{MANual:LSRC\_PWR}{<power>, output power in mA, allowed values are 2, 4, 6 and 8}
|
||||
\query{Queries the output power of the lowband source}{MANual:LSRC\_PWR?}{None}{<power>, output power in mA}
|
||||
|
||||
\subsubsection{MANual:LSRC\_FREQ}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Sets the target frequency of the lowband source}{MANual:LSRC\_FREQ}{<freq>, frequency in Hz}
|
||||
\query{Queries the target frequency of the lowband source}{MANual:LSRC\_FREQ?}{None}{<freq>, frequency in Hz}
|
||||
|
||||
\subsubsection{MANual:BAND\_SW}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Controls the band selector switch}{MANual:BAND\_SW}{TRUE for highband, FALSE for lowband}
|
||||
\query{Queries the status of the band selector switch}{MANual:BAND\_SW?}{None}{TRUE for highband, FALSE for lowband}
|
||||
|
||||
\subsubsection{MANual:ATTenuator}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Sets the attenuator value}{MANual:ATTenuator}{<att>, Attenuation in dB, values between -31.75 and 0}
|
||||
\query{Queries the attenuator value}{MANual:ATTenuator?}{None}{<att>, Attenuation in dB}
|
||||
|
||||
\subsubsection{MANual:AMP\_EN}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Controls the enable signal for the amplifier}{MANual:AMP\_EN}{TRUE or FALSE}
|
||||
\query{Queries the status of the enable signal for the amplifier}{MANual:AMP\_EN?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{MANual:PORT\_SW}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Controls the port selector switch}{MANual:PORT\_SW}{<port>, either 1 or 2}
|
||||
\query{Queries the status of the port selector switch}{MANual:PORT\_SW?}{None}{<port>}
|
||||
|
||||
\subsubsection{MANual:LO1\_CE}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Controls the chip enable for the LO1 PLL}{MANual:LO1\_CE}{TRUE or FALSE}
|
||||
\query{Queries the status of the chip enable for the LO1 PLL}{MANual:LO1\_CE?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{MANual:LO1\_RFEN}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Controls the RF enable for the LO1 PLL}{MANual:LO1\_RFEN}{TRUE or FALSE}
|
||||
\query{Queries the status of the RF enable for the LO1 PLL}{MANual:LO1\_RFEN?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{MANual:LO1\_LOCKed}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the lock status of the LO1 PLL}{MANual:LO1\_LOCKed?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{MANual:LO1\_FREQ}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Sets the target frequency of the LO1 PLL}{MANual:LO1\_FREQ}{<freq>, frequency in Hz}
|
||||
\query{Queries the target frequency of the LO1 PLL}{MANual:LO1\_FREQ?}{None}{<freq>, frequency in Hz}
|
||||
|
||||
\subsubsection{MANual:IF1\_FREQ}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Sets the IF1 frequency}{MANual:IF1\_FREQ}{<freq>, frequency in Hz}
|
||||
\query{Queries the IF1 frequency}{MANual:IF1\_FREQ?}{None}{<freq>, frequency in Hz}
|
||||
|
||||
\subsubsection{MANual:LO2\_EN}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Controls the enable signal for the LO2 PLL}{MANual:LO2\_EN}{TRUE or FALSE}
|
||||
\query{Queries the status of the enable signal for the LO2 PLL}{MANual:LO2\_EN?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{MANual:LO2\_FREQ}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Sets the target frequency of the LO2 PLL}{MANual:LO2\_FREQ}{<freq>, frequency in Hz}
|
||||
\query{Queries the target frequency of the LO2 PLL}{MANual:LO2\_FREQ?}{None}{<freq>, frequency in Hz}
|
||||
|
||||
\subsubsection{MANual:IF2\_FREQ}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Sets the IF2 frequency}{MANual:IF2\_FREQ}{<freq>, frequency in Hz}
|
||||
\query{Queries the IF2 frequency}{MANual:IF2\_FREQ?}{None}{<freq>, frequency in Hz}
|
||||
|
||||
\subsubsection{MANual:PORT1\_EN}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Controls the enable signal for the port 1 receiver}{MANual:PORT1\_EN}{TRUE or FALSE}
|
||||
\query{Queries the status of the enable signal for the port 1 receiver}{MANual:PORT1\_EN?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{MANual:PORT2\_EN}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Controls the enable signal for the port 2 receiver}{MANual:PORT2\_EN}{TRUE or FALSE}
|
||||
\query{Queries the status of the enable signal for the port 2 receiver}{MANual:PORT2\_EN?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{MANual:REF\_EN}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Controls the enable signal for the reference receiver}{MANual:REF\_EN}{TRUE or FALSE}
|
||||
\query{Queries the status of the enable signal for the reference receiver}{MANual:REF\_EN?}{None}{TRUE or FALSE}
|
||||
|
||||
\subsubsection{MANual:SAMPLES}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Sets the number of ADC samples per reading}{MANual:SAMPLES}{<samples>, value between 16 and 131072 in increments of 16}
|
||||
\query{Queries the number of ADC samples per reading}{MANual:SAMPLES?}{None}{<samples>}
|
||||
|
||||
\subsubsection{MANual:WINdow}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\event{Sets the window for the DFT calculation}{MANual:WINdow}{<window>, either NONE, KAISER, HANN or FLATTOP}
|
||||
\query{Queries the window for the DFT calculatio}{MANual:WINdow?}{None}{NONE, KAISER, HANN or FLATTOP}
|
||||
|
||||
\subsubsection{MANual:PORT1\_MIN}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the minimum observed port 1 ADC value in the last sampling period}{MANual:PORT1\_MIN?}{None}{minimum ADC value}
|
||||
|
||||
\subsubsection{MANual:PORT1\_MAX}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the maximum observed port 1 ADC value in the last sampling period}{MANual:PORT1\_MAX?}{None}{maximum ADC value}
|
||||
|
||||
\subsubsection{MANual:PORT1\_MAG}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the observerd magnitude at port 1 in the last sampling period}{MANual:PORT1\_MAG?}{None}{port 1 magnitude (linear unit, arbitrary scale)}
|
||||
|
||||
\subsubsection{MANual:PORT1\_PHAse}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the observed phase at port 1 in the last sampling period}{MANual:PORT1\_PHAse?}{None}{phase in degree (random value because it is relativ to an internal sampling clock)}
|
||||
|
||||
\subsubsection{MANual:PORT1\_REFerenced}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the observed signal at port 1 relative to the reference in the last sampling period}{MANual:PORT1\_REFerenced?}{None}{<real>, <imag>}
|
||||
|
||||
\subsubsection{MANual:PORT2\_MIN}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the minimum observed port 2 ADC value in the last sampling period}{MANual:PORT2\_MIN?}{None}{minimum ADC value}
|
||||
|
||||
\subsubsection{MANual:PORT2\_MAX}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the maximum observed port 2 ADC value in the last sampling period}{MANual:PORT2\_MAX?}{None}{maximum ADC value}
|
||||
|
||||
\subsubsection{MANual:PORT2\_MAG}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the observerd magnitude at port 2 in the last sampling period}{MANual:PORT2\_MAG?}{None}{port 1 magnitude (linear unit, arbitrary scale)}
|
||||
|
||||
\subsubsection{MANual:PORT2\_PHAse}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the observed phase at port 2 in the last sampling period}{MANual:PORT2\_PHAse?}{None}{phase in degree (random value because it is relativ to an internal sampling clock)}
|
||||
|
||||
\subsubsection{MANual:PORT2\_REFerenced}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the observed signal at port 2 relative to the reference in the last sampling period}{MANual:PORT2\_REFerenced?}{None}{<real>, <imag>}
|
||||
|
||||
\subsubsection{MANual:REF\_MIN}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the minimum observed reference ADC value in the last sampling period}{MANual:REF\_MIN?}{None}{minimum ADC value}
|
||||
|
||||
\subsubsection{MANual:REF\_MAX}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the maximum observed reference ADC value in the last sampling period}{MANual:REF\_MAX?}{None}{maximum ADC value}
|
||||
|
||||
\subsubsection{MANual:REF\_MAG}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the observerd magnitude at the reference receiver in the last sampling period}{MANual:REF\_MAG?}{None}{port 1 magnitude (linear unit, arbitrary scale)}
|
||||
|
||||
\subsubsection{MANual:REF\_PHAse}
|
||||
Only available when the manual control dialog is active.
|
||||
|
||||
\query{Queries the observed phase at the reference receiver in the last sampling period}{MANual:REF\_PHAse?}{None}{phase in degree (random value because it is relativ to an internal sampling clock)}
|
||||
|
||||
\section{Streaming data}
|
||||
The SCPI server works well for configuring the device and also for reading trace data once an acquition is done. But it isn't very well suited for reading data while the device is capturing it. For some applications (e.g. when running continuous sweeps) it may be beneficial to process the data externally as it getting captured. For this purpose, the LibreVNA-GUI supports streaming the data over dedicated ports.
|
||||
|
||||
These streaming servers have to be enbled first. This can be done in \menu[,]{Window,Preferences,Streaming Servers}.
|
||||
|
||||
There are a total of 5 streaming servers available. They can all be enabled and used at the same time, although not all servers will output data all the time.
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{VNA raw data:} Outputs the raw S-parameters without any calibration applied. This output is always available, even when a calibration is enabled or de-embedding it active. Apart from averaging (if enabled) no processing is done on the data.
|
||||
\item \textbf{VNA calibrated data:} Outputs the calibrated S-parameters with the calibration applied. This output is only available when a calibration is enabled.
|
||||
\item \textbf{VNA de-embedded data:} Outputs the de-embedded S-parameters with the de-embbeding and calibration (if enabled) applied. This output is only available when de-embedding is active.
|
||||
\item \textbf{SA raw data:} Outputs the raw (not normalized) power levels from the spectrum analyzer. This output is always available, even when normalizing is active.
|
||||
\item \textbf{SA normalized data:} Outputs the normalized power levels from the spectrum analyzer. This output is only available when normalizing is active.
|
||||
\end{itemize}
|
||||
|
||||
\vspace{0.5cm}
|
||||
|
||||
All servers output a newline-terminated line of json formatted data for each measurement point in the sweep. The format of the output data changes depending on the configured sweep type.
|
||||
|
||||
\begin{itemize}
|
||||
\item VNA frequency or power sweeps:
|
||||
\begin{example}
|
||||
{"Z0":50.0,"dBm":-20.0,"frequency":42993000.0,"measurements":{"S11_imag":-0.061379313997181856,"S11_real":0.023033630841401063,"S12_imag":0.3205479840477101,"S12_real":-0.5742283570681822,"S21_imag":-0.3746074656570865,"S21_real":0.6126114195570408,"S22_imag":0.06312766256272641,"S22_real":-0.018668561526968372},"pointNum":7}
|
||||
\end{example}
|
||||
\item VNA zero span sweeps:
|
||||
\begin{example}
|
||||
{"Z0":50.0,"measurements":{"S11_imag":0.0697879786634009,"S11_real":0.11959939538177566,"S12_imag":-0.2820494760489866,"S12_real":0.4134518710922877,"S21_imag":0.11201366122663228,"S21_real":-0.4258244924547545,"S22_imag":-0.004193267854043776,"S22_real":0.028964823536021114},"pointNum":7,"time":2.438674}
|
||||
\end{example}
|
||||
\item Spectrum analyzer non zero span sweeps:
|
||||
\begin{example}
|
||||
{"frequency":2182396.0,"measurements":{"PORT1":7.343487141042715e-06,"PORT2":6.78117066854611e-06},"pointNum":445}
|
||||
\end{example}
|
||||
\item Spectrum analyzer zero span sweeps:
|
||||
\begin{example}
|
||||
{"measurements":{"PORT1":2.595309979369631e-06,"PORT2":1.4385256008608849e-06},"pointNum":7,"time":0.344095}
|
||||
\end{example}
|
||||
\end{itemize}
|
||||
|
||||
For zero span sweeps, the time in seconds since the beginning of the sweep is given instead of a frequency of power level. The time is always relative to point 0 of the current sweep and point 0 will have a time of 0.
|
||||
|
||||
\end{document}
|
||||
|
|
|
|||
57
Documentation/UserManual/SCPI_Examples/capture_live_data.py
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import time
|
||||
from libreVNA import libreVNA
|
||||
|
||||
# Create the control instance
|
||||
vna = libreVNA('localhost', 19542)
|
||||
|
||||
# Quick connection check (should print "LibreVNA-GUI")
|
||||
print(vna.query("*IDN?"))
|
||||
|
||||
# Make sure we are connecting to a device (just to be sure, with default settings the LibreVNA-GUI auto-connects)
|
||||
vna.cmd(":DEV:CONN")
|
||||
dev = vna.query(":DEV:CONN?")
|
||||
if dev == "Not connected":
|
||||
print("Not connected to any device, aborting")
|
||||
exit(-1)
|
||||
else:
|
||||
print("Connected to "+dev)
|
||||
|
||||
# Capture live data as it is coming in. Stop acquisition for now
|
||||
vna.cmd(":VNA:ACQ:STOP")
|
||||
|
||||
# switch to VNA mode, set up the sweep parameters
|
||||
print("Setting up the sweep...")
|
||||
vna.cmd(":DEV:MODE VNA")
|
||||
vna.cmd(":VNA:SWEEP FREQUENCY")
|
||||
vna.cmd(":VNA:STIM:LVL -10")
|
||||
vna.cmd(":VNA:ACQ:IFBW 100")
|
||||
vna.cmd(":VNA:ACQ:AVG 1")
|
||||
vna.cmd(":VNA:ACQ:POINTS 501")
|
||||
vna.cmd(":VNA:FREQuency:START 10000000")
|
||||
vna.cmd(":VNA:FREQuency:STOP 6000000000")
|
||||
|
||||
sweepComplete = False
|
||||
|
||||
|
||||
def callback(data):
|
||||
global sweepComplete
|
||||
print(data)
|
||||
if data["pointNum"] == 500:
|
||||
# this was the last point
|
||||
vna.remove_live_callback(19000, callback)
|
||||
sweepComplete = True
|
||||
|
||||
|
||||
# Set up the connection for the live data
|
||||
vna.add_live_callback(19000, callback)
|
||||
print("Starting the sweep...")
|
||||
vna.cmd(":VNA:ACQ:RUN")
|
||||
|
||||
while not sweepComplete:
|
||||
time.sleep(0.1)
|
||||
|
||||
print("Sweep complete")
|
||||
|
||||
|
||||
50
Documentation/UserManual/SCPI_Examples/deembedding_test.py
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import time
|
||||
from libreVNA import libreVNA
|
||||
|
||||
# Create the control instance
|
||||
vna = libreVNA('localhost', 19542)
|
||||
|
||||
# Quick connection check (should print "LibreVNA-GUI")
|
||||
print(vna.query("*IDN?"))
|
||||
|
||||
vna.cmd(":VNA:DEEMB:CLEAR")
|
||||
vna.cmd(":VNA:DEEMB:NEW PORT_EXTENSION")
|
||||
vna.cmd(":VNA:DEEMB:NEW 2XTHRU")
|
||||
vna.cmd(":VNA:DEEMB:NEW MATCHING_NETWORK")
|
||||
vna.cmd(":VNA:DEEMB:NEW IMPEDANCE_RENORMALIZATION")
|
||||
|
||||
print("Number of total deembedding options:")
|
||||
num_options = int(vna.query(":VNA:DEEMB:NUM?"))
|
||||
print(num_options)
|
||||
|
||||
for i in range(1, num_options+1):
|
||||
option_name = vna.query(":VNA:DEEMB:TYPE? "+str(i))
|
||||
print("Option "+str(i)+": "+option_name)
|
||||
|
||||
# edit port extension
|
||||
vna.cmd(":VNA:DEEMB:1:PORT 2")
|
||||
vna.cmd(":VNA:DEEMB:1:DELAY 0.00002")
|
||||
vna.cmd(":VNA:DEEMB:1:DCLOSS 1")
|
||||
vna.cmd(":VNA:DEEMB:1:LOSS 3")
|
||||
vna.cmd(":VNA:DEEMB:1:FREQUENCY 5000000000")
|
||||
|
||||
vna.cmd(":VNA:DEEMB:3:PORT 3")
|
||||
vna.cmd(":VNA:DEEMB:3:CLEAR")
|
||||
vna.cmd(":VNA:DEEMB:3:ADD FALSE")
|
||||
vna.cmd(":VNA:DEEMB:3:NEW ParallelC")
|
||||
vna.cmd(":VNA:DEEMB:3:NEW SeriesR")
|
||||
vna.cmd(":VNA:DEEMB:3:NEW ParallelL")
|
||||
vna.cmd(":VNA:DEEMB:3:NEW SeriesL")
|
||||
vna.cmd(":VNA:DEEMB:3:NEW touchstone_shunt")
|
||||
|
||||
vna.cmd(":VNA:DEEMB:3:1:VALUE 0.0001")
|
||||
vna.cmd(":VNA:DEEMB:3:2:VALUE 0.00002")
|
||||
vna.cmd(":VNA:DEEMB:3:3:VALUE 0.000003")
|
||||
vna.cmd(":VNA:DEEMB:3:4:VALUE 0.000004")
|
||||
|
||||
vna.cmd(":VNA:DEEMB:3:5:FILE TEST.S2P")
|
||||
|
||||
vna.cmd(":VNA:DEEMB:4:IMPedance 75")
|
||||
|
||||
139
Documentation/UserManual/SCPI_Examples/libreVNA.py
Normal file → Executable file
|
|
@ -1,10 +1,16 @@
|
|||
import re
|
||||
import socket
|
||||
from asyncio import IncompleteReadError # only import the exception class
|
||||
import time
|
||||
import threading
|
||||
import json
|
||||
|
||||
class SocketStreamReader:
|
||||
def __init__(self, sock: socket.socket):
|
||||
def __init__(self, sock: socket.socket, default_timeout=1):
|
||||
self._sock = sock
|
||||
self._sock.setblocking(0)
|
||||
self._recv_buffer = bytearray()
|
||||
self.default_timeout = default_timeout
|
||||
|
||||
def read(self, num_bytes: int = -1) -> bytes:
|
||||
raise NotImplementedError
|
||||
|
|
@ -19,12 +25,14 @@ class SocketStreamReader:
|
|||
pos += n
|
||||
return bytes(buf)
|
||||
|
||||
def readline(self) -> bytes:
|
||||
return self.readuntil(b"\n")
|
||||
def readline(self, timeout=None) -> bytes:
|
||||
return self.readuntil(b"\n", timeout=timeout)
|
||||
|
||||
def readuntil(self, separator: bytes = b"\n") -> bytes:
|
||||
def readuntil(self, separator: bytes = b"\n", timeout=None) -> bytes:
|
||||
if len(separator) != 1:
|
||||
raise ValueError("Only separators of length 1 are supported.")
|
||||
if timeout is None:
|
||||
timeout = self.default_timeout
|
||||
|
||||
chunk = bytearray(4096)
|
||||
start = 0
|
||||
|
|
@ -32,10 +40,13 @@ class SocketStreamReader:
|
|||
bytes_read = self._recv_into(memoryview(buf))
|
||||
assert bytes_read == len(buf)
|
||||
|
||||
time_limit = time.time() + timeout
|
||||
while True:
|
||||
idx = buf.find(separator, start)
|
||||
if idx != -1:
|
||||
break
|
||||
elif time.time() > time_limit:
|
||||
raise Exception("Timed out waiting for response from GUI")
|
||||
|
||||
start = len(self._recv_buffer)
|
||||
bytes_read = self._recv_into(memoryview(chunk))
|
||||
|
|
@ -53,36 +64,121 @@ class SocketStreamReader:
|
|||
self._recv_buffer = self._recv_buffer[bytes_read:]
|
||||
if bytes_read == len(view):
|
||||
return bytes_read
|
||||
bytes_read += self._sock.recv_into(view[bytes_read:])
|
||||
try:
|
||||
bytes_read += self._sock.recv_into(view[bytes_read:], 0)
|
||||
except:
|
||||
pass
|
||||
return bytes_read
|
||||
|
||||
class libreVNA:
|
||||
def __init__(self, host='localhost', port=19542):
|
||||
def __init__(self, host='localhost', port=19542,
|
||||
check_cmds=True, timeout=1):
|
||||
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
self.host = host
|
||||
try:
|
||||
self.sock.connect((host, port))
|
||||
except:
|
||||
raise Exception("Unable to connect to LibreVNA-GUI. Make sure it is running and the TCP server is enabled.")
|
||||
self.reader = SocketStreamReader(self.sock)
|
||||
self.reader = SocketStreamReader(self.sock,
|
||||
default_timeout=timeout)
|
||||
self.default_check_cmds = check_cmds
|
||||
self.live_threads = {}
|
||||
self.live_callbacks = {}
|
||||
|
||||
def __del__(self):
|
||||
self.sock.close()
|
||||
|
||||
def __read_response(self):
|
||||
return self.reader.readline().decode().rstrip()
|
||||
def __read_response(self, timeout=None):
|
||||
return self.reader.readline(timeout=timeout).decode().rstrip()
|
||||
|
||||
def cmd(self, cmd):
|
||||
def cmd(self, cmd, check=None, timeout=None):
|
||||
self.sock.sendall(cmd.encode())
|
||||
self.sock.send(b"\n")
|
||||
self.__read_response()
|
||||
if check or (check is None and self.default_check_cmds):
|
||||
status = self.get_status(timeout=timeout)
|
||||
if status & 0x20:
|
||||
raise Exception("Command Error")
|
||||
if status & 0x10:
|
||||
raise Exception("Execution Error")
|
||||
if status & 0x08:
|
||||
raise Exception("Device Error")
|
||||
if status & 0x04:
|
||||
raise Exception("Query Error")
|
||||
return status
|
||||
else:
|
||||
return None
|
||||
|
||||
def query(self, query):
|
||||
def query(self, query, timeout=None):
|
||||
self.sock.sendall(query.encode())
|
||||
self.sock.send(b"\n")
|
||||
return self.__read_response()
|
||||
return self.__read_response(timeout=timeout)
|
||||
|
||||
def get_status(self, timeout=None):
|
||||
resp = self.query("*ESR?", timeout=timeout)
|
||||
if not re.match(r'^\d+$', resp):
|
||||
raise Exception("Expected numeric response from *ESR? but got "
|
||||
f"'{resp}'")
|
||||
status = int(resp)
|
||||
if status < 0 or status > 255:
|
||||
raise Exception(f"*ESR? returned invalid value {status}.")
|
||||
return status
|
||||
|
||||
def add_live_callback(self, port, callback):
|
||||
# check if we already have a thread handling this connection
|
||||
if not port in self.live_threads:
|
||||
# needs to create the connection and thread first
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
try:
|
||||
sock.connect((self.host, port))
|
||||
except:
|
||||
raise Exception("Unable to connect to streaming server at port {}. Make sure it is enabled.".format(port))
|
||||
|
||||
self.live_callbacks[port] = [callback]
|
||||
self.live_threads[port] = threading.Thread(target=self.__live_thread, args=(sock, port))
|
||||
self.live_threads[port].start()
|
||||
else:
|
||||
# thread already existed, simply add to list
|
||||
self.live_callbacks[port].append(callback)
|
||||
|
||||
def remove_live_callback(self, port, callback):
|
||||
if port in self.live_callbacks:
|
||||
# remove all matching callbacks from the list
|
||||
self.live_callbacks[port] = [cb for cb in self.live_callbacks[port] if cb != callback]
|
||||
# if the list is now empty, the thread will exit
|
||||
if len(self.live_callbacks) == 0:
|
||||
self.live_threads[port].join()
|
||||
del self.live_threads[port]
|
||||
|
||||
def __live_thread(self, sock, port):
|
||||
reader = SocketStreamReader(sock, default_timeout=0.1)
|
||||
while len(self.live_callbacks[port]) > 0:
|
||||
try:
|
||||
line = reader.readline().decode().rstrip()
|
||||
# determine whether this is data from the VNA or spectrum analyzer
|
||||
data = json.loads(line)
|
||||
if "Z0" in data:
|
||||
# This is VNA data which has the imag/real parts of the S-parameters split into two float values.
|
||||
# This was necessary because json does not support complex number. But python does -> convert back
|
||||
# to complex
|
||||
measurements = {}
|
||||
for meas in data["measurements"].keys():
|
||||
if meas.endswith("_imag"):
|
||||
# ignore
|
||||
continue
|
||||
name = meas.removesuffix("_real")
|
||||
real = data["measurements"][meas]
|
||||
imag = data["measurements"][name+"_imag"]
|
||||
measurements[name] = complex(real, imag)
|
||||
data["measurements"] = measurements
|
||||
for cb in self.live_callbacks[port]:
|
||||
cb(data)
|
||||
except:
|
||||
# ignore timeouts
|
||||
pass
|
||||
|
||||
|
||||
@staticmethod
|
||||
def parse_trace_data(data):
|
||||
def parse_VNA_trace_data(data):
|
||||
ret = []
|
||||
# Remove brackets (order of data implicitly known)
|
||||
data = data.replace(']','').replace('[','')
|
||||
|
|
@ -97,3 +193,18 @@ class libreVNA:
|
|||
ret.append((freq, complex(real, imag)))
|
||||
return ret
|
||||
|
||||
@staticmethod
|
||||
def parse_SA_trace_data(data):
|
||||
ret = []
|
||||
# Remove brackets (order of data implicitly known)
|
||||
data = data.replace(']','').replace('[','')
|
||||
values = data.split(',')
|
||||
if int(len(values) / 2) * 2 != len(values):
|
||||
# number of values must be a multiple of two (frequency, dBm)
|
||||
raise Exception("Invalid input data: expected tuples of two values each")
|
||||
for i in range(0, len(values), 2):
|
||||
freq = float(values[i])
|
||||
dBm = float(values[i+1])
|
||||
ret.append((freq, dBm))
|
||||
return ret
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ data = vna.query(":VNA:TRACE:DATA? S11")
|
|||
|
||||
# Returned data is just a string containing all the measurement points.
|
||||
# Parsing the data returns a list containing frequency/complex tuples
|
||||
S11 = vna.parse_trace_data(data)
|
||||
S11 = vna.parse_VNA_trace_data(data)
|
||||
|
||||
for x in S11:
|
||||
print(x)
|
||||
|
|
|
|||
2
Documentation/UserManual/Screenshots/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
tex
|
||||
|
||||
BIN
Documentation/UserManual/Screenshots/CalibrationKitDialog.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 131 KiB |
BIN
Documentation/UserManual/Screenshots/Cfirst.pdf
Normal file
BIN
Documentation/UserManual/Screenshots/CompoundDeviceEdit.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
Documentation/UserManual/Screenshots/CompoundDeviceList.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 34 KiB |
BIN
Documentation/UserManual/Screenshots/DeembeddingTwoThru.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
Documentation/UserManual/Screenshots/FromFile.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
Documentation/UserManual/Screenshots/FromMath.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
Documentation/UserManual/Screenshots/GraphEmptyTile.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
Documentation/UserManual/Screenshots/GraphEyeDiagram.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
Documentation/UserManual/Screenshots/GraphEyeDiagramSetup.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
Documentation/UserManual/Screenshots/GraphPolarchartSetup.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
Documentation/UserManual/Screenshots/GraphPolarplot.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
Documentation/UserManual/Screenshots/GraphSettings.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
Documentation/UserManual/Screenshots/GraphSmithchart.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
Documentation/UserManual/Screenshots/GraphSmithchartSetup.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
Documentation/UserManual/Screenshots/GraphWaterfall.png
Normal file
|
After Width: | Height: | Size: 157 KiB |
BIN
Documentation/UserManual/Screenshots/GraphWaterfallSetup.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
Documentation/UserManual/Screenshots/GraphXYplot.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
Documentation/UserManual/Screenshots/GraphXYplotLimit.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
Documentation/UserManual/Screenshots/GraphXYplotLine.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
Documentation/UserManual/Screenshots/GraphXYplotSetup.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
Documentation/UserManual/Screenshots/IsolationMeasurement.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
Documentation/UserManual/Screenshots/Lfirst.pdf
Normal file
BIN
Documentation/UserManual/Screenshots/LineMeasurement.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
Documentation/UserManual/Screenshots/LineStandardDialog.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
Documentation/UserManual/Screenshots/LiveCapture.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
Documentation/UserManual/Screenshots/LoadMeasurement.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
Documentation/UserManual/Screenshots/LoadStandardDialog.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerBandpassGraph.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerBandpassTable.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerDelta.png
Normal file
|
After Width: | Height: | Size: 8 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerDock.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerExample.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerHighpassGraph.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerHighpassTable.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerLowpassGraph.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerLowpassTable.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerManual.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerMaximum.png
Normal file
|
After Width: | Height: | Size: 8.3 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerMinimum.png
Normal file
|
After Width: | Height: | Size: 7.7 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerP1dBGraph.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerP1dBTable.png
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerPeakGraph.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerPeakTable.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerPhasenoiseGraph.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerPhasenoiseTable.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerPreferences.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerTOIGraph.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
Documentation/UserManual/Screenshots/MarkerTOITable.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
Documentation/UserManual/Screenshots/MathOpCustomExpression.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
Documentation/UserManual/Screenshots/MathOpDFT.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
Documentation/UserManual/Screenshots/MathOpMedianFilter.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
Documentation/UserManual/Screenshots/MathOpTDR.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
Documentation/UserManual/Screenshots/MathOpTimeGate.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
Documentation/UserManual/Screenshots/OpenMeasurement.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
Documentation/UserManual/Screenshots/OpenStandardDialog.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
Documentation/UserManual/Screenshots/ReflectMeasurement.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
Documentation/UserManual/Screenshots/ReflectStandardDialog.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
Documentation/UserManual/Screenshots/ShortMeasurement.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
Documentation/UserManual/Screenshots/ShortStandardDialog.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
Documentation/UserManual/Screenshots/SlidingLoadMeasurement.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
Documentation/UserManual/Screenshots/ThroughMeasurement.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
Documentation/UserManual/Screenshots/ThroughStandardDialog.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 36 KiB |