Skip to content

Commit

Permalink
fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
joske committed Sep 11, 2021
1 parent d150e3a commit 0cbf379
Show file tree
Hide file tree
Showing 2 changed files with 174 additions and 76 deletions.
49 changes: 32 additions & 17 deletions ArduinoFloppyReader/ArduinoFloppyReader/Garduino.glade
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,32 @@
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkCheckButton" id="alwaysIgnore">
<property name="label" translatable="yes">Always Ignore Read Errors</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="active">True</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
Expand Down Expand Up @@ -305,41 +331,30 @@
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="writeFileEntry">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkFileChooserButton" id="writeFolderSelector">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="action">select-folder</property>
<property name="title" translatable="yes"/>
</object>
<packing>
<property name="expand">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="writeButton">
<property name="label" translatable="yes">Write Disk</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
<property name="position">2</property>
</packing>
</child>
</object>
Expand All @@ -354,7 +369,7 @@
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkCheckButton">
<object class="GtkCheckButton" id="verify">
<property name="label" translatable="yes">Verify Write</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
Expand All @@ -368,7 +383,7 @@
</packing>
</child>
<child>
<object class="GtkCheckButton">
<object class="GtkCheckButton" id="writeCompensation">
<property name="label" translatable="yes">Use Write Compensation (V1.8+ firmware)</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
Expand Down
201 changes: 142 additions & 59 deletions ArduinoFloppyReader/ArduinoFloppyReader/GarduinoReaderWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,49 +7,61 @@
#include "../lib/ArduinoInterface.h"
#include "../lib/ADFWriter.h"

enum Tracks
{
eighty = 80,
eightytwo = 82,
};

enum ReadType
{
ADF = 1,
SCP = 2,
};

class WindowState
{
public:
Glib::ustring serialPort;
ReadType type;
Tracks tracks;
bool verify;
bool writeCompensation;
Glib::ustring readFileName;
Glib::ustring readFolder;
Glib::ustring writeFileName;
};

