annotate ostc45_icon.cpp @ 5:115cfa4a3239 default tip

Added icon upload function for OSTC 4/5 For the upload the same process as the one for the firmware update is used => CRC functionality has been copied from the ostc_pack SW
author Ideenmodellierer
date Tue, 30 Dec 2025 21:41:02 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
1 #include "ostc45_icon.h"
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
2
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
3
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
4 //OSTC45_Icon::OSTC45_Icon() {}
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
5
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
6
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
7 #pragma pack(push, 1)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
8 struct BMPFileHeader
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
9 {
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
10 uint16_t bfType;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
11 uint32_t bfSize;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
12 uint16_t bfReserved1;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
13 uint16_t bfReserved2;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
14 uint32_t bfOffBits;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
15 };
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
16
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
17 struct BMPInfoHeader
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
18 {
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
19 uint32_t biSize;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
20 int32_t biWidth;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
21 int32_t biHeight;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
22 uint16_t biPlanes;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
23 uint16_t biBitCount;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
24 uint32_t biCompression;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
25 uint32_t biSizeImage;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
26 int32_t biXPelsPerMeter;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
27 int32_t biYPelsPerMeter;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
28 uint32_t biClrUsed;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
29 uint32_t biClrImportant;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
30 };
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
31 #pragma pack(pop)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
32
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
33 BmpToArray::BmpToArray(const QString& filename)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
34 {
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
35 loadBMP(filename);
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
36 }
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
37
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
38 void BmpToArray::loadBMP(const QString& filename)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
39 {
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
40 QFile file(filename);
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
41 int dstY;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
42 QByteArray rowBuffer;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
43 bool topDown = false;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
44 BMPFileHeader fileHeader;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
45 BMPInfoHeader infoHeader;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
46
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
47 if (!file.open(QIODevice::ReadOnly))
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
48 throw std::runtime_error("Cannot open BMP file");
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
49
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
50 if (file.read(reinterpret_cast<char*>(&fileHeader),
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
51 sizeof(BMPFileHeader)) != sizeof(BMPFileHeader))
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
52 throw std::runtime_error("Failed to read BMP file header");
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
53
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
54 if (file.read(reinterpret_cast<char*>(&infoHeader),
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
55 sizeof(BMPInfoHeader)) != sizeof(BMPInfoHeader))
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
56 throw std::runtime_error("Failed to read BMP info header");
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
57
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
58 if (fileHeader.bfType != 0x4D42)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
59 throw std::runtime_error("Not a valid BMP file");
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
60
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
61 if (infoHeader.biBitCount != 8)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
62 throw std::runtime_error("Only 8-bit BMP supported");
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
63 if (infoHeader.biCompression != 0)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
64 throw std::runtime_error("Compressed BMP not supported");
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
65
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
66 if(infoHeader.biWidth > 800)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
67 throw std::runtime_error("Only BMP with 800 or less horizontal pixels supported");
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
68
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
69 if(infoHeader.biHeight > 480)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
70 throw std::runtime_error("Only BMP with 480 or less vertical pixels supported");
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
71
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
72 // Width / Height
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
73 width = infoHeader.biWidth;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
74 height = infoHeader.biHeight;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
75
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
76 if ((int32_t)height < 0) {
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
77 height = -((int32_t)height);
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
78 topDown = true;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
79 }
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
80
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
81 // Palette
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
82 uint32_t colorCount = infoHeader.biClrUsed;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
83 if (colorCount == 0) colorCount = 256;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
84 if (colorCount > 256) colorCount = 256;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
85
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
86 clut.resize(colorCount);
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
87
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
88 for (uint32_t i = 0; i < colorCount; ++i)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
89 file.read(reinterpret_cast<char*>(&clut[i]), 4);
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
90
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
91 // CLUT in 32-Bit transform 0x00RRGGBB
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
92 clut32.resize(255, 0);
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
93
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
94 for (uint32_t i = 0; i < colorCount && i < 255; ++i)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
95 {
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
96 clut32[i] =
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
97 (clut[i].r << 16) |
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
98 (clut[i].g << 8) |
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
99 (clut[i].b);
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
100 }
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
101
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
102 // Pixel-Data
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
103 if (!file.seek(fileHeader.bfOffBits))
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
104 throw std::runtime_error("Failed to seek to pixel data");
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
105
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
106 pixelData.resize(width * height);
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
107
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
108 size_t rowSize = (width + 3) & ~3; // 4-Byte alignment
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
109
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
110 rowBuffer.resize(rowSize);
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
111
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
112 for (int y = 0; y < height; ++y)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
113 {
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
114 if (file.read(rowBuffer.data(), rowSize) != rowSize)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
115 throw std::runtime_error("Failed to read BMP pixel row");
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
116
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
117 if (topDown)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
118 {
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
119 dstY = height - 1 - y;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
120 }
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
121 else
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
122 {
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
123 dstY = y;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
124 }
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
125
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
126 for (int x = 0; x < width; ++x)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
127 {
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
128 pixelData[x * height + dstY] =
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
129 static_cast<uint8_t>(rowBuffer[x]);
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
130 }
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
131 }
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
132
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
133
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
134 }
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
135 QByteArray BmpToArray::getTransferBytes() const
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
136 {
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
137 QByteArray out;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
138
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
139 out.reserve(clut32.size() * 4 + pixelData.size());
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
140
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
141 // CLUT (32 Bit, Little Endian)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
142 for (uint32_t color : clut32)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
143 {
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
144 out.append(static_cast<char>( color & 0xFF));
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
145 out.append(static_cast<char>((color >> 8) & 0xFF));
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
146 out.append(static_cast<char>((color >> 16) & 0xFF));
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
147 out.append(static_cast<char>((color >> 24) & 0xFF));
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
148 }
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
149
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
150 // Pixel (8 Bit)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
151 out.append(reinterpret_cast<const char*>(pixelData.data()),
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
152 pixelData.size());
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
153
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
154 return out;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
155 }
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
156
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
157 void BmpToArray::getImageXY(uint32_t* x, uint32_t* y)
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
158 {
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
159 *x = width;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
160 *y = height;
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
161 }
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
162
115cfa4a3239 Added icon upload function for OSTC 4/5
Ideenmodellierer
parents:
diff changeset
163