Data level threshold for certain 16-level products

This commit is contained in:
Dan Paulat 2022-04-10 09:41:29 -05:00
parent 0511867c6b
commit 2dcd87700c
2 changed files with 42 additions and 57 deletions

View file

@ -40,6 +40,7 @@ public:
uint16_t generation_date_of_product() const; uint16_t generation_date_of_product() const;
uint32_t generation_time_of_product() const; uint32_t generation_time_of_product() const;
uint16_t elevation_number() const; uint16_t elevation_number() const;
uint16_t data_level_threshold(size_t i) const;
uint8_t version() const; uint8_t version() const;
uint8_t spot_blank() const; uint8_t spot_blank() const;
uint32_t offset_to_symbology() const; uint32_t offset_to_symbology() const;

View file

@ -85,21 +85,19 @@ public:
generationDateOfProduct_ {0}, generationDateOfProduct_ {0},
generationTimeOfProduct_ {0}, generationTimeOfProduct_ {0},
elevationNumber_ {0}, elevationNumber_ {0},
halfword31_ {0},
halfword32_ {0},
halfword33_ {0},
halfword34_ {0},
halfword35_ {0},
version_ {0}, version_ {0},
spotBlank_ {0}, spotBlank_ {0},
offsetToSymbology_ {0}, offsetToSymbology_ {0},
offsetToGraphic_ {0}, offsetToGraphic_ {0},
offsetToTabular_ {0}, offsetToTabular_ {0},
parameters_ {0} parameters_ {0},
halfwords_ {0}
{ {
} }
~ProductDescriptionBlockImpl() = default; ~ProductDescriptionBlockImpl() = default;
uint16_t halfword(size_t i);
int16_t blockDivider_; int16_t blockDivider_;
int32_t latitudeOfRadar_; int32_t latitudeOfRadar_;
int32_t longitudeOfRadar_; int32_t longitudeOfRadar_;
@ -117,15 +115,6 @@ public:
uint16_t elevationNumber_; uint16_t elevationNumber_;
// 30: Product dependent parameter 3 (Table V) // 30: Product dependent parameter 3 (Table V)
// 31-46: Product dependent (Note 1) // 31-46: Product dependent (Note 1)
uint16_t halfword31_;
uint16_t halfword32_;
uint16_t halfword33_;
uint16_t halfword34_;
uint16_t halfword35_;
uint16_t halfword36_;
uint16_t halfword37_;
uint16_t halfword38_;
// Halfwords 39-46 are unused
// 47-53: Product dependent parameters 4-10 (Table V, Note 3) // 47-53: Product dependent parameters 4-10 (Table V, Note 3)
uint8_t version_; uint8_t version_;
uint8_t spotBlank_; uint8_t spotBlank_;
@ -134,8 +123,15 @@ public:
uint32_t offsetToTabular_; uint32_t offsetToTabular_;
std::array<uint16_t, 10> parameters_; std::array<uint16_t, 10> parameters_;
std::array<uint16_t, 16> halfwords_;
}; };
uint16_t ProductDescriptionBlockImpl::halfword(size_t i)
{
// Halfwords start at halfword 31
return halfwords_[i - 31];
}
ProductDescriptionBlock::ProductDescriptionBlock() : ProductDescriptionBlock::ProductDescriptionBlock() :
p(std::make_unique<ProductDescriptionBlockImpl>()) p(std::make_unique<ProductDescriptionBlockImpl>())
{ {
@ -217,6 +213,11 @@ uint16_t ProductDescriptionBlock::elevation_number() const
return p->elevationNumber_; return p->elevationNumber_;
} }
uint16_t ProductDescriptionBlock::data_level_threshold(size_t i) const
{
return p->halfwords_[i];
}
uint8_t ProductDescriptionBlock::version() const uint8_t ProductDescriptionBlock::version() const
{ {
return p->version_; return p->version_;
@ -321,7 +322,7 @@ uint16_t ProductDescriptionBlock::threshold() const
break; break;
case 138: case 138:
threshold = p->halfword31_; threshold = p->halfword(31);
break; break;
case 155: case 155:
@ -343,7 +344,7 @@ uint16_t ProductDescriptionBlock::threshold() const
case 174: case 174:
case 175: case 175:
case 176: case 176:
threshold = p->halfword37_; threshold = p->halfword(37);
break; break;
} }
@ -369,15 +370,15 @@ float ProductDescriptionBlock::offset() const
case 186: case 186:
case 193: case 193:
case 195: case 195:
offset = static_cast<int16_t>(p->halfword31_) * 0.1f; offset = static_cast<int16_t>(p->halfword(31)) * 0.1f;
break; break;
case 134: case 134:
offset = util::DecodeFloat16(p->halfword32_); offset = util::DecodeFloat16(p->halfword(32));
break; break;
case 135: case 135:
offset = static_cast<int16_t>(p->halfword33_); offset = static_cast<int16_t>(p->halfword(33));
break; break;
case 159: case 159:
@ -391,7 +392,7 @@ float ProductDescriptionBlock::offset() const
case 174: case 174:
case 175: case 175:
case 176: case 176:
offset = util::DecodeFloat32(p->halfword33_, p->halfword34_); offset = util::DecodeFloat32(p->halfword(33), p->halfword(34));
break; break;
} }
@ -416,23 +417,23 @@ float ProductDescriptionBlock::scale() const
case 186: case 186:
case 193: case 193:
case 195: case 195:
scale = p->halfword32_ * 0.1f; scale = p->halfword(32) * 0.1f;
break; break;
case 81: case 81:
scale = p->halfword32_ * 0.001f; scale = p->halfword(32) * 0.001f;
break; break;
case 134: case 134:
scale = util::DecodeFloat16(p->halfword31_); scale = util::DecodeFloat16(p->halfword(31));
break; break;
case 135: case 135:
scale = p->halfword32_; scale = p->halfword(32);
break; break;
case 138: case 138:
scale = p->halfword32_ * 0.01f; scale = p->halfword(32) * 0.01f;
break; break;
case 159: case 159:
@ -446,7 +447,7 @@ float ProductDescriptionBlock::scale() const
case 174: case 174:
case 175: case 175:
case 176: case 176:
scale = util::DecodeFloat32(p->halfword31_, p->halfword32_); scale = util::DecodeFloat32(p->halfword(31), p->halfword(32));
break; break;
} }
@ -511,7 +512,7 @@ uint16_t ProductDescriptionBlock::number_of_levels() const
case 186: case 186:
case 193: case 193:
case 195: case 195:
numberOfLevels = p->halfword33_; numberOfLevels = p->halfword(33);
break; break;
case 113: case 113:
@ -535,7 +536,7 @@ uint16_t ProductDescriptionBlock::number_of_levels() const
break; break;
case 138: case 138:
numberOfLevels = p->halfword33_; numberOfLevels = p->halfword(33);
break; break;
case 159: case 159:
@ -549,7 +550,7 @@ uint16_t ProductDescriptionBlock::number_of_levels() const
case 174: case 174:
case 175: case 175:
case 176: case 176:
numberOfLevels = p->halfword36_; numberOfLevels = p->halfword(36);
break; break;
case 178: case 178:
@ -568,7 +569,7 @@ float ProductDescriptionBlock::log_offset() const
switch (p->productCode_) switch (p->productCode_)
{ {
case 134: case 134:
logOffset = util ::DecodeFloat16(p->halfword35_); logOffset = util ::DecodeFloat16(p->halfword(35));
break; break;
} }
@ -582,7 +583,7 @@ float ProductDescriptionBlock::log_scale() const
switch (p->productCode_) switch (p->productCode_)
{ {
case 134: case 134:
logScale = util ::DecodeFloat16(p->halfword34_); logScale = util ::DecodeFloat16(p->halfword(34));
break; break;
} }
@ -628,23 +629,13 @@ bool ProductDescriptionBlock::Parse(std::istream& is)
is.read(reinterpret_cast<char*>(&p->parameters_[0]), 2 * 2); // 27-28 is.read(reinterpret_cast<char*>(&p->parameters_[0]), 2 * 2); // 27-28
is.read(reinterpret_cast<char*>(&p->elevationNumber_), 2); // 29 is.read(reinterpret_cast<char*>(&p->elevationNumber_), 2); // 29
is.read(reinterpret_cast<char*>(&p->parameters_[2]), 2); // 30 is.read(reinterpret_cast<char*>(&p->parameters_[2]), 2); // 30
is.read(reinterpret_cast<char*>(&p->halfword31_), 2); // 31 is.read(reinterpret_cast<char*>(&p->halfwords_[0]), 16 * 2); // 31-46
is.read(reinterpret_cast<char*>(&p->halfword32_), 2); // 32 is.read(reinterpret_cast<char*>(&p->parameters_[3]), 7 * 2); // 47-53
is.read(reinterpret_cast<char*>(&p->halfword33_), 2); // 33 is.read(reinterpret_cast<char*>(&p->version_), 1); // 54
is.read(reinterpret_cast<char*>(&p->halfword34_), 2); // 34 is.read(reinterpret_cast<char*>(&p->spotBlank_), 1); // 54
is.read(reinterpret_cast<char*>(&p->halfword35_), 2); // 35 is.read(reinterpret_cast<char*>(&p->offsetToSymbology_), 4); // 55-56
is.read(reinterpret_cast<char*>(&p->halfword36_), 2); // 36 is.read(reinterpret_cast<char*>(&p->offsetToGraphic_), 4); // 57-58
is.read(reinterpret_cast<char*>(&p->halfword37_), 2); // 37 is.read(reinterpret_cast<char*>(&p->offsetToTabular_), 4); // 59-60
is.read(reinterpret_cast<char*>(&p->halfword38_), 2); // 38
is.seekg(8 * 2, std::ios_base::cur); // 39-46
is.read(reinterpret_cast<char*>(&p->parameters_[3]), 7 * 2); // 47-53
is.read(reinterpret_cast<char*>(&p->version_), 1); // 54
is.read(reinterpret_cast<char*>(&p->spotBlank_), 1); // 54
is.read(reinterpret_cast<char*>(&p->offsetToSymbology_), 4); // 55-56
is.read(reinterpret_cast<char*>(&p->offsetToGraphic_), 4); // 57-58
is.read(reinterpret_cast<char*>(&p->offsetToTabular_), 4); // 59-60
p->blockDivider_ = ntohs(p->blockDivider_); p->blockDivider_ = ntohs(p->blockDivider_);
p->latitudeOfRadar_ = ntohl(p->latitudeOfRadar_); p->latitudeOfRadar_ = ntohl(p->latitudeOfRadar_);
@ -660,19 +651,12 @@ bool ProductDescriptionBlock::Parse(std::istream& is)
p->generationDateOfProduct_ = ntohs(p->generationDateOfProduct_); p->generationDateOfProduct_ = ntohs(p->generationDateOfProduct_);
p->generationTimeOfProduct_ = ntohl(p->generationTimeOfProduct_); p->generationTimeOfProduct_ = ntohl(p->generationTimeOfProduct_);
p->elevationNumber_ = ntohs(p->elevationNumber_); p->elevationNumber_ = ntohs(p->elevationNumber_);
p->halfword31_ = ntohs(p->halfword31_);
p->halfword32_ = ntohs(p->halfword32_);
p->halfword33_ = ntohs(p->halfword33_);
p->halfword34_ = ntohs(p->halfword34_);
p->halfword35_ = ntohs(p->halfword35_);
p->halfword36_ = ntohs(p->halfword36_);
p->halfword37_ = ntohs(p->halfword37_);
p->halfword38_ = ntohs(p->halfword38_);
p->offsetToSymbology_ = ntohl(p->offsetToSymbology_); p->offsetToSymbology_ = ntohl(p->offsetToSymbology_);
p->offsetToGraphic_ = ntohl(p->offsetToGraphic_); p->offsetToGraphic_ = ntohl(p->offsetToGraphic_);
p->offsetToTabular_ = ntohl(p->offsetToTabular_); p->offsetToTabular_ = ntohl(p->offsetToTabular_);
SwapArray(p->parameters_); SwapArray(p->parameters_);
SwapArray(p->halfwords_);
if (is.eof()) if (is.eof())
{ {