Skip to content

Commit 1c19c19

Browse files
Add files via upload
1 parent d8273d2 commit 1c19c19

3 files changed

Lines changed: 83 additions & 93 deletions

File tree

src/CmdRegistrar.cs

Lines changed: 40 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -6,65 +6,57 @@ namespace AzimuthConsole
66
{
77
public class CmdRegistrar
88
{
9-
private readonly AZMCombiner _combiner;
10-
private readonly SettingsContainer _settings;
11-
12-
public CmdRegistrar(AZMCombiner combiner, SettingsContainer settings)
13-
{
14-
_combiner = combiner;
15-
_settings = settings;
16-
}
17-
18-
public void RegisterTerminalCommands(CmdProcessor proc)
9+
10+
public void RegisterTerminalCommands(SettingsContainer settings, CmdProcessor proc, AZMCombiner combiner)
1911
{
20-
RegisterConnectCommand(proc, _combiner);
21-
RegisterDisconnectCommand(proc, _combiner);
22-
RegisterGetConnectionStateCommand(proc, _combiner);
23-
RegisterGetInterrogationStateCommand(proc, _combiner);
24-
RegisterGetDetectedStateCommand(proc, _combiner);
25-
RegisterCREQCommand(proc, _combiner);
26-
RegisterGetLocationAndHeadingOverrideCommand(proc, _combiner);
27-
RegisterGetOutputFormatCommand(proc, _combiner);
28-
RegisterSet3RespondersCoordinatesCommand(_settings, proc, _combiner);
29-
RegisterSetResponderIndividualUDPOutput(_settings, proc, _combiner);
30-
RegisterResponderRemoteAddressQueryCommand(proc, _combiner);
31-
RegisterSetResponderRemoteAddressQueryCommand(proc, _combiner);
12+
RegisterConnectCommand(proc, combiner);
13+
RegisterDisconnectCommand(proc, combiner);
14+
RegisterGetConnectionStateCommand(proc, combiner);
15+
RegisterGetInterrogationStateCommand(proc, combiner);
16+
RegisterGetDetectedStateCommand(proc, combiner);
17+
RegisterCREQCommand(proc, combiner);
18+
RegisterGetLocationAndHeadingOverrideCommand(proc, combiner);
19+
RegisterGetOutputFormatCommand(proc, combiner);
20+
RegisterSet3RespondersCoordinatesCommand(settings, proc, combiner);
21+
RegisterSetResponderIndividualUDPOutput(settings, proc, combiner);
22+
RegisterResponderRemoteAddressQueryCommand(proc, combiner);
23+
RegisterSetResponderRemoteAddressQueryCommand(proc, combiner);
3224

33-
RegisterPauseInterrogationCommand(proc, _combiner);
34-
RegisterResumeInterrogationCommand(proc, _combiner);
35-
RegisterLocationAndHeadingOverrideCommand(proc, _combiner);
25+
RegisterPauseInterrogationCommand(proc, combiner);
26+
RegisterResumeInterrogationCommand(proc, combiner);
27+
RegisterLocationAndHeadingOverrideCommand(proc, combiner);
3628
}
3729

38-
public void RegisterCommandLineCommands(CmdProcessor proc)
30+
public void RegisterCommandLineCommands(SettingsContainer settings, CmdProcessor proc, AZMCombiner combiner)
3931
{
40-
RegisterSettingsMainCommand(_settings, proc);
41-
RegisterSettingsAuxilary(_settings, proc);
42-
RegisterSettingsOutput(_settings, proc);
43-
RegisterSetAntennaRelativePosition(_settings, proc);
44-
RegisterSet3RespondersCoordinatesCommand(_settings, proc, _combiner);
45-
RegisterSetResponderIndividualUDPOutput(_settings, proc, _combiner);
32+
RegisterSettingsMainCommand(settings, proc);
33+
RegisterSettingsAuxilary(settings, proc);
34+
RegisterSettingsOutput(settings, proc);
35+
RegisterSetAntennaRelativePosition(settings, proc);
36+
RegisterSet3RespondersCoordinatesCommand(settings, proc, combiner);
37+
RegisterSetResponderIndividualUDPOutput(settings, proc, combiner);
4638
}
4739

48-
public void RegisterRCTRLCommands(CmdProcessor proc)
40+
public void RegisterRCTRLCommands(SettingsContainer settings, CmdProcessor proc, AZMCombiner combiner)
4941
{
50-
RegisterConnectCommand(proc, _combiner);
51-
RegisterDisconnectCommand(proc, _combiner);
52-
RegisterGetConnectionStateCommand(proc, _combiner);
53-
RegisterGetInterrogationStateCommand(proc, _combiner);
54-
RegisterGetDetectedStateCommand(proc, _combiner);
55-
RegisterCREQCommand(proc, _combiner);
56-
RegisterGetLocationAndHeadingOverrideCommand(proc, _combiner);
57-
RegisterGetOutputFormatCommand(proc, _combiner);
42+
RegisterConnectCommand(proc, combiner);
43+
RegisterDisconnectCommand(proc, combiner);
44+
RegisterGetConnectionStateCommand(proc, combiner);
45+
RegisterGetInterrogationStateCommand(proc, combiner);
46+
RegisterGetDetectedStateCommand(proc, combiner);
47+
RegisterCREQCommand(proc, combiner);
48+
RegisterGetLocationAndHeadingOverrideCommand(proc, combiner);
49+
RegisterGetOutputFormatCommand(proc, combiner);
5850

59-
RegisterSetResponderIndividualUDPOutput(_settings, proc, _combiner);
60-
RegisterResponderRemoteAddressQueryCommand(proc, _combiner);
61-
RegisterSetResponderRemoteAddressQueryCommand(proc, _combiner);
51+
RegisterSetResponderIndividualUDPOutput(settings, proc, combiner);
52+
RegisterResponderRemoteAddressQueryCommand(proc, combiner);
53+
RegisterSetResponderRemoteAddressQueryCommand(proc, combiner);
6254

63-
RegisterPauseInterrogationCommand(proc, _combiner);
64-
RegisterResumeInterrogationCommand(proc, _combiner);
65-
RegisterLocationAndHeadingOverrideCommand(proc, _combiner);
55+
RegisterPauseInterrogationCommand(proc, combiner);
56+
RegisterResumeInterrogationCommand(proc, combiner);
57+
RegisterLocationAndHeadingOverrideCommand(proc, combiner);
6658

67-
RegisterSet3RespondersCoordinatesCommand(_settings, proc, _combiner);
59+
RegisterSet3RespondersCoordinatesCommand(settings, proc, combiner);
6860
}
6961

7062

src/ConsoleInputProcessor.cs

Lines changed: 30 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,14 @@
11
using System.Text;
22

3-
public class ConsoleInputProcessor : IDisposable
3+
public class ConsoleInputProcessor : IAsyncDisposable, IDisposable
44
{
55
private readonly StringBuilder _inputBuffer = new();
6-
private CancellationTokenSource _cts = new();
6+
private readonly CancellationTokenSource _cts = new();
77
private bool _disposed;
88
private string cmdToEmulate = string.Empty;
99

10-
// Храним действие И описание для каждой горячей клавиши
1110
private readonly Dictionary<ConsoleKeyInfo, (Action action, string description)> _hotkeys = new();
1211

13-
14-
public ConsoleInputProcessor()
15-
{
16-
// Можно зарегистрировать стандартные клавиши с описаниями
17-
}
18-
19-
/// <summary>
20-
/// Регистрирует горячую клавишу с действием и описанием
21-
/// </summary>
2212
public void RegisterHotkey(ConsoleKeyInfo keyInfo, Action action, string description)
2313
{
2414
var _ki = new ConsoleKeyInfo('\0', keyInfo.Key,
@@ -31,23 +21,22 @@ public void RegisterHotkey(ConsoleKeyInfo keyInfo, Action action, string descrip
3121

3222
private static ConsoleKeyInfo DiscardKeyChar(ConsoleKeyInfo keyInfo)
3323
{
34-
return new ConsoleKeyInfo('\0', keyInfo.Key,
24+
return new ConsoleKeyInfo('\0', keyInfo.Key,
3525
keyInfo.Modifiers.HasFlag(ConsoleModifiers.Shift),
3626
keyInfo.Modifiers.HasFlag(ConsoleModifiers.Alt),
3727
keyInfo.Modifiers.HasFlag(ConsoleModifiers.Control));
3828
}
3929

40-
public void EmulateCommand(string line)
30+
public void EmulateCommand(string? line)
4131
{
42-
cmdToEmulate = line;
32+
cmdToEmulate = line ?? string.Empty;
4333
}
4434

45-
/// <summary>
46-
/// Считывает команду с консоли (неблокирующий режим)
47-
/// </summary>
48-
public string ReadCommand()
35+
public async Task<string?> ReadCommandAsync(CancellationToken cancellationToken = default)
4936
{
50-
while (!_cts.IsCancellationRequested)
37+
using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(_cts.Token, cancellationToken);
38+
39+
while (!linkedCts.IsCancellationRequested)
5140
{
5241
if (!string.IsNullOrEmpty(cmdToEmulate))
5342
{
@@ -61,9 +50,9 @@ public string ReadCommand()
6150
var keyInfo = Console.ReadKey(true);
6251
var _ki = DiscardKeyChar(keyInfo);
6352

64-
if (_hotkeys.ContainsKey(_ki))
53+
if (_hotkeys.TryGetValue(_ki, out var hotkey))
6554
{
66-
_hotkeys[_ki].action.Invoke();
55+
hotkey.action.Invoke();
6756
continue;
6857
}
6958

@@ -90,15 +79,12 @@ public string ReadCommand()
9079
}
9180
}
9281

93-
Thread.Sleep(10);
82+
await Task.Delay(10, linkedCts.Token).ConfigureAwait(false);
9483
}
9584

9685
return null;
9786
}
9887

99-
/// <summary>
100-
/// Возвращает форматированную строку со списком всех горячих клавиш и их описаний
101-
/// </summary>
10288
public string GetHotkeysDescription()
10389
{
10490
if (_hotkeys.Count == 0)
@@ -116,16 +102,12 @@ public string GetHotkeysDescription()
116102
: keyInfo.Key.ToString();
117103
string description = kvp.Value.description;
118104

119-
120105
sb.AppendLine($" {modifiers}{keyName}{description}");
121106
}
122107

123108
return sb.ToString();
124109
}
125110

126-
/// <summary>
127-
/// Формирует строку с модификаторами (Ctrl+, Alt+, Shift+)
128-
/// </summary>
129111
private static string GetModifiersString(ConsoleKeyInfo keyInfo)
130112
{
131113
var parts = new List<string>();
@@ -137,13 +119,14 @@ private static string GetModifiersString(ConsoleKeyInfo keyInfo)
137119
if (keyInfo.Modifiers.HasFlag(ConsoleModifiers.Control))
138120
parts.Add("Ctrl+");
139121

140-
141122
return string.Join("", parts);
142123
}
143124

144-
/// <summary>
145-
/// Освобождает ресурсы
146-
/// </summary>
125+
public void Cancel()
126+
{
127+
_cts.Cancel();
128+
}
129+
147130
public void Dispose()
148131
{
149132
if (_disposed) return;
@@ -152,5 +135,17 @@ public void Dispose()
152135
_cts.Dispose();
153136

154137
_disposed = true;
138+
GC.SuppressFinalize(this);
139+
}
140+
141+
public async ValueTask DisposeAsync()
142+
{
143+
if (_disposed) return;
144+
145+
await _cts.CancelAsync();
146+
_cts.Dispose();
147+
148+
_disposed = true;
149+
GC.SuppressFinalize(this);
155150
}
156-
}
151+
}

src/Program.cs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public enum ConsoleLogOptions
1616
Invalid
1717
}
1818

19-
private static void Main(string[] args)
19+
private static async Task Main(string[] args)
2020
{
2121
bool application_terminate = false;
2222

@@ -29,7 +29,7 @@ private static void Main(string[] args)
2929
UDPTranslator? rctrl_udp_translator = null;
3030
AZMCombiner? azmCombiner = null;
3131
ConsoleInputProcessor inputProcessor = new();
32-
CmdRegistrar registrar = new CmdRegistrar(azmCombiner, settings);
32+
CmdRegistrar registrar = new CmdRegistrar();
3333

3434
var logFileName = StrUtils.GetTimeDirTreeFileName(DateTime.Now, AppContext.BaseDirectory, "log", "log", true);
3535

@@ -41,7 +41,9 @@ private static void Main(string[] args)
4141
};
4242
logger.WriteStart();
4343
logger.Write($"{Assembly.GetExecutingAssembly().GetName().Name} v{Assembly.GetExecutingAssembly().GetName().Version} (C) UC&NL, unavlab.com");
44-
44+
45+
AppDomain.CurrentDomain.UnhandledException += (s, e) => logger.Write($"FATAL: {e.ExceptionObject}");
46+
4547
CmdProcessor cmdLineArgProcessor = new();
4648
cmdLineArgProcessor.OutputMessageHandler += (line) => logger.Write(line);
4749
CmdProcessor terminalCmdProcessor = new();
@@ -148,10 +150,8 @@ bool StopLogPlayBack()
148150
},
149151
"Playback a log file. PLAY,[reserved],[logFile].");
150152

