-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgram.cs
133 lines (111 loc) · 4.31 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using System.Diagnostics;
using System.Text.Json;
namespace AVRDudeWrapper
{
class Program
{
private static IEnumerable<Preset>? _presets = new List<Preset>();
static void Main(string[] args)
{
if (!ParseArguments(args, out string sourceFilename, out string? configFilename)) return;
if (!LoadPresets(configFilename)) return;
Preset? preset = null;
Console.WriteLine("Enter preset name:");
string presetName = Console.ReadLine();
preset = _presets.FirstOrDefault(x => x.Name == presetName);
if (preset == null) preset = _presets.OrderByDescending(x => x.LastUsed).First();
else
{
Console.WriteLine("Enter port name:");
string? portName = Console.ReadLine();
if (portName is not null or "") preset.Port = portName;
}
RunAVRDude(preset, sourceFilename);
SavePresets(configFilename);
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
private static bool ParseArguments(string[] args, out string sourceFilename, out string? configFilename)
{
sourceFilename = "";
configFilename = $"{Directory.GetCurrentDirectory()}\\presets.json";
if (args.Length == 0)
{
PrintError("Too few arguments!");
return false;
}
if(args.Length > 2)
{
PrintError("Too many arguments!");
return false;
}
sourceFilename = args[0];
if (args.Length == 2 && args[1] != "") configFilename = args[1];
return true;
}
private static void RunAVRDude(Preset preset, string filename)
{
preset.LastUsed = _presets.Max(x => x.LastUsed) + 1;
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("avrdude.exe says:");
Console.ResetColor();
Process.Start("avrdude", new []{$"-C{GetConfigPath()}\\avrdude.conf", "-v", $"-p{preset.MCUName}", $"-c{preset.Programmer}", $"-P{preset.Port}", $"-b{preset.BaudRate}", "-D", $"-Uflash:w:{filename}:a"}).WaitForExit();
}
private static string GetConfigPath()
{
string[] path = Environment.GetEnvironmentVariable("PATH").Split(';');
return path.FirstOrDefault(x => x.Contains("avrdude"));
}
private static void PrintError(string error)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(error);
Console.ResetColor();
}
private static bool LoadPresets(string filename)
{
if (!File.Exists(filename))
{
PrintError($"File '{filename}' does not exist!");
return false;
}
using (FileStream jsonStream = new FileStream(filename, FileMode.Open))
{
try
{
_presets = (IEnumerable<Preset>)JsonSerializer.Deserialize(jsonStream, _presets.GetType());
}
catch (Exception e)
{
PrintError("Invalid json format!");
return false;
}
}
return true;
}
private static void SavePresets(string filename)
{
if (!File.Exists(filename)) return;
using (FileStream jsonStream = new FileStream(filename, FileMode.Truncate))
JsonSerializer.Serialize(jsonStream, _presets, _presets.GetType());
}
}
class Preset
{
public string Name { get; set; }
public string MCUName { get; set; }
public string Programmer { get; set; }
public int BaudRate { get; set; }
public int LastUsed { get; set; }
public string Port { get; set; }
public Preset(string name, string mcuName, string programmer, int baudRate, int lastUsed, string port)
{
Name = name;
MCUName = mcuName;
Programmer = programmer;
BaudRate = baudRate;
LastUsed = lastUsed;
Port = port;
}
}
}