class MainWindow : public Gtk::ApplicationWindow
{
public:
MainWindow(BaseObjectType *obj, Glib::RefPtr<Gtk::Builder> const &builder)
: Gtk::ApplicationWindow(obj), builder{builder}
{
get_widgets();
std::vector<std::wstring> portList;
ArduinoFloppyReader::ArduinoInterface::enumeratePorts(portList);
Gtk::ComboBoxText *portsCombo = nullptr;
builder->get_widget("serialPortsCombo", portsCombo);
for (std::wstring port : portList)
{
const std::string portString(port.begin(), port.end());
Glib::ustring text = Glib::ustring(portString.c_str(), port.size());
portsCombo->append(text);
}
Gtk::Button *diagnosticsButton = nullptr;
builder->get_widget("diagnosticsButton", diagnosticsButton);
if (portList.size() > 0)
{
portsCombo->set_active(0);
diagnosticsButton->set_sensitive(true);
}
diagnosticsButton->signal_clicked().connect([this, portsCombo]()
diagnosticsButton->signal_clicked().connect([this]()
{
Glib::ustring serial = portsCombo->get_active_text();
run_diagnostics(serial);
});
Gtk::Button *copyButton = nullptr;
builder->get_widget("copyButton", copyButton);
Gtk::Label *cylinderCount = nullptr;
builder->get_widget("cylinderCount", cylinderCount);
Gtk::Label *sideLabel = nullptr;
builder->get_widget("sideLabel", sideLabel);
Gtk::Label *goodCount = nullptr;
builder->get_widget("goodCount", goodCount);
Gtk::Label *partialCount = nullptr;
builder->get_widget("partialCount", partialCount);

auto readerCallback = [this, cylinderCount, sideLabel, goodCount, partialCount](const int currentTrack, const ArduinoFloppyReader::DiskSurface currentSide, const int retryCounter, const int sectorsFound, const int badSectorsFound) -> ArduinoFloppyReader::WriteResponse
auto readerCallback = [this](const int currentTrack, const ArduinoFloppyReader::DiskSurface currentSide, const int retryCounter, const int sectorsFound, const int badSectorsFound) -> ArduinoFloppyReader::WriteResponse
{
std::string side = (currentSide == ArduinoFloppyReader::DiskSurface::dsUpper ? "Upper" : "Lower");
std::cout << "currentTrack: " << currentTrack << " side: " << side << "retryCount: " << retryCounter << std::endl;
std::cout << "currentTrack: " << currentTrack << " side: " << side << " retryCount: " << retryCounter << std::endl;
cylinderCount->set_text(Glib::ustring::sprintf("%i", currentTrack));
goodCount->set_text(Glib::ustring::sprintf("%i", sectorsFound));
partialCount->set_text(Glib::ustring::sprintf("%i", badSectorsFound));
Expand All @@ -59,26 +71,36 @@ class MainWindow : public Gtk::ApplicationWindow

if (retryCounter > 20)
{
// Gtk::MessageDialog dialog = Gtk::MessageDialog(*this, "Aborted", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK);
// dialog.run();
// dialog.hide();
if (alwaysIgnore->get_active())
{
return ArduinoFloppyReader::WriteResponse::wrSkipBadChecksums;
}
Gtk::MessageDialog dialog = Gtk::MessageDialog(*this, "Verify error writing track.\nDisk Write Error", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_NONE);
dialog.add_button("Abort", 1);
dialog.add_button("Retry", 2);
dialog.add_button("Ignore", 3);
int response = dialog.run();
dialog.hide();

switch (response)
{
case 1:
return ArduinoFloppyReader::WriteResponse::wrAbort;
case 2:
return ArduinoFloppyReader::WriteResponse::wrRetry;
case 3:
return ArduinoFloppyReader::WriteResponse::wrSkipBadChecksums;
}

return ArduinoFloppyReader::WriteResponse::wrSkipBadChecksums;
}

// Just continue
return ArduinoFloppyReader::WriteResponse::wrContinue;
};

Gtk::Entry *fileEntry = nullptr;
builder->get_widget("fileNameEntry", fileEntry);
Gtk::FileChooserButton *folderButton = nullptr;
builder->get_widget("folderSelector", folderButton);
Gtk::ComboBoxText *typeSelector = nullptr;
builder->get_widget("typeSelector", typeSelector);
fileEntry->signal_changed().connect([fileEntry, copyButton]()
fileEntry->signal_changed().connect([this]()
{
if (fileEntry->get_text_length() > 0)
if (fileEntry->get_text_length() > 0 && diagnosticsButton->get_sensitive())
{
copyButton->set_sensitive(true);
}
Expand All @@ -87,9 +109,7 @@ class MainWindow : public Gtk::ApplicationWindow
copyButton->set_sensitive(false);
}
});
Gtk::RadioButton *trackButton = nullptr;
builder->get_widget("radio80", trackButton);
copyButton->signal_clicked().connect([this, fileEntry, folderButton, typeSelector, trackButton, readerCallback, portsCombo]()
copyButton->signal_clicked().connect([this, readerCallback]()
{
Glib::ustring folder = folderButton->get_filename();
Glib::ustring filename = folder + "/" + fileEntry->get_buffer()->get_text();
Expand All @@ -110,46 +130,110 @@ class MainWindow : public Gtk::ApplicationWindow
handleResult(writer, readerResult);
});

auto writerCallback = [this](const int currentTrack, const ArduinoFloppyReader::DiskSurface currentSide, const bool isVerifyError) -> ArduinoFloppyReader::WriteResponse {
writeFolderSelector->signal_file_set().connect([this]()
{
std::cout<< "got filename" << writeFolderSelector->get_filename() << std::endl;
if (this->writeFolderSelector->get_filename() != "" && diagnosticsButton->get_sensitive())
{
writeButton->set_sensitive(true);
}
else
{
writeButton->set_sensitive(false);
}
});
auto writerCallback = [this](const int currentTrack, const ArduinoFloppyReader::DiskSurface currentSide, const bool isVerifyError) -> ArduinoFloppyReader::WriteResponse
{
std::string side = (currentSide == ArduinoFloppyReader::DiskSurface::dsUpper ? "Upper" : "Lower");
std::cout << "writing: currentTrack: " << currentTrack << " side: " << side << std::endl;

// if (isVerifyError) {
// switch (MessageBox(L"Verify error writing track.", L"Disk Write Error", MB_ABORTRETRYIGNORE)) {
// case IDABORT: return ArduinoFloppyReader::WriteResponse::wrAbort;
// case IDRETRY: return ArduinoFloppyReader::WriteResponse::wrRetry;
// case IDIGNORE: return ArduinoFloppyReader::WriteResponse::wrSkipBadChecksums;
// }
// }
// Just continue
return ArduinoFloppyReader::WriteResponse::wrContinue;
};
Gtk::Entry *writeFileEntry = nullptr;
builder->get_widget("writeFileEntry", writeFileEntry);
Gtk::FileChooserButton *writeFolderSelector = nullptr;
builder->get_widget("writeFolderSelector", writeFolderSelector);
Gtk::Button *writeButton = nullptr;
builder->get_widget("writeButton", writeButton);
writeButton->signal_clicked().connect([this, writeFileEntry, writeFolderSelector, writerCallback, portsCombo]()
cylinderCount->set_text(Glib::ustring::sprintf("%i", currentTrack));
sideLabel->set_text(side);
if (isVerifyError)
{
Gtk::MessageDialog dialog = Gtk::MessageDialog(*this, "Verify error writing track.\nDisk Write Error", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_NONE);
dialog.add_button("Abort", 1);
dialog.add_button("Retry", 2);
dialog.add_button("Ignore", 3);
int response = dialog.run();
dialog.hide();

switch (response)
{
case 1:
return ArduinoFloppyReader::WriteResponse::wrAbort;
case 2:
return ArduinoFloppyReader::WriteResponse::wrRetry;
case 3:
return ArduinoFloppyReader::WriteResponse::wrSkipBadChecksums;
}
}
// Just continue
return ArduinoFloppyReader::WriteResponse::wrContinue;
};
writeButton->signal_clicked().connect([this, writerCallback]()
{
Glib::ustring folder = writeFolderSelector->get_filename();
Glib::ustring filename = folder + "/" + writeFileEntry->get_buffer()->get_text();
Glib::ustring filename = writeFolderSelector->get_filename();
ArduinoFloppyReader::ADFWriter writer;
Glib::ustring serial = portsCombo->get_active_text();
writer.openDevice(std::wstring(serial.begin(), serial.end()));
ArduinoFloppyReader::ADFResult readerResult;
readerResult = writer.ADFToDisk(std::wstring(filename.begin(), filename.end()), false, false, writerCallback);
readerResult = writer.ADFToDisk(std::wstring(filename.begin(), filename.end()), verify->get_active(), writeCompensation->get_active(), writerCallback);
// Handle the result
handleResult(writer, readerResult);
});
}

virtual ~MainWindow() = default;

private
:
Glib::RefPtr<Gtk::Builder>
builder;
private:
Glib::RefPtr<Gtk::Builder> builder;
Gtk::ComboBoxText *portsCombo = nullptr;
Gtk::Button *diagnosticsButton = nullptr;
Gtk::Button *copyButton = nullptr;
Gtk::Label *cylinderCount = nullptr;
Gtk::Label *sideLabel = nullptr;
Gtk::Label *goodCount = nullptr;
Gtk::Label *partialCount = nullptr;
Gtk::CheckButton *verify = nullptr;
Gtk::CheckButton *alwaysIgnore = nullptr;
Gtk::CheckButton *writeCompensation = nullptr;
Gtk::FileChooserButton *writeFolderSelector = nullptr;
Gtk::Button *writeButton = nullptr;
Gtk::Entry *fileEntry = nullptr;
Gtk::FileChooserButton *folderButton = nullptr;
Gtk::ComboBoxText *typeSelector = nullptr;
Gtk::RadioButton *trackButton = nullptr;
Gtk::Statusbar *statusBar = nullptr;

void get_widgets()
{
builder->get_widget("serialPortsCombo", portsCombo);
builder->get_widget("diagnosticsButton", diagnosticsButton);
builder->get_widget("copyButton", copyButton);
builder->get_widget("cylinderCount", cylinderCount);
builder->get_widget("sideLabel", sideLabel);
builder->get_widget("goodCount", goodCount);
builder->get_widget("partialCount", partialCount);
builder->get_widget("fileNameEntry", fileEntry);
builder->get_widget("folderSelector", folderButton);
builder->get_widget("typeSelector", typeSelector);
builder->get_widget("radio80", trackButton);
builder->get_widget("alwaysIgnore", alwaysIgnore);
builder->get_widget("verify", verify);
builder->get_widget("writeCompensation", writeCompensation);
builder->get_widget("writeFolderSelector", writeFolderSelector);
builder->get_widget("writeButton", writeButton);
builder->get_widget("statusBar", statusBar);
}

void reset()
{
cylinderCount->set_text("0");
goodCount->set_text("0");
partialCount->set_text("0");
sideLabel->set_text("Upper");
}

void handleResult(ArduinoFloppyReader::ADFWriter writer, ArduinoFloppyReader::ADFResult readerResult)
{
Expand Down Expand Up @@ -214,6 +298,7 @@ private
break;
}
}
reset();
}

bool showQuestion(bool isQuestion, const std::string question)
Expand Down Expand Up @@ -260,8 +345,6 @@ private
strLine = "DIAGNOSTICS FAILED: ";
strLine += status.c_str();
std::cerr << strLine << std::endl;
Gtk::Statusbar *statusBar = nullptr;
builder->get_widget("statusBar", statusBar);
statusBar->pop();
statusBar->push(strLine);
}
Expand Down

0 comments on commit 0cbf379

Please sign in to comment.