Skip to content

Commit 0158a39

Browse files
authored
Merge pull request #6 from adafruit/xiao-breakout
Update boards, CI methods, Add Xiao breakout/camera SD defs
2 parents f67593f + 5923445 commit 0158a39

12 files changed

+7125
-7016
lines changed

.github/workflows/daily-update.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ jobs:
4242
git submodule init
4343
git submodule update --recursive
4444
cd Wippersnapper_Boards
45-
git reset --hard origin/rp2040_datalogger_feather
45+
git reset --hard origin/offline-mode
4646
cd ../Wippersnapper_Components
47-
git reset --hard origin/main
47+
git reset --hard origin/offline-mode
4848
cd ..
4949
git add Wippersnapper_Boards Wippersnapper_Components
5050
git diff --staged --quiet || git commit -m "Update submodules to latest versions [skip ci]"

Wippersnapper_Boards

Submodule Wippersnapper_Boards updated 50 files

convert_components_to_json.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,12 +268,12 @@ def convert_components_to_json():
268268

269269
# Write the consolidated JSON file
270270
with open(OUTPUT_FILE, 'w') as f:
271-
json.dump({"components": components}, f, indent=2)
272-
271+
json.dump({"components": components}, f, ensure_ascii=False, indent=2)
272+
273273
# Write the consolidated JS file
274274
with open(OUTPUT_FILE.replace('.json', '.js'), 'w') as f:
275275
f.write("window.jsonComponentsObject = ")
276-
json.dump({"components": components}, f, indent=2)
276+
json.dump({"components": components}, f, ensure_ascii=False, indent=2)
277277
f.write(";\n")
278278

279279
print(f"Successfully created {OUTPUT_FILE}")

