mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-01 05:22:04 +08:00
Removed code moved to libbgcode library
This commit is contained in:
parent
793a2710dd
commit
c82f9c7627
@ -164,8 +164,6 @@ set(SLIC3R_SOURCES
|
||||
GCode/WipeTower.hpp
|
||||
GCode/GCodeProcessor.cpp
|
||||
GCode/GCodeProcessor.hpp
|
||||
GCode/GCodeBinarizer.cpp
|
||||
GCode/GCodeBinarizer.hpp
|
||||
GCode/AvoidCrossingPerimeters.cpp
|
||||
GCode/AvoidCrossingPerimeters.hpp
|
||||
GCode.cpp
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,382 +0,0 @@
|
||||
#ifndef slic3r_GCode_GCodeBinarizer_hpp_
|
||||
#define slic3r_GCode_GCodeBinarizer_hpp_
|
||||
|
||||
#ifdef _WIN32
|
||||
#define ENABLE_BINARIZED_GCODE_DEBUG 1
|
||||
#endif // _WIN32
|
||||
|
||||
#define ENABLE_CHECKSUM_BLOCK 0
|
||||
#define ENABLE_FILE_CONVERSION_INTERFACE 1
|
||||
|
||||
#include <array>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <cstdio>
|
||||
#include <functional>
|
||||
|
||||
namespace bgcode {
|
||||
|
||||
static const std::array<uint8_t, 4> MAGIC{ 'G', 'C', 'D', 'E' };
|
||||
static const uint32_t VERSION = 1;
|
||||
|
||||
enum class EResult : uint16_t
|
||||
{
|
||||
Success,
|
||||
ReadError,
|
||||
WriteError,
|
||||
InvalidMagicNumber,
|
||||
InvalidVersionNumber,
|
||||
InvalidChecksumType,
|
||||
InvalidBlockType,
|
||||
InvalidCompressionType,
|
||||
InvalidMetadataEncodingType,
|
||||
InvalidGCodeEncodingType,
|
||||
DataCompressionError,
|
||||
DataUncompressionError,
|
||||
MetadataEncodingError,
|
||||
MetadataDecodingError,
|
||||
GCodeEncodingError,
|
||||
GCodeDecodingError,
|
||||
BlockNotFound,
|
||||
InvalidChecksum,
|
||||
InvalidThumbnailFormat,
|
||||
InvalidThumbnailWidth,
|
||||
InvalidThumbnailHeight,
|
||||
InvalidThumbnailDataSize,
|
||||
InvalidBinaryGCodeFile,
|
||||
InvalidSequenceOfBlocks
|
||||
};
|
||||
|
||||
// Returns a string description of the given result
|
||||
extern std::string translate_result(EResult result);
|
||||
|
||||
enum class EChecksumType : uint16_t
|
||||
{
|
||||
None,
|
||||
CRC32
|
||||
};
|
||||
|
||||
class Checksum
|
||||
{
|
||||
public:
|
||||
// Constructs a checksum of the given type.
|
||||
// The checksum data are sized accordingly.
|
||||
explicit Checksum(EChecksumType type);
|
||||
|
||||
EChecksumType get_type() const;
|
||||
|
||||
// Appends the given data to the cache and performs a checksum update if
|
||||
// the size of the cache exceeds the max checksum cache size.
|
||||
void append(const std::vector<uint8_t>& data);
|
||||
// Returns true if the given checksum is equal to this one
|
||||
bool matches(Checksum& other);
|
||||
|
||||
EResult write(FILE& file);
|
||||
EResult read(FILE& file);
|
||||
|
||||
private:
|
||||
EChecksumType m_type;
|
||||
std::vector<uint8_t> m_cache;
|
||||
std::vector<uint8_t> m_checksum;
|
||||
|
||||
void update();
|
||||
};
|
||||
|
||||
struct FileHeader
|
||||
{
|
||||
uint32_t magic{ *(uint32_t*)(MAGIC.data()) };
|
||||
uint32_t version{ VERSION };
|
||||
uint16_t checksum_type{ (uint16_t)EChecksumType::None };
|
||||
|
||||
EResult write(FILE& file) const;
|
||||
EResult read(FILE& file, const uint32_t* const max_version);
|
||||
};
|
||||
|
||||
enum class EBlockType : uint16_t
|
||||
{
|
||||
#if ENABLE_CHECKSUM_BLOCK
|
||||
Checksum,
|
||||
#endif // ENABLE_CHECKSUM_BLOCK
|
||||
FileMetadata,
|
||||
GCode,
|
||||
SlicerMetadata,
|
||||
PrinterMetadata,
|
||||
PrintMetadata,
|
||||
Thumbnail
|
||||
};
|
||||
|
||||
enum class ECompressionType : uint16_t
|
||||
{
|
||||
None,
|
||||
Deflate,
|
||||
Heatshrink_11_4,
|
||||
Heatshrink_12_4,
|
||||
};
|
||||
|
||||
struct BlockHeader
|
||||
{
|
||||
uint16_t type{ 0 };
|
||||
uint16_t compression{ 0 };
|
||||
uint32_t uncompressed_size{ 0 };
|
||||
uint32_t compressed_size{ 0 };
|
||||
|
||||
// Updates the given checksum with the data of this BlockHeader
|
||||
void update_checksum(Checksum& checksum) const;
|
||||
|
||||
EResult write(FILE& file) const;
|
||||
EResult read(FILE& file);
|
||||
};
|
||||
|
||||
enum class EMetadataEncodingType : uint16_t
|
||||
{
|
||||
INI,
|
||||
};
|
||||
|
||||
struct BaseMetadataBlock
|
||||
{
|
||||
// type of data encoding
|
||||
uint16_t encoding_type{ 0 };
|
||||
// data in key/value form
|
||||
std::vector<std::pair<std::string, std::string>> raw_data;
|
||||
|
||||
// write block header and data in encoded format
|
||||
EResult write(FILE& file, EBlockType block_type, ECompressionType compression_type, Checksum& checksum) const;
|
||||
// read block data in encoded format
|
||||
EResult read_data(FILE& file, const BlockHeader& block_header);
|
||||
|
||||
static size_t get_parameters_size() { return sizeof(encoding_type); }
|
||||
};
|
||||
|
||||
struct FileMetadataBlock : public BaseMetadataBlock
|
||||
{
|
||||
// write block header and data
|
||||
EResult write(FILE& file, ECompressionType compression_type, EChecksumType checksum_type) const;
|
||||
// read block data
|
||||
EResult read_data(FILE& file, const FileHeader& file_header, const BlockHeader& block_header);
|
||||
};
|
||||
|
||||
enum class EThumbnailFormat : uint16_t
|
||||
{
|
||||
PNG,
|
||||
JPG,
|
||||
QOI
|
||||
};
|
||||
|
||||
struct ThumbnailBlock
|
||||
{
|
||||
uint16_t format{ 0 };
|
||||
uint16_t width{ 0 };
|
||||
uint16_t height{ 0 };
|
||||
std::vector<uint8_t> data;
|
||||
|
||||
// write block header and data
|
||||
EResult write(FILE& file, EChecksumType checksum_type) const;
|
||||
// read block data
|
||||
EResult read_data(FILE& file, const FileHeader& file_header, const BlockHeader& block_header);
|
||||
|
||||
static size_t get_parameters_size() { return sizeof(format) + sizeof(width) + sizeof(height); }
|
||||
|
||||
private:
|
||||
void update_checksum(Checksum& checksum) const;
|
||||
};
|
||||
|
||||
struct PrinterMetadataBlock : public BaseMetadataBlock
|
||||
{
|
||||
// write block header and data
|
||||
EResult write(FILE& file, ECompressionType compression_type, EChecksumType checksum_type) const;
|
||||
// read block data
|
||||
EResult read_data(FILE& file, const FileHeader& file_header, const BlockHeader& block_header);
|
||||
};
|
||||
|
||||
struct PrintMetadataBlock : public BaseMetadataBlock
|
||||
{
|
||||
// write block header and data
|
||||
EResult write(FILE& file, ECompressionType compression_type, EChecksumType checksum_type) const;
|
||||
// read block data
|
||||
EResult read_data(FILE& file, const FileHeader& file_header, const BlockHeader& block_header);
|
||||
};
|
||||
|
||||
struct SlicerMetadataBlock : public BaseMetadataBlock
|
||||
{
|
||||
// write block header and data
|
||||
EResult write(FILE& file, ECompressionType compression_type, EChecksumType checksum_type) const;
|
||||
// read block data
|
||||
EResult read_data(FILE& file, const FileHeader& file_header, const BlockHeader& block_header);
|
||||
};
|
||||
|
||||
enum class EGCodeEncodingType : uint16_t
|
||||
{
|
||||
None,
|
||||
MeatPack,
|
||||
MeatPackComments
|
||||
};
|
||||
|
||||
struct GCodeBlock
|
||||
{
|
||||
uint16_t encoding_type{ 0 };
|
||||
std::string raw_data;
|
||||
|
||||
// write block header and data
|
||||
EResult write(FILE& file, ECompressionType compression_type, EChecksumType checksum_type) const;
|
||||
// read block data
|
||||
EResult read_data(FILE& file, const FileHeader& file_header, const BlockHeader& block_header);
|
||||
|
||||
static size_t get_parameters_size() { return sizeof(encoding_type); }
|
||||
};
|
||||
|
||||
#if ENABLE_CHECKSUM_BLOCK
|
||||
struct ChecksumBlock
|
||||
{
|
||||
std::vector<uint8_t> data;
|
||||
|
||||
// write block header and data
|
||||
EResult write(FILE& file) const;
|
||||
// read block data
|
||||
EResult read_data(FILE& file, const BlockHeader& block_header);
|
||||
};
|
||||
#endif // ENABLE_CHECKSUM_BLOCK
|
||||
|
||||
//=====================================================================================================================================
|
||||
//
|
||||
// PRUSASLICER INTERFACE
|
||||
//
|
||||
//=====================================================================================================================================
|
||||
|
||||
struct BinaryData
|
||||
{
|
||||
FileMetadataBlock file_metadata;
|
||||
PrinterMetadataBlock printer_metadata;
|
||||
std::vector<ThumbnailBlock> thumbnails;
|
||||
SlicerMetadataBlock slicer_metadata;
|
||||
PrintMetadataBlock print_metadata;
|
||||
|
||||
void reset() {
|
||||
file_metadata.raw_data.clear();
|
||||
printer_metadata.raw_data.clear();
|
||||
thumbnails.clear();
|
||||
slicer_metadata.raw_data.clear();
|
||||
print_metadata.raw_data.clear();
|
||||
}
|
||||
};
|
||||
|
||||
struct BinarizerConfig
|
||||
{
|
||||
struct Compression
|
||||
{
|
||||
ECompressionType file_metadata{ ECompressionType::None };
|
||||
ECompressionType printer_metadata{ ECompressionType::None };
|
||||
ECompressionType print_metadata{ ECompressionType::None };
|
||||
ECompressionType slicer_metadata{ ECompressionType::None };
|
||||
ECompressionType gcode{ ECompressionType::None };
|
||||
};
|
||||
Compression compression;
|
||||
EGCodeEncodingType gcode_encoding{ EGCodeEncodingType::None };
|
||||
EMetadataEncodingType metadata_encoding{ EMetadataEncodingType::INI };
|
||||
EChecksumType checksum{ EChecksumType::CRC32 };
|
||||
};
|
||||
|
||||
class Binarizer
|
||||
{
|
||||
public:
|
||||
bool is_enabled() const { return m_enabled; }
|
||||
void set_enabled(bool enable) { m_enabled = enable; }
|
||||
|
||||
BinaryData& get_binary_data() { return m_binary_data; }
|
||||
const BinaryData& get_binary_data() const { return m_binary_data; }
|
||||
|
||||
EResult initialize(FILE& file, const BinarizerConfig& config);
|
||||
EResult append_gcode(const std::string& gcode);
|
||||
EResult finalize();
|
||||
|
||||
private:
|
||||
bool m_enabled{ false };
|
||||
|
||||
BinarizerConfig m_config;
|
||||
FILE* m_file{ nullptr };
|
||||
BinaryData m_binary_data;
|
||||
std::string m_gcode_cache;
|
||||
#if ENABLE_CHECKSUM_BLOCK
|
||||
ChecksumBlock m_checksum;
|
||||
#endif // ENABLE_CHECKSUM_BLOCK
|
||||
};
|
||||
|
||||
//=====================================================================================================================================
|
||||
//
|
||||
// GCODEVIEWER INTERFACE
|
||||
// FIRMWARE INTERFACE
|
||||
//
|
||||
//=====================================================================================================================================
|
||||
|
||||
// Get the max size of the cache used to calculate checksums, in bytes
|
||||
size_t get_checksum_max_cache_size();
|
||||
// Set the max size of the cache used to calculate checksums, in bytes
|
||||
void set_checksum_max_cache_size(size_t size);
|
||||
|
||||
// Returns true if the given file is a valid binary gcode
|
||||
// Does not modify the file position
|
||||
extern bool is_valid_binary_gcode(FILE& file);
|
||||
|
||||
// Reads the file header.
|
||||
// If max_version is not null, version is checked against the passed value
|
||||
// If return == EResult::Success:
|
||||
// - header will contain the file header
|
||||
// - file position will be set at the start of the 1st block header
|
||||
extern EResult read_header(FILE& file, FileHeader& header, const uint32_t* const max_version);
|
||||
|
||||
// Reads next block header from the current file position.
|
||||
// File position must be at the start of a block header.
|
||||
// If return == EResult::Success:
|
||||
// - block_header will contain the header of the block
|
||||
// - file position will be set at the start of the block parameters data
|
||||
extern EResult read_next_block_header(FILE& file, const FileHeader& file_header, BlockHeader& block_header, bool verify_checksum);
|
||||
|
||||
// Searches and reads next block header with the given type from the current file position.
|
||||
// File position must be at the start of a block header.
|
||||
// If return == EResult::Success:
|
||||
// - block_header will contain the header of the block with the required type
|
||||
// - file position will be set at the start of the block parameters data
|
||||
// otherwise:
|
||||
// - file position will keep the current value
|
||||
extern EResult read_next_block_header(FILE& file, const FileHeader& file_header, BlockHeader& block_header, EBlockType type, bool verify_checksum);
|
||||
|
||||
// Skips the payload (parameters + data) of the block with the given block header.
|
||||
// File position must be at the start of the block parameters.
|
||||
// If return == EResult::Success:
|
||||
// - file position will be set at the start of the block checksum, if present, or of next block header
|
||||
extern EResult skip_block_payload(FILE& file, const BlockHeader& block_header);
|
||||
|
||||
// Skips the content (parameters + data + checksum) of the block with the given block header.
|
||||
// File position must be at the start of the block parameters.
|
||||
// If return == EResult::Success:
|
||||
// - file position will be set at the start of the next block header
|
||||
extern EResult skip_block_content(FILE& file, const FileHeader& file_header, const BlockHeader& block_header);
|
||||
|
||||
// Returns the size of the parameters of the given block type, in bytes.
|
||||
extern size_t block_parameters_size(EBlockType type);
|
||||
|
||||
// Returns the size of the payload (parameters + data) of the block with the given header, in bytes.
|
||||
extern size_t block_payload_size(const BlockHeader& block_header);
|
||||
|
||||
// Returns the size of the checksum of the given type, in bytes.
|
||||
extern size_t checksum_size(EChecksumType type);
|
||||
|
||||
// Returns the size of the content (parameters + data + checksum) of the block with the given header, in bytes.
|
||||
extern size_t block_content_size(const FileHeader& file_header, const BlockHeader& block_header);
|
||||
|
||||
#if ENABLE_FILE_CONVERSION_INTERFACE
|
||||
//=====================================================================================================================================
|
||||
//
|
||||
// FILE CONVERSION INTERFACE
|
||||
//
|
||||
//=====================================================================================================================================
|
||||
|
||||
// Converts the gcode file contained into src_file from ascii to binary format and save the results into dst_file
|
||||
extern EResult from_ascii_to_binary(FILE& src_file, FILE& dst_file);
|
||||
|
||||
// Converts the gcode file contained into src_file from binary to ascii format and save the results into dst_file
|
||||
extern EResult from_binary_to_ascii(FILE& src_file, FILE& dst_file, bool verify_checksum);
|
||||
#endif // ENABLE_FILE_CONVERSION_INTERFACE
|
||||
|
||||
} // namespace bgcode
|
||||
|
||||
#endif // slic3r_GCode_GCodeBinarizer_hpp_
|
Loading…
x
Reference in New Issue
Block a user