HamBook – Blame information for rev 51

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