Compare commits
80 Commits
prd-contro
...
master-afs
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5032115b5d | ||
|
|
caebd4f05b | ||
|
|
b4e81218ab | ||
|
|
1633a45c9b | ||
|
|
65a0164ec0 | ||
|
|
0c30572f1e | ||
|
|
08597ff7ce | ||
|
|
8abdc957ed | ||
|
|
85b2f4eadd | ||
|
|
6294730bf8 | ||
|
|
f407578a44 | ||
|
|
ec21282ba0 | ||
|
|
38529ac0cc | ||
|
|
6db678b163 | ||
|
|
124b75dbde | ||
|
|
803d2eff4f | ||
|
|
29e5382c1e | ||
|
|
96436596d8 | ||
|
|
b3455947fd | ||
|
|
57fc201212 | ||
|
|
2abe5741eb | ||
|
|
ef063645ee | ||
|
|
4d0ea0f84e | ||
|
|
d7cba379cc | ||
|
|
f41e59b119 | ||
|
|
b919e6498f | ||
|
|
8039e6bcb4 | ||
|
|
4a928abc37 | ||
|
|
6c46acc6b6 | ||
|
|
94084fead0 | ||
|
|
e4dfdeb899 | ||
|
|
f41c0ee75c | ||
|
|
9fd258a745 | ||
|
|
49d7b71072 | ||
|
|
ba4d2458af | ||
|
|
407f9956fa | ||
|
|
33a5dea6a0 | ||
|
|
446f8b6afc | ||
|
|
d00fb92520 | ||
|
|
21a0c0c012 | ||
|
|
6f7bf0a5be | ||
|
|
193f0ab498 | ||
|
|
5c6b6e80c9 | ||
|
|
a2d56a7553 | ||
|
|
3eef38f56a | ||
|
|
159956e02f | ||
|
|
fb7853a5be | ||
|
|
cd34aa9100 | ||
|
|
4079d55aa5 | ||
|
|
7b80852017 | ||
|
|
68ab1b325d | ||
|
|
1cb3985c70 | ||
|
|
cf3b02cec2 | ||
|
|
c5da181fb7 | ||
|
|
528566e949 | ||
|
|
212ce180d1 | ||
|
|
261a994466 | ||
|
|
07b41211c7 | ||
|
|
0fc98c5e98 | ||
|
|
59da91d98c | ||
|
|
959ef1192c | ||
|
|
731ce8b3dd | ||
|
|
901d160c50 | ||
|
|
26bb36a333 | ||
|
|
8c4a966654 | ||
|
|
aea48c7d9e | ||
|
|
dac7987585 | ||
|
|
190f06b72c | ||
|
|
c5bae21436 | ||
|
|
e48e8767e5 | ||
|
|
de92de2994 | ||
|
|
282a3a5218 | ||
|
|
e52f465654 | ||
|
|
b27afc854e | ||
|
|
eabc48b95f | ||
|
|
f3be1e39db | ||
|
|
2f9ad52a9c | ||
|
|
398ff23291 | ||
|
|
d14d1724af | ||
|
|
720cba0ae5 |
@@ -9,13 +9,13 @@
|
||||
"address": "127.0.0.1",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
0,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -51,16 +51,15 @@
|
||||
"url": "127.0.0.1:2005"
|
||||
},
|
||||
"address": "127.0.0.1",
|
||||
"antennaVariation": "0,0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
3,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -87,7 +86,7 @@
|
||||
"defaultProfileIds": [
|
||||
"1"
|
||||
],
|
||||
"enabled": true,
|
||||
"enabled": false,
|
||||
"forbiddenZones": [
|
||||
{
|
||||
"azimuth": 20,
|
||||
@@ -170,12 +169,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -229,12 +228,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -263,8 +262,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "2147483647",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -279,8 +277,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "2147483647",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
@@ -297,7 +294,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"0.0180002 1.9115e-7\",\"0.0177003 0.00310696\",\"0.0169007 0.00611367\",\"0.0156014 0.0089202\",\"0.0138022 0.0116269\",\"0.011603 0.0136825\",\"0.00900388 0.0157386\",\"0.0061044 0.0167927\",\"0.0031049 0.0177467\",\"5.11347e-6 0.0181494\",\"-0.0030951 0.01775\",\"-0.0061956 0.0167989\",\"-0.00899614 0.015697\",\"-0.011597 0.0136921\",\"-0.0137978 0.0116366\",\"-0.0155986 0.00892859\",\"-0.0168993 0.00611989\",\"-0.0176997 0.00311028\",\"-0.0179998 1.91357e-7\",\"-0.0176997 -0.0031099\",\"-0.0168993 -0.00621983\",\"-0.0155986 -0.00892821\",\"-0.0137978 -0.0116362\",\"-0.011597 -0.0136917\",\"-0.00899614 -0.0156966\",\"-0.0061956 -0.0167985\",\"-0.0030951 -0.0177496\",\"5.11326e-6 -0.018149\",\"0.0031049 -0.0177463\",\"0.0061044 -0.0167923\",\"0.00900388 -0.0157382\",\"0.011603 -0.0136821\",\"0.0138022 -0.0116265\",\"0.0156014 -0.00891982\",\"0.0169007 -0.00611328\",\"0.0177003 -0.00310658\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"60.0829 30.6157\",\"60.0826 30.622\",\"60.0818 30.628\",\"60.0805 30.6336\",\"60.0787 30.6391\",\"60.0765 30.6432\",\"60.0739 30.6473\",\"60.071 30.6494\",\"60.068 30.6513\",\"60.0649 30.6521\",\"60.0618 30.6513\",\"60.0587 30.6494\",\"60.0559 30.6472\",\"60.0533 30.6432\",\"60.0511 30.6391\",\"60.0493 30.6336\",\"60.048 30.628\",\"60.0472 30.622\",\"60.0469 30.6157\",\"60.0472 30.6095\",\"60.048 30.6033\",\"60.0493 30.5979\",\"60.0511 30.5924\",\"60.0533 30.5883\",\"60.0559 30.5843\",\"60.0587 30.5821\",\"60.0618 30.5802\",\"60.0649 30.5794\",\"60.068 30.5802\",\"60.071 30.5821\",\"60.0739 30.5842\",\"60.0765 30.5883\",\"60.0787 30.5924\",\"60.0805 30.5979\",\"60.0818 30.6035\",\"60.0826 30.6095\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -381,12 +378,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -440,12 +437,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -474,8 +471,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "0",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -490,8 +486,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "0",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
@@ -508,7 +503,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"0.0180002 1.9115e-7\",\"0.0177003 0.00310696\",\"0.0169007 0.00611367\",\"0.0156014 0.0089202\",\"0.0138022 0.0116269\",\"0.011603 0.0136825\",\"0.00900388 0.0157386\",\"0.0061044 0.0167927\",\"0.0031049 0.0177467\",\"5.11347e-6 0.0181494\",\"-0.0030951 0.01775\",\"-0.0061956 0.0167989\",\"-0.00899614 0.015697\",\"-0.011597 0.0136921\",\"-0.0137978 0.0116366\",\"-0.0155986 0.00892859\",\"-0.0168993 0.00611989\",\"-0.0176997 0.00311028\",\"-0.0179998 1.91357e-7\",\"-0.0176997 -0.0031099\",\"-0.0168993 -0.00621983\",\"-0.0155986 -0.00892821\",\"-0.0137978 -0.0116362\",\"-0.011597 -0.0136917\",\"-0.00899614 -0.0156966\",\"-0.0061956 -0.0167985\",\"-0.0030951 -0.0177496\",\"5.11326e-6 -0.018149\",\"0.0031049 -0.0177463\",\"0.0061044 -0.0167923\",\"0.00900388 -0.0157382\",\"0.011603 -0.0136821\",\"0.0138022 -0.0116265\",\"0.0156014 -0.00891982\",\"0.0169007 -0.00611328\",\"0.0177003 -0.00310658\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"60.0829 30.6157\",\"60.0826 30.622\",\"60.0818 30.628\",\"60.0805 30.6336\",\"60.0787 30.6391\",\"60.0765 30.6432\",\"60.0739 30.6473\",\"60.071 30.6494\",\"60.068 30.6513\",\"60.0649 30.6521\",\"60.0618 30.6513\",\"60.0587 30.6494\",\"60.0559 30.6472\",\"60.0533 30.6432\",\"60.0511 30.6391\",\"60.0493 30.6336\",\"60.048 30.628\",\"60.0472 30.622\",\"60.0469 30.6157\",\"60.0472 30.6095\",\"60.048 30.6033\",\"60.0493 30.5979\",\"60.0511 30.5924\",\"60.0533 30.5883\",\"60.0559 30.5843\",\"60.0587 30.5821\",\"60.0618 30.5802\",\"60.0649 30.5794\",\"60.068 30.5802\",\"60.071 30.5821\",\"60.0739 30.5842\",\"60.0765 30.5883\",\"60.0787 30.5924\",\"60.0805 30.5979\",\"60.0818 30.6035\",\"60.0826 30.6095\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -592,12 +587,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -651,12 +646,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -685,8 +680,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "4607182418800017408",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -701,8 +695,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "4607182418800017408",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
@@ -719,7 +712,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"0.0180002 1.9115e-7\",\"0.0177003 0.00310696\",\"0.0169007 0.00611367\",\"0.0156014 0.0089202\",\"0.0138022 0.0116269\",\"0.011603 0.0136825\",\"0.00900388 0.0157386\",\"0.0061044 0.0167927\",\"0.0031049 0.0177467\",\"5.11347e-6 0.0181494\",\"-0.0030951 0.01775\",\"-0.0061956 0.0167989\",\"-0.00899614 0.015697\",\"-0.011597 0.0136921\",\"-0.0137978 0.0116366\",\"-0.0155986 0.00892859\",\"-0.0168993 0.00611989\",\"-0.0176997 0.00311028\",\"-0.0179998 1.91357e-7\",\"-0.0176997 -0.0031099\",\"-0.0168993 -0.00621983\",\"-0.0155986 -0.00892821\",\"-0.0137978 -0.0116362\",\"-0.011597 -0.0136917\",\"-0.00899614 -0.0156966\",\"-0.0061956 -0.0167985\",\"-0.0030951 -0.0177496\",\"5.11326e-6 -0.018149\",\"0.0031049 -0.0177463\",\"0.0061044 -0.0167923\",\"0.00900388 -0.0157382\",\"0.011603 -0.0136821\",\"0.0138022 -0.0116265\",\"0.0156014 -0.00891982\",\"0.0169007 -0.00611328\",\"0.0177003 -0.00310658\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"60.0829 30.6157\",\"60.0826 30.622\",\"60.0818 30.628\",\"60.0805 30.6336\",\"60.0787 30.6391\",\"60.0765 30.6432\",\"60.0739 30.6473\",\"60.071 30.6494\",\"60.068 30.6513\",\"60.0649 30.6521\",\"60.0618 30.6513\",\"60.0587 30.6494\",\"60.0559 30.6472\",\"60.0533 30.6432\",\"60.0511 30.6391\",\"60.0493 30.6336\",\"60.048 30.628\",\"60.0472 30.622\",\"60.0469 30.6157\",\"60.0472 30.6095\",\"60.048 30.6033\",\"60.0493 30.5979\",\"60.0511 30.5924\",\"60.0533 30.5883\",\"60.0559 30.5843\",\"60.0587 30.5821\",\"60.0618 30.5802\",\"60.0649 30.5794\",\"60.068 30.5802\",\"60.071 30.5821\",\"60.0739 30.5842\",\"60.0765 30.5883\",\"60.0787 30.5924\",\"60.0805 30.5979\",\"60.0818 30.6035\",\"60.0826 30.6095\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -803,12 +796,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -862,12 +855,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -896,8 +889,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "111818694921568",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -912,8 +904,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "111818694921568",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
@@ -930,7 +921,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"0.0180002 1.9115e-7\",\"0.0177003 0.00310696\",\"0.0169007 0.00611367\",\"0.0156014 0.0089202\",\"0.0138022 0.0116269\",\"0.011603 0.0136825\",\"0.00900388 0.0157386\",\"0.0061044 0.0167927\",\"0.0031049 0.0177467\",\"5.11347e-6 0.0181494\",\"-0.0030951 0.01775\",\"-0.0061956 0.0167989\",\"-0.00899614 0.015697\",\"-0.011597 0.0136921\",\"-0.0137978 0.0116366\",\"-0.0155986 0.00892859\",\"-0.0168993 0.00611989\",\"-0.0176997 0.00311028\",\"-0.0179998 1.91357e-7\",\"-0.0176997 -0.0031099\",\"-0.0168993 -0.00621983\",\"-0.0155986 -0.00892821\",\"-0.0137978 -0.0116362\",\"-0.011597 -0.0136917\",\"-0.00899614 -0.0156966\",\"-0.0061956 -0.0167985\",\"-0.0030951 -0.0177496\",\"5.11326e-6 -0.018149\",\"0.0031049 -0.0177463\",\"0.0061044 -0.0167923\",\"0.00900388 -0.0157382\",\"0.011603 -0.0136821\",\"0.0138022 -0.0116265\",\"0.0156014 -0.00891982\",\"0.0169007 -0.00611328\",\"0.0177003 -0.00310658\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"60.0829 30.6157\",\"60.0826 30.622\",\"60.0818 30.628\",\"60.0805 30.6336\",\"60.0787 30.6391\",\"60.0765 30.6432\",\"60.0739 30.6473\",\"60.071 30.6494\",\"60.068 30.6513\",\"60.0649 30.6521\",\"60.0618 30.6513\",\"60.0587 30.6494\",\"60.0559 30.6472\",\"60.0533 30.6432\",\"60.0511 30.6391\",\"60.0493 30.6336\",\"60.048 30.628\",\"60.0472 30.622\",\"60.0469 30.6157\",\"60.0472 30.6095\",\"60.048 30.6033\",\"60.0493 30.5979\",\"60.0511 30.5924\",\"60.0533 30.5883\",\"60.0559 30.5843\",\"60.0587 30.5821\",\"60.0618 30.5802\",\"60.0649 30.5794\",\"60.068 30.5802\",\"60.071 30.5821\",\"60.0739 30.5842\",\"60.0765 30.5883\",\"60.0787 30.5924\",\"60.0805 30.5979\",\"60.0818 30.6035\",\"60.0826 30.6095\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -1014,12 +1005,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -1073,12 +1064,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -1107,8 +1098,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "126158551285552",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -1123,8 +1113,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "126158551285552",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
@@ -1141,7 +1130,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"0.0180002 1.9115e-7\",\"0.0177003 0.00310696\",\"0.0169007 0.00611367\",\"0.0156014 0.0089202\",\"0.0138022 0.0116269\",\"0.011603 0.0136825\",\"0.00900388 0.0157386\",\"0.0061044 0.0167927\",\"0.0031049 0.0177467\",\"5.11347e-6 0.0181494\",\"-0.0030951 0.01775\",\"-0.0061956 0.0167989\",\"-0.00899614 0.015697\",\"-0.011597 0.0136921\",\"-0.0137978 0.0116366\",\"-0.0155986 0.00892859\",\"-0.0168993 0.00611989\",\"-0.0176997 0.00311028\",\"-0.0179998 1.91357e-7\",\"-0.0176997 -0.0031099\",\"-0.0168993 -0.00621983\",\"-0.0155986 -0.00892821\",\"-0.0137978 -0.0116362\",\"-0.011597 -0.0136917\",\"-0.00899614 -0.0156966\",\"-0.0061956 -0.0167985\",\"-0.0030951 -0.0177496\",\"5.11326e-6 -0.018149\",\"0.0031049 -0.0177463\",\"0.0061044 -0.0167923\",\"0.00900388 -0.0157382\",\"0.011603 -0.0136821\",\"0.0138022 -0.0116265\",\"0.0156014 -0.00891982\",\"0.0169007 -0.00611328\",\"0.0177003 -0.00310658\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"60.0829 30.6157\",\"60.0826 30.622\",\"60.0818 30.628\",\"60.0805 30.6336\",\"60.0787 30.6391\",\"60.0765 30.6432\",\"60.0739 30.6473\",\"60.071 30.6494\",\"60.068 30.6513\",\"60.0649 30.6521\",\"60.0618 30.6513\",\"60.0587 30.6494\",\"60.0559 30.6472\",\"60.0533 30.6432\",\"60.0511 30.6391\",\"60.0493 30.6336\",\"60.048 30.628\",\"60.0472 30.622\",\"60.0469 30.6157\",\"60.0472 30.6095\",\"60.048 30.6033\",\"60.0493 30.5979\",\"60.0511 30.5924\",\"60.0533 30.5883\",\"60.0559 30.5843\",\"60.0587 30.5821\",\"60.0618 30.5802\",\"60.0649 30.5794\",\"60.068 30.5802\",\"60.071 30.5821\",\"60.0739 30.5842\",\"60.0765 30.5883\",\"60.0787 30.5924\",\"60.0805 30.5979\",\"60.0818 30.6035\",\"60.0826 30.6095\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -1225,12 +1214,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -1284,12 +1273,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -1318,8 +1307,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "8315457377388211488",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -1334,8 +1322,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "8315457377388211488",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
@@ -1352,7 +1339,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"0.0180002 1.9115e-7\",\"0.0177003 0.00310696\",\"0.0169007 0.00611367\",\"0.0156014 0.0089202\",\"0.0138022 0.0116269\",\"0.011603 0.0136825\",\"0.00900388 0.0157386\",\"0.0061044 0.0167927\",\"0.0031049 0.0177467\",\"5.11347e-6 0.0181494\",\"-0.0030951 0.01775\",\"-0.0061956 0.0167989\",\"-0.00899614 0.015697\",\"-0.011597 0.0136921\",\"-0.0137978 0.0116366\",\"-0.0155986 0.00892859\",\"-0.0168993 0.00611989\",\"-0.0176997 0.00311028\",\"-0.0179998 1.91357e-7\",\"-0.0176997 -0.0031099\",\"-0.0168993 -0.00621983\",\"-0.0155986 -0.00892821\",\"-0.0137978 -0.0116362\",\"-0.011597 -0.0136917\",\"-0.00899614 -0.0156966\",\"-0.0061956 -0.0167985\",\"-0.0030951 -0.0177496\",\"5.11326e-6 -0.018149\",\"0.0031049 -0.0177463\",\"0.0061044 -0.0167923\",\"0.00900388 -0.0157382\",\"0.011603 -0.0136821\",\"0.0138022 -0.0116265\",\"0.0156014 -0.00891982\",\"0.0169007 -0.00611328\",\"0.0177003 -0.00310658\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"60.0829 30.6157\",\"60.0826 30.622\",\"60.0818 30.628\",\"60.0805 30.6336\",\"60.0787 30.6391\",\"60.0765 30.6432\",\"60.0739 30.6473\",\"60.071 30.6494\",\"60.068 30.6513\",\"60.0649 30.6521\",\"60.0618 30.6513\",\"60.0587 30.6494\",\"60.0559 30.6472\",\"60.0533 30.6432\",\"60.0511 30.6391\",\"60.0493 30.6336\",\"60.048 30.628\",\"60.0472 30.622\",\"60.0469 30.6157\",\"60.0472 30.6095\",\"60.048 30.6033\",\"60.0493 30.5979\",\"60.0511 30.5924\",\"60.0533 30.5883\",\"60.0559 30.5843\",\"60.0587 30.5821\",\"60.0618 30.5802\",\"60.0649 30.5794\",\"60.068 30.5802\",\"60.071 30.5821\",\"60.0739 30.5842\",\"60.0765 30.5883\",\"60.0787 30.5924\",\"60.0805 30.5979\",\"60.0818 30.6035\",\"60.0826 30.6095\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -1436,12 +1423,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -1495,12 +1482,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -1529,8 +1516,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "30680773303284125",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -1545,8 +1531,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "30680773303284125",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
@@ -1563,7 +1548,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"0.0180002 1.9115e-7\",\"0.0177003 0.00310696\",\"0.0169007 0.00611367\",\"0.0156014 0.0089202\",\"0.0138022 0.0116269\",\"0.011603 0.0136825\",\"0.00900388 0.0157386\",\"0.0061044 0.0167927\",\"0.0031049 0.0177467\",\"5.11347e-6 0.0181494\",\"-0.0030951 0.01775\",\"-0.0061956 0.0167989\",\"-0.00899614 0.015697\",\"-0.011597 0.0136921\",\"-0.0137978 0.0116366\",\"-0.0155986 0.00892859\",\"-0.0168993 0.00611989\",\"-0.0176997 0.00311028\",\"-0.0179998 1.91357e-7\",\"-0.0176997 -0.0031099\",\"-0.0168993 -0.00621983\",\"-0.0155986 -0.00892821\",\"-0.0137978 -0.0116362\",\"-0.011597 -0.0136917\",\"-0.00899614 -0.0156966\",\"-0.0061956 -0.0167985\",\"-0.0030951 -0.0177496\",\"5.11326e-6 -0.018149\",\"0.0031049 -0.0177463\",\"0.0061044 -0.0167923\",\"0.00900388 -0.0157382\",\"0.011603 -0.0136821\",\"0.0138022 -0.0116265\",\"0.0156014 -0.00891982\",\"0.0169007 -0.00611328\",\"0.0177003 -0.00310658\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":0,\"radius\":2000,\"total_zone\":[\"60.0829 30.6157\",\"60.0826 30.622\",\"60.0818 30.628\",\"60.0805 30.6336\",\"60.0787 30.6391\",\"60.0765 30.6432\",\"60.0739 30.6473\",\"60.071 30.6494\",\"60.068 30.6513\",\"60.0649 30.6521\",\"60.0618 30.6513\",\"60.0587 30.6494\",\"60.0559 30.6472\",\"60.0533 30.6432\",\"60.0511 30.6391\",\"60.0493 30.6336\",\"60.048 30.628\",\"60.0472 30.622\",\"60.0469 30.6157\",\"60.0472 30.6095\",\"60.048 30.6033\",\"60.0493 30.5979\",\"60.0511 30.5924\",\"60.0533 30.5883\",\"60.0559 30.5843\",\"60.0587 30.5821\",\"60.0618 30.5802\",\"60.0649 30.5794\",\"60.068 30.5802\",\"60.071 30.5821\",\"60.0739 30.5842\",\"60.0765 30.5883\",\"60.0787 30.5924\",\"60.0805 30.5979\",\"60.0818 30.6035\",\"60.0826 30.6095\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -1603,6 +1588,7 @@
|
||||
},
|
||||
"PelengatorsTaskParams": [
|
||||
{
|
||||
"is_paused": false,
|
||||
"pelengator_task_Antenna": {
|
||||
"field_caption": "",
|
||||
"field_id": "Авто"
|
||||
@@ -1635,6 +1621,7 @@
|
||||
},
|
||||
"PelengatorsTaskParams": [
|
||||
{
|
||||
"is_paused": false,
|
||||
"pelengator_task_Antenna": {
|
||||
"field_caption": "",
|
||||
"field_id": "Авто"
|
||||
@@ -1667,6 +1654,7 @@
|
||||
},
|
||||
"PelengatorsTaskParams": [
|
||||
{
|
||||
"is_paused": false,
|
||||
"pelengator_task_Antenna": {
|
||||
"field_caption": "",
|
||||
"field_id": "Авто"
|
||||
@@ -1742,17 +1730,16 @@
|
||||
"url": "172.22.246.12:2006"
|
||||
},
|
||||
"address": "172.22.246.12",
|
||||
"antennaVariation": "0,0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
59.91069,
|
||||
30.65539,
|
||||
60.064529,
|
||||
30.615309,
|
||||
0,
|
||||
0,
|
||||
59.91069,
|
||||
30.65539,
|
||||
0,
|
||||
60.064529,
|
||||
30.615309,
|
||||
0,
|
||||
30,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -1781,7 +1768,7 @@
|
||||
"enabled": true,
|
||||
"forbiddenZones": [
|
||||
],
|
||||
"functionZone": "{\"default_radius\":5000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":-1,\"radius\":5000,\"total_zone\":[\"59.9557 30.6554\",\"59.955 30.6709\",\"59.9529 30.6862\",\"59.9496 30.7003\",\"59.9451 30.7132\",\"59.9396 30.7242\",\"59.9332 30.7331\",\"59.926 30.7397\",\"59.9185 30.7437\",\"59.9107 30.7451\",\"59.9029 30.7437\",\"59.8953 30.7396\",\"59.8882 30.733\",\"59.8818 30.724\",\"59.8762 30.713\",\"59.8717 30.7001\",\"59.8684 30.686\",\"59.8664 30.6709\",\"59.8657 30.6554\",\"59.8664 30.6399\",\"59.8684 30.6248\",\"59.8717 30.6107\",\"59.8762 30.5978\",\"59.8818 30.5867\",\"59.8882 30.5778\",\"59.8953 30.5712\",\"59.9029 30.5671\",\"59.9107 30.5657\",\"59.9185 30.5671\",\"59.926 30.5711\",\"59.9332 30.5777\",\"59.9396 30.5866\",\"59.9451 30.5976\",\"59.9496 30.6105\",\"59.9529 30.6248\",\"59.955 30.6399\"]}}}",
|
||||
"functionZone": "{\"default_radius\":5000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioReceive\",\"input_id\":-1,\"radius\":5000,\"total_zone\":[\"60.1095 30.6153\",\"60.1088 30.6309\",\"60.1067 30.6463\",\"60.1034 30.6604\",\"60.0989 30.6734\",\"60.0934 30.6844\",\"60.087 30.6934\",\"60.0798 30.7\",\"60.0723 30.704\",\"60.0645 30.7054\",\"60.0567 30.704\",\"60.0491 30.6999\",\"60.042 30.6933\",\"60.0356 30.6842\",\"60.03 30.6732\",\"60.0255 30.6602\",\"60.0222 30.6461\",\"60.0202 30.6309\",\"60.0195 30.6153\",\"60.0202 30.5997\",\"60.0222 30.5846\",\"60.0255 30.5704\",\"60.03 30.5575\",\"60.0356 30.5463\",\"60.042 30.5374\",\"60.0491 30.5307\",\"60.0567 30.5266\",\"60.0645 30.5252\",\"60.0723 30.5266\",\"60.0798 30.5306\",\"60.087 30.5373\",\"60.0934 30.5462\",\"60.0989 30.5572\",\"60.1034 30.5702\",\"60.1067 30.5846\",\"60.1088 30.5997\"]}}}",
|
||||
"groupId": -1,
|
||||
"groupName": "",
|
||||
"name": "АфС-П РТР",
|
||||
@@ -1850,12 +1837,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.615742206573483,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.615742206573483,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -1909,12 +1896,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.615742206573483,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.615742206573483,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -1943,8 +1930,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "7308901815584698669",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -1959,8 +1945,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "7308901815584698669",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
@@ -1977,7 +1962,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"0.0180002 1.9115e-7\",\"0.0177003 0.00310696\",\"0.0169007 0.00611367\",\"0.0156014 0.00897031\",\"0.0138022 0.0115768\",\"0.011603 0.0137326\",\"0.00900381 0.0155883\",\"0.00610448 0.016943\",\"0.00310487 0.0176965\",\"5.03159e-6 0.017999\",\"-0.00309513 0.0176998\",\"-0.00619552 0.0169493\",\"-0.00899621 0.0155466\",\"-0.011597 0.0137422\",\"-0.0137978 0.0115864\",\"-0.0155986 0.00897875\",\"-0.0168993 0.00611989\",\"-0.0176997 0.00311028\",\"-0.0179998 1.91357e-7\",\"-0.0176997 -0.0031099\",\"-0.0168993 -0.00611951\",\"-0.0155986 -0.00897836\",\"-0.0137978 -0.011586\",\"-0.011597 -0.0137419\",\"-0.00899621 -0.0155462\",\"-0.00619552 -0.0169489\",\"-0.00309513 -0.0176995\",\"5.03138e-6 -0.0179986\",\"0.00310487 -0.0176962\",\"0.00610448 -0.0169427\",\"0.00900381 -0.0155879\",\"0.011603 -0.0137323\",\"0.0138022 -0.0115764\",\"0.0156014 -0.00896993\",\"0.0169007 -0.00611328\",\"0.0177003 -0.00310658\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"60.0829 30.6157\",\"60.0826 30.622\",\"60.0818 30.628\",\"60.0805 30.6337\",\"60.0787 30.639\",\"60.0765 30.6433\",\"60.0739 30.647\",\"60.071 30.6497\",\"60.068 30.6512\",\"60.0649 30.6518\",\"60.0618 30.6512\",\"60.0587 30.6497\",\"60.0559 30.6469\",\"60.0533 30.6433\",\"60.0511 30.639\",\"60.0493 30.6337\",\"60.048 30.628\",\"60.0472 30.622\",\"60.0469 30.6157\",\"60.0472 30.6095\",\"60.048 30.6035\",\"60.0493 30.5978\",\"60.0511 30.5925\",\"60.0533 30.5882\",\"60.0559 30.5846\",\"60.0587 30.5818\",\"60.0618 30.5803\",\"60.0649 30.5797\",\"60.068 30.5803\",\"60.071 30.5818\",\"60.0739 30.5845\",\"60.0765 30.5882\",\"60.0787 30.5925\",\"60.0805 30.5978\",\"60.0818 30.6035\",\"60.0826 30.6095\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -2061,12 +2046,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.064979661201995,
|
||||
30.615334510803223,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.064979661201995,
|
||||
30.615334510803223,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -2120,12 +2105,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.064979661201995,
|
||||
30.615334510803223,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.064979661201995,
|
||||
30.615334510803223,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -2154,8 +2139,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "7308901815584698669",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -2170,8 +2154,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "7308901815584698669",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
@@ -2188,7 +2171,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"1.52588e-7 1.91254e-7\",\"0.0156014 -0.00896993\",\"0.0171006 -0.00556204\",\"0.0179002 -0.00190395\",\"0.0179002 0.00190433\",\"0.0171006 0.00556242\",\"0.0156014 0.00897031\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"60.065 30.6153\",\"60.0806 30.5974\",\"60.0821 30.6042\",\"60.0829 30.6115\",\"60.0829 30.6192\",\"60.0821 30.6265\",\"60.0806 30.6333\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -2272,12 +2255,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.064733381937565,
|
||||
30.61617136001587,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.064733381937565,
|
||||
30.61617136001587,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -2331,12 +2314,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.064733381937565,
|
||||
30.61617136001587,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.064733381937565,
|
||||
30.61617136001587,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -2365,8 +2348,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "7308901815584698669",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -2381,8 +2363,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "7308901815584698669",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
@@ -2399,7 +2380,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"0.0180002 1.9115e-7\",\"0.0177003 0.00310696\",\"0.0169007 0.00611367\",\"0.0156014 0.00897031\",\"0.0138022 0.0115768\",\"0.011603 0.0137326\",\"0.00900381 0.0155883\",\"0.00610448 0.016943\",\"0.00310487 0.0176965\",\"5.03159e-6 0.017999\",\"-0.00309513 0.0176998\",\"-0.00619552 0.0169493\",\"-0.00899621 0.0155466\",\"-0.011597 0.0137422\",\"-0.0137978 0.0115864\",\"-0.0155986 0.00897875\",\"-0.0168993 0.00611989\",\"-0.0176997 0.00311028\",\"-0.0179998 1.91357e-7\",\"-0.0176997 -0.0031099\",\"-0.0168993 -0.00611951\",\"-0.0155986 -0.00897836\",\"-0.0137978 -0.011586\",\"-0.011597 -0.0137419\",\"-0.00899621 -0.0155462\",\"-0.00619552 -0.0169489\",\"-0.00309513 -0.0176995\",\"5.03138e-6 -0.0179986\",\"0.00310487 -0.0176962\",\"0.00610448 -0.0169427\",\"0.00900381 -0.0155879\",\"0.011603 -0.0137323\",\"0.0138022 -0.0115764\",\"0.0156014 -0.00896993\",\"0.0169007 -0.00611328\",\"0.0177003 -0.00310658\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"60.0827 30.6162\",\"60.0824 30.6224\",\"60.0816 30.6284\",\"60.0803 30.6342\",\"60.0785 30.6394\",\"60.0763 30.6437\",\"60.0737 30.6474\",\"60.0708 30.6501\",\"60.0678 30.6516\",\"60.0647 30.6522\",\"60.0616 30.6516\",\"60.0585 30.6501\",\"60.0557 30.6473\",\"60.0531 30.6437\",\"60.0509 30.6394\",\"60.0491 30.6342\",\"60.0478 30.6284\",\"60.047 30.6224\",\"60.0467 30.6162\",\"60.047 30.6099\",\"60.0478 30.6039\",\"60.0491 30.5982\",\"60.0509 30.593\",\"60.0531 30.5886\",\"60.0557 30.585\",\"60.0585 30.5822\",\"60.0616 30.5807\",\"60.0647 30.5801\",\"60.0678 30.5807\",\"60.0708 30.5822\",\"60.0737 30.5849\",\"60.0763 30.5886\",\"60.0785 30.593\",\"60.0803 30.5982\",\"60.0816 30.6039\",\"60.0824 30.6099\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -2483,12 +2464,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -2542,12 +2523,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -2576,8 +2557,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "7308901815584698669",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -2592,8 +2572,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "7308901815584698669",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
@@ -2610,7 +2589,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"0.0180002 1.9115e-7\",\"0.0177003 0.00310696\",\"0.0169007 0.00611367\",\"0.0156014 0.00897031\",\"0.0138022 0.0115768\",\"0.011603 0.0137326\",\"0.00900381 0.0155883\",\"0.00610448 0.016943\",\"0.00310487 0.0176965\",\"5.03159e-6 0.017999\",\"-0.00309513 0.0176998\",\"-0.00619552 0.0169493\",\"-0.00899621 0.0155466\",\"-0.011597 0.0137422\",\"-0.0137978 0.0115864\",\"-0.0155986 0.00897875\",\"-0.0168993 0.00611989\",\"-0.0176997 0.00311028\",\"-0.0179998 1.91357e-7\",\"-0.0176997 -0.0031099\",\"-0.0168993 -0.00611951\",\"-0.0155986 -0.00897836\",\"-0.0137978 -0.011586\",\"-0.011597 -0.0137419\",\"-0.00899621 -0.0155462\",\"-0.00619552 -0.0169489\",\"-0.00309513 -0.0176995\",\"5.03138e-6 -0.0179986\",\"0.00310487 -0.0176962\",\"0.00610448 -0.0169427\",\"0.00900381 -0.0155879\",\"0.011603 -0.0137323\",\"0.0138022 -0.0115764\",\"0.0156014 -0.00896993\",\"0.0169007 -0.00611328\",\"0.0177003 -0.00310658\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"60.0829 30.6157\",\"60.0826 30.622\",\"60.0818 30.628\",\"60.0805 30.6337\",\"60.0787 30.639\",\"60.0765 30.6433\",\"60.0739 30.647\",\"60.071 30.6497\",\"60.068 30.6512\",\"60.0649 30.6518\",\"60.0618 30.6512\",\"60.0587 30.6497\",\"60.0559 30.6469\",\"60.0533 30.6433\",\"60.0511 30.639\",\"60.0493 30.6337\",\"60.048 30.628\",\"60.0472 30.622\",\"60.0469 30.6157\",\"60.0472 30.6095\",\"60.048 30.6035\",\"60.0493 30.5978\",\"60.0511 30.5925\",\"60.0533 30.5882\",\"60.0559 30.5846\",\"60.0587 30.5818\",\"60.0618 30.5803\",\"60.0649 30.5797\",\"60.068 30.5803\",\"60.071 30.5818\",\"60.0739 30.5845\",\"60.0765 30.5882\",\"60.0787 30.5925\",\"60.0805 30.5978\",\"60.0818 30.6035\",\"60.0826 30.6095\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -2694,12 +2673,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -2753,12 +2732,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -2787,8 +2766,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "140359491022592",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -2803,8 +2781,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "140359491022592",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
@@ -2821,7 +2798,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"0.0180002 1.9115e-7\",\"0.0177003 0.00310696\",\"0.0169007 0.00611367\",\"0.0156014 0.00897031\",\"0.0138022 0.0115768\",\"0.011603 0.0137326\",\"0.00900381 0.0155883\",\"0.00610448 0.016943\",\"0.00310487 0.0176965\",\"5.03159e-6 0.017999\",\"-0.00309513 0.0176998\",\"-0.00619552 0.0169493\",\"-0.00899621 0.0155466\",\"-0.011597 0.0137422\",\"-0.0137978 0.0115864\",\"-0.0155986 0.00897875\",\"-0.0168993 0.00611989\",\"-0.0176997 0.00311028\",\"-0.0179998 1.91357e-7\",\"-0.0176997 -0.0031099\",\"-0.0168993 -0.00611951\",\"-0.0155986 -0.00897836\",\"-0.0137978 -0.011586\",\"-0.011597 -0.0137419\",\"-0.00899621 -0.0155462\",\"-0.00619552 -0.0169489\",\"-0.00309513 -0.0176995\",\"5.03138e-6 -0.0179986\",\"0.00310487 -0.0176962\",\"0.00610448 -0.0169427\",\"0.00900381 -0.0155879\",\"0.011603 -0.0137323\",\"0.0138022 -0.0115764\",\"0.0156014 -0.00896993\",\"0.0169007 -0.00611328\",\"0.0177003 -0.00310658\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"60.0829 30.6157\",\"60.0826 30.622\",\"60.0818 30.628\",\"60.0805 30.6337\",\"60.0787 30.639\",\"60.0765 30.6433\",\"60.0739 30.647\",\"60.071 30.6497\",\"60.068 30.6512\",\"60.0649 30.6518\",\"60.0618 30.6512\",\"60.0587 30.6497\",\"60.0559 30.6469\",\"60.0533 30.6433\",\"60.0511 30.639\",\"60.0493 30.6337\",\"60.048 30.628\",\"60.0472 30.622\",\"60.0469 30.6157\",\"60.0472 30.6095\",\"60.048 30.6035\",\"60.0493 30.5978\",\"60.0511 30.5925\",\"60.0533 30.5882\",\"60.0559 30.5846\",\"60.0587 30.5818\",\"60.0618 30.5803\",\"60.0649 30.5797\",\"60.068 30.5803\",\"60.071 30.5818\",\"60.0739 30.5845\",\"60.0765 30.5882\",\"60.0787 30.5925\",\"60.0805 30.5978\",\"60.0818 30.6035\",\"60.0826 30.6095\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -2905,12 +2882,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -2964,12 +2941,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -2998,8 +2975,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "37",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -3014,8 +2990,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "37",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
@@ -3032,7 +3007,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"0.0180002 1.9115e-7\",\"0.0177003 0.00310696\",\"0.0169007 0.00611367\",\"0.0156014 0.00897031\",\"0.0138022 0.0115768\",\"0.011603 0.0137326\",\"0.00900381 0.0155883\",\"0.00610448 0.016943\",\"0.00310487 0.0176965\",\"5.03159e-6 0.017999\",\"-0.00309513 0.0176998\",\"-0.00619552 0.0169493\",\"-0.00899621 0.0155466\",\"-0.011597 0.0137422\",\"-0.0137978 0.0115864\",\"-0.0155986 0.00897875\",\"-0.0168993 0.00611989\",\"-0.0176997 0.00311028\",\"-0.0179998 1.91357e-7\",\"-0.0176997 -0.0031099\",\"-0.0168993 -0.00611951\",\"-0.0155986 -0.00897836\",\"-0.0137978 -0.011586\",\"-0.011597 -0.0137419\",\"-0.00899621 -0.0155462\",\"-0.00619552 -0.0169489\",\"-0.00309513 -0.0176995\",\"5.03138e-6 -0.0179986\",\"0.00310487 -0.0176962\",\"0.00610448 -0.0169427\",\"0.00900381 -0.0155879\",\"0.011603 -0.0137323\",\"0.0138022 -0.0115764\",\"0.0156014 -0.00896993\",\"0.0169007 -0.00611328\",\"0.0177003 -0.00310658\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"60.0829 30.6157\",\"60.0826 30.622\",\"60.0818 30.628\",\"60.0805 30.6337\",\"60.0787 30.639\",\"60.0765 30.6433\",\"60.0739 30.647\",\"60.071 30.6497\",\"60.068 30.6512\",\"60.0649 30.6518\",\"60.0618 30.6512\",\"60.0587 30.6497\",\"60.0559 30.6469\",\"60.0533 30.6433\",\"60.0511 30.639\",\"60.0493 30.6337\",\"60.048 30.628\",\"60.0472 30.622\",\"60.0469 30.6157\",\"60.0472 30.6095\",\"60.048 30.6035\",\"60.0493 30.5978\",\"60.0511 30.5925\",\"60.0533 30.5882\",\"60.0559 30.5846\",\"60.0587 30.5818\",\"60.0618 30.5803\",\"60.0649 30.5797\",\"60.068 30.5803\",\"60.071 30.5818\",\"60.0739 30.5845\",\"60.0765 30.5882\",\"60.0787 30.5925\",\"60.0805 30.5978\",\"60.0818 30.6035\",\"60.0826 30.6095\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -3116,12 +3091,12 @@
|
||||
"address": "192.168.0.93",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -3175,12 +3150,12 @@
|
||||
"antennaVariation": "0,0",
|
||||
"coordinatesData": [
|
||||
5,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
60.06490470683785,
|
||||
30.61574220657348,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
@@ -3209,8 +3184,7 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "0",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"default_jamming_task_parameters": {
|
||||
"direction": {
|
||||
@@ -3225,13 +3199,12 @@
|
||||
"frequency_step_hz": "200000",
|
||||
"jump_delay_10ns": "0",
|
||||
"start_freqency_hz": "0",
|
||||
"time_lfm_s": 5e-06,
|
||||
"time_step_s": 1
|
||||
"time_lfm_s": 5e-06
|
||||
},
|
||||
"enable": true,
|
||||
"id": 0,
|
||||
"liter_gain": 100,
|
||||
"name": "БРП #13:10.1.2.22:1201:tx.0:390-510:800-1065:1065-1210:1150-1280:1490-2000:2000-3500:3500-6100",
|
||||
"name": "ПРД Н2-2:10.1.2.22:1201:tx.0:390-510:800-1065:1065-1210:1150-1280:1490-2000:2000-3500:3500-6100",
|
||||
"range": {
|
||||
"from": "433000000",
|
||||
"to": "435000000"
|
||||
@@ -3243,7 +3216,7 @@
|
||||
"timeout_sec": 60
|
||||
},
|
||||
"enabled": true,
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"0.0179864 0\",\"0.0177132 0.00312331\",\"0.0169017 0.00615172\",\"0.0155767 0.00899321\",\"0.0137784 0.0115614\",\"0.0115614 0.0137784\",\"0.00899321 0.0155767\",\"0.00615172 0.0169017\",\"0.00312331 0.0177132\",\"1.10135e-18 0.0179864\",\"-0.00312331 0.0177132\",\"-0.00615172 0.0169017\",\"-0.00899321 0.0155767\",\"-0.0115614 0.0137784\",\"-0.0137784 0.0115614\",\"-0.0155767 0.00899321\",\"-0.0169017 0.00615172\",\"-0.0177132 0.00312331\",\"-0.0179864 2.2027e-18\",\"-0.0177132 -0.00312331\",\"-0.0169017 -0.00615172\",\"-0.0155767 -0.00899321\",\"-0.0137784 -0.0115614\",\"-0.0115614 -0.0137784\",\"-0.00899321 -0.0155767\",\"-0.00615172 -0.0169017\",\"-0.00312331 -0.0177132\",\"-3.30405e-18 -0.0179864\",\"0.00312331 -0.0177132\",\"0.00615172 -0.0169017\",\"0.00899321 -0.0155767\",\"0.0115614 -0.0137784\",\"0.0137784 -0.0115614\",\"0.0155767 -0.00899321\",\"0.0169017 -0.00615172\",\"0.0177132 -0.00312331\"]}}}",
|
||||
"functionZone": "{\"default_radius\":2000,\"geometries\":{\"0\":{\"desc\":\"\",\"function_type\":\"RadioTransmit\",\"input_id\":-1,\"radius\":2000,\"total_zone\":[\"60.0829 30.6157\",\"60.0826 30.622\",\"60.0818 30.6281\",\"60.0805 30.6338\",\"60.0787 30.6389\",\"60.0765 30.6434\",\"60.0739 30.647\",\"60.0711 30.6496\",\"60.068 30.6512\",\"60.0649 30.6518\",\"60.0618 30.6512\",\"60.0587 30.6496\",\"60.0559 30.6469\",\"60.0533 30.6433\",\"60.0511 30.6389\",\"60.0493 30.6338\",\"60.048 30.6281\",\"60.0472 30.622\",\"60.0469 30.6157\",\"60.0472 30.6095\",\"60.048 30.6034\",\"60.0493 30.5977\",\"60.0511 30.5926\",\"60.0533 30.5881\",\"60.0559 30.5845\",\"60.0587 30.5819\",\"60.0618 30.5802\",\"60.0649 30.5797\",\"60.068 30.5802\",\"60.0711 30.5819\",\"60.0739 30.5845\",\"60.0765 30.5881\",\"60.0787 30.5926\",\"60.0805 30.5977\",\"60.0818 30.6034\",\"60.0826 30.6095\"]}}}",
|
||||
"groupId": -1,
|
||||
"impl_properties": {
|
||||
"activatingTimeoutSec": 15,
|
||||
@@ -3276,7 +3249,7 @@
|
||||
]
|
||||
},
|
||||
"ignored_perimeters": {
|
||||
"id_generator": 14340,
|
||||
"id_generator": 14471,
|
||||
"perimeters": [
|
||||
]
|
||||
},
|
||||
@@ -3303,6 +3276,7 @@
|
||||
"task": {
|
||||
"executor": "АфС-П РТР",
|
||||
"executor_type": 1,
|
||||
"is_paused": false,
|
||||
"pelengator_task_Antenna": {
|
||||
"field_caption": "",
|
||||
"field_id": "Авто"
|
||||
@@ -3342,6 +3316,7 @@
|
||||
"task": {
|
||||
"executor": "АфС-П РТР",
|
||||
"executor_type": 1,
|
||||
"is_paused": false,
|
||||
"pelengator_task_Antenna": {
|
||||
"field_caption": "",
|
||||
"field_id": "Авто"
|
||||
@@ -3381,6 +3356,7 @@
|
||||
"task": {
|
||||
"executor": "АфС-П РТР",
|
||||
"executor_type": 1,
|
||||
"is_paused": false,
|
||||
"pelengator_task_Antenna": {
|
||||
"field_caption": "",
|
||||
"field_id": "Авто"
|
||||
@@ -3410,45 +3386,6 @@
|
||||
}
|
||||
],
|
||||
"type_id": "GroupSearchTask"
|
||||
},
|
||||
{
|
||||
"ShowAllSpectrumsInOne": false,
|
||||
"executor": "Эмулятор пеленгатора",
|
||||
"executor_type": 4,
|
||||
"tasks": [
|
||||
{
|
||||
"task": {
|
||||
"executor": "Эмулятор пеленгатора",
|
||||
"executor_type": 1,
|
||||
"pelengator_task_Antenna": {
|
||||
"field_caption": "Антенна 1",
|
||||
"field_id": "1"
|
||||
},
|
||||
"pelengator_task_Attenuator": 10,
|
||||
"pelengator_task_Filter": 10000,
|
||||
"pelengator_task_FilterStep": 1,
|
||||
"pelengator_task_parameters": {
|
||||
"field_autoBaseLine": true,
|
||||
"field_baseline": -80,
|
||||
"field_enabledStreams": [
|
||||
"DirectionVsFreq",
|
||||
"SpectrumDb"
|
||||
],
|
||||
"field_profiles": [
|
||||
"1"
|
||||
],
|
||||
"field_targetSector": "{\"power_range\":{\"max\":0,\"min\":0},\"quality_range\":{\"max\":0,\"min\":0},\"sector\":{\"azimuth_max\":360,\"azimuth_min\":0,\"zenith_max\":110,\"zenith_min\":30}}"
|
||||
},
|
||||
"pelengator_task_show_forbidden_bands": true,
|
||||
"save_snapshots": false,
|
||||
"search_task_band": "1001000000 6000000000",
|
||||
"show_all_signals_on_spectrum": false,
|
||||
"show_target_signals_on_spectrum": true,
|
||||
"type_id": "PelengatorSearchTask"
|
||||
}
|
||||
}
|
||||
],
|
||||
"type_id": "GroupSearchTask"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 18 KiB |
BIN
data/Окно.png
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 2.0 KiB |
@@ -1,34 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://djv8fkddcjucs"
|
||||
path="res://.godot/imported/Скруглённый квадрат белый.png-4793c453fe49bfbe7c9affd223331345.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/Скруглённый квадрат белый.png"
|
||||
dest_files=["res://.godot/imported/Скруглённый квадрат белый.png-4793c453fe49bfbe7c9affd223331345.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1,34 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://fuhhvsa5um4m"
|
||||
path="res://.godot/imported/Скруглённый квадрат серый.png-2111d7338e52a03a41f05d6ffbbc3eb6.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/Скруглённый квадрат серый.png"
|
||||
dest_files=["res://.godot/imported/Скруглённый квадрат серый.png-2111d7338e52a03a41f05d6ffbbc3eb6.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -1,34 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://busl8rb38lis"
|
||||
path="res://.godot/imported/Скруглённый прямоуг салатный.png-e10b4e8820d45ab6e79c4fba522af854.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/Скруглённый прямоуг салатный.png"
|
||||
dest_files=["res://.godot/imported/Скруглённый прямоуг салатный.png-e10b4e8820d45ab6e79c4fba522af854.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
Before Width: | Height: | Size: 2.6 KiB |
@@ -1,34 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://3siondd3feev"
|
||||
path="res://.godot/imported/Скруглённый прямоугольник белый.png-758adbfc4fc135ed0095e711422b8c0e.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/Скруглённый прямоугольник белый.png"
|
||||
dest_files=["res://.godot/imported/Скруглённый прямоугольник белый.png-758adbfc4fc135ed0095e711422b8c0e.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1,34 +0,0 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://7ody4v7qy36g"
|
||||
path="res://.godot/imported/Скруглённый прямоугольник серый.png-318eedc8abeb0fd535304028648863b7.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/Скруглённый прямоугольник серый.png"
|
||||
dest_files=["res://.godot/imported/Скруглённый прямоугольник серый.png-318eedc8abeb0fd535304028648863b7.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 3.3 KiB |
BIN
data/матрица-конфликт.png
Normal file
|
After Width: | Height: | Size: 707 B |
@@ -2,16 +2,16 @@
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://co5xj5uhjfk84"
|
||||
path="res://.godot/imported/Окно.png-ff4b5eac96df23ad4cd8e06dc32f5bb8.ctex"
|
||||
uid="uid://busl8rb38lis"
|
||||
path="res://.godot/imported/матрица-конфликт.png-e109709def61ac1d626d23088b556664.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/Окно.png"
|
||||
dest_files=["res://.godot/imported/Окно.png-ff4b5eac96df23ad4cd8e06dc32f5bb8.ctex"]
|
||||
source_file="res://data/матрица-конфликт.png"
|
||||
dest_files=["res://.godot/imported/матрица-конфликт.png-e109709def61ac1d626d23088b556664.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
@@ -2,16 +2,16 @@
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://csxruavk0s40l"
|
||||
path="res://.godot/imported/Окно частот0.png-79ada2e7504614b9bdf58bce1aff61fb.ctex"
|
||||
uid="uid://djv8fkddcjucs"
|
||||
path="res://.godot/imported/матрица-чисто.png-43b162afe88b693461904505b377fae0.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://data/Окно частот0.png"
|
||||
dest_files=["res://.godot/imported/Окно частот0.png-79ada2e7504614b9bdf58bce1aff61fb.ctex"]
|
||||
source_file="res://data/матрица-чисто.png"
|
||||
dest_files=["res://.godot/imported/матрица-чисто.png-43b162afe88b693461904505b377fae0.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
@@ -20,8 +20,8 @@ script_export_mode=0
|
||||
|
||||
[preset.0.options]
|
||||
|
||||
custom_template/debug=""
|
||||
custom_template/release=""
|
||||
custom_template/debug="/home/user/temp/godot.linuxbsd.template_release.x86_64"
|
||||
custom_template/release="/home/user/temp/godot.linuxbsd.template_release.x86_64"
|
||||
debug/export_console_wrapper=0
|
||||
binary_format/embed_pck=true
|
||||
texture_format/s3tc_bptc=true
|
||||
|
||||
@@ -122,6 +122,8 @@ astrakb="*res://scripts/astra-kb.gd"
|
||||
prd="*res://scripts/prd.gd"
|
||||
navi="*res://scripts/navigation.gd"
|
||||
trassa="*res://scripts/trassa.gd"
|
||||
yemstg="*res://scripts/yemstg.gd"
|
||||
scouting="*res://scripts/rtr.gd"
|
||||
|
||||
[debug]
|
||||
|
||||
@@ -168,6 +170,7 @@ folder_colors={
|
||||
"res://scenes/bip/": "blue",
|
||||
"res://scenes/button-flat/": "blue",
|
||||
"res://scenes/button-scale/": "blue",
|
||||
"res://scenes/button-six-state/": "blue",
|
||||
"res://scenes/cell/": "blue",
|
||||
"res://scenes/count-all/": "blue",
|
||||
"res://scenes/count-danger/": "blue",
|
||||
@@ -179,6 +182,7 @@ folder_colors={
|
||||
"res://scenes/frame/": "blue",
|
||||
"res://scenes/grid-buttons-ecm/": "blue",
|
||||
"res://scenes/grid-side-panel/": "blue",
|
||||
"res://scenes/hranges/": "blue",
|
||||
"res://scenes/pribor-afsp/": "purple",
|
||||
"res://scenes/pribor-externals/": "purple",
|
||||
"res://scenes/pribor-prd-k/": "purple",
|
||||
@@ -192,8 +196,8 @@ folder_colors={
|
||||
"res://scenes/контроль/": "green",
|
||||
"res://scenes/настройки/": "green",
|
||||
"res://scenes/работа/": "green",
|
||||
"res://scenes/эмс-тг/": "green",
|
||||
"res://scenes/эмс/": "green",
|
||||
"res://scenes/эмс2/": "green",
|
||||
"res://scripts/": "pink",
|
||||
"res://shaders/": "pink",
|
||||
"res://table/": "blue"
|
||||
@@ -264,6 +268,8 @@ common/enable_object_picking=false
|
||||
|
||||
[rendering]
|
||||
|
||||
renderer/rendering_method="gl_compatibility"
|
||||
renderer/rendering_method.mobile="gl_compatibility"
|
||||
shader_compiler/shader_cache/strip_debug=true
|
||||
textures/default_filters/anisotropic_filtering_level=0
|
||||
anti_aliasing/screen_space_roughness_limiter/enabled=false
|
||||
|
||||
77
scenes/button-six-state/six-state.tscn
Normal file
@@ -0,0 +1,77 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://cixwl6xi22buo"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://c6nve6f8sfyj2" path="res://data/состояние-исправности-0.png" id="1_ufod8"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_ufod8"]
|
||||
script/source = "@tool
|
||||
extends GridContainer
|
||||
|
||||
@export var text_check: Array[String]
|
||||
@export_file var image_states: Array[String]
|
||||
var txr_states: Array[CompressedTexture2D]
|
||||
|
||||
|
||||
@export var state: int = 0:
|
||||
set(val):
|
||||
state = val % image_states.size()
|
||||
if is_inside_tree():
|
||||
val %= txr_states.size()
|
||||
state = val
|
||||
$done.texture = txr_states[val]
|
||||
|
||||
|
||||
@export var pressed: bool = false:
|
||||
set(val):
|
||||
pressed = val
|
||||
if is_inside_tree():
|
||||
$check.button_pressed = pressed
|
||||
|
||||
|
||||
func _enter_tree() -> void:
|
||||
txr_states.clear()
|
||||
for fn in image_states:
|
||||
txr_states.append(load(fn))
|
||||
$done.texture = txr_states[state]
|
||||
$check.button_pressed = pressed
|
||||
|
||||
|
||||
func connect_check(signal_name: StringName, callable: Callable):
|
||||
$check.connect(signal_name, callable)
|
||||
|
||||
|
||||
func disconnect_check(signal_name: StringName, callable: Callable):
|
||||
$check.disconnect(signal_name, callable)
|
||||
|
||||
|
||||
func _on_check_toggled(toggled_on: bool) -> void:
|
||||
$text.text = text_check[int(toggled_on)]
|
||||
"
|
||||
|
||||
[node name="six-state" type="GridContainer"]
|
||||
offset_right = 156.0
|
||||
offset_bottom = 24.0
|
||||
columns = 3
|
||||
script = SubResource("GDScript_ufod8")
|
||||
text_check = Array[String](["Запрещено", "Разрешено"])
|
||||
image_states = Array[String](["uid://c6nve6f8sfyj2", "uid://dnreyfh3cd1k2", "uid://c6booa8753u5t"])
|
||||
|
||||
[node name="done" type="TextureRect" parent="."]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 0
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("1_ufod8")
|
||||
expand_mode = 3
|
||||
|
||||
[node name="text" type="Label" parent="."]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 6
|
||||
size_flags_vertical = 6
|
||||
text = "Запрещено"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="check" type="CheckButton" parent="."]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 8
|
||||
action_mode = 0
|
||||
|
||||
[connection signal="toggled" from="check" to="." method="_on_check_toggled"]
|
||||
101
scenes/hranges/panel.gd
Normal file
@@ -0,0 +1,101 @@
|
||||
@tool
|
||||
|
||||
extends PanelContainer
|
||||
|
||||
## Предназначено для отображения диапазонов на горизонтальной шкале
|
||||
|
||||
@export_range(0.0, 1.0) var gap_top: float = 0.05 ## Зазор сверху
|
||||
@export_range(0.0, 1.0) var gap_bottom: float = 0.05 ## Зазор снизу
|
||||
var ranges_save: Dictionary[StringName, Array] ## <имя диапазона>: [диапазон(x - начало, y - конец), цвет]
|
||||
|
||||
|
||||
@export_file var image_file: String:
|
||||
set(val):
|
||||
image_file = val
|
||||
if is_inside_tree():
|
||||
_enter_tree()
|
||||
|
||||
|
||||
@export var back_color: Color:
|
||||
set(val):
|
||||
back_color = val
|
||||
if is_inside_tree():
|
||||
_enter_tree()
|
||||
|
||||
|
||||
func _enter_tree() -> void:
|
||||
if ResourceLoader.exists(image_file):
|
||||
$grid/image.texture = load(image_file)
|
||||
$grid/canvas.self_modulate = back_color
|
||||
|
||||
|
||||
## Добавляет новый диапазон.
|
||||
func set_range(nm: StringName, x0: float, x1: float, col: Color) -> void:
|
||||
ranges_save[nm] = [Vector2(x0, x1), col]
|
||||
_on_resized()
|
||||
|
||||
|
||||
func set_range_color(nm: StringName, col: Color):
|
||||
if not ranges_save.has(nm):
|
||||
push_error('нет такого диапазона: \"%s\"' % nm)
|
||||
return false
|
||||
ranges_save[nm][1] = col
|
||||
var rng: = get_node_or_null(NodePath(nm))
|
||||
if not rng:
|
||||
push_error('нет такого элемента: \"%s\"' % nm)
|
||||
return false
|
||||
rng.color = col
|
||||
return true
|
||||
|
||||
|
||||
func clear_ranges():
|
||||
var l0 = ranges_save.size()
|
||||
ranges_save.clear()
|
||||
var l1 = ranges_save.size()
|
||||
_on_resized()
|
||||
return l1 < l0
|
||||
|
||||
|
||||
func del_range(nm: StringName) -> bool:
|
||||
var rc = ranges_save.erase(nm)
|
||||
_on_resized()
|
||||
return rc
|
||||
|
||||
|
||||
func _add_range_view(nm: StringName, x0: float, x1: float, col: Color):
|
||||
var rng = Polygon2D.new()
|
||||
var canvas = $grid/canvas
|
||||
var canvas_size = canvas.size
|
||||
var point0 = canvas_size * Vector2(x0, gap_bottom) ## лево низ
|
||||
var point1 = canvas_size * Vector2(x0, 1.0 - gap_top) ## лево верх
|
||||
var point2 = canvas_size * Vector2(x1, 1.0 - gap_top) ## право верх
|
||||
var point3 = canvas_size * Vector2(x1, gap_bottom) ## право низ
|
||||
rng.polygon = [point0, point1, point2, point3]
|
||||
rng.name = nm
|
||||
rng.color = col
|
||||
canvas.add_child(rng)
|
||||
|
||||
|
||||
## Удаляет заданный диапазон.
|
||||
func _del_range_view(nm: StringName) -> void:
|
||||
var canvas: = $grid/canvas
|
||||
var rng: = canvas.get_node(NodePath(nm))
|
||||
canvas.remove_child(rng)
|
||||
rng.queue_free()
|
||||
|
||||
|
||||
func _clear_ranges_view():
|
||||
var canvas: = $grid/canvas
|
||||
var range_views: = canvas.get_children()
|
||||
for rng in range_views:
|
||||
canvas.remove_child(rng)
|
||||
rng.queue_free()
|
||||
|
||||
|
||||
func _on_resized() -> void:
|
||||
_clear_ranges_view()
|
||||
for nm in ranges_save:
|
||||
var range_save = ranges_save[nm]
|
||||
var rng = range_save[0]
|
||||
var col = range_save[1]
|
||||
_add_range_view(nm, rng.x, rng.y, col)
|
||||
1
scenes/hranges/panel.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://jtio1scc72bl
|
||||
38
scenes/hranges/panel.tscn
Normal file
@@ -0,0 +1,38 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://hr55mkcneaer"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://jtio1scc72bl" path="res://scenes/hranges/panel.gd" id="1_pg3d7"]
|
||||
[ext_resource type="Texture2D" uid="uid://c73tjrn8gr00o" path="res://data/Передатчик.png" id="2_ajqhv"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ajqhv"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_56wj8"]
|
||||
corner_radius_top_left = 5
|
||||
corner_radius_top_right = 5
|
||||
corner_radius_bottom_right = 5
|
||||
corner_radius_bottom_left = 5
|
||||
|
||||
[node name="panel" type="PanelContainer"]
|
||||
offset_right = 400.0
|
||||
offset_bottom = 45.0
|
||||
theme_override_styles/panel = SubResource("StyleBoxEmpty_ajqhv")
|
||||
script = ExtResource("1_pg3d7")
|
||||
back_color = Color(0.601223, 0.601223, 0.601223, 1)
|
||||
|
||||
[node name="grid" type="GridContainer" parent="."]
|
||||
layout_mode = 2
|
||||
columns = 2
|
||||
|
||||
[node name="image" type="TextureRect" parent="grid"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 0
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("2_ajqhv")
|
||||
expand_mode = 3
|
||||
|
||||
[node name="canvas" type="PanelContainer" parent="grid"]
|
||||
self_modulate = Color(0.601223, 0.601223, 0.601223, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_56wj8")
|
||||
|
||||
[connection signal="resized" from="." to="." method="_on_resized"]
|
||||
@@ -97,8 +97,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 2"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[1].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[1].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[1].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[1].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[1]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[1]['TestPassed']"]
|
||||
|
||||
@@ -122,8 +122,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 3"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[2].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[2].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[2].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[2].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[2]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[2]['TestPassed']"]
|
||||
|
||||
@@ -147,8 +147,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 4"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[3].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[3].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[3].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[3].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[3]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[3]['TestPassed']"]
|
||||
|
||||
@@ -172,8 +172,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 5"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[4].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[4].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[4].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[4].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[4]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[4]['TestPassed']"]
|
||||
|
||||
@@ -197,8 +197,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 6"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[5].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[5].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[5].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[5].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[5]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[5]['TestPassed']"]
|
||||
|
||||
@@ -222,8 +222,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 7"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[6].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[6].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[6].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[6].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[6]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[6]['TestPassed']"]
|
||||
|
||||
@@ -247,8 +247,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 8"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[7].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[7].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[7].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[7].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[7]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[7]['TestPassed']"]
|
||||
|
||||
@@ -800,7 +800,7 @@ offset_right = 580.0
|
||||
offset_bottom = 115.0
|
||||
tooltip_text = "Плата АЦП ADCS500"
|
||||
fname = "АЦП"
|
||||
metadata/state = ["SelfTest[4].SystemList[0].DevList[1]['TestPassed']"]
|
||||
metadata/state = ["SelfTest[0].SystemList[0].DevList[1]['TestPassed']"]
|
||||
|
||||
[node name="dsp" parent="." instance=ExtResource("4_mtf2n")]
|
||||
layout_mode = 0
|
||||
@@ -809,7 +809,7 @@ offset_right = 580.0
|
||||
offset_bottom = 60.0
|
||||
tooltip_text = "Плата цифровой обработки сигналов BPL"
|
||||
fname = "Сигн. проц."
|
||||
metadata/state = ["SelfTest[4].SystemList[0].DevList[0]['TestPassed']"]
|
||||
metadata/state = ["SelfTest[0].SystemList[0].DevList[0]['TestPassed']"]
|
||||
|
||||
[node name="gen" parent="." instance=ExtResource("2_dmhrm")]
|
||||
layout_mode = 2
|
||||
@@ -827,8 +827,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Генератор"
|
||||
metadata/value0 = "SelfTest[1].SystemList[2].DevList[0].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[2].DevList[0].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[2].DevList[0].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[2].DevList[0].TestedParamList[0]['CurrentValue']"
|
||||
metadata/state = ["SelfTest[0].SystemList[2].DevList[0]['TestPassed']"]
|
||||
|
||||
[node name="rpu" parent="." instance=ExtResource("2_dmhrm")]
|
||||
@@ -848,8 +848,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Приёмник 20...1000 МГц"
|
||||
metadata/value0 = "SelfTest[1].SystemList[0].DevList[0]['TestPassed']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[0].DevList[0]['TestPassed']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[0].DevList[0]['TestPassed']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[0].DevList[0]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[0].DevList[3]['TestPassed']"]
|
||||
|
||||
[connection signal="pressed" from="konverter/grid/kanal1" to="." method="_on_item_pressed"]
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://8ll27id5ajq1"]
|
||||
[gd_scene load_steps=3 format=3 uid="uid://8ll27id5ajq1"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://d0jwv5opi3mrl" path="res://scenes/pribor-afsp/pribor-afsp.gd" id="1_151rh"]
|
||||
[ext_resource type="Script" uid="uid://bux47vkw71w1t" path="res://scenes/контроль/request.gd" id="2_4vyhj"]
|
||||
[ext_resource type="PackedScene" uid="uid://dnxq870xf6pkh" path="res://scenes/pribor-afsp/bort-afsp.tscn" id="3_d7iti"]
|
||||
|
||||
[node name="pribor_afsp" type="Control"]
|
||||
@@ -20,13 +19,6 @@ settings_path_to_url = "Адрес АФСП левого борта"
|
||||
settings_path_to_wait_time = "Период опроса состояния АФСП, секунды"
|
||||
metadata/DeviceName = &"Устройство РР левого борта"
|
||||
|
||||
[node name="request" type="HTTPRequest" parent="."]
|
||||
use_threads = true
|
||||
script = ExtResource("2_4vyhj")
|
||||
|
||||
[node name="timer" type="Timer" parent="request"]
|
||||
autostart = true
|
||||
|
||||
[node name="bort" parent="." instance=ExtResource("3_d7iti")]
|
||||
layout_mode = 0
|
||||
offset_left = 24.0
|
||||
@@ -35,7 +27,4 @@ offset_right = 604.0
|
||||
offset_bottom = 1216.78
|
||||
metadata/DeviceName = &"Устройство РР левого борта"
|
||||
|
||||
[connection signal="child_entered_tree" from="request" to="request" method="_on_child_entered_tree"]
|
||||
[connection signal="request_completed" from="request" to="." method="_on_request_completed"]
|
||||
[connection signal="timeout" from="request/timer" to="request" method="_on_request_timer"]
|
||||
[connection signal="pressed" from="bort" to="." method="_on_item_pressed"]
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://5uv1idl3lqet"]
|
||||
[gd_scene load_steps=3 format=3 uid="uid://5uv1idl3lqet"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://d0jwv5opi3mrl" path="res://scenes/pribor-afsp/pribor-afsp.gd" id="1_tfses"]
|
||||
[ext_resource type="Script" uid="uid://bux47vkw71w1t" path="res://scenes/контроль/request.gd" id="2_miwrd"]
|
||||
[ext_resource type="PackedScene" uid="uid://dnxq870xf6pkh" path="res://scenes/pribor-afsp/bort-afsp.tscn" id="3_xpxb5"]
|
||||
|
||||
[node name="pribor_afsp" type="Control"]
|
||||
@@ -20,13 +19,6 @@ settings_path_to_url = "Адрес АФСП правого борта"
|
||||
settings_path_to_wait_time = "Период опроса состояния АФСП, секунды"
|
||||
metadata/DeviceName = &"Устройство РР правого борта"
|
||||
|
||||
[node name="request" type="HTTPRequest" parent="."]
|
||||
use_threads = true
|
||||
script = ExtResource("2_miwrd")
|
||||
|
||||
[node name="timer" type="Timer" parent="request"]
|
||||
autostart = true
|
||||
|
||||
[node name="bort" parent="." instance=ExtResource("3_xpxb5")]
|
||||
layout_mode = 0
|
||||
offset_left = 12.0
|
||||
@@ -35,7 +27,4 @@ offset_right = 592.0
|
||||
offset_bottom = 1130.0
|
||||
metadata/DeviceName = &"Устройство РР правого борта"
|
||||
|
||||
[connection signal="child_entered_tree" from="request" to="request" method="_on_child_entered_tree"]
|
||||
[connection signal="request_completed" from="request" to="." method="_on_request_completed"]
|
||||
[connection signal="timeout" from="request/timer" to="request" method="_on_request_timer"]
|
||||
[connection signal="pressed" from="bort" to="." method="_on_item_pressed"]
|
||||
|
||||
@@ -7,98 +7,145 @@ class_name pribor_afsp extends 'res://scenes/контроль/прибор.gd'
|
||||
@export var settings_path_to_url: String = '' ## Должно быть в ProjectSettings
|
||||
@export var settings_path_to_wait_time: String = '' ## Должно быть в ProjectSettings
|
||||
|
||||
signal receive_response_afp_bpo()
|
||||
|
||||
static var json_conv: JSON = JSON.new()
|
||||
static var node_maper = load('res://scenes/контроль/node-maper.gd')
|
||||
static var node_request: Node
|
||||
static var node_request_timer: Node
|
||||
var ctrl_pos = 0
|
||||
# SystemName: "gen" DevList - там состояние связи с генератором по кан шине
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
ProjectSettings.connect('settings_changed', on_settings_chaged)
|
||||
node_request = $request
|
||||
node_request_timer = $request/timer
|
||||
on_settings_chaged()
|
||||
# Подключаемся к сигналам в зависимости от борта
|
||||
if this_afsp_name == 'Устройство РР левого борта':
|
||||
scouting.response_received_afsp_left.connect(_on_response_received)
|
||||
else:
|
||||
scouting.response_received_afsp_right.connect(_on_response_received)
|
||||
|
||||
# При старте отрисовываем последние данные (если есть)
|
||||
_on_press_device()
|
||||
|
||||
|
||||
func on_settings_chaged():
|
||||
node_request.request_url = ProjectSettings.get_setting('application/config/%s' % settings_path_to_url)
|
||||
node_request_timer.wait_time = float(ProjectSettings.get_setting('application/config/%s' % settings_path_to_wait_time))
|
||||
tools.allways(node_request.request_url != null)
|
||||
|
||||
|
||||
func _on_request_completed(result, _response_code, headers, body: PackedByteArray):
|
||||
|
||||
var unit_instance: = network.get_unit_instance(unit_name)
|
||||
|
||||
if result != 0:
|
||||
var rs = node_request.get_result_string(result)
|
||||
log.error('\"%s\"' % rs)
|
||||
if unit_instance.online:
|
||||
unit_instance.online = false
|
||||
unit_instance.emit_signal('line_changed', unit_instance)
|
||||
# Обработка полученного ответа от rtr
|
||||
func _on_response_received(response: String, success: bool) -> void:
|
||||
if not success:
|
||||
log.error('Ошибка запроса или нет связи: %s' % response)
|
||||
_reset_ui_to_zero()
|
||||
return
|
||||
|
||||
var json_str: String = body.get_string_from_utf8()
|
||||
if not json_str:
|
||||
push_error('не удаётся получить строку utf8 из данных (%s)' % headers)
|
||||
if unit_instance.online:
|
||||
unit_instance.online = false
|
||||
unit_instance.emit_signal('line_changed', unit_instance)
|
||||
|
||||
# Парсим JSON строку
|
||||
var parse_result = json_conv.parse(response)
|
||||
if parse_result != OK:
|
||||
var err = json_conv.get_error_message()
|
||||
push_error('разбор json прерван - "%s"' % err)
|
||||
_reset_ui_to_zero()
|
||||
return
|
||||
|
||||
var rc: = json_conv.parse(json_str)
|
||||
if rc != Error.OK:
|
||||
var err: = json_conv.get_error_message()
|
||||
push_error('разбор json прерван - \"%s\" (%s)' % [err, headers])
|
||||
if unit_instance.online:
|
||||
unit_instance.online = false
|
||||
unit_instance.emit_signal('line_changed', unit_instance)
|
||||
return
|
||||
|
||||
|
||||
# Ищем имя прибора в JSON
|
||||
var pp = []
|
||||
tools.map_solid_to_array(prefix_path, pp)
|
||||
var ret_val = [null, false, 0]
|
||||
var pp_copy = pp.duplicate(true)
|
||||
tools.get_value_by_path(json_conv.data, pp, ret_val)
|
||||
|
||||
if not ret_val[1]:
|
||||
push_error('путь %s не найден (%s)' % [pp_copy, ret_val[2]])
|
||||
_reset_ui_to_zero()
|
||||
return
|
||||
|
||||
|
||||
var received_afsp_name: StringName = ret_val[0]
|
||||
|
||||
|
||||
# Проверяем, что ответ от нужного прибора
|
||||
if this_afsp_name != received_afsp_name:
|
||||
# TODO: Сюда попадаем, когда приходит от другого борта
|
||||
#push_error('не известное устройство: \"%s\", ожидадось: \"%s\"' % [received_afsp_name, this_afsp_name])
|
||||
# Ответ от другого борта - игнорируем
|
||||
return
|
||||
|
||||
# Обновляем UI элементы из JSON
|
||||
_update_ui(json_conv.data)
|
||||
|
||||
unit_instance.rx_tick = Time.get_ticks_msec()
|
||||
if not unit_instance.online:
|
||||
unit_instance.online = true
|
||||
unit_instance.emit_signal('line_changed', unit_instance)
|
||||
|
||||
# Обновление интерфейса из JSON данных
|
||||
func _update_ui(json_data: Dictionary) -> void:
|
||||
# Конвертер
|
||||
for child in $bort.get_node('konverter/grid').get_children():
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value0')
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value1')
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value2')
|
||||
node_maper.map_error_codes_to_item(json_conv.data, child, 'state', 0)
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value0')
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value1')
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value2')
|
||||
node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0)
|
||||
|
||||
# Антенна 1
|
||||
for child in $bort.get_node('antenna1/grid').get_children():
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value0')
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value1')
|
||||
node_maper.map_error_codes_to_item(json_conv.data, child, 'state', 0)
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value0')
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value1')
|
||||
node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0)
|
||||
|
||||
# Антенна 2
|
||||
for child in $bort.get_node('antenna2/grid').get_children():
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value0')
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value1')
|
||||
node_maper.map_error_codes_to_item(json_conv.data, child, 'state', 0)
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value0')
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value1')
|
||||
node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0)
|
||||
|
||||
# Остальные элементы
|
||||
for child in $bort.get_children():
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value0')
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value1')
|
||||
node_maper.map_error_codes_to_item(json_conv.data, child, 'state', 0)
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value0')
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value1')
|
||||
node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0)
|
||||
|
||||
emit_signal('receive_response_afp_bpo')
|
||||
|
||||
# Сброс всех UI элементов в 0 (при отсутствии данных)
|
||||
func _reset_ui_to_zero() -> void:
|
||||
# Конвертер
|
||||
for child in $bort.get_node('konverter/grid').get_children():
|
||||
_reset_item_value(child)
|
||||
|
||||
# Антенна 1
|
||||
for child in $bort.get_node('antenna1/grid').get_children():
|
||||
_reset_item_value(child)
|
||||
|
||||
# Антенна 2
|
||||
for child in $bort.get_node('antenna2/grid').get_children():
|
||||
_reset_item_value(child)
|
||||
|
||||
# Остальные элементы
|
||||
for child in $bort.get_children():
|
||||
_reset_item_value(child)
|
||||
|
||||
|
||||
# Сброс конкретного элемента в 0
|
||||
func _reset_item_value(item) -> void:
|
||||
item.set('value0', 0)
|
||||
item.set('value1', 0)
|
||||
item.set('value2', 0)
|
||||
item.set('state', 0)
|
||||
|
||||
|
||||
# Отрисовывание при нажатии на прибор
|
||||
func _on_press_device() -> void:
|
||||
# Проверяем, есть ли сохраненные данные в rtr
|
||||
var has_data = false
|
||||
var last_response = ""
|
||||
|
||||
if this_afsp_name == 'Устройство РР левого борта':
|
||||
has_data = scouting.has_afsp_left_success()
|
||||
if has_data: last_response = scouting.get_afsp_left_response()
|
||||
else:
|
||||
has_data = scouting.has_afsp_right_success()
|
||||
if has_data: last_response = scouting.get_afsp_right_response()
|
||||
|
||||
# Если есть данные - парсим и отображаем
|
||||
if has_data and not last_response.is_empty():
|
||||
var parse_result = json_conv.parse(last_response)
|
||||
if parse_result == OK:
|
||||
# Проверяем, что это данные именно от этого прибора
|
||||
var pp = []
|
||||
tools.map_solid_to_array(prefix_path, pp)
|
||||
var ret_val = [null, false, 0]
|
||||
tools.get_value_by_path(json_conv.data, pp, ret_val)
|
||||
|
||||
if ret_val[1] and ret_val[0] == this_afsp_name:
|
||||
_update_ui(json_conv.data)
|
||||
return
|
||||
|
||||
# Если данных нет или они не подходят - сбрасываем в 0
|
||||
_reset_ui_to_zero()
|
||||
|
||||
|
||||
## Вызывается при клике мыши на элементе.
|
||||
|
||||
@@ -4,64 +4,53 @@ class_name pribor_rtr extends 'res://scenes/контроль/прибор.gd'
|
||||
@export var prefix_path: String = '' ## Должно быть в JSON
|
||||
@export var this_bpo1_name: String = '' ## Должно быть в JSON
|
||||
@export var this_bpo2_name: String = '' ## Должно быть в JSON
|
||||
@export var unit_name1: StringName= '' ## Должно быть в settings.gd
|
||||
@export var unit_name2: StringName= '' ## Должно быть в settings.gd
|
||||
@export var unit_name1: StringName = '' ## Должно быть в settings.gd
|
||||
@export var unit_name2: StringName = '' ## Должно быть в settings.gd
|
||||
@export var settings_path1_to_url: String = '' ## Должно быть в ProjectSettings
|
||||
@export var settings_path2_to_url: String = '' ## Должно быть в ProjectSettings
|
||||
@export var settings_path_to_wait_time: String = '' ## Должно быть в ProjectSettings
|
||||
|
||||
signal receive_response_afp_bpo()
|
||||
|
||||
static var json_conv: JSON = JSON.new()
|
||||
static var node_maper = load('res://scenes/контроль/node-maper.gd')
|
||||
static var node_request_1: Node
|
||||
static var node_request_timer_1: Node
|
||||
static var node_request_2: Node
|
||||
static var node_request_timer_2: Node
|
||||
|
||||
|
||||
var ctrl_pos = 110
|
||||
var bort_to_node_name = {}
|
||||
var bort_to_unit_name = {}
|
||||
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
ProjectSettings.connect('settings_changed', on_settings_changed)
|
||||
node_request_1 = $request1
|
||||
node_request_timer_1 = $request1/timer
|
||||
node_request_2 = $request2
|
||||
node_request_timer_2 = $request2/timer
|
||||
scouting.response_received_bpo_left.connect(_on_response_received_left)
|
||||
scouting.response_received_bpo_right.connect(_on_response_received_right)
|
||||
|
||||
on_settings_changed()
|
||||
find_labels(self)
|
||||
|
||||
|
||||
_on_press_device()
|
||||
|
||||
func on_settings_changed():
|
||||
bort_to_node_name.merge({this_bpo1_name: 'grid_bpo_a1', this_bpo2_name: 'grid_bpo_a2'}, true)
|
||||
bort_to_unit_name.merge({this_bpo1_name: unit_name1, this_bpo2_name: unit_name2})
|
||||
node_request_1.request_url = ProjectSettings.get_setting('application/config/%s' % settings_path1_to_url)
|
||||
node_request_timer_1.wait_time = float(ProjectSettings.get_setting('application/config/%s' % settings_path_to_wait_time))
|
||||
node_request_2.request_url = ProjectSettings.get_setting('application/config/%s' % settings_path2_to_url)
|
||||
node_request_timer_2.wait_time = float(ProjectSettings.get_setting('application/config/%s' % settings_path_to_wait_time))
|
||||
assert(node_request_1.request_url != null)
|
||||
assert(node_request_2.request_url != null)
|
||||
bort_to_unit_name.merge({this_bpo1_name: unit_name1, this_bpo2_name: unit_name2}, true)
|
||||
|
||||
|
||||
func _on_request_completed(result, _response_code, headers, body: PackedByteArray):
|
||||
if result != 0:
|
||||
var rs = node_request_1.get_result_string(result)
|
||||
push_error('\"%s\"' % rs)
|
||||
# Обработка ответа от первого бпо
|
||||
func _on_response_received_left(response: String, success: bool) -> void:
|
||||
if not success:
|
||||
log.error('Ошибка запроса или нет связи (левый): %s' % response)
|
||||
_reset_grid('grid_bpo_a1')
|
||||
return
|
||||
_parse_and_update_ui(response)
|
||||
|
||||
var json_str: = body.get_string_from_utf8()
|
||||
if not json_str:
|
||||
push_error('не удаётся получить строку из utf8-данных (%s)' % headers)
|
||||
# Обработка ответа от второго бпо
|
||||
func _on_response_received_right(response: String, success: bool) -> void:
|
||||
if not success:
|
||||
log.error('Ошибка запроса или нет связи (правый): %s' % response)
|
||||
_reset_grid('grid_bpo_a2')
|
||||
return
|
||||
_parse_and_update_ui(response)
|
||||
|
||||
# Оригинальный парсинг из _on_request_completed
|
||||
func _parse_and_update_ui(json_str: String) -> void:
|
||||
var rc: = json_conv.parse(json_str)
|
||||
if rc != Error.OK:
|
||||
var err = json_conv.get_error_message()
|
||||
push_error('разбор json прерван - \"%s\" (%s)' % [err, headers])
|
||||
push_error('разбор json прерван - %s' % err)
|
||||
return
|
||||
|
||||
var pp: = []
|
||||
@@ -69,45 +58,96 @@ func _on_request_completed(result, _response_code, headers, body: PackedByteArra
|
||||
var ret_val = [null, false, 0]
|
||||
var pp_copy = pp.duplicate(true)
|
||||
tools.get_value_by_path(json_conv.data, pp, ret_val)
|
||||
|
||||
if not ret_val[1]:
|
||||
push_error('путь %s не найден (%s)' % [pp_copy, ret_val[2]])
|
||||
return
|
||||
|
||||
if not bort_to_node_name.has(ret_val[0]):
|
||||
push_error('не известное устройство: \"%s\"' % ret_val[0])
|
||||
var device_name: String = ret_val[0]
|
||||
|
||||
if not bort_to_node_name.has(device_name):
|
||||
push_error('не известное устройство: %s' % device_name)
|
||||
return
|
||||
|
||||
var node_name = bort_to_node_name[ret_val[0]]
|
||||
var node_name = bort_to_node_name[device_name]
|
||||
var bort_node = get_node(node_name)
|
||||
|
||||
var unit_name = bort_to_unit_name[ret_val[0]]
|
||||
var unit_instance = network.get_unit_instance(unit_name)
|
||||
unit_instance.rx_tick = Time.get_ticks_msec()
|
||||
if not unit_instance.online:
|
||||
unit_instance.online = true
|
||||
unit_instance.emit_signal('line_changed', unit_instance)
|
||||
|
||||
# Обновляем UI только для конкретного грида
|
||||
for item in bort_node.get_children():
|
||||
node_maper.map_value_to_item(json_conv.data, item, 'state')
|
||||
|
||||
# Обновляем групповые индикаторы
|
||||
_update_group_indicators_original()
|
||||
|
||||
# Оригинальное обновление групповых индикаторов
|
||||
func _update_group_indicators_original() -> void:
|
||||
# Сначала сбрасываем все
|
||||
if has_node('yas_bpo_a1'):
|
||||
$yas_bpo_a1.state = 0
|
||||
if has_node('yas_bpo_a2'):
|
||||
$yas_bpo_a2.state = 0
|
||||
if has_node('mod_pit_g1'):
|
||||
$mod_pit_g1.state = 0
|
||||
|
||||
# Проверяем обе группы и устанавливаем если есть активные
|
||||
var items = get_tree().get_nodes_in_group('управляется-по-шине-1')
|
||||
for node in items:
|
||||
if node.state == 1:
|
||||
$yas_bpo_a1.state = 1
|
||||
if node.has_method('get') and node.get('state') == 1:
|
||||
if has_node('yas_bpo_a1'):
|
||||
$yas_bpo_a1.state = 1
|
||||
break
|
||||
|
||||
items = get_tree().get_nodes_in_group('управляется-по-шине-2')
|
||||
for node in items:
|
||||
if node.state == 1:
|
||||
$yas_bpo_a2.state = 1
|
||||
if node.has_method('get') and node.get('state') == 1:
|
||||
if has_node('yas_bpo_a2'):
|
||||
$yas_bpo_a2.state = 1
|
||||
break
|
||||
|
||||
items = get_tree().get_nodes_in_group('потребитель-питания')
|
||||
for node in items:
|
||||
if node.state == 1:
|
||||
$mod_pit_g1.state = 1
|
||||
if node.has_method('get') and node.get('state') == 1:
|
||||
if has_node('mod_pit_g1'):
|
||||
$mod_pit_g1.state = 1
|
||||
break
|
||||
|
||||
emit_signal('receive_response_afp_bpo')
|
||||
# Сброс конкретного грида
|
||||
func _reset_grid(grid_name: String) -> void:
|
||||
if has_node(grid_name):
|
||||
for item in get_node(grid_name).get_children():
|
||||
_reset_item_value(item)
|
||||
_update_group_indicators_original()
|
||||
|
||||
# Сброс всех UI элементов в 0 (при отсутствии данных)
|
||||
func _reset_ui_to_zero() -> void:
|
||||
_reset_grid('grid_bpo_a1')
|
||||
_reset_grid('grid_bpo_a2')
|
||||
|
||||
# Сброс конкретного элемента в 0
|
||||
func _reset_item_value(item) -> void:
|
||||
if item.has_method('set'):
|
||||
item.set('value0', 0)
|
||||
item.set('value1', 0)
|
||||
item.set('value2', 0)
|
||||
item.set('state', 0)
|
||||
|
||||
# Отрисовывание при нажатии на прибор
|
||||
func _on_press_device() -> void:
|
||||
# Проверяем левый борт
|
||||
if scouting.has_bpo_left_success():
|
||||
var response = scouting.get_bpo_left_response()
|
||||
if not response.is_empty():
|
||||
_parse_and_update_ui(response)
|
||||
else:
|
||||
_reset_grid('grid_bpo_a1')
|
||||
|
||||
# Проверяем правый борт
|
||||
if scouting.has_bpo_right_success():
|
||||
var response = scouting.get_bpo_right_response()
|
||||
if not response.is_empty():
|
||||
_parse_and_update_ui(response)
|
||||
else:
|
||||
_reset_grid('grid_bpo_a2')
|
||||
|
||||
func find_labels(node1: Node):
|
||||
if node1 is Label:
|
||||
@@ -123,3 +163,9 @@ func find_labels(node1: Node):
|
||||
node1.set_meta('tooltip_set', true)
|
||||
for child in node1.get_children():
|
||||
find_labels(child)
|
||||
|
||||
## Вызывается при клике мыши на элементе.
|
||||
func _on_item_pressed(block_a: Control):
|
||||
var metas = block_a.get_meta_list()
|
||||
for n in metas:
|
||||
var _v = block_a.get_meta(n)
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://5uv1idl3lqea"]
|
||||
[gd_scene load_steps=4 format=3 uid="uid://5uv1idl3lqea"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://d0jwv5opi3mrk" path="res://scenes/pribor-afsp/pribor-bpo.gd" id="1_bhc4e"]
|
||||
[ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_jp6m0"]
|
||||
[ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="3_jcpjs"]
|
||||
[ext_resource type="Script" uid="uid://bux47vkw71w1t" path="res://scenes/контроль/request.gd" id="4_crej3"]
|
||||
|
||||
[node name="pribor_bpo" type="Control"]
|
||||
layout_mode = 3
|
||||
@@ -198,22 +197,3 @@ offset_bottom = 362.0
|
||||
show_rname = false
|
||||
self_size = Vector2i(50, 145)
|
||||
fname = "Яч. связи"
|
||||
|
||||
[node name="request1" type="HTTPRequest" parent="."]
|
||||
use_threads = true
|
||||
script = ExtResource("4_crej3")
|
||||
|
||||
[node name="timer" type="Timer" parent="request1"]
|
||||
autostart = true
|
||||
|
||||
[node name="request2" type="HTTPRequest" parent="."]
|
||||
use_threads = true
|
||||
script = ExtResource("4_crej3")
|
||||
|
||||
[node name="timer" type="Timer" parent="request2"]
|
||||
autostart = true
|
||||
|
||||
[connection signal="request_completed" from="request1" to="." method="_on_request_completed"]
|
||||
[connection signal="timeout" from="request1/timer" to="request1" method="_on_request_timer"]
|
||||
[connection signal="request_completed" from="request2" to="." method="_on_request_completed"]
|
||||
[connection signal="timeout" from="request2/timer" to="request2" method="_on_request_timer"]
|
||||
|
||||
@@ -58,7 +58,7 @@ offset_right = 205.0
|
||||
offset_bottom = 183.0
|
||||
fname = "Модуль ФС"
|
||||
rname = "A3"
|
||||
metadata/fs = "fs_6"
|
||||
metadata/fs = "fs_7"
|
||||
|
||||
[node name="ref_A5" parent="." groups=["default_reset", "fs_group"] instance=ExtResource("3_kqnvt")]
|
||||
offset_left = 205.0
|
||||
@@ -67,7 +67,7 @@ offset_right = 255.0
|
||||
offset_bottom = 183.0
|
||||
fname = "Модуль ФС"
|
||||
rname = "A2"
|
||||
metadata/fs = "fs_7"
|
||||
metadata/fs = "fs_6"
|
||||
|
||||
[node name="ref_A7" parent="." groups=["default_reset"] instance=ExtResource("3_kqnvt")]
|
||||
offset_left = 255.0
|
||||
|
||||
@@ -109,9 +109,9 @@ func on_press_device(_name_davice: String) -> void:
|
||||
control_data['power_amplifier'] = get_tree().get_nodes_in_group('power_amplifier')
|
||||
control_data['default_reset_array_node'] = get_tree().get_nodes_in_group('default_reset')
|
||||
control_data['module_fs_1'] = $kasseta_fs_kd/ref_A2
|
||||
control_data['module_fs_6'] = $kasseta_fs_kd/ref_A4
|
||||
control_data['module_fs_6'] = $kasseta_fs_kd/ref_A7
|
||||
control_data['dou_6'] = $dou6_A7
|
||||
control_data['module_fs_7'] = $kasseta_fs_kd/ref_A7
|
||||
control_data['module_fs_7'] = $kasseta_fs_kd/ref_A4
|
||||
control_data['dou_7'] = $dou7_A8
|
||||
on_control_result(control_data)
|
||||
|
||||
|
||||
@@ -12,6 +12,13 @@ enum DEVICE_STATUS {
|
||||
CONTROL # Контроль завершен
|
||||
}
|
||||
|
||||
# Состояния сервиса для RTR устройств
|
||||
enum RTR_SERVICEABILITY {
|
||||
NO_CONNECTION = 0, # Нет связи
|
||||
PASSED = 1, # Все тесты пройдены
|
||||
ERROR = 2 # Есть ошибки
|
||||
}
|
||||
|
||||
const STATUS_CONFIG := {
|
||||
DEVICE_STATE.NONE: {'text': 'Нет связи', 'color': Color.WHITE, 'font_color': Color.BLACK},
|
||||
DEVICE_STATE.GOOD: {'text': 'Исправно', 'color': Color.GREEN, 'font_color': Color.BLACK},
|
||||
@@ -22,6 +29,9 @@ class DeviceObserver:
|
||||
var device_name: String
|
||||
var status: Array = [false, false, false] # [online, operational, control_complete]
|
||||
var last_results: Dictionary = {}
|
||||
|
||||
# Для RTR устройств
|
||||
var rtr_serviceability: int = RTR_SERVICEABILITY.NO_CONNECTION
|
||||
|
||||
func update_online_state(online: bool) -> bool:
|
||||
if status[DEVICE_STATUS.ONLINE] != online:
|
||||
@@ -55,11 +65,28 @@ class DeviceObserver:
|
||||
status[DEVICE_STATUS.CONTROL] = false
|
||||
changed = true
|
||||
return changed
|
||||
|
||||
func update_rtr_serviceability(state: int) -> bool:
|
||||
if rtr_serviceability != state:
|
||||
rtr_serviceability = state
|
||||
# Обновляем operational статус на основе RTR
|
||||
var new_operational = (state == RTR_SERVICEABILITY.PASSED)
|
||||
if status[DEVICE_STATUS.STATUS] != new_operational:
|
||||
status[DEVICE_STATUS.STATUS] = new_operational
|
||||
return true
|
||||
return false
|
||||
|
||||
var device_observers: Dictionary = {}
|
||||
var overall_prd_state: DEVICE_STATE = DEVICE_STATE.NONE
|
||||
var status_uf: int = DEVICE_STATE.NONE # Статус УФ (УАРЭП-ЭМС)
|
||||
|
||||
# Добавляем наблюдателей для RTR устройств
|
||||
var rtr_device_names := [
|
||||
'rtr_afsp_left',
|
||||
'rtr_afsp_right',
|
||||
'rtr_bpo' # Общий для левого и правого БПО
|
||||
]
|
||||
|
||||
func _ready() -> void:
|
||||
tooltip_text = 'Нет связи с приборами комплекса'
|
||||
add_theme_color_override('font_color', Color.BLACK)
|
||||
@@ -78,11 +105,20 @@ func _ready() -> void:
|
||||
|
||||
# Подписка на УФ
|
||||
signaller.connect('update_uf_serviceability', _on_uf_status_receive)
|
||||
|
||||
# Подписка на сигналы RTR (через signaller или напрямую)
|
||||
_connect_rtr_signals()
|
||||
|
||||
# Инициализация начального состояния
|
||||
_recalculate_overall_state()
|
||||
|
||||
|
||||
func _connect_rtr_signals() -> void:
|
||||
scouting.connect('serviceability_rtr_afsp_left', Callable(self, '_on_rtr_afsp_left_serviceability'))
|
||||
scouting.connect('serviceability_rtr_afsp_right', Callable(self, '_on_rtr_afsp_right_serviceability'))
|
||||
scouting.connect('serviceability_rtr_bpo', Callable(self, '_on_rtr_bpo_serviceability'))
|
||||
|
||||
|
||||
func _initialize_observers() -> void:
|
||||
var device_names := [
|
||||
'уарэп-яу07-1н', 'уарэп-яу07-1в', 'уарэп-яу07-1к',
|
||||
@@ -94,6 +130,69 @@ func _initialize_observers() -> void:
|
||||
for device_name in device_names:
|
||||
device_observers[device_name] = DeviceObserver.new()
|
||||
device_observers[device_name].device_name = device_name
|
||||
|
||||
# Инициализируем наблюдателей для RTR устройств
|
||||
for rtr_name in rtr_device_names:
|
||||
device_observers[rtr_name] = DeviceObserver.new()
|
||||
device_observers[rtr_name].device_name = rtr_name
|
||||
|
||||
|
||||
# Обработчики сигналов RTR
|
||||
func _on_rtr_afsp_left_serviceability(state: int) -> void:
|
||||
var observer: DeviceObserver = device_observers.get('rtr_afsp_left')
|
||||
if not observer:
|
||||
return
|
||||
|
||||
var changed = false
|
||||
if observer.update_rtr_serviceability(state):
|
||||
changed = true
|
||||
|
||||
var is_online = (state != RTR_SERVICEABILITY.NO_CONNECTION)
|
||||
if observer.update_online_state(is_online):
|
||||
changed = true
|
||||
|
||||
if changed:
|
||||
_recalculate_overall_state()
|
||||
else:
|
||||
_update_display()
|
||||
|
||||
|
||||
func _on_rtr_afsp_right_serviceability(state: int) -> void:
|
||||
var observer: DeviceObserver = device_observers.get('rtr_afsp_right')
|
||||
if not observer:
|
||||
return
|
||||
|
||||
var changed = false
|
||||
if observer.update_rtr_serviceability(state):
|
||||
changed = true
|
||||
|
||||
var is_online = (state != RTR_SERVICEABILITY.NO_CONNECTION)
|
||||
if observer.update_online_state(is_online):
|
||||
changed = true
|
||||
|
||||
if changed:
|
||||
_recalculate_overall_state()
|
||||
else:
|
||||
_update_display()
|
||||
|
||||
|
||||
func _on_rtr_bpo_serviceability(state: int) -> void:
|
||||
var observer: DeviceObserver = device_observers.get('rtr_bpo')
|
||||
if not observer:
|
||||
return
|
||||
|
||||
var changed = false
|
||||
if observer.update_rtr_serviceability(state):
|
||||
changed = true
|
||||
|
||||
var is_online = (state != RTR_SERVICEABILITY.NO_CONNECTION)
|
||||
if observer.update_online_state(is_online):
|
||||
changed = true
|
||||
|
||||
if changed:
|
||||
_recalculate_overall_state()
|
||||
else:
|
||||
_update_display()
|
||||
|
||||
|
||||
func _on_prd_online_changed(line_status: Object, prd_module: Object) -> void:
|
||||
@@ -123,7 +222,12 @@ func _recalculate_overall_state() -> void:
|
||||
var has_online_prd := false
|
||||
var all_prd_operational := true
|
||||
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
# Пропускаем RTR устройства при подсчете ПРД
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
has_online_prd = true
|
||||
|
||||
@@ -142,15 +246,35 @@ func _recalculate_overall_state() -> void:
|
||||
prd_state = DEVICE_STATE.ERR
|
||||
else:
|
||||
prd_state = DEVICE_STATE.NONE
|
||||
|
||||
# Проверяем статус RTR устройств
|
||||
var rtr_state := DEVICE_STATE.NONE
|
||||
var has_online_rtr := false
|
||||
var all_rtr_operational := true
|
||||
|
||||
for rtr_name in rtr_device_names:
|
||||
var observer = device_observers.get(rtr_name)
|
||||
if observer and observer.status[DEVICE_STATUS.ONLINE]:
|
||||
has_online_rtr = true
|
||||
if not observer.status[DEVICE_STATUS.STATUS]:
|
||||
all_rtr_operational = false
|
||||
|
||||
if has_online_rtr:
|
||||
if all_rtr_operational:
|
||||
rtr_state = DEVICE_STATE.GOOD
|
||||
else:
|
||||
rtr_state = DEVICE_STATE.ERR
|
||||
else:
|
||||
rtr_state = DEVICE_STATE.NONE
|
||||
|
||||
# Комбинируем статусы по правилу:
|
||||
# 1. Если хоть один ERROR → ERROR
|
||||
# 2. Если нет ERROR и хоть один GOOD → GOOD
|
||||
# 3. Иначе → NONE
|
||||
|
||||
if prd_state == DEVICE_STATE.ERR or status_uf == DEVICE_STATE.ERR:
|
||||
if prd_state == DEVICE_STATE.ERR or status_uf == DEVICE_STATE.ERR or rtr_state == DEVICE_STATE.ERR:
|
||||
new_state = DEVICE_STATE.ERR
|
||||
elif prd_state == DEVICE_STATE.GOOD or status_uf == DEVICE_STATE.GOOD:
|
||||
elif prd_state == DEVICE_STATE.GOOD or status_uf == DEVICE_STATE.GOOD or rtr_state == DEVICE_STATE.GOOD:
|
||||
new_state = DEVICE_STATE.GOOD
|
||||
else:
|
||||
new_state = DEVICE_STATE.NONE
|
||||
@@ -174,6 +298,7 @@ func _get_tooltip_text() -> String:
|
||||
# Получаем статистику по ПРД
|
||||
var prd_summary = _get_prd_summary()
|
||||
var uf_status_str = _get_uf_status_text()
|
||||
var rtr_summary = _get_rtr_summary()
|
||||
|
||||
match overall_prd_state:
|
||||
DEVICE_STATE.NONE:
|
||||
@@ -185,6 +310,7 @@ func _get_tooltip_text() -> String:
|
||||
|
||||
tooltip += '\n\nСтатус ПРД систем: ' + prd_summary
|
||||
tooltip += '\nСтатус УФ: ' + uf_status_str
|
||||
tooltip += '\nСтатус RTR: ' + rtr_summary
|
||||
|
||||
# Детализация по источникам статуса
|
||||
tooltip += '\n\nСостояние систем:'
|
||||
@@ -192,7 +318,10 @@ func _get_tooltip_text() -> String:
|
||||
# ПРД системы
|
||||
var prd_ok_count = 0
|
||||
var prd_total = 0
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
prd_total += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
@@ -202,15 +331,67 @@ func _get_tooltip_text() -> String:
|
||||
|
||||
# УФ система
|
||||
tooltip += '\nУФ: ' + _get_uf_status_text()
|
||||
|
||||
|
||||
# RTR системы
|
||||
tooltip += '\nRTR:'
|
||||
for rtr_name in rtr_device_names:
|
||||
var observer = device_observers.get(rtr_name)
|
||||
if observer:
|
||||
var status_text = _get_rtr_status_text(observer.rtr_serviceability)
|
||||
var display_name = _get_rtr_display_name(rtr_name)
|
||||
tooltip += '\n - %s: %s' % [display_name, status_text]
|
||||
return tooltip
|
||||
|
||||
|
||||
func _get_rtr_summary() -> String:
|
||||
var online_count := 0
|
||||
var operational_count := 0
|
||||
|
||||
for rtr_name in rtr_device_names:
|
||||
var observer = device_observers.get(rtr_name)
|
||||
if observer and observer.status[DEVICE_STATUS.ONLINE]:
|
||||
online_count += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
operational_count += 1
|
||||
|
||||
if online_count == 0:
|
||||
return 'Нет связи'
|
||||
else:
|
||||
return '%d/%d исправно' % [operational_count, online_count]
|
||||
|
||||
|
||||
func _get_rtr_status_text(state: int) -> String:
|
||||
match state:
|
||||
RTR_SERVICEABILITY.NO_CONNECTION:
|
||||
return 'Нет связи'
|
||||
RTR_SERVICEABILITY.PASSED:
|
||||
return 'Исправен'
|
||||
RTR_SERVICEABILITY.ERROR:
|
||||
return 'Ошибка'
|
||||
_:
|
||||
return 'Неизвестно'
|
||||
|
||||
|
||||
func _get_rtr_display_name(rtr_key: String) -> String:
|
||||
match rtr_key:
|
||||
'rtr_afsp_left':
|
||||
return 'АФСП Л'
|
||||
'rtr_afsp_right':
|
||||
return 'АФСП П'
|
||||
'rtr_bpo':
|
||||
return 'РТР'
|
||||
_:
|
||||
return rtr_key.replace('rtr_', '')
|
||||
|
||||
|
||||
func _get_prd_summary() -> String:
|
||||
var online_count := 0
|
||||
var operational_count := 0
|
||||
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
online_count += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
@@ -235,14 +416,20 @@ func _get_uf_status_text() -> String:
|
||||
|
||||
|
||||
func _has_prd_errors() -> bool:
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE] and not observer.status[DEVICE_STATUS.STATUS]:
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func _has_operational_prd() -> bool:
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE] and observer.status[DEVICE_STATUS.STATUS]:
|
||||
return true
|
||||
return false
|
||||
@@ -257,7 +444,8 @@ func get_device_status(device_name: String) -> Dictionary:
|
||||
'operational': observer.status[DEVICE_STATUS.STATUS],
|
||||
'control_complete': observer.status[DEVICE_STATUS.CONTROL],
|
||||
'last_results': observer.last_results.duplicate(),
|
||||
'status_uf': status_uf
|
||||
'status_uf': status_uf,
|
||||
'rtr_serviceability': observer.rtr_serviceability if device_name.begins_with('rtr_') else -1
|
||||
}
|
||||
return {}
|
||||
|
||||
@@ -267,7 +455,10 @@ func get_overall_status() -> Dictionary:
|
||||
var operational_count := 0
|
||||
var control_complete_count := 0
|
||||
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
online_count += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
@@ -279,7 +470,8 @@ func get_overall_status() -> Dictionary:
|
||||
'overall_state': overall_prd_state,
|
||||
'online_devices': online_count,
|
||||
'operational_devices': operational_count,
|
||||
'total_devices': device_observers.size(),
|
||||
'total_devices': device_observers.size() - len(rtr_device_names), # Исключаем RTR
|
||||
'control_complete_devices': control_complete_count,
|
||||
'uf_status': status_uf
|
||||
'uf_status': status_uf,
|
||||
'rtr_status': _get_rtr_summary()
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
[ext_resource type="PackedScene" uid="uid://lwmw4egynmd1" path="res://scenes/контроль/контроль.tscn" id="3_txp0s"]
|
||||
[ext_resource type="PackedScene" uid="uid://trt0q8th3bn2" path="res://scenes/журнал/журнал.tscn" id="4_cu5k8"]
|
||||
[ext_resource type="PackedScene" uid="uid://dab6loryocc73" path="res://scenes/эмс/эмс.tscn" id="5_u71bh"]
|
||||
[ext_resource type="PackedScene" uid="uid://musb21x2u0xs" path="res://scenes/эмс2/эмс2.tscn" id="6_41d34"]
|
||||
[ext_resource type="PackedScene" uid="uid://musb21x2u0xs" path="res://scenes/эмс-тг/эмс-тг.tscn" id="6_41d34"]
|
||||
[ext_resource type="PackedScene" uid="uid://bnptm4rlp60dq" path="res://scenes/настройки/настройки.tscn" id="6_i8iv3"]
|
||||
[ext_resource type="Script" uid="uid://q7k2yihg057j" path="res://scenes/tabs-switch/lbl_ready.gd" id="8_tidwt"]
|
||||
[ext_resource type="Script" uid="uid://roajn6c6wvc1" path="res://scenes/tabs-switch/тренаж-режим.gd" id="9_41d34"]
|
||||
|
||||
@@ -403,7 +403,7 @@ func _response(result, code, _headers: Array, body: PackedByteArray, req, tile:
|
||||
return
|
||||
|
||||
if Error.OK != image_load_proc.call(body):
|
||||
push_error('не удалось получить изображение (неверный формат?) из \"%s\"' % tile.url)
|
||||
push_error('не удалось получить изображение (неверный формат?) из \"%s\" (%d байт)' % [tile.url, body.size()])
|
||||
return
|
||||
|
||||
tile.texture = ImageTexture.create_from_image(image)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
extends Node
|
||||
|
||||
|
||||
static func map_value_to_item(data, item, value_name: StringName):
|
||||
var meta = item.get_meta(value_name, '')
|
||||
if meta == '':
|
||||
@@ -17,7 +16,6 @@ static func map_value_to_item(data, item, value_name: StringName):
|
||||
else:
|
||||
push_error('не найден путь %s (%s) для $%s.%s (%s)' % [paths_copy, ret_val[2], item.name, value_name, item.tooltip_text])
|
||||
|
||||
|
||||
static func map_error_codes_to_item(data, item, value_name: StringName, value_init: int):
|
||||
var metas = item.get_meta(value_name, '')
|
||||
if not (metas is Array):
|
||||
@@ -38,3 +36,52 @@ static func map_error_codes_to_item(data, item, value_name: StringName, value_in
|
||||
item.set(value_name, test_res)
|
||||
else:
|
||||
item.set(value_name, value_init)
|
||||
|
||||
# Плавное обновление с анимацией
|
||||
static func map_value_to_item_animated(data, item, value_name: StringName):
|
||||
var meta = item.get_meta(value_name, '')
|
||||
if meta == '' or not (meta is String): return
|
||||
|
||||
var paths: = Array()
|
||||
tools.map_solid_to_array(meta, paths)
|
||||
var ret_val: = [null, false, 0]
|
||||
tools.get_value_by_path(data, paths, ret_val)
|
||||
|
||||
if ret_val[1]:
|
||||
_animate_property(item, value_name, ret_val[0])
|
||||
else:
|
||||
push_error('не найден путь для $%s.%s' % [item.name, value_name])
|
||||
|
||||
static func map_error_codes_to_item_animated(data, item, value_name: StringName, value_init: int):
|
||||
var metas = item.get_meta(value_name, '')
|
||||
if not (metas is Array): return
|
||||
|
||||
var paths: = Array()
|
||||
var values: = Array()
|
||||
for meta in metas:
|
||||
tools.map_solid_to_array(meta, paths)
|
||||
var ret_val: = [null, false, 0]
|
||||
tools.get_value_by_path(data, paths, ret_val)
|
||||
if ret_val[1]:
|
||||
values.append(ret_val[0])
|
||||
else:
|
||||
push_error('не найден путь для $%s.%s' % [item.name, value_name])
|
||||
|
||||
var target_value: int
|
||||
if values.size() == metas.size():
|
||||
target_value = 1 if values.count(true) == values.size() else 2
|
||||
else:
|
||||
target_value = value_init
|
||||
|
||||
_animate_property(item, value_name, target_value)
|
||||
|
||||
static func _animate_property(item, property: StringName, target_value):
|
||||
var current = item.get(property)
|
||||
if typeof(current) != typeof(target_value): return
|
||||
if current == target_value: return
|
||||
|
||||
# Исправление: преобразуем StringName в String для NodePath
|
||||
var tween = item.create_tween()
|
||||
tween.set_trans(Tween.TRANS_QUINT)
|
||||
tween.set_ease(Tween.EASE_OUT)
|
||||
tween.tween_property(item, NodePath(String(property)), target_value, 0.3)
|
||||
|
||||
@@ -29,6 +29,7 @@ func get_result_string(result: Result):
|
||||
|
||||
|
||||
func _on_request_timer():
|
||||
print('_on_request_timer: ', Time.get_ticks_msec())
|
||||
if HTTPClient.Status.STATUS_DISCONNECTED != get_http_client_status():
|
||||
return
|
||||
var rc: = request(request_url)
|
||||
|
||||
@@ -123,6 +123,15 @@ func _ready():
|
||||
signaller.conn(signaller.режим_настройки, on_mode_changed)
|
||||
signaller.conn(signaller.режим_эмс, on_mode_changed)
|
||||
signaller.connect('debag_control_pressed', Callable(self, 'on_debag_button_pressed'))
|
||||
scouting.request_sent_afsp_left.connect(_on_request_sent_left.bind($pribor_afsp_1))
|
||||
scouting.response_received_afsp_left.connect(_on_response_received.bind($pribor_afsp_1))
|
||||
scouting.request_sent_afsp_right.connect(_on_request_sent_left.bind($pribor_afsp_2))
|
||||
scouting.response_received_afsp_right.connect(_on_response_received.bind($pribor_afsp_2))
|
||||
scouting.request_sent_bpo_left.connect(_on_request_sent_left.bind($pribor_rtr))
|
||||
scouting.response_received_bpo_left.connect(_on_response_received.bind($pribor_rtr))
|
||||
scouting.serviceability_rtr_afsp_left.connect(on_serviceability_rtr.bind($pribor_afsp_1))
|
||||
scouting.serviceability_rtr_afsp_right.connect(on_serviceability_rtr.bind($pribor_afsp_2))
|
||||
scouting.serviceability_rtr_bpo.connect(on_serviceability_rtr.bind($pribor_rtr))
|
||||
|
||||
|
||||
func online_change_arr(_u, conn_node, pribor_meta):
|
||||
@@ -166,25 +175,19 @@ func on_pribor_press(pribor_path, header_text, pribor_node):
|
||||
pribor.add_to_group('pribor_items')
|
||||
add_child(pribor)
|
||||
update_pribor_items_visibility()
|
||||
if pribor_node.get_meta('unit_name')[0] == 'уарэп-афсп-левый' or pribor_node.get_meta('unit_name')[0] == 'уарэп-афсп-правый':
|
||||
pribor.node_request.connect('send_http_request', Callable(self, 'on_send_http_request').bind(pribor_node, pribor.node_request_timer.wait_time))
|
||||
pribor.connect('receive_response_afp_bpo', Callable(self, 'on_receive_response_afp_bpo').bind(pribor_node))
|
||||
if pribor_node.get_meta('unit_name')[0] == 'уарэп-бпо-1' or pribor_node.get_meta('unit_name')[0] == 'уарэп-бпо-2':
|
||||
pribor.node_request_1.connect('send_http_request', Callable(self, 'on_send_http_request').bind(pribor_node, pribor.node_request_timer_1.wait_time))
|
||||
pribor.connect('receive_response_afp_bpo', Callable(self, 'on_receive_response_afp_bpo').bind(pribor_node))
|
||||
#signal receive_response_afp_bpo
|
||||
|
||||
|
||||
# Вызов при отправке запроса на селфтест АФСП
|
||||
func on_send_http_request(node: Node, time_req: float) -> void:
|
||||
# Вызов при отправке запроса на селфтест АФСП и РТР
|
||||
func _on_request_sent_left(_url: String, node: Node) -> void:
|
||||
node.progress_max_value = 100
|
||||
node.progress_value = 0
|
||||
node.progress_visible = true
|
||||
node.timeout_tween = time_req
|
||||
node.timeout_tween = float(ProjectSettings.get_setting('application/config/%s' % 'Период опроса состояния АФСП, секунды'))
|
||||
|
||||
|
||||
func on_receive_response_afp_bpo(node: Node) -> void:
|
||||
func _on_response_received(_response: String, _success: bool, node: Node):
|
||||
node.progress_value = 100
|
||||
node.progress_visible = false
|
||||
|
||||
|
||||
## Прием сигналов о текущем состояниях приборах
|
||||
@@ -196,6 +199,10 @@ func on_update_uf_serviceability(uf_serviceaability: int, uf_pribor: Node) -> vo
|
||||
uf_pribor.state = uf_serviceaability
|
||||
|
||||
|
||||
func on_serviceability_rtr(state: int, node_rtr: Node)-> void:
|
||||
node_rtr.state = state
|
||||
|
||||
|
||||
func _on_chk_show_functional_toggled(toggled_on: bool) -> void:
|
||||
if cur_pribor_node:
|
||||
cur_pribor_node.show_functional = toggled_on
|
||||
|
||||
557
scenes/эмс-тг/эмс-тг.gd
Normal file
@@ -0,0 +1,557 @@
|
||||
@tool
|
||||
extends Panel
|
||||
|
||||
## Выполнение функций информационного ЭМС (ЭМС-ТГ)
|
||||
|
||||
#region Определяемое при использовании
|
||||
## Индекс -> Имя устройства. Нужен для предсказуемого
|
||||
## порядка отображения: верх->вниз или лево->право.
|
||||
## Имя устройства должно быть взято из settings.gd
|
||||
@export var index_to_unit_names: Array[StringName]
|
||||
## Минимальная частота, МГЦ
|
||||
@export var freq_min: float
|
||||
## Максимальная частота, МГЦ
|
||||
@export var freq_max: float
|
||||
## Время достоверности кластера по умолчанию (если не указано в докладе)
|
||||
@export var default_ttl: float
|
||||
## Цвет диапазона если включен (разрешён)
|
||||
@export_color_no_alpha var color_enabled: Color
|
||||
## Цвет диапазона если выключен (запрещён)
|
||||
@export_color_no_alpha var color_disabled: Color
|
||||
## Прозрачность диапазон на шкале (диапазоны могут накладываться, что бы было видно наложения)
|
||||
@export_range(0, 1.0) var color_alpha: float
|
||||
## Цвет нечётных строк шкалы
|
||||
@export_color_no_alpha var color_odd: Color
|
||||
## Цвет чётных строк шкалы
|
||||
@export_color_no_alpha var color_even: Color
|
||||
## Индекс колонки в таблице для управления работой приёмников
|
||||
@export var column_cmd_rx: int
|
||||
## Индекс колонки в таблице для управления работой передатчиков
|
||||
@export var column_cmd_tx: int
|
||||
## Максимальное количество кластеров на одно устройство
|
||||
@export var max_clasters_per_unit: int
|
||||
## Сообщение пользователю
|
||||
@export var msg_select_unit: String
|
||||
## Сообщение пользователю
|
||||
@export var msg_waiting_data: String
|
||||
#endregion
|
||||
|
||||
#region Загружаемые ресурсы
|
||||
@export_file('*.tscn') var table_headers: Array[String]
|
||||
@export_file('*.tscn') var table_cells: Array[String]
|
||||
@export_file('*.png') var image_file_rx: String
|
||||
@export_file('*.png') var image_file_tx: String
|
||||
@export var table_rows_hight: int
|
||||
@export var table_column_widths: Array[int]
|
||||
@export var table_header_widths: Array[int]
|
||||
@export var table_header_text: Array[String]
|
||||
#endregion
|
||||
|
||||
#region Заполняется автоматически при запуске
|
||||
## Имя устройства -> Индекс устройства
|
||||
var name_to_index: Dictionary[StringName, int]
|
||||
## Имя устройства -> Шкала
|
||||
var name_to_scale: Dictionary[StringName, GridContainer]
|
||||
var table_cell_row: Array
|
||||
## Образец параметров кластера
|
||||
var ref_cls: = {'cname': '<имя>', 'ttl': 1.0, 'daa': 360.0, 'dap': 0.0,
|
||||
'cfb': (freq_min + freq_max) / 2.0,
|
||||
'wfb': freq_max - freq_min}
|
||||
#endregion
|
||||
|
||||
#region Заполняется во время работы
|
||||
var yems_info: Dictionary[StringName, Dictionary] ## Доклады
|
||||
var yems_cmd: Dictionary[StringName, Dictionary] ## Команды
|
||||
## Порядок следования кластеров в таблице.
|
||||
## {имя_устройства: {имя_кластера: индекс_в_таблице}}
|
||||
var cnames_table: Dictionary[StringName, Dictionary]
|
||||
## Текущее выбранное оператором устройство на шкале
|
||||
var selected_unit: Dictionary[StringName, bool]
|
||||
## Состояния кластеров в соответствии с докладами и командами
|
||||
#endregion
|
||||
|
||||
|
||||
## Состояние кластера
|
||||
enum ClasterStatus {
|
||||
DELETED, ## Удалён (время ожидания обновления истекло)
|
||||
RUNNING ## Работает (информация обновляется)
|
||||
}
|
||||
|
||||
|
||||
## Режим управления кластером
|
||||
enum ClasterMode {
|
||||
MANUAL, ## Ручной, управляется операторром
|
||||
AUTO, ## Автоматический, управляется программой
|
||||
IGNORE ## Игнорируемый, не управляется
|
||||
}
|
||||
|
||||
|
||||
## Состояние кластера. Значения должны соответствовать
|
||||
## состояниям [b]six-state-button[/b]
|
||||
enum ClasterResult {
|
||||
WAITING = 0, ## Ожидание даннных
|
||||
DONE = 1, ## Выполнено
|
||||
MISSMATCH = 2 ## Несоответствие
|
||||
}
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
# Инициализировать переменные
|
||||
color_enabled.a = color_alpha
|
||||
color_disabled.a = color_alpha
|
||||
for i in index_to_unit_names.size():
|
||||
var nm: = index_to_unit_names[i]
|
||||
name_to_index[nm] = i
|
||||
yems_info[nm] = {'mcls': []}
|
||||
yems_cmd[nm] = {}
|
||||
cnames_table[nm] = {}
|
||||
selected_unit[nm] = false
|
||||
var btns_scales = get_tree().get_nodes_in_group('кнопки-шкалы')
|
||||
for node in btns_scales:
|
||||
var nm: = node.get_meta('unit_name') as StringName
|
||||
node.connect('toggled', _on_scale_selected.bind(nm))
|
||||
var claster_scales = get_tree().get_nodes_in_group('шкалы-кластеров')
|
||||
for node in claster_scales:
|
||||
var nm: = node.get_meta('unit_name') as StringName
|
||||
name_to_scale[nm] = node
|
||||
|
||||
# Расскрасить чётные-нечётные
|
||||
for node in get_tree().get_nodes_in_group('нечётные'):
|
||||
node.get_node('panel_rx').back_color = color_odd
|
||||
node.get_node('panel_tx').back_color = color_odd
|
||||
for node in get_tree().get_nodes_in_group('чётные'):
|
||||
node.get_node('panel_rx').back_color = color_even
|
||||
node.get_node('panel_tx').back_color = color_even
|
||||
|
||||
# Подключить обработчик для приёма данных
|
||||
for nm in yems_info:
|
||||
var yems_unit = network.get_unit_instance(nm)
|
||||
yems_unit.connect('data_received', on_data_received.bind(nm))
|
||||
|
||||
# Настроить таблицу
|
||||
var header_row: = []
|
||||
for cell_scn in table_headers:
|
||||
header_row.append(load(cell_scn))
|
||||
for cell_scn in table_cells:
|
||||
table_cell_row.append(load(cell_scn))
|
||||
var ctable: = $'таблица/сетка'
|
||||
ctable.set_header(header_row)
|
||||
ctable.set_header_text(table_header_text)
|
||||
ctable.set_header_property(column_cmd_rx, 'image_file', image_file_rx)
|
||||
ctable.set_header_property(column_cmd_tx, 'image_file', image_file_tx)
|
||||
ctable.set_headers_min_size(table_header_widths)
|
||||
ctable.set_columns_min_size(table_column_widths)
|
||||
ctable.set_rows_min_hight(table_rows_hight)
|
||||
ctable.set_header_min_hight(table_rows_hight)
|
||||
ctable.pin_header2()
|
||||
|
||||
# Описатель для отображения импульсного ЭМС:
|
||||
# { идентификатор_входа: { 'node_path': путь_к_узлу, 'pname': название_устройства, 'dcls': { имя_кластера: {параметры_кластера}}}}
|
||||
# Здесь поля txe и rxe - отвечают за конфигурацию:
|
||||
# txe - вход связан с управлением передатчиком
|
||||
# rxe - вход связан с управлением приёмника
|
||||
##TODO: Должна быть возможность для изменения оператором
|
||||
var imp_yems_descr = {
|
||||
0: { 'pname': 'эмс-изделие7', # соответствие названия устройства идентификатору входа
|
||||
'dcls': {'УИЗП1': {'wfb': 300.0, 'cfb': 4000, 'ttl': -1.0, 'txe': false, 'rxe': false}} },
|
||||
1: { 'pname': 'эмс-изделие8', # соответствие названия устройства идентификатору входа
|
||||
'dcls': {'УИЗП2': {'wfb': 200.0, 'cfb': 5000, 'ttl': -1.0, 'txe': false, 'rxe': false}} } }
|
||||
signaller.connect('yems_input_changed', _on_yems_input_changed.bind(imp_yems_descr))
|
||||
for id in imp_yems_descr:
|
||||
var descr = imp_yems_descr[id]
|
||||
var unit_info = yems_info[descr.pname]
|
||||
for cname in descr.dcls:
|
||||
var incls = descr.dcls[cname]
|
||||
var cls = {'cname': cname, 'status': ClasterStatus.RUNNING}
|
||||
cls.merge(incls)
|
||||
unit_info.mcls.append(cls)
|
||||
call_deferred('_on_defer_ready', imp_yems_descr)
|
||||
|
||||
|
||||
func _on_defer_ready(imp_yems_descr: Dictionary):
|
||||
for id in imp_yems_descr:
|
||||
var descr = imp_yems_descr[id]
|
||||
var unit_info = yems_info[descr.pname]
|
||||
on_data_received(unit_info, descr.pname)
|
||||
|
||||
|
||||
## Вызывается при изменении состояния входа ЭМС.[br]
|
||||
## [param id] - идентификатор входа ЭМС[br]
|
||||
## [param state] - новое состояние входа ЭМС[br]
|
||||
## [param imp_yems_sescr] - описатель входов ЭМС[br]
|
||||
func _on_yems_input_changed(id: int, state: int, imp_yems_descr):
|
||||
# Проверить, есть ли в описателе этот вход
|
||||
if not imp_yems_descr.has(id):
|
||||
return
|
||||
var descr = imp_yems_descr[id]
|
||||
# Проверить, есть ли такое устройство
|
||||
if not yems_info.has(descr.pname):
|
||||
return
|
||||
# Получить доклад устройства
|
||||
var unit_info = yems_info[descr.pname]
|
||||
# Вход один, но кластеров может быть несколько,
|
||||
# поэтому нужно пробежать по всем кластерам
|
||||
for cls in unit_info.mcls:
|
||||
var incls = descr.dcls[cls.cname]
|
||||
# Выставить в докладе разрешение работы приёмника
|
||||
# или передатчика соответственно состоянию входа
|
||||
if incls.rxe:
|
||||
cls.rxe = true if state == 1 else false
|
||||
if incls.txe:
|
||||
cls.txe = true if state == 1 else false
|
||||
# Выполнить то же, что и для приёма данных, поэтому:
|
||||
on_data_received(unit_info, descr.pname)
|
||||
|
||||
|
||||
## Вызывается при выборе оператором устройства на шкале
|
||||
## [param val] - состояние кнопки переключателя устройств
|
||||
## [param nm] - имя выбранного устройства
|
||||
func _on_scale_selected(val: bool, nm: StringName):
|
||||
selected_unit[nm] = val
|
||||
if not val:
|
||||
$'таблица/сетка'.clear_rows()
|
||||
cnames_table[nm].clear()
|
||||
$label_msg.text = msg_select_unit
|
||||
$label_msg.show()
|
||||
return
|
||||
var unit_info = yems_info[nm]
|
||||
if not unit_info.mcls: # проверить, есть ли данные
|
||||
$label_msg.text = msg_waiting_data
|
||||
$label_msg.show()
|
||||
return # данных ещё нет, ничего не далать
|
||||
else:
|
||||
$label_msg.hide()
|
||||
var ctable = $'таблица/сетка'
|
||||
var indexes: = cnames_table[nm]
|
||||
update_cvi(nm)
|
||||
var new_indexes = update_indexes(unit_info, indexes)
|
||||
update_table(ctable, new_indexes)
|
||||
map_yems_info_to_table(unit_info, ctable, indexes)
|
||||
connect_cmd_handlers(nm, ctable, new_indexes)
|
||||
|
||||
|
||||
## Обновляет результат выполнения команды оператора
|
||||
## [param nm] - имя устройства
|
||||
func update_cvi(nm: StringName):
|
||||
var unit_info = yems_info[nm]
|
||||
var unit_cmd = yems_cmd[nm]
|
||||
for cls_info in unit_info.mcls:
|
||||
var result_rxe: = ClasterResult.WAITING
|
||||
var result_txe: = ClasterResult.WAITING
|
||||
if unit_cmd.has(cls_info.cname):
|
||||
var cls_cmd = unit_cmd[cls_info.cname]
|
||||
if cls_info.status == ClasterStatus.RUNNING:
|
||||
if cls_cmd.has('rxe'):
|
||||
result_rxe = ClasterResult.DONE \
|
||||
if (cls_info.rxe == cls_cmd.rxe) \
|
||||
else ClasterResult.MISSMATCH
|
||||
else:
|
||||
result_rxe = ClasterResult.DONE
|
||||
if cls_cmd.has('txe'):
|
||||
result_txe = ClasterResult.DONE \
|
||||
if (cls_info.txe == cls_cmd.txe) \
|
||||
else ClasterResult.MISSMATCH
|
||||
else:
|
||||
result_txe = ClasterResult.DONE
|
||||
else:
|
||||
result_rxe = ClasterResult.DONE
|
||||
result_txe = ClasterResult.DONE
|
||||
cls_info['result_rxe'] = result_rxe
|
||||
cls_info['result_txe'] = result_txe
|
||||
|
||||
|
||||
## Подключает обработчики команд к таблице кластеров
|
||||
## [param nm] - имя устройства
|
||||
## [param new_indexes] - новые индексы рядов таблицы
|
||||
## [param cls_table] - таблица для отображения кластеров
|
||||
func connect_cmd_handlers(nm: StringName, ctable: GDTable, new_indexes: Array):
|
||||
for icls in new_indexes:
|
||||
var i_row = icls[0]
|
||||
# Имя устройства и имя кластера
|
||||
var cls = icls[1]
|
||||
# Подключить обработчки разрешения передатчиков
|
||||
var node = ctable.get_node2(column_cmd_tx, i_row)
|
||||
node.connect_check('toggled', _on_user_cmd.bind(nm, cls.cname, 'txe'))
|
||||
# Подключить обработчки разрешения приёмников
|
||||
node = ctable.get_node2(column_cmd_rx, i_row)
|
||||
node.connect_check('toggled', _on_user_cmd.bind(nm, cls.cname, 'rxe'))
|
||||
|
||||
|
||||
## Вызывается при переключении оператором разрешений для кластера
|
||||
func _on_user_cmd(val: bool, nm: StringName, cname: String, param_name: StringName):
|
||||
var unit_cmd = yems_cmd[nm]
|
||||
if cname in unit_cmd:
|
||||
unit_cmd[cname][param_name] = val
|
||||
else:
|
||||
unit_cmd[cname] = {param_name: val}
|
||||
|
||||
|
||||
## Обрабатывает событие [b]data_received[/b]
|
||||
## [param data] - данные принятые от устройства
|
||||
## [param nm] - имя устройства
|
||||
func on_data_received(data: Dictionary, nm: StringName):
|
||||
set_timeouts(nm, data)
|
||||
var unit_info: = yems_info[nm]
|
||||
unit_info_merge(unit_info, data)
|
||||
if not unit_info:
|
||||
# для устройства нет данных
|
||||
return
|
||||
var ctable: GDTable = $'таблица/сетка'
|
||||
var cscale: = name_to_scale[nm] as GridContainer # Шкала устройства
|
||||
var indexes: = cnames_table[nm] # Индексы строк устройства в таблице
|
||||
update_cvi(nm)
|
||||
# Если текущее устройство отображается в таблице,
|
||||
# обновить таблицу новыми данными
|
||||
if selected_unit[nm]:
|
||||
var new_indexes = update_indexes(unit_info, indexes)
|
||||
update_table(ctable, new_indexes)
|
||||
map_yems_info_to_table(unit_info, ctable, indexes)
|
||||
connect_cmd_handlers(nm, ctable, new_indexes)
|
||||
map_yems_info_to_scale(unit_info, cscale)
|
||||
var inters: = find_inters()
|
||||
reset_matrix()
|
||||
map_inters_to_matrix(inters, $'матрица')
|
||||
cmd_to_unit(nm)
|
||||
|
||||
|
||||
## Создаёт новые ряды в таблице
|
||||
func update_table(ctable: GDTable, new_indexes: Array):
|
||||
# Добавить новые ряды. Два прохода нужно потому,
|
||||
# что порядок элементов в словаре не определён.
|
||||
for icls in new_indexes:
|
||||
ctable.add_row(table_cell_row)
|
||||
# Заполнить новые ряды данными
|
||||
for icls in new_indexes:
|
||||
var i_row = icls[0]
|
||||
var cls = icls[1]
|
||||
# Установить высоту ряда (можно пропустить, если нужная высота будет выставлена по умолчанию)
|
||||
ctable.set_row_min_hight(i_row, table_rows_hight)
|
||||
# Установить новый текст
|
||||
ctable.set_node_property(column_cmd_rx, i_row, 'pressed', cls.rxe)
|
||||
ctable.set_node_property(column_cmd_tx, i_row, 'pressed', cls.txe)
|
||||
ctable.set_node_property(column_cmd_rx, i_row, 'state', cls.result_rxe)
|
||||
ctable.set_node_property(column_cmd_tx, i_row, 'state', cls.result_txe)
|
||||
|
||||
|
||||
## Обновляет индексы строк в таблице
|
||||
func update_indexes(unit_info: Dictionary, indexes: Dictionary) -> Array:
|
||||
var new_indexes: = []
|
||||
for cls in unit_info.mcls:
|
||||
# Проверить, есть ли уже такой индекс
|
||||
if indexes.has(cls.cname):
|
||||
continue
|
||||
# Записать индекс нового ряда (связать с именем кластера)
|
||||
var i_row = indexes.size()
|
||||
indexes[cls.cname] = i_row
|
||||
new_indexes.append([i_row, cls])
|
||||
return new_indexes
|
||||
|
||||
|
||||
## Объединяет список кластеров принятых от устройства со списком сохранённым
|
||||
## [param unit_info] - доклад ранее полученный
|
||||
## [param data_rx] - доклад принятый от устройства
|
||||
func unit_info_merge(unit_info: Dictionary, data_rx: Dictionary):
|
||||
var drx: = {}
|
||||
for cls_rx in data_rx.mcls:
|
||||
ref_cls.cname = 'неопр.№%d' % (drx.size() + 1)
|
||||
cls_rx.merge(ref_cls, false) # Объеденить без перезаписи
|
||||
drx[cls_rx.cname] = cls_rx
|
||||
var dinfo: = {}
|
||||
for cls in unit_info.mcls:
|
||||
dinfo[cls.cname] = cls
|
||||
dinfo.merge(drx, true)
|
||||
unit_info.merge(data_rx, true)
|
||||
unit_info.mcls = dinfo.values()
|
||||
|
||||
|
||||
## Отправляет команду в сетевой стек
|
||||
## [param nm] - имя устройства
|
||||
func cmd_to_unit(nm: StringName):
|
||||
var unit_yemstg: = network.get_unit_instance(nm)
|
||||
# Проверить, что сетевой стек отправил предидущую команду
|
||||
if unit_yemstg.cmd_state != unit.Unit.CmdState.DONE:
|
||||
return
|
||||
# Сформировать команду из докладов (данных принятых из сети от устройств)
|
||||
var unit_info_copy = yems_info[nm].duplicate(true)
|
||||
var unit_cmd = yems_cmd[nm]
|
||||
unit_info_copy.mtype = 'cmd'
|
||||
# Выбрать только работающие кластеры (время которых ещё не истекло)
|
||||
var mcls = unit_info_copy.mcls.filter(func(c): return c.status == ClasterStatus.RUNNING)
|
||||
for cls_info in mcls:
|
||||
# Если для этого кластера есть команда оператора ...
|
||||
if unit_cmd.has(cls_info.cname):
|
||||
# ... переписать значениями из команды оператора
|
||||
var cmd_cls = unit_cmd[cls_info.cname]
|
||||
cls_info.rxe = unit_cmd.get('rxe', cls_info.rxe)
|
||||
cls_info.txe = unit_cmd.get('txe', cls_info.txe)
|
||||
# Передать команду сетевому стеку
|
||||
unit_yemstg.cmd.merge(unit_info_copy, true)
|
||||
unit_yemstg.cmd_state = unit.Unit.CmdState.SEND
|
||||
|
||||
|
||||
## Запускает таймер достоверности кластера
|
||||
## [param nm] - имя устройства
|
||||
## [param unit_info] - доклады устройства
|
||||
func set_timeouts(nm: StringName, unit_info: Dictionary):
|
||||
for cls in unit_info.mcls:
|
||||
var timer_name = NodePath('%s_%s' % [nm, cls.cname])
|
||||
var timer = get_node_or_null(timer_name)
|
||||
cls['status'] = ClasterStatus.RUNNING
|
||||
if cls.ttl < 0.0:
|
||||
continue
|
||||
if not timer:
|
||||
timer = Timer.new()
|
||||
timer.name = timer_name
|
||||
timer.one_shot = true
|
||||
timer.connect('timeout', _on_timeout_ttl.bind(nm, cls.cname))
|
||||
add_child(timer)
|
||||
timer.start(cls.ttl)
|
||||
|
||||
|
||||
## Обработчик истечения времени достоверности кластера
|
||||
## [param nm] - имя устройства
|
||||
## [param cname] - имя кластера
|
||||
func _on_timeout_ttl(nm: StringName, cname: StringName):
|
||||
var timer_name = NodePath('%s_%s' % [nm, cname])
|
||||
var timer = get_node_or_null(timer_name)
|
||||
if timer:
|
||||
remove_child(timer)
|
||||
timer.queue_free()
|
||||
var unit_info = yems_info[nm]
|
||||
for cls in unit_info.mcls:
|
||||
if cname == cls.cname:
|
||||
cls.status = ClasterStatus.DELETED
|
||||
cls.result_rxe = ClasterResult.WAITING
|
||||
cls.result_txe = ClasterResult.WAITING
|
||||
var ctable: GDTable = $'таблица/сетка'
|
||||
var indexes: = cnames_table[nm]
|
||||
if indexes:
|
||||
map_yems_info_to_table(unit_info, ctable, indexes)
|
||||
var claster_scale: = name_to_scale[nm] as GridContainer
|
||||
map_yems_info_to_scale(unit_info, claster_scale)
|
||||
reset_matrix()
|
||||
|
||||
|
||||
## Сбрасывает элементы матрицы в исходное состояние
|
||||
func reset_matrix():
|
||||
var nodes = get_tree().get_nodes_in_group('матрица-к')
|
||||
for node in nodes:
|
||||
node.button_pressed = false
|
||||
|
||||
|
||||
## Отображает пересечения на матрице
|
||||
## [param inters] - пересечения
|
||||
## [param matrix] - матрица
|
||||
func map_inters_to_matrix(inters: Array, matrix: GridContainer) -> void:
|
||||
var nodes = matrix.get_children()
|
||||
for item in inters:
|
||||
var tx_unit_name = item[0]
|
||||
var rx_unit_name = item[1]
|
||||
var i_col = 1 + name_to_index[tx_unit_name] # (1 +) - одна колонка для значков приёмников
|
||||
var i_row = 1 + name_to_index[rx_unit_name] # (1 +) - один ряд для значков передатчиков
|
||||
var idx = i_col + i_row * matrix.columns # последовательный индекс в GridContainer
|
||||
var node = nodes[idx] # Искомый элемент
|
||||
node.button_pressed = true
|
||||
|
||||
|
||||
## Отображает кластеры в таблицу
|
||||
## [param unit_info] - доклад от устройства
|
||||
## [param ctable] - таблица
|
||||
## [param indexes] - индексы в таблице
|
||||
func map_yems_info_to_table(unit_info: Dictionary, ctable: GDTable, indexes: Dictionary):
|
||||
# Обойти все кластеры устройства
|
||||
for cls in unit_info.mcls:
|
||||
# Строки для заполнения ряда
|
||||
var status_str: = 'Активен' if cls.status == ClasterStatus.RUNNING else 'Удалён'
|
||||
var row_text: = [cls.cname, status_str, '%.1f' % cls.ttl, '%.1f' % cls.daa, '%.1f' % cls.dap, '%.1f-%.1f' % [cls.cfb - cls.wfb / 2.0, cls.cfb + cls.wfb / 2.0]]
|
||||
# Получить индекс строки кластера в таблице
|
||||
var i_row = indexes[cls.cname]
|
||||
# Установить новый текст
|
||||
ctable.set_row_text(i_row, row_text)
|
||||
# Результат выполнения
|
||||
ctable.set_node_property(column_cmd_rx, i_row, 'state', cls.result_rxe)
|
||||
ctable.set_node_property(column_cmd_tx, i_row, 'state', cls.result_txe)
|
||||
|
||||
|
||||
## Находит пересечения диапазонов всех устройств и кластеров
|
||||
func find_inters() -> Array:
|
||||
var result = []
|
||||
var all_clusters = []
|
||||
# Собираем все кластеры из всех устройств в один массив
|
||||
for nm in yems_info:
|
||||
# nm - имя устройства
|
||||
var unit_data = yems_info[nm]
|
||||
if not unit_data: continue
|
||||
var clasters = unit_data.mcls.filter \
|
||||
(func(c): return c.status == ClasterStatus.RUNNING)
|
||||
for cls in clasters:
|
||||
# cls - один кластер
|
||||
var cfb = float(cls.cfb)
|
||||
var wfb = float(cls.wfb) / 2.0
|
||||
# расчёт границ частотных диапазонов
|
||||
var freq_min1 = cfb - wfb
|
||||
var freq_max1 = cfb + wfb
|
||||
all_clusters.append([nm, cls.cname, freq_min1, freq_max1, cls.txe, cls.rxe])
|
||||
|
||||
for i in all_clusters.size():
|
||||
var cl1 = all_clusters[i]
|
||||
var dev1 = cl1[0]
|
||||
var name1 = cl1[1]
|
||||
var min1 = cl1[2]
|
||||
var max1 = cl1[3]
|
||||
var txe1 = cl1[4]
|
||||
var rxe1 = cl1[5]
|
||||
# Сравниваем текущий кластер со всеми последующими,
|
||||
# чтобы избежать дублей и самопересечений
|
||||
for j in all_clusters.size():
|
||||
var cl2 = all_clusters[j]
|
||||
var dev2 = cl2[0]
|
||||
var name2 = cl2[1]
|
||||
var min2 = cl2[2]
|
||||
var max2 = cl2[3]
|
||||
var txe2 = cl2[4]
|
||||
var rxe2 = cl2[5]
|
||||
# Если нет пары TR(RT) то пропускаем эту комбинацию
|
||||
if not ((txe1 and rxe2) or (rxe1 and txe2)):
|
||||
continue
|
||||
# Проверка на пересечение диапазонов, пересечение
|
||||
# есть если начало одного диапазона меньше конца другого
|
||||
if max1 > min2 and max2 > min1:
|
||||
#Вычисляем точные границы пересечения
|
||||
var inter_start = max(min1, min2)
|
||||
var inter_end = min(max1, max2)
|
||||
# Формируем результат в требуемом формате
|
||||
result.append([dev1, dev2, name1, name2, inter_start, inter_end])
|
||||
return result
|
||||
|
||||
|
||||
## Отображает кластеры на шкале
|
||||
## [param unit_info] - доклад устройства
|
||||
## [param cscale] - шкала кластера
|
||||
func map_yems_info_to_scale(unit_info: Dictionary, cscale: GridContainer):
|
||||
# Обойти все кластеры устройства
|
||||
for cls in unit_info.mcls:
|
||||
# Преобразовать диапазоны частот в диапазоны отображения
|
||||
var c: = remap(cls.cfb, freq_min, freq_max, 0.0, 1.0)
|
||||
var w: = remap(cls.wfb, freq_min * 0.5, freq_max * 0.5, 0.0, 0.5)
|
||||
# Чтобы диапазон всегда был виден, даже если он слишком узкий
|
||||
w = clampf(w, 0.005, 0.5)
|
||||
# Отсечь значения по границам
|
||||
var l: = clampf(c - w, 0.0, 1.0)
|
||||
var h: = clampf(c + w, 0.0, 1.0)
|
||||
# Получить шкалу приёмника
|
||||
var scale_rx: = cscale.get_node('panel_rx')
|
||||
# Получить шкалу передатчика
|
||||
var scale_tx: = cscale.get_node('panel_tx')
|
||||
# Диапазон работает (информация обновляется)
|
||||
if cls.status == ClasterStatus.RUNNING:
|
||||
# Отобразить диапазон приёмника, в соответствии с разрешением
|
||||
var color_rxe: = color_enabled if cls.rxe else color_disabled
|
||||
scale_rx.set_range(cls.cname, l, h, color_rxe)
|
||||
# Отобразить диапазон передатчика, в соответствии с разрешением
|
||||
var color_txe: = color_enabled if cls.txe else color_disabled
|
||||
scale_tx.set_range(cls.cname, l, h, color_txe)
|
||||
# Диапазон удалён (информация не обновляется)
|
||||
elif cls.status == ClasterStatus.DELETED:
|
||||
scale_rx.del_range(cls.cname)
|
||||
scale_tx.del_range(cls.cname)
|
||||
877
scenes/эмс-тг/эмс-тг.tscn
Normal file
@@ -0,0 +1,877 @@
|
||||
[gd_scene load_steps=23 format=3 uid="uid://musb21x2u0xs"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bvlqgv7aapebl" path="res://scenes/эмс-тг/эмс-тг.gd" id="1_b7tfl"]
|
||||
[ext_resource type="Texture2D" uid="uid://djv8fkddcjucs" path="res://data/матрица-чисто.png" id="2_s28jr"]
|
||||
[ext_resource type="Texture2D" uid="uid://busl8rb38lis" path="res://data/матрица-конфликт.png" id="3_its7t"]
|
||||
[ext_resource type="Script" uid="uid://c5pq0hbrij34d" path="res://table/table.gd" id="4_bhff3"]
|
||||
[ext_resource type="PackedScene" uid="uid://hr55mkcneaer" path="res://scenes/hranges/panel.tscn" id="5_6hay3"]
|
||||
[ext_resource type="Texture2D" uid="uid://docnrxrm2f022" path="res://data/Угловой квадрат3.png" id="6_a0vpj"]
|
||||
[ext_resource type="Texture2D" uid="uid://cxrggrvx6l22q" path="res://data/Квадрат марс ОР-63.png" id="7_xr3ub"]
|
||||
[ext_resource type="Texture2D" uid="uid://d3qui21aom1ac" path="res://data/Квадрат марс 454.png" id="8_saoyo"]
|
||||
[ext_resource type="Texture2D" uid="uid://36xjgea2n22q" path="res://data/Квадрат марс ГО.png" id="9_bqil1"]
|
||||
[ext_resource type="Texture2D" uid="uid://by6a12oahbg82" path="res://data/Квадрат марс РЛС1.png" id="10_ggqgc"]
|
||||
[ext_resource type="Texture2D" uid="uid://pfoscstbm025" path="res://data/эмс-бланк-перем.png" id="10_wdb1k"]
|
||||
[ext_resource type="Texture2D" uid="uid://dwgqofj6yae1v" path="res://data/Квадрат марс РЛС2.png" id="11_xothm"]
|
||||
[ext_resource type="Texture2D" uid="uid://dsuiytxdnole7" path="res://data/Квадрат марс с трубкой.png" id="12_4rjt3"]
|
||||
[ext_resource type="Texture2D" uid="uid://d3v1r4r62na8" path="res://data/Квадрат салатный ОР-63.png" id="13_g0j2q"]
|
||||
[ext_resource type="Texture2D" uid="uid://b1kuhj03yigih" path="res://data/Квадрат салатный 454.png" id="14_crrpm"]
|
||||
[ext_resource type="Texture2D" uid="uid://cyb60nh23ys6k" path="res://data/Квадрат салатный ГО.png" id="15_0dspi"]
|
||||
[ext_resource type="Texture2D" uid="uid://ddm55bo28sxcs" path="res://data/Квадрат салатный РЛС1.png" id="16_6042y"]
|
||||
[ext_resource type="Texture2D" uid="uid://dneqjcul4ipub" path="res://data/Квадрат салатный РЛС2.png" id="17_gvsi1"]
|
||||
[ext_resource type="Texture2D" uid="uid://cw8sd7v5f31ww" path="res://data/Квадрат салатный с трубкой.png" id="18_p3gp1"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wdb1k"]
|
||||
bg_color = Color(0.314316, 0.314316, 0.314316, 1)
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_niy1n"]
|
||||
|
||||
[sub_resource type="ButtonGroup" id="ButtonGroup_vwsbs"]
|
||||
allow_unpress = true
|
||||
|
||||
[node name="эмс-тг" type="Panel"]
|
||||
offset_top = 35.0
|
||||
offset_bottom = 35.0
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_wdb1k")
|
||||
script = ExtResource("1_b7tfl")
|
||||
index_to_unit_names = Array[StringName]([&"эмс-ор63", &"эмс-454", &"эмс-го", &"эмс-рлс1", &"эмс-рлс2", &"эмс-ннвс", &"эмс-изделие7", &"эмс-изделие8"])
|
||||
freq_min = 300.0
|
||||
freq_max = 6000.0
|
||||
default_ttl = 2.0
|
||||
color_enabled = Color(0.898039, 0.458824, 0.239216, 0.7)
|
||||
color_disabled = Color(0.601223, 0.601223, 0.601223, 0.7)
|
||||
color_alpha = 0.7
|
||||
color_odd = Color(0.31863, 0.32773, 0.327729, 1)
|
||||
color_even = Color(0.258824, 0.266667, 0.266667, 1)
|
||||
column_cmd_rx = 6
|
||||
column_cmd_tx = 7
|
||||
max_clasters_per_unit = 32
|
||||
msg_select_unit = "Выберите устройство"
|
||||
msg_waiting_data = "Ожидание данных"
|
||||
table_headers = Array[String](["uid://ch14g46swx74h", "uid://ch14g46swx74h", "uid://ch14g46swx74h", "uid://ch14g46swx74h", "uid://ch14g46swx74h", "uid://ch14g46swx74h", "uid://cymcld4mjmlhj", "uid://cymcld4mjmlhj"])
|
||||
table_cells = Array[String](["uid://dwphmxstaxn4v", "uid://dwphmxstaxn4v", "uid://dwphmxstaxn4v", "uid://dwphmxstaxn4v", "uid://dwphmxstaxn4v", "uid://dwphmxstaxn4v", "uid://cixwl6xi22buo", "uid://cixwl6xi22buo"])
|
||||
image_file_rx = "uid://c6etralq2tvxg"
|
||||
image_file_tx = "uid://c73tjrn8gr00o"
|
||||
table_rows_hight = 32
|
||||
table_column_widths = Array[int]([133, 133, 133, 133, 133, 133, 133, 133])
|
||||
table_header_widths = Array[int]([136, 136, 136, 136, 136, 136, 136, 136])
|
||||
table_header_text = Array[String](["Кластер", "Состояние", "Время", "Азимут", "Угол места", "Диапазон", "Приём", "Передача"])
|
||||
|
||||
[node name="таблица" type="ScrollContainer" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 20.0
|
||||
offset_top = 765.0
|
||||
offset_right = 1180.0
|
||||
offset_bottom = 1145.0
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_niy1n")
|
||||
draw_focus_border = true
|
||||
vertical_scroll_mode = 2
|
||||
|
||||
[node name="сетка" type="GridContainer" parent="таблица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
columns = 8
|
||||
script = ExtResource("4_bhff3")
|
||||
|
||||
[node name="шкала" type="GridContainer" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 20.0
|
||||
offset_top = 40.0
|
||||
offset_right = 1668.0
|
||||
offset_bottom = 734.0
|
||||
scale = Vector2(0.95, 0.95)
|
||||
columns = 2
|
||||
|
||||
[node name="label0" type="Button" parent="шкала" groups=["кнопки-шкалы"]]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 7
|
||||
toggle_mode = true
|
||||
action_mode = 0
|
||||
button_group = SubResource("ButtonGroup_vwsbs")
|
||||
text = "ОР-63"
|
||||
icon = ExtResource("7_xr3ub")
|
||||
icon_alignment = 1
|
||||
vertical_icon_alignment = 0
|
||||
expand_icon = true
|
||||
metadata/unit_name = &"эмс-ор63"
|
||||
|
||||
[node name="sub0" type="GridContainer" parent="шкала" groups=["чётные", "шкалы-кластеров"]]
|
||||
self_modulate = Color(0.258824, 0.266667, 0.266667, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
metadata/unit_name = &"эмс-ор63"
|
||||
|
||||
[node name="panel_rx" parent="шкала/sub0" instance=ExtResource("5_6hay3")]
|
||||
self_modulate = Color(0.830335, 0.830335, 0.830335, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c73tjrn8gr00o"
|
||||
back_color = Color(0.258824, 0.266667, 0.266667, 1)
|
||||
|
||||
[node name="panel_tx" parent="шкала/sub0" instance=ExtResource("5_6hay3")]
|
||||
self_modulate = Color(0.830335, 0.830335, 0.830335, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c6etralq2tvxg"
|
||||
back_color = Color(0.258824, 0.266667, 0.266667, 1)
|
||||
|
||||
[node name="label1" type="Button" parent="шкала" groups=["кнопки-шкалы"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 5
|
||||
size_flags_vertical = 7
|
||||
toggle_mode = true
|
||||
action_mode = 0
|
||||
button_group = SubResource("ButtonGroup_vwsbs")
|
||||
text = "454"
|
||||
icon = ExtResource("8_saoyo")
|
||||
icon_alignment = 1
|
||||
vertical_icon_alignment = 0
|
||||
expand_icon = true
|
||||
metadata/unit_name = &"эмс-454"
|
||||
|
||||
[node name="sub1" type="GridContainer" parent="шкала" groups=["нечётные", "шкалы-кластеров"]]
|
||||
self_modulate = Color(0.294118, 0.294118, 0.294118, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
metadata/unit_name = &"эмс-454"
|
||||
|
||||
[node name="panel_rx" parent="шкала/sub1" instance=ExtResource("5_6hay3")]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c73tjrn8gr00o"
|
||||
back_color = Color(0.31863, 0.32773, 0.327729, 1)
|
||||
|
||||
[node name="panel_tx" parent="шкала/sub1" instance=ExtResource("5_6hay3")]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c6etralq2tvxg"
|
||||
back_color = Color(0.31863, 0.32773, 0.327729, 1)
|
||||
|
||||
[node name="label2" type="Button" parent="шкала" groups=["кнопки-шкалы"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 5
|
||||
size_flags_vertical = 7
|
||||
toggle_mode = true
|
||||
action_mode = 0
|
||||
button_group = SubResource("ButtonGroup_vwsbs")
|
||||
text = "ГО"
|
||||
icon = ExtResource("9_bqil1")
|
||||
icon_alignment = 1
|
||||
vertical_icon_alignment = 0
|
||||
expand_icon = true
|
||||
metadata/unit_name = &"эмс-го"
|
||||
|
||||
[node name="sub2" type="GridContainer" parent="шкала" groups=["чётные", "шкалы-кластеров"]]
|
||||
self_modulate = Color(0.258824, 0.266667, 0.266667, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
metadata/unit_name = &"эмс-го"
|
||||
|
||||
[node name="panel_rx" parent="шкала/sub2" instance=ExtResource("5_6hay3")]
|
||||
self_modulate = Color(0.830335, 0.830335, 0.830335, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c73tjrn8gr00o"
|
||||
back_color = Color(0.258824, 0.266667, 0.266667, 1)
|
||||
|
||||
[node name="panel_tx" parent="шкала/sub2" instance=ExtResource("5_6hay3")]
|
||||
self_modulate = Color(0.830335, 0.830335, 0.830335, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c6etralq2tvxg"
|
||||
back_color = Color(0.258824, 0.266667, 0.266667, 1)
|
||||
|
||||
[node name="label3" type="Button" parent="шкала" groups=["кнопки-шкалы"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 5
|
||||
size_flags_vertical = 7
|
||||
toggle_mode = true
|
||||
action_mode = 0
|
||||
button_group = SubResource("ButtonGroup_vwsbs")
|
||||
text = "РЛС1"
|
||||
icon = ExtResource("10_ggqgc")
|
||||
icon_alignment = 1
|
||||
vertical_icon_alignment = 0
|
||||
expand_icon = true
|
||||
metadata/unit_name = &"эмс-рлс1"
|
||||
|
||||
[node name="sub3" type="GridContainer" parent="шкала" groups=["нечётные", "шкалы-кластеров"]]
|
||||
self_modulate = Color(0.294118, 0.294118, 0.294118, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
metadata/unit_name = &"эмс-рлс1"
|
||||
|
||||
[node name="panel_rx" parent="шкала/sub3" instance=ExtResource("5_6hay3")]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c73tjrn8gr00o"
|
||||
back_color = Color(0.31863, 0.32773, 0.327729, 1)
|
||||
|
||||
[node name="panel_tx" parent="шкала/sub3" instance=ExtResource("5_6hay3")]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c6etralq2tvxg"
|
||||
back_color = Color(0.31863, 0.32773, 0.327729, 1)
|
||||
|
||||
[node name="label4" type="Button" parent="шкала" groups=["кнопки-шкалы"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 5
|
||||
size_flags_vertical = 7
|
||||
toggle_mode = true
|
||||
action_mode = 0
|
||||
button_group = SubResource("ButtonGroup_vwsbs")
|
||||
text = "РЛС2"
|
||||
icon = ExtResource("11_xothm")
|
||||
icon_alignment = 1
|
||||
vertical_icon_alignment = 0
|
||||
expand_icon = true
|
||||
metadata/unit_name = &"эмс-рлс2"
|
||||
|
||||
[node name="sub4" type="GridContainer" parent="шкала" groups=["чётные", "шкалы-кластеров"]]
|
||||
self_modulate = Color(0.258824, 0.266667, 0.266667, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
metadata/unit_name = &"эмс-рлс2"
|
||||
|
||||
[node name="panel_rx" parent="шкала/sub4" instance=ExtResource("5_6hay3")]
|
||||
self_modulate = Color(0.830335, 0.830335, 0.830335, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c73tjrn8gr00o"
|
||||
back_color = Color(0.258824, 0.266667, 0.266667, 1)
|
||||
|
||||
[node name="panel_tx" parent="шкала/sub4" instance=ExtResource("5_6hay3")]
|
||||
self_modulate = Color(0.830335, 0.830335, 0.830335, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c6etralq2tvxg"
|
||||
back_color = Color(0.258824, 0.266667, 0.266667, 1)
|
||||
|
||||
[node name="label5" type="Button" parent="шкала" groups=["кнопки-шкалы"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 5
|
||||
size_flags_vertical = 7
|
||||
toggle_mode = true
|
||||
action_mode = 0
|
||||
button_group = SubResource("ButtonGroup_vwsbs")
|
||||
text = "ННВС"
|
||||
icon = ExtResource("12_4rjt3")
|
||||
icon_alignment = 1
|
||||
vertical_icon_alignment = 0
|
||||
expand_icon = true
|
||||
metadata/unit_name = &"эмс-ннвс"
|
||||
|
||||
[node name="sub5" type="GridContainer" parent="шкала" groups=["нечётные", "шкалы-кластеров"]]
|
||||
self_modulate = Color(0.294118, 0.294118, 0.294118, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
metadata/unit_name = &"эмс-ннвс"
|
||||
|
||||
[node name="panel_rx" parent="шкала/sub5" instance=ExtResource("5_6hay3")]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c73tjrn8gr00o"
|
||||
back_color = Color(0.31863, 0.32773, 0.327729, 1)
|
||||
|
||||
[node name="panel_tx" parent="шкала/sub5" instance=ExtResource("5_6hay3")]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c6etralq2tvxg"
|
||||
back_color = Color(0.31863, 0.32773, 0.327729, 1)
|
||||
|
||||
[node name="label6" type="Button" parent="шкала" groups=["кнопки-шкалы"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 5
|
||||
size_flags_vertical = 7
|
||||
toggle_mode = true
|
||||
action_mode = 0
|
||||
button_group = SubResource("ButtonGroup_vwsbs")
|
||||
text = "Изделие 7"
|
||||
icon = ExtResource("10_wdb1k")
|
||||
icon_alignment = 1
|
||||
vertical_icon_alignment = 0
|
||||
metadata/unit_name = &"эмс-изделие7"
|
||||
|
||||
[node name="sub6" type="GridContainer" parent="шкала" groups=["чётные", "шкалы-кластеров"]]
|
||||
self_modulate = Color(0.258824, 0.266667, 0.266667, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
metadata/unit_name = &"эмс-изделие7"
|
||||
|
||||
[node name="panel_rx" parent="шкала/sub6" instance=ExtResource("5_6hay3")]
|
||||
self_modulate = Color(0.830335, 0.830335, 0.830335, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c73tjrn8gr00o"
|
||||
back_color = Color(0.258824, 0.266667, 0.266667, 1)
|
||||
|
||||
[node name="panel_tx" parent="шкала/sub6" instance=ExtResource("5_6hay3")]
|
||||
self_modulate = Color(0.830335, 0.830335, 0.830335, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c6etralq2tvxg"
|
||||
back_color = Color(0.258824, 0.266667, 0.266667, 1)
|
||||
|
||||
[node name="label7" type="Button" parent="шкала" groups=["кнопки-шкалы"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 5
|
||||
size_flags_vertical = 7
|
||||
toggle_mode = true
|
||||
action_mode = 0
|
||||
button_group = SubResource("ButtonGroup_vwsbs")
|
||||
text = "Изделие 8"
|
||||
icon = ExtResource("10_wdb1k")
|
||||
icon_alignment = 1
|
||||
vertical_icon_alignment = 0
|
||||
metadata/unit_name = &"эмс-изделие8"
|
||||
|
||||
[node name="sub7" type="GridContainer" parent="шкала" groups=["нечётные", "шкалы-кластеров"]]
|
||||
self_modulate = Color(0.294118, 0.294118, 0.294118, 1)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
metadata/unit_name = &"эмс-изделие8"
|
||||
|
||||
[node name="panel_rx" parent="шкала/sub7" instance=ExtResource("5_6hay3")]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c73tjrn8gr00o"
|
||||
back_color = Color(0.31863, 0.32773, 0.327729, 1)
|
||||
|
||||
[node name="panel_tx" parent="шкала/sub7" instance=ExtResource("5_6hay3")]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
image_file = "uid://c6etralq2tvxg"
|
||||
back_color = Color(0.31863, 0.32773, 0.327729, 1)
|
||||
|
||||
[node name="матрица" type="GridContainer" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 1195.0
|
||||
offset_top = 735.0
|
||||
offset_right = 1585.0
|
||||
offset_bottom = 1145.0
|
||||
columns = 7
|
||||
|
||||
[node name="прм-прд" type="TextureRect" parent="матрица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("6_a0vpj")
|
||||
|
||||
[node name="прд-0" type="TextureRect" parent="матрица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("7_xr3ub")
|
||||
metadata/unit_name = &""
|
||||
|
||||
[node name="прд-1" type="TextureRect" parent="матрица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("8_saoyo")
|
||||
metadata/unit_name = &""
|
||||
|
||||
[node name="прд-2" type="TextureRect" parent="матрица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("9_bqil1")
|
||||
metadata/unit_name = &""
|
||||
|
||||
[node name="прд-3" type="TextureRect" parent="матрица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("10_ggqgc")
|
||||
metadata/unit_name = &""
|
||||
|
||||
[node name="прд-4" type="TextureRect" parent="матрица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("11_xothm")
|
||||
metadata/unit_name = &""
|
||||
|
||||
[node name="прд-5" type="TextureRect" parent="матрица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("12_4rjt3")
|
||||
metadata/unit_name = &""
|
||||
|
||||
[node name="прм-0" type="TextureRect" parent="матрица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("13_g0j2q")
|
||||
metadata/unit_name = &"эмс-ор63"
|
||||
|
||||
[node name="матрица-0-0" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
action_mode = 0
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-0-1" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-0-2" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-0-3" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-0-4" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-0-5" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="прм-1" type="TextureRect" parent="матрица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("14_crrpm")
|
||||
metadata/unit_name = &""
|
||||
|
||||
[node name="матрица-1-0" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-1-1" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-1-2" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-1-3" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-1-4" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-1-5" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="прм-2" type="TextureRect" parent="матрица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("15_0dspi")
|
||||
metadata/unit_name = &""
|
||||
|
||||
[node name="матрица-2-0" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-2-1" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-2-5" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-2-2" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-2-3" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-2-4" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="прм-3" type="TextureRect" parent="матрица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("16_6042y")
|
||||
metadata/unit_name = &""
|
||||
|
||||
[node name="матрица-3-0" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-3-1" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-3-2" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-3-3" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-3-4" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-3-5" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="прм-4" type="TextureRect" parent="матрица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("17_gvsi1")
|
||||
metadata/unit_name = &""
|
||||
|
||||
[node name="матрица-4-0" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-4-1" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-4-2" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-4-3" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-4-4" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-4-5" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="прм-5" type="TextureRect" parent="матрица"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("18_p3gp1")
|
||||
metadata/unit_name = &""
|
||||
|
||||
[node name="матрица-5-0" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-5-1" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-5-2" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-5-3" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-5-5" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="матрица-5-6" type="TextureButton" parent="матрица" groups=["матрица-к"]]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
toggle_mode = true
|
||||
button_mask = 0
|
||||
texture_normal = ExtResource("2_s28jr")
|
||||
texture_pressed = ExtResource("3_its7t")
|
||||
stretch_mode = 0
|
||||
|
||||
[node name="label_msg" type="Label" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 25.0
|
||||
offset_top = 765.0
|
||||
offset_right = 1180.0
|
||||
offset_bottom = 1155.0
|
||||
text = "Выберите устройство"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="label1" type="Label" parent="."]
|
||||
layout_mode = 2
|
||||
offset_left = 20.0
|
||||
offset_top = 14.0
|
||||
offset_right = 142.0
|
||||
offset_bottom = 35.0
|
||||
text = "Устройства"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="label3" type="Label" parent="."]
|
||||
layout_mode = 2
|
||||
offset_left = 1195.0
|
||||
offset_top = 702.0
|
||||
offset_right = 1585.0
|
||||
offset_bottom = 725.0
|
||||
text = "Индикатор конфликтов"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="label2" type="Label" parent="."]
|
||||
layout_mode = 2
|
||||
offset_left = 145.0
|
||||
offset_top = 14.0
|
||||
offset_right = 1585.0
|
||||
offset_bottom = 35.0
|
||||
text = "Рабочие диапазоны"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
||||
[node name="label4" type="Label" parent="."]
|
||||
layout_mode = 2
|
||||
offset_left = 20.0
|
||||
offset_top = 702.0
|
||||
offset_right = 1190.0
|
||||
offset_bottom = 725.0
|
||||
text = "Кластеры устройства"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
@@ -7,7 +7,6 @@ class InDev:
|
||||
var connector: String ## Номер разъёма в приборе.
|
||||
var delay: float ## Задержка фронта импульса.
|
||||
var offset: float ## Смещение фронта импульса.
|
||||
var state: int ## Состояние входа.
|
||||
var freq: int ## Предполагаемая частота на которой работает комплекс.
|
||||
var ports_data: Dictionary ## Словарь состояния портов устройства.
|
||||
var tbl_row_id: int ## Индекс устройства в таблице.
|
||||
@@ -16,6 +15,14 @@ class InDev:
|
||||
var board: String ## Плата в которой находится устройство.
|
||||
var isa_addr: int ## Адрес устройства на шине isa
|
||||
|
||||
|
||||
@export var state: int: ## Состояние входа.
|
||||
set(val):
|
||||
if val != state:
|
||||
state = val
|
||||
signaller.call_deferred('emit_signal', 'yems_input_changed', id, val)
|
||||
|
||||
|
||||
func _init(dev_id : int, params : Array, row_id : int, base_addr: int):
|
||||
id = dev_id
|
||||
dev_name = String(params[0])
|
||||
@@ -74,7 +81,7 @@ class OutDev extends InDev:
|
||||
if btns_state.has(i_dev):
|
||||
btns_state[i_dev] = val
|
||||
var data = 0
|
||||
for i in range(yemsconsts.NUM_INPUT):
|
||||
for i in yemsconsts.NUM_INPUT:
|
||||
data = data | (int(btns_state[i+1]) << i)
|
||||
ports_data[isa_addr + 4] = data & 0xffff
|
||||
ports_data[isa_addr + 6] = (data >> 16) & 0xffff
|
||||
|
||||
@@ -63,17 +63,16 @@ func init_boards():
|
||||
init_tbl_files()
|
||||
$scrl_files/tbl_files.pin_header($scrl_files, self)
|
||||
|
||||
unit_ems.connect('data_received', Callable(self, 'on_data_ems_received'))
|
||||
unit_ems.connect('command_done', Callable(self, 'on_command_done'))
|
||||
unit_ems.connect('line_changed', Callable(self, 'on_line_changed'))
|
||||
unit_ems.connect('data_received', on_data_ems_received)
|
||||
unit_ems.connect('command_done', on_command_done)
|
||||
unit_ems.connect('line_changed', on_line_changed)
|
||||
for board in g_boards.values():
|
||||
board.connect('upd_delay_offset', Callable(self, 'on_upd_delay_offset'))
|
||||
board.connect('upd_o_state', Callable(self, 'on_upd_o_state'))
|
||||
$btn_connect.connect('pressed', Callable(self, 'on_btn_connect'))
|
||||
$btn_disconnect.connect('pressed', Callable(self, 'on_btn_disconnect').bind(unit_ems))
|
||||
$btn_flash_read.button_connect('pressed', Callable(self, 'on_btn_flash_read').bind($btn_flash_read))
|
||||
$btn_flash_write.button_connect('pressed', Callable(self, 'on_btn_flash_write').bind($btn_flash_write))
|
||||
|
||||
board.connect('upd_delay_offset', on_upd_delay_offset)
|
||||
board.connect('upd_o_state', on_upd_o_state)
|
||||
$btn_connect.connect('pressed', on_btn_connect)
|
||||
$btn_disconnect.connect('pressed', on_btn_disconnect.bind(unit_ems))
|
||||
$btn_flash_read.button_connect('pressed', on_btn_flash_read.bind($btn_flash_read))
|
||||
$btn_flash_write.button_connect('pressed', on_btn_flash_write.bind($btn_flash_write))
|
||||
|
||||
|
||||
## Обработчик нажатия кнопки disconnect.
|
||||
@@ -140,7 +139,7 @@ func init_tbl_files():
|
||||
tools.fill_files_table($scrl_files/tbl_files, yemsconsts.files_folder, FILES_ROWS_TYPES)
|
||||
$scrl_files/tbl_files.set_columns_alignments(yemsconsts.FILES_ROWS_ALIGNMENT)
|
||||
$scrl_files/tbl_files.set_columns_min_size(yemsconsts.FILES_COLUMN_WIDTHS)
|
||||
$scrl_files/tbl_files.connect('row_pressed', Callable(self, 'on_pressed_file'))
|
||||
$scrl_files/tbl_files.connect('row_pressed', on_pressed_file)
|
||||
for i_row in $scrl_files/tbl_files.get_rows_count():
|
||||
disable_edit($scrl_files/tbl_files, len(FILES_ROWS_TYPES), i_row)
|
||||
|
||||
@@ -179,8 +178,8 @@ func init_tbl_in():
|
||||
$scrollin/tbl_in.set_node_user_data(i, row_index, [in_dev, board])
|
||||
$scrollin/tbl_in.set_columns_alignments(yams_alligment_in)
|
||||
$scrollin/tbl_in.set_columns_min_size(column_size)
|
||||
$scrollin/tbl_in.connect('row_pressed', Callable(self, 'on_row_pressed_in'))
|
||||
$scrollin/tbl_in.connect('selected_changed', Callable(self, 'on_selected_changed_in'))
|
||||
$scrollin/tbl_in.connect('row_pressed', on_row_pressed_in)
|
||||
$scrollin/tbl_in.connect('selected_changed', on_selected_changed_in)
|
||||
|
||||
# Инициализация таблицы изменения параметров входа и списка выходов связанных с ним
|
||||
header_text[0] = 'Вход'
|
||||
@@ -188,8 +187,8 @@ func init_tbl_in():
|
||||
$scrl_in_set/tbl_in_set.set_header_text(header_text)
|
||||
$scrl_in_set/tbl_in_set.set_columns_alignments(yams_alligment_in)
|
||||
$scrl_in_set/tbl_in_set.set_columns_min_size(column_size)
|
||||
$scrl_in_set/tbl_in_set.connect('row_pressed', Callable(self, 'on_row_pressed_si'))
|
||||
$scrl_in_set/tbl_in_set.connect('selected_changed', Callable(self, 'on_selected_changed_si'))
|
||||
$scrl_in_set/tbl_in_set.connect('row_pressed', on_row_pressed_si)
|
||||
$scrl_in_set/tbl_in_set.connect('selected_changed', on_selected_changed_si)
|
||||
|
||||
|
||||
## Обработчик редактирования Entry в таблице параметров входов/выходов.
|
||||
@@ -302,16 +301,16 @@ func init_tbl_out():
|
||||
cell.editable = false
|
||||
$scrollout/tbl_out.set_columns_min_size([250, 100, 70, 70, 70, 100])
|
||||
$scrollout/tbl_out.set_columns_alignments(yams_alligment_out)
|
||||
$scrollout/tbl_out.connect('row_pressed', Callable(self, 'on_row_pressed_out'))
|
||||
$scrollout/tbl_out.connect('selected_changed', Callable(self, 'on_selected_changed_out'))
|
||||
$scrollout/tbl_out.connect('row_pressed', on_row_pressed_out)
|
||||
$scrollout/tbl_out.connect('selected_changed', on_selected_changed_out)
|
||||
|
||||
# Инициализация таблицы изменения параметров выхода и списка входов связанных с ним
|
||||
header_text[0] = 'Выход'
|
||||
$scrl_out_set/tbl_out_set.set_header([TableHeader, TableHeader, CellFront, CellFrontRear, TableHeader, TableHeader])
|
||||
$scrl_out_set/tbl_out_set.set_header_text(header_text)
|
||||
$scrl_out_set/tbl_out_set.set_columns_min_size([250, 100, 70, 70, 70, 100])
|
||||
$scrl_out_set/tbl_out_set.connect('row_pressed', Callable(self, 'on_row_pressed_so'))
|
||||
$scrl_out_set/tbl_out_set.connect('selected_changed', Callable(self, 'on_selected_changed_so'))
|
||||
$scrl_out_set/tbl_out_set.connect('row_pressed', on_row_pressed_so)
|
||||
$scrl_out_set/tbl_out_set.connect('selected_changed', on_selected_changed_so)
|
||||
|
||||
|
||||
## Обработчик выбора строки в таблице соединений выхода и изменения параметров.
|
||||
@@ -357,7 +356,7 @@ func set_out_dev(dev):
|
||||
var mode = $scrl_out_set/tbl_out_set.get_node2(5, 0)
|
||||
for opt in OUT_MODE:
|
||||
mode.add_item(opt)
|
||||
mode.connect('item_selected', Callable(self, 'on_switch_done').bind(dev))
|
||||
mode.connect('item_selected', on_switch_done.bind(dev))
|
||||
mode.select(dev.mode)
|
||||
|
||||
|
||||
@@ -532,20 +531,20 @@ func on_upd_delay_offset(_board, dev):
|
||||
tbl = $scrollout/tbl_out
|
||||
var le_delay = tbl.get_node2(TABLE_ENTRY_COLUMNS[0], dev.tbl_row_id)
|
||||
var le_offset = tbl.get_node2(TABLE_ENTRY_COLUMNS[1], dev.tbl_row_id)
|
||||
le_delay.set_text(str('%3.1f' % dev.delay))
|
||||
le_offset.set_text(str('%3.1f' % dev.offset))
|
||||
le_delay.set_text('%3.1f' % dev.delay)
|
||||
le_offset.set_text('%3.1f' % dev.offset)
|
||||
if $scrl_in_set/tbl_in_set.get_rows_count():
|
||||
var sel_dev = $scrl_in_set/tbl_in_set.get_node_user_data(0, 0)
|
||||
var l_delay = $scrl_in_set/tbl_in_set.get_node2(2, 0)
|
||||
var l_offset = $scrl_in_set/tbl_in_set.get_node2(3, 0)
|
||||
l_delay.set_text(str('%3.1f' % sel_dev.delay))
|
||||
l_offset.set_text(str('%3.1f' % sel_dev.offset))
|
||||
l_delay.set_text('%3.1f' % sel_dev.delay)
|
||||
l_offset.set_text('%3.1f' % sel_dev.offset)
|
||||
if $scrl_out_set/tbl_out_set.get_rows_count():
|
||||
var sel_dev = $scrl_out_set/tbl_out_set.get_node_user_data(0, 0)
|
||||
var l_delay = $scrl_out_set/tbl_out_set.get_node2(2, 0)
|
||||
var l_offset = $scrl_out_set/tbl_out_set.get_node2(3, 0)
|
||||
l_delay.set_text(str('%3.1f' % sel_dev.delay))
|
||||
l_offset.set_text(str('%3.1f' % sel_dev.offset))
|
||||
l_delay.set_text('%3.1f' % sel_dev.delay)
|
||||
l_offset.set_text('%3.1f' % sel_dev.offset)
|
||||
|
||||
|
||||
## Вызывается по обновлению информации о режиме выходов
|
||||
@@ -662,4 +661,4 @@ func _on_btn_load_pressed() -> void:
|
||||
board.need_write = true
|
||||
log.message(log.INFO, 'Произведено чтение настроек ЭМС из файла: %s, для платы %s' %[fl_name, board.id_board])
|
||||
else:
|
||||
log.message(log.ERROR, 'Ошибка чтение настроек ЭМС из файла: %s' %fl_name)
|
||||
log.message(log.ERROR, 'Ошибка чтение настроек ЭМС из файла: %s' % fl_name)
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
extends Panel
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
var unit_trassa = network.get_unit_instance('уарэп-трасса')
|
||||
unit_trassa.connect('line_changed', Callable(self, 'on_trassa_line_changed'))
|
||||
signaller.connect('sector_klaster', Callable(self, 'on_sector_klaster').bind(unit_trassa))
|
||||
|
||||
|
||||
func on_trassa_line_changed(_unit_trassa):
|
||||
pass
|
||||
|
||||
|
||||
func on_sector_klaster(_data, _unit_trassa):
|
||||
pass
|
||||
@@ -1,96 +0,0 @@
|
||||
[gd_scene load_steps=11 format=3 uid="uid://0uv7tfkx2tec"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://hkcvl2waf63s" path="res://data/вид сверху.png" id="1_4em3i"]
|
||||
[ext_resource type="Texture2D" uid="uid://0w6q4vfst0ry" path="res://data/OP-63.png" id="3_eq8fj"]
|
||||
[ext_resource type="Texture2D" uid="uid://073el51yholj" path="res://data/454.png" id="4_528aa"]
|
||||
[ext_resource type="Texture2D" uid="uid://cckk3jk5r32bh" path="res://data/ГО.png" id="5_qxr47"]
|
||||
[ext_resource type="Texture2D" uid="uid://kyrnn1mqpc08" path="res://data/РЛС1.png" id="6_8sxps"]
|
||||
[ext_resource type="Texture2D" uid="uid://cx0f3wcx76u1k" path="res://data/РЛС2.png" id="7_0bfmy"]
|
||||
[ext_resource type="Texture2D" uid="uid://csxruavk0s40l" path="res://data/Окно частот0.png" id="8_4em3i"]
|
||||
[ext_resource type="Texture2D" uid="uid://duu8q7sv0jwfh" path="res://data/ННВС.png" id="8_aiy4x"]
|
||||
|
||||
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_5u4bk"]
|
||||
|
||||
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_pd85g"]
|
||||
|
||||
[node name="Control" type="Panel"]
|
||||
|
||||
[node name="Sprite2D" type="Sprite2D" parent="."]
|
||||
modulate = Color(1, 0.596078, 0.4, 1)
|
||||
position = Vector2(801, 131)
|
||||
rotation = 1.5708
|
||||
scale = Vector2(0.353264, 0.353264)
|
||||
texture = ExtResource("1_4em3i")
|
||||
|
||||
[node name="частоты" type="TextureRect" parent="."]
|
||||
visible = false
|
||||
layout_mode = 0
|
||||
offset_left = 72.0
|
||||
offset_top = 264.0
|
||||
offset_right = 1621.0
|
||||
offset_bottom = 870.0
|
||||
scale = Vector2(0.95, 0.95)
|
||||
texture = SubResource("CompressedTexture2D_5u4bk")
|
||||
|
||||
[node name="Op-63" type="TextureRect" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 128.0
|
||||
offset_top = 91.0
|
||||
offset_right = 341.0
|
||||
offset_bottom = 383.0
|
||||
scale = Vector2(0.312207, 0.312207)
|
||||
texture = ExtResource("3_eq8fj")
|
||||
|
||||
[node name="454" type="TextureRect" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 288.0
|
||||
offset_top = 91.0
|
||||
offset_right = 501.0
|
||||
offset_bottom = 383.0
|
||||
scale = Vector2(0.312, 0.312)
|
||||
texture = ExtResource("4_528aa")
|
||||
|
||||
[node name="Го" type="TextureRect" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 464.0
|
||||
offset_top = 91.0
|
||||
offset_right = 677.0
|
||||
offset_bottom = 383.0
|
||||
scale = Vector2(0.312, 0.312)
|
||||
texture = ExtResource("5_qxr47")
|
||||
|
||||
[node name="Рлс1" type="TextureRect" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 728.0
|
||||
offset_top = 91.0
|
||||
offset_right = 941.0
|
||||
offset_bottom = 383.0
|
||||
scale = Vector2(0.312, 0.312)
|
||||
texture = ExtResource("6_8sxps")
|
||||
|
||||
[node name="Рлс2" type="TextureRect" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 920.0
|
||||
offset_top = 91.0
|
||||
offset_right = 1133.0
|
||||
offset_bottom = 383.0
|
||||
scale = Vector2(0.312, 0.312)
|
||||
texture = ExtResource("7_0bfmy")
|
||||
|
||||
[node name="Ннвс" type="TextureRect" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 1280.0
|
||||
offset_top = 91.0
|
||||
offset_right = 1493.0
|
||||
offset_bottom = 383.0
|
||||
scale = Vector2(0.312, 0.312)
|
||||
texture = ExtResource("8_aiy4x")
|
||||
|
||||
[node name="ТаблицаОбмена" type="Sprite2D" parent="."]
|
||||
position = Vector2(568, 1024)
|
||||
scale = Vector2(0.911215, 0.911215)
|
||||
texture = SubResource("CompressedTexture2D_pd85g")
|
||||
|
||||
[node name="ТаблицаЧастот" type="Sprite2D" parent="."]
|
||||
position = Vector2(794, 569)
|
||||
texture = ExtResource("8_4em3i")
|
||||
@@ -136,6 +136,7 @@ class Interfer:
|
||||
var nmfs: int = 0 ## Номер модуля ФС в нумерации СТЦ
|
||||
var priority: int = 0 ## Приоритет помехи
|
||||
var active: bool = false ## Флаг, что фиксируется мощность на выходном усилителе
|
||||
var freq_change = false ## Флаг, что частота изменнена пользователем
|
||||
|
||||
func _to_string() -> String:
|
||||
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
|
||||
@@ -174,6 +175,8 @@ class Interfer:
|
||||
params[value_key] = value
|
||||
else:
|
||||
self.set(value_key, value)
|
||||
if value_key == 'freq':
|
||||
freq_change = true
|
||||
|
||||
signal interfer_preparing(ecm: Interfer) ## Вызывается в момент запуска помехи.
|
||||
signal interfer_run(ecm: Interfer) ## Вызывается в момент начала работы помехи.
|
||||
@@ -541,7 +544,8 @@ func call_diap(ecm, ecm_params: Dictionary):
|
||||
var band = fs_index_arr[0] / 4
|
||||
if ecm_params['files'].has(band):
|
||||
ecm.params['filename'] = ecm_params['files'][band][0]
|
||||
ecm.params['freq'] = ecm_params['files'][band][1]
|
||||
if not ecm.freq_change:
|
||||
ecm.params['freq'] = ecm_params['files'][band][1]
|
||||
|
||||
|
||||
func call_pdchm(ecm, ecm_params: Dictionary):
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
@tool
|
||||
class_name Network extends Node
|
||||
|
||||
const YAU07_PROTO: = {'yau07tx': yau07.YaU07}
|
||||
const YAU07_PROTO: = {'yau07tx': yau07.YaU07, 'iyems-tx': yemstg.YeMSTG}
|
||||
const UDP_PROTO: = {'capsrpb': capsrpb.CapsRpb, 'trassa': trassa.Trassa}
|
||||
const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28}
|
||||
const SERIAL_PROTO: = {'spt25': spt25.SPT25}
|
||||
@@ -146,12 +146,15 @@ func create_socket_udp(unit_name: StringName) -> SocketUDP:
|
||||
var bind = st[3]
|
||||
var sock: = SocketUDP.new()
|
||||
sock.set_broadcast_enabled(broad)
|
||||
var rc: = sock.bind(port, addr)
|
||||
if rc == Error.OK:
|
||||
log.info('\"%s\" привязан к %s:%d' % [unit_name, addr, port])
|
||||
else:
|
||||
var errmsg: = error_string(rc)
|
||||
log.error('привязка \"%s\" к %s:%d не удалась: \"%s\"' % [unit_name, addr, port, errmsg])
|
||||
if broad:
|
||||
log.info('\"%s\" - установлен широковещательный режим' % unit_name)
|
||||
if bind:
|
||||
var rc: = sock.bind(port, addr)
|
||||
if rc == Error.OK:
|
||||
log.info('\"%s\" привязан к %s:%d' % [unit_name, addr, port])
|
||||
else:
|
||||
var errmsg: = error_string(rc)
|
||||
log.error('привязка \"%s\" к %s:%d не удалась: \"%s\"' % [unit_name, addr, port, errmsg])
|
||||
return sock
|
||||
|
||||
|
||||
@@ -197,7 +200,8 @@ func _ready() -> void:
|
||||
var sock_navi: = create_socket_udp('навигация')
|
||||
var sock_caps: = create_socket_caps('уарэп-капсрпб')
|
||||
var sock_trassa: = create_socket_caps('уарэп-трасса')
|
||||
poll_sockets = [sock_unicast, sock_broadcast, sock_caps, sock_navi, sock_trassa]
|
||||
var sock_yems: = create_socket_udp('эмс-ведущий')
|
||||
poll_sockets = [sock_unicast, sock_broadcast, sock_caps, sock_navi, sock_trassa, sock_yems]
|
||||
send_sockets['уарэп-яу07-частный'] = sock_unicast
|
||||
send_sockets['уарэп-яу07-общий'] = sock_broadcast
|
||||
send_sockets['уарэп-капсрпб'] = sock_caps
|
||||
@@ -215,6 +219,14 @@ func _ready() -> void:
|
||||
send_sockets['уарэп-яу07-3в'] = sock_unicast
|
||||
send_sockets['уарэп-яу07-3н'] = sock_unicast
|
||||
send_sockets['уарэп-яу07-3к'] = sock_unicast
|
||||
send_sockets['эмс-ор63'] = sock_yems
|
||||
send_sockets['эмс-454'] = sock_yems
|
||||
send_sockets['эмс-го'] = sock_yems
|
||||
send_sockets['эмс-рлс1'] = sock_yems
|
||||
send_sockets['эмс-рлс2'] = sock_yems
|
||||
send_sockets['эмс-ннвс'] = sock_yems
|
||||
send_sockets['эмс-изделие7'] = sock_yems
|
||||
send_sockets['эмс-изделие8'] = sock_yems
|
||||
|
||||
var bind_serials: = []
|
||||
var bind_modbuses: = []
|
||||
@@ -343,6 +355,7 @@ func _process(_delta: float) -> void:
|
||||
poll_sockets.any(poll_receive_udp)
|
||||
|
||||
|
||||
## Возвращает экземпляр уже созданного устройства
|
||||
## [param unit_name] - Уникальное имя устройства[br]
|
||||
func get_unit_instance(unit_name: StringName) -> unit.Unit:
|
||||
return units.get(unit_name, null)
|
||||
|
||||
@@ -445,12 +445,11 @@ func _handle_fs_work_state() -> void:
|
||||
(current_litera == 6 and control_results.fs_6) or \
|
||||
(current_litera == 7 and control_results.fs_7) or \
|
||||
(current_litera == 1 and control_results.fs_1):
|
||||
if not block_kasseta_y5_config['yau07']:
|
||||
_set_status('Ожидание данных от ЯУ-07...')
|
||||
return # НЕ переходим дальше пока нет данных от сервиса МП550
|
||||
|
||||
if flags.only_fs:
|
||||
state = STATE_MACHINE.IN_EMS_STOP
|
||||
elif not block_kasseta_y5_config['yau07']:
|
||||
_set_status('Ожидание данных от МП550 сервиса...')
|
||||
return
|
||||
else:
|
||||
state = STATE_MACHINE.UG_SET_RAY_5 if current_litera == 1 else STATE_MACHINE.UG_SET_RAY_CTRL
|
||||
|
||||
@@ -470,7 +469,7 @@ func _handle_check_kasseta_state() -> void:
|
||||
_set_status('Перегрев УМ')
|
||||
state = STATE_MACHINE.IN_EMS_STOP
|
||||
else:
|
||||
flags.flag_only_fs = true
|
||||
flags.only_fs = true
|
||||
_set_status('Касета У5: ERROR, Проверка ФС.')
|
||||
state = STATE_MACHINE.FS_TURN_ON
|
||||
|
||||
@@ -554,8 +553,7 @@ func _handle_ray_read_mode() -> void:
|
||||
|
||||
## Обработка записи состояния луча
|
||||
func _handle_ray_write_mode(ray_num: int) -> void:
|
||||
if not _can_write_ray():
|
||||
return
|
||||
if not _can_write_ray(): return
|
||||
|
||||
if (ray_num == 6 or ray_num == 5) and not control_timer.is_stopped():
|
||||
control_timer.stop()
|
||||
@@ -1057,9 +1055,9 @@ static func check_block_kasseta_y5(status_prd: PackedByteArray, y5_config: Dicti
|
||||
y5_config.yau07 = not flag_not_trust
|
||||
if y5_config.yau07:
|
||||
y5_config.ems = (status_prd[0] & 1) and ((status_prd[0] >> 4) & 1)
|
||||
y5_config.ug = (status_prd[0] >> 1) & 1
|
||||
y5_config.ukp1 = (status_prd[0] >> 2) & 1
|
||||
y5_config.ukp2 = (status_prd[0] >> 3) & 1
|
||||
y5_config.ug = (status_prd[0] >> 1) & 1 != 0
|
||||
y5_config.ukp1 = (status_prd[0] >> 2) & 1 != 0
|
||||
y5_config.ukp2 = (status_prd[0] >> 3) & 1 != 0
|
||||
return y5_config
|
||||
|
||||
|
||||
|
||||
503
scripts/rtr.gd
Normal file
@@ -0,0 +1,503 @@
|
||||
class_name rtr
|
||||
extends Node
|
||||
|
||||
#region Перечисления
|
||||
enum State {
|
||||
IDLE,
|
||||
REQUESTING_AFSP_LEFT,
|
||||
REQUESTING_AFSP_RIGHT,
|
||||
REQUESTING_BPO_LEFT,
|
||||
REQUESTING_BPO_RIGHT,
|
||||
WAITING_TIMEOUT
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Сигналы
|
||||
# Сигналы отправки запроса
|
||||
signal request_sent_afsp_left(url: String)
|
||||
signal request_sent_afsp_right(url: String)
|
||||
signal request_sent_bpo_left(url: String)
|
||||
signal request_sent_bpo_right(url: String)
|
||||
|
||||
# Сигналы получения ответа
|
||||
signal response_received_afsp_left(response: String, success: bool)
|
||||
signal response_received_afsp_right(response: String, success: bool)
|
||||
signal response_received_bpo_left(response: String, success: bool)
|
||||
signal response_received_bpo_right(response: String, success: bool)
|
||||
|
||||
# Сигналы исправности (0 - нет связи, 1 - всё пройдено, 2 - есть ошибки)
|
||||
signal serviceability_rtr_afsp_left(state: int)
|
||||
signal serviceability_rtr_afsp_right(state: int)
|
||||
signal serviceability_rtr_bpo(state: int) # Общий для левого и правого БПО
|
||||
#endregion
|
||||
|
||||
#region Константы
|
||||
const RESULT_STRINGS = {
|
||||
HTTPRequest.Result.RESULT_SUCCESS: 'Запрос успешен',
|
||||
HTTPRequest.Result.RESULT_CHUNKED_BODY_SIZE_MISMATCH: 'Несоответствие размеров частей сообщения',
|
||||
HTTPRequest.Result.RESULT_CANT_CONNECT: 'Запрос не выполнен при подключении',
|
||||
HTTPRequest.Result.RESULT_CANT_RESOLVE: 'Запрос не выполнен при разрешении',
|
||||
HTTPRequest.Result.RESULT_CONNECTION_ERROR: 'Запрос не выполнен из-за ошибки соединения',
|
||||
HTTPRequest.Result.RESULT_TLS_HANDSHAKE_ERROR: 'Запрос не выполнен на TLS рукопожатии',
|
||||
HTTPRequest.Result.RESULT_NO_RESPONSE: 'Запрос не имеет ответа (пока)',
|
||||
HTTPRequest.Result.RESULT_BODY_SIZE_LIMIT_EXCEEDED: 'Запрос превысил максимальный размер',
|
||||
HTTPRequest.Result.RESULT_BODY_DECOMPRESS_FAILED: 'Не удалось распаковать сообщение',
|
||||
HTTPRequest.Result.RESULT_REQUEST_FAILED: 'Запрос не удался',
|
||||
HTTPRequest.Result.RESULT_DOWNLOAD_FILE_CANT_OPEN: 'Невозможно открыть файл загрузки',
|
||||
HTTPRequest.Result.RESULT_DOWNLOAD_FILE_WRITE_ERROR: 'Невозможно записать в файл загрузки',
|
||||
HTTPRequest.Result.RESULT_REDIRECT_LIMIT_REACHED: 'Достигнут лимит перенаправлений',
|
||||
HTTPRequest.Result.RESULT_TIMEOUT: 'Время истекло'
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Переменные
|
||||
var http_request: HTTPRequest
|
||||
var addresses: Dictionary
|
||||
var current_state: State = State.IDLE
|
||||
var current_url: String = ''
|
||||
var timeout_timer: Timer
|
||||
|
||||
# Результаты запросов АФСП
|
||||
var last_response_afsp_left: String = ''
|
||||
var last_response_afsp_right: String = ''
|
||||
var last_error_afsp_left: String = ''
|
||||
var last_error_afsp_right: String = ''
|
||||
|
||||
# Результаты запросов БПО
|
||||
var last_response_bpo_left: String = ''
|
||||
var last_response_bpo_right: String = ''
|
||||
var last_error_bpo_left: String = ''
|
||||
var last_error_bpo_right: String = ''
|
||||
|
||||
# Статус online для каждого борта
|
||||
var online_afsp_left: bool = false
|
||||
var online_afsp_right: bool = false
|
||||
var online_bpo_left: bool = false
|
||||
var online_bpo_right: bool = false
|
||||
|
||||
# Состояния исправности для БПО
|
||||
var bpo_left_state: int = 0 # 0 - нет связи, 1 - успешно, 2 - ошибка
|
||||
var bpo_right_state: int = 0
|
||||
|
||||
var last_success_time_afsp_left: int = 0
|
||||
var last_success_time_afsp_right: int = 0
|
||||
var last_success_time_bpo_left: int = 0
|
||||
var last_success_time_bpo_right: int = 0
|
||||
|
||||
var timeout: float
|
||||
var current_device_type: String = ''
|
||||
#endregion
|
||||
|
||||
#region Инициализация
|
||||
func _ready() -> void:
|
||||
http_request = HTTPRequest.new()
|
||||
add_child(http_request)
|
||||
http_request.request_completed.connect(_on_request_completed)
|
||||
|
||||
timeout_timer = Timer.new()
|
||||
add_child(timeout_timer)
|
||||
timeout_timer.timeout.connect(_on_timeout)
|
||||
timeout_timer.one_shot = true
|
||||
|
||||
signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_contol_device'))
|
||||
#endregion
|
||||
|
||||
#region Публичные методы
|
||||
func get_result_string(result: int) -> String:
|
||||
return RESULT_STRINGS.get(result, '<неизвестный код результата HTTPRequest - %d>' % result)
|
||||
|
||||
# Геттеры АФСП
|
||||
func get_afsp_left_response() -> String:
|
||||
return last_response_afsp_left
|
||||
|
||||
func get_afsp_right_response() -> String:
|
||||
return last_response_afsp_right
|
||||
|
||||
func get_afsp_left_error() -> String:
|
||||
return last_error_afsp_left
|
||||
|
||||
func get_afsp_right_error() -> String:
|
||||
return last_error_afsp_right
|
||||
|
||||
func has_afsp_left_success() -> bool:
|
||||
return not last_response_afsp_left.is_empty()
|
||||
|
||||
func has_afsp_right_success() -> bool:
|
||||
return not last_response_afsp_right.is_empty()
|
||||
|
||||
func is_afsp_left_online() -> bool:
|
||||
return online_afsp_left
|
||||
|
||||
func is_afsp_right_online() -> bool:
|
||||
return online_afsp_right
|
||||
|
||||
# Геттеры БПО
|
||||
func get_bpo_left_response() -> String:
|
||||
return last_response_bpo_left
|
||||
|
||||
func get_bpo_right_response() -> String:
|
||||
return last_response_bpo_right
|
||||
|
||||
func get_bpo_left_error() -> String:
|
||||
return last_error_bpo_left
|
||||
|
||||
func get_bpo_right_error() -> String:
|
||||
return last_error_bpo_right
|
||||
|
||||
func has_bpo_left_success() -> bool:
|
||||
return not last_response_bpo_left.is_empty()
|
||||
|
||||
func has_bpo_right_success() -> bool:
|
||||
return not last_response_bpo_right.is_empty()
|
||||
|
||||
func is_bpo_left_online() -> bool:
|
||||
return online_bpo_left
|
||||
|
||||
func is_bpo_right_online() -> bool:
|
||||
return online_bpo_right
|
||||
|
||||
# Обновление статуса online
|
||||
func _update_online_status(device: String, side: String, is_online: bool) -> void:
|
||||
var unit_name = ''
|
||||
if device == 'afsp':
|
||||
unit_name = 'уарэп-афсп-' + ('левый' if side == 'left' else 'правый')
|
||||
else:
|
||||
unit_name = 'уарэп-бпо-' + ('1' if side == 'left' else '2')
|
||||
|
||||
var unit_instance = network.get_unit_instance(unit_name)
|
||||
if unit_instance:
|
||||
unit_instance.rx_tick = Time.get_ticks_msec()
|
||||
if unit_instance.online != is_online:
|
||||
unit_instance.online = is_online
|
||||
unit_instance.emit_signal('line_changed', unit_instance)
|
||||
#endregion
|
||||
|
||||
#region Обработчики сигналов
|
||||
func _on_start_contol_device() -> void:
|
||||
if current_state != State.IDLE:
|
||||
return
|
||||
|
||||
# Сбрасываем предыдущие результаты
|
||||
last_response_afsp_left = ''
|
||||
last_response_afsp_right = ''
|
||||
last_error_afsp_left = ''
|
||||
last_error_afsp_right = ''
|
||||
last_response_bpo_left = ''
|
||||
last_response_bpo_right = ''
|
||||
last_error_bpo_left = ''
|
||||
last_error_bpo_right = ''
|
||||
|
||||
bpo_left_state = 0
|
||||
bpo_right_state = 0
|
||||
|
||||
addresses['Адрес АФСП левого борта'] = ProjectSettings.get_setting('application/config/%s' % 'Адрес АФСП левого борта')
|
||||
addresses['Адрес АФСП правого борта'] = ProjectSettings.get_setting('application/config/%s' % 'Адрес АФСП правого борта')
|
||||
addresses['Адрес БПО левого борта'] = ProjectSettings.get_setting('application/config/%s' % 'Адрес БПО левого борта')
|
||||
addresses['Адрес БПО правого борта'] = ProjectSettings.get_setting('application/config/%s' % 'Адрес БПО правого борта')
|
||||
|
||||
timeout = float(ProjectSettings.get_setting('application/config/%s' % 'Период опроса состояния АФСП, секунды'))
|
||||
|
||||
# Начинаем с запроса к АФСП левого борта
|
||||
_request_next(State.REQUESTING_AFSP_LEFT)
|
||||
|
||||
func _on_request_completed(result: int, response_code: int, _headers: PackedStringArray, body: PackedByteArray) -> void:
|
||||
if current_state == State.WAITING_TIMEOUT:
|
||||
return
|
||||
|
||||
timeout_timer.stop()
|
||||
|
||||
var current_time = Time.get_ticks_msec()
|
||||
var is_afsp = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_AFSP_RIGHT)
|
||||
var is_left = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_BPO_LEFT)
|
||||
var side_str = 'left' if is_left else 'right'
|
||||
var device_str = 'afsp' if is_afsp else 'bpo'
|
||||
|
||||
if response_code == 200:
|
||||
var response_text = body.get_string_from_utf8()
|
||||
_save_response(response_text)
|
||||
|
||||
var test_passed_all = _check_all_tests_passed(response_text)
|
||||
|
||||
_update_success_time(device_str, side_str, current_time)
|
||||
_update_online_status(device_str, side_str, true)
|
||||
_emit_response_signal(device_str, side_str, response_text, true)
|
||||
|
||||
var serviceability_state = 1 if test_passed_all else 2
|
||||
|
||||
if is_afsp:
|
||||
_emit_afsp_serviceability_signal(side_str, serviceability_state)
|
||||
else:
|
||||
_update_bpo_state(side_str, serviceability_state)
|
||||
_emit_bpo_serviceability_signal()
|
||||
|
||||
_on_request_finished()
|
||||
else:
|
||||
var error_msg = 'HTTP ошибка %d: %s' % [response_code, get_result_string(result)]
|
||||
log.message(Logger.ERROR, error_msg)
|
||||
_save_error(error_msg)
|
||||
|
||||
_update_online_status(device_str, side_str, false)
|
||||
_emit_response_signal(device_str, side_str, error_msg, false)
|
||||
|
||||
if is_afsp:
|
||||
_emit_afsp_serviceability_signal(side_str, 0)
|
||||
else:
|
||||
_update_bpo_state(side_str, 0)
|
||||
_emit_bpo_serviceability_signal()
|
||||
|
||||
_on_request_finished()
|
||||
|
||||
func _update_bpo_state(side: String, state: int) -> void:
|
||||
if side == 'left':
|
||||
bpo_left_state = state
|
||||
else:
|
||||
bpo_right_state = state
|
||||
|
||||
func _calculate_bpo_combined_state() -> int:
|
||||
# Если оба не на связи -> 0
|
||||
if bpo_left_state == 0 and bpo_right_state == 0:
|
||||
return 0
|
||||
# Если хоть один с ошибкой -> 2
|
||||
if bpo_left_state == 2 or bpo_right_state == 2:
|
||||
return 2
|
||||
# Если один не на связи (0), а другой успешно (1) -> 1
|
||||
if (bpo_left_state == 0 and bpo_right_state == 1) or (bpo_left_state == 1 and bpo_right_state == 0):
|
||||
return 1
|
||||
# Оба успешно -> 1
|
||||
if bpo_left_state == 1 and bpo_right_state == 1:
|
||||
return 1
|
||||
# По умолчанию
|
||||
return 0
|
||||
|
||||
func _emit_bpo_serviceability_signal() -> void:
|
||||
var combined_state = _calculate_bpo_combined_state()
|
||||
emit_signal('serviceability_rtr_bpo', combined_state)
|
||||
|
||||
|
||||
func _state_to_string(state: int) -> String:
|
||||
match state:
|
||||
0: return 'нет связи'
|
||||
1: return 'успешно'
|
||||
2: return 'ошибка'
|
||||
return 'неизвестно'
|
||||
|
||||
func _emit_afsp_serviceability_signal(side: String, state: int) -> void:
|
||||
if side == 'left':
|
||||
emit_signal('serviceability_rtr_afsp_left', state)
|
||||
else:
|
||||
emit_signal('serviceability_rtr_afsp_right', state)
|
||||
|
||||
func _check_all_tests_passed(response_text: String) -> bool:
|
||||
var json = JSON.new()
|
||||
if json.parse(response_text) != OK:
|
||||
log.message(Logger.ERROR, '[rtr] Ошибка парсинга JSON')
|
||||
return false
|
||||
|
||||
var data = json.data
|
||||
var self_tests = data.get('SelfTest', [])
|
||||
|
||||
var all_passed = true
|
||||
|
||||
for test in self_tests:
|
||||
var system_list = test.get('SystemList', [])
|
||||
for system in system_list:
|
||||
# Рекурсивно проверяем систему и её подсистемы
|
||||
if not _check_system_passed(system):
|
||||
all_passed = false
|
||||
# Не прерываем цикл, чтобы найти все ошибки
|
||||
|
||||
return all_passed
|
||||
|
||||
# Рекурсивная функция для проверки SystemList и вывода ошибок
|
||||
func _check_system_passed(system: Dictionary) -> bool:
|
||||
var system_passed = true
|
||||
|
||||
# Проверяем устройства в текущей системе
|
||||
var dev_list = system.get('DevList', [])
|
||||
for dev in dev_list:
|
||||
var test_passed = dev.get('TestPassed', false)
|
||||
if not test_passed:
|
||||
system_passed = false
|
||||
# Формируем читаемое имя устройства для вывода
|
||||
var dev_name = dev.get('DevName', 'Неизвестное устройство')
|
||||
var dev_id = dev.get('DevId', '?')
|
||||
var error_text = dev.get('ErrorText', 'Нет описания ошибки')
|
||||
print_debug('[rtr] НАЙДЕНА ОШИБКА! Устройство: %s (ID: %s). TestPassed: false. Причина: %s' % [dev_name, dev_id, error_text])
|
||||
|
||||
# Рекурсивно проверяем вложенные подсистемы
|
||||
var sub_systems = system.get('SystemList', [])
|
||||
for sub in sub_systems:
|
||||
if not _check_system_passed(sub):
|
||||
system_passed = false
|
||||
|
||||
return system_passed
|
||||
|
||||
|
||||
# Исправленная функция подсчета (использует Dictionary для передачи по ссылке)
|
||||
func _count_tests_in_system(system: Dictionary, counters: Dictionary) -> void:
|
||||
var dev_list = system.get('DevList', [])
|
||||
for dev in dev_list:
|
||||
counters['total'] += 1
|
||||
if dev.get('TestPassed', false):
|
||||
counters['passed'] += 1
|
||||
|
||||
var sub_systems = system.get('SystemList', [])
|
||||
for sub in sub_systems:
|
||||
_count_tests_in_system(sub, counters)
|
||||
|
||||
func _on_timeout() -> void:
|
||||
var was_state = current_state
|
||||
current_state = State.WAITING_TIMEOUT
|
||||
http_request.cancel_request()
|
||||
|
||||
var is_afsp = (was_state == State.REQUESTING_AFSP_LEFT or was_state == State.REQUESTING_AFSP_RIGHT)
|
||||
var is_left = (was_state == State.REQUESTING_AFSP_LEFT or was_state == State.REQUESTING_BPO_LEFT)
|
||||
var side_str = 'left' if is_left else 'right'
|
||||
var device_str = 'afsp' if is_afsp else 'bpo'
|
||||
|
||||
var timeout_msg = 'Таймаут %.1f секунд - %s' % [timeout, get_result_string(HTTPRequest.Result.RESULT_TIMEOUT)]
|
||||
_save_error(timeout_msg)
|
||||
|
||||
_update_online_status(device_str, side_str, false)
|
||||
_emit_response_signal(device_str, side_str, timeout_msg, false)
|
||||
|
||||
if is_afsp:
|
||||
_emit_afsp_serviceability_signal(side_str, 0)
|
||||
else:
|
||||
_update_bpo_state(side_str, 0)
|
||||
_emit_bpo_serviceability_signal()
|
||||
|
||||
_on_request_finished()
|
||||
#endregion
|
||||
|
||||
#region Управление запросами
|
||||
func _request_next(next_state: State) -> void:
|
||||
current_state = next_state
|
||||
current_device_type = 'afsp' if (next_state == State.REQUESTING_AFSP_LEFT or next_state == State.REQUESTING_AFSP_RIGHT) else 'bpo'
|
||||
|
||||
match current_state:
|
||||
State.REQUESTING_AFSP_LEFT:
|
||||
current_url = addresses.get('Адрес АФСП левого борта', '')
|
||||
State.REQUESTING_AFSP_RIGHT:
|
||||
current_url = addresses.get('Адрес АФСП правого борта', '')
|
||||
State.REQUESTING_BPO_LEFT:
|
||||
current_url = addresses.get('Адрес БПО левого борта', '')
|
||||
State.REQUESTING_BPO_RIGHT:
|
||||
current_url = addresses.get('Адрес БПО правого борта', '')
|
||||
State.IDLE:
|
||||
return
|
||||
|
||||
if current_url.is_empty():
|
||||
push_error('URL не задан для ', current_state)
|
||||
var error_msg = 'URL не задан'
|
||||
_save_error(error_msg)
|
||||
|
||||
var is_afsp = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_AFSP_RIGHT)
|
||||
var is_left = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_BPO_LEFT)
|
||||
var side_str = 'left' if is_left else 'right'
|
||||
var device_str = 'afsp' if is_afsp else 'bpo'
|
||||
|
||||
_update_online_status(device_str, side_str, false)
|
||||
_emit_response_signal(device_str, side_str, error_msg, false)
|
||||
|
||||
if is_afsp:
|
||||
_emit_afsp_serviceability_signal(side_str, 0)
|
||||
else:
|
||||
_update_bpo_state(side_str, 0)
|
||||
_emit_bpo_serviceability_signal()
|
||||
|
||||
_on_request_finished()
|
||||
return
|
||||
|
||||
match current_state:
|
||||
State.REQUESTING_AFSP_LEFT:
|
||||
emit_signal('request_sent_afsp_left', current_url)
|
||||
State.REQUESTING_AFSP_RIGHT:
|
||||
emit_signal('request_sent_afsp_right', current_url)
|
||||
State.REQUESTING_BPO_LEFT:
|
||||
emit_signal('request_sent_bpo_left', current_url)
|
||||
State.REQUESTING_BPO_RIGHT:
|
||||
emit_signal('request_sent_bpo_right', current_url)
|
||||
|
||||
timeout_timer.start(timeout)
|
||||
var error = http_request.request(current_url)
|
||||
if error != OK:
|
||||
log.message(Logger.ERROR, 'Ошибка запроса: %s' & error)
|
||||
var error_msg = 'Ошибка запроса: ' + error_string(error)
|
||||
_save_error(error_msg)
|
||||
|
||||
var is_afsp = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_AFSP_RIGHT)
|
||||
var is_left = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_BPO_LEFT)
|
||||
var side_str = 'left' if is_left else 'right'
|
||||
var device_str = 'afsp' if is_afsp else 'bpo'
|
||||
|
||||
_update_online_status(device_str, side_str, false)
|
||||
_emit_response_signal(device_str, side_str, error_msg, false)
|
||||
|
||||
if is_afsp:
|
||||
_emit_afsp_serviceability_signal(side_str, 0)
|
||||
else:
|
||||
_update_bpo_state(side_str, 0)
|
||||
_emit_bpo_serviceability_signal()
|
||||
|
||||
_on_request_finished()
|
||||
|
||||
func _on_request_finished() -> void:
|
||||
match current_state:
|
||||
State.REQUESTING_AFSP_LEFT:
|
||||
_request_next(State.REQUESTING_AFSP_RIGHT)
|
||||
State.REQUESTING_AFSP_RIGHT:
|
||||
_request_next(State.REQUESTING_BPO_LEFT)
|
||||
State.REQUESTING_BPO_LEFT:
|
||||
_request_next(State.REQUESTING_BPO_RIGHT)
|
||||
State.REQUESTING_BPO_RIGHT, State.WAITING_TIMEOUT:
|
||||
current_state = State.IDLE
|
||||
#endregion
|
||||
|
||||
#region Сохранение результатов
|
||||
func _save_response(response: String) -> void:
|
||||
match current_state:
|
||||
State.REQUESTING_AFSP_LEFT:
|
||||
last_response_afsp_left = response
|
||||
State.REQUESTING_AFSP_RIGHT:
|
||||
last_response_afsp_right = response
|
||||
State.REQUESTING_BPO_LEFT:
|
||||
last_response_bpo_left = response
|
||||
State.REQUESTING_BPO_RIGHT:
|
||||
last_response_bpo_right = response
|
||||
|
||||
func _save_error(error: String) -> void:
|
||||
match current_state:
|
||||
State.REQUESTING_AFSP_LEFT:
|
||||
last_error_afsp_left = error
|
||||
State.REQUESTING_AFSP_RIGHT:
|
||||
last_error_afsp_right = error
|
||||
State.REQUESTING_BPO_LEFT:
|
||||
last_error_bpo_left = error
|
||||
State.REQUESTING_BPO_RIGHT:
|
||||
last_error_bpo_right = error
|
||||
|
||||
func _update_success_time(device: String, side: String, time: int) -> void:
|
||||
if device == 'afsp':
|
||||
if side == 'left':
|
||||
last_success_time_afsp_left = time
|
||||
else:
|
||||
last_success_time_afsp_right = time
|
||||
else:
|
||||
if side == 'left':
|
||||
last_success_time_bpo_left = time
|
||||
else:
|
||||
last_success_time_bpo_right = time
|
||||
|
||||
func _emit_response_signal(device: String, side: String, response: String, success: bool) -> void:
|
||||
if device == 'afsp':
|
||||
if side == 'left':
|
||||
emit_signal('response_received_afsp_left', response, success)
|
||||
else:
|
||||
emit_signal('response_received_afsp_right', response, success)
|
||||
else:
|
||||
if side == 'left':
|
||||
emit_signal('response_received_bpo_left', response, success)
|
||||
else:
|
||||
emit_signal('response_received_bpo_right', response, success)
|
||||
#endregion
|
||||
1
scripts/rtr.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ctqcvjqjb1av3
|
||||
@@ -6,7 +6,8 @@ class_name uarep_settings extends Node
|
||||
var settings_program: Dictionary
|
||||
|
||||
var UnitProfiles: Dictionary[StringName, Array] = { \
|
||||
# < Название: Протокол, Адрес, <Порт>|[, Порт], Широковещательное, Привязывать, Комментарий >
|
||||
# < Название: [Протокол, [Параметры], Комментарий] >
|
||||
# < Название: Протокол, [Адрес, <Порт>|[, Порт], Широковещательное, Привязывать], Комментарий >
|
||||
'уарэп-яу07-частный': ['yau07rx', ['10.1.1.2', 50002, false, true], 'IP-адрес для приёма частных сообщений от ЯУ-07'],
|
||||
'уарэп-яу07-общий': ['yau07rx', ['*', 50000, true, true], 'IP-адрес для приёма широковещательных сообщений от ЯУ-07'],
|
||||
'уарэп-капсрпб': ['capsrpb', ['127.0.0.1', '127.0.0.1', 42023, 42022, false, true], 'IP-адрес для обмена сообщениями со службой \"МП550\" (СТЦ)'],
|
||||
@@ -26,6 +27,17 @@ var UnitProfiles: Dictionary[StringName, Array] = { \
|
||||
'уарэп-яу07-3к': ['yau07tx', ['10.1.1.33', 50033, false, false], 'IP-адрес прибора ПРД-К3'],
|
||||
'навигация': ['navi', ['*', 60000, true, true ], 'IP-адрес на котором принимают сообщения от навигации'],
|
||||
|
||||
# < Название: [протокол, [адрес, порт, широковещательное, привязывать], комментарий >
|
||||
'эмс-ведущий': ['iyems-rx', ['192.168.11.105', 61000, false, true], 'IP-адрес для приёма докладов от информационных ЭМС устройств'],
|
||||
'эмс-ор63': ['iyems-tx', ['192.168.11.200', 61001, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
|
||||
'эмс-454': ['iyems-tx', ['192.168.11.200', 61002, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
|
||||
'эмс-го': ['iyems-tx', ['192.168.11.200', 61003, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
|
||||
'эмс-рлс1': ['iyems-tx', ['192.168.11.200', 61004, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
|
||||
'эмс-рлс2': ['iyems-tx', ['192.168.11.200', 61005, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
|
||||
'эмс-ннвс': ['iyems-tx', ['192.168.11.200', 61006, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
|
||||
'эмс-изделие7': ['iyems-tx', ['127.0.0.1', 61007, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
|
||||
'эмс-изделие8': ['iyems-tx', ['127.0.0.1', 61008, false, false], 'IP-адрес для передачи команд информационному ЭМС устройству'],
|
||||
|
||||
# < Название: Протокол, < Адрес, Порт получения >, Комментарий >
|
||||
'уарэп-5п28': ['5p28', ['127.0.0.1', 50000], 'IP-адрес комплекса 5П-28'],
|
||||
|
||||
|
||||
@@ -11,6 +11,12 @@ func conn(sgnl: Signal, clbl: Callable): connect(sgnl.get_name(), clbl)
|
||||
func emmit(sgnl: Signal): emit_signal(sgnl.get_name())
|
||||
|
||||
|
||||
## Вызывается при изменении состояния входа ЭМС
|
||||
## [param id] - идентификатор входа ЭМС
|
||||
## [param state] - новое состояние входа ЭМС
|
||||
signal yems_input_changed(id: int, state: int)
|
||||
|
||||
|
||||
## Вызывается при обнаружение ошибки последовательного порта
|
||||
signal serial_error()
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
extends Node
|
||||
## Работа с целями.
|
||||
|
||||
const MSG9_RESEND_TIMEOUT = 1.0 ## Время повторной отправки пакета 9
|
||||
const MSG9_RESEND_TIMEOUT = 3.0 ## Время повторной отправки пакета 9
|
||||
|
||||
## Режимы работы АФСП и БПО (Протокол ТНИИС-СТЦ, пункт 2.5.10)
|
||||
enum AFSP_BPO_MODE {
|
||||
@@ -217,10 +217,7 @@ func send_msg9(unit_caps):
|
||||
|
||||
|
||||
func on_timer_msg9(unit_caps, timer_msg9):
|
||||
if bpo_mode != bpo_mode_rx:
|
||||
send_msg9(unit_caps)
|
||||
else:
|
||||
timer_msg9.stop()
|
||||
send_msg9(unit_caps)
|
||||
|
||||
|
||||
func on_caps_line_changed(unit_caps, timer_msg9):
|
||||
|
||||
@@ -156,7 +156,8 @@ func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2:
|
||||
## [param p] - Координаты вершин полигона.[br]
|
||||
func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool:
|
||||
var sz: = p.size()
|
||||
assert(sz)
|
||||
if not sz:
|
||||
return false
|
||||
var j: int = sz - 1
|
||||
var odd_nodes: int = 0
|
||||
for i in sz:
|
||||
|
||||
@@ -25,6 +25,6 @@ class Unit extends Object:
|
||||
var rx_tick: int = 0 ## Тик-время последнего приёма данных
|
||||
var online: bool = false ## Состояние подключения устройства
|
||||
var name: StringName = '<без имени>' ## Уникальное имя устройства
|
||||
func _init(nm) -> void: self.name = nm
|
||||
func _init(nm: StringName) -> void: self.name = nm
|
||||
func _to_string() -> String:
|
||||
return String('Unit(\"%s\", %s)' % [self.name, 'на связи' if online else 'отключен'])
|
||||
|
||||
38
scripts/yemstg.gd
Normal file
@@ -0,0 +1,38 @@
|
||||
extends Node
|
||||
|
||||
|
||||
class YeMSTG extends unit.Unit:
|
||||
static var json_conv: = JSON.new()
|
||||
var online_timeout: float = 5000 ## Должен быть равен наибольшему времени дотоверности из всех кластеров
|
||||
var info: = Dictionary() ## Доклад о состоянии
|
||||
var cmd: = Dictionary() ## Команда
|
||||
var cnt: int = 0 ## Счётчик отправленных пакетов
|
||||
|
||||
func _init(unit_name) -> void:
|
||||
super._init(unit_name)
|
||||
cmd_state = CmdState.DONE
|
||||
|
||||
func parse(data: PackedByteArray, now_tick: int):
|
||||
self.rx_tick = now_tick
|
||||
if not online:
|
||||
online = true
|
||||
emit_signal('line_changed', self)
|
||||
var utf8_data: = data.get_string_from_utf8()
|
||||
if Error.OK == json_conv.parse(utf8_data):
|
||||
info.merge(json_conv.get_data(), true)
|
||||
emit_signal('data_received', info)
|
||||
else:
|
||||
var msg: = json_conv.get_error_message()
|
||||
emit_signal('parse_error', self, msg)
|
||||
|
||||
func process(now_tick: int):
|
||||
if online and ((now_tick - rx_tick) > online_timeout):
|
||||
online = false
|
||||
emit_signal('line_changed', self)
|
||||
var rc = Error.ERR_BUSY
|
||||
if cmd_state == CmdState.SEND:
|
||||
tx_data = JSON.stringify(cmd).to_utf8_buffer()
|
||||
tx_len = tx_data.size()
|
||||
cmd_state = CmdState.DONE
|
||||
rc = Error.OK
|
||||
return rc
|
||||
1
scripts/yemstg.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bst5wk3otwwai
|
||||
60
table/header-image.tscn
Normal file
@@ -0,0 +1,60 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://cymcld4mjmlhj"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://c73tjrn8gr00o" path="res://data/Передатчик.png" id="1_nbmfn"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_63652"]
|
||||
script/source = "extends GridContainer
|
||||
|
||||
@export var text: String:
|
||||
set(val):
|
||||
text = val
|
||||
if is_inside_tree():
|
||||
$label.text = val
|
||||
get:
|
||||
return text
|
||||
|
||||
|
||||
@export_file var image_file: String:
|
||||
set(val):
|
||||
image_file = val
|
||||
if is_inside_tree():
|
||||
$image.texture = load(val)
|
||||
get:
|
||||
return image_file
|
||||
|
||||
|
||||
func _enter_tree() -> void:
|
||||
if ResourceLoader.exists(image_file):
|
||||
$image.texture = load(image_file)
|
||||
$label.text = text
|
||||
"
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nbmfn"]
|
||||
bg_color = Color(0.741395, 0.468103, 0.328942, 1)
|
||||
corner_radius_top_left = 4
|
||||
corner_radius_top_right = 4
|
||||
corner_radius_bottom_right = 4
|
||||
corner_radius_bottom_left = 4
|
||||
|
||||
[node name="header-image" type="GridContainer"]
|
||||
offset_right = 100.0
|
||||
offset_bottom = 19.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
columns = 2
|
||||
script = SubResource("GDScript_63652")
|
||||
|
||||
[node name="image" type="TextureRect" parent="."]
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 3
|
||||
texture = ExtResource("1_nbmfn")
|
||||
expand_mode = 3
|
||||
|
||||
[node name="label" type="Label" parent="."]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_nbmfn")
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
@@ -1,24 +0,0 @@
|
||||
extends Label
|
||||
|
||||
static var styles: = [null, null]
|
||||
static var init_done: = false
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
if init_done:
|
||||
init_done = true
|
||||
var style_light: = get_theme_stylebox('normal')
|
||||
style_light.bg_color = Color.GRAY
|
||||
styles[1] = style_light
|
||||
var style_dark: = style_light.duplicate(true)
|
||||
style_dark.bg_color = Color(0.12, 0.12, 0.12)
|
||||
styles[0] = style_dark
|
||||
ProjectSettings.connect('settings_changed', apply_colors)
|
||||
apply_colors()
|
||||
|
||||
|
||||
func apply_colors():
|
||||
if ProjectSettings.get_setting('application/config/%s' % 'Цвет темы программы', false):
|
||||
add_theme_stylebox_override('normal', styles[1])
|
||||
else:
|
||||
add_theme_stylebox_override('normal', styles[0])
|
||||
@@ -1 +0,0 @@
|
||||
uid://bjw0gwcqxx30d
|
||||
@@ -1,7 +1,5 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://dwphmxstaxn4v"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bjw0gwcqxx30d" path="res://table/lable.gd" id="1_xk0u2"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yign5"]
|
||||
bg_color = Color(0.117647, 0.117647, 0.117647, 0.85098)
|
||||
border_width_bottom = 2
|
||||
@@ -11,9 +9,29 @@ corner_radius_top_right = 3
|
||||
corner_radius_bottom_right = 3
|
||||
corner_radius_bottom_left = 5
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_dhnrx"]
|
||||
script/source = "extends Label
|
||||
|
||||
static var styles: = [null, null]
|
||||
static var init_done: = false
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
if init_done:
|
||||
init_done = true
|
||||
var style_light: = get_theme_stylebox('normal')
|
||||
style_light.bg_color = Color.GRAY
|
||||
styles[1] = style_light
|
||||
var style_dark: = style_light.duplicate(true)
|
||||
style_dark.bg_color = Color(0.12, 0.12, 0.12)
|
||||
styles[0] = style_dark
|
||||
"
|
||||
|
||||
[node name="Lable" type="Label"]
|
||||
offset_right = 104.0
|
||||
offset_bottom = 27.0
|
||||
theme_override_colors/font_color = Color(1, 0.596078, 0.4, 1)
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_yign5")
|
||||
script = ExtResource("1_xk0u2")
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
script = SubResource("GDScript_dhnrx")
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
extends LineEdit
|
||||
|
||||
|
||||
static var styles: = [null, null]
|
||||
static var init_done: = false
|
||||
|
||||
func _init() -> void:
|
||||
if not init_done:
|
||||
init_done = true
|
||||
var style_light: = get_theme_stylebox('read_only')
|
||||
style_light.bg_color = Color.GRAY
|
||||
styles[1] = style_light
|
||||
var style_dark: = style_light.duplicate(true)
|
||||
style_dark.bg_color = Color(0.12, 0.12, 0.12)
|
||||
styles[0] = style_dark
|
||||
ProjectSettings.connect('settings_changed', apply_colors)
|
||||
apply_colors()
|
||||
|
||||
|
||||
func apply_colors():
|
||||
if ProjectSettings.get_setting('application/config/%s' % 'Цвет темы программы', false):
|
||||
add_theme_color_override('font_color_readonly', Color.BLACK)
|
||||
add_theme_color_override('font_color_placeholder', Color(0, 0, 0, 0.5))
|
||||
add_theme_stylebox_override('read_only', styles[1])
|
||||
else:
|
||||
add_theme_color_override('font_color_readonly', Color('#D8731A')) # тёмно-оранжевый
|
||||
add_theme_color_override('font_color_placeholder', Color(1, 1, 1, 0.5))
|
||||
add_theme_stylebox_override('read_only', styles[0])
|
||||
@@ -1 +0,0 @@
|
||||
uid://c71233c2tqc2u
|
||||
@@ -1,6 +1,34 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://c1i4rwaajq7d5"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://c71233c2tqc2u" path="res://table/node.gd" id="1_oh3pj"]
|
||||
[sub_resource type="GDScript" id="GDScript_eegm3"]
|
||||
script/source = "extends LineEdit
|
||||
|
||||
static var styles: = [null, null]
|
||||
static var init_done: = false
|
||||
|
||||
func _init() -> void:
|
||||
if not init_done:
|
||||
init_done = true
|
||||
var style_light: = get_theme_stylebox('read_only')
|
||||
style_light.bg_color = Color.GRAY
|
||||
styles[1] = style_light
|
||||
var style_dark: = style_light.duplicate(true)
|
||||
style_dark.bg_color = Color(0.12, 0.12, 0.12)
|
||||
styles[0] = style_dark
|
||||
ProjectSettings.connect('settings_changed', apply_colors)
|
||||
apply_colors()
|
||||
|
||||
|
||||
func apply_colors():
|
||||
if ProjectSettings.get_setting('application/config/%s' % 'Цвет темы программы', false):
|
||||
add_theme_color_override('font_color_readonly', Color.BLACK)
|
||||
add_theme_color_override('font_color_placeholder', Color(0, 0, 0, 0.5))
|
||||
add_theme_stylebox_override('read_only', styles[1])
|
||||
else:
|
||||
add_theme_color_override('font_color_readonly', Color('#D8731A')) # тёмно-оранжевый
|
||||
add_theme_color_override('font_color_placeholder', Color(1, 1, 1, 0.5))
|
||||
add_theme_stylebox_override('read_only', styles[0])
|
||||
"
|
||||
|
||||
[node name="Label" type="LineEdit"]
|
||||
offset_right = 121.0
|
||||
@@ -10,4 +38,4 @@ editable = false
|
||||
context_menu_enabled = false
|
||||
caret_blink = true
|
||||
caret_blink_interval = 0.1
|
||||
script = ExtResource("1_oh3pj")
|
||||
script = SubResource("GDScript_eegm3")
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
extends LineEdit
|
||||
|
||||
static var styles: = [null, null]
|
||||
static var init_done: = false
|
||||
|
||||
var checkbutton_material: Material
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
if not init_done:
|
||||
init_done = true
|
||||
var style_light: = get_theme_stylebox('read_only')
|
||||
style_light.bg_color = Color.GRAY
|
||||
styles[1] = style_light
|
||||
var style_dark: = style_light.duplicate(true)
|
||||
style_dark.bg_color = Color(0.12, 0.12, 0.12)
|
||||
styles[0] = style_dark
|
||||
ProjectSettings.connect('settings_changed', on_setting_changed)
|
||||
call_deferred('on_setting_changed')
|
||||
|
||||
|
||||
func on_setting_changed():
|
||||
checkbutton_material = $CheckButton.material
|
||||
apply_colors()
|
||||
|
||||
|
||||
func apply_colors():
|
||||
if ProjectSettings.get_setting('application/config/%s' % 'Цвет темы программы', false):
|
||||
add_theme_stylebox_override('read_only', styles[1])
|
||||
$CheckButton.material = null
|
||||
else:
|
||||
add_theme_stylebox_override('read_only', styles[0])
|
||||
$CheckButton.material = checkbutton_material
|
||||
@@ -1 +0,0 @@
|
||||
uid://btvrqnnjjum20
|
||||
@@ -1,10 +1,45 @@
|
||||
[gd_scene load_steps=8 format=3 uid="uid://dgidt8lifm7xe"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://btvrqnnjjum20" path="res://table/set-toggle.gd" id="1_kvru5"]
|
||||
[ext_resource type="Shader" uid="uid://bw5mmbgeycwua" path="res://shaders/color-invers.gdshader" id="2_wrw87"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_f4oye"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_kvru5"]
|
||||
script/source = "extends LineEdit
|
||||
|
||||
static var styles: = [null, null]
|
||||
static var init_done: = false
|
||||
|
||||
var checkbutton_material: Material
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
if not init_done:
|
||||
init_done = true
|
||||
var style_light: = get_theme_stylebox('read_only')
|
||||
style_light.bg_color = Color.GRAY
|
||||
styles[1] = style_light
|
||||
var style_dark: = style_light.duplicate(true)
|
||||
style_dark.bg_color = Color(0.12, 0.12, 0.12)
|
||||
styles[0] = style_dark
|
||||
ProjectSettings.connect('settings_changed', on_setting_changed)
|
||||
call_deferred('on_setting_changed')
|
||||
|
||||
|
||||
func on_setting_changed():
|
||||
checkbutton_material = $CheckButton.material
|
||||
apply_colors()
|
||||
|
||||
|
||||
func apply_colors():
|
||||
if ProjectSettings.get_setting('application/config/%s' % 'Цвет темы программы', false):
|
||||
add_theme_stylebox_override('read_only', styles[1])
|
||||
$CheckButton.material = null
|
||||
else:
|
||||
add_theme_stylebox_override('read_only', styles[0])
|
||||
$CheckButton.material = checkbutton_material
|
||||
"
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_wrw87"]
|
||||
shader = ExtResource("2_wrw87")
|
||||
|
||||
@@ -20,7 +55,7 @@ offset_right = 85.0
|
||||
offset_bottom = 27.0
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_f4oye")
|
||||
editable = false
|
||||
script = ExtResource("1_kvru5")
|
||||
script = SubResource("GDScript_kvru5")
|
||||
|
||||
[node name="CheckButton" type="CheckButton" parent="."]
|
||||
material = SubResource("ShaderMaterial_wrw87")
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
extends LineEdit
|
||||
|
||||
static var styles: = [null, null]
|
||||
static var init_done: = false
|
||||
|
||||
var checkbutton_material: Material
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
ProjectSettings.connect('settings_changed', on_setting_changed)
|
||||
if not init_done:
|
||||
init_done = true
|
||||
var style_light: = get_theme_stylebox('read_only')
|
||||
style_light.bg_color = Color.GRAY
|
||||
styles[1] = style_light
|
||||
var style_dark: = style_light.duplicate(true)
|
||||
style_dark.bg_color = Color(0.12, 0.12, 0.12)
|
||||
styles[0] = style_dark
|
||||
|
||||
|
||||
func on_setting_changed():
|
||||
checkbutton_material = $CheckButton.material
|
||||
apply_colors()
|
||||
|
||||
|
||||
func apply_colors():
|
||||
var is_light: bool = ProjectSettings.get_setting('application/config/%s' % 'Цвет темы программы', false)
|
||||
if is_light:
|
||||
add_theme_stylebox_override('read_only', styles[1])
|
||||
$CheckButton.material = null
|
||||
else:
|
||||
add_theme_stylebox_override('read_only', styles[0])
|
||||
$CheckButton.material = checkbutton_material
|
||||
@@ -1 +0,0 @@
|
||||
uid://bh7mb1aeu1uk6
|
||||
@@ -1,10 +1,51 @@
|
||||
[gd_scene load_steps=6 format=3 uid="uid://5rw652cmnybi"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bh7mb1aeu1uk6" path="res://table/settings-toggle.gd" id="1_8lkgc"]
|
||||
[ext_resource type="Shader" uid="uid://bw5mmbgeycwua" path="res://shaders/color-invers.gdshader" id="1_anyuq"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_il5wc"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_vuu0m"]
|
||||
script/source = "extends LineEdit
|
||||
|
||||
static var styles = [[null, null], [null, null]]
|
||||
static var init_done: = false
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
if not init_done:
|
||||
init_done = true
|
||||
var style_0_light = get_theme_stylebox('normal')
|
||||
var style_1_light = get_theme_stylebox('read_only')
|
||||
|
||||
style_0_light.bg_color = Color(0.12, 0.12, 0.12)
|
||||
style_1_light.bg_color = Color(0.12, 0.12, 0.12)
|
||||
styles[1][0] = style_0_light
|
||||
styles[1][1] = style_1_light
|
||||
|
||||
var style_0_dark = style_0_light.duplicate(true)
|
||||
var style_1_dark = style_1_light.duplicate(true)
|
||||
|
||||
style_0_light.bg_color = Color.GRAY
|
||||
style_1_light.bg_color = Color.GRAY
|
||||
styles[0][0] = style_0_dark
|
||||
styles[0][1] = style_1_dark
|
||||
ProjectSettings.connect('settings_changed', apply_colors)
|
||||
apply_colors()
|
||||
|
||||
|
||||
func apply_colors():
|
||||
if ProjectSettings.get_setting('application/config/%s' % 'Цвет темы программы', false):
|
||||
add_theme_color_override('font_color', Color.BLACK)
|
||||
add_theme_color_override('font_uneditable_color', Color.BLACK)
|
||||
add_theme_stylebox_override('normal', styles[1][0])
|
||||
add_theme_stylebox_override('read_only', styles[1][1])
|
||||
else:
|
||||
add_theme_color_override('font_color', Color(1.0, 0.596, 0.4))
|
||||
add_theme_color_override('font_uneditable_color', Color(1.0, 0.596, 0.4))
|
||||
add_theme_stylebox_override('normal', styles[0][0])
|
||||
add_theme_stylebox_override('read_only', styles[0][1])
|
||||
"
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_8lkgc"]
|
||||
shader = ExtResource("1_anyuq")
|
||||
|
||||
@@ -22,7 +63,7 @@ shortcut_keys_enabled = false
|
||||
middle_mouse_paste_enabled = false
|
||||
selecting_enabled = false
|
||||
deselect_on_focus_loss_enabled = false
|
||||
script = ExtResource("1_8lkgc")
|
||||
script = SubResource("GDScript_vuu0m")
|
||||
|
||||
[node name="CheckButton" type="CheckButton" parent="."]
|
||||
material = SubResource("ShaderMaterial_8lkgc")
|
||||
|
||||
@@ -55,22 +55,39 @@ func defaultselector_color_proc(_i_row: int): return selector_color
|
||||
|
||||
func _assert(val: bool, msg: String = '<не указано>'):
|
||||
if val: return
|
||||
push_error('ошибка: %s\n' % msg)
|
||||
push_error('%s\n' % msg)
|
||||
get_tree().quit(1)
|
||||
|
||||
|
||||
func set_columns_min_size_auto(cc: int):
|
||||
if cc <= 0: return
|
||||
var sizes: = Array()
|
||||
sizes.resize(cc)
|
||||
sizes.fill(size.x / cc)
|
||||
set_columns_min_size(sizes)
|
||||
|
||||
|
||||
## Закрепляет заголовок таблицы.[br]
|
||||
## [param scrl] - Прокрутка родитель таблицы.[br]
|
||||
## [param prnt] - Родитель прокрутки.[br]
|
||||
func pin_header(scrl: ScrollContainer, prnt: Control):
|
||||
scrl.remove_child(header)
|
||||
prnt.add_child(header)
|
||||
var v_separation = get_theme_constant('v_separation')
|
||||
var v_separation: = get_theme_constant('v_separation')
|
||||
header.position = scrl.position - Vector2(0, header.size.y + v_separation)
|
||||
scroll = scrl
|
||||
scroll_adj = scrl.position
|
||||
|
||||
|
||||
## Закрепляет заголовок таблицы.[br]
|
||||
## GridView должен лежать на Scrol. Scrol должен иметь родителя
|
||||
func pin_header2():
|
||||
var scrl = get_parent()
|
||||
var prnt = scrl.get_parent()
|
||||
pin_header(scrl, prnt)
|
||||
header.size.x = scrl.size.x
|
||||
|
||||
|
||||
## Перемещает указатель на одну строку вверх
|
||||
func selector_up():
|
||||
var i_rows: = []
|
||||
@@ -189,6 +206,17 @@ func set_node_property(i_col: int, i_row: int, pname: String, val) -> void:
|
||||
node.set(pname, val)
|
||||
|
||||
|
||||
## Устанавливает свойство ячейки заголовка[br]
|
||||
## [param i_col] - Индекс колонки.[br]
|
||||
## [param pname] - Имя свойства.[br]
|
||||
## [param val] - Значение свойства.[br]
|
||||
## [i]Свойство[/i] [param pname] [i]ячейки должно существовать.[/i]
|
||||
func set_header_property(i_col: int, pname: String, val) -> void:
|
||||
var key: = get_node_key(HEAD_KEY_FORMAT, i_col, 0)
|
||||
var node = nodes[key]
|
||||
node.set(pname, val)
|
||||
|
||||
|
||||
## Возвращает значение поля ячейки.[br]
|
||||
## [param pname] - Имя поля.[br]
|
||||
## [param i_col] - Индекс колонки.[br]
|
||||
@@ -232,6 +260,13 @@ func set_columns_min_size(sizes: Array) -> void:
|
||||
set_nodes_min_size(0, sizes, HEAD_KEY_FORMAT)
|
||||
|
||||
|
||||
func set_headers_min_size(sizes: Array) -> void:
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(HEAD_KEY_FORMAT, i_col, 0)
|
||||
var node = nodes[key]
|
||||
node.custom_minimum_size.x = sizes[i_col]
|
||||
node.set_deferred('size.x', sizes[i_col])
|
||||
|
||||
##
|
||||
func set_columns_aligment(alignments: Array) -> void:
|
||||
var rows_count: = get_rows_count()
|
||||
@@ -414,6 +449,7 @@ func _on_focus_entered(node):
|
||||
|
||||
##
|
||||
func set_header(header_types: Array):
|
||||
_assert(header_types.size() > 0, 'количество колонок в заголовке: %d' % [header_types.size()])
|
||||
_assert(header_types.size() < MAX_INDEX, 'количество колонок в заголовке: %d больше допустимого: %d' % [header_types.size(), MAX_INDEX + 1])
|
||||
if columns == 1:
|
||||
set_columns(header_types.size())
|
||||
@@ -573,6 +609,31 @@ func set_nodes_min_size(i_row: int, sizes: Array, key_format: String = NODE_KEY_
|
||||
node.set_deferred('size.x', sizes[i_col])
|
||||
|
||||
|
||||
## [param hight] - Высота ряда.
|
||||
func set_rows_min_hight(hight: int) -> void:
|
||||
var rows_count = get_rows_count()
|
||||
for i_row in rows_count:
|
||||
set_row_min_hight(i_row, hight)
|
||||
|
||||
|
||||
## [param i_row] - Индекс ряда.
|
||||
## [param hight] - Высота ряда.
|
||||
func set_row_min_hight(i_row: int, hight: int) -> void:
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
var node = nodes[key]
|
||||
node.custom_minimum_size.y = hight
|
||||
node.set_deferred('size.y', hight)
|
||||
|
||||
|
||||
func set_header_min_hight(hight: int):
|
||||
for i_col in columns:
|
||||
var key: = get_node_key(HEAD_KEY_FORMAT, i_col, 0)
|
||||
var node = nodes[key]
|
||||
node.custom_minimum_size.y = hight
|
||||
node.set_deferred('size.y', hight)
|
||||
|
||||
|
||||
## [param i_col] - Индекс колонки.[br][param i_row] - Индекс ряда.
|
||||
func set_node_text(i_col: int, i_row: int, val: String) -> void:
|
||||
var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row)
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
extends LineEdit
|
||||
|
||||
static var styles = [[null, null], [null, null]]
|
||||
static var init_done: = false
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
if not init_done:
|
||||
init_done = true
|
||||
var style_0_light = get_theme_stylebox('normal')
|
||||
var style_1_light = get_theme_stylebox('read_only')
|
||||
|
||||
style_0_light.bg_color = Color(0.12, 0.12, 0.12)
|
||||
style_1_light.bg_color = Color(0.12, 0.12, 0.12)
|
||||
styles[1][0] = style_0_light
|
||||
styles[1][1] = style_1_light
|
||||
|
||||
var style_0_dark = style_0_light.duplicate(true)
|
||||
var style_1_dark = style_1_light.duplicate(true)
|
||||
|
||||
style_0_light.bg_color = Color.GRAY
|
||||
style_1_light.bg_color = Color.GRAY
|
||||
styles[0][0] = style_0_dark
|
||||
styles[0][1] = style_1_dark
|
||||
ProjectSettings.connect('settings_changed', apply_colors)
|
||||
apply_colors()
|
||||
|
||||
|
||||
func apply_colors():
|
||||
if ProjectSettings.get_setting('application/config/%s' % 'Цвет темы программы', false):
|
||||
add_theme_color_override('font_color', Color.BLACK)
|
||||
add_theme_color_override('font_uneditable_color', Color.BLACK)
|
||||
add_theme_stylebox_override('normal', styles[1][0])
|
||||
add_theme_stylebox_override('read_only', styles[1][1])
|
||||
else:
|
||||
add_theme_color_override('font_color', Color(1.0, 0.596, 0.4))
|
||||
add_theme_color_override('font_uneditable_color', Color(1.0, 0.596, 0.4))
|
||||
add_theme_stylebox_override('normal', styles[0][0])
|
||||
add_theme_stylebox_override('read_only', styles[0][1])
|
||||
@@ -1 +0,0 @@
|
||||
uid://dqexdg24cp6rq
|
||||
@@ -1,9 +1,49 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://dspa16ufrpanp"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dqexdg24cp6rq" path="res://table/ячейка-2.gd" id="1_0fmuf"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_mla3y"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_kmv1d"]
|
||||
script/source = "extends LineEdit
|
||||
|
||||
static var styles = [[null, null], [null, null]]
|
||||
static var init_done: = false
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
if not init_done:
|
||||
init_done = true
|
||||
var style_0_light = get_theme_stylebox('normal')
|
||||
var style_1_light = get_theme_stylebox('read_only')
|
||||
|
||||
style_0_light.bg_color = Color(0.12, 0.12, 0.12)
|
||||
style_1_light.bg_color = Color(0.12, 0.12, 0.12)
|
||||
styles[1][0] = style_0_light
|
||||
styles[1][1] = style_1_light
|
||||
|
||||
var style_0_dark = style_0_light.duplicate(true)
|
||||
var style_1_dark = style_1_light.duplicate(true)
|
||||
|
||||
style_0_light.bg_color = Color.GRAY
|
||||
style_1_light.bg_color = Color.GRAY
|
||||
styles[0][0] = style_0_dark
|
||||
styles[0][1] = style_1_dark
|
||||
ProjectSettings.connect('settings_changed', apply_colors)
|
||||
apply_colors()
|
||||
|
||||
|
||||
func apply_colors():
|
||||
if ProjectSettings.get_setting('application/config/%s' % 'Цвет темы программы', false):
|
||||
add_theme_color_override('font_color', Color.BLACK)
|
||||
add_theme_color_override('font_uneditable_color', Color.BLACK)
|
||||
add_theme_stylebox_override('normal', styles[1][0])
|
||||
add_theme_stylebox_override('read_only', styles[1][1])
|
||||
else:
|
||||
add_theme_color_override('font_color', Color(1.0, 0.596, 0.4))
|
||||
add_theme_color_override('font_uneditable_color', Color(1.0, 0.596, 0.4))
|
||||
add_theme_stylebox_override('normal', styles[0][0])
|
||||
add_theme_stylebox_override('read_only', styles[0][1])
|
||||
"
|
||||
|
||||
[node name="LineEdit" type="LineEdit"]
|
||||
offset_right = 58.0
|
||||
offset_bottom = 33.0
|
||||
@@ -18,4 +58,4 @@ selecting_enabled = false
|
||||
deselect_on_focus_loss_enabled = false
|
||||
caret_blink = true
|
||||
caret_blink_interval = 0.1
|
||||
script = ExtResource("1_0fmuf")
|
||||
script = SubResource("GDScript_kmv1d")
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
extends ColorPickerButton
|
||||
|
||||
static var styles = [null, null]
|
||||
static var init_done: = false
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
if not init_done:
|
||||
init_done = true
|
||||
var style_light: = get_theme_stylebox('normal')
|
||||
style_light.bg_color = Color.GRAY
|
||||
styles[1] = style_light
|
||||
var style_dark: = style_light.duplicate(true)
|
||||
style_dark.bg_color = Color(0.12, 0.12, 0.12)
|
||||
styles[0] = style_dark
|
||||
ProjectSettings.connect('settings_changed', apply_colors)
|
||||
apply_colors()
|
||||
|
||||
|
||||
func apply_colors():
|
||||
if ProjectSettings.get_setting('application/config/%s' % 'Цвет темы программы', false):
|
||||
add_theme_stylebox_override('normal', styles[1])
|
||||
else:
|
||||
add_theme_stylebox_override('normal', styles[0])
|
||||
@@ -1 +0,0 @@
|
||||
uid://b36c83manfems
|
||||
@@ -1,9 +1,11 @@
|
||||
[gd_scene load_steps=3 format=3 uid="uid://cug5xjbfdm7x7"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://b36c83manfems" path="res://table/ячейка-цвет.gd" id="1_ce8lu"]
|
||||
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ce8lu"]
|
||||
|
||||
[sub_resource type="GDScript" id="GDScript_dds53"]
|
||||
script/source = "extends ColorPickerButton
|
||||
"
|
||||
|
||||
[node name="ячейка-цвет" type="ColorPickerButton"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
@@ -11,4 +13,4 @@ anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
theme_override_styles/focus = SubResource("StyleBoxEmpty_ce8lu")
|
||||
script = ExtResource("1_ce8lu")
|
||||
script = SubResource("GDScript_dds53")
|
||||
|
||||