firmware-data.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Auto-generated on 2025-08-15 00:21:21
1+
// Auto-generated on 2025-08-15 16:54:43
22
const FIRMWARE_DATA = {
33
"releaseInfo": {
44
"version": "1.0.0-offline-beta.3",

index.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,8 @@ <h2>2. Select Companion Board (Optional)</h2>
314314
<option value="microsd-bff">Adafruit microSD Card BFF Add-On for QT Py and Xiao</option>
315315
<option value="winc1500-shield">Adafruit WINC1500 WiFi Shield</option>
316316
<option value="airlift-shield">Adafruit AirLift Shield - ESP32 WiFi Co-Processor</option>
317-
317+
<option value="seeed-xiao-s3sense-camera-addon">Seeed Studio XIAO ESP32S3 Sense Camera/SD Add-on board</option>
318+
<option value="seeed-xiao-ssd1306-expansion-base">Seeed Studio XIAO Expansion base board</option>
318319
</select>
319320

320321
<div id="companion-details" class="hidden">
@@ -358,6 +359,7 @@ <h3>Real-time clock (RTC) Configuration</h3>
358359
<select id="rtc-select">
359360
<option value="soft">Software RTC</option>
360361
<option value="PCF8523">PCF8523</option>
362+
<option value="PCF8563">PCF8563</option>
361363
<option value="DS3231">DS3231</option>
362364
<option value="DS1307">DS1307</option>
363365
</select>
@@ -508,7 +510,7 @@ <h2>6. Selected Components</h2>
508510
<div id="generate-section" class="section hidden">
509511
<h2>7. Generate Configuration</h2>
510512
<button id="generate-config-btn">Generate Configuration</button>
511-
<input type="checkbox" id="use-auto-init" onchange="javascript:appState.enableautoConfig=this.checked;"> <label for="use-auto-init" title="Auto config fallback for I2C sensors that fail to initialise (selects alternative sensors at same address)">Use Auto Init fallback</label>
513+
<input type="checkbox" id="use-auto-init" onchange="javascript:appState.enableautoConfig=this.checked;"> <label for="use-auto-init" title="Auto config fallback for I2C sensors that fail to initialise (selects alternative sensors at same address)">Use Auto Init fallback for failed or unspecified components (default)</label>
512514
<div id="config-output-container" class="hidden">
513515
<h3>Configuration JSON:</h3>
514516
<pre id="config-output" class="config-output"></pre>

load-wippersnapper-data.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// Load Wippersnapper boards and components data
22

33
// Configuration - technically unused (instead ./ relative links) but useful for reference
4-
const BOARDS_JSON_URL = 'https://raw.githubusercontent.com/adafruit/Adafruit_Wippersnapper_Offline_Configurator/refs/heads/use_boards_sd_card/wippersnapper_boards.json'; //'wippersnapper_boards.json';
5-
const COMPONENTS_JSON_URL = 'https://raw.githubusercontent.com/adafruit/Adafruit_Wippersnapper_Offline_Configurator/refs/heads/use_boards_sd_card/wippersnapper_components.json'; //'wippersnapper_components.json';
4+
const BOARDS_JSON_URL = 'https://raw.githubusercontent.com/adafruit/Adafruit_Wippersnapper_Offline_Configurator/refs/heads/offline-mode/wippersnapper_boards.json'; //'wippersnapper_boards.json';
5+
const COMPONENTS_JSON_URL = 'https://raw.githubusercontent.com/adafruit/Adafruit_Wippersnapper_Offline_Configurator/refs/heads/offline-mode/wippersnapper_components.json'; //'wippersnapper_components.json';
66

77
// Global app state
88
const appState = {
@@ -159,7 +159,7 @@ function populateBoardSelect() {
159159

160160
// Filter boards to only include those with UF2 install method
161161
const filteredBoards = Object.entries(appState.boardsData)
162-
.filter(([boardId, board]) => board.installMethod === 'uf2'); //['uf2', 'web-native-usb'].includes(board.installMethod)); //funhouse
162+
.filter(([boardId, board]) => ['uf2', 'web-native-usb'].includes(board.installMethod)); //funhouse
163163

164164
// Sort boards by vendor and name
165165
const sortedBoards = filteredBoards

wippersnapper-config-builder.js

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,22 @@ const companionBoardConfigs = {
126126
productURL: 'https://www.adafruit.com/product/4285',
127127
documentationURL: 'https://learn.adafruit.com/adafruit-airlift-shield-esp32-wifi-co-processor',
128128
image: 'https://cdn-shop.adafruit.com/640x480/4285-05.jpg'
129+
},
130+
'seeed-xiao-s3sense-camera-addon': {
131+
rtc: null,
132+
sdCardCS: 21,
133+
extras: 'SD Card, Camera, Microphone, Extra GPIOs D11+D12',
134+
productURL: 'https://www.seeedstudio.com/XIAO-ESP32S3-Sense-p-5639.html',
135+
documentationURL: 'https://wiki.seeedstudio.com/xiao_esp32s3_getting_started/',
136+
image: 'https://files.seeedstudio.com/wiki/SeeedStudio-XIAO-ESP32S3/img/66.jpg'
137+
},
138+
'seeed-xiao-ssd1306-expansion-base': {
139+
rtc: 'PCF8563',
140+
sdCardCS: 'D2',
141+
extras: 'SD Card, Display, Piezo Speaker, LiPo connector',
142+
productURL: 'https://www.seeedstudio.com/Seeeduino-XIAO-Expansion-board-p-4746.html',
143+
documentationURL: 'https://wiki.seeedstudio.com/Seeeduino-XIAO-Expansion-Board/',
144+
image: 'https://files.seeedstudio.com/wiki/Seeeduino-XIAO-Expansion-Board/Update_pic/zheng1.jpg'
129145
}
130146
};
131147

@@ -249,7 +265,7 @@ document.addEventListener('DOMContentLoaded', function() {
249265
if (boardImageElem) {
250266
if (board.image) {
251267
if (!board.image.startsWith('http')) {
252-
boardImageElem.src = "https://raw.githubusercontent.com/adafruit/Wippersnapper_Boards/refs/heads/rp2040_datalogger_feather/" + board.image;
268+
boardImageElem.src = "https://raw.githubusercontent.com/adafruit/Wippersnapper_Boards/refs/heads/offline-mode/" + board.image;
253269
} else {
254270
boardImageElem.src = board.image;
255271
}
@@ -365,7 +381,7 @@ document.addEventListener('DOMContentLoaded', function() {
365381
// Mark SD CS pin as used
366382
appState.usedPins.add(pin.number);
367383
} else {
368-
console.warn(`SD card CS pin ${companion.sdCardCS} not found in selected board pins.`);
384+
console.warn(`[${companionId}] SD card CS pin ${companion.sdCardCS} not found in selected board pins.`);
369385
document.getElementById('sd-missing').classList.remove('hidden');
370386
document.getElementById('sd-present').classList.add('hidden');
371387
}
@@ -437,8 +453,12 @@ document.addEventListener('DOMContentLoaded', function() {
437453
document.getElementById('sd-card-pin-select').classList.remove('hidden');
438454
} else {
439455
document.getElementById('sd-card-pin-select').classList.add('hidden');
456+
appState.usedPins.delete(appState.sdCardCS);
457+
document.getElementById('manual-sd-cs-pin').textContent = '';
458+
document.getElementById('sd-cs-pin').textContent = '';
440459
appState.sdCardCS = null;
441460
}
461+
populatePinsLists();
442462
});
443463

444464
// RTC type selection handler
@@ -1932,7 +1952,8 @@ function generateConfiguration() {
19321952
referenceVoltage: appState.selectedBoard.referenceVoltage,
19331953
totalGPIOPins: appState.selectedBoard.totalGPIOPins,
19341954
totalAnalogPins: appState.selectedBoard.totalAnalogPins,
1935-
statusLEDBrightness: appState.statusLEDBrightness
1955+
statusLEDBrightness: appState.statusLEDBrightness,
1956+
autoConfig: appState.enableautoConfig
19361957
},
19371958
components: []
19381959
};

0 commit comments

Comments
 (0)