SatDump 2.0.0-alpha-520736c72
Loading...
Searching...
No Matches
fy4_headers.h
Go to the documentation of this file.
1#pragma once
2
7
8#include "common/utils.h"
9#include <cstdint>
10#include <cstring>
11#include <vector>
12
13namespace satdump
14{
15 namespace xrit
16 {
17 namespace fy4
18 {
19 struct KeyHeader
20 {
21 static constexpr int TYPE = 7;
22
23 uint8_t type;
24 uint16_t record_length;
25 uint32_t key;
26
27 KeyHeader(uint8_t *data)
28 {
29 type = data[0];
30 record_length = data[1] << 8 | data[2];
31 key = data[3] << 24 | data[4] << 16 | data[5] << 8 | data[6];
32 }
33 };
34
35 struct ImageInformationRecord
36 {
37 static constexpr int TYPE = 1;
38
39 uint8_t type;
40 uint16_t record_length;
41
42 std::string satellite_name;
43 std::string instrument_name;
44
45 uint8_t bit_per_pixel;
46 uint16_t columns_count;
47 uint16_t lines_count;
48 uint8_t compression_flag;
49
50 uint8_t channel_number;
51 uint8_t total_segment_count;
52 uint8_t current_segment_number;
53 uint8_t current_segment_pos;
54 uint16_t current_segment_line_pos;
55
56 uint8_t compressed_info_algo;
57 uint8_t compressed_info_lossless;
58 uint8_t compressed_info_level;
59
60 ImageInformationRecord(uint8_t *data)
61 {
62 type = data[0];
63 record_length = data[1] << 8 | data[2];
64 satellite_name = std::string(&data[3], &data[3 + 9]);
65 instrument_name = std::string(&data[12], &data[12 + 7]);
66 bit_per_pixel = data[19];
67 columns_count = data[20] << 8 | data[21];
68 lines_count = data[22] << 8 | data[23];
69 compression_flag = data[24];
70
71 channel_number = data[25];
72 total_segment_count = data[26];
73 current_segment_number = data[27];
74 current_segment_pos = data[28];
75 current_segment_line_pos = data[29] << 8 | data[30];
76
77 compressed_info_algo = data[31] >> 7;
78 compressed_info_lossless = (data[31] >> 6) & 1;
79 compressed_info_level = data[31] & 0b111111;
80 }
81 };
82
83 struct ImageNavigationRecord
84 {
85 static constexpr int TYPE = 2;
86
87 uint8_t type;
88 uint16_t record_length;
89 std::string projection_name;
90 float column_scaling_factor;
91 float line_scaling_factor;
92 float column_offset;
93 float line_offset;
94
95 // double nominal_point_longitude;
96 // double sub_satellite_longitude;
97 // uint8_t projection_type;
98 // std::string epoch_time_mjd;
99 // double semi_major_axis;
100 // double eccentricity;
101 // double inclination;
102 // double ascending_node_longitude;
103 // double perigee_angle1;
104 // double perigee_angle2;
105 // TODOREWORK ALL THE REST
106
107 // Pre-computed projection information
108 double column_scalar;
109 double line_scalar;
110
111 ImageNavigationRecord(uint8_t *data)
112 {
113 type = data[0];
114 record_length = data[1] << 8 | data[2];
115 projection_name = std::string((char *)&data[3], (char *)&data[3 + 32]);
116
117 ((float *)&column_scaling_factor)[3] = data[35];
118 ((float *)&column_scaling_factor)[2] = data[36];
119 ((float *)&column_scaling_factor)[1] = data[37];
120 ((float *)&column_scaling_factor)[0] = data[38];
121
122 ((float *)&line_scaling_factor)[3] = data[39];
123 ((float *)&line_scaling_factor)[2] = data[40];
124 ((float *)&line_scaling_factor)[1] = data[41];
125 ((float *)&line_scaling_factor)[0] = data[42];
126
127 ((float *)&column_offset)[3] = data[43];
128 ((float *)&column_offset)[2] = data[44];
129 ((float *)&column_offset)[1] = data[45];
130 ((float *)&column_offset)[0] = data[46];
131
132 ((float *)&line_offset)[3] = data[47];
133 ((float *)&line_offset)[2] = data[48];
134 ((float *)&line_offset)[1] = data[49];
135 ((float *)&line_offset)[0] = data[50];
136
137 column_scalar = line_scalar = 0.0;
138 }
139 };
140 } // namespace fy4
141 } // namespace xrit
142} // namespace satdump