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 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)
@@ -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,6 @@
1
+ interface UapdataItem {
2
+ dataItem: string;
3
+ length: number;
4
+ }
5
+ declare const CAT062_UAP: Record<number, Record<number, UapdataItem>>;
6
+ export { CAT062_UAP };
@@ -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
- if (category === 21) {
27
- const dataItem = cat021_1.CAT021_UAP[block][frn].dataItem;
28
- const length = cat021_1.CAT021_UAP[block][frn].length;
29
- fieldSpec[dataItem] = length;
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 << (8) | octet3;
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 << (8) | octet3;
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 << (8) | octet6;
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 << (8) | octet4;
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 << (8) | octet8;
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 << (8) | octet2;
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 << (8) | octet2;
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 << (8) | octet2;
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 << (8) | octet4;
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 << (8) | octet2;
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 };