| 359 | } |
| 360 | |
| 361 | void MathStack::calc_math(uint64_t mathFactor) |
| 362 | { |
| 363 | assert(mathFactor > 0); |
| 364 | |
| 365 | std::lock_guard<std::mutex> lock(_mutex); |
| 366 | |
| 367 | _math_state = Running; |
| 368 | |
| 369 | const auto data = _dsoSig1->data(); |
| 370 | |
| 371 | if (data->empty() || _math.size() < _total_sample_num) |
| 372 | return; |
| 373 | |
| 374 | if (!_dsoSig1->enabled() || !_dsoSig2->enabled()) |
| 375 | return; |
| 376 | |
| 377 | if (data->get_channel_num() < 2) |
| 378 | return; |
| 379 | |
| 380 | auto k1 = _dsoSig1->get_factor(); |
| 381 | auto k2 = _dsoSig2->get_factor(); |
| 382 | |
| 383 | const double scale1 = _dsoSig1->get_vDialValue() / 1000.0 * k1 * DS_CONF_DSO_VDIVS * |
| 384 | _dsoSig1->get_scale() / _dsoSig1->get_view_rect().height(); |
| 385 | |
| 386 | const double delta1 = _dsoSig1->get_hw_offset() * scale1; |
| 387 | |
| 388 | const double scale2 = _dsoSig2->get_vDialValue() / 1000.0 * k2 * DS_CONF_DSO_VDIVS * |
| 389 | _dsoSig2->get_scale() / _dsoSig2->get_view_rect().height(); |
| 390 | |
| 391 | const double delta2 = _dsoSig2->get_hw_offset() * scale2; |
| 392 | |
| 393 | _sample_num = data->get_sample_count(); |
| 394 | assert(_sample_num <= _total_sample_num); |
| 395 | |
| 396 | const int index1 = _dsoSig1->get_index(); |
| 397 | const int index2 = _dsoSig2->get_index(); |
| 398 | const uint8_t* value_buffer1 = data->get_samples(0, 0, index1); |
| 399 | const uint8_t* value_buffer2 = data->get_samples(0, 0, index2); |
| 400 | double value1, value2; |
| 401 | |
| 402 | for (uint64_t sample = 0; sample < _sample_num; sample++) { |
| 403 | value1 = *(value_buffer1 + sample); |
| 404 | value2 = *(value_buffer2 + sample); |
| 405 | |
| 406 | switch(_type) |
| 407 | { |
| 408 | case MATH_ADD: |
| 409 | _math[sample] = ((delta1 - scale1 * value1) + (delta2 - scale2 * value2)) / mathFactor; |
| 410 | break; |
| 411 | case MATH_SUB: |
| 412 | _math[sample] = ((delta1 - scale1 * value1) - (delta2 - scale2 * value2)) / mathFactor; |
| 413 | break; |
| 414 | case MATH_MUL: |
| 415 | _math[sample] = (delta1 - scale1 * value1) * (delta2 - scale2 * value2) / mathFactor; |
| 416 | break; |
| 417 | case MATH_DIV: |
| 418 | _math[sample] = (delta1 - scale1 * value1) / (delta2 - scale2 * value2) / mathFactor; |
no test coverage detected