|
@@ -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)
|