Skip to content

Commit 01b88af

Browse files
authored
Reworked the QRCode library (#1013)
* Reworked the QRCode library * add full path to "qrmanager.h" * qrcode add nullptr checks
1 parent a1b9de4 commit 01b88af

File tree

8 files changed

+412
-221
lines changed

8 files changed

+412
-221
lines changed

lib/device/iwm/fuji.cpp

Lines changed: 22 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "string_utils.h"
2323

2424
#include "compat_string.h"
25+
#include "../../qrcode/qrmanager.h"
2526

2627
#define ADDITIONAL_DETAILS_BYTES 12
2728
#define DIR_MAX_LEN 40
@@ -1545,50 +1546,44 @@ void iwmFuji::iwm_ctrl_qrcode_input()
15451546
Debug_printf("FUJI: QRCODE INPUT (len: %d)\n", data_len);
15461547
std::vector<uint8_t> data(data_len, 0);
15471548
std::copy(&data_buffer[0], &data_buffer[0] + data_len, data.begin());
1548-
qrManager.in_buf += std::string((const char *)data.data(), data_len);
1549+
_qrManager.data += std::string((const char *)data.data(), data_len);
15491550
}
15501551

15511552
void iwmFuji::iwm_ctrl_qrcode_encode()
15521553
{
1553-
size_t out_len = 0;
1554-
1555-
qrManager.output_mode = 0;
1556-
qrManager.version = data_buffer[0] & 0b01111111;
1557-
qrManager.ecc_mode = data_buffer[1];
1554+
uint8_t version = data_buffer[0] & 0b01111111;
1555+
uint8_t ecc_mode = data_buffer[1];
15581556
bool shorten = data_buffer[2];
15591557

15601558
Debug_printf("FUJI: QRCODE ENCODE\n");
1561-
Debug_printf("QR Version: %d, ECC: %d, Shorten: %s\n", qrManager.version, qrManager.ecc_mode, shorten ? "Y" : "N");
1559+
Debug_printf("QR Version: %d, ECC: %d, Shorten: %s\n", version, ecc_mode, shorten ? "Y" : "N");
15621560

1563-
std::string url = qrManager.in_buf;
1561+
std::string url = _qrManager.data;
15641562

15651563
if (shorten) {
15661564
url = fnHTTPD.shorten_url(url);
15671565
}
15681566

1569-
std::vector<uint8_t> p = QRManager::encode(
1570-
url.c_str(),
1571-
url.size(),
1572-
qrManager.version,
1573-
qrManager.ecc_mode,
1574-
&out_len
1575-
);
1567+
_qrManager.version(version);
1568+
_qrManager.ecc((qr_ecc_t)ecc_mode);
1569+
_qrManager.output_mode = QR_OUTPUT_MODE_BINARY;
1570+
_qrManager.encode();
15761571

1577-
qrManager.in_buf.clear();
1572+
_qrManager.data.clear();
15781573

1579-
if (!out_len)
1574+
if (!_qrManager.code.size())
15801575
{
15811576
Debug_printf("QR code encoding failed\n");
15821577
return;
15831578
}
15841579

1585-
Debug_printf("Resulting QR code is: %u modules\n", out_len);
1580+
Debug_printf("Resulting QR code is: %u modules\n", _qrManager.code.size());
15861581
}
15871582

