1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
/*
* FirmwareUpdater.cpp
*
* Created on: 21 May 2016
* Author: David
*/
#include "FirmwareUpdater.h"
#include <RepRapFirmware.h>
#include <Platform/Platform.h>
#include <Platform/RepRap.h>
#include <GCodes/GCodes.h>
#if HAS_WIFI_NETWORKING
# include <Networking/Network.h>
# include <Networking/ESP8266WiFi/WifiFirmwareUploader.h>
#endif
#if HAS_AUX_DEVICES
# include <Comms/PanelDueUpdater.h>
#endif
namespace FirmwareUpdater
{
const unsigned int WifiFirmwareModule = 1;
// Module 2 used to be the DWC binary file but is no longer used
const unsigned int WifiExternalFirmwareModule = 3;
// Check that the prerequisites are satisfied.
// Return true if yes, else print a message and return false.
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.IsBitSet(WifiExternalFirmwareModule) || moduleMap.IsBitSet(WifiFirmwareModule))
{
GCodeResult result;
if (!reprap.GetGCodes().CheckNetworkCommandAllowed(gb, reply, result))
{
return result;
}
if (moduleMap.IsBitSet(WifiExternalFirmwareModule) && moduleMap.IsBitSet(WifiFirmwareModule))
{
reply.copy("Invalid combination of firmware update modules");
return GCodeResult::error;
}
if (moduleMap.IsBitSet(WifiFirmwareModule))
{
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.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;
}
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", location.c_str());
return GCodeResult::error;
}
}
#endif
return GCodeResult::ok;
}
bool IsReady() noexcept
{
#if HAS_WIFI_NETWORKING
WifiFirmwareUploader * const uploader = reprap.GetNetwork().GetWifiUploader();
if(!(uploader == nullptr || uploader->IsReady())) {
return false;
}
#endif
#if HAS_AUX_DEVICES
PanelDueUpdater *panelDueUpdater = reprap.GetPlatform().GetPanelDueUpdater();
if (panelDueUpdater != nullptr && !panelDueUpdater->Idle()) {
return false;
}
#endif
return true;
}
void UpdateModule(unsigned int module, const size_t serialChannel, const StringRef& filenameRef) noexcept
{
#if HAS_WIFI_NETWORKING || HAS_AUX_DEVICES
switch(module)
{
# if HAS_WIFI_NETWORKING
case WifiExternalFirmwareModule:
# ifdef DUET_NG
if (reprap.GetPlatform().IsDuetWiFi())
# endif
{
reprap.GetNetwork().ResetWiFiForUpload(true);
}
break;
case WifiFirmwareModule:
# ifdef DUET_NG
if (reprap.GetPlatform().IsDuetWiFi())
# endif
{
WifiFirmwareUploader * const uploader = reprap.GetNetwork().GetWifiUploader();
if (uploader != nullptr)
{
const char* binaryFilename = filenameRef.IsEmpty() ? WIFI_FIRMWARE_FILE : filenameRef.c_str();
uploader->SendUpdateFile(binaryFilename, FIRMWARE_DIRECTORY, WifiFirmwareUploader::FirmwareAddress);
}
}
break;
# endif
# if HAS_AUX_DEVICES
case PanelDueFirmwareModule:
{
Platform& platform = reprap.GetPlatform();
if (platform.GetPanelDueUpdater() == nullptr)
{
platform.InitPanelDueUpdater();
}
platform.GetPanelDueUpdater()->Start(filenameRef, serialChannel);
}
# endif
}
#endif
}
}
// End
|