Skip to content

Commit d70c0c1

Browse files
Added an example for using the LZSSDecoder class with comparison wrt old implementation
1 parent 946a410 commit d70c0c1

File tree

2 files changed

+188
-0
lines changed

2 files changed

+188
-0
lines changed

examples/LZSS/LZSS.ino

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
/*
2+
* This example demonstrates how to download a lzss file and decompress it in two ways:
3+
* -1 download the file on the filesystem and then decompress the downloaded file on the filesystem
4+
* -2 download and decompress the file on the fly
5+
* this sketch also provides a comparison in terms of speed and execution time
6+
*
7+
*/
8+
9+
/******************************************************************************
10+
* INCLUDE
11+
******************************************************************************/
12+
13+
#include <Arduino_Portenta_OTA.h>
14+
15+
#include <WiFi.h>
16+
17+
#include "arduino_secrets.h"
18+
#include <decompress/lzss.h>
19+
20+
/******************************************************************************
21+
* CONSTANT
22+
******************************************************************************/
23+
24+
/* Please enter your sensitive data in the Secret tab/arduino_secrets.h */
25+
static char const SSID[] = SECRET_SSID; /* your network SSID (name) */
26+
static char const PASS[] = SECRET_PASS; /* your network password (use for WPA, or use as key for WEP) */
27+
28+
29+
#if defined(ARDUINO_NICLA_VISION)
30+
static char const URL_FILE[] = "https://downloads.arduino.cc/ota/OTA_Usage_Portenta.ino.NICLA_VISION.ota";
31+
#elif defined(ARDUINO_PORTENTA_H7_M7)
32+
static char const URL_FILE[] = "https://downloads.arduino.cc/ota/OTA_Usage_Portenta.ino.PORTENTA_H7_M7.ota";
33+
#elif defined(ARDUINO_OPTA)
34+
static char const URL_FILE[] = "https://downloads.arduino.cc/ota/OTA_Usage_Portenta.ino.OPTA.ota";
35+
#elif defined(ARDUINO_GIGA)
36+
static char const URL_FILE[] = "https://downloads.arduino.cc/ota/OTA_Usage_Portenta.ino.GIGA.ota";
37+
#else
38+
#error "Board not supported"
39+
#endif
40+
41+
static char const DOWNLOAD_DESTINATION[] = "/fs/UPDATE.BIN.LZSS";
42+
static char const DECOMPRESSED_DESTINATION[] = "/fs/UPDATE.BIN";
43+
44+
LZSSDecoder *decoder = nullptr;
45+
FILE* download_target = nullptr;
46+
47+
/******************************************************************************
48+
* SETUP/LOOP
49+
******************************************************************************/
50+
void decompress_on_the_fly_cbk(const char*, uint32_t);
51+
void putc_file(const uint8_t c);
52+
53+
void setup() {
54+
Serial.begin(115200);
55+
while (!Serial) {}
56+
57+
if (WiFi.status() == WL_NO_SHIELD)
58+
{
59+
Serial.println("Communication with WiFi module failed!");
60+
return;
61+
}
62+
63+
int status = WL_IDLE_STATUS;
64+
while (status != WL_CONNECTED)
65+
{
66+
Serial.print ("Attempting to connect to '");
67+
Serial.print (SSID);
68+
Serial.println("'");
69+
status = WiFi.begin(SSID, PASS);
70+
if(status != WL_CONNECTED) {
71+
delay(10000);
72+
}
73+
}
74+
Serial.print ("You're connected to '");
75+
Serial.print (WiFi.SSID());
76+
Serial.println("'");
77+
78+
// Init fs
79+
mbed::BlockDevice * _bd_raw_qspi = mbed::BlockDevice::get_default_instance();;
80+
auto _bd_qspi = new mbed::MBRBlockDevice(_bd_raw_qspi, 2);
81+
auto _fs_qspi = new mbed::FATFileSystem("fs");
82+
int const err_mount = _fs_qspi->mount(_bd_qspi);
83+
if (err_mount) {
84+
Serial.print("Error while mounting the filesystem. Err = ");
85+
Serial.println(err_mount);
86+
return;
87+
}
88+
89+
MbedSocketClass * socket = static_cast<MbedSocketClass*>(&WiFi);
90+
remove(DOWNLOAD_DESTINATION);
91+
remove(DECOMPRESSED_DESTINATION);
92+
93+
uint32_t start;
94+
int bytes;
95+
float elapsed, speed;
96+
start = millis();
97+
Serial.println("Starting download to QSPI ...");
98+
bytes = socket->download(URL_FILE, DOWNLOAD_DESTINATION, true /* is_https */);
99+
if (bytes <= 0)
100+
{
101+
Serial.print ("MbedSocketClass::download failed with error code ");
102+
Serial.println(bytes);
103+
return;
104+
}
105+
Serial.print (bytes);
106+
Serial.println(" bytes stored.");
107+
108+
elapsed = (millis()-start)/1000.0; // elapsed expressed in seconds
109+
speed = (bytes/elapsed)/1024;
110+
111+
Serial.print("download elapsed ");
112+
Serial.print(elapsed);
113+
Serial.print("s speed: ");
114+
Serial.print(speed);
115+
Serial.println("KBps");
116+
117+
FILE* downloaded_file = fopen(DOWNLOAD_DESTINATION, "rb");
118+
FILE* decompressed_file = fopen(DECOMPRESSED_DESTINATION, "wb");
119+
120+
start = millis();
121+
lzss_init(downloaded_file, decompressed_file, bytes, nullptr);
122+
123+
lzss_decode();
124+
/* Write the data remaining in the write buffer to
125+
* the file.
126+
*/
127+
lzss_flush();
128+
129+
elapsed = (millis()-start)/1000.0; // elapsed expressed in seconds
130+
131+
Serial.print("decompress elapsed ");
132+
Serial.print(elapsed);
133+
Serial.print("s");
134+
Serial.print(" size ");
135+
Serial.println(ftell(decompressed_file));
136+
137+
fclose(downloaded_file);
138+
fclose(decompressed_file);
139+
140+
// On the fly decompression
141+
remove(DOWNLOAD_DESTINATION);
142+
remove(DECOMPRESSED_DESTINATION);
143+
144+
download_target = fopen(DECOMPRESSED_DESTINATION, "wb");
145+
decoder = new LZSSDecoder(putc_file);
146+
147+
Serial.println("Starting download & decompress on the fly");
148+
start = millis();
149+
bytes = socket->download(URL_FILE, true /* is_https */, decompress_on_the_fly_cbk);
150+
if (bytes <= 0)
151+
{
152+
Serial.print ("MbedSocketClass::download failed with error code ");
153+
Serial.println(bytes);
154+
return;
155+
}
156+
157+
Serial.print("downloaded ");
158+
Serial.print(bytes);
159+
Serial.print(" bytes ");
160+
161+
elapsed = (millis()-start)/1000.0; // elapsed expressed in seconds
162+
speed = (bytes/elapsed)/1024;
163+
164+
Serial.print (ftell(download_target));
165+
Serial.println(" bytes stored.");
166+
167+
Serial.print("download elapsed ");
168+
Serial.print(elapsed);
169+
Serial.print("s speed: ");
170+
Serial.print(speed);
171+
Serial.println("KBps");
172+
173+
delete decoder;
174+
fclose(download_target);
175+
}
176+
177+
void loop() {
178+
}
179+
180+
void decompress_on_the_fly_cbk(const char* buffer, uint32_t size) {
181+
decoder->decompress((uint8_t*)buffer, size);
182+
}
183+
184+
void putc_file(const uint8_t c) {
185+
fwrite(&c, 1, 1, download_target);
186+
}

examples/LZSS/arduino_secrets.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#define SECRET_SSID ""
2+
#define SECRET_PASS ""

0 commit comments

Comments
 (0)