HamBook – Blame information for rev 56
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
54 | office | 1 | using System; |
2 | using System.Collections.Concurrent; |
||
3 | using System.Collections.Generic; |
||
4 | using System.ComponentModel; |
||
5 | using System.Drawing; |
||
6 | using System.Linq; |
||
7 | using System.Threading; |
||
8 | using System.Threading.Tasks; |
||
9 | using System.Windows.Forms; |
||
10 | using HamBook.Properties; |
||
11 | using HamBook.Radios; |
||
12 | using HamBook.Radios.Generic; |
||
56 | office | 13 | using HamBook.Radios.Yaesu.FT_891; |
54 | office | 14 | using HamBook.Utilities; |
56 | office | 15 | using HamBook.Utilities.Serialization; |
54 | office | 16 | using Serilog; |
56 | office | 17 | using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar; |
54 | office | 18 | |
19 | namespace HamBook |
||
20 | { |
||
21 | public partial class MenuForm : Form |
||
22 | { |
||
23 | private static ScheduledContinuation _searchTextBoxChangedContinuation; |
||
56 | office | 24 | private readonly CancellationTokenSource _cancellationTokenSource; |
54 | office | 25 | |
26 | private readonly CatAssemblies _catAssemblies; |
||
56 | office | 27 | private readonly CancellationToken _localCancellationToken; |
28 | private readonly CancellationTokenSource _localCancellationTokenSource; |
||
54 | office | 29 | private CancellationToken _cancellationToken; |
56 | office | 30 | private CancellationTokenSource _readCancellationTokenSource; |
54 | office | 31 | private CancellationTokenSource _readLinkedCancellationTokenSource; |
32 | private Task _readMenuTask; |
||
33 | private CancellationTokenSource _writeCancellationTokenSource; |
||
34 | private CancellationTokenSource _writeLinkedCancellationTokenSource; |
||
35 | private Task _writeMenuTask; |
||
56 | office | 36 | private readonly Radios.Generic.RadioMenu _radioMenu; |
54 | office | 37 | |
38 | public MenuForm() |
||
39 | { |
||
40 | InitializeComponent(); |
||
41 | Utilities.WindowState.FormTracker.Track(this); |
||
42 | |||
43 | _localCancellationTokenSource = new CancellationTokenSource(); |
||
44 | _localCancellationToken = _localCancellationTokenSource.Token; |
||
45 | } |
||
46 | |||
47 | public MenuForm(Configuration.Configuration configuration, CatAssemblies catAssemblies, |
||
48 | CancellationToken cancellationToken) : this() |
||
49 | { |
||
50 | Configuration = configuration; |
||
51 | _catAssemblies = catAssemblies; |
||
52 | _cancellationToken = cancellationToken; |
||
53 | |||
54 | _searchTextBoxChangedContinuation = new ScheduledContinuation(); |
||
56 | office | 55 | _radioMenu = Radios.Generic.RadioMenu.Create(Configuration.Radio); |
54 | office | 56 | |
57 | _cancellationTokenSource = |
||
58 | CancellationTokenSource.CreateLinkedTokenSource(_localCancellationToken, cancellationToken); |
||
59 | _cancellationToken = _cancellationTokenSource.Token; |
||
60 | } |
||
61 | |||
62 | private Configuration.Configuration Configuration { get; } |
||
63 | |||
64 | private void AddMenuItem<T>(string menuIndex, string menuFunction, Func<IEnumerable<T>> values, |
||
65 | T defaultValue = default, int index = -1) |
||
66 | { |
||
67 | if (index == -1) index = dataGridView1.Rows.Add(); |
||
68 | |||
69 | dataGridView1.Rows[index].Cells["IndexColumn"].Value = menuIndex; |
||
70 | dataGridView1.Rows[index].Cells["FunctionColumn"].Value = menuFunction; |
||
71 | |||
72 | foreach (var value in values.Invoke()) |
||
73 | { |
||
74 | ((DataGridViewComboBoxCell)dataGridView1.Rows[index].Cells["ValueColumn"]).Items.Add($"{value}"); |
||
75 | ((DataGridViewComboBoxCell)dataGridView1.Rows[index].Cells["ValueColumn"]).Value = $"{defaultValue}"; |
||
76 | } |
||
77 | } |
||
78 | |||
79 | private void MenuForm_Load(object sender, EventArgs e) |
||
80 | { |
||
81 | // Generate columns based on radio type. |
||
82 | switch (Configuration.Radio) |
||
83 | { |
||
84 | case "Yaesu FT-891": |
||
85 | dataGridView1.Columns.Add(new DataGridViewTextBoxColumn |
||
86 | { Name = "IndexColumn", HeaderText = "Index", ReadOnly = true }); |
||
87 | dataGridView1.Columns.Add(new DataGridViewTextBoxColumn |
||
88 | { Name = "FunctionColumn", HeaderText = "Function", ReadOnly = true }); |
||
89 | dataGridView1.Columns.Add(new DataGridViewComboBoxColumn |
||
90 | { Name = "ValueColumn", HeaderText = "Value" }); |
||
91 | |||
92 | |||
93 | AddMenuItem("0101", "AGC FAST DELAY", () => { return Mathematics.GenerateRange(20, 4000, 20); }, |
||
94 | 300); |
||
95 | |||
96 | AddMenuItem("0102", "AGC MID DELAY", () => { return Mathematics.GenerateRange(20, 4000, 20); }, |
||
97 | 700); |
||
98 | |||
99 | AddMenuItem("0103", "AGC SLOW DELAY", () => { return Mathematics.GenerateRange(20, 4000, 20); }, |
||
100 | 3000); |
||
101 | |||
102 | AddMenuItem("0201", "LCD CONTRAST", () => { return Mathematics.GenerateRange(1, 15); }, 8); |
||
103 | |||
104 | AddMenuItem("0202", "DIMMER BACKLIT", () => { return Mathematics.GenerateRange(1, 15); }, 8); |
||
105 | |||
106 | AddMenuItem("0203", "DIMMER LCD", () => { return Mathematics.GenerateRange(1, 15); }, 8); |
||
107 | |||
108 | AddMenuItem("0204", "DIMMER TX/BUSY", () => { return Mathematics.GenerateRange(1, 15); }, 8); |
||
109 | |||
110 | AddMenuItem("0205", "PEAK HOLD", () => { return new[] { "OFF", "0.5", "1.0", "2.0" }; }, "OFF"); |
||
111 | |||
112 | AddMenuItem("0206", "ZIN LED", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE"); |
||
113 | |||
114 | AddMenuItem("0207", "POP-UP MENU", () => { return new[] { "UPPER", "LOWER" }; }, "LOWER"); |
||
115 | |||
116 | AddMenuItem("0301", "DVS RX OUT LVL", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
117 | |||
118 | AddMenuItem("0302", "DVS TX OUT LVL", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
119 | |||
120 | AddMenuItem("0401", "KEYER TYPE", |
||
121 | () => |
||
122 | { |
||
123 | return new[] { "OFF", "BUG", "ELEKEY-A", "ELEKEY-B", "ELEKEY-Y", "ACS" }; |
||
124 | }, "ELEKEY-B"); |
||
125 | |||
126 | AddMenuItem("0402", "KEYER DOT/DASH", () => { return new[] { "NOR", "KEY" }; }, "NOR"); |
||
127 | |||
128 | AddMenuItem("0403", "CW WEIGHT", () => |
||
129 | { |
||
130 | var value = new List<string>(); |
||
131 | for (var i = 2.0; i <= 4.5; i += 0.1) |
||
132 | { |
||
133 | var v = $"{(decimal)i:f1}"; |
||
134 | value.Add(v); |
||
135 | } |
||
136 | |||
137 | return value; |
||
138 | }, "3.0"); |
||
139 | |||
140 | AddMenuItem("0404", "BEACON INTERVAL", |
||
56 | office | 141 | () => |
142 | { |
||
143 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(1, 690).Select(i => i.ToString())); |
||
144 | }, |
||
54 | office | 145 | "OFF"); |
146 | |||
147 | AddMenuItem("0405", "NUMBER STYLE", |
||
148 | () => { return new[] { "1290", "AUNO", "AUNT", "A2NO", "A2NT", "12NO", "12NT" }; }, "1290"); |
||
149 | |||
150 | AddMenuItem("0406", "CONTEST NUMBER", () => { return Mathematics.GenerateRange(0, 9999); }, 1); |
||
151 | |||
152 | AddMenuItem("0407", "CW MEMORY 1", () => { return new[] { "TEXT", "MESSAGE" }; }, "TEXT"); |
||
153 | |||
154 | AddMenuItem("0408", "CW MEMORY 2", () => { return new[] { "TEXT", "MESSAGE" }; }, "TEXT"); |
||
155 | |||
156 | AddMenuItem("0409", "CW MEMORY 3", () => { return new[] { "TEXT", "MESSAGE" }; }, "TEXT"); |
||
157 | |||
158 | AddMenuItem("0410", "CW MEMORY 4", () => { return new[] { "TEXT", "MESSAGE" }; }, "TEXT"); |
||
159 | |||
160 | AddMenuItem("0411", "CW MEMORY 5", () => { return new[] { "TEXT", "MESSAGE" }; }, "TEXT"); |
||
161 | |||
162 | AddMenuItem("0501", "NB WIDTH", () => { return new[] { 1, 3, 10 }; }, 3); |
||
163 | |||
164 | AddMenuItem("0502", "NB REJECTION", () => { return new[] { 10, 30, 50 }; }, 30); |
||
165 | |||
166 | AddMenuItem("0503", "NB LEVEL", () => { return Mathematics.GenerateRange(0, 10); }, 5); |
||
167 | |||
168 | AddMenuItem("0504", "BEEP LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 30); |
||
169 | |||
170 | AddMenuItem("0505", "RF/SQL VR", () => { return new[] { "RF", "SQL" }; }, "RF"); |
||
171 | |||
172 | AddMenuItem("0506", "CAT RATE", () => { return new[] { 4800, 9600, 19200, 38400 }; }, 9600); |
||
173 | |||
174 | AddMenuItem("0507", "CAT TOT", () => { return new[] { 10, 100, 1000, 3000 }; }, 1000); |
||
175 | |||
176 | AddMenuItem("0508", "CAT RTS", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE"); |
||
177 | |||
178 | AddMenuItem("0509", "MEM GROUP", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE"); |
||
179 | |||
180 | AddMenuItem("0510", "FM SETTING", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE"); |
||
181 | |||
182 | AddMenuItem("0511", "REC SETTING", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE"); |
||
183 | |||
184 | AddMenuItem("0512", "ATAS SETTING", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE"); |
||
185 | |||
186 | AddMenuItem("0513", "QUICK SPL FREQ", () => { return Mathematics.GenerateRange(-20, 20); }, 5); |
||
187 | |||
188 | AddMenuItem("0514", "TX TOT", |
||
189 | () => |
||
190 | { |
||
191 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(1, 30).Select(i => i.ToString())); |
||
192 | }, "OFF"); |
||
193 | |||
194 | AddMenuItem("0515", "MIC SCAN", () => { return new[] { "DISABLE", "ENABLE" }; }, "ENABLE"); |
||
195 | |||
196 | AddMenuItem("0516", "MIC SCAN RESUME", () => { return new[] { "PAUSE", "TIME" }; }, "TIME"); |
||
197 | |||
198 | AddMenuItem("0517", "REF FREQ ADJ", () => { return Mathematics.GenerateRange(-25, 25); }); |
||
199 | |||
200 | AddMenuItem("0518", "CLAR SELECT", () => { return new[] { "RX", "TX", "TRX" }; }, "RX"); |
||
201 | |||
202 | AddMenuItem("0519", "APO", () => { return new[] { "OFF", "1", "2", "4", "6", "8", "10", "12" }; }, |
||
203 | "RX"); |
||
204 | |||
205 | AddMenuItem("0520", "FAN CONTROL", () => { return new[] { "NORMAL", "CONTEST" }; }, "NORMAL"); |
||
206 | |||
207 | AddMenuItem("0601", "AM LCUT FREQ", |
||
208 | () => |
||
209 | { |
||
210 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50) |
||
211 | .Select(i => i.ToString())); |
||
212 | }, "OFF"); |
||
213 | |||
214 | AddMenuItem("0602", "AM LCUT SLOPE", () => { return new[] { 6, 18 }; }, 6); |
||
215 | |||
216 | AddMenuItem("0603", "AM HCUT FREQ", |
||
217 | () => |
||
218 | { |
||
219 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50) |
||
220 | .Select(i => i.ToString())); |
||
221 | }, "OFF"); |
||
222 | |||
223 | AddMenuItem("0604", "AM HCUT SLOPE", () => { return new[] { 6, 18 }; }, 6); |
||
224 | |||
225 | AddMenuItem("0605", "AM MIC SELECT", () => { return new[] { "MIC", "REAR" }; }, "MIC"); |
||
226 | |||
227 | AddMenuItem("0606", "AM OUT LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
228 | |||
229 | AddMenuItem("0607", "AM PTT SELECT", () => { return new[] { "DAKY", "RTS", "DTR" }; }, "DAKY"); |
||
230 | |||
231 | AddMenuItem("0701", "CW LCUT FREQ", |
||
232 | () => |
||
233 | { |
||
234 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50) |
||
235 | .Select(i => i.ToString())); |
||
236 | }, "250"); |
||
237 | |||
238 | AddMenuItem("0702", "CW LCUT SLOPE", () => { return new[] { 6, 18 }; }, 18); |
||
239 | |||
240 | AddMenuItem("0703", "CW HCUT FREQ", |
||
241 | () => |
||
242 | { |
||
243 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50) |
||
244 | .Select(i => i.ToString())); |
||
245 | }, "1200"); |
||
246 | |||
247 | AddMenuItem("0704", "CW HCUT SLOPE", () => { return new[] { 6, 18 }; }, 18); |
||
248 | |||
249 | AddMenuItem("0705", "CW OUT LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
250 | |||
251 | AddMenuItem("0706", "CW AUTO MODE", () => { return new[] { "OFF", "50M", "ON" }; }, "OFF"); |
||
252 | |||
253 | AddMenuItem("0707", "CW BFO", () => { return new[] { "USB", "LSB", "AUTO" }; }, "USB"); |
||
254 | |||
255 | AddMenuItem("0708", "CW BK-IN TYPE", () => { return new[] { "SEMI", "FULL" }; }, "SEMI"); |
||
256 | |||
257 | AddMenuItem("0709", "CW BK-IN DELAY", () => { return Mathematics.GenerateRange(30, 3000, 10); }, |
||
258 | 200); |
||
259 | |||
260 | AddMenuItem("0710", "CW WAVE SHAPE", () => { return new[] { string.Empty, "2", "4" }; }, "4"); |
||
261 | |||
262 | AddMenuItem("0711", "CW FREQ DISPLAY", () => { return new[] { "FREQ", "PITCH" }; }, "PITCH"); |
||
263 | |||
264 | AddMenuItem("0712", "PC KEYING", () => { return new[] { "OFF", "DAKY", "RTS", "DTR" }; }, "OFF"); |
||
265 | |||
266 | AddMenuItem("0713", "QSK DELAY TIME", () => { return new[] { 15, 20, 25, 30 }; }, 15); |
||
267 | |||
268 | AddMenuItem("0801", "DATA MODE", () => { return new[] { "PSK", "OTHERS" }; }, "OTHERS"); |
||
269 | |||
270 | AddMenuItem("0802", "PSK TONE", () => { return new[] { 1000, 1500, 2000 }; }, 1000); |
||
271 | |||
272 | AddMenuItem("0803", "OTHER DISP", () => { return Mathematics.GenerateRange(-3000, 3000, 10); }, |
||
273 | 1000); |
||
274 | |||
275 | AddMenuItem("0804", "OTHER SHIFT", () => { return Mathematics.GenerateRange(-3000, 3000, 10); }, |
||
276 | 1500); |
||
277 | |||
278 | AddMenuItem("0805", "DATA LCUT FREQ", |
||
279 | () => |
||
280 | { |
||
281 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50) |
||
282 | .Select(i => i.ToString())); |
||
283 | }, "OFF"); |
||
284 | |||
285 | AddMenuItem("0806", "DATA LCUT SLOPE", () => { return new[] { 6, 18 }; }, 18); |
||
286 | |||
287 | AddMenuItem("0807", "DATA HCUT FREQ", |
||
288 | () => |
||
289 | { |
||
290 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50) |
||
291 | .Select(i => i.ToString())); |
||
292 | }, "OFF"); |
||
293 | |||
294 | AddMenuItem("0808", "DATA HCUT SLOPE", () => { return new[] { 6, 18 }; }, 18); |
||
295 | |||
296 | AddMenuItem("0809", "DATA IN SELECT", () => { return new[] { "MIC", "REAR" }; }, "REAR"); |
||
297 | |||
298 | AddMenuItem("0810", "DATA PTT SELECT", () => { return new[] { "DAKY", "RTS", "DTR" }; }, "DAKY"); |
||
299 | |||
300 | AddMenuItem("0811", "DATA OUT LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
301 | |||
302 | AddMenuItem("0812", "DATA BFO", () => { return new[] { "USB", "LSB" }; }, "USB"); |
||
303 | |||
304 | AddMenuItem("0901", "FM MIC SELECT", () => { return new[] { "MIC", "REAR" }; }, "MIC"); |
||
305 | |||
306 | AddMenuItem("0902", "FM OUT LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
307 | |||
308 | AddMenuItem("0903", "PKT PTT SELECT", () => { return new[] { "DAKY", "RTS", "DTR" }; }, "DAKY"); |
||
309 | |||
310 | AddMenuItem("0904", "RPT SHIFT 28MHz", () => { return Mathematics.GenerateRange(0, 1000, 10); }, |
||
311 | 100); |
||
312 | |||
313 | AddMenuItem("0905", "RPT SHIFT 50MHz", () => { return Mathematics.GenerateRange(0, 4000, 10); }, |
||
314 | 100); |
||
315 | |||
316 | AddMenuItem("0906", "DCS POLARITY", |
||
317 | () => { return new[] { "Tn-Rn", "Tn-Riv", "Tiv-Rn", "Tiv-Riv" }; }, "Tn-Rn"); |
||
318 | |||
319 | AddMenuItem("1001", "RTTY LCUT FREQ", |
||
320 | () => |
||
321 | { |
||
322 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50) |
||
323 | .Select(i => i.ToString())); |
||
324 | }, "300"); |
||
325 | |||
326 | AddMenuItem("1002", "RTTY LCUT SLOPE", () => { return new[] { 6, 18 }; }, 18); |
||
327 | |||
328 | AddMenuItem("1003", "RTTY HCUT FREQ", |
||
329 | () => |
||
330 | { |
||
331 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50) |
||
332 | .Select(i => i.ToString())); |
||
333 | }, "OFF"); |
||
334 | |||
335 | AddMenuItem("1004", "RTTY HCUT SLOPE", () => { return new[] { 6, 18 }; }, 18); |
||
336 | |||
337 | AddMenuItem("1005", "RTTY SHIFT PORT", () => { return new[] { "SHIFT", "DTR", "RTS" }; }, "SHIFT"); |
||
338 | |||
339 | AddMenuItem("1006", "RTTY POLARITY-R", () => { return new[] { "NOR", "REV" }; }, "NOR"); |
||
340 | |||
341 | AddMenuItem("1007", "RTTY POLARITY-T", () => { return new[] { "NOR", "REV" }; }, "NOR"); |
||
342 | |||
343 | AddMenuItem("1008", "RTTY OUT LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
344 | |||
345 | AddMenuItem("1009", "RTTY SHIFT FREQ", () => { return new[] { 170, 200, 425, 850 }; }, 170); |
||
346 | |||
347 | AddMenuItem("1010", "RTTY MARK FREQ", () => { return new[] { 1275, 2125 }; }, 2125); |
||
348 | |||
349 | AddMenuItem("1011", "RTTY BFO", () => { return new[] { "USB", "LSB" }; }, "LSB"); |
||
350 | |||
351 | AddMenuItem("1101", "SSB LCUT FREQ", |
||
352 | () => |
||
353 | { |
||
354 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 1000, 50) |
||
355 | .Select(i => i.ToString())); |
||
356 | }, "100"); |
||
357 | |||
358 | AddMenuItem("1102", "SSB LCUT SLOPE", () => { return new[] { 6, 18 }; }, 6); |
||
359 | |||
360 | AddMenuItem("1103", "SSB HCUT FREQ", |
||
361 | () => |
||
362 | { |
||
363 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 4000, 50) |
||
364 | .Select(i => i.ToString())); |
||
365 | }, "3000"); |
||
366 | |||
367 | AddMenuItem("1104", "SSB HCUT SLOPE", () => { return new[] { 6, 18 }; }, 6); |
||
368 | |||
369 | AddMenuItem("1105", "SSB MIC SELECT", () => { return new[] { "MIC", "REAR" }; }, "REAR"); |
||
370 | |||
371 | AddMenuItem("1106", "RTTY OUT LEVEL", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
372 | |||
373 | AddMenuItem("1107", "SSB BFO", () => { return new[] { "USB", "LSB", "AUTO" }; }, "USB"); |
||
374 | |||
375 | AddMenuItem("1108", "SSB PTT SELECT", () => { return new[] { "DAKY", "RTS", "DTR" }; }, "DAKY"); |
||
376 | |||
377 | AddMenuItem("1109", "SSB TX BPF", |
||
378 | () => { return new[] { "100-3000", "100-2900", "200-2800", "300-2700", "400-2600" }; }, |
||
379 | "300-2700"); |
||
380 | |||
381 | AddMenuItem("1201", "APF WIDTH", () => { return new[] { "NARROW", "MEDIUM", "WIDE" }; }, "MEDIUM"); |
||
382 | |||
383 | AddMenuItem("1202", "CONTOUR LEVEL", () => { return Mathematics.GenerateRange(-40, 20); }, -15); |
||
384 | |||
385 | AddMenuItem("1203", "CONTOUR WIDTH", () => { return Mathematics.GenerateRange(1, 11); }, 10); |
||
386 | |||
387 | AddMenuItem("1204", "IF NOTCH WIDTH", () => { return new[] { "NARROW", "WIDE" }; }, "WIDE"); |
||
388 | |||
389 | AddMenuItem("1301", "SCP START CYCLE", () => { return new[] { "OFF", "3", "5", "10" }; }, "OFF"); |
||
390 | |||
391 | AddMenuItem("1302", "SCP SPAN FREQ", () => { return new[] { 37.5, 75, 150, 375, 750 }; }, 750); |
||
392 | |||
393 | AddMenuItem("1401", "QUICK DIAL", () => { return new[] { 50, 100, 500 }; }, 500); |
||
394 | |||
395 | AddMenuItem("1402", "SSB DIAL STEP", () => { return new[] { 2, 5, 10 }; }, 10); |
||
396 | |||
397 | AddMenuItem("1403", "AM DIAL STEP", () => { return new[] { 10, 100 }; }, 10); |
||
398 | |||
399 | AddMenuItem("1404", "FM DIAL STEP", () => { return new[] { 10, 100 }; }, 100); |
||
400 | |||
401 | AddMenuItem("1405", "DIAL STEP", () => { return new[] { 2, 5, 10 }; }, 5); |
||
402 | |||
403 | AddMenuItem("1406", "AM CH STEP", () => { return new[] { 2.5, 5, 2.9, 10, 12.5, 25 }; }, 5); |
||
404 | |||
405 | AddMenuItem("1407", "FM CH STEP", () => { return new[] { 5, 6.25, 10, 12.5, 15, 20, 25 }; }, 5); |
||
406 | |||
407 | AddMenuItem("1501", "EQ1 FREQ", |
||
408 | () => |
||
409 | { |
||
410 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 700, 100) |
||
411 | .Select(i => i.ToString())); |
||
412 | }, "OFF"); |
||
413 | |||
414 | AddMenuItem("1502", "EQ1 LEVEL", () => { return Mathematics.GenerateRange(-20, 10); }, 5); |
||
415 | |||
416 | AddMenuItem("1503", "EQ1 BWTH", () => { return Mathematics.GenerateRange(1, 10); }, 10); |
||
417 | |||
418 | AddMenuItem("1504", "EQ2 FREQ", |
||
419 | () => |
||
420 | { |
||
421 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 1500, 100) |
||
422 | .Select(i => i.ToString())); |
||
423 | }, "OFF"); |
||
424 | |||
425 | AddMenuItem("1505", "EQ2 LEVEL", () => { return Mathematics.GenerateRange(-20, 10); }, 5); |
||
426 | |||
427 | AddMenuItem("1506", "EQ2 BWTH", () => { return Mathematics.GenerateRange(1, 10); }, 10); |
||
428 | |||
429 | AddMenuItem("1507", "EQ3 FREQ", |
||
430 | () => |
||
431 | { |
||
432 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(1500, 3200, 100) |
||
433 | .Select(i => i.ToString())); |
||
434 | }, "OFF"); |
||
435 | |||
436 | AddMenuItem("1508", "EQ3 LEVEL", () => { return Mathematics.GenerateRange(-20, 10); }, 5); |
||
437 | |||
438 | AddMenuItem("1509", "EQ3 BWTH", () => { return Mathematics.GenerateRange(1, 10); }, 10); |
||
439 | |||
440 | AddMenuItem("1510", "P-EQ1 FREQ", |
||
441 | () => |
||
442 | { |
||
443 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(100, 700, 100) |
||
444 | .Select(i => i.ToString())); |
||
445 | }, "200"); |
||
446 | |||
447 | AddMenuItem("1511", "P-EQ1 LEVEL", () => { return Mathematics.GenerateRange(-20, 10); }); |
||
448 | |||
449 | AddMenuItem("1512", "P-EQ1 BWTH", () => { return Mathematics.GenerateRange(1, 10); }, 2); |
||
450 | |||
451 | AddMenuItem("1513", "P-EQ2 FREQ", |
||
452 | () => |
||
453 | { |
||
454 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(700, 1500, 100) |
||
455 | .Select(i => i.ToString())); |
||
456 | }, "800"); |
||
457 | |||
458 | AddMenuItem("1514", "P-EQ2 LEVEL", () => { return Mathematics.GenerateRange(-20, 10); }); |
||
459 | |||
460 | AddMenuItem("1515", "P-EQ2 BWTH", () => { return Mathematics.GenerateRange(1, 10); }, 1); |
||
461 | |||
462 | AddMenuItem("1516", "P-EQ3 FREQ", |
||
463 | () => |
||
464 | { |
||
465 | return new[] { "OFF" }.Concat(Mathematics.GenerateRange(1500, 3200, 100) |
||
466 | .Select(i => i.ToString())); |
||
467 | }, "2100"); |
||
468 | |||
469 | AddMenuItem("1517", "P-EQ3 LEVEL", () => { return Mathematics.GenerateRange(-20, 10); }); |
||
470 | |||
471 | AddMenuItem("1518", "P-EQ3 BWTH", () => { return Mathematics.GenerateRange(1, 10); }, 1); |
||
472 | |||
473 | AddMenuItem("1601", "HF SSB PWR", () => { return Mathematics.GenerateRange(5, 100); }, 100); |
||
474 | |||
475 | AddMenuItem("1602", "HF AM PWR", () => { return Mathematics.GenerateRange(5, 40); }, 40); |
||
476 | |||
477 | AddMenuItem("1603", "HF PWR", () => { return Mathematics.GenerateRange(5, 100); }, 100); |
||
478 | |||
479 | AddMenuItem("1604", "50M SSB PWR", () => { return Mathematics.GenerateRange(5, 100); }, 100); |
||
480 | |||
481 | AddMenuItem("1605", "50M AM PWR", () => { return Mathematics.GenerateRange(5, 40); }, 40); |
||
482 | |||
483 | AddMenuItem("1606", "50M PWR", () => { return Mathematics.GenerateRange(5, 100); }, 100); |
||
484 | |||
485 | AddMenuItem("1607", "SSB MIC GAIN", () => { return Mathematics.GenerateRange(5, 100); }, 50); |
||
486 | |||
487 | AddMenuItem("1608", "AM MIC GAIN", () => { return Mathematics.GenerateRange(5, 100); }, 50); |
||
488 | |||
489 | AddMenuItem("1609", "FM MIC GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
490 | |||
491 | AddMenuItem("1610", "DATA MIC GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
492 | |||
493 | AddMenuItem("1611", "SSB DATA GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
494 | |||
495 | AddMenuItem("1612", "AM DATA GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
496 | |||
497 | AddMenuItem("1613", "FM DATA GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
498 | |||
499 | AddMenuItem("1614", "DATA DATA GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
500 | |||
501 | AddMenuItem("1615", "TUNER SELECT", () => { return new[] { "OFF", "EXTERNAL", "ATAS", "LAMP" }; }, |
||
502 | "OFF"); |
||
503 | |||
504 | AddMenuItem("1616", "VOX SELECT", () => { return new[] { "MIC", "DATA" }; }, "MIC"); |
||
505 | |||
506 | AddMenuItem("1617", "VOX GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
507 | |||
508 | AddMenuItem("1618", "VOX DELAY", () => { return Mathematics.GenerateRange(30, 3000, 10); }, 1000); |
||
509 | |||
510 | AddMenuItem("1619", "ANTI VOX GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
511 | |||
512 | AddMenuItem("1620", "DATA VOX GAIN", () => { return Mathematics.GenerateRange(0, 100); }, 50); |
||
513 | |||
514 | AddMenuItem("1621", "DATA VOX DELAY", () => { return Mathematics.GenerateRange(30, 3000); }, 100); |
||
515 | |||
516 | AddMenuItem("1622", "ANTI DVOX GAIN", () => { return Mathematics.GenerateRange(0, 100); }); |
||
517 | |||
518 | AddMenuItem("1623", "EMERGENCY FREQ", () => { return new[] { "DISABLE", "ENABLE" }; }, "DISABLE"); |
||
519 | |||
520 | break; |
||
521 | } |
||
522 | |||
523 | _readCancellationTokenSource = new CancellationTokenSource(); |
||
524 | _readLinkedCancellationTokenSource = |
||
525 | CancellationTokenSource.CreateLinkedTokenSource(new[] |
||
526 | { _cancellationTokenSource.Token, _cancellationToken }); |
||
527 | |||
528 | _readMenuTask = ReadMenu(_readCancellationTokenSource.Token); |
||
529 | } |
||
530 | |||
531 | private async Task WriteMenu(CancellationToken cancellationToken) |
||
532 | { |
||
533 | var rows = GetAllDataGridViewRows(dataGridView1); |
||
534 | |||
535 | if (!rows.Any()) return; |
||
536 | |||
537 | var list = rows.ToList(); |
||
538 | |||
539 | var count = list.Count; |
||
540 | |||
541 | toolStripProgressBar1.Minimum = 0; |
||
542 | toolStripProgressBar1.Maximum = count; |
||
543 | toolStripProgressBar1.Value = toolStripProgressBar1.Minimum; |
||
544 | |||
545 | var progress = new Progress<DataGridViewRowProgress>(rowProgress => |
||
546 | { |
||
547 | try |
||
548 | { |
||
549 | switch (rowProgress) |
||
550 | { |
||
551 | case DataGridViewRowProgressSuccess<int> rowProgressSuccess: |
||
552 | dataGridView1.Rows[rowProgressSuccess.Row.Index].DefaultCellStyle.BackColor = |
||
553 | DefaultBackColor; |
||
554 | toolStripStatusLabel1.Text = $"{Resources.Wrote_menu} {rowProgressSuccess.Data:0000}"; |
||
555 | break; |
||
556 | case DataGridViewRowProgressFailure<int> rowProgressFailure: |
||
557 | Log.Error(rowProgressFailure.Exception, $"{Resources.Could_not_read_menu}"); |
||
558 | dataGridView1.Rows[rowProgressFailure.Row.Index].DefaultCellStyle.BackColor = Color.Red; |
||
559 | |||
56 | office | 560 | toolStripStatusLabel1.Text = |
561 | $"{Resources.Could_not_write_menu} {rowProgressFailure.Data:0000}"; |
||
54 | office | 562 | break; |
563 | } |
||
564 | |||
565 | toolStripProgressBar1.Increment(1); |
||
566 | statusStrip1.Update(); |
||
567 | } |
||
568 | catch (Exception exception) |
||
569 | { |
||
570 | Log.Error(exception, Resources.Unexpected_error_while_reading_memory_bank); |
||
571 | } |
||
572 | }); |
||
573 | |||
574 | await Task.Run(() => WriteMenu(list, progress, cancellationToken), cancellationToken); |
||
575 | |||
576 | if (!_cancellationToken.IsCancellationRequested) |
||
577 | { |
||
578 | toolStripProgressBar1.Value = toolStripProgressBar1.Maximum; |
||
579 | toolStripStatusLabel1.Text = "Done."; |
||
580 | } |
||
581 | } |
||
582 | |||
583 | private async Task WriteMenu(IReadOnlyList<DataGridViewRow> rows, IProgress<DataGridViewRowProgress> progress, |
||
584 | CancellationToken cancellationToken) |
||
585 | { |
||
586 | var count = rows.Count; |
||
587 | |||
588 | for (var i = 0; i < count && !cancellationToken.IsCancellationRequested; ++i) |
||
589 | { |
||
56 | office | 590 | if (!int.TryParse($"{rows[i].Cells["IndexColumn"].Value}", out var menu)) continue; |
54 | office | 591 | |
592 | try |
||
593 | { |
||
594 | var value = $"{rows[i].Cells["ValueColumn"].Value}"; |
||
595 | |||
56 | office | 596 | var parameter = _radioMenu.MenuToCAT(menu, value); |
597 | |||
54 | office | 598 | await _catAssemblies.CatWriteAsync<int>("EX", new object[] { menu, parameter }, cancellationToken); |
599 | |||
600 | progress.Report(new DataGridViewRowProgressSuccess<int>(rows[i], i, menu)); |
||
601 | } |
||
602 | catch (UnexpectedRadioResponseException exception) |
||
603 | { |
||
604 | progress.Report(new DataGridViewRowProgressFailure<int>(rows[i], i, exception, menu)); |
||
605 | } |
||
606 | catch (Exception exception) |
||
607 | { |
||
608 | progress.Report(new DataGridViewRowProgressFailure<int>(rows[i], i, exception, menu)); |
||
609 | } |
||
610 | } |
||
611 | } |
||
612 | |||
613 | private async Task ReadMenu(CancellationToken cancellationToken) |
||
614 | { |
||
615 | var rows = GetAllDataGridViewRows(dataGridView1); |
||
616 | |||
617 | if (!rows.Any()) return; |
||
618 | |||
619 | var list = rows.ToList(); |
||
620 | |||
621 | var count = list.Count; |
||
622 | |||
623 | toolStripProgressBar1.Minimum = 0; |
||
624 | toolStripProgressBar1.Maximum = count; |
||
625 | toolStripProgressBar1.Value = toolStripProgressBar1.Minimum; |
||
626 | |||
627 | var progress = new Progress<DataGridViewRowProgress>(rowProgress => |
||
628 | { |
||
629 | try |
||
630 | { |
||
631 | switch (rowProgress) |
||
632 | { |
||
633 | case DataGridViewRowProgressSuccess<int> rowProgressSuccess: |
||
634 | dataGridView1.Rows[rowProgressSuccess.Row.Index].DefaultCellStyle.BackColor = |
||
635 | DefaultBackColor; |
||
636 | |||
637 | if (!int.TryParse( |
||
638 | $"{dataGridView1.Rows[rowProgressSuccess.Row.Index].Cells["IndexColumn"].Value}", |
||
639 | out var menu)) throw new ArgumentException(Resources.Invalid_menu_item); |
||
640 | |||
641 | switch (Configuration.Radio) |
||
642 | { |
||
643 | case "Yaesu FT-891": |
||
644 | switch (menu) |
||
645 | { |
||
646 | case 403: |
||
647 | var v403 = $"{rowProgressSuccess.Data}".ToCharArray(); |
||
648 | dataGridView1.Rows[rowProgressSuccess.Row.Index].Cells["ValueColumn"] |
||
649 | .Value = $"{v403[0]}.{v403[1]}"; |
||
650 | break; |
||
651 | case 205: |
||
652 | case 206: |
||
653 | case 207: |
||
654 | case 401: |
||
655 | case 402: |
||
656 | case 404: |
||
657 | case 405: |
||
658 | case 407: |
||
659 | case 408: |
||
660 | case 409: |
||
661 | case 410: |
||
662 | case 411: |
||
663 | case 501: |
||
664 | case 502: |
||
665 | case 505: |
||
666 | case 506: |
||
667 | case 507: |
||
668 | case 508: |
||
669 | case 509: |
||
670 | case 510: |
||
671 | case 511: |
||
672 | case 512: |
||
673 | case 514: |
||
674 | case 515: |
||
675 | case 516: |
||
676 | case 518: |
||
677 | case 519: |
||
678 | case 520: |
||
679 | case 601: |
||
680 | case 602: |
||
681 | case 603: |
||
682 | case 605: |
||
683 | case 607: |
||
684 | case 701: |
||
685 | case 702: |
||
686 | case 703: |
||
687 | case 704: |
||
688 | case 706: |
||
689 | case 707: |
||
690 | case 708: |
||
691 | case 710: |
||
692 | case 711: |
||
693 | case 712: |
||
694 | case 713: |
||
695 | case 801: |
||
696 | case 802: |
||
697 | case 805: |
||
698 | case 806: |
||
699 | case 807: |
||
700 | case 808: |
||
701 | case 809: |
||
702 | case 810: |
||
703 | case 811: |
||
704 | case 812: |
||
705 | case 901: |
||
706 | case 902: |
||
707 | case 903: |
||
708 | case 906: |
||
709 | case 1001: |
||
710 | case 1002: |
||
711 | case 1003: |
||
712 | case 1004: |
||
713 | case 1005: |
||
714 | case 1006: |
||
715 | case 1007: |
||
716 | case 1009: |
||
717 | case 1010: |
||
718 | case 1011: |
||
719 | case 1101: |
||
720 | case 1102: |
||
721 | case 1103: |
||
722 | case 1104: |
||
723 | case 1105: |
||
724 | case 1107: |
||
725 | case 1108: |
||
726 | case 1109: |
||
727 | case 1201: |
||
728 | case 1204: |
||
729 | case 1301: |
||
730 | case 1302: |
||
731 | case 1401: |
||
732 | case 1402: |
||
733 | case 1403: |
||
734 | case 1404: |
||
735 | case 1405: |
||
736 | case 1406: |
||
737 | case 1407: |
||
738 | case 1501: |
||
739 | case 1504: |
||
740 | case 1507: |
||
741 | case 1510: |
||
742 | case 1513: |
||
743 | case 1516: |
||
744 | case 1615: |
||
745 | case 1616: |
||
746 | case 1623: |
||
747 | var value = (dataGridView1.Rows[rowProgressSuccess.Row.Index] |
||
748 | .Cells["ValueColumn"] as DataGridViewComboBoxCell) |
||
749 | .Items[rowProgressSuccess.Data]; |
||
750 | dataGridView1.Rows[rowProgressSuccess.Row.Index].Cells["ValueColumn"] |
||
751 | .Value = $"{value}"; |
||
752 | break; |
||
753 | default: |
||
754 | dataGridView1.Rows[rowProgressSuccess.Row.Index].Cells["ValueColumn"] |
||
755 | .Value = $"{rowProgressSuccess.Data}"; |
||
756 | break; |
||
757 | } |
||
758 | |||
759 | break; |
||
760 | } |
||
761 | |||
762 | toolStripStatusLabel1.Text = $"{Resources.Read_menu} {menu:0000}"; |
||
763 | break; |
||
764 | case DataGridViewRowProgressFailure<int> rowProgressFailure: |
||
765 | Log.Error(rowProgressFailure.Exception, $"{Resources.Could_not_read_menu}"); |
||
766 | dataGridView1.Rows[rowProgressFailure.Row.Index].DefaultCellStyle.BackColor = Color.Red; |
||
767 | |||
56 | office | 768 | toolStripStatusLabel1.Text = |
769 | $"{Resources.Could_not_read_menu} {rowProgressFailure.Data:0000}"; |
||
54 | office | 770 | break; |
771 | } |
||
772 | |||
773 | toolStripProgressBar1.Increment(1); |
||
774 | statusStrip1.Update(); |
||
775 | } |
||
776 | catch (Exception exception) |
||
777 | { |
||
778 | Log.Error(exception, Resources.Unexpected_error_while_reading_memory_bank); |
||
779 | } |
||
780 | }); |
||
781 | |||
782 | await Task.Run(() => ReadMenu(list, progress, cancellationToken), cancellationToken); |
||
783 | |||
784 | if (!_cancellationToken.IsCancellationRequested) |
||
785 | try |
||
786 | { |
||
787 | toolStripProgressBar1.Value = toolStripProgressBar1.Maximum; |
||
788 | toolStripStatusLabel1.Text = "Done."; |
||
789 | } |
||
56 | office | 790 | catch (NullReferenceException ex) |
54 | office | 791 | { |
792 | // toolStripProgressBar1 disposed on close |
||
793 | } |
||
794 | } |
||
795 | |||
796 | private async Task ReadMenu(IReadOnlyList<DataGridViewRow> rows, IProgress<DataGridViewRowProgress> progress, |
||
797 | CancellationToken cancellationToken) |
||
798 | { |
||
799 | var count = rows.Count; |
||
800 | |||
801 | for (var i = 0; i < count && !cancellationToken.IsCancellationRequested; ++i) |
||
802 | { |
||
56 | office | 803 | if (!int.TryParse($"{rows[i].Cells["IndexColumn"].Value}", out var menu)) continue; |
54 | office | 804 | |
805 | try |
||
806 | { |
||
807 | var result = await _catAssemblies.CatReadAsync<int>("EX", new object[] { menu }, cancellationToken); |
||
808 | |||
809 | progress.Report(new DataGridViewRowProgressSuccess<int>(rows[i], i, result)); |
||
810 | } |
||
811 | catch (UnexpectedRadioResponseException exception) |
||
812 | { |
||
813 | progress.Report(new DataGridViewRowProgressFailure<int>(rows[i], i, exception, menu)); |
||
814 | } |
||
815 | catch (Exception exception) |
||
816 | { |
||
817 | progress.Report(new DataGridViewRowProgressFailure<int>(rows[i], i, exception, menu)); |
||
818 | } |
||
819 | } |
||
820 | } |
||
821 | |||
822 | //Mix two colors |
||
823 | //Example: Steps=10 & Position=4 makes Color2 mix 40% into Color1 |
||
824 | /// <summary> |
||
825 | /// Mix two colors. |
||
826 | /// </summary> |
||
827 | /// <param name="color1"></param> |
||
828 | /// <param name="color2"></param> |
||
829 | /// <param name="steps"></param> |
||
830 | /// <param name="position"></param> |
||
831 | /// <example>Steps=10 & Positon=4 makes Color2 mix 40% into Color1</example> |
||
832 | /// <remarks>https://stackoverflow.com/questions/38337849/transparent-selectionbackcolor-for-datagridview-cell</remarks> |
||
833 | /// <returns></returns> |
||
834 | public static Color MixColor(Color color1, Color color2, int steps, int position) |
||
835 | { |
||
836 | if (position <= 0 || steps <= 1) return color1; |
||
837 | if (position >= steps) return color2; |
||
838 | return Color.FromArgb( |
||
839 | color1.R + (color2.R - color1.R) / steps * position, |
||
840 | color1.G + (color2.G - color1.G) / steps * position, |
||
841 | color1.B + (color2.B - color1.B) / steps * position |
||
842 | ); |
||
843 | } |
||
844 | |||
845 | private static IEnumerable<DataGridViewRow> GetSelectedDataGridViewRows(DataGridView dataGridView) |
||
846 | { |
||
847 | return dataGridView.SelectedRows.OfType<DataGridViewRow>().OrderBy(row => row.Index); |
||
848 | } |
||
849 | |||
850 | private void DataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) |
||
851 | { |
||
852 | } |
||
853 | |||
854 | private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) |
||
855 | { |
||
856 | var dataGridView = (DataGridView)sender; |
||
857 | |||
858 | dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit); |
||
859 | } |
||
860 | |||
861 | private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) |
||
862 | { |
||
863 | } |
||
864 | |||
865 | private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) |
||
866 | { |
||
867 | } |
||
868 | |||
869 | private void DataGridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e) |
||
870 | { |
||
871 | } |
||
872 | |||
873 | private void DataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e) |
||
874 | { |
||
875 | } |
||
876 | |||
877 | private void DataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) |
||
878 | { |
||
879 | // @(-.-)@ -(o.o)- @(o_o)@ |
||
880 | } |
||
881 | |||
882 | private static List<DataGridViewRow> GetAllDataGridViewRows(DataGridView dataGridView) |
||
883 | { |
||
884 | return dataGridView.Rows.OfType<DataGridViewRow>().ToList(); |
||
885 | } |
||
886 | |||
887 | private void TextBox1_TextChanged(object sender, EventArgs e) |
||
888 | { |
||
889 | _searchTextBoxChangedContinuation.Schedule(TimeSpan.FromSeconds(1), () => |
||
890 | { |
||
891 | textBox1.InvokeIfRequired(textBox => |
||
892 | { |
||
893 | var search = textBox.Text; |
||
894 | |||
895 | dataGridView1.InvokeIfRequired(dataGridView => |
||
896 | { |
||
897 | foreach (var row in GetAllDataGridViewRows(dataGridView)) |
||
898 | { |
||
899 | if (row.Cells["FunctionColumn"].Value == null) continue; |
||
900 | |||
901 | switch (((string)row.Cells["FunctionColumn"].Value).IndexOf(search, |
||
902 | StringComparison.OrdinalIgnoreCase)) |
||
903 | { |
||
904 | case -1: |
||
905 | row.Visible = false; |
||
906 | break; |
||
907 | default: |
||
908 | row.Visible = true; |
||
909 | break; |
||
910 | } |
||
911 | } |
||
912 | }); |
||
913 | }); |
||
914 | }, _cancellationToken); |
||
915 | } |
||
916 | |||
917 | private async void button1_Click(object sender, EventArgs e) |
||
918 | { |
||
919 | if (_readLinkedCancellationTokenSource != null) |
||
920 | { |
||
921 | _readLinkedCancellationTokenSource.Cancel(); |
||
922 | _readLinkedCancellationTokenSource = null; |
||
923 | } |
||
924 | |||
925 | if (_readMenuTask != null) |
||
926 | { |
||
927 | await _readMenuTask; |
||
928 | _readMenuTask = null; |
||
929 | } |
||
930 | |||
931 | _readCancellationTokenSource = new CancellationTokenSource(); |
||
932 | _readLinkedCancellationTokenSource = |
||
933 | CancellationTokenSource.CreateLinkedTokenSource(new[] |
||
934 | { _cancellationTokenSource.Token, _cancellationToken }); |
||
935 | |||
936 | _readMenuTask = ReadMenu(_readLinkedCancellationTokenSource.Token); |
||
937 | } |
||
938 | |||
939 | private void DataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) |
||
940 | { |
||
941 | var dataGridView = sender as DataGridView; |
||
942 | foreach (DataGridViewCell cell in dataGridView.Rows[e.RowIndex].Cells) |
||
943 | { |
||
944 | if (cell.Selected == false) continue; |
||
945 | var bgColorCell = Color.White; |
||
946 | if (cell.Style.BackColor != Color.Empty) |
||
947 | bgColorCell = cell.Style.BackColor; |
||
948 | else if (cell.InheritedStyle.BackColor != Color.Empty) bgColorCell = cell.InheritedStyle.BackColor; |
||
949 | cell.Style.SelectionBackColor = MixColor(bgColorCell, Color.FromArgb(0, 150, 255), 10, 4); |
||
950 | } |
||
951 | } |
||
952 | |||
953 | private async void button2_Click(object sender, EventArgs e) |
||
954 | { |
||
955 | if (_writeLinkedCancellationTokenSource != null) |
||
956 | { |
||
957 | _writeLinkedCancellationTokenSource.Cancel(); |
||
958 | _writeLinkedCancellationTokenSource = null; |
||
959 | } |
||
960 | |||
961 | if (_writeMenuTask != null) |
||
962 | { |
||
963 | await _writeMenuTask; |
||
964 | _writeMenuTask = null; |
||
965 | } |
||
966 | |||
967 | _writeCancellationTokenSource = new CancellationTokenSource(); |
||
968 | _writeLinkedCancellationTokenSource = |
||
969 | CancellationTokenSource.CreateLinkedTokenSource(new[] |
||
970 | { _cancellationTokenSource.Token, _cancellationToken }); |
||
971 | |||
972 | _writeMenuTask = WriteMenu(_writeLinkedCancellationTokenSource.Token); |
||
973 | } |
||
56 | office | 974 | |
975 | private void exportToolStripMenuItem_Click(object sender, EventArgs e) |
||
976 | { |
||
977 | saveFileDialog1.ShowDialog(); |
||
978 | } |
||
979 | |||
980 | private async void saveFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e) |
||
981 | { |
||
982 | if (e.Cancel) |
||
983 | { |
||
984 | return; |
||
985 | } |
||
986 | |||
987 | var rows = GetAllDataGridViewRows(dataGridView1); |
||
988 | var count = rows.Count; |
||
989 | toolStripProgressBar1.Minimum = 0; |
||
990 | toolStripProgressBar1.Maximum = count; |
||
991 | toolStripProgressBar1.Value = toolStripProgressBar1.Minimum; |
||
992 | |||
993 | var dataGridViewRows = new ConcurrentQueue<DataGridViewRow>(); |
||
994 | var dataGridViewRowsTaskCompletionSource = new TaskCompletionSource<object>(); |
||
995 | var radioMenuTaskCompletionSource = new TaskCompletionSource<object>(); |
||
996 | |||
997 | var radioMenu = new RadioMenu(); |
||
998 | |||
999 | async void IdleHandler(object idleHandlerSender, EventArgs idleHandlerArgs) |
||
1000 | { |
||
1001 | await dataGridViewRowsTaskCompletionSource.Task; |
||
1002 | |||
1003 | try |
||
1004 | { |
||
1005 | if (!dataGridViewRows.TryDequeue(out var row)) |
||
1006 | { |
||
1007 | Application.Idle -= IdleHandler; |
||
1008 | |||
1009 | toolStripStatusLabel1.Text = "Done."; |
||
1010 | |||
1011 | radioMenuTaskCompletionSource.TrySetResult(new { }); |
||
1012 | return; |
||
1013 | } |
||
1014 | |||
1015 | if (!int.TryParse($"{row.Cells["IndexColumn"].Value}", out var index)) |
||
1016 | { |
||
1017 | return; |
||
1018 | } |
||
1019 | |||
1020 | var value = $"{row.Cells["ValueColumn"].Value}"; |
||
1021 | |||
1022 | var radioMenuItem = new RadioMenuItem |
||
1023 | { |
||
1024 | Index = index, |
||
1025 | Value = value |
||
1026 | }; |
||
1027 | |||
1028 | radioMenu.RadioMenuItem.Add(radioMenuItem); |
||
1029 | |||
1030 | toolStripStatusLabel1.Text = $"Exported menu {row.Index:0000}"; |
||
1031 | |||
1032 | toolStripProgressBar1.Increment(1); |
||
1033 | statusStrip1.Update(); |
||
1034 | } |
||
1035 | catch (Exception exception) |
||
1036 | { |
||
1037 | Log.Error(exception, Resources.Could_not_update_data_grid_view); |
||
1038 | } |
||
1039 | } |
||
1040 | |||
1041 | Application.Idle += IdleHandler; |
||
1042 | try |
||
1043 | { |
||
1044 | foreach (var row in rows) |
||
1045 | { |
||
1046 | dataGridViewRows.Enqueue(row); |
||
1047 | } |
||
1048 | |||
1049 | dataGridViewRowsTaskCompletionSource.TrySetResult(new { }); |
||
1050 | } |
||
1051 | catch (Exception exception) |
||
1052 | { |
||
1053 | Application.Idle -= IdleHandler; |
||
1054 | |||
1055 | Log.Error(exception, Resources.Unable_to_create_radio_menu); |
||
1056 | } |
||
1057 | |||
1058 | await radioMenuTaskCompletionSource.Task; |
||
1059 | |||
1060 | var fileName = saveFileDialog1.FileName; |
||
1061 | switch (await Serialization.Serialize(radioMenu, fileName, "RadioMenu", |
||
1062 | "<!ATTLIST Configuration xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>", |
||
1063 | _localCancellationToken)) |
||
1064 | { |
||
1065 | case SerializationSuccess<RadioMenu> radioMenuSerializationSuccess: |
||
1066 | Log.Information(Resources.Radio_menu_serialized_successfully); |
||
1067 | break; |
||
1068 | case SerializationFailure serializationFailure: |
||
1069 | Log.Warning(serializationFailure.Exception.Message, Resources.Radio_menu_failed_to_serialize); |
||
1070 | break; |
||
1071 | } |
||
1072 | } |
||
1073 | |||
1074 | private void importToolStripMenuItem_Click(object sender, EventArgs e) |
||
1075 | { |
||
1076 | openFileDialog1.ShowDialog(); |
||
1077 | } |
||
1078 | |||
1079 | private async void openFileDialog1_FileOk(object sender, System.ComponentModel.CancelEventArgs e) |
||
1080 | { |
||
1081 | if (e.Cancel) |
||
1082 | { |
||
1083 | return; |
||
1084 | } |
||
1085 | |||
1086 | RadioMenu radioMenu = null; |
||
1087 | |||
1088 | var fileName = openFileDialog1.FileName; |
||
1089 | var deserializationResult = |
||
1090 | await Serialization.Deserialize<RadioMenu>(fileName, |
||
1091 | "urn:hambook-radiomenu-schema", "RadioMenu.xsd", |
||
1092 | _localCancellationToken); |
||
1093 | |||
1094 | switch (deserializationResult) |
||
1095 | { |
||
1096 | case SerializationSuccess<RadioMenu> serializationSuccess: |
||
1097 | Log.Information(Resources.Deserialized_radio_menu); |
||
1098 | radioMenu = serializationSuccess.Result; |
||
1099 | break; |
||
1100 | case SerializationFailure serializationFailure: |
||
1101 | Log.Warning(serializationFailure.Exception, Resources.Failed_to_deserialize_radio_menu); |
||
1102 | return; |
||
1103 | } |
||
1104 | |||
1105 | var rows = GetAllDataGridViewRows(dataGridView1); |
||
1106 | var count = rows.Count; |
||
1107 | var menuIndexToRow = new Dictionary<int, DataGridViewRow>(); |
||
1108 | foreach (var row in rows) |
||
1109 | { |
||
1110 | if (!int.TryParse($"{row.Cells["IndexColumn"].Value}", out var index)) |
||
1111 | { |
||
1112 | continue; |
||
1113 | } |
||
1114 | |||
1115 | menuIndexToRow.Add(index, row); |
||
1116 | } |
||
1117 | |||
1118 | toolStripProgressBar1.Minimum = 0; |
||
1119 | toolStripProgressBar1.Maximum = count; |
||
1120 | toolStripProgressBar1.Value = toolStripProgressBar1.Minimum; |
||
1121 | |||
1122 | var radioMenuItems = new ConcurrentQueue<RadioMenuItem>(); |
||
1123 | var radioMenuItemsTaskCompletionSource = new TaskCompletionSource<object>(); |
||
1124 | |||
1125 | async void IdleHandler(object idleHandlerSender, EventArgs idleHandlerArgs) |
||
1126 | { |
||
1127 | await radioMenuItemsTaskCompletionSource.Task; |
||
1128 | |||
1129 | try |
||
1130 | { |
||
1131 | if (!radioMenuItems.TryDequeue(out var radioMenuItem)) |
||
1132 | { |
||
1133 | Application.Idle -= IdleHandler; |
||
1134 | |||
1135 | dataGridView1.Sort(dataGridView1.Columns["IndexColumn"], ListSortDirection.Ascending); |
||
1136 | toolStripStatusLabel1.Text = "Done."; |
||
1137 | |||
1138 | return; |
||
1139 | } |
||
1140 | |||
1141 | menuIndexToRow[radioMenuItem.Index].Cells["ValueColumn"].Value = radioMenuItem.Value; |
||
1142 | toolStripStatusLabel1.Text = $"Imported menu {radioMenuItem.Index:0000}"; |
||
1143 | |||
1144 | toolStripProgressBar1.Increment(1); |
||
1145 | statusStrip1.Update(); |
||
1146 | } |
||
1147 | catch (Exception exception) |
||
1148 | { |
||
1149 | Log.Error(exception, Resources.Could_not_update_data_grid_view); |
||
1150 | } |
||
1151 | } |
||
1152 | |||
1153 | Application.Idle += IdleHandler; |
||
1154 | try |
||
1155 | { |
||
1156 | foreach (var radioMenuItem in radioMenu.RadioMenuItem) |
||
1157 | { |
||
1158 | radioMenuItems.Enqueue(radioMenuItem); |
||
1159 | } |
||
1160 | |||
1161 | radioMenuItemsTaskCompletionSource.TrySetResult(new { }); |
||
1162 | } |
||
1163 | catch (Exception exception) |
||
1164 | { |
||
1165 | Application.Idle -= IdleHandler; |
||
1166 | |||
1167 | Log.Error(exception, Resources.Unable_to_create_radio_menu); |
||
1168 | } |
||
1169 | } |
||
54 | office | 1170 | } |
1171 | } |