Compare commits
575 commits
| 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 | ||
|
|
5a1e29ab73 | ||
|
|
541b10f494 | ||
|
|
63ebbf8348 | ||
|
|
101819fd36 | ||
|
|
f56cb40e9c | ||
|
|
d43a1e6e38 | ||
|
|
2ef913f073 | ||
|
|
b20e5598be | ||
|
|
96f8b6c90a | ||
|
|
fa7d789935 | ||
|
|
ba7ec1914d | ||
|
|
d8da82c74d | ||
|
|
8d66770acf | ||
|
|
a58b705f08 | ||
|
|
fc1d006edd | ||
|
|
858e945373 | ||
|
|
d2f1ca8f95 | ||
|
|
8dd747af62 | ||
|
|
e41e321309 | ||
|
|
9cf76c9681 | ||
|
|
8301448343 | ||
|
|
cb0e553a17 | ||
|
|
00ef868671 | ||
|
|
ab828ec292 | ||
|
|
0e0173f62a | ||
|
|
dced8105f2 | ||
|
|
5c1180e443 | ||
|
|
6e38aaddb8 | ||
|
|
b442736cb5 | ||
|
|
623aa2b29a | ||
|
|
1c607d2c42 | ||
|
|
0ca87ec867 | ||
|
|
2b591aa362 | ||
|
|
4107c6ca73 | ||
|
|
0281f13ba6 | ||
|
|
c05d248f83 | ||
|
|
5137457545 | ||
|
|
71239842f6 | ||
|
|
33726a815a | ||
|
|
77bdd7fd4b | ||
|
|
75ebed2b5d | ||
|
|
0f22bd1287 | ||
|
|
adc873e776 | ||
|
|
73e26a25c4 | ||
|
|
7b3aa6e158 | ||
|
|
4d818db64c | ||
|
|
58918f81c1 | ||
|
|
5b26a4a9c1 | ||
|
|
047f6ce981 | ||
|
|
74e6a439af | ||
|
|
90ac9c57e1 | ||
|
|
a530cea085 | ||
|
|
f0a40417e4 | ||
|
|
6a27d39444 | ||
|
|
1c6422b524 | ||
|
|
181ba1d6bd |
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:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: checkboxes
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
label: Confirming that you haven´t forgot to include configuration files (if applicable)
|
value: |
|
||||||
options:
|
Please attach the following files if applicable:
|
||||||
- label: Setup file
|
- Setup file
|
||||||
- label: Calibration file
|
- File->Save Setup
|
||||||
- label: Touchstone file of measurements
|
- If available, make sure that "include datapoints" under "Window->Preferences->Debug->Trace saving" is enabled
|
||||||
|
- Calibration file
|
||||||
|
|
|
||||||
171
.github/workflows/Build.yml
vendored
|
|
@ -4,38 +4,39 @@ on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
- embedded_firmware_ci
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
PC_Application_Ubuntu:
|
PC_Application_Ubuntu:
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
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
|
- name: Get build timestamp
|
||||||
id: id_date
|
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
|
- name: Get app version
|
||||||
id: id_version
|
id: id_version
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application
|
cd Software/PC_Application/LibreVNA-GUI
|
||||||
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||||
fw_minor=`grep -oP '(?<=FW_MINOR=)[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`
|
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
|
- name: Build application
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application
|
cd Software/PC_Application/LibreVNA-GUI
|
||||||
|
export QT_SELECT=qt6
|
||||||
qmake LibreVNA-GUI.pro
|
qmake LibreVNA-GUI.pro
|
||||||
make -j9
|
make -j9
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
@ -43,101 +44,138 @@ jobs:
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
env:
|
env:
|
||||||
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: LibreVNA-GUI-Ubuntu-${{env.LIBREVNA_VERSION}}
|
name: LibreVNA-GUI-Ubuntu-${{env.LIBREVNA_VERSION}}
|
||||||
path: Software/PC_Application/LibreVNA-GUI
|
path: Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI
|
||||||
|
|
||||||
|
PC_Application_RPi5:
|
||||||
|
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 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:
|
PC_Application_Windows:
|
||||||
runs-on: windows-2019
|
runs-on: windows-2022
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v4
|
||||||
- uses: msys2/setup-msys2@v2
|
- uses: msys2/setup-msys2@v2
|
||||||
|
|
||||||
- name: Install Qt
|
- name: Install Qt
|
||||||
uses: jurplel/install-qt-action@v2
|
uses: jurplel/install-qt-action@v4
|
||||||
with:
|
with:
|
||||||
version: '5.15.1'
|
version: '6.2.4'
|
||||||
arch: 'win64_mingw81'
|
arch: 'win64_mingw'
|
||||||
|
|
||||||
- name: Download libusb
|
- name: Download libusb
|
||||||
run: |
|
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
|
7z x libusb.7z -r -olibusb
|
||||||
Xcopy /E /I /Y libusb\include ..\Qt\5.15.1\mingw81_64\include
|
Xcopy /E /I /Y libusb\include %QT_ROOT_DIR%\include
|
||||||
Xcopy /E /I /Y libusb\MinGW64\static Software\PC_Application
|
Xcopy /E /I /Y libusb\MinGW64\static\libusb-1.0.a Software\PC_Application\LibreVNA-GUI
|
||||||
shell: cmd
|
shell: cmd
|
||||||
|
|
||||||
- name: Get build timestamp
|
- name: Get build timestamp
|
||||||
shell: msys2 {0}
|
shell: msys2 {0}
|
||||||
id: id_date
|
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
|
- name: Get app version
|
||||||
id: id_version
|
id: id_version
|
||||||
shell: msys2 {0}
|
shell: msys2 {0}
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application
|
cd Software/PC_Application/LibreVNA-GUI
|
||||||
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||||
fw_minor=`grep -oP '(?<=FW_MINOR=)[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`
|
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
|
- name: Build application
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application
|
cd Software/PC_Application/LibreVNA-GUI
|
||||||
qmake LibreVNA-GUI.pro
|
qmake LibreVNA-GUI.pro
|
||||||
make -j9
|
make -j9
|
||||||
shell: cmd
|
shell: cmd
|
||||||
|
|
||||||
- name: Deploy application
|
- name: Deploy application
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application/release
|
cd Software/PC_Application/LibreVNA-GUI/release
|
||||||
del *.o *.cpp
|
del *.o *.cpp
|
||||||
windeployqt.exe .
|
windeployqt.exe .
|
||||||
copy ..\..\..\..\Qt\5.15.1\mingw81_64\bin\libwinpthread-1.dll .
|
copy %QT_ROOT_DIR%\bin\libwinpthread-1.dll .
|
||||||
copy ..\..\..\..\Qt\5.15.1\mingw81_64\bin\libgcc_s_seh-1.dll .
|
copy %QT_ROOT_DIR%\bin\libgcc_s_seh-1.dll .
|
||||||
copy "..\..\..\..\Qt\5.15.1\mingw81_64\bin\libstdc++-6.dll" .
|
copy %QT_ROOT_DIR%\bin\Qt6OpenGL.dll .
|
||||||
copy ..\..\..\..\Qt\5.15.1\mingw81_64\bin\Qt5OpenGL.dll .
|
|
||||||
shell: cmd
|
shell: cmd
|
||||||
|
|
||||||
- name: Upload
|
- name: Upload
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v4
|
||||||
env:
|
env:
|
||||||
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
||||||
with:
|
with:
|
||||||
name: GUI_Windows-${{env.LIBREVNA_VERSION}}
|
name: GUI_Windows-${{env.LIBREVNA_VERSION}}
|
||||||
path: Software/PC_Application/release
|
path: Software/PC_Application/LibreVNA-GUI/release
|
||||||
|
|
||||||
PC_Application_OSX:
|
PC_Application_OSX:
|
||||||
runs-on: macos-10.15
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
brew install qt@5 libusb
|
brew install qt@6 pcre
|
||||||
|
|
||||||
- name: Set Environment
|
- name: Set Environment
|
||||||
run: |
|
run: |
|
||||||
echo "/usr/local/opt/qt@5/bin" >> $GITHUB_PATH
|
echo "/usr/local/opt/qt@6/bin" >> $GITHUB_PATH
|
||||||
|
|
||||||
- name: Get build timestamp
|
- name: Get build timestamp
|
||||||
id: id_date
|
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
|
- name: Get app version
|
||||||
id: id_version
|
id: id_version
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application
|
cd Software/PC_Application/LibreVNA-GUI
|
||||||
fw_major=`pcregrep -o '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
fw_major=`pcregrep -o '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||||
fw_minor=`pcregrep -o '(?<=FW_MINOR=)[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`
|
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
|
- name: Build application
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application
|
cd Software/PC_Application/LibreVNA-GUI
|
||||||
qmake LibreVNA-GUI.pro
|
qmake LibreVNA-GUI.pro
|
||||||
make -j9
|
make -j9
|
||||||
macdeployqt LibreVNA-GUI.app
|
macdeployqt LibreVNA-GUI.app
|
||||||
|
|
@ -147,15 +185,58 @@ jobs:
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
env:
|
env:
|
||||||
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: LibreVNA-GUI-OSX-${{env.LIBREVNA_VERSION}}
|
name: LibreVNA-GUI-OSX-latest-${{env.LIBREVNA_VERSION}}
|
||||||
path: Software/PC_Application/LibreVNA-GUI.zip
|
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:
|
Embedded_Firmware:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install toolchain
|
- name: Install toolchain
|
||||||
run: |
|
run: |
|
||||||
|
|
@ -163,7 +244,7 @@ jobs:
|
||||||
|
|
||||||
- name: Get build timestamp
|
- name: Get build timestamp
|
||||||
id: id_date
|
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
|
- name: Get app version
|
||||||
id: id_version
|
id: id_version
|
||||||
|
|
@ -173,7 +254,7 @@ jobs:
|
||||||
fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' Makefile`
|
fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' Makefile`
|
||||||
fw_patch=`grep -oP '(?<=FW_PATCH=)[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"`
|
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
|
- name: Build application
|
||||||
run: |
|
run: |
|
||||||
|
|
@ -188,7 +269,7 @@ jobs:
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
- name: Upload
|
- name: Upload
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v4
|
||||||
env:
|
env:
|
||||||
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
||||||
with:
|
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
|
||||||
|
|
||||||
155
.github/workflows/Release_tag_stable.yml
vendored
|
|
@ -8,29 +8,31 @@ on:
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
PC_Application_Ubuntu:
|
PC_Application_Ubuntu:
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-22.04
|
||||||
outputs:
|
outputs:
|
||||||
upload_url: ${{ steps.bump_release.outputs.upload_url }}
|
upload_url: ${{ steps.bump_release.outputs.upload_url }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
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
|
- name: Get app version
|
||||||
id: id_version
|
id: id_version
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application
|
cd Software/PC_Application/LibreVNA-GUI
|
||||||
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||||
fw_minor=`grep -oP '(?<=FW_MINOR=)[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`
|
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
|
- name: Build application
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application
|
cd Software/PC_Application/LibreVNA-GUI
|
||||||
|
export QT_SELECT=qt6
|
||||||
qmake LibreVNA-GUI.pro
|
qmake LibreVNA-GUI.pro
|
||||||
make -j9
|
make -j9
|
||||||
zip LibreVNA-GUI.zip LibreVNA-GUI
|
zip LibreVNA-GUI.zip LibreVNA-GUI
|
||||||
|
|
@ -57,57 +59,95 @@ jobs:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
upload_url: ${{ steps.bump_release.outputs.upload_url }}
|
upload_url: ${{ steps.bump_release.outputs.upload_url }}
|
||||||
asset_path: ./Software/PC_Application/LibreVNA-GUI.zip
|
asset_path: ./Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI.zip
|
||||||
asset_name: LibreVNA-GUI-Ubuntu-${{env.LIBREVNA_VERSION}}.zip
|
asset_name: LibreVNA-GUI-Ubuntu-${{env.LIBREVNA_VERSION}}.zip
|
||||||
asset_content_type: application/tar+gzip
|
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:
|
PC_Application_Windows:
|
||||||
needs: PC_Application_Ubuntu
|
needs: PC_Application_Ubuntu
|
||||||
runs-on: windows-latest
|
runs-on: windows-2022
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v4
|
||||||
- uses: msys2/setup-msys2@v2
|
- uses: msys2/setup-msys2@v2
|
||||||
|
|
||||||
- name: Install Qt
|
- name: Install Qt
|
||||||
uses: jurplel/install-qt-action@v2
|
uses: jurplel/install-qt-action@v4
|
||||||
with:
|
with:
|
||||||
version: '5.15.1'
|
version: '6.2.4'
|
||||||
arch: 'win64_mingw81'
|
arch: 'win64_mingw'
|
||||||
|
|
||||||
- name: Download libusb
|
- name: Download libusb
|
||||||
run: |
|
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
|
7z x libusb.7z -r -olibusb
|
||||||
Xcopy /E /I /Y libusb\include ..\Qt\5.15.1\mingw81_64\include
|
Xcopy /E /I /Y libusb\include %QT_ROOT_DIR%\include
|
||||||
Xcopy /E /I /Y libusb\MinGW64\static Software\PC_Application
|
Xcopy /E /I /Y libusb\MinGW64\static\libusb-1.0.a Software\PC_Application\LibreVNA-GUI
|
||||||
shell: cmd
|
shell: cmd
|
||||||
|
|
||||||
- name: Get app version
|
- name: Get app version
|
||||||
id: id_version
|
id: id_version
|
||||||
shell: msys2 {0}
|
shell: msys2 {0}
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application
|
cd Software/PC_Application/LibreVNA-GUI
|
||||||
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
fw_major=`grep -oP '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||||
fw_minor=`grep -oP '(?<=FW_MINOR=)[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`
|
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
|
- name: Build application
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application
|
cd Software/PC_Application/LibreVNA-GUI
|
||||||
qmake LibreVNA-GUI.pro
|
qmake LibreVNA-GUI.pro
|
||||||
make -j9
|
make -j9
|
||||||
shell: cmd
|
shell: cmd
|
||||||
|
|
||||||
- name: Deploy application
|
- name: Deploy application
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application/release
|
cd Software/PC_Application/LibreVNA-GUI/release
|
||||||
del *.o *.cpp
|
del *.o *.cpp
|
||||||
windeployqt.exe .
|
windeployqt.exe .
|
||||||
copy ..\..\..\..\Qt\5.15.1\mingw81_64\bin\libwinpthread-1.dll .
|
copy %QT_ROOT_DIR%\bin\libwinpthread-1.dll .
|
||||||
copy ..\..\..\..\Qt\5.15.1\mingw81_64\bin\libgcc_s_seh-1.dll .
|
copy %QT_ROOT_DIR%\bin\libgcc_s_seh-1.dll .
|
||||||
copy "..\..\..\..\Qt\5.15.1\mingw81_64\bin\libstdc++-6.dll" .
|
copy %QT_ROOT_DIR%\bin\Qt6OpenGL.dll .
|
||||||
copy ..\..\..\..\Qt\5.15.1\mingw81_64\bin\Qt5OpenGL.dll .
|
|
||||||
shell: cmd
|
shell: cmd
|
||||||
|
|
||||||
- name: Zip app
|
- name: Zip app
|
||||||
|
|
@ -115,7 +155,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
LIBREVNA_VERSION: "${{steps.id_version.outputs.app_version}}"
|
||||||
run: |
|
run: |
|
||||||
7z a LibreVNA-GUI_Windows-${{env.LIBREVNA_VERSION}}.zip ./Software/PC_Application/release
|
7z a LibreVNA-GUI_Windows-${{env.LIBREVNA_VERSION}}.zip ./Software/PC_Application/LibreVNA-GUI/release
|
||||||
|
|
||||||
- name: 'Upload release asset'
|
- name: 'Upload release asset'
|
||||||
uses: actions/upload-release-asset@v1
|
uses: actions/upload-release-asset@v1
|
||||||
|
|
@ -130,30 +170,30 @@ jobs:
|
||||||
|
|
||||||
PC_Application_OSX:
|
PC_Application_OSX:
|
||||||
needs: PC_Application_Ubuntu
|
needs: PC_Application_Ubuntu
|
||||||
runs-on: macos-10.15
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
brew install qt@5 libusb
|
brew install qt@6 pcre
|
||||||
|
|
||||||
- name: Set Environment
|
- name: Set Environment
|
||||||
run: |
|
run: |
|
||||||
echo "/usr/local/opt/qt@5/bin" >> $GITHUB_PATH
|
echo "/usr/local/opt/qt@6/bin" >> $GITHUB_PATH
|
||||||
|
|
||||||
- name: Get app version
|
- name: Get app version
|
||||||
id: id_version
|
id: id_version
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application
|
cd Software/PC_Application/LibreVNA-GUI
|
||||||
fw_major=`pcregrep -o '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
fw_major=`pcregrep -o '(?<=FW_MAJOR=)[0-9]+' LibreVNA-GUI.pro`
|
||||||
fw_minor=`pcregrep -o '(?<=FW_MINOR=)[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`
|
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
|
- name: Build application
|
||||||
run: |
|
run: |
|
||||||
cd Software/PC_Application
|
cd Software/PC_Application/LibreVNA-GUI
|
||||||
qmake LibreVNA-GUI.pro
|
qmake LibreVNA-GUI.pro
|
||||||
make -j9
|
make -j9
|
||||||
macdeployqt LibreVNA-GUI.app
|
macdeployqt LibreVNA-GUI.app
|
||||||
|
|
@ -167,15 +207,58 @@ jobs:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
upload_url: ${{ needs.PC_Application_Ubuntu.outputs.upload_url }}
|
upload_url: ${{ needs.PC_Application_Ubuntu.outputs.upload_url }}
|
||||||
asset_path: ./Software/PC_Application/LibreVNA-GUI.zip
|
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
|
asset_content_type: application/tar+gzip
|
||||||
|
|
||||||
Embedded_Firmware:
|
Embedded_Firmware:
|
||||||
needs: PC_Application_Ubuntu
|
needs: PC_Application_Ubuntu
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install toolchain
|
- name: Install toolchain
|
||||||
run: |
|
run: |
|
||||||
|
|
@ -189,7 +272,7 @@ jobs:
|
||||||
fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' Makefile`
|
fw_minor=`grep -oP '(?<=FW_MINOR=)[0-9]+' Makefile`
|
||||||
fw_patch=`grep -oP '(?<=FW_PATCH=)[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"`
|
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
|
- name: Build application
|
||||||
run: |
|
run: |
|
||||||
|
|
|
||||||
35
.github/workflows/Test.yml
vendored
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
name: Unit_Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
Tests:
|
||||||
|
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 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
|
||||||
|
|
||||||
|
- name: Run Tests
|
||||||
|
run: |
|
||||||
|
cd Software/PC_Application/LibreVNA-Test
|
||||||
|
./LibreVNA-Test -platform offscreen
|
||||||
|
|
||||||
150
CHANGELOG.md
|
|
@ -1,5 +1,155 @@
|
||||||
# Changelog
|
# 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
|
## v1.4.0
|
||||||
|
|
||||||
- New features:
|
- New features:
|
||||||
|
|
|
||||||
|
|
@ -12,17 +12,17 @@ Creating all the different parts from the source code requires quite a few tools
|
||||||
## Building the PC application:
|
## Building the PC application:
|
||||||
* Install the required tools (Qt and libusb-1.0):
|
* 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:
|
* Build the application:
|
||||||
* either:
|
* either:
|
||||||
```
|
```
|
||||||
cd Software/PC_Application
|
cd Software/PC_Application/LibreVNA-GUI
|
||||||
qmake
|
qmake6
|
||||||
make
|
make
|
||||||
```
|
```
|
||||||
* or:
|
* 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
|
* Build the application with Qt Creator
|
||||||
|
|
||||||
## Building the MCU firmware:
|
## 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}
|
{geometry}
|
||||||
\usepackage{tikz}
|
\usepackage{tikz}
|
||||||
\usepackage{siunitx}
|
\usepackage{siunitx}
|
||||||
|
\usepackage{minibox}
|
||||||
\DeclareSIUnit{\belmilliwatt}{Bm}
|
\DeclareSIUnit{\belmilliwatt}{Bm}
|
||||||
\DeclareSIUnit{\dBm}{\deci\belmilliwatt}
|
\DeclareSIUnit{\dBm}{\deci\belmilliwatt}
|
||||||
|
|
||||||
|
|
@ -65,12 +66,17 @@ MOSI & in & MOSI for SPI communication/MOSI for PLL communication\\
|
||||||
MISO & out & MISO for SPI communication/MUX for PLL communication\\
|
MISO & out & MISO for SPI communication/MUX for PLL communication\\
|
||||||
NSS & in & Chip Select for SPI communication/LE for PLL communication\\
|
NSS & in & Chip Select for SPI communication/LE for PLL communication\\
|
||||||
INTR & out & Active high interrupt indicator\\
|
INTR & out & Active high interrupt indicator\\
|
||||||
RESET & in & FPGA reset\\
|
RESET\footnotemark & in & FPGA reset\\
|
||||||
AUX1 & in & Selector for direct communication with Source PLL\\
|
AUX1 & in & Selector for direct communication with Source PLL\\
|
||||||
AUX2 & in & Selector for direct communication with LO PLL\\
|
AUX2 & in & Selector for direct communication with LO PLL\\
|
||||||
AUX3 & in & Active low sweep enable. Has to be high when changing settings\\
|
AUX3 & in & Active low sweep enable. Has to be high when changing settings\\
|
||||||
|
Trigger In\footnotemark & in & Trigger input for synchronization across devices\\
|
||||||
|
Trigger Out\footnotemark & Out & Trigger output for synchronization across devices\\
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
\footnotetext[1]{Reset is named "MCU\_FPGA\_UNUSED1" in the schematic as this is a later software addition}
|
||||||
|
\footnotetext[2]{Trigger In is named "MCU\_FPGA\_UNUSED2" in the schematic as this is a later software addition}
|
||||||
|
\footnotetext[3]{Trigger Out is named "MCU\_FPGA\_UNUSED3" in the schematic as this is a later software addition}
|
||||||
Depending on the voltage on AUX1/AUX2 the SPI port controls either the FPGA or one of the MAX2871 PLLs:
|
Depending on the voltage on AUX1/AUX2 the SPI port controls either the FPGA or one of the MAX2871 PLLs:
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tabular}{ c|c|c }
|
\begin{tabular}{ c|c|c }
|
||||||
|
|
@ -343,9 +349,9 @@ The register contains the number of points per sweep negative one, e.g. set to 1
|
||||||
\rwbits{9}{2}{Window[1:0]}
|
\rwbits{9}{2}{Window[1:0]}
|
||||||
\rwbits{11}{1}{SCEN}
|
\rwbits{11}{1}{SCEN}
|
||||||
\rwbits{12}{1}{LCEN}
|
\rwbits{12}{1}{LCEN}
|
||||||
\robits{13}{2}{reserved}
|
\robits{13}{1}{reserved}
|
||||||
%\rwbits{13}{1}{EXP2}
|
%\rwbits{13}{1}{EXP2}
|
||||||
%\rwbits{14}{1}{EXP1}
|
\rwbits{14}{1}{SYM}
|
||||||
\rwbits{15}{1}{PSEN}
|
\rwbits{15}{1}{PSEN}
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
@ -373,7 +379,7 @@ Setting & Window type\\
|
||||||
\item \textbf{SCEN:}{Source chip enable}
|
\item \textbf{SCEN:}{Source chip enable}
|
||||||
\item \textbf{LCEN:}{LO chip enable}
|
\item \textbf{LCEN:}{LO chip enable}
|
||||||
%\item \textbf{EXP1:}{Excite Port1 during sweep}
|
%\item \textbf{EXP1:}{Excite Port1 during sweep}
|
||||||
%\item \textbf{EXP2:}{Excite Port2 during sweep}
|
\item \textbf{SYM:}{Sync master, see also section~\ref{synchronization}. If multiple devices are combined, exactly one must have this bit set.}
|
||||||
\item \textbf{PSEN:}{Port switch enable}
|
\item \textbf{PSEN:}{Port switch enable}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
|
@ -415,7 +421,7 @@ Each point in the sweep is done in stages. Each stage consists of (optionally) r
|
||||||
\begin{tikzpicture}
|
\begin{tikzpicture}
|
||||||
\bitrect{16}{16-\bit}
|
\bitrect{16}{16-\bit}
|
||||||
\rwbits{0}{3}{Stages}
|
\rwbits{0}{3}{Stages}
|
||||||
\rwbits{3}{1}{IH}
|
\rwbits{3}{1}{SYNC}
|
||||||
\robits{4}{6}{reserved}
|
\robits{4}{6}{reserved}
|
||||||
\rwbits{10}{3}{Port 1 stage}
|
\rwbits{10}{3}{Port 1 stage}
|
||||||
\rwbits{13}{3}{Port 2 stage}
|
\rwbits{13}{3}{Port 2 stage}
|
||||||
|
|
@ -423,7 +429,7 @@ Each point in the sweep is done in stages. Each stage consists of (optionally) r
|
||||||
\end{center}
|
\end{center}
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item \textbf{Stages} Number of stages per point - 1. Normally the number of stages is equal to the number of ports but it can also be less (e.g. if only S11 is measured).
|
\item \textbf{Stages} Number of stages per point - 1. Normally the number of stages is equal to the number of ports but it can also be less (e.g. if only S11 is measured).
|
||||||
\item \textbf{IH:} Individual halt: Sets the behavior of the "halt sweep" bit (see section~\ref{sweepconfig}). If 1, the sampling is halted before each stage. If 0, the sampling is only halted before the point and all stages are executed without additional halts inbetween.
|
\item \textbf{SYNC:} Enables synchronization mode (see section~\ref{synchronization}).
|
||||||
\item \textbf{Port 1 stage} Number of stage during which the source signal is routed to port 1. Must not have the same value as Port 2 stage.
|
\item \textbf{Port 1 stage} Number of stage during which the source signal is routed to port 1. Must not have the same value as Port 2 stage.
|
||||||
\item \textbf{Port 2 stage} Number of stage during which the source signal is routed to port 2. Must not have the same value as Port 1 stage.
|
\item \textbf{Port 2 stage} Number of stage during which the source signal is routed to port 2. Must not have the same value as Port 1 stage.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
@ -529,6 +535,26 @@ $$ f_{firstBin} = \frac{SR_{ADC} * DFT\_FIRST\_BIN}{2^{16}}$$
|
||||||
$$ \Delta f = \frac{SR_{ADC} * DFT\_FREQ\_SPACING}{2^{24}}$$
|
$$ \Delta f = \frac{SR_{ADC} * DFT\_FREQ\_SPACING}{2^{24}}$$
|
||||||
\end{itemize}
|
\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}
|
\section{SweepConfig}
|
||||||
\label{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.
|
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.
|
||||||
|
|
@ -537,7 +563,9 @@ The SweepConfig contains data for the source and LO1 PLL as well as the attenuat
|
||||||
\begin{tikzpicture}
|
\begin{tikzpicture}
|
||||||
\bitrect{16}{96-\bit}
|
\bitrect{16}{96-\bit}
|
||||||
\rwbits{0}{1}{HS}
|
\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{3}{3}{Samples}
|
||||||
\rwbits{6}{2}{SourceFilter}
|
\rwbits{6}{2}{SourceFilter}
|
||||||
\rwbits{8}{8}{LO M[11:4]}
|
\rwbits{8}{8}{LO M[11:4]}
|
||||||
|
|
@ -575,17 +603,17 @@ The SweepConfig contains data for the source and LO1 PLL as well as the attenuat
|
||||||
\end{center}
|
\end{center}
|
||||||
\begin{itemize}
|
\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{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
|
%\item \textbf{SettlingTime:} Amount of time between locking of PLLs and beginning of ADC sampling
|
||||||
\begin{center}
|
%\begin{center}
|
||||||
\begin{tabular}{ c|c }
|
%\begin{tabular}{ c|c }
|
||||||
Setting & Time\\
|
%Setting & Time\\
|
||||||
\hline
|
%\hline
|
||||||
00 & \SI{20}{\micro\second}\\
|
%00 & \SI{20}{\micro\second}\\
|
||||||
01 & \SI{60}{\micro\second}\\
|
%01 & \SI{60}{\micro\second}\\
|
||||||
10 & \SI{180}{\micro\second}\\
|
%10 & \SI{180}{\micro\second}\\
|
||||||
11 & \SI{540}{\micro\second}\\
|
%11 & \SI{540}{\micro\second}\\
|
||||||
\end{tabular}
|
%\end{tabular}
|
||||||
\end{center}
|
%\end{center}
|
||||||
\item \textbf{Samples:} Number of ADC samples to take
|
\item \textbf{Samples:} Number of ADC samples to take
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{tabular}{ c|c|c }
|
\begin{tabular}{ c|c|c }
|
||||||
|
|
@ -715,4 +743,37 @@ Each point in the sweep generates a sampling results for each stage (see section
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
|
\section{Synchronization}
|
||||||
|
\label{synchronization}
|
||||||
|
The FPGA supports synchronization of the sweep across multiple devices. This feature can be enabled by setting the SYNC bit in the sweep setup register (see section~\ref{reg:sweepsetup}). When enabled, the following conditions must be met:
|
||||||
|
\begin{itemize}
|
||||||
|
\item All participating devices must be connected in a loop via the trigger input and output pins. The order of the devices is not important.
|
||||||
|
\item All devices must use the same sweep settings with the exception of the "Port 1 stage" and "Port 2 stage" settings in the sweep setup register.
|
||||||
|
\item The port stages must be configured in such a way, that for each stage exactly one port is active in one device.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
The synchronization works by delaying sampling until the stimulus signal is present, even when generated by another device. For each sampling stage, performs the following steps:
|
||||||
|
\begin{itemize}
|
||||||
|
\item When the device is the synchronization master (SYM bit set):
|
||||||
|
\begin{itemize}
|
||||||
|
\item Set up source and 1.LO PLLs
|
||||||
|
\item If applicable: wait for the "resume sweep" command
|
||||||
|
\item Set the trigger output to high
|
||||||
|
\item Wait for high level on trigger input
|
||||||
|
\item Sample ADCs
|
||||||
|
\item Set the trigger output to low
|
||||||
|
\item Wait for low level on trigger input
|
||||||
|
\end{itemize}
|
||||||
|
\item When the device is the synchronization slave (SYM bit not set):
|
||||||
|
\begin{itemize}
|
||||||
|
\item Set 1.LO PLL
|
||||||
|
\item If applicable: wait for the "resume sweep" command
|
||||||
|
\item Wait for high level on trigger input
|
||||||
|
\item Set trigger output to high
|
||||||
|
\item Sample ADCs
|
||||||
|
\item Wait for low level on trigger input
|
||||||
|
\item Set the trigger output to low
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
\end{document}
|
\end{document}
|
||||||
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 |
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
|
import socket
|
||||||
from asyncio import IncompleteReadError # only import the exception class
|
from asyncio import IncompleteReadError # only import the exception class
|
||||||
|
import time
|
||||||
|
import threading
|
||||||
|
import json
|
||||||
|
|
||||||
class SocketStreamReader:
|
class SocketStreamReader:
|
||||||
def __init__(self, sock: socket.socket):
|
def __init__(self, sock: socket.socket, default_timeout=1):
|
||||||
self._sock = sock
|
self._sock = sock
|
||||||
|
self._sock.setblocking(0)
|
||||||
self._recv_buffer = bytearray()
|
self._recv_buffer = bytearray()
|
||||||
|
self.default_timeout = default_timeout
|
||||||
|
|
||||||
def read(self, num_bytes: int = -1) -> bytes:
|
def read(self, num_bytes: int = -1) -> bytes:
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
@ -19,12 +25,14 @@ class SocketStreamReader:
|
||||||
pos += n
|
pos += n
|
||||||
return bytes(buf)
|
return bytes(buf)
|
||||||
|
|
||||||
def readline(self) -> bytes:
|
def readline(self, timeout=None) -> bytes:
|
||||||
return self.readuntil(b"\n")
|
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:
|
if len(separator) != 1:
|
||||||
raise ValueError("Only separators of length 1 are supported.")
|
raise ValueError("Only separators of length 1 are supported.")
|
||||||
|
if timeout is None:
|
||||||
|
timeout = self.default_timeout
|
||||||
|
|
||||||
chunk = bytearray(4096)
|
chunk = bytearray(4096)
|
||||||
start = 0
|
start = 0
|
||||||
|
|
@ -32,10 +40,13 @@ class SocketStreamReader:
|
||||||
bytes_read = self._recv_into(memoryview(buf))
|
bytes_read = self._recv_into(memoryview(buf))
|
||||||
assert bytes_read == len(buf)
|
assert bytes_read == len(buf)
|
||||||
|
|
||||||
|
time_limit = time.time() + timeout
|
||||||
while True:
|
while True:
|
||||||
idx = buf.find(separator, start)
|
idx = buf.find(separator, start)
|
||||||
if idx != -1:
|
if idx != -1:
|
||||||
break
|
break
|
||||||
|
elif time.time() > time_limit:
|
||||||
|
raise Exception("Timed out waiting for response from GUI")
|
||||||
|
|
||||||
start = len(self._recv_buffer)
|
start = len(self._recv_buffer)
|
||||||
bytes_read = self._recv_into(memoryview(chunk))
|
bytes_read = self._recv_into(memoryview(chunk))
|
||||||
|
|
@ -53,36 +64,121 @@ class SocketStreamReader:
|
||||||
self._recv_buffer = self._recv_buffer[bytes_read:]
|
self._recv_buffer = self._recv_buffer[bytes_read:]
|
||||||
if bytes_read == len(view):
|
if bytes_read == len(view):
|
||||||
return bytes_read
|
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
|
return bytes_read
|
||||||
|
|
||||||
class libreVNA:
|
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.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
self.host = host
|
||||||
try:
|
try:
|
||||||
self.sock.connect((host, port))
|
self.sock.connect((host, port))
|
||||||
except:
|
except:
|
||||||
raise Exception("Unable to connect to LibreVNA-GUI. Make sure it is running and the TCP server is enabled.")
|
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):
|
def __del__(self):
|
||||||
self.sock.close()
|
self.sock.close()
|
||||||
|
|
||||||
def __read_response(self):
|
def __read_response(self, timeout=None):
|
||||||
return self.reader.readline().decode().rstrip()
|
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.sendall(cmd.encode())
|
||||||
self.sock.send(b"\n")
|
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.sendall(query.encode())
|
||||||
self.sock.send(b"\n")
|
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
|
@staticmethod
|
||||||
def parse_trace_data(data):
|
def parse_VNA_trace_data(data):
|
||||||
ret = []
|
ret = []
|
||||||
# Remove brackets (order of data implicitly known)
|
# Remove brackets (order of data implicitly known)
|
||||||
data = data.replace(']','').replace('[','')
|
data = data.replace(']','').replace('[','')
|
||||||
|
|
@ -97,3 +193,18 @@ class libreVNA:
|
||||||
ret.append((freq, complex(real, imag)))
|
ret.append((freq, complex(real, imag)))
|
||||||
return ret
|
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.
|
# Returned data is just a string containing all the measurement points.
|
||||||
# Parsing the data returns a list containing frequency/complex tuples
|
# 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:
|
for x in S11:
|
||||||
print(x)
|
print(x)
|
||||||
|
|
|
||||||
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 |