151-
registrar.RegisterCommandLineCommands(cmdLineArgProcessor);
152-
registrar.RegisterTerminalCommands(terminalCmdProcessor);
153-
registrar.RegisterRCTRLCommands(rctrlCmdProcessor);
154-
153+
registrar.RegisterCommandLineCommands(settings, cmdLineArgProcessor, azmCombiner);
154+
155155
foreach (var arg in args)
156156
{
157157
cmdLineArgProcessor.Process(arg);
@@ -258,7 +258,10 @@ bool StopLogPlayBack()
258258
azmCombiner.CREQResultHandler += (o, e) => azmCombiner.OutputHandler(azmCombiner,
259259
new StringEventArgs($"CREQR,{e.RemoteAddress},{e.ReqCode},{e.ResCode}"));
260260
azmCombiner.RSTSReceivedHandler += (o, e) => azmCombiner.OutputHandler(azmCombiner,
261-
new StringEventArgs($"RRA,{e.Addr}"));
261+
new StringEventArgs($"RRA,{e.Addr}"));
262+
263+
registrar.RegisterTerminalCommands(settings, terminalCmdProcessor, azmCombiner);
264+
registrar.RegisterRCTRLCommands(settings, rctrlCmdProcessor, azmCombiner);
262265

263266
if (settings.aux1Enabled)
264267
{
@@ -306,8 +309,8 @@ bool StopLogPlayBack()
306309
logger.Write("Ready");
307310

308311
while (!application_terminate)
309-
{
310-
var cmd = inputProcessor.ReadCommand();
312+
{
313+
var cmd = await inputProcessor.ReadCommandAsync();
311314
if (cmd != null)
312315
terminalCmdProcessor.Process(cmd);
313316
}

0 commit comments

Comments
 (0)