Im Folgenden wird beschrieben, wie das SIDEKICK-Autorensystem aufgesetzt – siehe Kapitel 1 – und bedient wird – siehe Kapitel 2.
- Einrichtung
- Installation auf dem Raspberry Pi (RPi)
- Installation auf einem Windows-PC
- Nutzung auf einem Windows-PC (ohne Installation)
- Bedienung
- Kurze Einführung in die Benutzeroberfläche
- SIDEKICK-Blöcke
- GPIO-Pin-Blöcke
- Ablauf-Blöcke
- LED-Blöcke
- UV-Sensor-Blöcke
- Button-Blöcke
- Video-Blöcke
- Laden externer Erweiterungen
- SIDEKICK-Einstellungsmenü
- Bluetooth-Einstellung für die Audioausgabe
Kompilierte Versionen (Builds) des SIDEKICK-Autorensystems werden als Veröf-fentlichung (Release) auf dem GitHub-Repository der SIDEKICK-Desktop-Version zur Verfügung gestellt und können somit im Bereich Releases des Repositories bezogen werden.
Über die folgenden Schritte ist die Installation der SIDEKICK-Anwendung auf dem PRi durchführbar. Hierbei wird die Installationsdatei – für den Fall, dass der RPi nicht mit dem Internet verbunden ist – zunächst separat heruntergeladen und danach – hier per USB-Stick – auf den RPi übertragen.
-
Die Seite https://github.com/Menersar/sidekick-desktop/releases aufrufen.
-
Die .deb-Datei – umrahmt in folgender Abbildung – herunterladen
(z. B. durch einen Linksklick auf den Dateinamen).
- Info: Über .deb-Pakete sind Programme manuell installierbar
(unter allen Debian-basierten Linux-Betriebssystemen).
- Info: Über .deb-Pakete sind Programme manuell installierbar
-
Diese heruntergeladene Datei auf einen USB-Stick übertragen.
-
Diesen USB-Stick in einen freien USB-Anschluss des RPi stecken.
-
Die heruntergeladene Datei des USB-Sticks auf den RPi übertragen (z. B. vom Ordner des Sticks auf den Desktop per Drag-and-Drop kopieren).
-
Die SIDEKICK-Anwendung über diese .deb-Datei auf dem RPi installieren.
- Z. B. wie folgt: Rechtsklick auf die Datei Package Install.
- Die Installation erfolgt automatisch über den Installationsprozess.
-
Nach abgeschlossener Installation ist die Anwendung „SIDEKICK“ startbar.
- Ausführbar z. B. über das RPi-Anwendungsmenü Entwicklung.
Über die folgenden Schritte ist die Installation der SIDEKICK-Anwendung auf einem Windows-PC durchführbar.
-
Die Seite https://github.com/Menersar/sidekick-desktop/releases aufrufen.
-
Die Setup-.exe-Datei – umrahmt in folgender Abbildung – herunterladen
(z. B. durch einen Linksklick auf den Dateinamen).
-
Diese heruntergeladene Datei Ausführen und dadurch Installieren (z. B. durch Doppelklick auf die .exe-Datei).
-
Durch das Setup-Programm gehen und Installation über Install starten.
-
Nach abgeschlossener Installation ist die Anwendung „SIDEKICK“ startbar.
- Ausführbar z. B. über die angelegte Desktopverknüpfung (z. B. durch Doppelklick auf die Verknüpfung)
- Oder Suche und Ausführen von „SIDEKICK“ per Windows-Suchleiste.
Über die folgenden Schritte ist die Nutzung der SIDEKICK-Anwendung auf einem Windows-PC ohne Installation möglich.
-
Die Seite https://github.com/Menersar/sidekick-desktop/releases aufrufen.
-
Die Portable-.exe-Datei – umrahmt in folgender Abbildung – herunterladen
(z. B. durch einen Linksklick auf den Dateinamen).
-
Diese heruntergeladene Datei Ausführen (z. B. durch Doppelklick auf die .exe-Datei).
-
Durch das Ausführen dieser Datei ist die Anwendung „SIDEKICK“ startbar.
Das Starten der SIDEKICK-Anwendung auf dem jeweiligen Betriebsystem / Endgerät / über die jeweilige Anwendungsdatei startet die folgende Bedienoberfläche.
- Prinzipiell ist der Programmaufbau der Windows- und RPi-Version der gleiche.
- Ebenfalls sind alle Blöcke, die spezifisch für das SIDEKICK-Assistenzsystem entwickelt sind, die gleichen.
- Lediglich werden die Funktionen der neuen SIDEKICK-Programmier-Blöcke, die auf die Hardware des RPi zugreifen (z. B. die GPIO-Blöcke) in der Windows-Version nicht ausgeführt.
- Diese Blöcke sind jedoch mit in der Block-Liste aufgeführt und kön-nen somit in die SIDEKICK-Block-Programmierung eingebaut werden.
- Auf der Windows-Version erstellte Projekte können auf den Raspberry Pi – per USB-Stick – übertragen und über die SIDEKICK-Anwendung geladen werden.
- Enthält dieses Projekt GPIO-Blöcke, ist ihre Funktion beim Ausführen auf dem Raspberry Pi gegeben.
- Lediglich werden die Funktionen der neuen SIDEKICK-Programmier-Blöcke, die auf die Hardware des RPi zugreifen (z. B. die GPIO-Blöcke) in der Windows-Version nicht ausgeführt.
-
Die Oberfläche beim Starten von SIDEKICK ist die Code-Ansicht.
- In dieser Ansicht ist die Programmierung über die Blöcke möglich.
- Links ist die Block-Palette dieser Ansicht.
- Hier liegen alle verfügbaren Blöcke zur Programmierung.
- Sie sind aufgeteilt in Block-Kategorien.
- Blöcke können im Code-Bereich (Mitte) platziert werden
(per Drag-and-Drop). - Blöcke sind, abhängig von der Blockform, verbindbar.
- Indem einer an einem kompatiblen losgelassen wird.
- Durch Wegziehen des oberen sind diese trennbar.
- Ausführen eines Blocks, führt alle darunter verbundenen aus
- Sie werden der sichtbaren Reihe nach abgearbeitet
(von oben nach unten –
ähnlich zur codebasierten Programmierung).
- Sie werden der sichtbaren Reihe nach abgearbeitet
- Hier liegen alle verfügbaren Blöcke zur Programmierung.
-
In der Block-Palette ist die neue SIDEKICK-Block-Kategorie aufgeführt
(im Vergleich zur Scratch-Oberfläche).- Um zu den Blöcken dieser Kategorie zu gelangen:
- Durch alle Blöcke nach unten durchscrollen
oder - auf die SIDEKICK-Block-Kategorie klicken
(so wird automatisch zu den Blöcken der Kategorie gescrollt).
- Durch alle Blöcke nach unten durchscrollen
- Um zu den Blöcken dieser Kategorie zu gelangen:
- Erweiterungsbibliothek aufrufen.
- Erweiterungs-Manager zum Laden externer, benutzerdefinierter Erweiterungen öffnen.
- Über die Schaltfläche „Benutzerdefinierte Erweiterung“ wird das Dialogfenster des Managers geöffnet.
- Tipp 1: Über die Suchfunktion oder die Kategorie „Sidekick“ der Erweiterungsbibliothek kann diese Erweiterung einfacher gefunden werden.
- Tipp 2: Über den Stern auf der Schaltfläche der Erweiterung wird diese zu Favoriten hinzugefügt.
- Über die Schaltfläche „Benutzerdefinierte Erweiterung“ wird das Dialogfenster des Managers geöffnet.
- In den Bereich des Erweiterungs-Managers zum manuellen Laden von Erweiterungen über JavaScript-Dateien navigieren.
- Über den Reiter „Datei“.
- Die JavaScript-Erweiterung-Datei laden.
- Von der Festplatte auswählen
- indem auf das gestrichelte Feld geklickt wird
oder - per „Drag and Drop“ hineinziehen und zum Laden über dem gestrichelten Feld loslassen.
- indem auf das gestrichelte Feld geklickt wird
- Von der Festplatte auswählen
- Wichtig: Häkchen beim Feld „Erweiterung ohne Sandbox ausführen“ setzen!
- Die Erweiterung der ausgewählten JavaScript-Erweiterung-Datei in die Anwendung laden.
- Über die Schaltfläche „Laden“.
- Es wird in der Code-Ansicht der Block-Palette eine neue Kategorie für die geladene Erweiterung hinzugefügt
(wenn die programmierung der Erweiterung keine Fehler ausgibt / wirft).
- Um zu den Blöcken der geladenen Erweiterung zu gelangen:
- Durch alle Blöcke nach unten scrollen
oder - auf die neu hinzugefügte Block-Kategorie gehen
(dadurch wird automatisch zu den Blöcken der Kategorie gescrollt).
- Durch alle Blöcke nach unten scrollen
- Um zu den Blöcken der geladenen Erweiterung zu gelangen:
Die SIDEKICK-Blöcke in folgende 6 sinnhafte Abschnitte unterteilt.
Ermöglichen die Ansteuerung der GPIO-Pins direkt über die Software.
Info: Diese Blöcke sind über Scratch ebenfalls verfügbar (über die interne Scratch-Bibliothek). Jedoch nur auf der RPi-Version von Scratch.
- Hat-Block: Wenn GPIO-Pin [GPIO-PIN-NUMMER] den Zustand [SIGNAL] hat Sobald am festgelegten GPIO-Pin das angegebene Signal anliegt, wird ein Block, unterhalb dieses Blocks, ausgeführt.
- Wahrheits-Block: Ist am GPIO-Pin [GPIO-PIN-NUMMER] der Zustand [SIGNAL]? Gibt, bei Aktivierung einen Wahrheits-Wert darüber zurück, ob der Zustand am angegebenen GPIO-Pin dem festgelegten Zustand entspricht.
- Stapel-Block: Setzte von GPIO-Pin [GPIO-PIN-NUMMER] den Output zu [SIGNAL]? Setzt bei Aktivierung den festgelegten GPIO-Pin auf das ausgewählte Signal und als Output.
- Stapel-Block: Setze von GPIO-Pin [GPIO-PIN-NUMMER] den Input zu [SIGNAL]? Setzt bei Aktivierung den festgelegten GPIO-Pin auf das ausgewählte Signal und als Input.
Möglichkeiten zum Speichern und Abrufen des aktuellen Assistenzschritts (eine Nummer des aktuell vorliegenden Assistenzschritt zuweisen). Für eine einfachere und besser lesbare Programmierung. Der Warte-Block: Zur besseren Steuerbarkeit der Assistenzschritte. Folgende SIDEKICK-Blöcke umfasst der Ablauf-Blöcke-Abschnitt.
- Stapel-Block: Setze Assistenzschritt auf [ASSISTENZSCHRITT-NUMMER] Legt den Wert des aktuellen Assistenzschritts über die angegebene Zahl bei Aktivierung fest.
- Kopf-Block: Wenn Assistenzschritt = [ASSISTENZSCHRITT-NUMMER] Wird aktiviert, sobald der Wert des Assistenzschritts dem angegebenen Wert entspricht.
- Stapel-Block: Warte [ZEITWERT-IN-SEKUNDEN] Sekunden Bei Aktivierung wird nach den Sekunden des festgelegten Werts der nächstfolgende Block ausgeführt.
Ermöglichen die Ansteuerung der LED-Streifen auf unterschiedliche Weise. Folgende SIDEKICK-Blöcke umfasst der LED-Blöcke-Abschnitt.
- Stapel-Block: Setze LED-Streifen [LED-STREIFEN-NUMMER] auf Farbe [FARBWERT] (Länge: [LED-PUNKTE-ANZAHL]) Bei Aktivierung wird die ausgewählte Anzahl an LED-Punkten des jeweils festgelegten LED-Streifens auf die mitgegebene Farbe gesetzt.
- Stapel-Block: Setze alle LED-Streifen (Anzahl: [LED-STREIFEN-ANZAHL]) auf Farbe [Farbe] Bei Aktivierung wird die ausgewählte Anzahl an LED-Streifen auf die mitgegebene Farbe gesetzt.
Die Funktionalität dieses Blocks wurde noch nicht problemlos umgesetzt! Dennoch wird im Folgenden, der Vollständigkeit halber, die geplante Funktionsweise dargestellt. Da der Block somit nicht getestet werden konnte, sind ebenfalls zwei unterschiedliche, mögliche Implementierungen aufgeführt.
Ermöglicht das Auslesen und Feedback auf Sensordaten der UV-Sensoren. Den folgenden SIDEKICK-Block umfasst der UV-Sensor-Blöcke-Abschnitt.
- Stapel- oder Kopf-Block: Wenn die Entfernung zu UV-Sensor [UV-SENSOR-NUMMER] kleiner als [UV-SENSOR-ABSTAND-IN-CENTIMETER] cm ist Bei Aktivierung wird der nächste Block ausgeführt, sobald eine Entfernung zum angegebenen UV-Senor kleiner als der mitgegebene Wert ist. Oder: Wird aktiviert, sobald eine Entfernung zum angegebenen UV-Senor kleiner als der mitgegebene Wert ist.
Abbildung 4.20 zeigt den umgesetzten SIDEKICK-Block der Button-Blöcke-Kategorie. Ermöglicht die Abfrage der Taster des SIDEKICK-Assistenzsystems. Den folgenden SIDEKICK-Block umfasst der Button-Blöcke-Abschnitt.
- Kopf-Block: Wenn Button [NUMMER] [BUTTON-ZUSTAND] wurde Wird aktiviert, sobald der ausgewählte Taster den ausgewählten Zustand annimmt („gedrückt“ oder „losgelassen“).
Ermöglichen das Laden und Steuern von Videomaterial. Folgende SIDEKICK-Blöcke umfasst die Video-Blöcke-Abschnitt.
- Stapel-Block: Importiere Video „[VIDEO-NAME].[VIDEO-DATEIENDUNG]“ Bei Aktivierung wird ein Video über den angegebenen Namen und der festgelegten Dateiendung in das SIDEKICK-Projekt geladen.
- Stapel-Block Starte Video [VIDEO-NAME] auf [SIDEKICK-GUI-OBJEKT] Bei Aktivierung wird ein geladenes Video über den angegebenen Namen von vorne gestartet und dabei auf dem ausgewählten Objekt dargestellt.
- Stapel-Block: Pausiere Video [VIDEO-NAME] Bei Aktivierung wird ein geladenes Video über den angegebenen Namen pausiert.
- Stapel-Block: Setze Video [VIDEO-NAME] fort Bei Aktivierung wird ein geladenes und pausiertes Video über den angegebenen Namen fortgeführt.
- Stapel-Block: Schließe Video [VIDEO-NAME] Bei Aktivierung wird ein geladenes Video über den angegebenen Namen gestoppt und vom Objekt, auf dem das entsprechende Video dargestellt wird, entfernt.
Das Einstellungsmenü ist z. B. über Bearbeiten Erweitert aufrufbar.
Das Einstellungsmenü bietet verschiedene Einstellungsmöglichkeiten.
Einstellungen sind jeweils über Tooltips erklärt (über die Fragezeichen hinter den Optionen). Hierüber ist ebenfalls die Auflösung der Bühne einstellbar (und somit das Größenverhältnis der Bühne in der Code-Ansicht). Einstellungen sind zudem für das aktuelle Projekt speicherbar (über die Schaltfläche Einstellungen im Projekt speichern). Folgende Abbildung zeigt die Auflösung 500 x 100 für die Bühne.
Z. B. ist so die Breite von Ultrawide-Monitoren ausnutzbar Bei der Assistenzdarstellung nutzbar (durch entsprechend festgelegte Auflösung).
Um ein Gerät mit dem Bluetooth des verwendeten Raspberry Pi zu verbinden, muss das entsprechende Gerät lediglich in den Pairing-Modus versetzt werden. Darauf sollte das Gerät über die Bluetooth-Einstellungen des RPi auffindbar sein – sobald Bluetooth eingeschaltet wurde. Die Einstellungen sind unter anderem in der Systemleiste des RPi aufrufbar – wie in folgender Abbildung zu sehen.
Sobald erfolgreich eine Verbindung zu dem entsprechenden Bluetooth-Ausgabegerät hergestellt ist, kann beliebiger Sound – etwa über die Video- oder Sound-Blöcke des SIDEKICK-Autorensystems – ausgegeben werden.
npm install npm run fetch npm run webpack:prod electron:package:dir
Standalone download under: scripts\packager.json
Scratch 3.0 as a standalone desktop application
Let's assume that you want to make a new release, version 3.999.0, corresponding to scratch-gui version
0.1.0-prerelease.20yymmdd.
- Merge
scratch-gui:cd scratch-guigit pull --all --tagsgit checkout scratch-desktopgit merge 0.1.0-prerelease.20yymmdd- Resolve conflicts if necessary
git tag scratch-desktop-v3.999.0git pushgit push --tags
- Prep
scratch-desktop:cd scratch-desktopgit pull --all --tagsgit checkout developnpm install --save-dev 'scratch-gui@github:LLK/scratch-gui#scratch-desktop-v3.999.0'git add package.json package-lock.json- Make sure the app works, the diffs look reasonable, etc.
git commit -m "bump scratch-gui to scratch-desktop-v3.999.0"npm version 3.999.0git pushgit push --tags
- Wait for the CI build and collect the release from the build artifacts
Eventually, the scratch-desktop branch of the Scratch GUI repository will be merged with that repository's main
development line. For now, though, the scratch-desktop branch holds a few changes that are necessary for the Scratch
app to function correctly but are not yet merged into the main development branch. If you only intend to build or work
on the scratch-desktop repository then you can ignore this, but if you intend to work on scratch-gui as well, make
sure you use the scratch-desktop branch there.
Previously it was necessary to explicitly build scratch-gui before building scratch-desktop. This is no longer
necessary and the related build scripts, such as build-gui, have been removed.
In the scratch-desktop directory, run npm run fetch. Re-run this any time you update scratch-gui or make any
other changes which might affect the media libraries.
npm start
npm run dist
Node that on macOS this will require installing various certificates.
This section is relevant only to members of the Scratch Team.
By default all Windows installers are unsigned. An APPX package for the Microsoft Store shouldn't be signed: it will be signed automatically as part of the store submission process. On the other hand, the non-Store NSIS installer should be signed.
To generate a signed NSIS installer:
- Acquire our latest digital signing certificate and save it on your computer as a
p12file. - Set
WIN_CSC_LINKto the path to your certificate file. For maximum compatibility I use forward slashes.- CMD:
set WIN_CSC_LINK=C:/Users/You/Somewhere/Certificate.p12 - PowerShell:
$env:WIN_CSC_LINK = "C:/Users/You/Somewhere/Certificate.p12"
- CMD:
- Set
WIN_CSC_KEY_PASSWORDto the password string associated with your P12 file.- CMD:
set WIN_CSC_KEY_PASSWORD=superSecret - PowerShell:
$env:WIN_CSC_KEY_PASSWORD = "superSecret"
- CMD:
- Build the NSIS installer only: building the APPX installer will fail if these environment variables are set.
npm run dist -- -w nsis
Sometimes the macOS build process will result in a build which crashes on startup. If this happens, check in Console
for an entry similar to this:
failed to parse entitlements for Scratch[12345]: OSUnserializeXML: syntax error near line 1
This appears to be an issue with codesign itself. Rebooting your computer and trying to build again might help. Yes,
really.
See this issue for more detail: electron/osx-sign#218
This will simulate a packaged build without actually packaging it: instead the files will be copied to a subdirectory
of dist.
npm run dist:dir
You can debug the renderer process by opening the Chromium development console. This should be the same keyboard shortcut as Chrome on your platform. This won't work on a packaged build.
You can debug the main process the same way as any Node.js process. I like to use Visual Studio Code with a configuration like this:
This application includes a telemetry system which is only active if the user opts in. When testing this system, it's
sometimes helpful to reset it by deleting the telemetry.json file.
The location of this file depends on your operating system and whether or not you're running a packaged build. Running
from npm start or equivalent is a non-packaged build.
In addition, macOS may store the file in one of two places depending on the OS version and a few other variables. If in doubt, I recommend removing both.
- Windows, packaged build:
%APPDATA%\Scratch\telemetry.json - Windows, non-packaged:
%APPDATA%\Electron\telemetry.json - macOS, packaged build:
~/Library/Application Support/Scratch/telemetry.jsonor~/Library/Containers/edu.mit.scratch.scratch-desktop/Data/Library/Application Support/Scratch/telemetry.json - macOS, non-packaged build:
~/Library/Application Support/Electron/telemetry.jsonor~/Library/Containers/edu.mit.scratch.scratch-desktop/Data/Library/Application Support/Electron/telemetry.json
Deleting this file will:
- Remove any pending telemetry packets
- Reset the opt in/out state: the app should display the opt in/out modal on next launch
- Remove the random client UUID: the app will generate a new one on next launch
Clone the sidekick-desktop repository into a folder sidekick-desktop by running:
<!-- !!! CHANGE !!! -->
git clone --recursive https://github.com/Menersar/sidekick-desktop sidekick-desktopOR (alternatively) run:
<!-- !!! CHANGE !!! -->
git clone https://github.com/Menersar/sidekick-desktop sidekick-desktop
git submodule init
git submodule updateInstall dependencies via the following command:
npm ciFetch extra library, packager, and extension files by running:
npm run fetchTo build the webpack portions in src-renderer-webpack for development builds, run this:
npm run webpack:compileYou can also run this instead for source file changes to immediately trigger rebuilds:
npm run webpack:watchIf everything is compiled and fetched, the application can be packaged up for Electron. For development, start a development Electron instance by running:
npm run electron:startLinux note: The app icon won't work in the development version, but it will work in the packaged version.
Development can work well by opening two terminals side-by-side, run npm run webpack:watch in one and npm run electron:start in the other.
Refresh the windows with Ctrl + R or Cmd + R to apply renderer file changes, manually restart the app to apply main file changes.
The development version of the app will be larger and slower than the final release builds.
Build an optimized version of the webpack portions with:
npm run webpack:prodThen to package up the final Electron binaries, use the electron-builder CLI. They will be saved in the dist folder. Some examples:
# Windows installer
npx electron-builder --windows nsis --x64
# macOS DMG
npx electron-builder --mac dmg --universal
# Linux Debian
npx electron-builder --linux debMore examples in the release script. You can typically only package for a certain operating system while on that operating system.
It is possible to give each packaged version of the app a unique distribution ID to help uniquely identify them – it appears in the "About" window.
Add --config.extraMetadata.sidekick_dist=your-dist-id-here to electron-builder's arguments to set the distribution ID. Additionally, to enable the in-app update checker, also add --config.extraMetadata.tw_update=yes.
file location:
scripts/packager.json
src:
- https://github.com/Menersar/sidekick-packager/releases
- https://github.com/Menersar/sidekick-packager/releases/download/v0.1.0/sidekick-packager-standalone-v0.1.0.html
sha256:
- npm run build-standalone-prod
- Scaffolding build ID
Create build for the Raspberry Pi 4 (!!tested for the 8 GB model!!; arm64 architecture; deb package)
-
Install Linux on Windows with WSL
-
Open PowerShell or Windows Command Prompt.
-
Use prompt:
wsl --install
-
-
Ubuntu WSL Terminal on Windows.
-
Navigate to the local SIDEKICK-Desktop folder.
- To navigate to the Windows User folder:
-
Use prompt:
cd /mnt/c/Users/
-
- To navigate to the Windows User folder:
-
Optional: Install and update packages.
- (Resolved my problem with an error stating "/usr/bin/env: 'bash\r': No such file or directory" once using the prompt to build the project as stated in the next step.)
sudo apt-get update sudo apt-get upgrade sudo apt install nodejs npm sudo npm install --global n sudo n 16.0.0
-
Build the project.
- Use prompt in the Terminal:
npx electron-builder --linux deb --arm64 --publish always --config.extraMetadata.sidekick_dist=prod-linux-deb-arm64 --config.extraMetadata.sidekick_update=yes
Install debian package on the Raspberry Pi
-
Run prompt in the Terminal:
sudo apt install /path/to/package/name.debor
-
Run prompt in the Terminal:
sudo apt install gdebi -
Open the .deb package file using it.
- Via: [Right-click] -> "Install Package".
- or via: [Right-click] -> "Open With" -> Choose: "GDebi Package Installer" -> Click on: "Install Package".
- The .deb package with all its dependencies get installed.
- Via: [Right-click] -> "Install Package".
Unpack Scratch / Electron Software:
-
Unbundle a webpack bundle.js with the SourceMap
- Reverse engineering JavaScript and CSS sources from sourcemaps:
-
webpack - How to extract bundle to respective components
- debundle
npm i -g debundle
- debundle
Scratch Desktop (Scratch 3.0 Offline Editor) on GNU/Linux: https://gist.github.com/lyshie/0c49393076b8b375ca1bd98c28f95fb0?permalink_comment_id=4492637#gistcomment-4492637
- "But this version of Scratch won't have access to the GPIO and SenseHat extensions for the Raspberry Pi, sadly, since those extensions are exclusive to the special version of Scratch Desktop that comes with the official Raspberry Pi OS."
Archive and compress as tar.gz archive.
npm run build l arm64 tar.gzor
npx electron-builder --linux tar.gz --arm64 --publish always --config.extraMetadata.sidekick_dist=prod-linux-tar-arm64 --config.extraMetadata.sidekick_update=yesPackage as Software distribution / Debian package (.deb)
sudo npm run build l arm64 debor
npx electron-builder --linux deb --arm64 --publish always --config.extraMetadata.sidekick_dist=prod-linux-deb-arm64 --config.extraMetadata.sidekick_update=yesDistribute as portable software format (AppImage).
npm run build l arm64 AppImageor
npx electron-builder --linux AppImage --arm64 --publish always --config.extraMetadata.sidekick_dist=prod-linux-appimage-arm64 --config.extraMetadata.sidekick_update=yesAdd the file / folder to the extraResources parameter in the build parameter in package.json.
-
e.g.:
"extraResources": [ // Include a file: { "from": "src-main/static/gpiolib.node", "to": "static/gpiolib.node" }, // Include a folder: { "from": "src-main/static/rpi-ws281x-native", "to": "static/rpi-ws281x-native", "filter": [ "!.git" ] } ],
To expose functions or properties, add information to the files src-preload/editor.js and src-main/windows/editor.js.
(E.g. expose a native module to the renderer process)
Expose via contextBridge.exposeInMainWorld.
-
E.g. add
gpioGet: (pin) => ipcRenderer.sendSync("gpio-get", pin)tocontextBridge.exposeInMainWorld("EditorPreload", {}):contextBridge.exposeInMainWorld("EditorPreload", { gpioGet: (pin) => ipcRenderer.sendSync("gpio-get", pin), });
In this file, a ipcMain module is created via const ipc = this.window.webContents.ipc.
ipcMain module:
- It is an Event Emitter.
- When used in the main process, it handles asynchronous and synchronous messages sent from a renderer process (web page).
- Messages sent from a renderer will be emitted to this module. (Source: https://www.electronjs.org/docs/latest/api/ipc-main)
ipcMain.on(channel, listener):
Listens to channel, when a new message arrives listener would be called with listener(event, args...).
-
E.g. add the functionality via
ipc.on("gpio-get", (event, gpioPin)if the messagegpio-getarrives:ipc.on("gpio-get", (event, gpioPin) => { if (process.platform === "linux") { const gpio = require(process.resourcesPath + "/static/gpiolib.node"); event.returnValue = gpio.get(gpioPin, -1, -1); } else { event.returnValue = -1; } });
(Source: https://stackoverflow.com/questions/46022443/electron-how-to-add-external-files)
-
Declare
extraResourcesunderbuildin thepackage.jsonfile. -
E.g.:
- Create a new folder named
extraResourcesadjacent topackage.json. - Add the following code to your package.json file:
build": { "extraResources": ["./extraResources/**"] }
- The files inside this folder are then accessible by using
__dirname + '/../extraResources/'from your main app.
- Create a new folder named
-
edit file b/node_modules/scratch-vm/src/extension-support/extension-manager.js
- pigpio: () => require('../extensions/scratch3_pigpio'),
-
add file b/node_modules/scratch-vm/src/extensions/scratch3_pigpio/index.js
-
edit file b/node_modules/scratch-gui/src/lib/libraries/extensions/index.jsx
- import pigpioIconURL from './pigpio/pigpio.png';
- import pigpioInsetIconURL from './pigpio/pigpio-small.svg';
- { name: 'Raspberry Pi GPIO', extensionId: 'pigpio', collaborator: 'Raspberry Pi', iconURL: pigpioIconURL, insetIconURL: pigpioInsetIconURL, description: ( ), featured: true },
-
add file b/node_modules/scratch-gui/src/lib/libraries/extensions/pigpio/pigpio-small.svg
-
add file b/node_modules/scratch-gui/src/lib/libraries/extensions/pigpio/pigpio.png
(Source: [optionalDependencies package.json npm docs]https://docs.npmjs.com/cli/v10/configuring-npm/package-json#optionaldependencies)
If a dependency can be used, but you would like npm to proceed if it cannot be found or fails to install, then you may put it in the optionalDependencies object. This is a map of package name to version or url, just like the dependencies object. The difference is that build failures do not cause installation to fail. Running npm install --omit=optional will prevent these dependencies from being installed.
It is still your program's responsibility to handle the lack of the dependency. For example, something like this:
try { var foo = require("foo"); var fooVersion = require("foo/package.json").version; } catch (er) { foo = null; } if (notGoodFooVersion(fooVersion)) { foo = null; }
// .. then later in your program ..
if (foo) { foo.doFooThings(); } Entries in optionalDependencies will override entries of the same name in dependencies, so it's usually best to only put in one place.
