| 530 | } |
| 531 | |
| 532 | void writeTracksAndVerify(const DiskLayout& diskLayout, |
| 533 | FluxSinkFactory& fluxSinkFactory, |
| 534 | Encoder& encoder, |
| 535 | FluxSource& fluxSource, |
| 536 | Decoder& decoder, |
| 537 | const Image& image, |
| 538 | const std::vector<CylinderHead>& chs) |
| 539 | { |
| 540 | writeTracks( |
| 541 | diskLayout, |
| 542 | fluxSinkFactory, |
| 543 | [&](const std::shared_ptr<const LogicalTrackLayout>& ltl) |
| 544 | { |
| 545 | auto sectors = encoder.collectSectors(*ltl, image); |
| 546 | return encoder.encode(*ltl, sectors, image); |
| 547 | }, |
| 548 | [&](const std::shared_ptr<const LogicalTrackLayout>& ltl) |
| 549 | { |
| 550 | FluxSourceIteratorHolder fluxSourceIteratorHolder(fluxSource); |
| 551 | std::vector<std::shared_ptr<const Track>> tracks; |
| 552 | auto [result, sectors] = readGroup( |
| 553 | diskLayout, fluxSourceIteratorHolder, ltl, tracks, decoder); |
| 554 | log(TrackReadLogMessage{tracks, sectors}); |
| 555 | |
| 556 | if (result != GOOD_READ) |
| 557 | { |
| 558 | adjustTrackOnError(fluxSource, ltl->physicalCylinder); |
| 559 | log("bad read"); |
| 560 | return false; |
| 561 | } |
| 562 | |
| 563 | Image wanted; |
| 564 | for (const auto& sector : encoder.collectSectors(*ltl, image)) |
| 565 | wanted |
| 566 | .put(sector->logicalCylinder, |
| 567 | sector->logicalHead, |
| 568 | sector->logicalSector) |
| 569 | ->data = sector->data; |
| 570 | |
| 571 | for (const auto& sector : sectors) |
| 572 | { |
| 573 | const auto s = wanted.get(sector->logicalCylinder, |
| 574 | sector->logicalHead, |
| 575 | sector->logicalSector); |
| 576 | if (!s) |
| 577 | { |
| 578 | log("spurious sector on verify"); |
| 579 | return false; |
| 580 | } |
| 581 | if (s->data != sector->data.slice(0, s->data.size())) |
| 582 | { |
| 583 | log("data mismatch on verify"); |
| 584 | return false; |
| 585 | } |
| 586 | wanted.erase(sector->logicalCylinder, |
| 587 | sector->logicalHead, |
| 588 | sector->logicalSector); |
| 589 | } |
no test coverage detected