diff options
author | Manuel Coenen <manuel@duet3d.com> | 2021-02-15 14:43:30 +0300 |
---|---|---|
committer | Manuel Coenen <manuel@duet3d.com> | 2021-02-15 14:43:30 +0300 |
commit | a0ad84462bc8dbe98204ade0e2f65cdb2a0fdd32 (patch) | |
tree | 801566bf51de732b12335d61acf077706c1701b2 /src/Comms | |
parent | a6c1e6f32ed60ae51a1abf2a66abf47343ba4ce2 (diff) |
Add M997 P parameter to specify firmware binary to use
Diffstat (limited to 'src/Comms')
-rw-r--r-- | src/Comms/FirmwareUpdater.cpp | 39 | ||||
-rw-r--r-- | src/Comms/FirmwareUpdater.h | 9 | ||||
-rw-r--r-- | src/Comms/PanelDueUpdater.cpp | 11 | ||||
-rw-r--r-- | src/Comms/PanelDueUpdater.h | 6 |
4 files changed, 42 insertions, 23 deletions
diff --git a/src/Comms/FirmwareUpdater.cpp b/src/Comms/FirmwareUpdater.cpp index 780aa8db..8b60378b 100644 --- a/src/Comms/FirmwareUpdater.cpp +++ b/src/Comms/FirmwareUpdater.cpp @@ -29,41 +29,51 @@ namespace FirmwareUpdater // Check that the prerequisites are satisfied. // Return true if yes, else print a message and return false. - GCodeResult CheckFirmwareUpdatePrerequisites(uint8_t moduleMap, GCodeBuffer& gb, const StringRef& reply, const size_t serialChannel) noexcept + GCodeResult CheckFirmwareUpdatePrerequisites( + Bitmap<uint8_t> moduleMap, + GCodeBuffer& gb, + const StringRef& reply, + const size_t serialChannel, + const StringRef& filenameRef) noexcept { #if HAS_WIFI_NETWORKING - if ( (moduleMap & (1 << WifiExternalFirmwareModule)) != 0 - || (moduleMap & (1 << WifiFirmwareModule)) != 0) + if (moduleMap.IsBitSet(WifiExternalFirmwareModule) || moduleMap.IsBitSet(WifiFirmwareModule)) { GCodeResult result; if (!reprap.GetGCodes().CheckNetworkCommandAllowed(gb, reply, result)) { return result; } - if ((moduleMap & (1 << WifiExternalFirmwareModule)) != 0 && (moduleMap & (1 << WifiFirmwareModule)) != 0) + if (moduleMap.IsBitSet(WifiExternalFirmwareModule) && moduleMap.IsBitSet(WifiFirmwareModule)) { reply.copy("Invalid combination of firmware update modules"); return GCodeResult::error; } - if ((moduleMap & (1 << WifiFirmwareModule)) != 0 - && !reprap.GetPlatform().FileExists(FIRMWARE_DIRECTORY, WIFI_FIRMWARE_FILE)) + if (moduleMap.IsBitSet(WifiFirmwareModule)) { - reply.printf("File %s not found", FIRMWARE_DIRECTORY WIFI_FIRMWARE_FILE); - return GCodeResult::error; + String<MaxFilenameLength> location; + if (!MassStorage::CombineName(location.GetRef(), FIRMWARE_DIRECTORY, filenameRef.IsEmpty() ? WIFI_FIRMWARE_FILE : filenameRef.c_str()) + || !MassStorage::FileExists(location.c_str())) + { + reply.printf("File %s not found", location.c_str()); + return GCodeResult::error; + } } } #endif #if HAS_AUX_DEVICES - if ((moduleMap & (1 << PanelDueFirmwareModule)) != 0) + if (moduleMap.IsBitSet(PanelDueFirmwareModule)) { if (!reprap.GetPlatform().IsAuxEnabled(serialChannel-1) || reprap.GetPlatform().IsAuxRaw(serialChannel-1)) { reply.printf("Aux port %d is not enabled or not in PanelDue mode", serialChannel-1); return GCodeResult::error; } - if (!reprap.GetPlatform().FileExists(FIRMWARE_DIRECTORY, PANEL_DUE_FIRMWARE_FILE)) + String<MaxFilenameLength> location; + if (!MassStorage::CombineName(location.GetRef(), FIRMWARE_DIRECTORY, filenameRef.IsEmpty() ? PANEL_DUE_FIRMWARE_FILE : filenameRef.c_str()) + || !MassStorage::FileExists(location.c_str())) { - reply.printf("File %s not found", PanelDueUpdater::firmwareFilename); + reply.printf("File %s not found", location.c_str()); return GCodeResult::error; } } @@ -88,7 +98,7 @@ namespace FirmwareUpdater return true; } - void UpdateModule(unsigned int module, const size_t serialChannel) noexcept + void UpdateModule(unsigned int module, const size_t serialChannel, const StringRef& filenameRef) noexcept { #if HAS_WIFI_NETWORKING || HAS_AUX_DEVICES switch(module) @@ -111,7 +121,8 @@ namespace FirmwareUpdater WifiFirmwareUploader * const uploader = reprap.GetNetwork().GetWifiUploader(); if (uploader != nullptr) { - uploader->SendUpdateFile(WIFI_FIRMWARE_FILE, FIRMWARE_DIRECTORY, WifiFirmwareUploader::FirmwareAddress); + const char* binaryFilename = filenameRef.IsEmpty() ? WIFI_FIRMWARE_FILE : filenameRef.c_str(); + uploader->SendUpdateFile(binaryFilename, FIRMWARE_DIRECTORY, WifiFirmwareUploader::FirmwareAddress); } } break; @@ -124,7 +135,7 @@ namespace FirmwareUpdater { platform.InitPanelDueUpdater(); } - platform.GetPanelDueUpdater()->Start(serialChannel); + platform.GetPanelDueUpdater()->Start(filenameRef, serialChannel); } # endif } diff --git a/src/Comms/FirmwareUpdater.h b/src/Comms/FirmwareUpdater.h index aa9f8f0a..4e4d4530 100644 --- a/src/Comms/FirmwareUpdater.h +++ b/src/Comms/FirmwareUpdater.h @@ -17,9 +17,14 @@ namespace FirmwareUpdater const unsigned int PanelDueFirmwareModule = 4; #endif - GCodeResult CheckFirmwareUpdatePrerequisites(uint8_t moduleMap, GCodeBuffer& gb, const StringRef& reply, size_t serialChannel) noexcept; + GCodeResult CheckFirmwareUpdatePrerequisites( + Bitmap<uint8_t> moduleMap, + GCodeBuffer& gb, + const StringRef& reply, + size_t serialChannel, + const StringRef& filenameRef) noexcept; bool IsReady() noexcept; - void UpdateModule(unsigned int module, const size_t serialChannel) noexcept; + void UpdateModule(unsigned int module, const size_t serialChannel, const StringRef& filenameRef) noexcept; } #endif /* SRC_NETWORKING_FIRMWAREUPDATER_H_ */ diff --git a/src/Comms/PanelDueUpdater.cpp b/src/Comms/PanelDueUpdater.cpp index 5789501b..353f2458 100644 --- a/src/Comms/PanelDueUpdater.cpp +++ b/src/Comms/PanelDueUpdater.cpp @@ -108,6 +108,7 @@ PanelDueUpdater::PanelDueUpdater() noexcept , offset(0) , erasedAndResetAt(0) , state(FlashState::idle) + , filename(nullptr) { } @@ -120,13 +121,14 @@ PanelDueUpdater::~PanelDueUpdater() noexcept delete flasher; } -void PanelDueUpdater::Start(const uint32_t serialChan) noexcept +void PanelDueUpdater::Start(const StringRef& filenameRef, const uint32_t serialChan) noexcept { if (state != FlashState::idle) { return; } serialChannel = serialChan; + filename = filenameRef.IsEmpty() ? PANEL_DUE_FIRMWARE_FILE : filenameRef.c_str(); state = FlashState::eraseAndReset; } @@ -204,7 +206,7 @@ void PanelDueUpdater::Spin() noexcept case FlashState::bossaWrite: { - bool done = flasher->write(firmwareFilename, offset); + bool done = flasher->write(filename, FIRMWARE_DIRECTORY, offset); if (done) { offset = 0; // Reset it for verification @@ -218,7 +220,7 @@ void PanelDueUpdater::Spin() noexcept { uint32_t pageErrors; uint32_t totalErrors; - bool done = flasher->verify(firmwareFilename, pageErrors, totalErrors, offset); + bool done = flasher->verify(filename, FIRMWARE_DIRECTORY, pageErrors, totalErrors, offset); if (done && pageErrors == 0) { state = FlashState::bossaWriteOptions; @@ -283,6 +285,9 @@ void PanelDueUpdater::Spin() noexcept offset = 0; erasedAndResetAt = 0; + + filename = nullptr; + state = FlashState::idle; } break; diff --git a/src/Comms/PanelDueUpdater.h b/src/Comms/PanelDueUpdater.h index b48ae7b4..a92abfbd 100644 --- a/src/Comms/PanelDueUpdater.h +++ b/src/Comms/PanelDueUpdater.h @@ -33,12 +33,9 @@ public: PanelDueUpdater() noexcept; virtual ~PanelDueUpdater() noexcept; void Spin() noexcept; - void Start(const uint32_t serialChan = 1) noexcept; + void Start(const StringRef& filenameRef, const uint32_t serialChan = 1) noexcept; bool Idle() const noexcept { return state == FlashState::idle; } - // For now fix the filename here - constexpr static const char* const firmwareFilename = FIRMWARE_DIRECTORY PANEL_DUE_FIRMWARE_FILE; - private: NamedEnum(FlashState, uint8_t, idle, @@ -65,6 +62,7 @@ private: uint32_t offset; uint32_t erasedAndResetAt; FlashState state; + const char* filename; UARTClass* GetAuxPort() noexcept; }; |