| 344 | } |
| 345 | |
| 346 | bool Cc4Block::ConvertValueToText(double channel_value, |
| 347 | std::string& eng_value) const { |
| 348 | if (ref_list_.empty()) { |
| 349 | return false; |
| 350 | } |
| 351 | // First iterate to find the ref |
| 352 | size_t ref_index = ref_list_.size() - 1; // Default CC/TX |
| 353 | for (uint16_t n = 0; n < nof_values_; ++n) { |
| 354 | if (n >= value_list_.size()) { |
| 355 | break; |
| 356 | } |
| 357 | const auto key = Parameter(n); |
| 358 | if (channel_value == key) { |
| 359 | ref_index = n; |
| 360 | break; |
| 361 | } |
| 362 | } |
| 363 | if (ref_index >= ref_list_.size()) { |
| 364 | return false; |
| 365 | } |
| 366 | const auto& block = ref_list_[ref_index]; |
| 367 | if (!block) { |
| 368 | eng_value.clear(); |
| 369 | eng_value.shrink_to_fit(); |
| 370 | } else if (block->BlockType() == "TX") { |
| 371 | const auto* tx = dynamic_cast<const Tx4Block*>(block.get()); |
| 372 | if (tx == nullptr) { |
| 373 | return false; |
| 374 | } |
| 375 | eng_value = tx->Text(); |
| 376 | } else if (block->BlockType() == "CC") { |
| 377 | const auto* cc = dynamic_cast<const IChannelConversion*>(block.get()); |
| 378 | if (cc == nullptr) { |
| 379 | return false; |
| 380 | } |
| 381 | return cc->Convert(channel_value, eng_value); |
| 382 | } else { |
| 383 | return false; |
| 384 | } |
| 385 | return true; |
| 386 | } |
| 387 | |
| 388 | bool Cc4Block::ConvertValueRangeToText(double channel_value, |
| 389 | std::string& eng_value) const { |