15881583
void iwmFuji::iwm_stat_qrcode_length()
15891584
{
15901585
Debug_printf("FUJI: QRCODE LENGTH\n");
1591-
size_t len = qrManager.out_buf.size();
1586+
size_t len = _qrManager.code.size();
15921587
data_buffer[0] = (uint8_t)(len >> 0);
15931588
data_buffer[1] = (uint8_t)(len >> 8);
15941589
data_len = 2;
@@ -1601,19 +1596,11 @@ void iwmFuji::iwm_ctrl_qrcode_output()
16011596
uint8_t output_mode = data_buffer[0];
16021597
Debug_printf("Output mode: %i\n", output_mode);
16031598

1604-
size_t len = qrManager.out_buf.size();
1599+
size_t len = _qrManager.code.size();
16051600

1606-
if (len && (output_mode != qrManager.output_mode)) {
1607-
if (output_mode == QR_OUTPUT_MODE_BINARY) {
1608-
qrManager.to_binary();
1609-
}
1610-
else if (output_mode == QR_OUTPUT_MODE_ATASCII) {
1611-
qrManager.to_atascii();
1612-
}
1613-
else if (output_mode == QR_OUTPUT_MODE_BITMAP) {
1614-
qrManager.to_bitmap();
1615-
}
1616-
qrManager.output_mode = output_mode;
1601+
if (len && (output_mode != _qrManager.output_mode)) {
1602+
_qrManager.output_mode = (ouput_mode_t)output_mode;
1603+
_qrManager.encode();
16171604
}
16181605
}
16191606

@@ -1622,11 +1609,11 @@ void iwmFuji::iwm_stat_qrcode_output()
16221609
Debug_printf("FUJI: QRCODE OUTPUT STAT\n");
16231610
memset(data_buffer, 0, sizeof(data_buffer));
16241611

1625-
data_len = qrManager.out_buf.size();
1626-
memcpy(data_buffer, &qrManager.out_buf[0], data_len);
1612+
data_len = _qrManager.code.size();
1613+
memcpy(data_buffer, &_qrManager.code[0], data_len);
16271614

1628-
qrManager.out_buf.erase(qrManager.out_buf.begin(), qrManager.out_buf.begin() + data_len);
1629-
qrManager.out_buf.shrink_to_fit();
1615+
_qrManager.code.clear();
1616+
_qrManager.code.shrink_to_fit();
16301617
}
16311618

16321619
#endif /* BUILD_APPLE */

lib/device/iwm/fuji.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ class iwmFuji : public iwmDevice
147147
Hash::Algorithm algorithm = Hash::Algorithm::UNKNOWN;
148148
bool hash_is_hex_output = false;
149149

150+
QRManager _qrManager = QRManager();
151+
150152
protected:
151153
void iwm_dummy_command(); // control 0xAA
152154
void iwm_hello_world(); // status 0xAA

lib/device/sio/fuji.cpp

Lines changed: 24 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343

4444
sioFuji theFuji; // global fuji device object
4545

46+
//QRManager sioFuji::_qrManager = QRManager();
47+
4648
#ifdef ESP_PLATFORM
4749
std::unique_ptr<sioNetwork, PSRAMDeleter<sioNetwork>> sioNetDevs[MAX_NETWORK_DEVICES];
4850
#else
@@ -2206,47 +2208,41 @@ void sioFuji::sio_qrcode_input()
22062208

22072209
std::vector<unsigned char> p(len);
22082210
bus_to_peripheral(p.data(), len);
2209-
qrManager.in_buf += std::string((const char *)p.data(), len);
2211+
_qrManager.data += std::string((const char *)p.data(), len);
22102212
sio_complete();
22112213
}
22122214

22132215
void sioFuji::sio_qrcode_encode()
22142216
{
2215-
size_t out_len = 0;
2216-
2217-
qrManager.output_mode = 0;
22182217
uint16_t aux = sio_get_aux();
2219-
qrManager.version = aux & 0b01111111;
2220-
qrManager.ecc_mode = (aux >> 8) & 0b00000011;
2218+
uint8_t version = aux & 0b01111111;
2219+
uint8_t ecc_mode = ((aux >> 8) & 0b00000011);
22212220
bool shorten = (aux >> 12) & 0b00000001;
22222221

22232222
Debug_printf("FUJI: QRCODE ENCODE\n");
2224-
Debug_printf("QR Version: %d, ECC: %d, Shorten: %s\n", qrManager.version, qrManager.ecc_mode, shorten ? "Y" : "N");
2223+
Debug_printf("QR Version: %d, ECC: %d, Shorten: %s\n", version, ecc_mode, shorten ? "Y" : "N");
22252224

2226-
std::string url = qrManager.in_buf;
2225+
std::string url = _qrManager.data;
22272226

22282227
if (shorten) {
22292228
url = fnHTTPD.shorten_url(url);
22302229
}
22312230

2232-
std::vector<uint8_t> p = QRManager::encode(
2233-
url.c_str(),
2234-
url.size(),
2235-
qrManager.version,
2236-
qrManager.ecc_mode,
2237-
&out_len
2238-
);
2231+
_qrManager.version(version);
2232+
_qrManager.ecc((qr_ecc_t)ecc_mode);
2233+
_qrManager.output_mode = QR_OUTPUT_MODE_ATASCII;
2234+
_qrManager.encode();
22392235

2240-
qrManager.in_buf.clear();
2236+
_qrManager.data.clear();
22412237

2242-
if (!out_len)
2238+
if (!_qrManager.code.size())
22432239
{
22442240
Debug_printf("QR code encoding failed\n");
22452241
sio_error();
22462242
return;
22472243
}
22482244

2249-
Debug_printf("Resulting QR code is: %u modules\n", out_len);
2245+
Debug_printf("Resulting QR code is: %u modules\n", _qrManager.code.size());
22502246
sio_complete();
22512247
}
22522248

