Skip to content

Commit e1ab7fa

Browse files
committed
min version now selects highest ecc for data
1 parent c14a772 commit e1ab7fa

File tree

3 files changed

+13
-5
lines changed

3 files changed

+13
-5
lines changed

lib/qrcode/qrcode.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -771,7 +771,7 @@ uint8_t qrcode_initBytes(QRCode *qrcode, uint8_t *data, uint16_t length) {
771771

772772
// If Version is 0, choose the smallest version that can hold the data
773773
if (qrcode->version == VERSION_AUTO) {
774-
qrcode->version = qrcode_minVersion(qrcode->ecc, qrcode->mode, (char*)data, length);
774+
qrcode->version = qrcode_minVersion(qrcode->mode, (char*)data, length);
775775
}
776776
else if (qrcode->version > 40 || qrcode->ecc > 3)
777777
{
@@ -899,9 +899,10 @@ uint16_t qrcode_dataCapacity(uint8_t version, uint8_t ecc) {
899899
return dataCapacity;
900900
}
901901

902-
uint8_t qrcode_minVersion(uint8_t ecc, uint8_t mode, const char *data, uint16_t length) {
902+
uint8_t qrcode_minVersion(uint8_t mode, const char *data, uint16_t length) {
903903

904904
uint8_t version = 1;
905+
uint8_t ecc = ECC_HIGH;
905906
uint8_t lengthMode = getModeBits(version, mode);
906907
uint16_t lengthMax;
907908

@@ -910,7 +911,13 @@ uint8_t qrcode_minVersion(uint8_t ecc, uint8_t mode, const char *data, uint16_t
910911
lengthMax = qrcode_dataCapacity(version, ecc) - 2;
911912
//printf("Testing version[%d] ecc[%d] len[%d] lengthMode[%d] encoded[%d] max[%d]\n", version, ecc, length, lengthMode, lengthEncoded, lengthMax);
912913
if (lengthEncoded > lengthMax) {
913-
version++;
914+
if (ecc == 0)
915+
{
916+
version++;
917+
ecc = ECC_HIGH;
918+
}
919+
else
920+
ecc--;
914921
} else {
915922
break;
916923
}

lib/qrcode/qrcode.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ bool qrcode_getModule(QRCode *qrcode, uint8_t x, uint8_t y);
8383

8484
uint8_t qrcode_determineMode(const char *data, uint16_t length);
8585
uint16_t qrcode_dataCapacity(uint8_t version, uint8_t ecc);
86-
uint8_t qrcode_minVersion(uint8_t ecc, uint8_t mode, const char *data, uint16_t length);
86+
uint8_t qrcode_minVersion(uint8_t mode, const char *data, uint16_t length);
8787
uint16_t qrcode_encodeBase45(unsigned char * dst, uint16_t *_max_dst_len, const unsigned char * src, uint16_t src_len);
8888

8989
#ifdef __cplusplus

lib/qrcode/qrmanager.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ typedef enum {
2323
} qr_ecc_t;
2424

2525
typedef enum {
26-
QR_OUTPUT_MODE_ANSI,
2726
QR_OUTPUT_MODE_BINARY,
27+
QR_OUTPUT_MODE_ANSI,
2828
QR_OUTPUT_MODE_BITMAP,
2929
QR_OUTPUT_MODE_SVG,
3030
QR_OUTPUT_MODE_ATASCII,
@@ -49,6 +49,7 @@ class QRManager {
4949
qrcode.ecc = ecc;
5050

5151
output_mode = mode;
52+
code = std::vector<uint8_t>();
5253
};
5354
~QRManager() {
5455
free(qrcode.modules);

0 commit comments

Comments
 (0)