Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src/Comms
diff options
context:
space:
mode:
authorManuel Coenen <manuel@duet3d.com>2021-02-15 14:43:30 +0300
committerManuel Coenen <manuel@duet3d.com>2021-02-15 14:43:30 +0300
commita0ad84462bc8dbe98204ade0e2f65cdb2a0fdd32 (patch)
tree801566bf51de732b12335d61acf077706c1701b2 /src/Comms
parenta6c1e6f32ed60ae51a1abf2a66abf47343ba4ce2 (diff)
Add M997 P parameter to specify firmware binary to use
Diffstat (limited to 'src/Comms')
-rw-r--r--src/Comms/FirmwareUpdater.cpp39
-rw-r--r--src/Comms/FirmwareUpdater.h9
-rw-r--r--src/Comms/PanelDueUpdater.cpp11
-rw-r--r--src/Comms/PanelDueUpdater.h6
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;
};