More flux visualiser improvements.

This commit is contained in:
David Given
2024-01-20 23:03:25 +01:00
parent d1aa84b543
commit f187846bf3
7 changed files with 51 additions and 31 deletions

View File

@@ -84,6 +84,32 @@ public:
if (fc->source) if (fc->source)
fc->source(fluxFile, fc->source(fluxFile,
globalConfig().overrides()->mutable_flux_source()); globalConfig().overrides()->mutable_flux_source());
QString rpmOverride = rpmOverrideComboBox->currentData().toString();
if (rpmOverride == "300")
globalConfig()
.overrides()
->mutable_drive()
->set_rotational_period_ms(200);
else if (rpmOverride == "360")
globalConfig()
.overrides()
->mutable_drive()
->set_rotational_period_ms(166);
else if (rpmOverride == "override")
{
float value = rpmOverrideValue->value();
globalConfig()
.overrides()
->mutable_drive()
->set_rotational_period_ms(60e3 / value);
}
QString driveTypeOverride =
driveTypeOverrideComboBox->currentData().toString();
if (driveTypeOverride != "default")
globalConfig().overrides()->MergeFrom(
*drivetypes.at(driveTypeOverride.toStdString()));
} }
void loadSavedState() override void loadSavedState() override

View File

@@ -38,11 +38,6 @@ public:
_fluxVisualiserWidget->setTrackData(track); _fluxVisualiserWidget->setTrackData(track);
} }
void setDiskData(std::shared_ptr<const DiskFlux> disk)
{
_fluxVisualiserWidget->setDiskData(disk);
}
private: private:
MainWindow* _mainWindow; MainWindow* _mainWindow;
FluxVisualiserWidget* _fluxVisualiserWidget; FluxVisualiserWidget* _fluxVisualiserWidget;

View File

@@ -6,7 +6,6 @@ class FluxComponent
{ {
public: public:
virtual void setTrackData(std::shared_ptr<const TrackFlux> track) = 0; virtual void setTrackData(std::shared_ptr<const TrackFlux> track) = 0;
virtual void setDiskData(std::shared_ptr<const DiskFlux> disk) = 0;
public: public:
static FluxComponent* create(MainWindow* mainWindow); static FluxComponent* create(MainWindow* mainWindow);

View File

@@ -18,7 +18,6 @@ class DiskFlux;
class TrackFlux; class TrackFlux;
static constexpr int SIDES = 2; static constexpr int SIDES = 2;
static constexpr int TRACKS = 82;
static constexpr int SLOTS = 300; static constexpr int SLOTS = 300;
static constexpr float VBORDER = 1.0; static constexpr float VBORDER = 1.0;
@@ -67,25 +66,18 @@ public:
void setTrackData(std::shared_ptr<const TrackFlux> track) void setTrackData(std::shared_ptr<const TrackFlux> track)
{ {
key_t key = { for (int i = 0; i < track->trackInfo->groupSize; i++)
track->trackInfo->physicalTrack, track->trackInfo->physicalSide};
_tracks[key] = track;
recompute(
track->trackInfo->physicalSide, track->trackInfo->physicalTrack);
}
void setDiskData(std::shared_ptr<const DiskFlux> disk)
{
_tracks.clear();
for (const auto& track : disk->tracks)
{ {
key_t key = {track->trackInfo->physicalTrack, key_t key = {track->trackInfo->physicalTrack + i,
track->trackInfo->physicalSide}; track->trackInfo->physicalSide};
_tracks[key] = track; _tracks[key] = track;
} _numTracks = track->trackInfo->numPhysicalTracks;
_viewData0.resize(_numTracks);
_viewData1.resize(_numTracks);
recompute(); recompute(track->trackInfo->physicalSide,
track->trackInfo->physicalTrack + i);
}
} }
private: private:
@@ -121,11 +113,18 @@ private:
void drawSide(float x, float y, int side) void drawSide(float x, float y, int side)
{ {
float step = (VOUTER_RADIUS - VINNER_RADIUS) / TRACKS; if (_numTracks == 0)
for (int track = 0; track < 82; track++) {
_scene->addAlignedText(x, y, "No flux loaded!");
return;
}
auto& viewData = side ? _viewData1 : _viewData0;
float step = (VOUTER_RADIUS - VINNER_RADIUS) / _numTracks;
for (int track = 0; track < _numTracks; track++)
{ {
QConicalGradient gradient(x, y, 90.0); QConicalGradient gradient(x, y, 90.0);
gradient.setStops(_viewData[side][track].gradientStops); gradient.setStops(viewData.at(track).gradientStops);
QBrush brush(gradient); QBrush brush(gradient);
QPen pen(brush, step * 1.15); QPen pen(brush, step * 1.15);
@@ -142,13 +141,14 @@ private:
void recompute() void recompute()
{ {
for (int side = 0; side < SIDES; side++) for (int side = 0; side < SIDES; side++)
for (int track = 0; track < TRACKS; track++) for (int track = 0; track < _numTracks; track++)
recompute(side, track); recompute(side, track);
} }
void recompute(int side, int track) void recompute(int side, int track)
{ {
VData& vdata = _viewData[side][track]; auto& viewData = side ? _viewData1 : _viewData0;
VData& vdata = viewData.at(track);
QGradientStops& stops = vdata.gradientStops; QGradientStops& stops = vdata.gradientStops;
stops.clear(); stops.clear();
ranges::fill(vdata.slot, VSlot()); ranges::fill(vdata.slot, VSlot());
@@ -250,7 +250,9 @@ private:
Scene* _scene; Scene* _scene;
std::map<key_t, std::shared_ptr<const TrackFlux>> _tracks; std::map<key_t, std::shared_ptr<const TrackFlux>> _tracks;
int _viewMode = BOTH_SIDES; int _viewMode = BOTH_SIDES;
VData _viewData[SIDES][TRACKS]; unsigned _numTracks = 0;
std::vector<VData> _viewData0;
std::vector<VData> _viewData1;
float _gamma = 1.0; float _gamma = 1.0;
}; };

View File

@@ -14,7 +14,6 @@ public:
W_SLOT(setGamma) W_SLOT(setGamma)
virtual void setTrackData(std::shared_ptr<const TrackFlux> track) = 0; virtual void setTrackData(std::shared_ptr<const TrackFlux> track) = 0;
virtual void setDiskData(std::shared_ptr<const DiskFlux> disk) = 0;
public: public:
static FluxVisualiserWidget* create(); static FluxVisualiserWidget* create();

View File

@@ -102,7 +102,7 @@ public:
for (auto& sector : track->sectors) for (auto& sector : track->sectors)
_sectors.insert({key, sector}); _sectors.insert({key, sector});
_trackInfos.insert({key, track->trackInfo}); _trackInfos.insert({key, track->trackInfo});
_numTracks = track->trackInfo->numTracks; _numTracks = track->trackInfo->numLogicalTracks;
redraw(); redraw();
} }

View File

@@ -74,7 +74,6 @@ public:
/* A complete disk has been read. */ /* A complete disk has been read. */
[&](const DiskReadLogMessage& m) [&](const DiskReadLogMessage& m)
{ {
_fluxComponent->setDiskData(m.disk);
_imageComponent->setDiskData(m.disk); _imageComponent->setDiskData(m.disk);
_currentDisk = m.disk; _currentDisk = m.disk;
}, },