private void loadDeviceList()
{
try
{
devices.Clear();
using (TextReader dl = new StreamReader(Path.Combine(Application.StartupPath, "DeviceList.txt")))
{
string line;
int lineNum = 0;
List<string> fields = null;
while ((line = dl.ReadLine()) != null)
{
lineNum++;
line = line.Trim();
if (line.Length == 0 || (fields != null && (line.StartsWith("#") || line.StartsWith("\"#"))))
continue;
List<string> values = new List<string>();
#region Parse to values
string part = string.Empty;
int state = 0;
foreach (char c in line)
{
switch (state)
{
case 0:
if (!Char.IsWhiteSpace(c))
{
if (c == '"')
state = 2; // Collect up to next " ("" replaced to single ")
else if (c == ',')
{
values.Add(part.Trim());
part = string.Empty;
}
else
{
part += c;
state = 1;
}
}
break;
case 1:
if (c == ',')
{
values.Add(part.Trim());
part = string.Empty;
state = 0;
}
else
part += c;
break;
case 2:
if (c == '"')
state = 3;
else
part += c;
break;
case 3:
if (c == '"')
{
part += '"';
state = 2;
}
else
{
values.Add(part.Trim());
part = string.Empty;
if (c == ',')
state = 0;
else if (!Char.IsWhiteSpace(c))
state = 10;
else
state = 4;
}
break;
case 4:
if (c == ',')
state = 0;
else if (!Char.IsWhiteSpace(c))
state = 10;
break;
}
if (state == 10)
break;
}
if (state == 0 || state == 1 || state == 3)
{
if (part.Length > 0)
values.Add(part.Trim());
}
else if (state != 4)
{
MessageBox.Show(string.Format("Bad line ({0}): {1}", lineNum, line));
continue;
}
#endregion
if (fields == null)
{
if (values.Count > 0)
fields = values;
else
{
MessageBox.Show("First line not contains fields name");
break;
}
for (int i = 0; i < fields.Count; i++)
{
string field = fields[i];
if (field == null)
field = string.Empty;
if (field.StartsWith("#"))
field = field.Substring(1).Trim();
if (field.Length == 0)
{
MessageBox.Show(string.Format("Empty field name at position {0}", i + 1));
fields = null;
break;
}
else
fields[i] = field;
}
if (fields == null)
break;
continue;
}
C2Device device = new C2Device();
bool scan = true;
device.Name = parseString(values, fields, "Name", ref scan, true);
device.ID = parseByte(values, fields, "ID", ref scan, true);
device.ExtraID = parseByte(values, fields, "Extraid", ref scan, true);
device.Version = parseInt(values, fields, "Version", ref scan, true);
device.StringObserved = parseString(values, fields, "String observed", ref scan, false);
device.FlashSize = parseInt(values, fields, "Flash size", ref scan, true);
device.FlashSectorSize = parseInt(values, fields, "Flash sector Size", ref scan, true);
device.XramSize = parseInt(values, fields, "Xram size", ref scan, true);
device.ExternalBus = parseBool(values, fields, "External bus", ref scan, true);
device.Tested = parseBool(values, fields, "Tested", ref scan, true);
device.LockType = parseString(values, fields, "Lock Type", ref scan, true);
device.Readlock = parseInt(values, fields, "Read lock", ref scan, true);
device.WriteLock = parseInt(values, fields, "Write Lock", ref scan, true);
device.SingleLock = parseInt(values, fields, "Single lock", ref scan, true);
device.Bottom = parseInt(values, fields, "Bottom", ref scan, true);
device.Top = parseInt(values, fields, "Top", ref scan, true);
device.Present = parseBool(values, fields, "Present", ref scan, true);
device.Start = parseInt(values, fields, "Start", ref scan, true);
device.Length = parseInt(values, fields, "Length", ref scan, true);
device.SectorSize = parseInt(values, fields, "Sector Size", ref scan, true);
device.PagedSFR = parseBool(values, fields, "Paged SFR", ref scan, true);
device.SFR_Page = parseInt(values, fields, "SFR_Page", ref scan, true);
if (scan)
{
device.USBFIFOSize = parseInt(values, fields, "USB FIFO", ref scan, true);
if (scan)
device.USBFIFO = true;
else
{
scan = true;
device.USBFIFO = parseBool(values, fields, "USB FIFO", ref scan, true);
}
}
device.DebugInterface = parseString(values, fields, "Debug Interface", ref scan, true);
device.Cache = parseInt(values, fields, "Cache", ref scan, true);
device.BP0L = parseString(values, fields, "BP0L", ref scan, true);
device.BP0H = parseString(values, fields, "BP0H", ref scan, true);
device.BP1L = parseString(values, fields, "BP1L", ref scan, true);
device.BP1H = parseString(values, fields, "BP1H", ref scan, true);
device.BP2L = parseString(values, fields, "BP2L", ref scan, true);
device.BP2H = parseString(values, fields, "BP2H", ref scan, true);
device.BP3L = parseString(values, fields, "BP3L", ref scan, true);
device.BP3H = parseString(values, fields, "BP3H", ref scan, true);
device.Comments = parseString(values, fields, "Comments", ref scan, false);
device.FPREG = parseByte(values, fields, "FPREG", ref scan, false);
if (device.FPREG == 0)
device.FPREG = 0xAD;
if (scan)
devices.Add(device);
else
{
MessageBox.Show(string.Format("DeviceList.txt has bad values at line:{0}.", lineNum));
break;
}
}
dl.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
cbDevices.Items.Clear();
foreach (C2Device device in devices)
{
cbDevices.Items.Add(device);
}
}