shayne_lo hai 3 semanas
pai
achega
dad00d035b
Modificáronse 2 ficheiros con 53 adicións e 50 borrados
  1. 2 2
      Simano/Properties/AssemblyInfo.cs
  2. 51 48
      Simano/Service/SimanoService.cs

+ 2 - 2
Simano/Properties/AssemblyInfo.cs

@@ -48,5 +48,5 @@ using System.Windows;
 //      組建編號
 //      修訂
 //
-[assembly: AssemblyVersion("0.0.1.0")]
-[assembly: AssemblyFileVersion("0.0.1.0")]
+[assembly: AssemblyVersion("0.0.2.0")]
+[assembly: AssemblyFileVersion("0.0.2.0")]

+ 51 - 48
Simano/Service/SimanoService.cs

@@ -59,6 +59,10 @@ namespace Simano.Service
 
                 ClearReadBuffer();
                 var getStatusSuccess = await GetBoardStatus();
+                if (!getStatusSuccess)
+                {
+                    serialPort.Close();
+                }
                 return getStatusSuccess;
             }
             catch (Exception ex)
@@ -75,49 +79,26 @@ namespace Simano.Service
                 return false;
             }
 
-            var test = serialPort.BytesToRead;
-
             WriteLog(null, "Detecting Board status...");
 
-            await Task.Delay(2500);
-            var canreceivedData = serialPort.BytesToRead > 0;
-
-            if (canreceivedData)
+            SendGetStatusCmd();
+            var result = await GetGetStatusRespond();
+            if (result is null)
             {
-                var readBuffer = new byte[20];
-                var readByteCnt = serialPort.Read(readBuffer, 0, 20);
-
-                try
-                {
-                    var reseivedString = Encoding.UTF8.GetString(readBuffer);
-                    WriteLog(null, reseivedString);
-                    if (reseivedString.Contains("OPEN"))
-                    {
-                        WriteLog(null, "ApiMode");
-                        isApiMode = true;
-                        return true;
-                    }
-                    return false;
-                }
-                catch
-                {
-                    return false;
-                }
+                return false;
             }
-
-            if (!canreceivedData)
+            if (result == 0x89)
             {
-                serialPort.Close();
-                var openPortResult = await CubeProgrammerAPIWrapper.OpenPort(portName);
-                if (!openPortResult)
-                    return false;
-                CubeProgrammerAPIAdapter.ClosePort();
-                serialPort.Open();
+                WriteLog(null, "ApiMode Detected");
+                isApiMode = true;
+                return true;
+            }
+            if (result == 0x79 || result == 0x1F)
+            {
+                WriteLog(null, "BootloadMode Detected");
                 isApiMode = false;
-                WriteLog(null, "BootloaderMode");
                 return true;
             }
-
             return false;
         }
 
@@ -136,6 +117,12 @@ namespace Simano.Service
 
         public async Task<bool> FlashFirmware(string filePath)
         {
+            if (serialPort is null ||
+                !serialPort.IsOpen)
+            {
+                return false;
+            }
+
             await GetBoardStatus();
             if (isApiMode)
             {
@@ -181,23 +168,33 @@ namespace Simano.Service
             ClearReadBuffer();
             var cmd = GetFlashFirmwareCmd();
             serialPort.Write(cmd, 0, cmd.Length);
+            return;
+        }
 
-            //var readBuffer = new byte[10];
-            //var readByteCnt = serialPort.Read(readBuffer, 0 , 10);
-
-            //try
-            //{
-            //    var reseivedString = Encoding.UTF8.GetString(readBuffer);
-            //    Console.WriteLine(reseivedString);
-            //}
-            //catch
-            //{
-
-            //}
-
+        private void SendGetStatusCmd()
+        {
+            ClearReadBuffer();
+            var cmd = GetGetStatusCmd();
+            serialPort.Write(cmd, 0, cmd.Length);
             return;
         }
 
+        private async Task<byte?> GetGetStatusRespond()
+        {
+            await Task.Delay(1000);
+            if (serialPort.BytesToRead <= 0)
+            {
+                return null;
+            }
+            var dumpBuffer = new byte[serialPort.BytesToRead];
+            serialPort.Read(dumpBuffer, 0, dumpBuffer.Length);
+            if (dumpBuffer.Length != 1)
+            {
+                return null;
+            }
+            return dumpBuffer[0];
+        }
+
         private byte[] GetFlashFirmwareCmd()
         {
             byte[] baseCmd = new byte[] { 0x00, 0x00, 0x02, 0xD1, 0x01, 0x26, 0xD4 };
@@ -206,6 +203,12 @@ namespace Simano.Service
             return baseCmd;
         }
 
+        private byte[] GetGetStatusCmd()
+        {
+            byte[] baseCmd = new byte[] { 0x7F, 0x7F };
+            return baseCmd;
+        }
+
         private void ClearReadBuffer()
         {
             if (serialPort.BytesToRead > 0)