public bool UploadPX4(string filename, BoardDetect.boards board)
{
Uploader up;
updateProgress(-1, "Reading Hex File");
px4uploader.Firmware fw;
try
{
fw = px4uploader.Firmware.ProcessFirmware(filename);
}
catch (Exception ex)
{
CustomMessageBox.Show(Strings.ErrorFirmwareFile + "\n\n" + ex.ToString(), Strings.ERROR);
return false;
}
try
{
updateProgress(-1, "Look for HeartBeat");
// check if we are seeing heartbeats
MainV2.comPort.BaseStream.Open();
MainV2.comPort.giveComport = true;
if (MainV2.comPort.getHeartBeat().Length > 0)
{
updateProgress(-1, "Reboot to Bootloader");
MainV2.comPort.doReboot(true, false);
MainV2.comPort.Close();
//specific action for VRBRAIN4 board that needs to be manually disconnected before uploading
if (board == BoardDetect.boards.vrbrainv40)
{
CustomMessageBox.Show(
"VRBRAIN 4 detected. Please unplug the board then press OK and plug back in.\n");
}
}
else
{
updateProgress(-1, "No HeartBeat found");
MainV2.comPort.BaseStream.Close();
CustomMessageBox.Show(Strings.PleaseUnplugTheBoardAnd);
}
}
catch (Exception ex)
{
log.Error(ex);
CustomMessageBox.Show(Strings.PleaseUnplugTheBoardAnd);
}
DateTime DEADLINE = DateTime.Now.AddSeconds(30);
updateProgress(-1, "Scanning comports");
while (DateTime.Now < DEADLINE)
{
string[] allports = SerialPort.GetPortNames();
foreach (string port in allports)
{
log.Info(DateTime.Now.Millisecond + " Trying Port " + port);
try
{
up = new Uploader(port, 115200);
}
catch (Exception ex)
{
//System.Threading.Thread.Sleep(50);
Console.WriteLine(ex.Message);
continue;
}
try
{
up.identify();
updateProgress(-1, "Identify");
log.InfoFormat("Found board type {0} boardrev {1} bl rev {2} fwmax {3} on {4}", up.board_type,
up.board_rev, up.bl_rev, up.fw_maxsize, port);
up.ProgressEvent += new Uploader.ProgressEventHandler(up_ProgressEvent);
up.LogEvent += new Uploader.LogEventHandler(up_LogEvent);
}
catch (Exception)
{
Console.WriteLine("Not There..");
//Console.WriteLine(ex.Message);
up.close();
continue;
}
updateProgress(-1, "Connecting");
// test if pausing here stops - System.TimeoutException: The write timed out.
System.Threading.Thread.Sleep(500);
try
{
up.currentChecksum(fw);
}
catch (IOException ex)
{
log.Error(ex);
CustomMessageBox.Show("lost communication with the board.", "lost comms");
up.close();
return false;
}
catch
{
up.__reboot();
up.close();
CustomMessageBox.Show(Strings.NoNeedToUpload);
return true;
}
try
{
updateProgress(0, "Upload");
up.upload(fw);
updateProgress(100, "Upload Done");
}
catch (Exception ex)
{
updateProgress(0, "ERROR: " + ex.Message);
log.Info(ex);
Console.WriteLine(ex.ToString());
return false;
}
finally
{
up.close();
}
// wait for IO firmware upgrade and boot to a mavlink state
CustomMessageBox.Show(Strings.PleaseWaitForTheMusicalTones);
return true;
}
}
updateProgress(0, "ERROR: No Response from board");
return false;
}