HamBook – Blame information for rev 48

Subversion Repositories:
Rev:
Rev Author Line No. Line
15 office 1 using Configuration;
2 using HamBook.Properties;
3 using HamBook.Radios;
4 using HamBook.Radios.Generic;
16 office 5 using HamBook.Utilities.Serialization;
15 office 6 using Serilog;
7 using System;
8 using System.Collections.Concurrent;
9 using System.Collections.Generic;
10 using System.ComponentModel;
11 using System.Data;
12 using System.Linq;
13 using System.Threading.Tasks;
14 using System.Windows.Forms;
46 office 15 using MemoryChannel = HamBook.Radios.Generic.MemoryChannel;
15 office 16  
17 namespace HamBook
18 {
19 public partial class MemoryOrganizerForm : Form
20 {
21 private Configuration.Configuration Configuration { get; set; }
22  
23 private CatAssemblies _catAssemblies;
24 private CancellationToken _cancellationToken;
41 office 25 private Radios.Generic.MemoryBanks _memoryBanks;
22 office 26 private CancellationTokenSource _cancellationTokenSource;
27 private CancellationTokenSource _localCancellationTokenSource;
28 private CancellationToken _localCancellationToken;
15 office 29  
30 public MemoryOrganizerForm()
31 {
32 InitializeComponent();
22 office 33  
34 _localCancellationTokenSource = new CancellationTokenSource();
35 _localCancellationToken = _localCancellationTokenSource.Token;
15 office 36 }
37  
38 public MemoryOrganizerForm(Configuration.Configuration configuration, CatAssemblies catAssemblies, CancellationToken cancellationToken) : this()
39 {
40 Configuration = configuration;
41 _catAssemblies = catAssemblies;
22 office 42  
41 office 43 _cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(_localCancellationToken, cancellationToken);
22 office 44 _cancellationToken = _cancellationTokenSource.Token;
41 office 45  
45 office 46 _memoryBanks = Radios.Generic.MemoryBanks.Create(Configuration.Radio);
15 office 47 }
48  
49 /// <summary>
50 /// Clean up any resources being used.
51 /// </summary>
52 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
53 protected override void Dispose(bool disposing)
54 {
55 if (disposing && (components != null))
56 {
22 office 57 if (_cancellationTokenSource != null)
58 {
59 _cancellationTokenSource.Cancel();
60 }
61  
15 office 62 components.Dispose();
63 }
64 base.Dispose(disposing);
65 }
66  
67 private async void button1_Click(object sender, EventArgs e)
68 {
41 office 69 var rows = dataGridView1.Rows.OfType<DataGridViewRow>().OrderBy(row => row.Index).ToList();
22 office 70 var count = rows.Count;
71  
72 toolStripProgressBar1.Minimum = 0;
73 toolStripProgressBar1.Maximum = count;
74  
75 var progress = new Progress<DataGridViewRowProgress>(rowProgress =>
76 {
77 try
78 {
79 switch (rowProgress)
80 {
81 case DataGridViewRowProgressSuccess<MemoryChannel> rowProgressSuccess:
82  
47 office 83 switch(Configuration.Radio)
84 {
85 case "Yaesu FT-891":
86 var result = (Radios.Yaesu.FT_891.MemoryChannel)rowProgressSuccess.Data;
22 office 87  
47 office 88 rowProgress.Row.Cells["FrequencyColumn"].Value = result.Frequency;
89 rowProgress.Row.Cells["ClarifierDirectionColumn"].Value = (char)result.ClarifierDirection;
90 rowProgress.Row.Cells["ClarifierOffsetColumn"].Value = result.ClarifierOffset;
91 rowProgress.Row.Cells["ClarColumn"].Value = result.Clar;
92 rowProgress.Row.Cells["ModeColumn"].Value = result.MemoryRadioMode.Name;
93 rowProgress.Row.Cells["CtcssColumn"].Value = (string)result.Ctcss;
94 rowProgress.Row.Cells["PhaseColumn"].Value = (string)result.Phase;
95 rowProgress.Row.Cells["TagColumn"].Value = result.Tag;
96 rowProgress.Row.Cells["TextColumn"].Value = result.Text;
97 rowProgress.Row.Tag = rowProgressSuccess.Data;
98 break;
99 }
41 office 100  
101 toolStripStatusLabel1.Text = $"{Resources.Read_memory_bank} {rowProgress.Index + 1}";
22 office 102 break;
103 case DataGridViewRowProgressFailure rowProgressFailure:
104 Log.Error(rowProgressFailure.Exception, $"{Resources.Could_not_read_memory_bank}");
105  
41 office 106 toolStripStatusLabel1.Text = $"{Resources.Could_not_read_memory_bank} {rowProgress.Index + 1}";
22 office 107 break;
108 }
109  
110 toolStripProgressBar1.Increment(1);
111 statusStrip1.Update();
112 }
41 office 113 catch (Exception exception)
22 office 114 {
41 office 115 Log.Error(exception, Resources.Unexpected_error_while_reading_memory_bank);
22 office 116 }
117 });
118  
119 await Task.Run(() => ReadMemoryBanks(rows, progress, _cancellationToken), _cancellationToken);
120  
121 if (!_cancellationToken.IsCancellationRequested)
122 {
123 toolStripProgressBar1.Value = toolStripProgressBar1.Maximum;
124 toolStripStatusLabel1.Text = "Done.";
125 }
15 office 126 }
127  
128 private async void button2_Click(object sender, EventArgs e)
129 {
41 office 130 var rows = dataGridView1.Rows.OfType<DataGridViewRow>().OrderBy(row => row.Index).ToList();
22 office 131 var count = rows.Count;
132  
133 toolStripProgressBar1.Minimum = 0;
134 toolStripProgressBar1.Maximum = count;
135  
136 var progress = new Progress<DataGridViewRowProgress>(rowProgress =>
137 {
138 try
139 {
140 switch (rowProgress)
141 {
142 case DataGridViewRowProgressSuccess<bool> rowProgressSuccess:
143 var success = rowProgressSuccess.Data;
144  
41 office 145 if (success)
22 office 146 {
147  
148 toolStripStatusLabel1.Text =
41 office 149 $"{Resources.Wrote_memory_bank} {rowProgress.Index + 1}";
22 office 150 toolStripProgressBar1.Increment(1);
151 statusStrip1.Update();
152 return;
153 }
154  
41 office 155 Log.Error($"{Resources.Could_not_write_memory_bank}");
22 office 156 break;
157 case DataGridViewRowProgressFailure rowProgressFailure:
158 Log.Error(rowProgressFailure.Exception, $"{Resources.Could_not_write_memory_bank}");
159 break;
160 }
161  
41 office 162 toolStripStatusLabel1.Text =
163 $"{Resources.Could_not_write_memory_bank} {rowProgress.Index + 1}";
164 toolStripProgressBar1.Increment(1);
165 statusStrip1.Update();
22 office 166 }
41 office 167 catch (Exception exception)
168 {
169 Log.Error(exception, Resources.Unexpected_error_while_writing_memory_bank);
170 }
22 office 171  
172 });
173  
174 await Task.Run(() => WriteMemoryBanks(rows, progress, _cancellationToken), _cancellationToken);
175  
176 if (!_cancellationToken.IsCancellationRequested)
177 {
178 toolStripProgressBar1.Value = toolStripProgressBar1.Maximum;
179 toolStripStatusLabel1.Text = "Done.";
180 }
15 office 181 }
182  
183 private void MemoryOrganizerForm_Load(object sender, EventArgs e)
184 {
47 office 185 // Generate columns based on radio type.
186 switch(Configuration.Radio)
187 {
188 case "Yaesu FT-891":
189 dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "LocationColumn", HeaderText = "Location" });
190 dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "FrequencyColumn", HeaderText = "Frequency" });
191 var clarifierDropDownColumn = new DataGridViewComboBoxColumn() { Name = "ClarifierDirectionColumn", HeaderText = "Clarifier" };
192 clarifierDropDownColumn.Items.AddRange(
193 "+",
194 "-"
195 );
196 dataGridView1.Columns.Add(clarifierDropDownColumn);
197 dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "ClarifierOffsetColumn", HeaderText = "Offset" });
198 dataGridView1.Columns.Add(new DataGridViewCheckBoxColumn() { Name = "ClarColumn", HeaderText = "Clar" });
199 var modeComboBoxColumn = new DataGridViewComboBoxColumn() { Name = "ModeColumn", HeaderText = "Mode" };
200 modeComboBoxColumn.Items.AddRange(
201 "SSB_1",
202 "SSB_2",
203 "CW_1",
204 "FM",
205 "AM",
206 "RTTY_1",
207 "CW_2",
208 "DATA_1",
209 "RTTY_2",
210 "FM-N",
211 "DATA_2",
212 "AM-N"
213 );
214 dataGridView1.Columns.Add(modeComboBoxColumn);
215 var ctcssComboBoxColumn = new DataGridViewComboBoxColumn() { Name = "CtcssColumn", HeaderText = "CTCSS" };
216 ctcssComboBoxColumn.Items.AddRange(
217 "Off",
218 "Enc/Dec",
219 "Enc"
220 );
221 dataGridView1.Columns.Add(ctcssComboBoxColumn);
222 var phaseComboBoxColumn = new DataGridViewComboBoxColumn() { Name = "PhaseColumn", HeaderText = "Phase" };
223 phaseComboBoxColumn.Items.AddRange(
224 "Simplex",
225 "Plus Shift",
226 "Minus Shift"
227 );
228 dataGridView1.Columns.Add(phaseComboBoxColumn);
229 dataGridView1.Columns.Add(new DataGridViewCheckBoxColumn() { Name = "TagColumn", HeaderText = "Tag" });
230 dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { Name = "TextColumn", HeaderText = "Text" });
231 break;
232 }
233  
15 office 234 toolStripProgressBar1.Minimum = 0;
235 toolStripProgressBar1.Maximum = 98;
236  
41 office 237 var memoryBankQueue = new ConcurrentQueue<string>();
238 var memoryBankAddRowsTaskCompletionSource = new TaskCompletionSource<object>();
15 office 239  
240 async void IdleHandler(object idleHandlerSender, EventArgs idleHandlerArgs)
241 {
41 office 242 await memoryBankAddRowsTaskCompletionSource.Task;
15 office 243  
244 try
245 {
246 if (!memoryBankQueue.TryDequeue(out var memoryBank))
247 {
248 Application.Idle -= IdleHandler;
249  
250 dataGridView1.Sort(dataGridView1.Columns["LocationColumn"], ListSortDirection.Ascending);
251 toolStripStatusLabel1.Text = "Done.";
252  
253 return;
254 }
255  
256 var index = dataGridView1.Rows.Add();
257  
47 office 258 switch(Configuration.Radio)
259 {
260 case "Yaesu FT-891":
261 dataGridView1.Rows[index].Cells["LocationColumn"].Value = memoryBank;
262 dataGridView1.Rows[index].Cells["FrequencyColumn"].Value = default;
263 dataGridView1.Rows[index].Cells["ClarifierDirectionColumn"].Value = default;
264 dataGridView1.Rows[index].Cells["ClarifierOffsetColumn"].Value = default;
265 dataGridView1.Rows[index].Cells["ClarColumn"].Value = default;
266 dataGridView1.Rows[index].Cells["ModeColumn"].Value = default;
267 dataGridView1.Rows[index].Cells["CtcssColumn"].Value = default;
268 dataGridView1.Rows[index].Cells["PhaseColumn"].Value = default;
269 dataGridView1.Rows[index].Cells["TagColumn"].Value = default;
270 dataGridView1.Rows[index].Cells["TextColumn"].Value = default;
271 break;
272 }
15 office 273  
47 office 274 toolStripStatusLabel1.Text = $"{Resources.Created_memory_bank} {memoryBank}";
15 office 275 toolStripProgressBar1.Increment(1);
276 statusStrip1.Update();
277 }
278 catch (Exception exception)
279 {
280 Log.Error(exception, Resources.Could_not_update_data_grid_view);
281 }
282 }
283  
284 Application.Idle += IdleHandler;
285 try
286 {
41 office 287 foreach (var memoryBank in _memoryBanks.GetMemoryBanks())
15 office 288 {
289 memoryBankQueue.Enqueue(memoryBank);
290 }
291  
41 office 292 memoryBankAddRowsTaskCompletionSource.TrySetResult(new { });
15 office 293 }
294 catch (Exception exception)
295 {
296 Application.Idle -= IdleHandler;
297  
298 Log.Error(exception, Resources.Unable_to_create_memory_banks);
299 }
300 }
301  
302 private void DataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
303 {
304 var dataGridView = (DataGridView)sender;
305  
306 if (dataGridView.CurrentCell is DataGridViewCheckBoxCell)
307 {
308 dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
309 }
310 }
311  
312 private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
313 {
314 var dataGridView = (DataGridView)sender;
315  
316 dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
317 }
318  
319 private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
320 {
321 var dataGridView = (DataGridView)sender;
322  
323 if (dataGridView.CurrentCell is DataGridViewCheckBoxCell)
324 {
325 if (dataGridView.CurrentCell.IsInEditMode)
326 {
327 if (dataGridView.IsCurrentCellDirty)
328 {
329 dataGridView.EndEdit();
330 }
331 }
332 }
333 }
334  
335 private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
336 {
337 var dataGridView = (DataGridView)sender;
338  
339 if (e.RowIndex == -1 || e.ColumnIndex == -1)
340 {
341 return;
342 }
343  
344 switch (dataGridView.Columns[e.ColumnIndex].Name)
345 {
346 case "EnableColumn":
347 //ProcessEnable(dataGridView.Rows[e.RowIndex]);
348 break;
349 }
350 }
351  
352 private void DataGridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
353 {
354 var dataGridView = (DataGridView)sender;
355  
356 if (e.RowIndex == -1 || e.ColumnIndex == -1 ||
357 !(dataGridView.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn))
358 {
359 return;
360 }
361  
362 dataGridView.EndEdit();
363 }
364  
365 private void DataGridView_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
366 {
367 var dataGridView = (DataGridView)sender;
368  
369 if (e.RowIndex == -1 || e.ColumnIndex == -1 ||
370 !(dataGridView.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn))
371 {
372 return;
373 }
374  
375 dataGridView.EndEdit();
376 }
377  
378 private void DataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
379 {
380 // @(-.-)@ -(o.o)- @(o_o)@
381 }
382  
383 private static List<DataGridViewRow> GetSelectedDataGridViewRows(DataGridView dataGridView)
384 {
385 return dataGridView.SelectedRows.OfType<DataGridViewRow>().OrderBy(row => row.Index).ToList();
386 }
387  
388 private async Task ReadMemoryBanks(IReadOnlyList<DataGridViewRow> rows, IProgress<DataGridViewRowProgress> progress,
389 CancellationToken cancellationToken)
390 {
391 var count = rows.Count;
392  
393 for (var i = 0; i < count && !cancellationToken.IsCancellationRequested; ++i)
394 {
395 try
396 {
41 office 397 var location = $"{rows[i].Cells["LocationColumn"].Value}";
15 office 398  
41 office 399 var result = await _catAssemblies.CatReadAsync<MemoryChannel>("MT", new object[] { location }, _cancellationToken);
15 office 400  
401 progress.Report(new DataGridViewRowProgressSuccess<MemoryChannel>(rows[i], i, result));
402 }
403 catch (UnexpectedRadioResponseException exception)
404 {
405 progress.Report(new DataGridViewRowProgressFailure(rows[i], i, exception));
406 }
407 catch (Exception exception)
408 {
409 progress.Report(new DataGridViewRowProgressFailure(rows[i], i, exception));
410 }
411 }
412 }
413  
414 private async Task WriteMemoryBanks(IReadOnlyList<DataGridViewRow> rows, IProgress<DataGridViewRowProgress> progress,
415 CancellationToken cancellationToken)
416 {
417 var count = rows.Count;
418  
419 for (var i = 0; i < count && !cancellationToken.IsCancellationRequested; ++i)
420 {
421 try
422 {
47 office 423 var success = false;
15 office 424  
47 office 425 switch(Configuration.Radio)
426 {
427 case "Yaesu FT-891":
428 var memoryChannel = (Radios.Yaesu.FT_891.MemoryChannel)MemoryChannel.Create(Configuration.Radio);
15 office 429  
47 office 430 memoryChannel.CurrentLocation = $"{rows[i].Cells["LocationColumn"].Value}";
431 memoryChannel.Frequency = int.Parse($"{rows[i].Cells["FrequencyColumn"].Value}");
432 memoryChannel.ClarifierDirection = char.Parse($"{rows[i].Cells["ClarifierDirectionColumn"].Value}");
433 memoryChannel.ClarifierOffset = int.Parse($"{rows[i].Cells["ClarifierOffsetColumn"].Value}");
434 memoryChannel.Clar = Convert.ToBoolean(rows[i].Cells["ClarColumn"].Value);
435 memoryChannel.MemoryRadioMode = Radios.Generic.MemoryRadioMode.Create(Configuration.Radio, $"{rows[i].Cells["ModeColumn"].Value}");
436 memoryChannel.Ctcss = new Ctcss($"{rows[i].Cells["CtcssColumn"].Value}");
437 memoryChannel.Phase = new Phase($"{rows[i].Cells["PhaseColumn"].Value}");
438 memoryChannel.Tag = Convert.ToBoolean(rows[i].Cells["TagColumn"].Value);
439 memoryChannel.Text = $"{rows[i].Cells["TextColumn"].Value,-12}";
15 office 440  
47 office 441 success = await _catAssemblies.CatSetAsync<MemoryChannel, bool>("MT", new object[] { memoryChannel }, _cancellationToken);
442 break;
443 }
444  
445 progress.Report(new DataGridViewRowProgressSuccess<bool>(rows[i], i, success));
15 office 446 }
447 catch (UnexpectedRadioResponseException exception)
448 {
449 progress.Report(new DataGridViewRowProgressFailure(rows[i], i, exception));
450 }
451 catch (Exception exception)
452 {
453 progress.Report(new DataGridViewRowProgressFailure(rows[i], i, exception));
454 }
455 }
456 }
16 office 457  
458 private void importToolStripMenuItem_Click(object sender, EventArgs e)
459 {
460 openFileDialog1.ShowDialog();
461 }
462  
463 private void exportToolStripMenuItem_Click(object sender, EventArgs e)
464 {
465 saveFileDialog1.ShowDialog();
466 }
467  
468 private async void saveFileDialog1_FileOk(object sender, CancelEventArgs e)
469 {
470 if (e.Cancel)
471 {
472 return;
473 }
474  
475 var fileName = saveFileDialog1.FileName;
26 office 476 var list = new List<MemoryChannelIndexed>();
16 office 477 foreach(var row in dataGridView1.Rows.OfType<DataGridViewRow>().OrderBy(row => row.Index))
478 {
48 office 479 if (row.Tag is MemoryChannel memoryChannel)
16 office 480 {
26 office 481 var memoryChannelOrganizerBanks = new MemoryChannelIndexed(row.Index, memoryChannel);
16 office 482 list.Add(memoryChannelOrganizerBanks);
483 }
484 }
485  
486 var memoryBanks = list.ToArray();
487  
488 switch (await Serialization.Serialize(memoryBanks, fileName, "MemoryChannelOrganizerBank",
489 "<!ATTLIST MemoryChannelOrganizerBank xmlns:xsi CDATA #IMPLIED xsi:noNamespaceSchemaLocation CDATA #IMPLIED>",
490 CancellationToken.None))
491 {
26 office 492 case SerializationSuccess<MemoryChannelIndexed[]> configuration:
16 office 493 Log.Information(Resources.Serialized_memory_banks);
494 break;
495 case SerializationFailure serializationFailure:
496 Log.Warning(serializationFailure.Exception.Message, Resources.Failed_to_serialize_memory_banks);
497 break;
498 }
499 }
500  
501 private async void openFileDialog1_FileOk(object sender, CancelEventArgs e)
502 {
503 if(e.Cancel)
504 {
505 return;
506 }
507  
508 var fileName = openFileDialog1.FileName;
26 office 509 MemoryChannelIndexed[] memoryBanks = null;
16 office 510  
511 var deserializationResult =
26 office 512 await Serialization.Deserialize<MemoryChannelIndexed[]>(fileName,
45 office 513 "urn:hambook-memorychannelorganizerbank-schema", "MemoryChannelIndexed.xsd", CancellationToken.None);
16 office 514  
515 switch (deserializationResult)
516 {
26 office 517 case SerializationSuccess<MemoryChannelIndexed[]> serializationSuccess:
16 office 518 Log.Information(Resources.Deserialized_memory_banks);
519 memoryBanks = serializationSuccess.Result;
520 break;
521 case SerializationFailure serializationFailure:
522 Log.Warning(serializationFailure.Exception, Resources.Failed_to_deserialize_memory_banks);
523 return;
524 }
525  
526 toolStripProgressBar1.Minimum = 0;
527 toolStripProgressBar1.Maximum = 98;
528  
26 office 529 var memoryBankQueue = new ConcurrentQueue<MemoryChannelIndexed>();
16 office 530 var snapshotsQueuedTaskCompletionSource = new TaskCompletionSource<object>();
531  
532 async void IdleHandler(object idleHandlerSender, EventArgs idleHandlerArgs)
533 {
534 await snapshotsQueuedTaskCompletionSource.Task;
535  
536 try
537 {
538 if (!memoryBankQueue.TryDequeue(out var memoryBank))
539 {
540 Application.Idle -= IdleHandler;
541  
542 dataGridView1.Sort(dataGridView1.Columns["LocationColumn"], ListSortDirection.Ascending);
543 toolStripStatusLabel1.Text = "Done.";
544  
545 return;
546 }
547  
47 office 548 switch(Configuration.Radio)
549 {
550 case "Yaesu FT-891":
48 office 551 var memoryChannel = (Radios.Yaesu.FT_891.MemoryChannel)memoryBank.MemoryChannel;
552  
47 office 553 dataGridView1.Rows[memoryBank.Index].Cells["FrequencyColumn"].Value = memoryBank.MemoryChannel.Frequency;
48 office 554 dataGridView1.Rows[memoryBank.Index].Cells["ClarifierDirectionColumn"].Value = (char)memoryChannel.ClarifierDirection;
555 dataGridView1.Rows[memoryBank.Index].Cells["ClarifierOffsetColumn"].Value = memoryChannel.ClarifierOffset;
556 dataGridView1.Rows[memoryBank.Index].Cells["ClarColumn"].Value = memoryChannel.Clar;
47 office 557 dataGridView1.Rows[memoryBank.Index].Cells["ModeColumn"].Value = memoryBank.MemoryChannel.MemoryRadioMode.Name;
48 office 558 dataGridView1.Rows[memoryBank.Index].Cells["CtcssColumn"].Value = (string)memoryChannel.Ctcss;
559 dataGridView1.Rows[memoryBank.Index].Cells["PhaseColumn"].Value = (string)memoryChannel.Phase;
47 office 560 dataGridView1.Rows[memoryBank.Index].Cells["TagColumn"].Value = memoryBank.MemoryChannel.Tag;
561 dataGridView1.Rows[memoryBank.Index].Cells["TextColumn"].Value = memoryBank.MemoryChannel.Text;
562 dataGridView1.Rows[memoryBank.Index].Tag = memoryBank.MemoryChannel;
563 break;
564 }
16 office 565  
566 toolStripProgressBar1.Increment(1);
567 statusStrip1.Update();
568 }
569 catch (Exception exception)
570 {
571 Log.Error(exception, Resources.Could_not_update_data_grid_view);
572 }
573 }
574  
575 Application.Idle += IdleHandler;
576 try
577 {
578 foreach (var memoryChannel in memoryBanks)
579 {
580 memoryBankQueue.Enqueue(memoryChannel);
581 }
582  
583 snapshotsQueuedTaskCompletionSource.TrySetResult(new { });
584 }
585 catch (Exception exception)
586 {
587 Application.Idle -= IdleHandler;
588  
589 Log.Error(exception, Resources.Unable_to_create_memory_banks);
590 }
591 }
22 office 592  
593 private void MemoryOrganizerForm_FormClosing(object sender, FormClosingEventArgs e)
594 {
595 if(_cancellationTokenSource != null)
596 {
597 _cancellationTokenSource.Cancel();
598 }
599 }
40 office 600  
41 office 601 private async void readToolStripMenuItem_Click(object sender, EventArgs e)
40 office 602 {
41 office 603 var rows = GetSelectedDataGridViewRows(dataGridView1);
604  
605 var count = rows.Count;
606  
607 toolStripProgressBar1.Minimum = 0;
608 toolStripProgressBar1.Maximum = count;
609  
610 var progress = new Progress<DataGridViewRowProgress>(rowProgress =>
611 {
612 try
613 {
614 switch (rowProgress)
615 {
47 office 616 case DataGridViewRowProgressSuccess<MemoryChannel> rowProgressSuccess:
617 switch(rowProgressSuccess.Data)
618 {
619 case Radios.Yaesu.FT_891.MemoryChannel memoryChannel:
620 rowProgress.Row.Cells["FrequencyColumn"].Value = memoryChannel.Frequency;
621 rowProgress.Row.Cells["ClarifierDirectionColumn"].Value = (char)memoryChannel.ClarifierDirection;
622 rowProgress.Row.Cells["ClarifierOffsetColumn"].Value = memoryChannel.ClarifierOffset;
623 rowProgress.Row.Cells["ClarColumn"].Value = memoryChannel.Clar;
624 rowProgress.Row.Cells["ModeColumn"].Value = memoryChannel.MemoryRadioMode.Name;
625 rowProgress.Row.Cells["CtcssColumn"].Value = (string)memoryChannel.Ctcss;
626 rowProgress.Row.Cells["PhaseColumn"].Value = (string)memoryChannel.Phase;
627 rowProgress.Row.Cells["TagColumn"].Value = memoryChannel.Tag;
628 rowProgress.Row.Cells["TextColumn"].Value = memoryChannel.Text;
629 rowProgress.Row.Tag = rowProgressSuccess.Data;
630 break;
631 }
41 office 632  
633 toolStripStatusLabel1.Text = $"{Resources.Read_memory_bank} {rowProgress.Index + 1}";
634 break;
635 case DataGridViewRowProgressFailure rowProgressFailure:
636 Log.Error(rowProgressFailure.Exception, $"{Resources.Could_not_read_memory_bank}");
637  
638 toolStripStatusLabel1.Text = $"{Resources.Could_not_read_memory_bank} {rowProgress.Index + 1}";
639 break;
640 }
641  
642 toolStripProgressBar1.Increment(1);
643 statusStrip1.Update();
644 }
645 catch (Exception exception)
646 {
647 Log.Error(exception, Resources.Unexpected_error_while_reading_memory_bank);
648 }
649 });
650  
651 await Task.Run(() => ReadMemoryBanks(rows, progress, _cancellationToken), _cancellationToken);
652  
653 if (!_cancellationToken.IsCancellationRequested)
654 {
655 toolStripProgressBar1.Value = toolStripProgressBar1.Maximum;
656 toolStripStatusLabel1.Text = "Done.";
657 }
40 office 658 }
41 office 659  
660 private async void writeToolStripMenuItem_Click(object sender, EventArgs e)
661 {
662 var rows = GetSelectedDataGridViewRows(dataGridView1);
663 var count = rows.Count;
664  
665 toolStripProgressBar1.Minimum = 0;
666 toolStripProgressBar1.Maximum = count;
667  
668 var progress = new Progress<DataGridViewRowProgress>(rowProgress =>
669 {
670 try
671 {
672 switch (rowProgress)
673 {
674 case DataGridViewRowProgressSuccess<bool> rowProgressSuccess:
675 var success = rowProgressSuccess.Data;
676  
677 if (success)
678 {
679  
680 toolStripStatusLabel1.Text =
681 $"{Resources.Wrote_memory_bank} {rowProgress.Index + 1}";
682 toolStripProgressBar1.Increment(1);
683 statusStrip1.Update();
684 return;
685 }
686  
687 Log.Error($"{Resources.Could_not_write_memory_bank}");
688 break;
689 case DataGridViewRowProgressFailure rowProgressFailure:
690 Log.Error(rowProgressFailure.Exception, $"{Resources.Could_not_write_memory_bank}");
691 break;
692 }
693  
694 toolStripStatusLabel1.Text =
695 $"{Resources.Could_not_write_memory_bank} {rowProgress.Index + 1}";
696 toolStripProgressBar1.Increment(1);
697 statusStrip1.Update();
698 }
699 catch (Exception exception)
700 {
701 Log.Error(exception, Resources.Unexpected_error_while_writing_memory_bank);
702 }
703  
704 });
705  
706 await Task.Run(() => WriteMemoryBanks(rows, progress, _cancellationToken), _cancellationToken);
707  
708 if (!_cancellationToken.IsCancellationRequested)
709 {
710 toolStripProgressBar1.Value = toolStripProgressBar1.Maximum;
711 toolStripStatusLabel1.Text = "Done.";
712 }
713 }
15 office 714 }
715 }