Final tweaks for v4.5
[SCSI2SD-V6.git] / software / scsi2sd-util / BoardPanel.cc
1 //      Copyright (C) 2015 Michael McMaster <michael@codesrc.com>
2 //
3 //      This file is part of SCSI2SD.
4 //
5 //      SCSI2SD is free software: you can redistribute it and/or modify
6 //      it under the terms of the GNU General Public License as published by
7 //      the Free Software Foundation, either version 3 of the License, or
8 //      (at your option) any later version.
9 //
10 //      SCSI2SD is distributed in the hope that it will be useful,
11 //      but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //      GNU General Public License for more details.
14 //
15 //      You should have received a copy of the GNU General Public License
16 //      along with SCSI2SD.  If not, see <http://www.gnu.org/licenses/>.
17
18 // For compilers that support precompilation, includes "wx/wx.h".
19 #include <wx/wxprec.h>
20 #ifndef WX_PRECOMP
21 #include <wx/wx.h>
22 #endif
23
24 #include <wx/wrapsizer.h>
25
26 #include "ConfigUtil.hh"
27 #include "BoardPanel.hh"
28
29 #include <limits>
30 #include <sstream>
31
32 #include <math.h>
33 #include <string.h>
34
35 using namespace SCSI2SD;
36
37 namespace
38 {
39         template<typename IntType, class WXCTRL> std::pair<IntType, bool>
40         CtrlGetValue(WXCTRL* ctrl)
41         {
42                 IntType value;
43                 std::stringstream conv;
44                 conv << ctrl->GetValue();
45                 conv >> value;
46                 return std::make_pair(value, static_cast<bool>(conv));
47         }
48
49 }
50
51 BoardPanel::BoardPanel(wxWindow* parent, const BoardConfig& initialConfig) :
52         wxPanel(parent),
53         myParent(parent),
54         myDelayValidator(new wxIntegerValidator<uint8_t>)
55 {
56         wxFlexGridSizer *fgs = new wxFlexGridSizer(8, 2, 9, 25);
57
58         fgs->Add(new wxStaticText(this, wxID_ANY, _("Startup Delay (seconds)")));
59         myStartDelayCtrl =
60                 new wxTextCtrl(
61                         this,
62                         ID_startDelayCtrl,
63                         "0",
64                         wxDefaultPosition,
65                         wxDefaultSize,
66                         0,
67                         *myDelayValidator);
68         myStartDelayCtrl->SetToolTip(_("Extra delay on power on, normally set to 0"));
69         fgs->Add(myStartDelayCtrl);
70
71
72         fgs->Add(new wxStaticText(this, wxID_ANY, _("SCSI Selection Delay (ms, 255 = auto)")));
73         mySelDelayCtrl =
74                 new wxTextCtrl(
75                         this,
76                         ID_selDelayCtrl,
77                         "255",
78                         wxDefaultPosition,
79                         wxDefaultSize,
80                         0,
81                         *myDelayValidator);
82         mySelDelayCtrl->SetToolTip(_("Delay before responding to SCSI selection. SCSI1 hosts usually require 1ms delay, however some require no delay"));
83         fgs->Add(mySelDelayCtrl);
84
85         fgs->Add(new wxStaticText(this, wxID_ANY, wxT("")));
86         myParityCtrl =
87                 new wxCheckBox(
88                         this,
89                         ID_parityCtrl,
90                         _("Enable Parity"));
91         myParityCtrl->SetToolTip(_("Enable to require valid SCSI parity bits when receiving data. Some hosts don't provide parity. SCSI2SD always outputs valid parity bits."));
92         fgs->Add(myParityCtrl);
93
94         fgs->Add(new wxStaticText(this, wxID_ANY, wxT("")));
95         myUnitAttCtrl =
96                 new wxCheckBox(
97                         this,
98                         ID_unitAttCtrl,
99                         _("Enable Unit Attention"));
100         myUnitAttCtrl->SetToolTip(_("Enable this to inform the host of changes after hot-swapping SD cards. Causes problems with Mac Plus."));
101         fgs->Add(myUnitAttCtrl);
102
103         fgs->Add(new wxStaticText(this, wxID_ANY, wxT("")));
104         myScsi2Ctrl =
105                 new wxCheckBox(
106                         this,
107                         ID_scsi2Ctrl,
108                         _("Enable SCSI2 Mode"));
109         myScsi2Ctrl->SetToolTip(_("Enable high-performance mode. May cause problems with SASI/SCSI1 hosts."));
110         fgs->Add(myScsi2Ctrl);
111
112         fgs->Add(new wxStaticText(this, wxID_ANY, wxT("")));
113         myGlitchCtrl =
114                 new wxCheckBox(
115                         this,
116                         ID_glitchCtrl,
117                         _("Disable glitch filter"));
118         myGlitchCtrl->SetToolTip(_("Improve performance at the cost of noise immunity. Only use with short cables."));
119         fgs->Add(myGlitchCtrl);
120
121         fgs->Add(new wxStaticText(this, wxID_ANY, wxT("")));
122         myCacheCtrl =
123                 new wxCheckBox(
124                         this,
125                         ID_cacheCtrl,
126                         _("Enable disk cache (experimental)"));
127         myCacheCtrl->SetToolTip(_("SD IO commands aren't completed when SCSI commands complete"));
128         fgs->Add(myCacheCtrl);
129
130         fgs->Add(new wxStaticText(this, wxID_ANY, wxT("")));
131         myDisconnectCtrl =
132                 new wxCheckBox(
133                         this,
134                         ID_disconnectCtrl,
135                         _("Enable SCSI Disconnect"));
136         myDisconnectCtrl->SetToolTip(_("Release the SCSI bus while waiting for SD card writes to complete. Must also be enabled in host OS."));
137         fgs->Add(myDisconnectCtrl);
138
139         wxBoxSizer* hbox = new wxBoxSizer(wxHORIZONTAL);
140         hbox->Add(fgs, 1, wxALL | wxEXPAND, 15);
141         this->SetSizer(hbox);
142         Centre();
143
144         setConfig(initialConfig);
145 }
146
147
148 BoardConfig
149 BoardPanel::getConfig() const
150 {
151         BoardConfig config;
152
153         // Try and keep unknown/unused fields as-is to support newer firmware
154         // versions.
155         memcpy(&config, &myConfig, sizeof(config));
156
157         config.flags =
158                 (myParityCtrl->IsChecked() ? CONFIG_ENABLE_PARITY : 0) |
159                 (myUnitAttCtrl->IsChecked() ? CONFIG_ENABLE_UNIT_ATTENTION : 0) |
160                 (myScsi2Ctrl->IsChecked() ? CONFIG_ENABLE_SCSI2 : 0) |
161                 (myGlitchCtrl->IsChecked() ? CONFIG_DISABLE_GLITCH : 0) |
162                 (myCacheCtrl->IsChecked() ? CONFIG_ENABLE_CACHE: 0) |
163                 (myDisconnectCtrl->IsChecked() ? CONFIG_ENABLE_DISCONNECT: 0);
164
165         config.startupDelay = CtrlGetValue<unsigned int>(myStartDelayCtrl).first;
166         config.selectionDelay = CtrlGetValue<unsigned int>(mySelDelayCtrl).first;
167         return config;
168 }
169
170 void
171 BoardPanel::setConfig(const BoardConfig& config)
172 {
173         memcpy(&myConfig, &config, sizeof(config));
174
175         myParityCtrl->SetValue(config.flags & CONFIG_ENABLE_PARITY);
176         myUnitAttCtrl->SetValue(config.flags & CONFIG_ENABLE_UNIT_ATTENTION);
177         myScsi2Ctrl->SetValue(config.flags & CONFIG_ENABLE_SCSI2);
178         myGlitchCtrl->SetValue(config.flags & CONFIG_DISABLE_GLITCH);
179         myCacheCtrl->SetValue(config.flags & CONFIG_ENABLE_CACHE);
180         myDisconnectCtrl->SetValue(config.flags & CONFIG_ENABLE_DISCONNECT);
181
182         {
183                 std::stringstream conv;
184                 conv << static_cast<unsigned int>(config.startupDelay);
185                 myStartDelayCtrl->ChangeValue(conv.str());
186         }
187         {
188                 std::stringstream conv;
189                 conv << static_cast<unsigned int>(config.selectionDelay);
190                 mySelDelayCtrl->ChangeValue(conv.str());
191         }
192 }
193
194