1+ Imports CompactJson
2+ Imports DiskImageTool.DiskImage.FloppyDiskFunctions
3+
4+ Namespace Flux.Greaseweazle
5+ Public Class DriveSettings
6+ Implements DiskImageTool.Settings.ISettingsGroup
7+
8+ Public Const MAX_TRACKS As Byte = 84
9+ Public Const MAX_TRACKS_525DD As Byte = 42
10+ Public Const MIN_TRACKS As Byte = 80
11+ Public Const MIN_TRACKS_525DD As Byte = 40
12+
13+ Private _isDirty As Boolean
14+ Private _tracks As Byte = 0
15+
16+ Private _Type As FloppyMediaType = FloppyMediaType.MediaUnknown
17+
18+ Public Property IsDirty As Boolean Implements DiskImageTool.Settings.ISettingsGroup.IsDirty
19+ Get
20+ Return _isDirty
21+ End Get
22+ Set (value As Boolean )
23+ _isDirty = value
24+ End Set
25+ End Property
26+
27+ Public ReadOnly Property Tracks As Byte
28+ Get
29+ Return _tracks
30+ End Get
31+ End Property
32+
33+ Public ReadOnly Property Type As FloppyMediaType
34+ Get
35+ Return _Type
36+ End Get
37+ End Property
38+
39+ Public Shared Function GetMinMax(Type As FloppyMediaType) As (Min As Byte , Max As Byte )
40+ Dim Result As (Min As Byte , Max As Byte )
41+
42+ If Type = FloppyMediaType.MediaUnknown Then
43+ Return ( 0 , 0 )
44+ ElseIf Type = FloppyMediaType.Media525DoubleDensity Then
45+ Return (MIN_TRACKS_525DD, MAX_TRACKS_525DD)
46+ Else
47+ Return (MIN_TRACKS, MAX_TRACKS)
48+ End If
49+
50+ Return Result
51+ End Function
52+
53+ Public Sub LoadFromDictionary(dict As Dictionary( Of String , JsonValue))
54+ If dict Is Nothing Then
55+ MarkClean()
56+ Return
57+ End If
58+
59+ _Type = GetFloppyTypeFromName(ReadValue(dict, "typeName" , GetFloppyTypeName(_Type)))
60+ Dim Tracks As Integer = ReadValue(dict, "tracks" , _tracks)
61+ _tracks = AdjustedTrackCount(Tracks, _Type)
62+
63+ MarkClean()
64+ End Sub
65+
66+ Public Sub MarkClean() Implements DiskImageTool.Settings.ISettingsGroup.MarkClean
67+ _isDirty = False
68+ End Sub
69+
70+ Public Sub SetDrive(Type As FloppyMediaType, Optional TrackCount As Byte = 0 )
71+ Dim Tracks = AdjustedTrackCount(TrackCount, Type)
72+
73+ If _Type <> Type Then
74+ _Type = Type
75+ _isDirty = True
76+ End If
77+
78+ If _tracks <> Tracks Then
79+ _tracks = Tracks
80+ _isDirty = True
81+ End If
82+ End Sub
83+
84+ Public Function ToJsonObject() As Dictionary( Of String , Object )
85+ Return New Dictionary( Of String , Object ) From {
86+ { "typeName" , GetFloppyTypeName(_Type)},
87+ { "tracks" , CInt (_tracks)}
88+ }
89+ End Function
90+
91+ Private Shared Function AdjustedTrackCount(Value As Integer , DriveType As FloppyMediaType) As Byte
92+ Dim MinMax = GetMinMax(DriveType)
93+
94+ If Value = 0 Then
95+ Value = MinMax.Max
96+ ElseIf Value < MinMax.Min Then
97+ Value = MinMax.Min
98+ ElseIf Value > MinMax.Max Then
99+ Value = MinMax.Max
100+ End If
101+
102+ Return Value
103+ End Function
104+
105+ Private Shared Function GetFloppyTypeFromName(Value As String ) As FloppyMediaType
106+ Select Case Value
107+ Case "360"
108+ Return FloppyMediaType.Media525DoubleDensity
109+ Case "720"
110+ Return FloppyMediaType.Media35DoubleDensity
111+ Case "1200"
112+ Return FloppyMediaType.Media525HighDensity
113+ Case "1440"
114+ Return FloppyMediaType.Media35HighDensity
115+ Case "2880"
116+ Return FloppyMediaType.Media35ExtraHighDensity
117+ Case Else
118+ Return FloppyMediaType.MediaUnknown
119+ End Select
120+ End Function
121+
122+ Private Shared Function GetFloppyTypeName(Value As FloppyMediaType) As String
123+ Select Case Value
124+ Case FloppyMediaType.Media525DoubleDensity
125+ Return "360"
126+ Case FloppyMediaType.Media35DoubleDensity
127+ Return "720"
128+ Case FloppyMediaType.Media525HighDensity
129+ Return "1200"
130+ Case FloppyMediaType.Media35HighDensity
131+ Return "1440"
132+ Case FloppyMediaType.Media35ExtraHighDensity
133+ Return "2880"
134+ Case Else
135+ Return ""
136+ End Select
137+ End Function
138+
139+ Private Shared Function ReadValue( Of T)(
140+ dict As Dictionary( Of String , JsonValue),
141+ key As String ,
142+ defaultValue As T) As T
143+
144+ Dim jv As JsonValue = Nothing
145+ If dict Is Nothing OrElse Not dict.TryGetValue( key , jv) OrElse jv Is Nothing Then
146+ Return defaultValue
147+ End If
148+
149+ Try
150+ Dim raw = jv.ToString()
151+ Return Serializer.Parse( Of T)(raw)
152+ Catch
153+ Return defaultValue
154+ End Try
155+ End Function
156+ End Class
157+ End Namespace
0 commit comments