Motion Master 6.0.0-alpha.111
Next-generation motion control software
Loading...
Searching...
No Matches
firmware_package.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <cstdint>
5#include <expected>
6#include <nlohmann/json_fwd.hpp>
7#include <optional>
8#include <span>
9#include <string>
10#include <string_view>
11#include <vector>
12
15
16namespace mm::node {
17
33
35inline constexpr std::string_view kEsiFileName = "SOMANET_CiA_402.xml.zip";
36
45inline constexpr std::array<std::string_view, 2> kDefaultSkippedFirmwareFiles = {
47 "stack_image.svg.zip",
48};
49
58 std::string description;
59 std::string hardwareName;
61 std::string softwareName;
62 std::string softwareVersion;
63
75 std::optional<std::string> firmwareId;
76 std::optional<std::string> firmwareVersion;
77 std::optional<std::string> keyId;
78 std::optional<std::string> fieldbusProtocol;
80
85 std::optional<std::string> buildDescriptor() const;
86};
87
99std::expected<FirmwarePackageName, std::string> parseFirmwarePackageName(std::string_view filename);
100
106void to_json(nlohmann::json& j, const FirmwarePackageName& name);
107
110 std::string name;
111 std::vector<uint8_t> content;
112};
113
120 std::optional<FirmwarePackageFile> appBinary;
121 std::optional<FirmwarePackageFile> comBinary;
122 std::optional<FirmwarePackageFile> sii;
123 std::vector<FirmwarePackageFile> extras;
124 std::vector<std::string> skipped;
125};
126
141std::expected<FirmwarePackage, std::string> openFirmwarePackage(
142 std::span<const uint8_t> zip, std::span<const std::string> skipFiles);
143
155 std::optional<std::string> assembly;
156
159 std::string device;
160};
161
174 const IntegroVariant* variant);
175
177enum class FirmwareMatch {
178 kNone,
179 kAssembly,
180 kDevice,
181};
182
184std::string_view toString(FirmwareMatch match);
185
199
215FirmwareCompatibility checkFirmwareCompatibility(const HardwareDescription& description,
216 const FirmwarePackageName& packageName,
217 const IntegroVariant* variant = nullptr);
218
232std::expected<FirmwareCompatibility, std::string> checkFirmwareCompatibility(
233 std::string_view hardwareDescriptionContent, std::string_view packageFilename,
234 const IntegroVariant* variant = nullptr);
235
241void to_json(nlohmann::json& j, const FullFirmwareDescriptors& descriptors);
242void to_json(nlohmann::json& j, const FirmwareCompatibility& compatibility);
244
245} // namespace mm::node
std::string description
Catalogue description of the block.
Definition eni_request.cc:38
std::string name
Catalogue name, e.g. "sm2".
Definition eni_request.cc:37
The .hardware_description file: what a SOMANET product says it is, and the descriptor that decides wh...
The .variant file: which features a SOMANET Integro was licensed with, and the fieldbus character its...
Definition bus_health_source.h:7
FullFirmwareDescriptors fullFirmwareDescriptors(const HardwareDescription &description, const IntegroVariant *variant)
Assembles the descriptors description accepts, appending variant's fieldbus character when there is o...
Definition firmware_package.cc:270
std::string_view toString(Cia402TargetKind kind)
The token parseCia402TargetKind reads, for a JSON answer.
Definition cia402_drive.cc:59
std::expected< FirmwarePackageName, std::string > parseFirmwarePackageName(std::string_view filename)
Decodes filename as a SOMANET firmware package name.
Definition firmware_package.cc:110
constexpr std::array< std::string_view, 2 > kDefaultSkippedFirmwareFiles
The entries an install skips unless the request names a different set.
Definition firmware_package.h:45
void to_json(nlohmann::json &j, const Cia402Status &s)
Serialises a Cia402Status. Emits state/modeName as human-readable strings alongside the numeric statu...
Definition cia402_drive.cc:13
std::expected< FirmwarePackage, std::string > openFirmwarePackage(std::span< const uint8_t > zip, std::span< const std::string > skipFiles)
Reads a firmware package zip held in memory, dropping the entries named in skipFiles.
Definition firmware_package.cc:162
constexpr std::string_view kEsiFileName
The name of the ESI in a SOMANET firmware package and on the drive.
Definition firmware_package.h:35
FirmwareCompatibility checkFirmwareCompatibility(const HardwareDescription &description, const FirmwarePackageName &packageName, const IntegroVariant *variant)
Decides whether packageName belongs on the hardware description describes.
Definition firmware_package.cc:307
FirmwareMatch
Which of a device's descriptors a package matched.
Definition firmware_package.h:177
@ kDevice
The device descriptor: the generic build for the hardware itself.
@ kNone
Neither — the package is for other hardware.
@ kAssembly
The assembly descriptor: firmware customised for the assembled product.
The verdict on one package against one device.
Definition firmware_package.h:187
FirmwarePackageName packageName
The package's decoded filename.
Definition firmware_package.h:189
std::string explanation
Definition firmware_package.h:195
FirmwareMatch match
What matched, if anything.
Definition firmware_package.h:188
FullFirmwareDescriptors deviceDescriptors
What the device accepts.
Definition firmware_package.h:190
bool compatible() const
Definition firmware_package.h:197
One entry of a package, extracted.
Definition firmware_package.h:109
std::vector< uint8_t > content
Decompressed bytes.
Definition firmware_package.h:111
std::string name
Entry name as it appears in the zip.
Definition firmware_package.h:110
A SOMANET firmware package filename, broken into the five fields the naming convention defines (Hardw...
Definition firmware_package.h:57
std::string softwareVersion
Its version including the leading 'v', e.g. "v5.6.10".
Definition firmware_package.h:62
std::optional< std::string > buildDescriptor() const
The buildDescriptor — firmwareId and firmwareVersion joined, e.g. "8500-04".
Definition firmware_package.cc:155
std::string softwareName
Firmware or software name, e.g. "motion-drive".
Definition firmware_package.h:61
std::optional< std::string > firmwareVersion
Hardware revision, e.g. "04".
Definition firmware_package.h:76
std::optional< std::string > keyId
Firmware encryption key id, e.g. "2332".
Definition firmware_package.h:77
std::string fullFirmwareDescriptor
The hardware this is built for, e.g. "8500-04-2332".
Definition firmware_package.h:60
std::optional< std::string > fieldbusProtocol
Hexadecimal character; "1" = EtherCAT.
Definition firmware_package.h:78
std::optional< std::string > firmwareId
e.g. "8500".
Definition firmware_package.h:75
std::string hardwareName
Human-readable hardware name, e.g. "SOMANET-Circulo-7".
Definition firmware_package.h:59
std::string description
Always "package" for a firmware bundle.
Definition firmware_package.h:58
A firmware package's contents, sorted by where each entry is going.
Definition firmware_package.h:119
std::vector< FirmwarePackageFile > extras
Everything else — stored on flash as-is.
Definition firmware_package.h:123
std::optional< FirmwarePackageFile > sii
*.sii — written to the ESC EEPROM.
Definition firmware_package.h:122
std::optional< FirmwarePackageFile > comBinary
com_*.bin — flashed in BOOT over FoE.
Definition firmware_package.h:121
std::optional< FirmwarePackageFile > appBinary
app_*.bin — flashed in BOOT over FoE.
Definition firmware_package.h:120
std::vector< std::string > skipped
Entry names the skip list removed, in order.
Definition firmware_package.h:124
The full firmware descriptors one device accepts firmware under (specification §3....
Definition firmware_package.h:150
std::string device
Definition firmware_package.h:159
std::optional< std::string > assembly
Definition firmware_package.h:155
A parsed .hardware_description file (specification §3.2).
Definition hardware_description.h:70
A parsed .variant file.
Definition integro_variant.h:123