From c398bc2df860347e1633d1fb36b70d7021fe011a Mon Sep 17 00:00:00 2001 From: JackCarterSmith Date: Sat, 6 Mar 2021 01:10:30 +0100 Subject: [PATCH] Finish JSON parser prototype Need to better organize serial management, some bytes are truncated --- .gitignore | 3 +- Programmer.cs | 3 +- SerialController.cs | 31 ++++++++--- TinyFPGA-VisualProgrammer.csproj | 39 +++++++++++++- TinyFPGA-VisualProgrammer.csproj.user | 13 +++++ TinyProg.cs | 75 ++++++++++++++++++++++----- packages.config | 4 ++ 7 files changed, 144 insertions(+), 24 deletions(-) create mode 100644 TinyFPGA-VisualProgrammer.csproj.user create mode 100644 packages.config diff --git a/.gitignore b/.gitignore index 3e16852..103db3d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ bin/ obj/ -.vs/ \ No newline at end of file +.vs/ +packages/ \ No newline at end of file diff --git a/Programmer.cs b/Programmer.cs index b8dbf92..d2c92a5 100644 --- a/Programmer.cs +++ b/Programmer.cs @@ -8,7 +8,6 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; -using System.IO.Ports; namespace TinyFPGA_VisualProgrammer { @@ -78,7 +77,7 @@ namespace TinyFPGA_VisualProgrammer if (sController.GetPortOpened()) TProg.CheckTinyPresence(); if (TProg.TinyFPGAIsConnected) - statusLabel.Text = "XXXX found."; + statusLabel.Text = TProg.GetBoardData().name + " v" + TProg.GetBoardData().hver + " found."; else statusLabel.Text = "No TinyFPGA found."; connectBtn.Text = "Disconnect"; diff --git a/SerialController.cs b/SerialController.cs index a312335..586d90c 100644 --- a/SerialController.cs +++ b/SerialController.cs @@ -18,6 +18,10 @@ namespace TinyFPGA_VisualProgrammer public SerialController() { mainSerial.BaudRate = 9600; + mainSerial.ReceivedBytesThreshold = 1; + mainSerial.ReadBufferSize = 4096; + mainSerial.WriteBufferSize = 4096; + mainSerial.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); List usbPorts = ComPortNames("1D50", "6130"); if (usbPorts.Count > 0) { @@ -30,11 +34,19 @@ namespace TinyFPGA_VisualProgrammer } } + private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) + { + SerialPort sp = (SerialPort)sender; + string indata = sp.ReadExisting(); + Console.WriteLine("Data Received:"); + Console.Write(indata); + } + public void OpenPort() { mainSerial.PortName = comPortName; - mainSerial.ReadTimeout = 2000; - mainSerial.WriteTimeout = 5000; + mainSerial.ReadTimeout = 1000; + mainSerial.WriteTimeout = 1000; try { mainSerial.Open(); @@ -56,29 +68,36 @@ namespace TinyFPGA_VisualProgrammer return mainSerial.IsOpen; } + public void clearBuffer() { + mainSerial.DiscardInBuffer(); + mainSerial.DiscardOutBuffer(); + } + public void SendBytes(byte[] db, int dc) { - mainSerial.WriteTimeout = 5000; - try { mainSerial.Write(db, 0, dc); } catch { } + + //while (mainSerial.BytesToWrite >= 0) { } + //mainSerial.DiscardOutBuffer(); } public byte[] WaitForBytes(int dc) { byte[] result = new byte[dc]; - mainSerial.ReadTimeout = 2000; - try { mainSerial.Read(result, 0, dc); } catch { } + //while (mainSerial.BytesToRead >= 0) { } + //mainSerial.DiscardOutBuffer(); + return result; } diff --git a/TinyFPGA-VisualProgrammer.csproj b/TinyFPGA-VisualProgrammer.csproj index b02677a..24fd587 100644 --- a/TinyFPGA-VisualProgrammer.csproj +++ b/TinyFPGA-VisualProgrammer.csproj @@ -12,6 +12,21 @@ 512 true true + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true AnyCPU @@ -22,15 +37,18 @@ DEBUG;TRACE prompt 4 + true AnyCPU pdbonly true bin\Release\ - TRACE + + prompt 4 + true Resources\tinyfpga-icon.ico @@ -38,7 +56,13 @@ TinyFPGA_VisualProgrammer.Program + + true + + + packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll + @@ -75,6 +99,7 @@ Resources.resx True + SettingsSingleFileGenerator Settings.Designer.cs @@ -94,5 +119,17 @@ + + + False + Microsoft .NET Framework 4.7.2 %28x86 et x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + \ No newline at end of file diff --git a/TinyFPGA-VisualProgrammer.csproj.user b/TinyFPGA-VisualProgrammer.csproj.user new file mode 100644 index 0000000..4b17184 --- /dev/null +++ b/TinyFPGA-VisualProgrammer.csproj.user @@ -0,0 +1,13 @@ + + + + publish\ + + + + + + fr-FR + false + + \ No newline at end of file diff --git a/TinyProg.cs b/TinyProg.cs index 6b72d1a..75d4699 100644 --- a/TinyProg.cs +++ b/TinyProg.cs @@ -1,12 +1,37 @@ -using System; +using Newtonsoft.Json; +using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace TinyFPGA_VisualProgrammer { + public class JSON_BoardMeta + { + public string name { get; set; } + public string fpga { get; set; } + public string hver { get; set; } + public string uuid { get; set; } + } + + public class JSON_BootMeta + { + public string bootloader { get; set; } + public string bver { get; set; } + public string update { get; set; } + public JSON_AddrMap addrmap { get; set; } + } + + public class JSON_AddrMap + { + public string bootloader { get; set; } + public string userimage { get; set; } + public string userdata { get; set; } + } + public class TinyProg { SerialController pPort = null; @@ -14,6 +39,7 @@ namespace TinyFPGA_VisualProgrammer byte SecurePage_writeCmd = 0x00; byte SecurePage_readCmd = 0x00; byte SecurePage_eraseCmd = 0x00; + TinyMeta tinyMeta = null; public bool TinyFPGAIsConnected { get; private set; } @@ -47,11 +73,23 @@ namespace TinyFPGA_VisualProgrammer SecurePage_readCmd = 0x48; SecurePage_eraseCmd = 0x44; } - - TinyFPGAIsConnected = true; } - //@TODO: Add json security parser + tinyMeta = new TinyMeta(this); + if (tinyMeta.BoardMeta != null) + TinyFPGAIsConnected = true; + else + TinyFPGAIsConnected = false; + } + + public JSON_BoardMeta GetBoardData() + { + return tinyMeta.BoardMeta; + } + + public JSON_BootMeta GetBootData() + { + return tinyMeta.BootMeta; } byte[] SendCommand(byte opcode, byte[] addr, byte[] datas, uint read_len = 0) @@ -88,12 +126,11 @@ namespace TinyFPGA_VisualProgrammer /* * Send datas container through serial line */ + //pPort.clearBuffer(); pPort.SendBytes(cmdSequence, cmdSequence.Length); if (read_len > 0) - { _ret = pPort.WaitForBytes((int)read_len); - } return _ret; } @@ -131,39 +168,49 @@ namespace TinyFPGA_VisualProgrammer void EraseSecureRegPage(uint page) { FlashWriteEnable(); - SendCommand(SecurePage_eraseCmd, BitConverter.GetBytes(page << 8 + SecurePage_bitOffset), null); + SendCommand(SecurePage_eraseCmd, BitConverter.GetBytes((page & 0xFFFF) << 8 + SecurePage_bitOffset), null); WaitWhileBusy(); } void ProgramSecureRegPage(uint page, byte[] data) { FlashWriteEnable(); - SendCommand(SecurePage_writeCmd, BitConverter.GetBytes(page << 8 + SecurePage_bitOffset), data); + SendCommand(SecurePage_writeCmd, BitConverter.GetBytes((page & 0xFFFF) << 8 + SecurePage_bitOffset), data); WaitWhileBusy(); } - byte[] ReadSecureRegPage(uint page) + public string ReadSecureRegPage(uint page) { - return SendCommand(SecurePage_readCmd, BitConverter.GetBytes(page << 8 + SecurePage_bitOffset), new byte[] { 0x00 }, 255); + return Encoding.UTF8.GetString(SendCommand(SecurePage_readCmd, BitConverter.GetBytes((page & 0xFFFF) << 8 + SecurePage_bitOffset), new byte[] { 0x00 }, 255)).Insert(0, "{"); } } public class TinyMeta { TinyProg tProg; - //JSONRoot root; + //JSONRoot JSON_root; + public JSON_BoardMeta BoardMeta { get; private set; } + public JSON_BootMeta BootMeta { get; private set; } public TinyMeta(TinyProg tProg) { this.tProg = tProg; tProg.WakeCmd(); - //this.root = ReadMetadata(); + ReadMetadata(); } - - void ParseJSON() + void ReadMetadata() { + string rawJSON; + rawJSON = tProg.ReadSecureRegPage(1).Substring(13, 107); + BoardMeta = JsonConvert.DeserializeObject(rawJSON); // Read 1st register, contain boardmeta + Thread.Sleep(200); + + rawJSON = tProg.ReadSecureRegPage(2).Substring(12, 209); + BootMeta = JsonConvert.DeserializeObject(rawJSON); // Read 2nd register, contain bootmeta + Thread.Sleep(200); + //tProg.ReadSecureRegPage(3); // Read 3rd register, contain nothing } } } diff --git a/packages.config b/packages.config new file mode 100644 index 0000000..a9de8b5 --- /dev/null +++ b/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file