Skip to content

Commit 0cbf379

Browse files
committed
fixes
1 parent d150e3a commit 0cbf379

File tree

2 files changed

+174
-76
lines changed

2 files changed

+174
-76
lines changed

ArduinoFloppyReader/ArduinoFloppyReader/Garduino.glade

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,32 @@
253253
<property name="position">1</property>
254254
</packing>
255255
</child>
256+
<child>
257+
<object class="GtkBox">
258+
<property name="visible">True</property>
259+
<property name="can-focus">False</property>
260+
<child>
261+
<object class="GtkCheckButton" id="alwaysIgnore">
262+
<property name="label" translatable="yes">Always Ignore Read Errors</property>
263+
<property name="visible">True</property>
264+
<property name="can-focus">True</property>
265+
<property name="receives-default">False</property>
266+
<property name="active">True</property>
267+
<property name="draw-indicator">True</property>
268+
</object>
269+
<packing>
270+
<property name="expand">True</property>
271+
<property name="fill">True</property>
272+
<property name="position">0</property>
273+
</packing>
274+
</child>
275+
</object>
276+
<packing>
277+
<property name="expand">False</property>
278+
<property name="fill">True</property>
279+
<property name="position">2</property>
280+
</packing>
281+
</child>
256282
</object>
257283
</child>
258284
</object>
@@ -305,41 +331,30 @@
305331
<property name="position">0</property>
306332
</packing>
307333
</child>
308-
<child>
309-
<object class="GtkEntry" id="writeFileEntry">
310-
<property name="visible">True</property>
311-
<property name="can-focus">True</property>
312-
</object>
313-
<packing>
314-
<property name="expand">True</property>
315-
<property name="fill">True</property>
316-
<property name="position">1</property>
317-
</packing>
318-
</child>
319334
<child>
320335
<object class="GtkFileChooserButton" id="writeFolderSelector">
321336
<property name="visible">True</property>
322337
<property name="can-focus">False</property>
323-
<property name="action">select-folder</property>
324338
<property name="title" translatable="yes"/>
325339
</object>
326340
<packing>
327-
<property name="expand">False</property>
341+
<property name="expand">True</property>
328342
<property name="fill">True</property>
329-
<property name="position">2</property>
343+
<property name="position">1</property>
330344
</packing>
331345
</child>
332346
<child>
333347
<object class="GtkButton" id="writeButton">
334348
<property name="label" translatable="yes">Write Disk</property>
335349
<property name="visible">True</property>
350+
<property name="sensitive">False</property>
336351
<property name="can-focus">True</property>
337352
<property name="receives-default">True</property>
338353
</object>
339354
<packing>
340355
<property name="expand">False</property>
341356
<property name="fill">True</property>
342-
<property name="position">3</property>
357+
<property name="position">2</property>
343358
</packing>
344359
</child>
345360
</object>
@@ -354,7 +369,7 @@
354369
<property name="visible">True</property>
355370
<property name="can-focus">False</property>
356371
<child>
357-
<object class="GtkCheckButton">
372+
<object class="GtkCheckButton" id="verify">
358373
<property name="label" translatable="yes">Verify Write</property>
359374
<property name="visible">True</property>
360375
<property name="can-focus">True</property>
@@ -368,7 +383,7 @@
368383
</packing>
369384
</child>
370385
<child>
371-
<object class="GtkCheckButton">
386+
<object class="GtkCheckButton" id="writeCompensation">
372387
<property name="label" translatable="yes">Use Write Compensation (V1.8+ firmware)</property>
373388
<property name="visible">True</property>
374389
<property name="can-focus">True</property>

ArduinoFloppyReader/ArduinoFloppyReader/GarduinoReaderWriter.cpp

Lines changed: 142 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -7,49 +7,61 @@
77
#include "../lib/ArduinoInterface.h"
88
#include "../lib/ADFWriter.h"
99

