From 24062d0417c82a85783475477cd6b040c9268a8f Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 25 Feb 2024 01:55:54 -0600 Subject: [PATCH] Add VIL-specific data level conversions --- .../wsr88d/rpg/product_description_block.hpp | 5 +-- .../wsr88d/rpg/product_description_block.cpp | 31 +++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp b/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp index c67ccbf2..d7973026 100644 --- a/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp +++ b/wxdata/include/scwx/wsr88d/rpg/product_description_block.hpp @@ -66,8 +66,9 @@ public: std::optional data_level_code(std::uint8_t level) const; std::optional data_value(std::uint8_t level) const; - float log_offset() const; - float log_scale() const; + std::uint16_t log_start() const; + float log_offset() const; + float log_scale() const; units::angle::degrees elevation() const; diff --git a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp index 90385e88..f09a32b4 100644 --- a/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp +++ b/wxdata/source/scwx/wsr88d/rpg/product_description_block.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -591,6 +592,20 @@ uint16_t ProductDescriptionBlock::number_of_levels() const return numberOfLevels; } +std::uint16_t ProductDescriptionBlock::log_start() const +{ + std::uint16_t logStart = std::numeric_limits::max(); + + switch (p->productCode_) + { + case 134: + logStart = p->halfword(33); + break; + } + + return logStart; +} + float ProductDescriptionBlock::log_offset() const { float logOffset = 0.0f; @@ -598,7 +613,7 @@ float ProductDescriptionBlock::log_offset() const switch (p->productCode_) { case 134: - logOffset = util ::DecodeFloat16(p->halfword(35)); + logOffset = util::DecodeFloat16(p->halfword(35)); break; } @@ -612,7 +627,7 @@ float ProductDescriptionBlock::log_scale() const switch (p->productCode_) { case 134: - logScale = util ::DecodeFloat16(p->halfword(34)); + logScale = util::DecodeFloat16(p->halfword(34)); break; } @@ -1007,6 +1022,18 @@ ProductDescriptionBlock::data_value(std::uint8_t level) const f = (level - dataOffset) / dataScale; break; + case 134: + if (level < log_start()) + { + f = (level - dataOffset) / dataScale; + } + else + { + f = static_cast(std::pow( + std::numbers::e, (level - log_offset()) / log_scale())); + } + break; + default: f = level * dataScale + dataOffset; break;