| 386 | } |
| 387 | |
| 388 | bool Cc4Block::ConvertValueRangeToText(double channel_value, |
| 389 | std::string& eng_value) const { |
| 390 | if (ref_list_.empty()) { |
| 391 | return false; |
| 392 | } |
| 393 | |
| 394 | // First iterate to find the ref |
| 395 | size_t ref_index = ref_list_.size() - 1; // Default CC/TX |
| 396 | for (uint16_t n = 0; n < nof_values_; ++n) { |
| 397 | const uint16_t key_min_index = n * 2; |
| 398 | const uint16_t key_max_index = key_min_index + 1; |
| 399 | if (key_max_index >= value_list_.size()) { |
| 400 | break; |
| 401 | } |
| 402 | const auto key_min = Parameter(key_min_index); |
| 403 | const auto key_max = Parameter(key_max_index); |
| 404 | if (IsChannelInteger() && channel_value >= key_min && |
| 405 | channel_value <= key_max) { |
| 406 | ref_index = n; |
| 407 | break; |
| 408 | } |
| 409 | |
| 410 | if (IsChannelFloat() && channel_value >= key_min && |
| 411 | channel_value < key_max) { |
| 412 | ref_index = n; |
| 413 | break; |
| 414 | } |
| 415 | } |
| 416 | if (ref_index >= ref_list_.size()) { |
| 417 | return false; |
| 418 | } |
| 419 | const auto& block = ref_list_[ref_index]; |
| 420 | if (!block) { |
| 421 | eng_value.clear(); |
| 422 | eng_value.shrink_to_fit(); |
| 423 | } else if (block->BlockType() == "TX") { |
| 424 | const auto* tx = dynamic_cast<const Tx4Block*>(block.get()); |
| 425 | if (tx == nullptr) { |
| 426 | return false; |
| 427 | } |
| 428 | eng_value = tx->Text(); |
| 429 | } else if (block->BlockType() == "CC") { |
| 430 | const auto* cc = dynamic_cast<const IChannelConversion*>(block.get()); |
| 431 | if (cc == nullptr) { |
| 432 | return false; |
| 433 | } |
| 434 | return cc->Convert(channel_value, eng_value); |
| 435 | } else { |
| 436 | return false; |
| 437 | } |
| 438 | return true; |
| 439 | } |
| 440 | |
| 441 | bool Cc4Block::ConvertTextToValue(const std::string& channel_value, |
| 442 | double& eng_value) const { |