Compare commits

..

2 Commits

Author SHA1 Message Date
Yasser Yassine 1b00c6a05b Gigastar(2): Fix bootloaders steps 2025-10-30 14:37:12 -04:00
Kyle Schwarz ebf9409c18 Device: Guard mutex usage 2025-10-30 11:18:12 -04:00
4 changed files with 57 additions and 18 deletions

View File

@ -554,26 +554,28 @@ bool Device::goOnline() {
return false; return false;
} }
assignedClientId = com->getClientIDSync(); if(supportsNetworkMutex()) {
if(assignedClientId) { assignedClientId = com->getClientIDSync();
// firmware supports clientid/mutex if(assignedClientId) {
networkMutexCallbackHandle = lockAllNetworks(std::numeric_limits<uint32_t>::max(), std::numeric_limits<uint32_t>::max(), NetworkMutexType::Shared, [this](std::shared_ptr<Message> message) { // firmware supports clientid/mutex
auto netMutexMsg = std::static_pointer_cast<NetworkMutexMessage>(message); networkMutexCallbackHandle = lockAllNetworks(std::numeric_limits<uint32_t>::max(), std::numeric_limits<uint32_t>::max(), NetworkMutexType::Shared, [this](std::shared_ptr<Message> message) {
if(netMutexMsg->networks.size() && netMutexMsg->event.has_value()) { auto netMutexMsg = std::static_pointer_cast<NetworkMutexMessage>(message);
switch(*netMutexMsg->event) { if(netMutexMsg->networks.size() && netMutexMsg->event.has_value()) {
case NetworkMutexEvent::Acquired: switch(*netMutexMsg->event) {
lockedNetworks.emplace(*netMutexMsg->networks.begin()); case NetworkMutexEvent::Acquired:
break; lockedNetworks.emplace(*netMutexMsg->networks.begin());
case NetworkMutexEvent::Released: { break;
auto it = lockedNetworks.find(*netMutexMsg->networks.begin()); case NetworkMutexEvent::Released: {
if (it != lockedNetworks.end()) auto it = lockedNetworks.find(*netMutexMsg->networks.begin());
lockedNetworks.erase(it); if (it != lockedNetworks.end())
break; lockedNetworks.erase(it);
break;
}
} }
} }
} }
} );
); }
} }
// (re)start the keeponline // (re)start the keeponline

View File

@ -28,7 +28,8 @@ struct BootloaderPhase {
Finalize, Finalize,
Reconnect, Reconnect,
EnterBootloader, EnterBootloader,
Wait Wait,
EnterApplication
}; };
virtual Type getType() const = 0; virtual Type getType() const = 0;
@ -70,6 +71,16 @@ struct EnterBootloaderPhase : public BootloaderPhase {
} }
}; };
struct EnterApplicationPhase : public BootloaderPhase {
Type getType() const override {
return Type::EnterApplication;
}
ChipID chip;
EnterApplicationPhase(ChipID chip) : chip(chip) {}
};
struct FlashPhase : public BootloaderPhase { struct FlashPhase : public BootloaderPhase {
Type getType() const override { Type getType() const override {
return Type::Flash; return Type::Flash;

View File

@ -67,10 +67,23 @@ public:
} }
} }
if(useNewBootloader) { if(useNewBootloader) {
auto mainChip = std::find_if(chipVersions.begin(), chipVersions.end(), [](const auto& chip) { return chip.name == "ZCHIP"; });
auto usbChip = std::find_if(chipVersions.begin(), chipVersions.end(), [](const auto& chip) { return chip.name == "USB ZCHIP"; });
ChipID mainChipID;
if(mainChip != chipVersions.end()) {
mainChipID = mainChip->id;
} else if(usbChip != chipVersions.end()) {
mainChipID = usbChip->id;
} else {
return {};
}
BootloaderPipeline pipeline; BootloaderPipeline pipeline;
for(const auto& version : chipVersions) { for(const auto& version : chipVersions) {
pipeline.add<FlashPhase>(version.id, BootloaderCommunication::RADMultiChip); pipeline.add<FlashPhase>(version.id, BootloaderCommunication::RADMultiChip);
} }
pipeline.add<EnterApplicationPhase>(mainChipID);
pipeline.add<ReconnectPhase>(); pipeline.add<ReconnectPhase>();
pipeline.add<WaitPhase>(std::chrono::milliseconds(3000)); pipeline.add<WaitPhase>(std::chrono::milliseconds(3000));
return pipeline; return pipeline;

View File

@ -146,10 +146,23 @@ public:
BootloaderPipeline getBootloader() override { BootloaderPipeline getBootloader() override {
auto chipVersions = getChipVersions(); auto chipVersions = getChipVersions();
auto mainChip = std::find_if(chipVersions.begin(), chipVersions.end(), [](const auto& chip) { return chip.name == "ZCHIP"; });
auto usbChip = std::find_if(chipVersions.begin(), chipVersions.end(), [](const auto& chip) { return chip.name == "USB ZCHIP"; });
ChipID mainChipID;
if(mainChip != chipVersions.end()) {
mainChipID = mainChip->id;
} else if(usbChip != chipVersions.end()) {
mainChipID = usbChip->id;
} else {
return {};
}
BootloaderPipeline pipeline; BootloaderPipeline pipeline;
for(const auto& version : chipVersions) { for(const auto& version : chipVersions) {
pipeline.add<FlashPhase>(version.id, BootloaderCommunication::RADMultiChip); pipeline.add<FlashPhase>(version.id, BootloaderCommunication::RADMultiChip);
} }
pipeline.add<EnterApplicationPhase>(mainChipID);
pipeline.add<ReconnectPhase>(); pipeline.add<ReconnectPhase>();
pipeline.add<WaitPhase>(std::chrono::milliseconds(3000)); pipeline.add<WaitPhase>(std::chrono::milliseconds(3000));
return pipeline; return pipeline;