@@ -2256,23 +2252,15 @@ void sioFuji::sio_qrcode_length()
22562252
uint8_t output_mode = sio_get_aux();
22572253
Debug_printf("Output mode: %i\n", output_mode);
22582254

2259-
size_t len = qrManager.out_buf.size();
2255+
size_t len = _qrManager.size();
22602256

22612257
// A bit gross to have a side effect from length command, but not enough aux bytes
22622258
// to specify version, ecc, *and* output mode for the encode command. Also can't
22632259
// just wait for output command, because output mode determines buffer length,
2264-
if (len && (output_mode != qrManager.output_mode)) {
2265-
if (output_mode == QR_OUTPUT_MODE_BINARY) {
2266-
qrManager.to_binary();
2267-
}
2268-
else if (output_mode == QR_OUTPUT_MODE_ATASCII) {
2269-
qrManager.to_atascii();
2270-
}
2271-
else if (output_mode == QR_OUTPUT_MODE_BITMAP) {
2272-
qrManager.to_bitmap();
2273-
}
2274-
qrManager.output_mode = output_mode;
2275-
len = qrManager.out_buf.size();
2260+
if (len && (output_mode != _qrManager.output_mode)) {
2261+
_qrManager.output_mode = (ouput_mode_t)output_mode;
2262+
_qrManager.encode();
2263+
len = _qrManager.code.size();
22762264
}
22772265

22782266
uint8_t response[4] = {
@@ -2304,21 +2292,20 @@ void sioFuji::sio_qrcode_output()
23042292
Debug_printf("Refusing to send a zero byte buffer. Aborting\n");
23052293
return;
23062294
}
2307-
else if (len > qrManager.out_buf.size())
2295+
else if (len > _qrManager.size())
23082296
{
2309-
Debug_printf("Requested %u bytes, but buffer is only %u bytes, aborting.\n", len, qrManager.out_buf.size());
2297+
Debug_printf("Requested %u bytes, but buffer is only %u bytes, aborting.\n", len, _qrManager.code.size());
23102298
return;
23112299
}
23122300
else
23132301
{
23142302
Debug_printf("Requested %u bytes\n", len);
23152303
}
23162304

2317-
bus_to_computer(&qrManager.out_buf[0], len, false);
2318-
2319-
qrManager.out_buf.erase(qrManager.out_buf.begin(), qrManager.out_buf.begin()+len);
2320-
qrManager.out_buf.shrink_to_fit();
2305+
bus_to_computer(&_qrManager.code[0], len, false);
23212306

2307+
_qrManager.code.clear();
2308+
_qrManager.code.shrink_to_fit();
23222309
}
23232310

23242311

lib/device/sio/fuji.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "fujiCmd.h"
2121

2222
#include "hash.h"
23+
#include "../../qrcode/qrmanager.h"
2324

2425
#define MAX_HOSTS 8
2526
#define MAX_DISK_DEVICES 8
@@ -115,6 +116,8 @@ class sioFuji : public virtualDevice
115116

116117
Hash::Algorithm algorithm = Hash::Algorithm::UNKNOWN;
117118

119+
QRManager _qrManager = QRManager();
120+
118121
protected:
119122
void sio_reset_fujinet(); // 0xFF
120123
void sio_net_get_ssid(); // 0xFE

0 commit comments

Comments
 (0)