10+
enum Tracks
11+
{
12+
eighty = 80,
13+
eightytwo = 82,
14+
};
15+
16+
enum ReadType
17+
{
18+
ADF = 1,
19+
SCP = 2,
20+
};
21+
22+
class WindowState
23+
{
24+
public:
25+
Glib::ustring serialPort;
26+
ReadType type;
27+
Tracks tracks;
28+
bool verify;
29+
bool writeCompensation;
30+
Glib::ustring readFileName;
31+
Glib::ustring readFolder;
32+
Glib::ustring writeFileName;
33+
};
34+
1035
class MainWindow : public Gtk::ApplicationWindow
1136
{
1237
public:
1338
MainWindow(BaseObjectType *obj, Glib::RefPtr<Gtk::Builder> const &builder)
1439
: Gtk::ApplicationWindow(obj), builder{builder}
1540
{
41+
get_widgets();
1642
std::vector<std::wstring> portList;
1743
ArduinoFloppyReader::ArduinoInterface::enumeratePorts(portList);
18-
Gtk::ComboBoxText *portsCombo = nullptr;
19-
builder->get_widget("serialPortsCombo", portsCombo);
2044
for (std::wstring port : portList)
2145
{
2246
const std::string portString(port.begin(), port.end());
2347
Glib::ustring text = Glib::ustring(portString.c_str(), port.size());
2448
portsCombo->append(text);
2549
}
26-
Gtk::Button *diagnosticsButton = nullptr;
27-
builder->get_widget("diagnosticsButton", diagnosticsButton);
2850
if (portList.size() > 0)
2951
{
3052
portsCombo->set_active(0);
3153
diagnosticsButton->set_sensitive(true);
3254
}
33-
diagnosticsButton->signal_clicked().connect([this, portsCombo]()
55+
diagnosticsButton->signal_clicked().connect([this]()
3456
{
3557
Glib::ustring serial = portsCombo->get_active_text();
3658
run_diagnostics(serial);
3759
});
38-
Gtk::Button *copyButton = nullptr;
39-
builder->get_widget("copyButton", copyButton);
40-
Gtk::Label *cylinderCount = nullptr;
41-
builder->get_widget("cylinderCount", cylinderCount);
42-
Gtk::Label *sideLabel = nullptr;
43-
builder->get_widget("sideLabel", sideLabel);
44-
Gtk::Label *goodCount = nullptr;
45-
builder->get_widget("goodCount", goodCount);
46-
Gtk::Label *partialCount = nullptr;
47-
builder->get_widget("partialCount", partialCount);
4860

49-
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
61+
auto readerCallback = [this](const int currentTrack, const ArduinoFloppyReader::DiskSurface currentSide, const int retryCounter, const int sectorsFound, const int badSectorsFound) -> ArduinoFloppyReader::WriteResponse
5062
{
5163
std::string side = (currentSide == ArduinoFloppyReader::DiskSurface::dsUpper ? "Upper" : "Lower");
52-
std::cout << "currentTrack: " << currentTrack << " side: " << side << "retryCount: " << retryCounter << std::endl;
64+
std::cout << "currentTrack: " << currentTrack << " side: " << side << " retryCount: " << retryCounter << std::endl;
5365
cylinderCount->set_text(Glib::ustring::sprintf("%i", currentTrack));
5466
goodCount->set_text(Glib::ustring::sprintf("%i", sectorsFound));
5567
partialCount->set_text(Glib::ustring::sprintf("%i", badSectorsFound));
@@ -59,26 +71,36 @@ class MainWindow : public Gtk::ApplicationWindow
5971

6072
if (retryCounter > 20)
6173
{
62-
// Gtk::MessageDialog dialog = Gtk::MessageDialog(*this, "Aborted", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK);
63-
// dialog.run();
64-
// dialog.hide();
74+
if (alwaysIgnore->get_active())
75+
{
76+
return ArduinoFloppyReader::WriteResponse::wrSkipBadChecksums;
77+
}
78+
Gtk::MessageDialog dialog = Gtk::MessageDialog(*this, "Verify error writing track.\nDisk Write Error", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_NONE);
79+
dialog.add_button("Abort", 1);
80+
dialog.add_button("Retry", 2);
81+
dialog.add_button("Ignore", 3);
82+
int response = dialog.run();
83+
dialog.hide();
84+
85+
switch (response)
86+
{
87+
case 1:
88+
return ArduinoFloppyReader::WriteResponse::wrAbort;
89+
case 2:
90+
return ArduinoFloppyReader::WriteResponse::wrRetry;
91+
case 3:
92+
return ArduinoFloppyReader::WriteResponse::wrSkipBadChecksums;
93+
}
6594

66-
return ArduinoFloppyReader::WriteResponse::wrSkipBadChecksums;
6795
}
6896

6997
// Just continue
7098
return ArduinoFloppyReader::WriteResponse::wrContinue;
7199
};
72100

73-
Gtk::Entry *fileEntry = nullptr;
74-
builder->get_widget("fileNameEntry", fileEntry);
75-
Gtk::FileChooserButton *folderButton = nullptr;
76-
builder->get_widget("folderSelector", folderButton);
77-
Gtk::ComboBoxText *typeSelector = nullptr;
78-
builder->get_widget("typeSelector", typeSelector);
79-
fileEntry->signal_changed().connect([fileEntry, copyButton]()
101+
fileEntry->signal_changed().connect([this]()
80102
{
81-
if (fileEntry->get_text_length() > 0)
103+
if (fileEntry->get_text_length() > 0 && diagnosticsButton->get_sensitive())
82104
{
83105
copyButton->set_sensitive(true);
84106
}
@@ -87,9 +109,7 @@ class MainWindow : public Gtk::ApplicationWindow
87109
copyButton->set_sensitive(false);
88110
}
89111
});
90-
Gtk::RadioButton *trackButton = nullptr;
91-
builder->get_widget("radio80", trackButton);
92-
copyButton->signal_clicked().connect([this, fileEntry, folderButton, typeSelector, trackButton, readerCallback, portsCombo]()
112+
copyButton->signal_clicked().connect([this, readerCallback]()
93113
{
94114
Glib::ustring folder = folderButton->get_filename();
95115
Glib::ustring filename = folder + "/" + fileEntry->get_buffer()->get_text();
@@ -110,46 +130,110 @@ class MainWindow : public Gtk::ApplicationWindow
110130
handleResult(writer, readerResult);
111131
});
112132

113-
auto writerCallback = [this](const int currentTrack, const ArduinoFloppyReader::DiskSurface currentSide, const bool isVerifyError) -> ArduinoFloppyReader::WriteResponse {
133+
writeFolderSelector->signal_file_set().connect([this]()
134+
{
135+
std::cout<< "got filename" << writeFolderSelector->get_filename() << std::endl;
136+
if (this->writeFolderSelector->get_filename() != "" && diagnosticsButton->get_sensitive())
137+
{
138+
writeButton->set_sensitive(true);
139+
}
140+
else
141+
{
142+
writeButton->set_sensitive(false);
143+
}
144+
});
145+
auto writerCallback = [this](const int currentTrack, const ArduinoFloppyReader::DiskSurface currentSide, const bool isVerifyError) -> ArduinoFloppyReader::WriteResponse
146+
{
114147
std::string side = (currentSide == ArduinoFloppyReader::DiskSurface::dsUpper ? "Upper" : "Lower");
115148
std::cout << "writing: currentTrack: " << currentTrack << " side: " << side << std::endl;
116149

117-
// if (isVerifyError) {
118-
// switch (MessageBox(L"Verify error writing track.", L"Disk Write Error", MB_ABORTRETRYIGNORE)) {
119-
// case IDABORT: return ArduinoFloppyReader::WriteResponse::wrAbort;
120-
// case IDRETRY: return ArduinoFloppyReader::WriteResponse::wrRetry;
121-
// case IDIGNORE: return ArduinoFloppyReader::WriteResponse::wrSkipBadChecksums;
122-
// }
123-
// }
124-
// Just continue
125-
return ArduinoFloppyReader::WriteResponse::wrContinue;
126-
};
127-
Gtk::Entry *writeFileEntry = nullptr;
128-
builder->get_widget("writeFileEntry", writeFileEntry);
129-
Gtk::FileChooserButton *writeFolderSelector = nullptr;
130-
builder->get_widget("writeFolderSelector", writeFolderSelector);
131-
Gtk::Button *writeButton = nullptr;
132-
builder->get_widget("writeButton", writeButton);
133-
writeButton->signal_clicked().connect([this, writeFileEntry, writeFolderSelector, writerCallback, portsCombo]()
150+
cylinderCount->set_text(Glib::ustring::sprintf("%i", currentTrack));
151+
sideLabel->set_text(side);
152+
if (isVerifyError)
153+
{
154+
Gtk::MessageDialog dialog = Gtk::MessageDialog(*this, "Verify error writing track.\nDisk Write Error", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_NONE);
155+
dialog.add_button("Abort", 1);
156+
dialog.add_button("Retry", 2);
157+
dialog.add_button("Ignore", 3);
158+
int response = dialog.run();
159+
dialog.hide();
160+
161+
switch (response)
162+
{
163+
case 1:
164+
return ArduinoFloppyReader::WriteResponse::wrAbort;
165+
case 2:
166+
return ArduinoFloppyReader::WriteResponse::wrRetry;
167+
case 3:
168+
return ArduinoFloppyReader::WriteResponse::wrSkipBadChecksums;
169+
}
170+
}
171+
// Just continue
172+
return ArduinoFloppyReader::WriteResponse::wrContinue;
173+
};
174+
writeButton->signal_clicked().connect([this, writerCallback]()
134175
{
135-
Glib::ustring folder = writeFolderSelector->get_filename();
136-
Glib::ustring filename = folder + "/" + writeFileEntry->get_buffer()->get_text();
176+
Glib::ustring filename = writeFolderSelector->get_filename();
137177
ArduinoFloppyReader::ADFWriter writer;
138178
Glib::ustring serial = portsCombo->get_active_text();
139179
writer.openDevice(std::wstring(serial.begin(), serial.end()));
140180
ArduinoFloppyReader::ADFResult readerResult;
141-
readerResult = writer.ADFToDisk(std::wstring(filename.begin(), filename.end()), false, false, writerCallback);
181+
readerResult = writer.ADFToDisk(std::wstring(filename.begin(), filename.end()), verify->get_active(), writeCompensation->get_active(), writerCallback);
142182
// Handle the result
143183
handleResult(writer, readerResult);
144184
});
145185
}
146186

147187
virtual ~MainWindow() = default;
148188

149-
private
150-
:
151-
Glib::RefPtr<Gtk::Builder>
152-
builder;
189+
private:
190+
Glib::RefPtr<Gtk::Builder> builder;
191+
Gtk::ComboBoxText *portsCombo = nullptr;
192+
Gtk::Button *diagnosticsButton = nullptr;
193+
Gtk::Button *copyButton = nullptr;
194+
Gtk::Label *cylinderCount = nullptr;
195+
Gtk::Label *sideLabel = nullptr;
196+
Gtk::Label *goodCount = nullptr;
197+
Gtk::Label *partialCount = nullptr;
198+
Gtk::CheckButton *verify = nullptr;
199+
Gtk::CheckButton *alwaysIgnore = nullptr;
200+
Gtk::CheckButton *writeCompensation = nullptr;
201+
Gtk::FileChooserButton *writeFolderSelector = nullptr;
202+
Gtk::Button *writeButton = nullptr;
203+
Gtk::Entry *fileEntry = nullptr;
204+
Gtk::FileChooserButton *folderButton = nullptr;
205+
Gtk::ComboBoxText *typeSelector = nullptr;
206+
Gtk::RadioButton *trackButton = nullptr;
207+
Gtk::Statusbar *statusBar = nullptr;
208+
209+
void get_widgets()
210+
{
211+
builder->get_widget("serialPortsCombo", portsCombo);
212+
builder->get_widget("diagnosticsButton", diagnosticsButton);
213+
builder->get_widget("copyButton", copyButton);
214+
builder->get_widget("cylinderCount", cylinderCount);
215+
builder->get_widget("sideLabel", sideLabel);
216+
builder->get_widget("goodCount", goodCount);
217+
builder->get_widget("partialCount", partialCount);
218+
builder->get_widget("fileNameEntry", fileEntry);
219+
builder->get_widget("folderSelector", folderButton);
220+
builder->get_widget("typeSelector", typeSelector);
221+
builder->get_widget("radio80", trackButton);
222+
builder->get_widget("alwaysIgnore", alwaysIgnore);
223+
builder->get_widget("verify", verify);
224+
builder->get_widget("writeCompensation", writeCompensation);
225+
builder->get_widget("writeFolderSelector", writeFolderSelector);
226+
builder->get_widget("writeButton", writeButton);
227+
builder->get_widget("statusBar", statusBar);
228+
}
229+
230+
void reset()
231+
{
232+
cylinderCount->set_text("0");
233+
goodCount->set_text("0");
234+
partialCount->set_text("0");
235+
sideLabel->set_text("Upper");
236+
}
153237

154238
void handleResult(ArduinoFloppyReader::ADFWriter writer, ArduinoFloppyReader::ADFResult readerResult)
155239
{
@@ -214,6 +298,7 @@ private
214298
break;
215299
}
216300
}
301+
reset();
217302
}
218303

219304
bool showQuestion(bool isQuestion, const std::string question)
@@ -260,8 +345,6 @@ private
260345
strLine = "DIAGNOSTICS FAILED: ";
261346
strLine += status.c_str();
262347
std::cerr << strLine << std::endl;
263-
Gtk::Statusbar *statusBar = nullptr;
264-
builder->get_widget("statusBar", statusBar);
265348
statusBar->pop();
266349
statusBar->push(strLine);
267350
}

0 commit comments

Comments
 (0)