private void UploadFW(bool custom = false)
{
ICommsSerial comPort = new SerialPort();
var uploader = new Uploader();
if (MainV2.comPort.BaseStream.IsOpen)
{
try
{
getTelemPortWithRadio(ref comPort);
uploader.PROG_MULTI_MAX = 64;
}
catch (Exception ex)
{
CustomMessageBox.Show("Error " + ex);
}
}
try
{
comPort.PortName = MainV2.comPort.BaseStream.PortName;
comPort.BaudRate = 115200;
comPort.Open();
}
catch
{
CustomMessageBox.Show("Invalid ComPort or in use");
return;
}
// prep what we are going to upload
var iHex = new IHex();
iHex.LogEvent += iHex_LogEvent;
iHex.ProgressEvent += iHex_ProgressEvent;
var bootloadermode = false;
// attempt bootloader mode
try
{
if (upload_xmodem(comPort))
{
comPort.Close();
return;
}
comPort.BaudRate = 115200;
uploader_ProgressEvent(0);
uploader_LogEvent("Trying Bootloader Mode");
uploader.port = comPort;
uploader.connect_and_sync();
uploader.ProgressEvent += uploader_ProgressEvent;
uploader.LogEvent += uploader_LogEvent;
uploader_LogEvent("In Bootloader Mode");
bootloadermode = true;
}
catch (Exception ex1)
{
log.Error(ex1);
// cleanup bootloader mode fail, and try firmware mode
comPort.Close();
if (MainV2.comPort.BaseStream.IsOpen)
{
// default baud... guess
comPort.BaudRate = 57600;
}
else
{
comPort.BaudRate = MainV2.comPort.BaseStream.BaudRate;
}
try
{
comPort.Open();
}
catch
{
CustomMessageBox.Show("Error opening port", "Error");
return;
}
uploader.ProgressEvent += uploader_ProgressEvent;
uploader.LogEvent += uploader_LogEvent;
uploader_LogEvent("Trying Firmware Mode");
bootloadermode = false;
}
// check for either already bootloadermode, or if we can do a ATI to ID the firmware
if (bootloadermode || doConnect(comPort))
{
// put into bootloader mode/update mode
if (!bootloadermode)
{
try
{
comPort.Write("AT&UPDATE\r\n");
var left = comPort.ReadExisting();
log.Info(left);
Sleep(700);
comPort.BaudRate = 115200;
}
catch
{
}
if (upload_xmodem(comPort))
{
comPort.Close();
return;
}
comPort.BaudRate = 115200;
}
try
{
// force sync after changing baudrate
uploader.connect_and_sync();
}
catch
{
CustomMessageBox.Show("Failed to sync with Radio");
goto exit;
}
var device = Uploader.Board.FAILED;
var freq = Uploader.Frequency.FAILED;
// get the device type and frequency in the bootloader
uploader.getDevice(ref device, ref freq);
// get firmware for this device
if (getFirmware(device, custom))
{
// load the hex
try
{
iHex.load(firmwarefile);
}
catch
{
CustomMessageBox.Show("Bad Firmware File");
goto exit;
}
// upload the hex and verify
try
{
uploader.upload(comPort, iHex);
}
catch (Exception ex)
{
CustomMessageBox.Show("Upload Failed " + ex.Message);
}
}
else
{
CustomMessageBox.Show("Failed to download new firmware");
}
}
else
{
CustomMessageBox.Show("Failed to identify Radio");
}
exit:
if (comPort.IsOpen)
comPort.Close();
}