asterix-parser 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/build/src/main/app.js +10 -0
- package/build/src/main/data/uap/cat062.d.ts +6 -0
- package/build/src/main/data/uap/cat062.js +156 -0
- package/build/src/main/util/preprocess.js +16 -4
- package/build/src/main/util/process/cat021.js +16 -16
- package/build/src/main/util/process/cat062.d.ts +13 -0
- package/build/src/main/util/process/cat062.js +2734 -0
- package/build/src/main/util/varlen/cat062.d.ts +9 -0
- package/build/src/main/util/varlen/cat062.js +679 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
- 모듈로 확인할 수 있는 내용
|
|
6
6
|
- 배열 내의 객체 형태로 Asterix 데이터 파싱 결과.
|
|
7
7
|
- 현재 구현된 내용: Category 021 (Edition Number: 2.5)
|
|
8
|
+
- 현재 구현된 내용: Category 062 (Edition Number: 1.18)
|
|
8
9
|
|
|
9
10
|
**기술 스택**
|
|
10
11
|
|
|
@@ -40,3 +41,4 @@ console.log(parse("3E0006800102"));
|
|
|
40
41
|
---
|
|
41
42
|
### 참고 링크
|
|
42
43
|
[Asterix CAT021](https://www.eurocontrol.int/publication/cat021-eurocontrol-specification-surveillance-data-exchange-asterix-part-12-category-21)
|
|
44
|
+
[Asterix CAT062](https://www.eurocontrol.int/publication/cat062-eurocontrol-specification-surveillance-data-exchange-asterix-part-9-category-062)
|
package/build/src/main/app.js
CHANGED
|
@@ -4,7 +4,9 @@ exports.parse = void 0;
|
|
|
4
4
|
const asterix_validator_1 = require("asterix-validator");
|
|
5
5
|
const preprocess_1 = require("./util/preprocess");
|
|
6
6
|
const cat021_1 = require("./util/varlen/cat021");
|
|
7
|
+
const cat062_1 = require("./util/varlen/cat062");
|
|
7
8
|
const cat021_2 = require("./util/process/cat021");
|
|
9
|
+
const cat062_2 = require("./util/process/cat062");
|
|
8
10
|
/**
|
|
9
11
|
* Asterix 데이터 파싱
|
|
10
12
|
* @param input 16진수 문자열 데이터
|
|
@@ -39,6 +41,10 @@ const parse = (input) => {
|
|
|
39
41
|
diLength = (0, cat021_1.cat021VarLen)(bitArr, currentPos, dataItem);
|
|
40
42
|
break;
|
|
41
43
|
}
|
|
44
|
+
case 62: {
|
|
45
|
+
diLength = (0, cat062_1.cat062VarLen)(bitArr, currentPos, dataItem);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
42
48
|
default:
|
|
43
49
|
diLength = 0;
|
|
44
50
|
break;
|
|
@@ -50,6 +56,10 @@ const parse = (input) => {
|
|
|
50
56
|
(0, cat021_2.cat021Process)(record, bitArr, currentPos, dataItem, diLength);
|
|
51
57
|
break;
|
|
52
58
|
}
|
|
59
|
+
case 62: {
|
|
60
|
+
(0, cat062_2.cat062Process)(record, bitArr, currentPos, dataItem, diLength);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
53
63
|
default:
|
|
54
64
|
break;
|
|
55
65
|
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CAT062_UAP = void 0;
|
|
4
|
+
const CAT062_UAP = {
|
|
5
|
+
1: {
|
|
6
|
+
1: {
|
|
7
|
+
dataItem: "di010",
|
|
8
|
+
length: 2
|
|
9
|
+
},
|
|
10
|
+
2: {
|
|
11
|
+
dataItem: "SPARE",
|
|
12
|
+
length: 0
|
|
13
|
+
},
|
|
14
|
+
3: {
|
|
15
|
+
dataItem: "di015",
|
|
16
|
+
length: 1
|
|
17
|
+
},
|
|
18
|
+
4: {
|
|
19
|
+
dataItem: "di070",
|
|
20
|
+
length: 3
|
|
21
|
+
},
|
|
22
|
+
5: {
|
|
23
|
+
dataItem: "di105",
|
|
24
|
+
length: 8
|
|
25
|
+
},
|
|
26
|
+
6: {
|
|
27
|
+
dataItem: "di100",
|
|
28
|
+
length: 6
|
|
29
|
+
},
|
|
30
|
+
7: {
|
|
31
|
+
dataItem: "di185",
|
|
32
|
+
length: 4
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
2: {
|
|
36
|
+
1: {
|
|
37
|
+
dataItem: "di210",
|
|
38
|
+
length: 2
|
|
39
|
+
},
|
|
40
|
+
2: {
|
|
41
|
+
dataItem: "di060",
|
|
42
|
+
length: 2
|
|
43
|
+
},
|
|
44
|
+
3: {
|
|
45
|
+
dataItem: "di245",
|
|
46
|
+
length: 7
|
|
47
|
+
},
|
|
48
|
+
4: {
|
|
49
|
+
dataItem: "di380",
|
|
50
|
+
length: -1
|
|
51
|
+
},
|
|
52
|
+
5: {
|
|
53
|
+
dataItem: "di040",
|
|
54
|
+
length: 2
|
|
55
|
+
},
|
|
56
|
+
6: {
|
|
57
|
+
dataItem: "di080",
|
|
58
|
+
length: -1
|
|
59
|
+
},
|
|
60
|
+
7: {
|
|
61
|
+
dataItem: "di290",
|
|
62
|
+
length: -1
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
3: {
|
|
66
|
+
1: {
|
|
67
|
+
dataItem: "di200",
|
|
68
|
+
length: 1
|
|
69
|
+
},
|
|
70
|
+
2: {
|
|
71
|
+
dataItem: "di295",
|
|
72
|
+
length: -1
|
|
73
|
+
},
|
|
74
|
+
3: {
|
|
75
|
+
dataItem: "di136",
|
|
76
|
+
length: 2
|
|
77
|
+
},
|
|
78
|
+
4: {
|
|
79
|
+
dataItem: "di130",
|
|
80
|
+
length: 2
|
|
81
|
+
},
|
|
82
|
+
5: {
|
|
83
|
+
dataItem: "di135",
|
|
84
|
+
length: 2
|
|
85
|
+
},
|
|
86
|
+
6: {
|
|
87
|
+
dataItem: "di220",
|
|
88
|
+
length: 2
|
|
89
|
+
},
|
|
90
|
+
7: {
|
|
91
|
+
dataItem: "di390",
|
|
92
|
+
length: -1
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
4: {
|
|
96
|
+
1: {
|
|
97
|
+
dataItem: "di270",
|
|
98
|
+
length: -1
|
|
99
|
+
},
|
|
100
|
+
2: {
|
|
101
|
+
dataItem: "di300",
|
|
102
|
+
length: 1
|
|
103
|
+
},
|
|
104
|
+
3: {
|
|
105
|
+
dataItem: "di110",
|
|
106
|
+
length: -1
|
|
107
|
+
},
|
|
108
|
+
4: {
|
|
109
|
+
dataItem: "di120",
|
|
110
|
+
length: 2
|
|
111
|
+
},
|
|
112
|
+
5: {
|
|
113
|
+
dataItem: "di510",
|
|
114
|
+
length: -1
|
|
115
|
+
},
|
|
116
|
+
6: {
|
|
117
|
+
dataItem: "di500",
|
|
118
|
+
length: -1
|
|
119
|
+
},
|
|
120
|
+
7: {
|
|
121
|
+
dataItem: "di340",
|
|
122
|
+
length: -1
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
5: {
|
|
126
|
+
1: {
|
|
127
|
+
dataItem: "SPARE",
|
|
128
|
+
length: 0
|
|
129
|
+
},
|
|
130
|
+
2: {
|
|
131
|
+
dataItem: "SPARE",
|
|
132
|
+
length: 0
|
|
133
|
+
},
|
|
134
|
+
3: {
|
|
135
|
+
dataItem: "SPARE",
|
|
136
|
+
length: 0
|
|
137
|
+
},
|
|
138
|
+
4: {
|
|
139
|
+
dataItem: "SPARE",
|
|
140
|
+
length: 0
|
|
141
|
+
},
|
|
142
|
+
5: {
|
|
143
|
+
dataItem: "SPARE",
|
|
144
|
+
length: 0
|
|
145
|
+
},
|
|
146
|
+
6: {
|
|
147
|
+
dataItem: "RE",
|
|
148
|
+
length: -1
|
|
149
|
+
},
|
|
150
|
+
7: {
|
|
151
|
+
dataItem: "SP",
|
|
152
|
+
length: -1
|
|
153
|
+
},
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
exports.CAT062_UAP = CAT062_UAP;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getHexString = exports.parseIndicator = exports.getFieldSpec = void 0;
|
|
4
4
|
const cat021_1 = require("../data/uap/cat021");
|
|
5
|
+
const cat062_1 = require("../data/uap/cat062");
|
|
5
6
|
/**
|
|
6
7
|
* UAP 정보를 통해 FieldSpec을 반환하는 함수
|
|
7
8
|
* @param category 카테고리
|
|
@@ -23,10 +24,21 @@ const getFieldSpec = (category, bitArr, pos) => {
|
|
|
23
24
|
}
|
|
24
25
|
// 열 번호
|
|
25
26
|
const frn = 7 - bit + 1;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
let dataItem;
|
|
28
|
+
let length;
|
|
29
|
+
switch (category) {
|
|
30
|
+
case 21:
|
|
31
|
+
dataItem = cat021_1.CAT021_UAP[block][frn].dataItem;
|
|
32
|
+
length = cat021_1.CAT021_UAP[block][frn].length;
|
|
33
|
+
fieldSpec[dataItem] = length;
|
|
34
|
+
break;
|
|
35
|
+
case 62:
|
|
36
|
+
dataItem = cat062_1.CAT062_UAP[block][frn].dataItem;
|
|
37
|
+
length = cat062_1.CAT062_UAP[block][frn].length;
|
|
38
|
+
fieldSpec[dataItem] = length;
|
|
39
|
+
break;
|
|
40
|
+
default:
|
|
41
|
+
break;
|
|
30
42
|
}
|
|
31
43
|
}
|
|
32
44
|
// * 마지막 비트가 0이면 종료
|
|
@@ -580,8 +580,8 @@ const di071 = (record, bitArr, currentPos) => {
|
|
|
580
580
|
const octet1 = bitArr[currentPos++];
|
|
581
581
|
const octet2 = bitArr[currentPos++];
|
|
582
582
|
const octet3 = bitArr[currentPos++];
|
|
583
|
-
const tapOctet = octet1 << (8 * 2) | octet2 << (8) | octet3;
|
|
584
|
-
record["021_071_Time of Applicability of Position"] = tapOctet / 128;
|
|
583
|
+
const tapOctet = (octet1 << (8 * 2)) | (octet2 << (8)) | (octet3);
|
|
584
|
+
record["021_071_Time of Applicability of Position"] = (tapOctet / 128);
|
|
585
585
|
};
|
|
586
586
|
/**
|
|
587
587
|
* Data Item I021/072, Time of Applicability for Velocity
|
|
@@ -596,7 +596,7 @@ const di072 = (record, bitArr, currentPos) => {
|
|
|
596
596
|
const octet1 = bitArr[currentPos++];
|
|
597
597
|
const octet2 = bitArr[currentPos++];
|
|
598
598
|
const octet3 = bitArr[currentPos++];
|
|
599
|
-
const tavOctet = octet1 << (8 * 2) | octet2 << (8) | octet3;
|
|
599
|
+
const tavOctet = (octet1 << (8 * 2)) | (octet2 << (8)) | (octet3);
|
|
600
600
|
record["021_072_Time of Applicability of Velocity"] = tavOctet / 128;
|
|
601
601
|
};
|
|
602
602
|
/**
|
|
@@ -612,7 +612,7 @@ const di073 = (record, bitArr, currentPos) => {
|
|
|
612
612
|
const octet1 = bitArr[currentPos++];
|
|
613
613
|
const octet2 = bitArr[currentPos++];
|
|
614
614
|
const octet3 = bitArr[currentPos++];
|
|
615
|
-
const tmrpOctet = octet1 << (8 * 2) | octet2 << (8) | octet3;
|
|
615
|
+
const tmrpOctet = (octet1 << (8 * 2)) | (octet2 << (8)) | (octet3);
|
|
616
616
|
record["021_073_Time of Message Reception of Position"] = tmrpOctet / 128;
|
|
617
617
|
};
|
|
618
618
|
/**
|
|
@@ -665,7 +665,7 @@ const di075 = (record, bitArr, currentPos) => {
|
|
|
665
665
|
const octet1 = bitArr[currentPos++];
|
|
666
666
|
const octet2 = bitArr[currentPos++];
|
|
667
667
|
const octet3 = bitArr[currentPos++];
|
|
668
|
-
const ttiOctet = octet1 << (8 * 2) | octet2 << (8) | octet3;
|
|
668
|
+
const ttiOctet = (octet1 << (8 * 2)) | (octet2 << (8)) | (octet3);
|
|
669
669
|
record["021_075_Time of Message Reception of Velocity"] = ttiOctet / 128;
|
|
670
670
|
};
|
|
671
671
|
/**
|
|
@@ -733,7 +733,7 @@ const di080 = (record, bitArr, currentPos) => {
|
|
|
733
733
|
const octet1 = bitArr[currentPos++];
|
|
734
734
|
const octet2 = bitArr[currentPos++];
|
|
735
735
|
const octet3 = bitArr[currentPos++];
|
|
736
|
-
const taOctet = octet1 << (8 * 2) | octet2 <<
|
|
736
|
+
const taOctet = (octet1 << (8 * 2)) | (octet2 << 8) | octet3;
|
|
737
737
|
record["021_080_Target Address"] = taOctet.toString(16).toUpperCase().padStart(6, '0');
|
|
738
738
|
};
|
|
739
739
|
/**
|
|
@@ -848,7 +848,7 @@ const di110TID = (record, bitArr, currentPos) => {
|
|
|
848
848
|
record["021_110_TCP number_" + (index + 1)] = (0, common_1.octetOfRange)(octet2, 5, 0, 5);
|
|
849
849
|
const octet3 = bitArr[currentPos++];
|
|
850
850
|
const octet4 = bitArr[currentPos++];
|
|
851
|
-
const altOctet = octet3 << (8) | octet4;
|
|
851
|
+
const altOctet = (octet3 << (8)) | octet4;
|
|
852
852
|
const alt = (0, common_1.twosCompliment)(altOctet, 16) * 10;
|
|
853
853
|
record["021_110_Altitude_" + (index + 1)] = alt;
|
|
854
854
|
const octet5 = bitArr[currentPos++];
|
|
@@ -960,11 +960,11 @@ const di130 = (record, bitArr, currentPos) => {
|
|
|
960
960
|
const octet1 = bitArr[currentPos++];
|
|
961
961
|
const octet2 = bitArr[currentPos++];
|
|
962
962
|
const octet3 = bitArr[currentPos++];
|
|
963
|
-
const latOctet = octet1 << (8 * 2) | octet2 <<
|
|
963
|
+
const latOctet = (octet1 << (8 * 2)) | (octet2 << 8) | octet3;
|
|
964
964
|
const octet4 = bitArr[currentPos++];
|
|
965
965
|
const octet5 = bitArr[currentPos++];
|
|
966
966
|
const octet6 = bitArr[currentPos++];
|
|
967
|
-
const lonOctet = octet4 << (8 * 2) | octet5 <<
|
|
967
|
+
const lonOctet = (octet4 << (8 * 2)) | (octet5 << 8) | octet6;
|
|
968
968
|
const lat = (0, common_1.twosCompliment)(latOctet, 24) * 180.0 / (1 << 23);
|
|
969
969
|
const lon = (0, common_1.twosCompliment)(lonOctet, 24) * 180.0 / (1 << 23);
|
|
970
970
|
record["021_130_Latitude In WGS-84"] = lat;
|
|
@@ -984,12 +984,12 @@ const di131 = (record, bitArr, currentPos) => {
|
|
|
984
984
|
const octet2 = bitArr[currentPos++];
|
|
985
985
|
const octet3 = bitArr[currentPos++];
|
|
986
986
|
const octet4 = bitArr[currentPos++];
|
|
987
|
-
const latOctet = octet1 << (8 * 3) | octet2 << (8 * 2) | octet3 <<
|
|
987
|
+
const latOctet = (octet1 << (8 * 3)) | (octet2 << (8 * 2)) | (octet3 << 8) | octet4;
|
|
988
988
|
const octet5 = bitArr[currentPos++];
|
|
989
989
|
const octet6 = bitArr[currentPos++];
|
|
990
990
|
const octet7 = bitArr[currentPos++];
|
|
991
991
|
const octet8 = bitArr[currentPos++];
|
|
992
|
-
const lonOctet = octet5 << (8 * 3) | octet6 << (8 * 2) | octet7 <<
|
|
992
|
+
const lonOctet = (octet5 << (8 * 3)) | (octet6 << (8 * 2)) | (octet7 << 8) | octet8;
|
|
993
993
|
const lat = (0, common_1.twosCompliment)(latOctet, 32) * 180.0 / (1 << 30);
|
|
994
994
|
const lon = (0, common_1.twosCompliment)(lonOctet, 32) * 180.0 / (1 << 30);
|
|
995
995
|
record["021_131_Latitude In WGS-84"] = lat;
|
|
@@ -1040,7 +1040,7 @@ const di140 = (record, bitArr, currentPos) => {
|
|
|
1040
1040
|
const di145 = (record, bitArr, currentPos) => {
|
|
1041
1041
|
const octet1 = bitArr[currentPos++];
|
|
1042
1042
|
const octet2 = bitArr[currentPos++];
|
|
1043
|
-
const flOctet = octet1 <<
|
|
1043
|
+
const flOctet = (octet1 << 8) | octet2;
|
|
1044
1044
|
const fl = (0, common_1.twosCompliment)(flOctet, 16) * 0.25;
|
|
1045
1045
|
record["021_145_Fligth Level"] = fl;
|
|
1046
1046
|
};
|
|
@@ -1136,7 +1136,7 @@ const di150 = (record, bitArr, currentPos) => {
|
|
|
1136
1136
|
const octet1 = bitArr[currentPos++];
|
|
1137
1137
|
const asFrontOctet = (0, common_1.octetOfRange)(octet1, 6, 0, 6);
|
|
1138
1138
|
const octet2 = bitArr[currentPos++];
|
|
1139
|
-
const asOctet = asFrontOctet <<
|
|
1139
|
+
const asOctet = (asFrontOctet << 8) | octet2;
|
|
1140
1140
|
if ((octet1 & (1 << 7)) === 0) {
|
|
1141
1141
|
record["021_150_IM"] = "Air Speed = IAS (1)";
|
|
1142
1142
|
record["021_150_Air Speed"] = asOctet / (1 << 14);
|
|
@@ -1180,7 +1180,7 @@ const di151 = (record, bitArr, currentPos) => {
|
|
|
1180
1180
|
const di152 = (record, bitArr, currentPos) => {
|
|
1181
1181
|
const octet1 = bitArr[currentPos++];
|
|
1182
1182
|
const octet2 = bitArr[currentPos++];
|
|
1183
|
-
const mhOctet = octet1 <<
|
|
1183
|
+
const mhOctet = (octet1 << 8) | octet2;
|
|
1184
1184
|
const mh = (mhOctet * 360.0) / (1 << 16);
|
|
1185
1185
|
record["021_152_Magnetic Heading"] = mh;
|
|
1186
1186
|
};
|
|
@@ -1254,7 +1254,7 @@ const di160 = (record, bitArr, currentPos) => {
|
|
|
1254
1254
|
record["021_160_Ground Speed"] = gs;
|
|
1255
1255
|
const octet3 = bitArr[currentPos++];
|
|
1256
1256
|
const octet4 = bitArr[currentPos++];
|
|
1257
|
-
const taOctet = octet3 <<
|
|
1257
|
+
const taOctet = (octet3 << 8) | octet4;
|
|
1258
1258
|
const ta = (taOctet * 360) / (1 << 16);
|
|
1259
1259
|
record["021_160_Track Angle"] = ta;
|
|
1260
1260
|
};
|
|
@@ -1270,7 +1270,7 @@ const di161 = (record, bitArr, currentPos) => {
|
|
|
1270
1270
|
const octet1 = bitArr[currentPos++];
|
|
1271
1271
|
const tnFrontOctet = (0, common_1.octetOfRange)(octet1, 3, 0, 3);
|
|
1272
1272
|
const octet2 = bitArr[currentPos++];
|
|
1273
|
-
const tnOctet = tnFrontOctet <<
|
|
1273
|
+
const tnOctet = (tnFrontOctet << 8) | octet2;
|
|
1274
1274
|
record["021_161_TRACK NUMBER"] = tnOctet;
|
|
1275
1275
|
};
|
|
1276
1276
|
/**
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type Record = {
|
|
2
|
+
[dataItem: string]: {};
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* CAT 062 파싱
|
|
6
|
+
* @param record 단일 Record 파싱 결과
|
|
7
|
+
* @param bitArr Asterix 바이트 데이터
|
|
8
|
+
* @param currentPos 데이터 아이템 시작 인덱스
|
|
9
|
+
* @param dataItem 데이터 아이템 이름
|
|
10
|
+
* @param diLength 데이터 아이템 길이
|
|
11
|
+
*/
|
|
12
|
+
declare const cat062Process: (record: Record, bitArr: Uint8Array, currentPos: number, dataItem: string, diLength: number) => void;
|
|
13
|
+
export { cat062Process };
|