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