Fix: Race conditions
This commit is contained in:
parent
a32bd17b75
commit
f729ab4b12
1 changed files with 18 additions and 26 deletions
|
@ -114,10 +114,10 @@ struct FirmwareDialog::priv
|
||||||
void flashing_done(AvrDudeComplete complete);
|
void flashing_done(AvrDudeComplete complete);
|
||||||
void check_model_id(const HexFile &metadata, const SerialPortInfo &port);
|
void check_model_id(const HexFile &metadata, const SerialPortInfo &port);
|
||||||
|
|
||||||
void prepare_common(AvrDude &, const SerialPortInfo &port);
|
void prepare_common(AvrDude &, const SerialPortInfo &port, const std::string &filename);
|
||||||
void prepare_mk2(AvrDude &, const SerialPortInfo &port);
|
void prepare_mk2(AvrDude &, const SerialPortInfo &port, const std::string &filename);
|
||||||
void prepare_mk3(AvrDude &, const SerialPortInfo &port);
|
void prepare_mk3(AvrDude &, const SerialPortInfo &port, const std::string &filename);
|
||||||
void prepare_mm_control(AvrDude &, const SerialPortInfo &port);
|
void prepare_mm_control(AvrDude &, const SerialPortInfo &port, const std::string &filename);
|
||||||
void perform_upload();
|
void perform_upload();
|
||||||
|
|
||||||
void cancel();
|
void cancel();
|
||||||
|
@ -224,10 +224,8 @@ void FirmwareDialog::priv::check_model_id(const HexFile &metadata, const SerialP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FirmwareDialog::priv::prepare_common(AvrDude &avrdude, const SerialPortInfo &port)
|
void FirmwareDialog::priv::prepare_common(AvrDude &avrdude, const SerialPortInfo &port, const std::string &filename)
|
||||||
{
|
{
|
||||||
auto filename = hex_picker->GetPath();
|
|
||||||
|
|
||||||
std::vector<std::string> args {{
|
std::vector<std::string> args {{
|
||||||
extra_verbose ? "-vvvvv" : "-v",
|
extra_verbose ? "-vvvvv" : "-v",
|
||||||
"-p", "atmega2560",
|
"-p", "atmega2560",
|
||||||
|
@ -238,7 +236,7 @@ void FirmwareDialog::priv::prepare_common(AvrDude &avrdude, const SerialPortInfo
|
||||||
"-P", port.port,
|
"-P", port.port,
|
||||||
"-b", "115200", // TODO: Allow other rates? Ditto below.
|
"-b", "115200", // TODO: Allow other rates? Ditto below.
|
||||||
"-D",
|
"-D",
|
||||||
"-U", (boost::format("flash:w:0:%1%:i") % filename.utf8_str().data()).str(),
|
"-U", (boost::format("flash:w:0:%1%:i") % filename).str(),
|
||||||
}};
|
}};
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(info) << "Invoking avrdude, arguments: "
|
BOOST_LOG_TRIVIAL(info) << "Invoking avrdude, arguments: "
|
||||||
|
@ -249,18 +247,14 @@ void FirmwareDialog::priv::prepare_common(AvrDude &avrdude, const SerialPortInfo
|
||||||
avrdude.push_args(std::move(args));
|
avrdude.push_args(std::move(args));
|
||||||
}
|
}
|
||||||
|
|
||||||
void FirmwareDialog::priv::prepare_mk2(AvrDude &avrdude, const SerialPortInfo &port)
|
void FirmwareDialog::priv::prepare_mk2(AvrDude &avrdude, const SerialPortInfo &port, const std::string &filename)
|
||||||
{
|
{
|
||||||
flashing_start(1);
|
prepare_common(avrdude, port, filename);
|
||||||
prepare_common(avrdude, port);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FirmwareDialog::priv::prepare_mk3(AvrDude &avrdude, const SerialPortInfo &port)
|
void FirmwareDialog::priv::prepare_mk3(AvrDude &avrdude, const SerialPortInfo &port, const std::string &filename)
|
||||||
{
|
{
|
||||||
flashing_start(2);
|
prepare_common(avrdude, port, filename);
|
||||||
prepare_common(avrdude, port);
|
|
||||||
|
|
||||||
auto filename = hex_picker->GetPath();
|
|
||||||
|
|
||||||
// The hex file also contains another section with l10n data to be flashed into the external flash on MK3 (Einsy)
|
// The hex file also contains another section with l10n data to be flashed into the external flash on MK3 (Einsy)
|
||||||
// This is done via another avrdude invocation, here we build arg list for that:
|
// This is done via another avrdude invocation, here we build arg list for that:
|
||||||
|
@ -274,7 +268,7 @@ void FirmwareDialog::priv::prepare_mk3(AvrDude &avrdude, const SerialPortInfo &p
|
||||||
"-b", "115200",
|
"-b", "115200",
|
||||||
"-D",
|
"-D",
|
||||||
"-u", // disable safe mode
|
"-u", // disable safe mode
|
||||||
"-U", (boost::format("flash:w:1:%1%:i") % filename.utf8_str().data()).str(),
|
"-U", (boost::format("flash:w:1:%1%:i") % filename).str(),
|
||||||
}};
|
}};
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(info) << "Invoking avrdude for external flash flashing, arguments: "
|
BOOST_LOG_TRIVIAL(info) << "Invoking avrdude for external flash flashing, arguments: "
|
||||||
|
@ -285,7 +279,7 @@ void FirmwareDialog::priv::prepare_mk3(AvrDude &avrdude, const SerialPortInfo &p
|
||||||
avrdude.push_args(std::move(args_l10n));
|
avrdude.push_args(std::move(args_l10n));
|
||||||
}
|
}
|
||||||
|
|
||||||
void FirmwareDialog::priv::prepare_mm_control(AvrDude &avrdude, const SerialPortInfo &port_in)
|
void FirmwareDialog::priv::prepare_mm_control(AvrDude &avrdude, const SerialPortInfo &port_in, const std::string &filename)
|
||||||
{
|
{
|
||||||
// Check if the port has the PID/VID of 0x2c99/3
|
// Check if the port has the PID/VID of 0x2c99/3
|
||||||
// If not, check if it is the MMU (0x2c99/4) and reboot the by opening @ 1200 bauds
|
// If not, check if it is the MMU (0x2c99/4) and reboot the by opening @ 1200 bauds
|
||||||
|
@ -333,8 +327,6 @@ void FirmwareDialog::priv::prepare_mm_control(AvrDude &avrdude, const SerialPort
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(info) << boost::format("Found VID/PID 0x2c99/3 at `%1%`, flashing ...") % port.port;
|
BOOST_LOG_TRIVIAL(info) << boost::format("Found VID/PID 0x2c99/3 at `%1%`, flashing ...") % port.port;
|
||||||
|
|
||||||
auto filename = hex_picker->GetPath();
|
|
||||||
|
|
||||||
std::vector<std::string> args {{
|
std::vector<std::string> args {{
|
||||||
extra_verbose ? "-vvvvv" : "-v",
|
extra_verbose ? "-vvvvv" : "-v",
|
||||||
"-p", "atmega32u4",
|
"-p", "atmega32u4",
|
||||||
|
@ -342,7 +334,7 @@ void FirmwareDialog::priv::prepare_mm_control(AvrDude &avrdude, const SerialPort
|
||||||
"-P", port.port,
|
"-P", port.port,
|
||||||
"-b", "57600",
|
"-b", "57600",
|
||||||
"-D",
|
"-D",
|
||||||
"-U", (boost::format("flash:w:0:%1%:i") % filename.utf8_str().data()).str(),
|
"-U", (boost::format("flash:w:0:%1%:i") % filename).str(),
|
||||||
}};
|
}};
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(info) << "Invoking avrdude, arguments: "
|
BOOST_LOG_TRIVIAL(info) << "Invoking avrdude, arguments: "
|
||||||
|
@ -369,7 +361,7 @@ void FirmwareDialog::priv::perform_upload()
|
||||||
|
|
||||||
const bool extra_verbose = false; // For debugging
|
const bool extra_verbose = false; // For debugging
|
||||||
HexFile metadata(filename.wx_str());
|
HexFile metadata(filename.wx_str());
|
||||||
// const auto filename_utf8 = filename.utf8_str();
|
const std::string filename_utf8(filename.utf8_str().data());
|
||||||
|
|
||||||
flashing_start(metadata.device == HexFile::DEV_MK3 ? 2 : 1);
|
flashing_start(metadata.device == HexFile::DEV_MK3 ? 2 : 1);
|
||||||
|
|
||||||
|
@ -381,7 +373,7 @@ void FirmwareDialog::priv::perform_upload()
|
||||||
auto q = this->q;
|
auto q = this->q;
|
||||||
|
|
||||||
this->avrdude = avrdude
|
this->avrdude = avrdude
|
||||||
.on_run([this, metadata, port](AvrDude &avrdude) {
|
.on_run([=](AvrDude &avrdude) {
|
||||||
auto queue_error = [&](wxString message) {
|
auto queue_error = [&](wxString message) {
|
||||||
avrdude.cancel();
|
avrdude.cancel();
|
||||||
|
|
||||||
|
@ -395,16 +387,16 @@ void FirmwareDialog::priv::perform_upload()
|
||||||
switch (metadata.device) {
|
switch (metadata.device) {
|
||||||
case HexFile::DEV_MK3:
|
case HexFile::DEV_MK3:
|
||||||
this->check_model_id(metadata, port);
|
this->check_model_id(metadata, port);
|
||||||
this->prepare_mk3(avrdude, port);
|
this->prepare_mk3(avrdude, port, filename_utf8);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HexFile::DEV_MM_CONTROL:
|
case HexFile::DEV_MM_CONTROL:
|
||||||
this->check_model_id(metadata, port);
|
this->check_model_id(metadata, port);
|
||||||
this->prepare_mm_control(avrdude, port);
|
this->prepare_mm_control(avrdude, port, filename_utf8);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
this->prepare_mk2(avrdude, port);
|
this->prepare_mk2(avrdude, port, filename_utf8);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} catch (const wxString &message) {
|
} catch (const wxString &message) {
|
||||||
|
|
Loading…
Reference in a new issue