Merge branch 'upsilon-dev' into upsilon-dev

This commit is contained in:
Yaya-Cout
2025-11-05 14:39:44 +00:00
committed by GitHub
112 changed files with 1043 additions and 450 deletions

View File

@@ -5,7 +5,7 @@ jobs:
docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
submodules: true
- name: Build the Docker image

View File

@@ -21,22 +21,22 @@ jobs:
fxcg:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
submodules: 'recursive'
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install curl git python3 build-essential cmake pkg-config -y
sudo apt-get install build-essential cmake libfreetype-dev -y
- name: Get latest gint commit hash
run: |
LATEST_COMMIT_HASH=$(curl --silent https://gitea.planet-casio.com/api/v1/repos/Lephenixnoir/gint/branches/master | jq -r .commit.id)
LATEST_COMMIT_HASH=$(curl --silent https://git.planet-casio.com/api/v1/repos/Lephenixnoir/gint/branches/master | jq -r .commit.id)
echo "Latest commit hash is: $LATEST_COMMIT_HASH"
echo "LATEST_COMMIT_HASH=$LATEST_COMMIT_HASH" >> $GITHUB_OUTPUT
id: get-latest-commit-hash
- name: Cache gint/fxsdk installation
id: cache-gint
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: |
~/.local/*/*
@@ -45,7 +45,7 @@ jobs:
- name: Install gint/fxsdk
if: steps.cache-gint.outputs.cache-hit != 'true'
env:
URL: "https://gitea.planet-casio.com/Lephenixnoir/GiteaPC/archive/master.tar.gz"
URL: "https://git.planet-casio.com/Lephenixnoir/GiteaPC/archive/master.tar.gz"
run: |
export PATH="~/.local/bin:$PATH"
cd "$(mktemp -d)"
@@ -72,7 +72,7 @@ jobs:
path: 'output/release/simulator/fxcg/epsilon.g3a'
destination: 'upsilon-binfiles.appspot.com/dev/simulator/'
parent: false
- uses: actions/upload-artifact@master
- uses: actions/upload-artifact@v4
with:
name: epsilon.g3a
path: output/release/simulator/fxcg/epsilon.g3a
@@ -81,7 +81,7 @@ jobs:
runs-on: ubuntu-latest
container: devkitpro/devkitarm:latest
steps:
- uses: actions/checkout@v1
- uses: actions/checkout@v4
with:
submodules: true
- run: sudo apt-get update
@@ -94,20 +94,28 @@ jobs:
- run: echo "PATH=.:$PATH" >> $GITHUB_ENV
- run: make -j2 PLATFORM=simulator TARGET=3ds
- run: make -j2 PLATFORM=simulator TARGET=3ds epsilon.cia
- uses: actions/upload-artifact@master
- uses: actions/upload-artifact@v4
with:
name: epsilon-3ds.3dsx
path: output/release/simulator/3ds/epsilon.3dsx
- uses: actions/upload-artifact@master
- uses: actions/upload-artifact@v4
with:
name: epsilon-3ds.cia
path: output/release/simulator/3ds/epsilon.cia
android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
submodules: 'recursive'
- run: |
sudo apt-get update
sudo apt-get install imagemagick libfreetype-dev libpng-dev
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
- run: wget -nv https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip
- run: unzip -q android-ndk-r21e-linux-x86_64.zip
- run: make -j2 PLATFORM=simulator TARGET=android NDK_PATH=./android-ndk-r21e
@@ -123,69 +131,88 @@ jobs:
path: 'output/release/simulator/android/epsilon.apk'
destination: 'upsilon-binfiles.appspot.com/dev/simulator/'
parent: false
- uses: actions/upload-artifact@master
- uses: actions/upload-artifact@v4
with:
name: epsilon-android.apk
path: output/release/simulator/android/epsilon.apk
n0100:
runs-on: ubuntu-latest
runs-on: ubuntu-24.04-arm
steps:
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
- uses: numworks/setup-arm-toolchain@2020-q2
- uses: actions/checkout@v2
- run: |
sudo apt-get update
sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
- uses: actions/checkout@v4
with:
submodules: 'recursive'
- run: mkdir final-output
- run: make -j2 MODEL=n0100 EPSILON_I18N=en output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.en.bin
- run: make -j2 MODEL=n0100 EPSILON_I18N=en output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.en.internal.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
# We need to duplicate make to work around i18n generator race condition in Makefile leading to inconsistent incremental rebuilds
- run: make -j2 MODEL=n0100 EPSILON_I18N=fr output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.fr.bin
- run: make -j2 MODEL=n0100 EPSILON_I18N=fr output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.fr.internal.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 EPSILON_I18N=nl output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.nl.bin
- run: make -j2 MODEL=n0100 EPSILON_I18N=nl output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.nl.internal.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 EPSILON_I18N=pt output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.pt.bin
- run: make -j2 MODEL=n0100 EPSILON_I18N=pt output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.pt.internal.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 EPSILON_I18N=it output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.it.bin
- run: make -j2 MODEL=n0100 EPSILON_I18N=it output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.it.internal.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 EPSILON_I18N=de output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.de.bin
- run: make -j2 MODEL=n0100 EPSILON_I18N=de output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.de.internal.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 EPSILON_I18N=es output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.es.bin
- run: make -j2 MODEL=n0100 EPSILON_I18N=es output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.es.internal.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 EPSILON_I18N=hu output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.hu.bin
- run: make -j2 MODEL=n0100 EPSILON_I18N=hu output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.hu.internal.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 output/release/device/n0100/flasher.light.bin
- run: mv output/release/device/n0100/flasher.light.bin final-output/flasher.light.bin
- run: make -j2 MODEL=n0100 output/release/device/n0100/flasher.verbose.bin
- run: mv output/release/device/n0100/flasher.verbose.bin final-output/flasher.verbose.bin
- run: find final-output/ -type f -exec bash -c "shasum -a 256 -b {} > {}.sha256" \;
- run: tar cvfz binpack-n0100.tgz final-output/*
- id: 'auth'
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
uses: 'google-github-actions/auth@v0'
with:
credentials_json: '${{secrets.GOOGLE_CREDENTIALS}}'
- id: 'upload-directory'
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
uses: 'google-github-actions/upload-cloud-storage@v0'
with:
path: 'final-output/'
destination: 'upsilon-binfiles.appspot.com/dev/n100/'
parent: false
- uses: actions/upload-artifact@master
- uses: actions/upload-artifact@v4
with:
name: epsilon-binpack-n0100.tgz
path: binpack-n0100.tgz
- uses: actions/checkout@v5
with:
repository: Yaya-Cout/Upsilon-binfiles
ref: 'main'
token: ${{ secrets.PAT_UPSILON_BINFILES }}
path: 'binfiles'
# TODO: Handle git conflicts using rebase
- name: Upload binary files to website
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
run: |
cp -r final-output/* binfiles/binaries/dev/n100
cd binfiles
git add -A
git config --global user.email "ci@github.com"
git config --global user.name "GitHub Upsilon CI"
git pull
git commit -m "Update from CI"
git push
n0110:
runs-on: ubuntu-latest
runs-on: ubuntu-24.04-arm
steps:
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
- uses: numworks/setup-arm-toolchain@2020-q2
- uses: actions/checkout@v2
- run: |
sudo apt-get update
sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
- uses: actions/checkout@v4
with:
submodules: 'recursive'
- run: make -j2 MODEL=n0110 epsilon.dfu
@@ -194,33 +221,43 @@ jobs:
- run: make -j2 MODEL=n0110 epsilon.onboarding.beta.dfu
- run: make -j2 MODEL=n0110 flasher.light.dfu
- run: make -j2 MODEL=n0110 flasher.verbose.dfu
# We don't need bench as it is used only in factory
# - run: make -j2 bench.ram.dfu
# - run: make -j2 bench.flash.dfu
- run: make -j2 MODEL=n0110 flasher.verbose.bin
- run: make -j2 MODEL=n0110 bench.ram.dfu
# - run: make -j2 MODEL=n0110 bench.flash.dfu
- run: make -j2 MODEL=n0110 binpack
- run: cp output/release/device/n0110/binpack-n0110-`git rev-parse HEAD | head -c 7`.tgz output/release/device/n0110/binpack-n0110.tgz
- id: 'auth'
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
uses: 'google-github-actions/auth@v0'
with:
credentials_json: '${{secrets.GOOGLE_CREDENTIALS}}'
- id: 'upload-directory'
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
uses: 'google-github-actions/upload-cloud-storage@v0'
with:
path: 'output/release/device/n0110/binpack/'
destination: 'upsilon-binfiles.appspot.com/dev/n110/'
parent: false
- uses: actions/upload-artifact@master
- run: cp output/release/device/n0110/flasher.verbose.bin output/release/device/n0110/binpack/
- run: cd output/release/device/n0110 && for binary in *.bin; do shasum -a 256 -b binpack/${binary} > binpack/${binary}.sha256;done
- run: cp output/release/device/n0110/binpack-n0110-`git rev-parse HEAD | head -c 7`.tgz output/release/device/n0110/binpack/binpack.tgz
- uses: actions/upload-artifact@v4
with:
name: epsilon-binpack-n0110.tgz
path: output/release/device/n0110/binpack-n0110.tgz
- uses: actions/checkout@v5
with:
repository: Yaya-Cout/Upsilon-binfiles
ref: 'main'
token: ${{ secrets.PAT_UPSILON_BINFILES }}
path: 'binfiles'
# TODO: Handle git conflicts using rebase
- name: Upload binary files to website
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
run: |
cp -r output/release/device/n0110/binpack/* binfiles/binaries/dev/n110
cd binfiles
git add -A
git config --global user.email "ci@github.com"
git config --global user.name "GitHub Upsilon CI"
git pull
git commit -m "Update from CI"
git push
bootloader:
runs-on: ubuntu-latest
runs-on: ubuntu-24.04-arm
steps:
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
- uses: numworks/setup-arm-toolchain@2022-08
- uses: actions/checkout@v2
- run: |
sudo apt-get update
sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
- uses: actions/checkout@v5
with:
submodules: 'recursive'
- run: make -j2 MODEL=n0110 bootloader
@@ -237,22 +274,28 @@ jobs:
- run: cp output/release/device/n0110/bootloader.bin output/release/device/bootloader/
- run: cd output/release/device/bootloader && for binary in *.bin; do shasum -a 256 -b binpack/${binary} > binpack/${binary}.sha256;done
- run: cd output/release/device/bootloader && tar cvfz binpack-bootloader.tgz binpack/*
- id: 'auth'
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
uses: 'google-github-actions/auth@v0'
with:
credentials_json: '${{secrets.GOOGLE_CREDENTIALS}}'
- id: 'upload-directory'
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon' }}
uses: 'google-github-actions/upload-cloud-storage@v0'
with:
path: 'output/release/device/bootloader/binpack/'
destination: 'upsilon-binfiles.appspot.com/dev/n110/'
parent: false
- uses: actions/upload-artifact@master
- uses: actions/upload-artifact@v4
with:
name: epsilon-binpack-bootloader.tgz
path: output/release/device/bootloader/binpack-bootloader.tgz
- uses: actions/checkout@v5
with:
repository: Yaya-Cout/Upsilon-binfiles
ref: 'main'
token: ${{ secrets.PAT_UPSILON_BINFILES }}
path: 'binfiles'
# TODO: Handle git conflicts using rebase
- name: Upload binary files to website
if: ${{ github.event_name == 'push' && github.ref_name == 'upsilon-dev' && github.repository == 'UpsilonNumworks/Upsilon'}}
run: |
cp -r output/release/device/bootloader/binpack/* binfiles/binaries/dev/n110
cd binfiles
git add -A
git config --global user.email "ci@github.com"
git config --global user.name "GitHub Upsilon CI"
git pull
git commit -m "Update from CI"
git push
windows:
runs-on: windows-latest
defaults:
@@ -260,7 +303,7 @@ jobs:
shell: msys2 {0}
steps:
- uses: msys2/setup-msys2@v2
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
submodules: 'recursive'
- run: pacman -S --noconfirm mingw-w64-x86_64-gcc mingw-w64-x86_64-freetype mingw-w64-x86_64-pkg-config make mingw-w64-x86_64-python3 mingw-w64-x86_64-libjpeg-turbo mingw-w64-x86_64-libpng
@@ -279,7 +322,7 @@ jobs:
path: 'output/release/simulator/windows/epsilon.exe'
destination: 'upsilon-binfiles.appspot.com/dev/simulator/'
parent: false
- uses: actions/upload-artifact@master
- uses: actions/upload-artifact@v4
with:
name: epsilon-windows.exe
path: output/release/simulator/windows/epsilon.exe
@@ -289,9 +332,13 @@ jobs:
- uses: numworks/setup-emscripten@master
with:
sdk: latest
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
submodules: 'recursive'
# Install the Linux toolchin to avoid dependancies issues, but maybe only libpng is needed
- run: |
sudo apt-get update
sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config libxtst-dev
- run: make -j2 PLATFORM=simulator TARGET=web
- run: make -j2 PLATFORM=simulator TARGET=web test.js
- run: node output/release/simulator/web/test.js --headless
@@ -307,15 +354,17 @@ jobs:
path: 'output/release/simulator/web/epsilon.js'
destination: 'upsilon-binfiles.appspot.com/dev/simulator/'
parent: false
- uses: actions/upload-artifact@master
- uses: actions/upload-artifact@v4
with:
name: epsilon-web.zip
path: output/release/simulator/web/epsilon.zip
linux:
runs-on: ubuntu-latest
steps:
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
- uses: actions/checkout@v2
- run: |
sudo apt-get update
sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config libxtst-dev
- uses: actions/checkout@v4
with:
submodules: 'recursive'
- run: make -j2 PLATFORM=simulator
@@ -333,7 +382,7 @@ jobs:
path: 'output/release/simulator/linux/epsilon.bin'
destination: 'upsilon-binfiles.appspot.com/dev/simulator/'
parent: false
- uses: actions/upload-artifact@master
- uses: actions/upload-artifact@v4
with:
name: epsilon-linux.bin
path: output/release/simulator/linux/epsilon.bin
@@ -341,14 +390,15 @@ jobs:
if: github.event.inputs.triggerMacos == 'yes' || github.event.inputs.triggerMacos == ''
runs-on: macOS-latest
steps:
- run: brew install python-setuptools
- run: brew install numworks/tap/epsilon-sdk
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
submodules: 'recursive'
- run: make -j2 PLATFORM=simulator
- run: make -j2 PLATFORM=simulator ARCH=x86_64 test.bin
- run: output/release/simulator/macos/x86_64/test.bin --headless
- uses: actions/upload-artifact@master
- uses: actions/upload-artifact@v4
with:
name: epsilon-macos.zip
path: output/release/simulator/macos/epsilon.app
@@ -356,13 +406,14 @@ jobs:
if: github.event.inputs.triggerIos == 'yes' || github.event.inputs.triggerIos == ''
runs-on: macOS-latest
steps:
- run: brew install python-setuptools
- run: brew install numworks/tap/epsilon-sdk
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
submodules: 'recursive'
- run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0
- run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0 APPLE_PLATFORM=ios-simulator
- uses: actions/upload-artifact@master
- uses: actions/upload-artifact@v4
with:
name: epsilon-ios.ipa
path: output/release/simulator/ios/epsilon.ipa

View File

@@ -10,7 +10,7 @@ jobs:
- name: Install ARM toolchain
uses: numworks/setup-arm-toolchain@2020-q2
- name: Checkout PR base
uses: actions/checkout@v2
uses: actions/checkout@v4
with:
submodules: recursive
ref: ${{ github.event.pull_request.base.sha }}
@@ -18,7 +18,7 @@ jobs:
- name: Build base
run: make -j2 -C base MODEL=n0110 epsilon.elf
- name: Checkout PR head
uses: actions/checkout@v2
uses: actions/checkout@v4
with:
submodules: recursive
ref: ${{ github.event.pull_request.head.sha }}
@@ -27,12 +27,12 @@ jobs:
run: make -j2 -C head MODEL=n0110 epsilon.elf
- name: Retrieve binary size analysis
id: binary_size
run: echo "::set-output name=table::$(python3 head/build/metrics/binary_size.py base/output/release/device/n0110/epsilon.elf head/output/release/device/n0110/epsilon.elf --labels Base Head --sections .text .rodata .bss .data --custom 'Total (RAM)' .data .bss --custom 'Total (ROM)' .text .rodata .data --escape)"
run: echo "table=$(python3 head/build/metrics/binary_size.py base/output/release/device/n0110/epsilon.elf head/output/release/device/n0110/epsilon.elf --labels Base Head --sections .text .rodata .bss .data --custom 'Total (RAM)' .data .bss --custom 'Total (ROM)' .text .rodata .data --escape)" >> $GITHUB_OUTPUT
- name: Add comment
uses: actions/github-script@v3.0.0
uses: actions/github-script@v7
with:
script: |
await github.issues.createComment({
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,

View File

@@ -7,19 +7,19 @@
<a href="https://discord.gg/sbGvhWETAd"><img alt="Discord" src="https://img.shields.io/discord/663420259851567114?color=blue&labelColor=292929&label=chat%20-%20discord&logo=discord&style=for-the-badge" /></a>
</p>
> Don't understand french ? speak english ? here's the [english README](./README.md) !
> Don't understand French ? Speak English ? here's the [english README](./README.md) !
## À propos
Upsilon est un fork d'Omega, un fork d'Epsilon, l'OS de Numworks tournant sur les calculatrices du même nom, qui apporte beaucoup de fonctionnalités en plus, mais qui fut archivé et fermé pour des raisons légales après un changement de politique de Numworks. Upsilon est fait pour ceux qui aimeraient voir un futur pour les OS créées par les utilisateurs pour Numworks, même après l'arrèt du projet initial.
Upsilon est un fork d'Omega, un fork d'Epsilon, l'OS de NumWorks tournant sur les calculatrices du même nom, qui apporte beaucoup de fonctionnalités en plus, mais qui fut archivé et fermé pour des raisons légales après un changement de politique de NumWorks. Upsilon est fait pour ceux qui aimeraient voir un futur pour les OS créés par les utilisateurs pour NumWorks, même après l'arrêt du projet initial.
### Quelques fonctionnalités supplémentaires
- Un module python kandinsky amélioré
- Un module Python Kandinsky amélioré
- Un support pour fonds d'écrans personnalisés
- Des applications externes
- Un thème Upsilon
- La surcharge des opérateurs en python
- La surcharge des opérateurs en Python
- Un tableau périodique légèrement amélioré
- L'utilisation possible du signe "=" dans les calculs
- *Ainsi que tout ce qui a été ajouté sur Omega, et bien plus...* [Changelogs complets d'Omega](https://github.com/Omega-Numworks/Omega/wiki/Changelog) | [Fonctionnalités principales d'Omega & captures d'écran](https://github.com/Omega-Numworks/Omega/wiki/Main-features).
@@ -29,12 +29,12 @@ Upsilon est un fork d'Omega, un fork d'Epsilon, l'OS de Numworks tournant sur le
### Site web
Rendez-vous sur le [site d'Upsilon](https://getupsilon.web.app/) à la section "Installer".
Si votre calculatrice est reconnue, qu'elle contient une version d'Epsilon inférieure à 16 et que votre navigateur accepte WebUSB, la page vous proposera d'installer Upsilon.
Si votre calculatrice est reconnue, qu'elle contient une version d'Epsilon inférieure à 16 et que votre navigateur accepte WebUSB, la page vous proposera d'installer Upsilon.
Ne débranchez votre calculatrice qu'une fois l'installation terminée.
### Manuelle
*Vous pouvez vous référer à ce [site internet](https://www.numworks.com/resources/engineering/software/build/)pour la première étape si vous avez des erreurs*
*Vous pouvez vous référer à ce [site internet](https://www.numworks.com/resources/engineering/software/build/) pour la première étape si vous avez des erreurs*
### 1. Installation du SDK
@@ -52,13 +52,13 @@ Ne débranchez votre calculatrice qu'une fois l'installation terminée.
<br>
Il suffit juste d'installer les dépendances en tapant ces commandes dans un Terminal en mode super-utilisateur.
Il suffit juste d'installer les dépendances en tapant ces commandes dans un terminal en mode super-utilisateur.
```bash
apt-get install build-essential git imagemagick libx11-dev libxext-dev libfreetype6-dev libpng-dev libjpeg-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
```
C'est fait! Vous pouvez aller à l'étape 2.
C'est fait ! Vous pouvez aller à l'étape 2.
<br>
@@ -70,7 +70,7 @@ C'est fait! Vous pouvez aller à l'étape 2.
<br>
Installez toutes les dépendances grâce à cette commande:
Installez toutes les dépendances grâce à cette commande :
```bash
dnf install make automake gcc gcc-c++ kernel-devel git ImageMagick libX11-devel libXext-devel freetype-devel libpng-devel libjpeg-devel pkg-config arm-none-eabi-gcc-cs arm-none-eabi-gcc-cs-c++
@@ -86,7 +86,7 @@ dnf install make automake gcc gcc-c++ kernel-devel git ImageMagick libX11-devel
<br>
Installez toutes les dépendances grâce à cette commande:
Installez toutes les dépendances grâce à cette commande :
```bash
nix-env -p gcc libpng libjpeg xorg.libX11 pkg-config freetype xorg.libXext python3 imagemagick python310Packages.lz4 python310Packages.pypng python310Packages.pypng gcc-arm-embedded
```
@@ -103,7 +103,7 @@ nix-env -p gcc libpng libjpeg xorg.libX11 pkg-config freetype xorg.libXext pytho
<br>
Il est recommandé d'utiliser [Homebrew](https://brew.sh/). Une fois intsallé, utilisez:
Il est recommandé d'utiliser [Homebrew](https://brew.sh/). Une fois installé, utilisez :
```bash
brew install numworks/tap/epsilon-sdk
@@ -129,16 +129,16 @@ Vous pouvez aller à l'étape 2.
<details>
<summary>Avec Msys2/Mingw (Supportés par Numwoks bien qu'il y ait beaucoup de bugs)</summary>
<summary>Avec Msys2/Mingw (Supportés par NumWorks bien qu'il y ait beaucoup de bugs)</summary>
L'environnement de compilation [Msys2](https://www.msys2.org/) est recommandé par Numworks pour obtenir la plupart des outils requis facilement. C'est ici que vous allez copier-colletoutes lecommandes de ce tutoriel. Une fois installé, copier-coller ces deux commandes dans le terminal:
L'environnement de compilation [Msys2](https://www.msys2.org/) est recommandé par NumWorks pour obtenir la plupart des outils requis facilement. C'est ici que vous allez copier-coller toutes les commandes de ce tutoriel. Une fois installé, copiez-collez ces deux commandes dans le terminal:
```bash
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-freetype mingw-w64-x86_64-pkg-config mingw-w64-x86_64-libusb git make python
echo "export PATH=/mingw64/bin:$PATH" >> .bashrc
```
Ensuite, vous devrez installer [GCC toolchain for ARM](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads). Quand il vouest demandde choisir u dossier d'installation, choisissez `C:\msys64\home\User\gcc-arm\`. Il vous faudra ensuite ajouter ce dossier à votre $PATH. Tapez juste:
Ensuite, vous devrez installer [GCC toolchain for ARM](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads). Quand il vous est demandé de choisir un dossier d'installation, choisissez `C:\msys64\home\User\gcc-arm\`. Il vous faudra ensuite ajouter ce dossier à votre $PATH. Tapez juste:
```bash
echo "export PATH=$PATH:$HOME/gcc-arm/bin" >> .bashrc
@@ -154,11 +154,11 @@ Redémarrez votre terminal et vous pouvez aller à l'étape 2!
WSL est un système qui virtualise un environnement GNU/Linux dans Windows.
Votre version de windows doit être >= 1903.
Votre version de Windows doit être >= 1903.
#### Installation de WSL
1. Apuyez simulatanément sur les touches "windows" et "x" puis cliquez sur "Powershell administrateur". Entrez ensuite ceci dans la nouvelle fenêtre:
1. Apuyez simultanément sur les touches "Windows" et "X" puis cliquez sur "PowerShell Administrateur". Entrez ensuite ceci dans la nouvelle fenêtre:
```powershell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
@@ -176,45 +176,47 @@ Cette commande permet d'autoriser le démarrage des machines signées par Micros
3. Téléchargez [ce fichier](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi) et suivez les instructions d'installation.
4. Ouvrez votre fenêtre powershell comme avant et tapez:
4. Ouvrez votre fenêtre PowerShell comme avant et tapez:
```powershell
wsl --set-default-version 2
```
5. téléchargez [Ubuntu](https://www.microsoft.com/store/apps/9n6svws3rx71) depuis le Microsoft store. Vous pouvez aussi installer [Debian](https://www.microsoft.com/store/productI9MSVKQC78PK6).
5. Téléchargez [Ubuntu](https://www.microsoft.com/store/apps/9n6svws3rx71) depuis le Microsoft store. Vous pouvez aussi installer [Debian](https://www.microsoft.com/store/productI9MSVKQC78PK6) à la place.
WSL est maintenant installé.
6. Installez maintenant la version pour ARM de GCC.
```bash
sudo apt-get update
sudo apt-get install build-essential git imagemagick libx11-dev libxext-dev libfreetype6-dev libpng-dev libjpeg-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
```
### Installation d'usbipd pour connecter la calculatrice à WSL (facultatif)
Pour connecter la calculatrice, il faut installer cet [outil](https://github.com/dorssel/usbipd-win/releases/download/v1.3.0/usbipd-win_1.3.0.msi). Il permet de connecter des périphériques par internet. Suivez les instructions pour installer.
Pour connecter la calculatrice, il faut installer cet [outil](hthttps://github.com/dorssel/usbipd-win/releases/download/v5.0.0/usbipd-win_5.0.0_x64.msi). Il permet de connecter des périphériques par Internet. Suivez les instructions pour l'installer.
#### Ubuntu
1. Dans un terminal WSL Ubuntu, tapez:
1. Dans un terminal WSL Ubuntu, tapez :
```bash
sudo apt install linux-tools-5.4.0-77-generic hwdata
sudo apt install linux-tools-generic hwdata
```
2. Editez /etc/sudoers pour que l'on puisse utiliser la commande usbip. Sur Ubutu, cele est fait de cette manière:
<!-- 2. Editez /etc/sudoers pour que l'on puisse utiliser la commande usbip. Sur Ubuntu, cela est fait de cette manière :
```bash
sudo visudo
```
3. Ajoutez `/usr/lib/linux-tools/5.4.0-77-generic` au début du secure_path. Après édition, la ligne devrait ressembler à:
`Defaults secure_path="/usr/lib/linux-tools/5.4.0-77-generic:/usr/local/sbin:..."`
`Defaults secure_path="/usr/lib/linux-tools/5.4.0-77-generic:/usr/local/sbin:..."` -->
#### Debian
1.Si vous utiliser Debian, utilisez cette commande:
1.Si vous utilisez Debian, lancez cette commande:
```bash
sudo apt install usbip hwdata usbutils
@@ -222,18 +224,19 @@ sudo apt install usbip hwdata usbutils
### Pour connecter la calculatrice à WSL
1. Ouvrez encore un powershell en mode administrateur et tapez:
1. Ouvrez à nouveau un PowerShell en mode administrateur et tapez :
```powershell
usbipd wsl list
usbipd list
```
Ceci va lister les périphériques USB connectés à l'ordinateur. Reagrdez le BUSID de votre "Numworks Calculator".
Ceci va lister les périphériques USB connectés à l'ordinateur. Regardez le BUSID de votre "Numworks Calculator".
2. Maintenant, lancez cette commande en remplçant <BUSID> par celui de votre caculatrice:
2. Maintenant, lancez cette commande en remplaçant <BUSID> par celui de votre calculatrice :
```powershell
usbipd wsl attach --busid <BUSID>
usbipd bind --busid <BUSID>
usbipd attach --wsl --busid <BUSID>
```
Le mot de passe de votre machine WSL vous sera demandé.
@@ -248,7 +251,7 @@ Vous pouvez aller à l'étape 2.
### 2. Récupérer le code source
Le code source est disponible dans une repository git. Récupérez-le de cette manière:
Le code source est disponible dans une repository git. Récupérez-le de cette manière :
```bash
git clone --recursive https://github.com/UpsilonNumworks/Upsilon.git
@@ -287,7 +290,7 @@ soit:
make MODEL=n0100 OMEGA_USERNAME="" binpack -j4
```
pour compiler les binpacks que vous pouvez distribuer et flasher depuis le [Ti-planet's webDFU](https://ti-planet.github.io/webdfu_numworks/n0100/).
pour compiler les binpacks que vous pouvez distribuer et flasher depuis le [WebDFU de TI-Planet](https://ti-planet.github.io/webdfu_numworks/n0100/).
</details>
@@ -295,7 +298,7 @@ pour compiler les binpacks que vous pouvez distribuer et flasher depuis le [Ti-p
<summary><b>Model n0110</b></summary>
Le bootloader vous permet d'installer firmware dans des "slots" séparés. Dans ce cas les applications externes ne pourront pas utiliser toute la mémoire mais la moitié. Si un seul slot est utilisé, le bootloader permettra d'utiliser toute la mémoire. Sans bootloader, les apps external peuvent utiliser toute la mémoire.
Le bootloader vous permet d'installer 2 firmwares dans des "slots" séparés. Dans ce cas les applications externes ne pourront pas utiliser toute la mémoire mais la moitié. Si un seul slot est utilisé, le bootloader permettra d'utiliser toute la mémoire. Sans bootloader, les apps externes peuvent utiliser toute la mémoire.
<details>
<summary>Bootloader</summary>
@@ -324,7 +327,7 @@ soit:
make OMEGA_USERNAME="{Votre nom, max 15 caractères}" binpack -j4
```
pour compiler les binpacks que vous pouvez distribuer et flasher depuis le [Ti-planet's webDFU](https://ti-planet.github.io/webdfu_numworks/n0100/). Vous les trouverez dans `output/release/device/bootloader/`.
pour compiler les binpacks que vous pouvez distribuer et flasher depuis le [WebDFU de TI-Planet](https://ti-planet.github.io/webdfu_numworks/n0100/). Vous les trouverez dans `output/release/device/bootloader/`.
</details>
@@ -353,7 +356,7 @@ soit:
make MODEL=n0110 OMEGA_USERNAME="{Votre nom, max 15 caractères}" binpack -j4
```
pour compiler les binpacks que vous pouvez distribuer et flasher depuis le [Ti-planet's webDFU](https://ti-planet.github.io/webdfu_numworks/n0100/). Vous les trouverez dans `output/release/device/n0110/`.
pour compiler les binpacks que vous pouvez distribuer et flasher depuis le [WebDFU de TI-Planet](https://ti-planet.github.io/webdfu_numworks/n0100/). Vous les trouverez dans `output/release/device/n0110/`.
</details>
</details>
@@ -424,7 +427,7 @@ git checkout --recursive upsilon-dev
make PLATFORM=simulator TARGET=3ds -j
```
Vous pouvez ensuite mettre epsilon.3dsx sur une carte SDpour le lancer depuis le HBC ou utilisez 3dslink pour le lancer via le réseau:
Vous pouvez ensuite mettre epsilon.3dsx sur une carte SD pour le lancer depuis le HBC ou utilisez 3dslink pour le lancer via le réseau:
```bash
3dslink output/release/simulator/3ds/epsilon.3dsx -a <3DS' IP ADDRESS>
@@ -434,19 +437,19 @@ Vous pouvez ensuite mettre epsilon.3dsx sur une carte SDpour le lancer depuis le
<br>
Important: n'oubliez pas l'argument `--recursive` Parce qu'Upsilon dépend de submodules.
Important: n'oubliez pas l'argument `--recursive` parce qu'Upsilon dépend de submodules.
Aussi, vous pouvez changer le nombre de processus de compilation en parallèles en changeant le nombre après l'argument `-j`.
N'oubliez pas de mettre votre nom à la place `{Votre nom, maximum 15 caractères}`.Si vous n'en voulez pas, enlevez l'argument `OMEGA_USERNAME`.
N'oubliez pas de mettre votre nom à la place `{Votre nom, maximum 15 caractères}`. Si vous n'en voulez pas, enlevez l'argument `OMEGA_USERNAME`.
Si vous avez besoin d'aide, n'hésitez pas à rejoindre notre serveur discord : <https://discord.gg/Q9buEMduXG>
Si vous avez besoin d'aide, n'hésitez pas à rejoindre notre serveur Discord : <https://discord.gg/Q9buEMduXG>
<a href="https://discord.gg/Q9buEMduXG"><p align="center"><img alt="Omega Banner Discord" src="https://user-images.githubusercontent.com/12123721/86287349-54ef5800-bbe8-11ea-80c1-34eb1f93eebd.png" /></p></a>
---
## Liens utiles
- [Upsilon external (pour installer des applications supplémentaires et des fonds d'écran)](https://upsilonnumworks.github.io/Upsilon-External/)
- [Documentation d'ulab](https://micropython-ulab.readthedocs.io/en/latest/)
- [Upsilon-External (pour installer des applications supplémentaires et des fonds d'écran)](https://upsilonnumworks.github.io/Upsilon-External/)
- [Documentation d'Ulab](https://micropython-ulab.readthedocs.io/en/latest/)
## Contribution
@@ -467,18 +470,18 @@ Les anciens projets d'Omega, avant sa fermeture, qui ont été utilisés pour ce
## À propos d'Epsilon
Upsilon est un fork d'Omega, visant a continuer le projet des OS utilisateurs pour Numworks
Upsilon est un fork d'Omega, visant a continuer le projet des OS utilisateurs pour NumWorks.
Omega est un fork d'Epsilon, un système d'exploitation performant pour calculatrices graphiques. Il inclut huit applications pour les mathématiques de lycée et d'études supérieurs
Omega est un fork d'Epsilon, un système d'exploitation performant pour calculatrices graphiques. Il inclut huit applications pour les mathématiques de lycée et d'études supérieures.
Vous pouvez essayer Epsilon depuis votre navigateur sur le [simulateur en ligne](https://www.numworks.com/simulator/).
## Licence
NumWorks est une marque déposée de NumWorks SAS, 24 Rue Godot de Mauroy, 75009 Paris, France.
Nintendo est Nintendo 3DS sont des marques déposées de Nintendo of America Inc, 4600 150th Ave NE, Redmond, WA 98052, Etats-Unis.
Nintendo et Nintendo 3DS sont des marques déposées de Nintendo of America Inc, 4600 150th Ave NE, Redmond, WA 98052, Etats-Unis.
NumWorks SAS et Nintendo of America Inc ne sont en aucun cas associés avec ce projet.
- NumWorks Epsilon est disponible sous [Lisense CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).
- Omega est disponible sous [Lisense CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).
- Upsilon est disponible sous [Lisense CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).
- NumWorks Epsilon est disponible sous [licence CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.fr).
- Omega est disponible sous [licence CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.fr).
- Upsilon est disponible sous [licence CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.fr).

View File

@@ -7,11 +7,11 @@
<a href="https://discord.gg/hnEqPzAJzn"><img alt="Discord" src="https://img.shields.io/discord/663420259851567114?color=blue&labelColor=292929&label=chat%20-%20discord&logo=discord&style=for-the-badge" /></a>
</p>
> Vous ne comprenez pas l'anglais ? Vous êtes francophone ? Regardez le [*LISEZ-MOI* français](./README.fr.md) !
> 🇫🇷 Vous ne comprenez pas l'anglais ? Vous êtes francophone ? Regardez le [*LISEZ-MOI* français](./README.fr.md) ! 🇫🇷
## About
Upsilon is a fork of Omega, an user-made OS that runs on the Numworks calculator, which brings many features to it, but was discontinued because of a policy change from Numworks. Upsilon is for the people who want to see a future for user-made OSes for Numworks, even after the closure and archiving of Omega.
Upsilon is a fork of Omega, an user-made OS that runs on the NumWorks calculator, which brings many features to it, but was discontinued because of a policy change from NumWorks. Upsilon is for the people who want to see a future for user-made OSes for NumWorks, even after the closure and archiving of Omega.
### Some new features
@@ -131,16 +131,16 @@ And there you can go to step 2!
<details>
<summary>With Msys2/Mingw (officialized by numworks but with a lot of bugs)</summary>
<summary>With Msys2/Mingw (officialized by NumWorks but with a lot of bugs)</summary>
[Msys2](https://www.msys2.org/) environment is recommended by Numworks to get most of the required tools on Windows easily. It's where you'll paste all the commands of this tutorial. Once it'sinstalled, paste these commands into the Msys2 terminal.
[Msys2](https://www.msys2.org/) environment is recommended by NumWorks to get most of the required tools on Windows easily. It's where you'll paste all the commands of this tutorial. Once it's installed, paste these commands into the Msys2 terminal.
```bash
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-freetype mingw-w64-x86_64-pkg-config mingw-w64-x86_64-libusb git make python
echo "export PATH=/mingw64/bin:$PATH" >> .bashrc
```
Next, you'll need to install the [GCC toolchain for ARM](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads). When prompted for aninstall location, choose `C:\msys64\home\User\gcc-arm\`. You'll then need to add this folder to your $PATH. Just enter:
Next, you'll need to install the [GCC toolchain for ARM](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads). When prompted for an install location, choose `C:\msys64\home\User\gcc-arm\`. You'll then need to add this folder to your $PATH. Just enter:
```bash
echo "export PATH=$PATH:$HOME/gcc-arm/bin" >> .bashrc
@@ -154,11 +154,11 @@ Just restart terminal and you can go to step 2!
<summary>With WSL 2</summary>
You need a windows version >= 1903.
You need a Windows version >= 1903.
#### WSL Installation
1. Use simultaneously win + X keys and then click on "admin powershell".
1. Use simultaneously Win + X keys and then click on "admin powershell".
```powershell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
@@ -181,35 +181,47 @@ This one allows virtual machines developed by Microsoft.
```powershell
wsl --set-default-version 2
```
5. Download [Ubuntu](https://www.microsoft.com/store/apps/9n6svws3rx71) from Microsoft store.
WSL is now installed.
6. Then Install GCC cross compiler for ARM. In your Ubuntu teminal, run:
<!-- TODO: Test if `wsl --install` works better, and if WSL2 has not became the
default -->
```bash
apt-get install build-essential git imagemagick libx11-dev libxext-dev libfreetype6-dev libpng-dev libjpeg-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
sudo apt-get update
sudo apt-get install build-essential git imagemagick libx11-dev libxext-dev libfreetype6-dev libpng-dev libjpeg-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
```
### Usbipd installation to connect your calculator
If you want to connect to the calculator, you have to connect to install this [tool](https://github.com/dorssel/usbipd-win/releases/download/v1.3.0/usbipd-win_1.3.0.msi). This will allow you toconnect WSL to the calculator through internet. Follow the on screen information to install.
If you want to connect to the calculator, you have to connect to install this
[tool](https://github.com/dorssel/usbipd-win/releases/download/v5.0.0/usbipd-win_5.0.0_x64.msi).
This will allow you to connect WSL to the calculator through internet. Follow
the on screen information to install.
#### Ubuntu
1. In a WSL Ubuntu command prompt, type:
```bash
sudo apt install linux-tools-5.4.0-77-generic hwdata
sudo apt install linux-tools-generic hwdata
```
2. Edit /etc/sudoers so that root can find the usbip command. On Ubuntu, run this command.
<!-- 2. Edit /etc/sudoers so that root can find the usbip command. On Ubuntu, run this command.
```bash
sudo visudo
```
3. Add `/usr/lib/linux-tools/5.4.0-77-generic` to the beginning of secure_path. After editing, the line should look similar to this.
`Defaults secure_path="/usr/lib/linux-tools/5.4.0-77-generic:/usr/local/sbin:..."`
`Defaults secure_path="/usr/lib/linux-tools/5.4.0-77-generic:/usr/local/sbin:..."` -->
#### Debian
1. If you use debian for your WSL distro, use this command instead:
1. If you use Debian for your WSL distro, use this command instead:
```bash
sudo apt install usbip hwdata usbutils
@@ -219,20 +231,22 @@ And that's all for installation and set up.
### To connect your calculator
1. Open an Admin powershell and type:
1. Open an admin PowerShell and type:
```powershell
usbipd wsl list
usbipd list
```
This will list your usb devices connected. Look at the BUSID column and remember the one for your calculator (it should be called "Numworks Calculator").
2. Now run this command replacing `<BUSID>` by your calculator's usb port id:
This will list your USB devices connected. Look at the BUSID column and remember the one for your calculator (it should be called "Numworks Calculator").
2. Now run this command replacing `<BUSID>` by your calculator's USB port id:
```powershell
usbipd wsl attach --busid <BUSID>
usbipd bind --busid <BUSID>
usbipd attach --wsl --busid <BUSID>
```
It will ask you to type your wsl's password and will connect your calculator to WSL.
It will ask you to type your WSL's password and will connect your calculator to WSL.
You can now go to step 2!
@@ -264,7 +278,7 @@ git checkout upsilon-dev
```bash
make MODEL=n0100 clean
make MODEL=n0100 EPSILON_I18N=en OMEGA_USERNAME="{Your name, max 15 characters}" -j(nproc)
make MODEL=n0100 EPSILON_I18N=en OMEGA_USERNAME="{Your name, max 15 characters}" -j$(nproc)
```
Now, run either:
@@ -280,10 +294,10 @@ to directly flash the calculator after pressing simultaneously `reset` and `6` b
or:
```bash
make MODEL=n0100 OMEGA_USERNAME="" binpack -j(nproc)
make MODEL=n0100 OMEGA_USERNAME="" binpack -j$(nproc)
```
to make binpack which you can flash to the calculator from [Ti-planet's webDFU](https://ti-planet.github.io/webdfu_numworks/n0100/). Binpacks are a great way to share a custom build of Upsilonto friends.
to make binpack which you can flash to the calculator from [TI-Planet's WebDFU](https://ti-planet.github.io/webdfu_numworks/n0100/). Binpacks are a great way to share a custom build of Upsilon to friends.
</details>
@@ -291,7 +305,7 @@ to make binpack which you can flash to the calculator from [Ti-planet's webDFU](
<summary><b>Model n0110</b></summary>
The bootloader allows you to install 2 firmware in separated "slots". If so, external apps won't have all the space but half. Bootloader will allow use of all of the memory if only one slot is flashed. In legacy mode, external apps use all the space available.
The bootloader allows you to install 2 firmwares in separated "slots". If so, external apps won't have all the space but half. Bootloader will allow use of all of the memory if only one slot is flashed. In legacy mode, external apps use all the space available.
<details>
<summary>Bootloader</summary>
@@ -301,7 +315,7 @@ Then, build with:
```bash
make clean
make OMEGA_USERNAME="{Your name, max 15 characters}" -j(nproc)
make OMEGA_USERNAME="{Your name, max 15 characters}" -j$(nproc)
```
Now, run either:
@@ -317,10 +331,10 @@ to directly flash the calculator into the current slot, or thought bootloader's
or:
```bash
make OMEGA_USERNAME="" binpack -j(nproc)
make OMEGA_USERNAME="" binpack -j$(nproc)
```
to make binpack which you can flash to the calculator from [Ti-planet's webDFU](https://ti-planet.github.io/webdfu_numworks/n0110/). You'll find them at `output/release/device/bootloader/`. Binpacks are a great way to share a custom build of Upsilon to friends.
to make binpack which you can flash to the calculator from [TI-Planet's webDFU](https://ti-planet.github.io/webdfu_numworks/n0110/). You'll find them at `output/release/device/bootloader/`. Binpacks are a great way to share a custom build of Upsilon to friends.
</details>
@@ -330,7 +344,7 @@ to make binpack which you can flash to the calculator from [Ti-planet's webDFU](
```bash
make MODEL=n0110 clean
make MODEL=n0110 OMEGA_USERNAME="{Your name, max 15 characters}" -j(nproc)
make MODEL=n0110 OMEGA_USERNAME="{Your name, max 15 characters}" -j$(nproc)
```
Now, run either:
@@ -346,10 +360,10 @@ to directly flash the calculator after pressing simultaneously `reset` and `6` b
or:
```bash
make MODEL=n0110 OMEGA_USERNAME="" binpack -j(nproc)
make MODEL=n0110 OMEGA_USERNAME="" binpack -j$(nproc)
```
to make binpack which you can flash to the calculator from [Ti-planet's webDFU](https://ti-planet.github.io/webdfu_numworks/n0110/). You'll find them at `output/release/device/bootloader/`. Binpacks are a great way to share a custom build of Upsilon to friends.
to make binpack which you can flash to the calculator from [Ti-Planet's WebDFU](https://ti-planet.github.io/webdfu_numworks/n0110/). You'll find them at `output/release/device/bootloader/`. Binpacks are a great way to share a custom build of Upsilon to friends.
</details>
</details>
@@ -417,7 +431,7 @@ You need devkitPro and devkitARM installed and in your path (instructions [here]
git clone --recursive https://github.com/UpsilonNumworks/Upsilon.git
cd Upsilon
git checkout upsilon-dev
make PLATFORM=simulator TARGET=3ds -j(nproc)
make PLATFORM=simulator TARGET=3ds -j$(nproc)
```
You can then put epsilon.3dsx on a SD card to run it from the HBC or use 3dslink to launch it over the network:
@@ -432,7 +446,7 @@ You can then put epsilon.3dsx on a SD card to run it from the HBC or use 3dslink
<details>
<summary><b>Casio fx-CG-series Port</b></summary>
First, install gint and fxsdk along with a cross compiler for the calculator. There are instructions for this (in French, but Google Translate works well enough) [here](https://www.planet-casio.com/Fr/forums/topic16614-last-giteapc-installer-et-mettre-a-jour-automatiquement-des-projets-gitea.html).
Next:

View File

@@ -262,3 +262,4 @@ PythonFileReadable = "Kann Datei gelesen werden?"
PythonFileWritable = "Kann Datei geschrieben werden?"
PythonImportUtils = "Importieren von ulab.utils"
PythonUtilsFunction = "Funktionspräfix des utils-Moduls"
PythonTurtleBgcolor = "Ändern Sie die Hintergrundfarbe"

View File

@@ -262,3 +262,4 @@ PythonFileReadable = "Tells if read can be used on a file"
PythonFileWritable = "Tells if write can be used on a file"
PythonImportUtils = "Importing ulab.utils"
PythonUtilsFunction = "utils module function prefix"
PythonTurtleBgcolor = "Change the background color"

View File

@@ -262,3 +262,4 @@ PythonFileReadable = "Tells if read can be used on a file"
PythonFileWritable = "Tells if write can be used on a file"
PythonImportUtils = "Importando ulab.utils"
PythonUtilsFunction = "prefijo de función del módulo utils"
PythonTurtleBgcolor = "Cambiar el color de fondo"

View File

@@ -212,6 +212,7 @@ PythonTurtleBackward = "Recule de x pixels"
PythonTurtleCircle = "Cercle de rayon r pixels"
PythonTurtleColor = "Modifie la couleur du tracé"
PythonTurtleColorMode = "Met le mode de couleur à 1.0 ou 255"
PythonTurtleBgcolor = "Modifie la couleur du fond"
PythonTurtleForward = "Avance de x pixels"
PythonTurtleFunction = "Préfixe fonction du module turtle"
PythonTurtleGoto = "Va au point de coordonnées (x,y)"

View File

@@ -262,3 +262,4 @@ PythonKeyAns = "ANS kulcs"
PythonKeyExe = "EXE kulcs"
PythonImportUtils = "Az ulab.utils importálása"
PythonUtilsFunction = "utils modul függvény előtagja"
PythonTurtleBgcolor = "Módosítsa a háttérszínt"

View File

@@ -262,3 +262,4 @@ PythonFileReadable = "Dice se si può leggere sul file"
PythonFileWritable = "Dice se si può scrivere sul file"
PythonImportUtils = "Importazione di ulab.utils"
PythonUtilsFunction = "Prefisso funzione del modulo utils"
PythonTurtleBgcolor = "Cambia il colore dello sfondo"

View File

@@ -263,3 +263,4 @@ PythonFileReadable = "Tells if read can be used on a file"
PythonFileWritable = "Tells if write can be used on a file"
PythonImportUtils = "Ulab.utils importeren"
PythonUtilsFunction = "utils module functie prefix"
PythonTurtleBgcolor = "Verander de achtergrondkleur"

View File

@@ -262,3 +262,4 @@ PythonFileReadable = "Tells if read can be used on a file"
PythonFileWritable = "Tells if write can be used on a file"
PythonImportUtils = "Importando ulab.utils"
PythonUtilsFunction = "prefixo de função do módulo utils"
PythonTurtleBgcolor = "Alterar a cor de fundo"

View File

@@ -404,6 +404,7 @@ PythonTurtleCommandBackward = "backward(x)"
PythonTurtleCommandCircle = "circle(r)"
PythonTurtleCommandColor = "color('c')"
PythonTurtleCommandColorMode = "colormode(x)"
PythonTurtleCommandBgcolor = "bgcolor('c')"
PythonTurtleCommandForward = "forward(x)"
PythonTurtleCommandGoto = "goto(x,y)"
PythonTurtleCommandHeading = "heading()"

View File

@@ -19,7 +19,7 @@ void ConsoleLineCell::ScrollableConsoleLineView::ConsoleLineView::setLine(Consol
void ConsoleLineCell::ScrollableConsoleLineView::ConsoleLineView::drawRect(KDContext * ctx, KDRect rect) const {
ctx->fillRect(bounds(), Palette::CodeBackground);
ctx->drawString(m_line->text(), KDPointZero, GlobalPreferences::sharedGlobalPreferences()->font(), textColor(m_line), isHighlighted()? Palette::Select : Palette::BackgroundApps);
ctx->drawString(m_line->text(), KDPointZero, GlobalPreferences::sharedGlobalPreferences()->font(), textColor(m_line), isHighlighted()? Palette::Select : Palette::CodeBackground);
}
KDSize ConsoleLineCell::ScrollableConsoleLineView::ConsoleLineView::minimalSizeForOptimalDisplay() const {

View File

@@ -338,6 +338,7 @@ const ToolboxMessageTree TurtleModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandHideturtle, I18n::Message::PythonTurtleHideturtle, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandColor, I18n::Message::PythonTurtleColor),
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandColorMode, I18n::Message::PythonTurtleColorMode),
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandBgcolor, I18n::Message::PythonTurtleBgcolor),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColorBlue, I18n::Message::PythonColorBlue, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColorRed, I18n::Message::PythonColorRed, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColorGreen, I18n::Message::PythonColorGreen, false),
@@ -542,6 +543,7 @@ const ToolboxMessageTree catalogChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCmathFunction, I18n::Message::PythonCmathFunction, false, I18n::Message::PythonCommandCmathFunctionWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColor, I18n::Message::PythonColor),
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandColorMode, I18n::Message::PythonTurtleColorMode),
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandBgcolor, I18n::Message::PythonTurtleBgcolor),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandComplex, I18n::Message::PythonComplex),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCopySign, I18n::Message::PythonCopySign),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCos, I18n::Message::PythonCos),

View File

@@ -27,7 +27,7 @@
#define SCANCODE_OK ((uint64_t)1 << 4)
#define SCANCODE_Back ((uint64_t)1 << 5)
#define SCANCODE_Home ((uint64_t)1 << 6)
#define SCANCODE_OnOff (((uint64_t)1 << 7) || ((uint64_t)1 << 8))
#define SCANCODE_OnOff (((uint64_t)1 << 7) | ((uint64_t)1 << 8))
#define SCANCODE_Shift ((uint64_t)1 << 12)
#define SCANCODE_Alpha ((uint64_t)1 << 13)
#define SCANCODE_XNT ((uint64_t)1 << 14)

View File

@@ -36,6 +36,8 @@ public:
void setAutocomplete(bool autocomple) { m_autoComplete = autocomple; }
bool syntaxhighlighting() const { return m_syntaxhighlighting; }
void setSyntaxhighlighting(bool syntaxhighlight) { m_syntaxhighlighting = syntaxhighlight; }
bool clearShift() const { return m_clearshift; }
void setClearShift(bool clearalphashift) { m_clearshift = clearalphashift; }
int brightnessLevel() const { return m_brightnessLevel; }
void setBrightnessLevel(int brightnessLevel);
const KDFont * font() const { return m_font; }
@@ -63,6 +65,7 @@ private:
m_dfuUnlocked(false),
m_autoComplete(true),
m_syntaxhighlighting(true),
m_clearshift(true),
m_brightnessLevel(Ion::Backlight::MaxBrightness),
m_idleBeforeSuspendSeconds(55),
m_idleBeforeDimmingSeconds(45),
@@ -80,6 +83,7 @@ private:
bool m_dfuUnlocked;
bool m_autoComplete;
bool m_syntaxhighlighting;
bool m_clearshift;
int m_brightnessLevel;
int m_idleBeforeSuspendSeconds;
int m_idleBeforeDimmingSeconds;

View File

@@ -117,6 +117,7 @@ constexpr ToolboxMessageTree unitDistanceMeterPico = ToolboxMessageTree::Leaf(I1
constexpr ToolboxMessageTree unitDistanceMeterNano = ToolboxMessageTree::Leaf(I18n::Message::UnitDistanceMeterNanoSymbol, I18n::Message::UnitDistanceMeterNano);
constexpr ToolboxMessageTree unitDistanceMeterMicro = ToolboxMessageTree::Leaf(I18n::Message::UnitDistanceMeterMicroSymbol, I18n::Message::UnitDistanceMeterMicro);
constexpr ToolboxMessageTree unitDistanceMeterMilli = ToolboxMessageTree::Leaf(I18n::Message::UnitDistanceMeterMilliSymbol, I18n::Message::UnitDistanceMeterMilli);
constexpr ToolboxMessageTree unitDistanceMeterCenti = ToolboxMessageTree::Leaf(I18n::Message::UnitDistanceMeterCentiSymbol, I18n::Message::UnitDistanceMeterCenti);
constexpr ToolboxMessageTree unitDistanceMeter = ToolboxMessageTree::Leaf(I18n::Message::UnitDistanceMeterSymbol, I18n::Message::UnitDistanceMeter);
constexpr ToolboxMessageTree unitDistanceMeterKilo = ToolboxMessageTree::Leaf(I18n::Message::UnitDistanceMeterKiloSymbol, I18n::Message::UnitDistanceMeterKilo);
constexpr ToolboxMessageTree unitDistanceAstronomicalUnit = ToolboxMessageTree::Leaf(I18n::Message::UnitDistanceAstronomicalUnitSymbol, I18n::Message::UnitDistanceAstronomicalUnit);
@@ -127,7 +128,7 @@ constexpr ToolboxMessageTree unitDistanceFoot = ToolboxMessageTree::Leaf(I18n::M
constexpr ToolboxMessageTree unitDistanceYard = ToolboxMessageTree::Leaf(I18n::Message::UnitDistanceYardSymbol, I18n::Message::UnitDistanceYard);
constexpr ToolboxMessageTree unitDistanceMile = ToolboxMessageTree::Leaf(I18n::Message::UnitDistanceMileSymbol, I18n::Message::UnitDistanceMile);
const ToolboxMessageTree * unitDistanceMeterChildren[] = {&unitDistanceMeterPico, &unitDistanceMeterNano, &unitDistanceMeterMicro, &unitDistanceMeterMilli, &unitDistanceMeter, &unitDistanceMeterKilo};
const ToolboxMessageTree * unitDistanceMeterChildren[] = {&unitDistanceMeterPico, &unitDistanceMeterNano, &unitDistanceMeterMicro, &unitDistanceMeterMilli, &unitDistanceMeterCenti, &unitDistanceMeter, &unitDistanceMeterKilo};
const ToolboxMessageTree unitDistanceMeterNode = ToolboxMessageTree::Node(I18n::Message::UnitMetricMenu, unitDistanceMeterChildren);
const ToolboxMessageTree * unitDistanceChildrenForImperialToolbox[] = {
&unitDistanceInch,
@@ -305,11 +306,13 @@ const ToolboxMessageTree unitInductanceChildren[] = {
const ToolboxMessageTree unitSurfaceChildrenForMetricToolbox[] = {
ToolboxMessageTree::Leaf(I18n::Message::UnitSurfaceHectarSymbol, I18n::Message::UnitSurfaceHectar),
ToolboxMessageTree::Leaf(I18n::Message::UnitSurfaceMeterSquareSymbol, I18n::Message::UnitSurfaceMeterSquare),
ToolboxMessageTree::Leaf(I18n::Message::UnitSurfaceAcreSymbol, I18n::Message::UnitSurfaceAcre)
};
const ToolboxMessageTree unitSurfaceChildrenForImperialToolbox[] = {
ToolboxMessageTree::Leaf(I18n::Message::UnitSurfaceAcreSymbol, I18n::Message::UnitSurfaceAcre),
ToolboxMessageTree::Leaf(I18n::Message::UnitSurfaceHectarSymbol, I18n::Message::UnitSurfaceHectar)
ToolboxMessageTree::Leaf(I18n::Message::UnitSurfaceHectarSymbol, I18n::Message::UnitSurfaceHectar),
ToolboxMessageTree::Leaf(I18n::Message::UnitSurfaceMeterSquareSymbol, I18n::Message::UnitSurfaceMeterSquare),
};
const ToolboxMessageTree unitSurfaceFork[] = {
ToolboxMessageTree::Node(I18n::Message::UnitSurfaceMenu, unitSurfaceChildrenForMetricToolbox),

View File

@@ -81,3 +81,4 @@ ExtAppWriteExplanation1 = "Standardmäßig externe Anwendungen"
ExtAppWriteExplanation2 = "kann nicht in den Speicher schreiben"
ExtAppWriteExplanation3 = "Flash (dauerhaft) Ihres Rechners."
ExtAppEnabled = "Aufstecken"
ClearShift = "Tastenkombination shift + clear"

View File

@@ -81,3 +81,4 @@ ExtAppWriteExplanation1 = "By default, external applications"
ExtAppWriteExplanation2 = "cannot write to memory"
ExtAppWriteExplanation3 = "flash (persistent) of your calculator."
ExtAppEnabled = "Pin up"
ClearShift = "Shift + clear shortcut"

View File

@@ -81,3 +81,4 @@ ExtAppWriteExplanation1 = "Por defecto, las aplicaciones externas"
ExtAppWriteExplanation2 = "no se puede escribir en la memoria"
ExtAppWriteExplanation3 = "flash (persistente) de su calculadora."
ExtAppEnabled = "Fijar"
ClearShift = "Atajo de shift + clear"

View File

@@ -72,6 +72,7 @@ Time = "Heure"
RTCWarning1 = "Activer l'horloge décharge la batterie plus"
RTCWarning2 = "vite quand la calculatrice est éteinte."
SyntaxHighlighting = "Coloration syntaxique"
ClearShift = "Raccourci shift + clear"
Normal = "Normale"
IdleTimeBeforeDimming = "Assombrir après (s)"
IdleTimeBeforeSuspend = "Éteindre après (s)"

View File

@@ -81,3 +81,4 @@ ExtAppWriteExplanation1 = "Alapértelmezés szerint külső alkalmazások"
ExtAppWriteExplanation2 = "nem tud a memóriába írni"
ExtAppWriteExplanation3 = "villog (tartósan) a számológép."
ExtAppEnabled = "Feltűz"
ClearShift = "Gyorsbillentyű shift + clear"

View File

@@ -81,3 +81,4 @@ ExtAppWriteExplanation1 = "Per impostazione predefinita, le app esterne"
ExtAppWriteExplanation2 = "non possono scrivere in memoria flash"
ExtAppWriteExplanation3 = "(persistente) della calcolatrice."
ExtAppEnabled = "Affiggere"
ClearShift = "Scorciatoia shift + clear"

View File

@@ -81,3 +81,4 @@ ExtAppWriteExplanation1 = "Standaard zijn externe toepassingen"
ExtAppWriteExplanation2 = "kan niet naar het geheugen schrijven"
ExtAppWriteExplanation3 = "flash (aanhoudend) van uw rekenmachine."
ExtAppEnabled = "Vastpinnen"
ClearShift = "Sneltoets shift + clear"

View File

@@ -81,3 +81,4 @@ ExtAppWriteExplanation1 = "Por padrão, aplicativos externos"
ExtAppWriteExplanation2 = "não pode gravar na memória"
ExtAppWriteExplanation3 = "flash (persistente) de sua calculadora."
ExtAppEnabled = "Pôster"
ClearShift = "Shift de shift + clear"

View File

@@ -24,7 +24,7 @@ constexpr SettingsMessageTree s_contributorsChildren[18] = {SettingsMessageTree(
// Code Settings
#ifdef HAS_CODE
constexpr SettingsMessageTree s_codeChildren[3] = {SettingsMessageTree(I18n::Message::FontSizes, s_modelFontChildren), SettingsMessageTree(I18n::Message::Autocomplete), SettingsMessageTree(I18n::Message::SyntaxHighlighting)};
constexpr SettingsMessageTree s_codeChildren[4] = {SettingsMessageTree(I18n::Message::FontSizes, s_modelFontChildren), SettingsMessageTree(I18n::Message::Autocomplete), SettingsMessageTree(I18n::Message::SyntaxHighlighting), SettingsMessageTree(I18n::Message::ClearShift)};
#endif
constexpr SettingsMessageTree s_modelFontChildren[2] = {SettingsMessageTree(I18n::Message::LargeFont), SettingsMessageTree(I18n::Message::SmallFont)};

View File

@@ -25,7 +25,7 @@ extern const Shared::SettingsMessageTree s_symbolChildren[4];
extern const Shared::SettingsMessageTree s_symbolFunctionChildren[3];
extern const Shared::SettingsMessageTree s_modelMathOptionsChildren[6];
extern const Shared::SettingsMessageTree s_modelFontChildren[2];
extern const Shared::SettingsMessageTree s_codeChildren[3];
extern const Shared::SettingsMessageTree s_codeChildren[4];
extern const Shared::SettingsMessageTree s_modelDateTimeChildren[3];
extern const Shared::SettingsMessageTree s_accessibilityChildren[6];
extern const Shared::SettingsMessageTree s_contributorsChildren[18];

View File

@@ -1,7 +1,8 @@
#include "main_controller.h"
#include "../exam_mode_configuration.h"
#include <apps/i18n.h>
#include "../exam_mode_configuration.h"
#include "main_controller.h"
using namespace Shared;
namespace Settings {

View File

@@ -17,7 +17,6 @@ constexpr SettingsMessageTree s_modelMenu[] =
#ifdef HAS_CODE
SettingsMessageTree(I18n::Message::CodeApp, s_codeChildren),
#endif
//SettingsMessageTree(I18n::Message::UsbSetting, s_usbProtectionChildren),
SettingsMessageTree(I18n::Message::ExternalApps, s_externalChildren),
SettingsMessageTree(I18n::Message::Accessibility, s_accessibilityChildren),
SettingsMessageTree(I18n::Message::About, s_modelAboutChildren)};

View File

@@ -1,11 +1,12 @@
#include "main_controller.h"
#include "../exam_mode_configuration.h"
#include <apps/i18n.h>
namespace Settings {
#include "../exam_mode_configuration.h"
#include "main_controller.h"
using namespace Shared;
namespace Settings {
constexpr SettingsMessageTree s_modelMenu[] =
{SettingsMessageTree(I18n::Message::MathOptions, s_modelMathOptionsChildren),
SettingsMessageTree(I18n::Message::BrightnessSettings, s_brightnessChildren),
@@ -17,8 +18,8 @@ constexpr SettingsMessageTree s_modelMenu[] =
SettingsMessageTree(I18n::Message::CodeApp, s_codeChildren),
#endif
SettingsMessageTree(I18n::Message::UpdatePopUp),
SettingsMessageTree(I18n::Message::Accessibility, s_accessibilityChildren),
SettingsMessageTree(I18n::Message::ExternalApps, s_externalChildren),
SettingsMessageTree(I18n::Message::Accessibility, s_accessibilityChildren),
SettingsMessageTree(I18n::Message::About, s_modelAboutChildren)};
constexpr SettingsMessageTree s_model = SettingsMessageTree(I18n::Message::SettingsApp, s_modelMenu);

View File

@@ -13,6 +13,7 @@ CodeOptionsController::CodeOptionsController(Responder * parentResponder) :
m_chevronCellFontSize.setMessageFont(KDFont::LargeFont);
m_switchCellAutoCompletion.setMessageFont(KDFont::LargeFont);
m_switchCellSyntaxHighlighting.setMessageFont(KDFont::LargeFont);
m_switchCellClearShift.setMessageFont(KDFont::LargeFont);
}
bool CodeOptionsController::handleEvent(Ion::Events::Event event) {
@@ -26,6 +27,10 @@ bool CodeOptionsController::handleEvent(Ion::Events::Event event) {
GlobalPreferences::sharedGlobalPreferences()->setSyntaxhighlighting(!GlobalPreferences::sharedGlobalPreferences()->syntaxhighlighting());
m_selectableTableView.reloadCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow());
break;
case 3:
GlobalPreferences::sharedGlobalPreferences()->setClearShift(!GlobalPreferences::sharedGlobalPreferences()->clearShift());
m_selectableTableView.reloadCellAtLocation(m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow());
break;
default:
GenericSubController * subController = nullptr;
subController = &m_preferencesController;
@@ -48,8 +53,10 @@ HighlightCell * CodeOptionsController::reusableCell(int index, int type) {
}
else if (index == 1) {
return &m_switchCellAutoCompletion;
} else if (index == 2) {
return &m_switchCellSyntaxHighlighting;
}
return &m_switchCellSyntaxHighlighting;
return &m_switchCellClearShift;
}
int CodeOptionsController::reusableCellCount(int type) {
@@ -79,6 +86,11 @@ void CodeOptionsController::willDisplayCellForIndex(HighlightCell * cell, int in
SwitchView * mySwitch = (SwitchView *)mySwitchCell->accessoryView();
mySwitch->setState(GlobalPreferences::sharedGlobalPreferences()->syntaxhighlighting());
}
else if (thisLabel == I18n::Message::ClearShift) {
MessageTableCellWithSwitch * mySwitchCell = (MessageTableCellWithSwitch *)cell;
SwitchView * mySwitch = (SwitchView *)mySwitchCell->accessoryView();
mySwitch->setState(GlobalPreferences::sharedGlobalPreferences()->clearShift());
}
#endif
}

View File

@@ -14,11 +14,12 @@ public:
int reusableCellCount(int type) override;
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
private:
constexpr static int k_totalNumberOfCell = 4;
constexpr static int k_totalNumberOfCell = 5;
PreferencesController m_preferencesController;
MessageTableCellWithChevronAndMessage m_chevronCellFontSize;
MessageTableCellWithSwitch m_switchCellAutoCompletion;
MessageTableCellWithSwitch m_switchCellSyntaxHighlighting;
MessageTableCellWithSwitch m_switchCellClearShift;
};
}

View File

@@ -10,6 +10,7 @@ UnitTimeMonthSymbol = "_month"
UnitTimeYearSymbol = "_year"
UnitDistanceMeterKiloSymbol = "_km"
UnitDistanceMeterSymbol = "_m"
UnitDistanceMeterCentiSymbol = "_cm"
UnitDistanceMeterMilliSymbol = "_mm"
UnitDistanceMeterMicroSymbol = "_μm"
UnitDistanceMeterNanoSymbol = "_nm"
@@ -82,6 +83,7 @@ UnitConductanceSiemensMilliSymbol = "_mS"
UnitMagneticFieldTeslaSymbol = "_T"
UnitInductanceHenrySymbol = "_H"
UnitSurfaceAcreSymbol = "_acre"
UnitSurfaceMeterSquareSymbol = "_m^2"
UnitSurfaceHectarSymbol = "_ha"
UnitVolumeLiterSymbol = "_L"
UnitVolumeLiterDeciSymbol = "_dL"

View File

@@ -13,17 +13,18 @@ UnitTimeYear = "Jahr"
UnitDistanceMenu = "Entfernung"
UnitDistanceMeterKilo = "Kilometer"
UnitDistanceMeter = "Meter"
UnitDistanceMeterCenti = "Zentimeter"
UnitDistanceMeterMilli = "Millimeter"
UnitDistanceMeterMicro = "Micrometer"
UnitDistanceMeterNano = "Nanometer"
UnitDistanceMeterPico = "Pikometer"
UnitDistanceInch = "Zoll"
UnitDistanceFoot = "Fuß"
UnitDistanceYard = "Yard"
UnitDistanceMile = "Meile"
UnitDistanceAstronomicalUnit = "Astronomische Einheit"
UnitDistanceLightYear = "Lichtjahr"
UnitDistanceParsec = "Parsec"
UnitDistanceMile = "Meile"
UnitDistanceYard = "Yard"
UnitDistanceFoot = "Fuß"
UnitDistanceInch = "Zoll"
UnitMassMenu = "Masse"
UnitMassGramKilo = "Kilogramm"
UnitMassGram = "Gramm"
@@ -77,13 +78,14 @@ InductanceMenu = "Elektrische Induktivität"
UnitSurfaceMenu = "Fläche"
UnitSurfaceAcre = "Morgen"
UnitSurfaceHectar = "Hektar"
UnitSurfaceMeterSquare = "Quadratmeter"
UnitVolumeMenu = "Volumen"
UnitVolumeLiter = "Liter"
UnitVolumeLiterDeci = "Deziliter"
UnitVolumeLiterCenti = "Centiliter"
UnitVolumeLiterMilli = "Milliliter"
UnitVolumeTeaspoon = "Teelöffel"
UnitVolumeTablespoon= "Esslöffel"
UnitVolumeTablespoon = "Esslöffel"
UnitVolumeFluidOunce = "Flüssigunze"
UnitVolumeCup = "Tasse"
UnitVolumePint = "Pint"
@@ -409,21 +411,16 @@ NumberElementUbn = "120 - Unbinilium (Ubn)"
AlphaElementUbn = "Ubn - Unbinilium (120)"
Speed = "Geschwindigkeit"
SpeedOfSound = "Schallgeschwindigkeit"
SpeedOfLightTag = "Lichtgeschwindigkeit"
SpeedOfSound0Tag = "Meeresspiegel, 20 ° C"
SpeedOfSoundWaterTag = "In Wasser"
SpeedOfSoundSteelTag = "In Stahl"
SpeedOfSoundGlassTag = "In Glas"
EscapeVelocity = "Fluchtgeschwindigkeit"
EscapeVelocityFromEarth = "Von der Erde"
EscapeVelocityFromMoon = "Vom Mond"
EscapeVelocityFromSun = "Von der Sonne"
SpeedOfLightTag = "Lichtgeschwindigkeit"
Thermodynamics = "Thermodynamik"
BoltzmannTag = "Boltzmann Konstante"
AvogadroTag = "Avogadro-Konstante"
GasTag = "Gaskonstante"
Electromagnetism = "Elektromagnetismus"
CoulombTag = "Coulomb-Konstante"
ConductivityConstants = "Leitfähigkeitskonstanten"
Electricity = "Elektrizität"
ResistivityConstants = "Konstanten der Widerstandsfähigkeit"
@@ -445,6 +442,11 @@ Water = "Wasser"
Air = "Luft"
Glass = "Glas"
Wood = "Holz"
CoulombTag = "Coulomb-Konstante"
EscapeVelocity = "Fluchtgeschwindigkeit"
EscapeVelocityFromEarth = "Von der Erde"
EscapeVelocityFromMoon = "Vom Mond"
EscapeVelocityFromSun = "Von der Sonne"
Vacuum_permittivityTag = "Vakuum-Durchlässigkeit"
Vacuum_permeabilityTag = "Vakuumdurchlässigkeit"
PlanckTag = "Planck - Konstante"

View File

@@ -13,6 +13,7 @@ UnitTimeYear = "Year"
UnitDistanceMenu = "Distance"
UnitDistanceMeterKilo = "Kilometer"
UnitDistanceMeter = "Meter"
UnitDistanceMeterCenti = "Centimeter"
UnitDistanceMeterMilli = "Millimeter"
UnitDistanceMeterMicro = "Micrometer"
UnitDistanceMeterNano = "Nanometer"
@@ -77,13 +78,14 @@ InductanceMenu = "Electrical inductance"
UnitSurfaceMenu = "Area"
UnitSurfaceAcre = "Acre"
UnitSurfaceHectar = "Hectare"
UnitSurfaceMeterSquare = "Square meter"
UnitVolumeMenu = "Volume"
UnitVolumeLiter = "Liter"
UnitVolumeLiterDeci = "Deciliter"
UnitVolumeLiterCenti = "Centiliter"
UnitVolumeLiterMilli = "Milliliter"
UnitVolumeTeaspoon = "Teaspoon"
UnitVolumeTablespoon= "Tablespoon"
UnitVolumeTablespoon = "Tablespoon"
UnitVolumeFluidOunce = "Fluid Ounce"
UnitVolumeCup = "Cup"
UnitVolumePint = "Pint"
@@ -99,7 +101,6 @@ Calculation = "Calculation"
ComplexNumber = "Complex numbers"
Combinatorics = "Combinatorics"
Arithmetic = "Arithmetic"
MatricesAndVectors = "Matrices and vectors"
Matrices = "Matrix"
NewMatrix = "New matrix"
Identity = "Identity matrix of size n"
@@ -414,17 +415,12 @@ SpeedOfSound0Tag = "Sea level, 20°C"
SpeedOfSoundWaterTag = "In water"
SpeedOfSoundSteelTag = "In steel"
SpeedOfSoundGlassTag = "In glass"
EscapeVelocity = "Escape Velocity"
EscapeVelocityFromEarth = "Of Earth"
EscapeVelocityFromMoon = "Of Moon"
EscapeVelocityFromSun = "Of Sun"
SpeedOfLightTag = "Speed of light"
Thermodynamics = "Thermodynamics"
BoltzmannTag = "Boltzmann Constant"
AvogadroTag = "Avogadro Constant"
GasTag = "Gas Constant"
Electromagnetism = "Electromagnetism"
CoulombTag = "Coulomb Constant"
ConductivityConstants = "Conductivity constants"
Electricity = "Electricity"
ResistivityConstants = "Resistivity Constants"
@@ -446,6 +442,11 @@ Water = "Water"
Air = "Air"
Glass = "Glass"
Wood = "Wood"
CoulombTag = "Coulomb Constant"
EscapeVelocity = "Escape Velocity"
EscapeVelocityFromEarth = "Of Earth"
EscapeVelocityFromMoon = "Of Moon"
EscapeVelocityFromSun = "Of Sun"
Vacuum_permittivityTag = "Vacuum permittivity"
Vacuum_permeabilityTag = "Vacuum permeability"
PlanckTag = "Planck Constant"
@@ -511,4 +512,5 @@ HartreeConstantTag = "Hartree Constant"
MagneticFluxQuantumTag = "Magnetic Flux Quantum"
ConductanceQuantumTag = "Conductance Quantum"
CirculationQuantumTag = "Circulation Quantum"
Factorial = "Factorial"
MatricesAndVectors = "Matrices and vectors"
Factorial = "Factorial"

View File

@@ -13,17 +13,18 @@ UnitTimeYear = "Year"
UnitDistanceMenu = "Distance"
UnitDistanceMeterKilo = "Kilometer"
UnitDistanceMeter = "Meter"
UnitDistanceMeterCenti = "Centímetro"
UnitDistanceMeterMilli = "Millimeter"
UnitDistanceMeterMicro = "Micrometer"
UnitDistanceMeterNano = "Nanometer"
UnitDistanceMeterPico = "Picometer"
UnitDistanceInch = "Pulgada"
UnitDistanceFoot = "Pie"
UnitDistanceYard = "Yardas"
UnitDistanceMile = "Milla"
UnitDistanceAstronomicalUnit = "Astronomical unit"
UnitDistanceLightYear = "Light year"
UnitDistanceParsec = "Parsec"
UnitDistanceMile = "Milla"
UnitDistanceYard = "Yardas"
UnitDistanceFoot = "Pie"
UnitDistanceInch = "Pulgada"
UnitMassMenu = "Mass"
UnitMassGramKilo = "Kilogram"
UnitMassGram = "Gram"
@@ -77,13 +78,14 @@ InductanceMenu = "Electrical inductance"
UnitSurfaceMenu = "Area"
UnitSurfaceAcre = "Acre"
UnitSurfaceHectar = "Hectare"
UnitSurfaceMeterSquare = "Metro cuadrado"
UnitVolumeMenu = "Volume"
UnitVolumeLiter = "Liter"
UnitVolumeLiterDeci = "Deciliter"
UnitVolumeLiterCenti = "Centiliter"
UnitVolumeLiterMilli = "Milliliter"
UnitVolumeTeaspoon = "Cucharadita"
UnitVolumeTablespoon= "Cucharada"
UnitVolumeTablespoon = "Cucharada"
UnitVolumeFluidOunce = "Onza líquida"
UnitVolumeCup = "Taza"
UnitVolumePint = "Pinta"
@@ -408,22 +410,17 @@ AlphaElementUue = "Uue - Ununennio (119)"
NumberElementUbn = "120 - Unbinilio (Ubn)"
AlphaElementUbn = "Ubn - Unbinilio (120)"
Speed = "Velocidad"
SpeedOfLightTag = "Velocidad de la luz"
SpeedOfSound = "La velocidad del sonido"
Thermodynamics = "Termodinámica"
SpeedOfSound0Tag = "Nivel del mar, 20 ° C"
SpeedOfSoundWaterTag = "En el agua"
SpeedOfSoundSteelTag = "En acero"
SpeedOfSoundGlassTag = "En vidrio"
EscapeVelocity = "Velocidad de escape"
EscapeVelocityFromEarth = "De La Tierra"
EscapeVelocityFromMoon = "De la Luna"
EscapeVelocityFromSun = "De el Sol"
SpeedOfLightTag = "Velocidad de la luz"
Thermodynamics = "Termodinámica"
BoltzmannTag = "Constante Boltzmann"
AvogadroTag = "Constante de Avogadro"
GasTag = "Constante de gas"
Electromagnetism = "Electromagnetismo"
CoulombTag = "Constante de Coulomb"
ConductivityConstants = "Constantes de conductividad"
Electricity = "Electricidad"
ResistivityConstants = "Constantes de resistividad"
@@ -445,6 +442,11 @@ Water = "Agua"
Air = "Aire"
Glass = "Vidrio"
Wood = "Madera"
CoulombTag = "Constante de Coulomb"
EscapeVelocity = "Velocidad de escape"
EscapeVelocityFromEarth = "De La Tierra"
EscapeVelocityFromMoon = "De la Luna"
EscapeVelocityFromSun = "De el Sol"
Vacuum_permittivityTag = "Permisividad de vacío"
Vacuum_permeabilityTag = "Permeabilidad al vacío"
PlanckTag = "Constante de Planck"

View File

@@ -13,21 +13,18 @@ UnitTimeYear = "Année"
UnitDistanceMenu = "Distance"
UnitDistanceMeterKilo = "Kilomètre"
UnitDistanceMeter = "Mètre"
UnitDistanceMeterCenti = "Centimètre"
UnitDistanceMeterMilli = "Millimètre"
UnitDistanceMeterMicro = "Micromètre"
UnitDistanceMeterNano = "Nanomètre"
UnitDistanceMeterPico = "Picomètre"
UnitDistanceInch = "Inch"
UnitDistanceFoot = "Foot"
UnitDistanceInch = "Pouce"
UnitDistanceFoot = "Pied"
UnitDistanceYard = "Yard"
UnitDistanceMile = "Mile"
UnitDistanceAstronomicalUnit = "Unité astronomique"
UnitDistanceLightYear = "Année-lumière"
UnitDistanceParsec = "Parsec"
UnitDistanceMile = "Mile"
UnitDistanceYard = "Yard"
UnitDistanceFoot = "Pied"
UnitDistanceInch = "Pouce"
UnitMassMenu = "Masse"
UnitMassGramKilo = "Kilogramme"
UnitMassGram = "Gramme"
@@ -81,13 +78,14 @@ InductanceMenu = "Inductance"
UnitSurfaceMenu = "Superficie"
UnitSurfaceAcre = "Acre"
UnitSurfaceHectar = "Hectare"
UnitSurfaceMeterSquare = "Mètre carré"
UnitVolumeMenu = "Volume"
UnitVolumeLiter = "Litre"
UnitVolumeLiterDeci = "Décilitre"
UnitVolumeLiterCenti = "Centilitre"
UnitVolumeLiterMilli = "Millilitre"
UnitVolumeTeaspoon = "Cuillère à café"
UnitVolumeTablespoon= "Cuillère à soupe"
UnitVolumeTablespoon = "Cuillère à soupe"
UnitVolumeFluidOunce = "Once fluide"
UnitVolumeCup = "Tasse"
UnitVolumePint = "Pinte"

View File

@@ -13,6 +13,7 @@ UnitTimeYear = "Év"
UnitDistanceMenu = "Távolság"
UnitDistanceMeterKilo = "Kilométer"
UnitDistanceMeter = "Méter"
UnitDistanceMeterCenti = "Centiméter"
UnitDistanceMeterMilli = "Milliméter"
UnitDistanceMeterMicro = "Mikrométer"
UnitDistanceMeterNano = "Nanométer"
@@ -24,16 +25,16 @@ UnitDistanceMile = "Mérföld"
UnitDistanceAstronomicalUnit = "Csillagászati egység"
UnitDistanceLightYear = "Fény év"
UnitDistanceParsec = "Parsec"
UnitMassShortTon = "Rövid tonna"
UnitMassLongTon = "Hosszú tonna"
UnitMassPound = "Font"
UnitMassOunce = "Uncia"
UnitMassMenu = "Tömeg"
UnitMassGramKilo = "Kilogramm"
UnitMassGram = "Gramm"
UnitMassGramMilli = "Milligramm"
UnitMassGramMicro = "Mikrogramm"
UnitMassTonne = "Tonna"
UnitMassOunce = "Uncia"
UnitMassPound = "Font"
UnitMassShortTon = "Rövid tonna"
UnitMassLongTon = "Hosszú tonna"
UnitCurrentMenu = "Áram"
UnitCurrentAmpere = "Amper"
UnitCurrentAmpereMilli = "Milliamper"
@@ -77,6 +78,7 @@ InductanceMenu = "Elektromos induktivitás"
UnitSurfaceMenu = "Terület"
UnitSurfaceAcre = "Acre"
UnitSurfaceHectar = "Hektár"
UnitSurfaceMeterSquare = "Négyzetméter"
UnitVolumeMenu = "Kötet"
UnitVolumeLiter = "Liter"
UnitVolumeLiterDeci = "Deciliter"
@@ -155,11 +157,11 @@ RandomInteger = "Véletlen egész szám [a, b] -ben"
PrimeFactorDecomposition = "Egész szám tényezö"
NormCDF = "P (X <a), ahol X az N-t követi (μ, σ2)"
NormCDF2 = "P (a <X <b) ahol X követi az N (μ, σ2)"
InvNorm = "m, ahol P (X <m) = a, X az N-t követi (μ, σ2)"
InvNorm = "m, ahol P (X <m)=a, X az N-t követi (μ, σ2)"
NormPDF = "N valószínüségi sürüsége (μ, σ2)"
BinomialPDF = "P (X = m), ahol X követi a B (n, p)"
BinomialCDF = "P (X <= m), ahol X követi a B (n, p)"
InvBinomial = "m ahol P (X <= m) = a, X követi a B-t (n, p)"
BinomialPDF = "P (X=m), ahol X követi a B (n, p)"
BinomialCDF = "P (X <=m), ahol X követi a B (n, p)"
InvBinomial = "m ahol P (X <=m)=a, X követi a B-t (n, p)"
Probability = "Valószínüség"
BinomialDistribution = "Binomiális eloszlás"
NormalDistribution = "Normál eloszlás"
@@ -409,21 +411,16 @@ NumberElementUbn = "120 - Unbinilium (Ubn)"
AlphaElementUbn = "Ubn - Unbinilium (120)"
Speed = "Sebesség"
SpeedOfSound = "Hangsebesség"
SpeedOfLightTag = "A fény sebessége"
SpeedOfSound0Tag = "Tengerszint, 20 ° C"
SpeedOfSoundWaterTag = "Vízben"
SpeedOfSoundSteelTag = "Acélban"
SpeedOfSoundGlassTag = "Üvegben"
EscapeVelocity = "Szökési sebesség"
EscapeVelocityFromEarth = "A föld"
EscapeVelocityFromMoon = "A Hold"
EscapeVelocityFromSun = "A nap"
SpeedOfLightTag = "A fény sebessége"
Thermodynamics = "Termodinamika"
BoltzmannTag = "Boltzmann Állandó"
AvogadroTag = "Avogadro Állandó"
GasTag = "Gázállandó"
Electromagnetism = "Elektromágnesesség"
CoulombTag = "Coulomb állandó"
ConductivityConstants = "Vezetőképességi konstansok"
Electricity = "Elektromosság"
ResistivityConstants = "Ellenállósági konstansok"
@@ -445,6 +442,11 @@ Water = "Víz"
Air = "Air"
Glass = "Üveg"
Wood = "Wood"
CoulombTag = "Coulomb állandó"
EscapeVelocity = "Szökési sebesség"
EscapeVelocityFromEarth = "A föld"
EscapeVelocityFromMoon = "A Hold"
EscapeVelocityFromSun = "A nap"
Vacuum_permittivityTag = "Vákuum-engedély"
Vacuum_permeabilityTag = "Vákuumpermeabilitás"
PlanckTag = "Planck Állandó"
@@ -459,6 +461,7 @@ Mass = "Tömeg"
MoonMassTag = "Hold"
EarthMassTag = "Föld"
SunMassTag = "Nap"
ParticleMass = "Részecske Tömege"
Radiuses = "Sugarak"
Length = "Hosszúság"
Distances = "Távolságok"
@@ -487,7 +490,6 @@ PlanckEnergyTag = "Planck Energia"
PlanckPowerTag = "Planck Hatalom"
FundamentalConstants = "Alapvető Állandók"
NuclearConstants = "Nukleáris És Atomi Állandók"
ParticleMass = "Részecske Tömege"
UnitSolidAngleSteradian = "Szteradiánt"
UnitLuminousFluxLumen = "Lumen"
UnitIlluminanceLux = "Lux"

View File

@@ -13,17 +13,18 @@ UnitTimeYear = "Anno"
UnitDistanceMenu = "Distanza"
UnitDistanceMeterKilo = "Chilometro"
UnitDistanceMeter = "Metro"
UnitDistanceMeterCenti = "Centimetro"
UnitDistanceMeterMilli = "Millimetro"
UnitDistanceMeterMicro = "Micrometro"
UnitDistanceMeterNano = "Nanometro"
UnitDistanceMeterPico = "Picometro"
UnitDistanceInch = "Pollice"
UnitDistanceFoot = "Piede"
UnitDistanceYard = "Yard"
UnitDistanceMile = "Miglio"
UnitDistanceAstronomicalUnit = "Unità astronomica"
UnitDistanceLightYear = "Anno luce"
UnitDistanceParsec = "Parsec"
UnitDistanceMile = "Miglio"
UnitDistanceYard = "Yard"
UnitDistanceFoot = "Piede"
UnitDistanceInch = "Pollice"
UnitMassMenu = "Massa"
UnitMassGramKilo = "Kilogrammo"
UnitMassGram = "Grammo"
@@ -77,13 +78,14 @@ InductanceMenu = "Induttanza"
UnitSurfaceMenu = "Superficie"
UnitSurfaceAcre = "Acro"
UnitSurfaceHectar = "Ettaro"
UnitSurfaceMeterSquare = "Metro quadro"
UnitVolumeMenu = "Volume"
UnitVolumeLiter = "Litro"
UnitVolumeLiterDeci = "Decilitro"
UnitVolumeLiterCenti = "Centilitro"
UnitVolumeLiterMilli = "Millilitro"
UnitVolumeTeaspoon = "Cucchiaino"
UnitVolumeTablespoon= "Cucchiaio"
UnitVolumeTablespoon = "Cucchiaio"
UnitVolumeFluidOunce = "Oncia liquida"
UnitVolumeCup = "Tazza"
UnitVolumePint = "Pinta"
@@ -413,17 +415,12 @@ SpeedOfSound0Tag = "Livello del mare, 20°C"
SpeedOfSoundWaterTag = "In acqua"
SpeedOfSoundSteelTag = "In acciaio"
SpeedOfSoundGlassTag = "Nel bicchiere"
EscapeVelocity = "Velocità di fuga"
EscapeVelocityFromEarth = "Della terra"
EscapeVelocityFromMoon = "Di luna"
EscapeVelocityFromSun = "Di sole"
SpeedOfLightTag = "Velocità della luce"
Thermodynamics = "Termodinamica"
BoltzmannTag = "Costante di Boltzmann"
AvogadroTag = "Costanto di Avogadro"
GasTag = "Costante dei gas"
Electromagnetism = "Elettromagnetismo"
CoulombTag = "Costante di coulomb"
ConductivityConstants = "Costanti di conducibilità"
Electricity = "Elettricità"
ResistivityConstants = "Costanti di resistività"
@@ -445,6 +442,11 @@ Water = "Acqua"
Air = "Aria"
Glass = "Vetro"
Wood = "Legno"
CoulombTag = "Costante di coulomb"
EscapeVelocity = "Velocità di fuga"
EscapeVelocityFromEarth = "Della terra"
EscapeVelocityFromMoon = "Di luna"
EscapeVelocityFromSun = "Di sole"
Vacuum_permittivityTag = "Permittività del vuoto"
Vacuum_permeabilityTag = "Permeabilità al vuoto"
PlanckTag = "Costante di Planck"

View File

@@ -13,17 +13,18 @@ UnitTimeYear = "Jaar"
UnitDistanceMenu = "Afstand"
UnitDistanceMeterKilo = "Kilometer"
UnitDistanceMeter = "Meter"
UnitDistanceMeterCenti = "Centimeter"
UnitDistanceMeterMilli = "Millimeter"
UnitDistanceMeterMicro = "Micrometer"
UnitDistanceMeterNano = "Nanometer"
UnitDistanceMeterPico = "Picometer"
UnitDistanceInch = "Duim"
UnitDistanceFoot = "Voet"
UnitDistanceYard = "Yard"
UnitDistanceMile = "Mijl"
UnitDistanceAstronomicalUnit = "Astronomische eenheid"
UnitDistanceLightYear = "Lichtjaar"
UnitDistanceParsec = "Parsec"
UnitDistanceMile = "Mijl"
UnitDistanceYard = "Yard"
UnitDistanceFoot = "Voet"
UnitDistanceInch = "Duim"
UnitMassMenu = "Massa"
UnitMassGramKilo = "Kilogram"
UnitMassGram = "Gram"
@@ -77,13 +78,14 @@ InductanceMenu = "Zelfinductie"
UnitSurfaceMenu = "Oppervlakte"
UnitSurfaceAcre = "Acre"
UnitSurfaceHectar = "Hectare"
UnitSurfaceMeterSquare = "Vierkante meter"
UnitVolumeMenu = "Volume"
UnitVolumeLiter = "Liter"
UnitVolumeLiterDeci = "Deciliter"
UnitVolumeLiterCenti = "Centiliter"
UnitVolumeLiterMilli = "Milliliter"
UnitVolumeTeaspoon = "Theelepel"
UnitVolumeTablespoon= "Eetlepel"
UnitVolumeTablespoon = "Eetlepel"
UnitVolumeFluidOunce = "Vloeibare ons"
UnitVolumeCup = "Kop"
UnitVolumePint = "Pint"
@@ -413,17 +415,12 @@ SpeedOfSound0Tag = "Zeespiegel, 20°C"
SpeedOfSoundWaterTag = "In het water"
SpeedOfSoundSteelTag = "In staal"
SpeedOfSoundGlassTag = "In glas"
EscapeVelocity = "Ontsnapsnelheid"
EscapeVelocityFromEarth = "Van Aarde"
EscapeVelocityFromMoon = "Van Maan"
EscapeVelocityFromSun = "Van de zon"
SpeedOfLightTag = "Lichtsnelheid"
Thermodynamics = "Thermodynamica"
BoltzmannTag = "Boltzmannconstante"
AvogadroTag = "Avogadroconstante"
GasTag = "Gasconstante"
Electromagnetism = "Elektromagnetisme"
CoulombTag = "Coulombconstante"
ConductivityConstants = "Geleidingsconstanten"
Electricity = "Elektriciteit"
ResistivityConstants = "Weerstandsconstanten"
@@ -445,6 +442,11 @@ Water = "Water"
Air = "Lucht"
Glass = "Glas"
Wood = "Hout"
CoulombTag = "Coulombconstante"
EscapeVelocity = "Ontsnapsnelheid"
EscapeVelocityFromEarth = "Van Aarde"
EscapeVelocityFromMoon = "Van Maan"
EscapeVelocityFromSun = "Van de zon"
Vacuum_permittivityTag = "Elektrische veldconstante"
Vacuum_permeabilityTag = "Magnetische veldconstante"
PlanckTag = "Planckconstante"

View File

@@ -13,17 +13,18 @@ UnitTimeYear = "Ano"
UnitDistanceMenu = "Distância"
UnitDistanceMeterKilo = "Quilómetro"
UnitDistanceMeter = "Metro"
UnitDistanceMeterCenti = "Centímetro"
UnitDistanceMeterMilli = "Milímetro"
UnitDistanceMeterMicro = "Micrómetro"
UnitDistanceMeterNano = "Nanómetro"
UnitDistanceMeterPico = "Picómetro"
UnitDistanceInch = "Polegada"
UnitDistanceFoot = "Pé"
UnitDistanceYard = "Jarda"
UnitDistanceMile = "Milha"
UnitDistanceAstronomicalUnit = "Unidade astronómica"
UnitDistanceLightYear = "Ano-luz"
UnitDistanceParsec = "Parsec"
UnitDistanceMile = "Milha"
UnitDistanceYard = "Jarda"
UnitDistanceFoot = "Pé"
UnitDistanceInch = "Polegada"
UnitMassMenu = "Massa"
UnitMassGramKilo = "Quilograma"
UnitMassGram = "Grama"
@@ -77,13 +78,14 @@ InductanceMenu = "Indutância"
UnitSurfaceMenu = "Área"
UnitSurfaceAcre = "Acre"
UnitSurfaceHectar = "Hectare"
UnitSurfaceMeterSquare = "Metro quadrado"
UnitVolumeMenu = "Volume"
UnitVolumeLiter = "Litro"
UnitVolumeLiterDeci = "Decilitro"
UnitVolumeLiterCenti = "Centilitro"
UnitVolumeLiterMilli = "Mililitro"
UnitVolumeTeaspoon = "Colher de chá"
UnitVolumeTablespoon= "Colher de sopa"
UnitVolumeTablespoon = "Colher de sopa"
UnitVolumeFluidOunce = "Onça fluída"
UnitVolumeCup = "Copo"
UnitVolumePint = "Pinto"
@@ -409,21 +411,16 @@ NumberElementUbn = "120 - Unbinílio (Ubn)"
AlphaElementUbn = "Ubn - Unbinílio (120)"
Speed = "Velocidade"
SpeedOfSound = "Velocidade do som"
SpeedOfLightTag = "Velocidade da luz"
SpeedOfSound0Tag = "Nível do mar, 20 ° C"
SpeedOfSoundWaterTag = "Na água"
SpeedOfSoundSteelTag = "Em aço"
SpeedOfSoundGlassTag = "Em vidro"
EscapeVelocity = "Velocidade de Fuga"
EscapeVelocityFromEarth = "Fuga da Terra"
EscapeVelocityFromMoon = "De Lua"
EscapeVelocityFromSun = "Do Sol"
SpeedOfLightTag = "Velocidade da luz"
Thermodynamics = "Termodinâmica"
BoltzmannTag = "Constante Boltzmann"
AvogadroTag = "Constante Avogadro"
GasTag = "Constante de gás"
Electromagnetism = "Eletromagnetismo"
CoulombTag = "Constante de Coulomb"
ConductivityConstants = "Constantes de condutividade"
Electricity = "Electricidade"
ResistivityConstants = "Constantes de resistividade"
@@ -445,6 +442,11 @@ Water = "Água"
Air = "Ar"
Glass = "Vidro"
Wood = "Madeira"
CoulombTag = "Constante de Coulomb"
EscapeVelocity = "Velocidade de Fuga"
EscapeVelocityFromEarth = "Fuga da Terra"
EscapeVelocityFromMoon = "De Lua"
EscapeVelocityFromSun = "Do Sol"
Vacuum_permittivityTag = "Permissividade a vácuo"
Vacuum_permeabilityTag = "Permeabilidade ao vácuo"
PlanckTag = "Constante de Planck"

View File

@@ -37,6 +37,7 @@ bootloader_src += $(addprefix bootloader/interface/menus/, \
warning.cpp \
slot_recovery.cpp \
crash.cpp \
upsilon_recovery.cpp \
)
bootloader_images = $(addprefix bootloader/, \

View File

@@ -38,10 +38,8 @@ void Boot::setMode(BootMode mode) {
void Boot::busError() {
Ion::Device::Flash::ClearInternalFlashErrors();
asm("mov r12, lr");
if (config()->isBooting()) { // Bus error is normal if we are booting, it's triggered when we lock OPTCR
asm("mov lr, r12");
asm("bx lr");
return;
}
Bootloader::Recovery::crash_handler("BusFault");
}
@@ -65,7 +63,7 @@ bool Boot::isKernelPatched(const Slot & s) {
return *(uint32_t *)(origin_isr + sizeof(uint32_t) * 7) == ((uint32_t)&_fake_isr_function_start) + 1;
}
__attribute((section(".fake_isr_function"))) __attribute__((used)) void Boot::flash_interrupt() {
__attribute__((section(".fake_isr_function"))) __attribute__((used)) void Boot::flash_interrupt() {
// a simple function
Ion::Device::Flash::ClearInternalFlashErrors();
asm("bx lr");
@@ -87,14 +85,14 @@ void Boot::patchKernel(const Slot & s) {
// data[origin_isr + sizeof(uint32_t) * 5 + 1] = ptr[1];
// data[origin_isr + sizeof(uint32_t) * 5 + 2] = ptr[2];
// data[origin_isr + sizeof(uint32_t) * 5 + 3] = ptr[3];
data[origin_isr + sizeof(uint32_t) * 7] = ptr[0]; // UsageFault
data[origin_isr + sizeof(uint32_t) * 7 + 1] = ptr[1];
data[origin_isr + sizeof(uint32_t) * 7 + 2] = ptr[2];
data[origin_isr + sizeof(uint32_t) * 7 + 3] = ptr[3];
// data[origin_isr + sizeof(uint32_t) * 4] = ptr[0];//hardfault
// data[origin_isr + sizeof(uint32_t) * 4 + 1] = ptr[1];
// data[origin_isr + sizeof(uint32_t) * 4 + 1] = ptr[1];
// data[origin_isr + sizeof(uint32_t) * 4 + 2] = ptr[2];
// data[origin_isr + sizeof(uint32_t) * 4 + 3] = ptr[3];
@@ -105,9 +103,9 @@ void Boot::patchKernel(const Slot & s) {
void Boot::bootSlot(Bootloader::Slot s) {
config()->setSlot(&s);
if (!s.userlandHeader()->isOmega() && !s.userlandHeader()->isUpsilon()) {
// We are trying to boot epsilon, so we check the version and show an advertisement if needed
// We are trying to boot epsilon, so we check the version and show a warning if needed
const char * version = s.userlandHeader()->version();
const char * min = "21.3.1";
const char * min = "24.4.1";
int versionSum = Utility::versionSum(version, strlen(version));
int minimalVersionTrigger = Utility::versionSum(min, strlen(min));
if (versionSum >= minimalVersionTrigger) {

View File

@@ -47,7 +47,7 @@ public:
static void bootSlot(Bootloader::Slot slot);
static void bootSelectedSlot();
__attribute__ ((noreturn)) static void jumpToInternalBootloader();
__attribute((section(".fake_isr_function"))) __attribute__((used)) static void flash_interrupt();
__attribute__ ((section(".fake_isr_function"))) __attribute__((used)) static void flash_interrupt();
static void bootloader();
static void lockInternal();

View File

@@ -0,0 +1,48 @@
#include "upsilon_recovery.h"
#include <bootloader/slots/slot.h>
#include <bootloader/usb_data.h>
#include <ion/src/device/shared/drivers/board.h>
#include <ion.h>
#include <stdlib.h>
extern "C" void jump_to_firmware(const uint32_t* stackPtr, const void(*startPtr)(void));
Bootloader::UpsilonRecoveryMenu::UpsilonRecoveryMenu() : Menu(KDColorBlack, KDColorWhite, Messages::upsilonRecoveryTitle, Messages::mainTitle) {
setup();
}
void Bootloader::UpsilonRecoveryMenu::setup() {
m_defaultColumns[0] = Column(Messages::upsilonRecoveryMessage1, k_small_font, 0, true);
m_defaultColumns[1] = Column(Messages::upsilonRecoveryMessage2, k_small_font, 0, true);
m_defaultColumns[2] = Column(Messages::upsilonRecoveryMessage3, k_small_font, 0, true);
m_defaultColumns[3] = Column(Messages::upsilonRecoveryMessage4, k_small_font, 0, true);
m_defaultColumns[4] = Column(Messages::upsilonRecoveryMessage5, k_small_font, 0, true);
m_columns[0] = ColumnBinder(&m_defaultColumns[0]);
m_columns[1] = ColumnBinder(&m_defaultColumns[1]);
m_columns[2] = ColumnBinder(&m_defaultColumns[2]);
m_columns[3] = ColumnBinder(&m_defaultColumns[3]);
m_columns[4] = ColumnBinder(&m_defaultColumns[4]);
}
void Bootloader::UpsilonRecoveryMenu::postOpen() {
// We override the open method
for (;;) {
uint64_t scan = Ion::Keyboard::scan();
if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::Back)) {
while (Ion::Keyboard::scan() == Ion::Keyboard::State(Ion::Keyboard::Key::Back));
forceExit();
return;
} else if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::OnOff)) {
Ion::Power::suspend();
return;
} else if (scan == Ion::Keyboard::State(Ion::Keyboard::Key::OK)) {
Slot slot = Slot::Upsilon();
Ion::Device::Board::bootloaderMPU();
// Deinitialize the backlight to prevent bugs when the firmware boots
Ion::Backlight::shutdown();
jump_to_firmware(slot.kernelHeader()->stackPointer(), slot.userlandHeader()->upsilonRecoveryBootFunction());
for(;;);
}
}
}

View File

@@ -0,0 +1,15 @@
#ifndef _BOOTLOADER_INTERFACE_MENUS_UPSILON_RECOVERY_H_
#define _BOOTLOADER_INTERFACE_MENUS_UPSILON_RECOVERY_H_
#include <bootloader/interface/src/menu.h>
namespace Bootloader {
class UpsilonRecoveryMenu : public Menu {
public:
UpsilonRecoveryMenu();
void setup() override;
void postOpen() override;
};
}
#endif

View File

@@ -69,7 +69,12 @@ void Interface::drawLoading() {
for (uint8_t i = 0; i < strlen(Messages::mainTitle); i++) {
char tmp[2] = {Messages::mainTitle[i], '\0'};
ctx->drawString(tmp, KDPoint(initPos + i * (fontSize.width()), ImageStore::Computer->height() + 25 + 10), KDFont::LargeFont, KDColorBlack, KDColorWhite);
Ion::Timing::msleep(50);
int t = 50;
Ion::Events::Event e = Ion::Events::getEvent(&t);
if (e.isKeyboardEvent()){
return;
}
}
Ion::Timing::msleep(500);
}

View File

@@ -53,12 +53,21 @@ public:
constexpr static const char * recoveryMessage4 = "Press Back to continue.";
constexpr static const char * recoveryMessage5 = "(you will not be able to recover your data !)";
// Upsilon Recovery menu
constexpr static const char * upsilonRecoveryTitle = "Upsilon Recovery";
constexpr static const char * upsilonRecoveryMessage1 = "The bootloader has detected a crash.";
constexpr static const char * upsilonRecoveryMessage2 = "Because you also have an Upsilon slot,";
constexpr static const char * upsilonRecoveryMessage3 = "you can recover your data by booting";
constexpr static const char * upsilonRecoveryMessage4 = "the Upsilon slot.";
constexpr static const char * upsilonRecoveryMessage5 = "Press OK to continue, BACK to cancel";
// Warning menu
constexpr static const char * epsilonWarningTitle = "Epsilon Slot";
constexpr static const char * epsilonWarningMessage1 = "!! WARNING !! ";
constexpr static const char * epsilonWarningMessage2 = "This version of Epsilon";
constexpr static const char * epsilonWarningMessage3 = "can lock the calculator.";
constexpr static const char * epsilonWarningMessage2 = "This version of Epsilon can lock the";
constexpr static const char * epsilonWarningMessage3 = "calculator or be incompatible.";
constexpr static const char * epsilonWarningMessage4 = "Proceed the boot ?";
constexpr static const char * epsilonWarningMessage5 = "EXE - Yes";
constexpr static const char * epsilonWarningMessage6 = "BACK - No";
@@ -72,11 +81,11 @@ public:
constexpr static const char * aboutMessage4 = "and select the OS";
constexpr static const char * aboutMessage5 = "to boot.";
constexpr static const char * bootloaderVersion = "Version 1.0.8 - FREED0M.21.3";
constexpr static const char * bootloaderVersion = "Version 1.1.2 - RECOVER.24.4";
//USB NAMES
constexpr static const char * usbUpsilonBootloader = "Upsilon Bootloader";
constexpr static const char * usbUpsilonRecovery = "Upsilon Recovery";
constexpr static const char * usbUpsilonBootloader = "NumWorks Calculator";
constexpr static const char * usbUpsilonRecovery = "NumWorks Calculator";
constexpr static const char * usbBootloaderUpdate = "Bootloader Update";
};

View File

@@ -1,6 +1,7 @@
#include <bootloader/recovery.h>
#include <ion.h>
#include <ion/src/device/n0110/drivers/power.h>
#include <ion/src/device/shared/drivers/bldata.h>
#include <ion/src/device/shared/drivers/reset.h>
#include <ion/src/device/shared/drivers/board.h>
#include <assert.h>
@@ -10,6 +11,7 @@
#include <bootloader/usb_data.h>
#include <bootloader/interface/menus/slot_recovery.h>
#include <bootloader/interface/menus/crash.h>
#include <bootloader/interface/menus/upsilon_recovery.h>
constexpr static uint32_t MagicStorage = 0xEE0BDDBA;
@@ -76,7 +78,15 @@ void Bootloader::Recovery::recoverData() {
Ion::Display::pushRectUniform(KDRect(0,0,320,240), KDColorWhite);
Ion::Backlight::init();
USBData udata = USBData::Recovery((uint32_t)getSlotConcerned().getStorageAddress(), (uint32_t)getSlotConcerned().getStorageSize());
CrashedSlot slot = getSlotConcerned();
if (Slot::hasUpsilon() && Slot::Upsilon().userlandHeader()->hasUpsilonExtras()) {
Ion::Device::BootloaderSharedData::sharedBootloaderData()->setRecovery((uint32_t)slot.getStorageAddress(), slot.getStorageSize());
UpsilonRecoveryMenu reco = UpsilonRecoveryMenu();
reco.open();
}
USBData udata = USBData::Recovery((uint32_t)slot.getStorageAddress(), (uint32_t)slot.getStorageSize());
SlotRecoveryMenu menu = SlotRecoveryMenu(&udata);
menu.open();

View File

@@ -3,6 +3,8 @@
#include <ion/src/device/shared/drivers/flash.h>
#include <ion/src/device/shared/drivers/external_flash.h>
#include <bootloader/boot.h>
#include <assert.h>
#include <ion.h>
extern "C" void jump_to_firmware(const uint32_t* stackPtr, const void(*startPtr)(void));
@@ -20,6 +22,15 @@ const Slot Slot::Khi() {
return Slot(0x90180000);
}
const bool Slot::hasUpsilon() {
return (isFullyValid(A()) && A().userlandHeader()->isUpsilon()) || (isFullyValid(B()) && B().userlandHeader()->isUpsilon());
}
const Slot Slot::Upsilon() {
assert(hasUpsilon());
return (isFullyValid(A()) && A().userlandHeader()->isUpsilon()) ? A() : B();
}
const KernelHeader* Slot::kernelHeader() const {
return m_kernelHeader;
}

View File

@@ -25,6 +25,8 @@ public:
static const Slot A();
static const Slot B();
static const Slot Khi();
static const bool hasUpsilon();
static const Slot Upsilon();
static bool isFullyValid(const Slot& slot) {
return slot.kernelHeader()->isValid() && slot.userlandHeader()->isValid();

View File

@@ -50,11 +50,16 @@ uint8_t SlotsExamMode::FetchSlotExamMode(const char * version, const char * Slot
start = getSlotAStartExamAddress(0);
end = getSlotAEndExamAddress(0);
}
// Else get new addresses
else {
// Else versions before 22
else if ((version[0] == '2' && version[1] < '2') || (version[0] == '1')) {
start = getSlotAStartExamAddress(1);
end = getSlotAEndExamAddress(1);
}
// Else Epsilon 22 +
else {
start = getSlotAStartExamAddress(2);
end = getSlotAEndExamAddress(2);
}
}
else if (Slot == "B") {
// If version under 16 get old
@@ -62,11 +67,16 @@ uint8_t SlotsExamMode::FetchSlotExamMode(const char * version, const char * Slot
start = getSlotBStartExamAddress(0);
end = getSlotBEndExamAddress(0);
}
// Else get new
else {
// Else versions before 22
else if ((version[0] == '2' && version[1] < '2') || (version[0] == '1')) {
start = getSlotBStartExamAddress(1);
end = getSlotBEndExamAddress(1);
}
// Else Epsilon 22 +
else {
start = getSlotBStartExamAddress(2);
end = getSlotBEndExamAddress(2);
}
} else if (Slot == "Khi") {
// We directly get the address of the Khi exam mode without checking the
// version, because on Khi, version is KhiCAS version, not the OS version
@@ -167,42 +177,68 @@ uint8_t SlotsExamMode::examFetch19(uint32_t start, uint32_t end) {
}
}
}
return 0;
}
uint32_t SlotsExamMode::getSlotAStartExamAddress(int ExamVersion) {
if (ExamVersion == 0) {
return SlotAExamModeBufferStartOldVersions;
return SlotAExamModeBufferStartBefore16;
}
else {
return SlotAExamModeBufferStartNewVersions;
if (ExamVersion == 1) {
return SlotAExamModeBufferStartEpsilon16;
}
if (ExamVersion == 2) {
return SlotAExamModeBufferStartEpsilon22;
}
assert(false);
// Should not happen
return SlotAExamModeBufferStartEpsilon22;
}
uint32_t SlotsExamMode::getSlotAEndExamAddress(int ExamVersion) {
if (ExamVersion == 0) {
return SlotAExamModeBufferEndOldVersions;
return SlotAExamModeBufferEndBefore16;
}
else {
return SlotAExamModeBufferEndNewVersions;;
if (ExamVersion == 1) {
return SlotAExamModeBufferEndEpsilon16;
}
if (ExamVersion == 2) {
return SlotAExamModeBufferEndEpsilon22;
}
assert(false);
// Should not happen
return SlotAExamModeBufferEndEpsilon22;
}
uint32_t SlotsExamMode::getSlotBStartExamAddress(int ExamVersion) {
if (ExamVersion == 0) {
return SlotBExamModeBufferStartOldVersions;
return SlotBExamModeBufferStartBeforeEpsilon16;
}
else {
return SlotBExamModeBufferStartNewVersions;
if (ExamVersion == 1) {
return SlotBExamModeBufferStartEpsilon16;
}
if (ExamVersion == 2) {
return SlotBExamModeBufferStartEpsilon22;
}
assert(false);
// Should not happen
return SlotBExamModeBufferStartEpsilon22;
}
uint32_t SlotsExamMode::getSlotBEndExamAddress(int ExamVersion) {
if (ExamVersion == 0) {
return SlotBExamModeBufferEndOldVersions;
return SlotBExamModeBufferEndBeforeEpsilon16;
}
else {
return SlotBExamModeBufferEndNewVersions;
if (ExamVersion == 1) {
return SlotBExamModeBufferEndEpsilon16;
}
if (ExamVersion == 2) {
return SlotBExamModeBufferEndEpsilon22;
}
assert(false);
// Should not happen
return SlotBExamModeBufferEndEpsilon22;
}
uint32_t SlotsExamMode::getSlotKhiStartExamAddress() {

View File

@@ -8,17 +8,23 @@ extern "C" {
namespace Bootloader {
namespace ExamMode {
static const uint32_t SlotAExamModeBufferStartOldVersions = 0x90001000;
static const uint32_t SlotAExamModeBufferEndOldVersions = 0x90003000;
static const uint32_t SlotAExamModeBufferStartBefore16 = 0x90001000;
static const uint32_t SlotAExamModeBufferEndBefore16 = 0x90003000;
static const uint32_t SlotAExamModeBufferStartNewVersions = 0x903f0000;
static const uint32_t SlotAExamModeBufferEndNewVersions = 0x90400000;
static const uint32_t SlotAExamModeBufferStartEpsilon16 = 0x903f0000;
static const uint32_t SlotAExamModeBufferEndEpsilon16 = 0x90400000;
static const uint32_t SlotBExamModeBufferStartOldVersions = 0x90401000;
static const uint32_t SlotBExamModeBufferEndOldVersions = 0x90403000;
static const uint32_t SlotAExamModeBufferStartEpsilon22 = 0x903f0400;
static const uint32_t SlotAExamModeBufferEndEpsilon22 = 0x90400000;
static const uint32_t SlotBExamModeBufferStartNewVersions = 0x907f0000;
static const uint32_t SlotBExamModeBufferEndNewVersions = 0x90800000;
static const uint32_t SlotBExamModeBufferStartBeforeEpsilon16 = 0x90401000;
static const uint32_t SlotBExamModeBufferEndBeforeEpsilon16 = 0x90403000;
static const uint32_t SlotBExamModeBufferStartEpsilon16 = 0x907f0000;
static const uint32_t SlotBExamModeBufferEndEpsilon16 = 0x90800000;
static const uint32_t SlotBExamModeBufferStartEpsilon22 = 0x907f0400;
static const uint32_t SlotBExamModeBufferEndEpsilon22 = 0x90800000;
static const uint32_t SlotKhiExamModeBufferStart = 0x90181000;
static const uint32_t SlotKhiExamModeBufferEnd = 0x90183000;

View File

@@ -40,4 +40,16 @@ const size_t UserlandHeader::storageSize() const {
return m_storageSizeRAM;
}
const bool UserlandHeader::hasUpsilonExtras() const {
return m_upsilonExtraMagicHeader == UpsilonExtraMagic && m_upsilonExtraMagicFooter == UpsilonExtraMagic;
}
const uint32_t UserlandHeader::getExtraVersion() const {
return m_extraVersion;
}
const void (*UserlandHeader::upsilonRecoveryBootFunction() const)() {
return m_recoveryAddress;
}
}

View File

@@ -17,12 +17,17 @@ public:
const char * upsilonVersion() const;
const void * storageAddress() const;
const size_t storageSize() const;
const bool hasUpsilonExtras() const;
const void (*upsilonRecoveryBootFunction() const)();
const uint32_t getExtraVersion() const;
private:
UserlandHeader();
constexpr static uint32_t Magic = 0xDEC0EDFE;
constexpr static uint32_t OmegaMagic = 0xEFBEADDE;
constexpr static uint32_t UpsilonMagic = 0x55707369;
constexpr static uint32_t UpsilonExtraMagic = 0xaa7073ff;
uint32_t m_header;
const char m_expectedEpsilonVersion[8];
void * m_storageAddressRAM;
@@ -42,6 +47,10 @@ private:
const char m_UpsilonVersion[16];
uint32_t m_osType;
uint32_t m_upsilonMagicFooter;
uint32_t m_upsilonExtraMagicHeader;
const void (*m_recoveryAddress)();
uint32_t m_extraVersion;
uint32_t m_upsilonExtraMagicFooter;
};
extern const UserlandHeader* s_userlandHeaderA;

View File

@@ -10,6 +10,8 @@ namespace Bootloader {
void __attribute__((noinline)) suspend() {
Ion::Device::Power::internalFlashSuspend(true);
// Restore slotInfo magic header (broken on Epsilon, IDK why)
*(uint8_t *)0x20000000 = 0xBA;
}
void* Trampolines[TRAMPOLINES_COUNT]

View File

@@ -6,7 +6,7 @@ DEBUG ?= 0
HOME_DISPLAY_EXTERNALS ?= 1
EPSILON_VERSION ?= 15.5.0
OMEGA_VERSION ?= 2.0.2
UPSILON_VERSION ?= 1.0.1-dev
UPSILON_VERSION ?= 1.1.2
# OMEGA_USERNAME ?= N/A
OMEGA_STATE ?= dev
EPSILON_APPS ?= calculation graph rpn code statistics probability solver atomic sequence regression reader settings external

View File

@@ -79,7 +79,7 @@ __DFU_INTERFACE = 0
# Python 3 deprecated getargspec in favour of getfullargspec, but
# Python 2 doesn't have the latter, so detect which one to use
import inspect
getargspec = getattr(inspect, 'getfullargspec', inspect.getargspec)
getargspec = getattr(inspect, 'getfullargspec', inspect.getfullargspec)
if 'length' in getargspec(usb.util.get_string).args:
# PyUSB 1.0.0.b1 has the length argument

View File

@@ -5,7 +5,9 @@ APPLE_PLATFORM = macos
APPLE_PLATFORM_MIN_VERSION = 10.10
EPSILON_TELEMETRY ?= 0
ARCHS = x86_64
# Build universal binary for both x86_64 and ARM64 by default
# Can be overridden with ARCHS=arm64 or ARCHS=x86_64 for single architecture builds
ARCHS ?= x86_64 arm64
ifdef ARCH
BUILD_DIR := $(BUILD_DIR)/$(ARCH)

View File

@@ -26,7 +26,7 @@ EMFLAGS += -Wno-unused-command-line-argument
# Configure LDFLAGS
EMSCRIPTEN_MODULARIZE ?= 1
LDFLAGS += -s MODULARIZE=$(EMSCRIPTEN_MODULARIZE) -s 'EXPORT_NAME="Epsilon"' --memory-init-file 0
LDFLAGS += -s MODULARIZE=$(EMSCRIPTEN_MODULARIZE) -s 'EXPORT_NAME="Epsilon"'
SFLAGS += $(EMFLAGS)
LDFLAGS += $(EMFLAGS) -Oz -s EXPORTED_RUNTIME_METHODS='["UTF8ToString"]' -s EXPORTED_FUNCTIONS='["_main", "_IonSimulatorKeyboardKeyDown", "_IonSimulatorKeyboardKeyUp", "_IonSimulatorEventsPushEvent", "_IonSoftwareVersion", "_IonPatchLevel", "_IonDisplayForceRefresh"]'

View File

@@ -4,6 +4,7 @@
#include <ion/unicode/utf8_decoder.h>
#include <ion/unicode/utf8_helper.h>
#include <poincare/serialization_helper.h>
#include <../../apps/global_preferences.h>
#include <stddef.h>
#include <assert.h>
@@ -249,11 +250,13 @@ bool TextArea::handleEvent(Ion::Events::Event event) {
contentView()->resetSelection();
contentView()->moveCursorGeo(0, event == Ion::Events::Up ? -step : step);
} else if (event == Ion::Events::Clear) {
if (!contentView()->selectionIsEmpty()) {
deleteSelection();
return true;
} else if (!contentView()->removeEndOfLine()) {
contentView()->removeStartOfLine();
if (GlobalPreferences::sharedGlobalPreferences()->clearShift()) {
if (!contentView()->selectionIsEmpty()) {
deleteSelection();
return true;
} else if (!contentView()->removeEndOfLine()) {
contentView()->removeStartOfLine();
}
}
} else if (event == Ion::Events::Paste) {
return handleEventWithText(Clipboard::sharedClipboard()->storedText());

View File

@@ -25,7 +25,7 @@ public:
#ifdef _FXCG
constexpr static size_t k_storageSize = 65500;
#else
constexpr static size_t k_storageSize = 60000;
constexpr static size_t k_storageSize = 59992;
#endif
static_assert(UINT16_MAX >= k_storageSize, "record_size_t not big enough");

View File

@@ -3,6 +3,7 @@ ion_device_src += $(addprefix ion/src/device/bootloader/drivers/, \
board.cpp \
cache.cpp \
external_flash_tramp.cpp \
storage.cpp \
led.cpp \
power.cpp \
reset.cpp \

View File

@@ -1,11 +1,15 @@
#include <stdint.h>
#include <string.h>
#include <ion.h>
#include <ion/led.h>
#include <ion/storage.h>
#include <ion/internal_storage.h>
#include <boot/isr.h>
#include <drivers/board.h>
#include <drivers/rtc.h>
#include <drivers/reset.h>
#include <drivers/timing.h>
#include <drivers/bldata.h>
typedef void (*cxx_constructor)();
@@ -14,6 +18,8 @@ extern "C" {
extern char _data_section_start_ram;
extern char _data_section_end_ram;
extern char _bss_section_start_ram;
extern char _static_storage_start;
extern char _static_storage_end;
extern char _bss_section_end_ram;
extern cxx_constructor _init_array_start;
extern cxx_constructor _init_array_end;
@@ -129,6 +135,43 @@ void __attribute__((noinline)) start() {
abort();
}
void __attribute__((noinline)) __attribute__((section(".recovery_boot"))) __attribute__((used)) recovery_start() {
// Here we are in the recovery boot.
Ion::Device::Board::initFPU();
bool is_recoverying = Ion::Device::BootloaderSharedData::sharedBootloaderData()->storageAddress() != 0;
if (is_recoverying) {
uint32_t address = Ion::Device::BootloaderSharedData::sharedBootloaderData()->storageAddress();
uint32_t size = Ion::Device::BootloaderSharedData::sharedBootloaderData()->storageSize();
memcpy(&_static_storage_start, (void*)address, size);
size_t dataSectionLength = (&_data_section_end_ram - &_data_section_start_ram);
memcpy(&_data_section_start_ram, &_data_section_start_flash, dataSectionLength);
size_t bssSectionLength = (&_bss_section_end_ram - &_static_storage_end);
memset(&_static_storage_end, 0, bssSectionLength);
} else {
size_t dataSectionLength = (&_data_section_end_ram - &_data_section_start_ram);
memcpy(&_data_section_start_ram, &_data_section_start_flash, dataSectionLength);
size_t bssSectionLength = (&_bss_section_end_ram - &_bss_section_start_ram);
memset(&_bss_section_start_ram, 0, bssSectionLength);
}
if (&_init_array_start != &_init_array_end) {
abort();
}
size_t isrSectionLength = (&_isr_vector_table_end_ram - &_isr_vector_table_start_ram);
memcpy(&_isr_vector_table_start_ram, &_isr_vector_table_start_flash, isrSectionLength);
Ion::Device::Board::init();
jump_to_external_flash();
abort();
}
void __attribute__((interrupt, noinline)) isr_systick() {
auto t = Ion::Device::Timing::MillisElapsed;
t++;

View File

@@ -1,3 +1,4 @@
BOOTLOADER_SHARED_OFFSET = 0x3d0;
SECTIONS {
.signed_payload_prefix ORIGIN(FLASH) : {
@@ -34,7 +35,14 @@ SECTIONS {
_isr_vector_table_end_ram = .;
} >SRAM
.exam_mode_buffer ORIGIN(FLASH) + SIZEOF(.signed_payload_prefix) + SIZEOF(.kernel_header) + SIZEOF(.isr_vector_table) : {
.bootloader_shared ORIGIN(SRAM) + BOOTLOADER_SHARED_OFFSET : AT(ORIGIN(FLASH) + SIZEOF(.signed_payload_prefix) + SIZEOF(.kernel_header) + SIZEOF(.isr_vector_table) + SIZEOF(.slot_info)) {
_bootloader_shared_start = .;
KEEP(*(.bootloader_shared))
KEEP(*(.bootloader_shared.*))
_bootloader_shared_end = .;
} >SRAM
.exam_mode_buffer ORIGIN(FLASH) + SIZEOF(.signed_payload_prefix) + SIZEOF(.kernel_header) + SIZEOF(.isr_vector_table) + SIZEOF(.bootloader_shared) + SIZEOF(.slot_info) : {
. = ALIGN(4K);
_exam_mode_buffer_start = .;
KEEP(*(.exam_mode_buffer))
@@ -49,6 +57,13 @@ SECTIONS {
KEEP(*(.userland_header));
} > FLASH
.recovery_boot : {
. = ALIGN(4);
_recovery_boot_start = .;
KEEP(*(.recovery_boot));
_recovery_boot_end = .;
} >FLASH
.text : {
. = ALIGN(4);
*(.text)
@@ -97,6 +112,9 @@ SECTIONS {
* need pointers to the beginning and end of this section. */
. = ALIGN(4);
_bss_section_start_ram = .;
_static_storage_start = .;
KEEP (*(.static_storage))
_static_storage_end = .;
*(.bss)
*(.bss.*)
/* The compiler may choose to allocate uninitialized global variables as

View File

@@ -0,0 +1,10 @@
#include <ion/storage.h>
namespace Ion {
// TODO: Check if the storage is initialized at runtime and not at compile time:
// As far as I can see, it break build for N0110 legacy internal storage and
// N0100 due to lack of storage, so it's probably wasting space.
uint32_t __attribute__((section(".static_storage"))) staticStorageArea[sizeof(Storage)/sizeof(uint32_t)] = {0};
}

View File

@@ -8,6 +8,7 @@ MEMORY {
STACK_SIZE = 32K;
TRAMPOLINES_OFFSET = 0xE000;
CUSTOM_TRAMPOLINES_OFFSET = 64K - 64;
BOOTLOADER_SHARED_OFFSET = 0x3d0;
SECTIONS {
.isr_vector_table ORIGIN(INTERNAL_FLASH) : {
@@ -31,7 +32,16 @@ SECTIONS {
KEEP(*(.header))
} >INTERNAL_FLASH
.rodata : {
.bootloader_shared ORIGIN(SRAM) + BOOTLOADER_SHARED_OFFSET : AT(ORIGIN(INTERNAL_FLASH) + SIZEOF(.isr_vector_table) + SIZEOF(.header)) {
. = ORIGIN(SRAM) + BOOTLOADER_SHARED_OFFSET;
_bootloader_shared_start = .;
KEEP(*(.bootloader_shared))
KEEP(*(.bootloader_shared.*))
_bootloader_shared_end = .;
} >SRAM
.rodata ORIGIN(INTERNAL_FLASH) + SIZEOF(.isr_vector_table) + SIZEOF(.header) + SIZEOF(.bootloader_shared) : {
. = ALIGN(4);
*(.rodata)
*(.rodata.*)

View File

@@ -17,10 +17,15 @@
#error This file expects UPSILON_VERSION to be defined
#endif
extern "C" {
extern void recovery_start();
}
namespace Ion {
extern char staticStorageArea[];
}
constexpr void * storageAddress = &(Ion::staticStorageArea);
typedef void (*recoveryStartPointerType)();
constexpr recoveryStartPointerType recoveryStartPointer = &(recovery_start);
class KernelHeader {
public:
@@ -72,7 +77,16 @@ public:
m_upsilonMagicHeader(UpsilonMagic),
m_UpsilonVersion{UPSILON_VERSION},
m_osType(OSType),
m_upsilonMagicFooter(UpsilonMagic) { }
m_upsilonMagicFooter(UpsilonMagic),
m_upsilonExtraMagicHeader(UpsilonExtraMagic),
// We need to be careful with the pointer to the recovery entrypoint as GCC
// will simply generate a blank userland header if it wasn't able to
// generate it. This code used to work on GCC 12, but is broken since GCC 13
// probably due to the cast preventing LD to just copy the address:
// m_recoveryAddress((uint32_t)recovery_start + 1),
m_recoveryAddress(recoveryStartPointer),
m_extraVersion(1),
m_upsilonExtraMagicFooter(UpsilonExtraMagic) { }
const char * omegaVersion() const {
assert(m_storageAddressRAM != nullptr);
@@ -109,6 +123,7 @@ private:
constexpr static uint32_t OmegaMagic = 0xEFBEADDE;
constexpr static uint32_t UpsilonMagic = 0x55707369;
constexpr static uint32_t OSType = 0x79827178;
constexpr static uint32_t UpsilonExtraMagic = 0xaa7073ff;
uint32_t m_header;
const char m_expectedEpsilonVersion[8];
void * m_storageAddressRAM;
@@ -128,6 +143,10 @@ private:
const char m_UpsilonVersion[16];
uint32_t m_osType;
uint32_t m_upsilonMagicFooter;
uint32_t m_upsilonExtraMagicHeader;
recoveryStartPointerType m_recoveryAddress;
uint32_t m_extraVersion;
uint32_t m_upsilonExtraMagicFooter;
};
const UserlandHeader __attribute__((section(".userland_header"), used)) k_userlandHeader;

View File

@@ -71,6 +71,7 @@ SECTIONS {
*(.text.__assert)
*(.text.memcpy)
*(.text.memset)
*(.text.__udivmoddi4)
/*
*(.text.strlen)
*(.text.strncmp)

View File

@@ -8,6 +8,7 @@ extern "C" {
void start();
void abort();
void isr_systick();
void recovery_start();
#ifdef __cplusplus
}

View File

@@ -26,4 +26,5 @@ ion_device_src += $(addprefix ion/src/device/shared/drivers/, \
timing.cpp \
usb.cpp \
wakeup.cpp \
bldata.cpp \
)

View File

@@ -0,0 +1,23 @@
#include "bldata.h"
#include <ion.h>
#include <new>
namespace Ion {
uint32_t staticSharedData[sizeof(Ion::Device::BootloaderSharedData)/sizeof(uint32_t)] __attribute__((section(".bootloader_shared"))) __attribute__((used)) = {0};
Device::BootloaderSharedData * Device::BootloaderSharedData::sharedBootloaderData() {
static BootloaderSharedData * sharedData = new (staticSharedData) BootloaderSharedData();
return sharedData;
}
Device::BootloaderSharedData::BootloaderSharedData() {
// FIXME: Find why calculator is crashing when footer is defined
// if (m_header != Magic || m_footer != Magic) {
if (m_header != Magic) {
m_header = Magic;
m_storageAddress = 0;
m_storageSize = 0;
// m_footer = Magic;
}
}
}

View File

@@ -0,0 +1,24 @@
#include <ion.h>
namespace Ion
{
namespace Device
{
class BootloaderSharedData {
public:
constexpr static uint32_t Magic = 0x626C6461;
static BootloaderSharedData * sharedBootloaderData();
BootloaderSharedData();
void setRecovery(uint32_t address, uint32_t size) { m_storageAddress = address; m_storageSize = size; }
uint32_t storageAddress() const { return m_storageAddress; }
uint32_t storageSize() const { return m_storageSize; }
private:
uint32_t m_header;
uint32_t m_storageAddress;
uint32_t m_storageSize;
// uint32_t m_footer;
};
}
}

View File

@@ -23,10 +23,10 @@ MEMORY {
* overwritten (for instance, vtables that live in the .rodata section). */
/* The image is quite large too!
* So we put the stack to 18K so there's still space
* So we put the stack to 17K so there's still space
* for our image, if not LD will throw an error. */
STACK_SIZE = 18K;
STACK_SIZE = 17K;
SECTIONS {
.isr_vector_table ORIGIN(RAM_BUFFER) : {

View File

@@ -2,7 +2,7 @@
#define REGS_SYSCFG_H
#include "register.h"
#include <regs/config/syscfg.h>
// #include <regs/config/syscfg.h>
#include "gpio.h"
#define REGS_SYSCFG_CONFIG_F412 1

View File

@@ -63,7 +63,7 @@ public:
* switching to DFU mode. It does not apply to the calculator.*/
2048, // wTransferSize: Maximum number of bytes that the device can accept per control-write transaction
0x0100),// bcdDFUVersion
m_interfaceDescriptor(
m_interfaceDescriptor1(
0, // bInterfaceNumber
k_dfuInterfaceAlternateSetting, // bAlternateSetting
0, // bNumEndpoints: Other than endpoint 0
@@ -71,9 +71,20 @@ public:
1, // bInterfaceSubClass: DFU
2, // bInterfaceProtocol: DFU Mode (not DFU Runtime, which would be 1)
4, // iInterface: Index of the Interface string, see m_descriptor
&m_interfaceDescriptor2),
m_interfaceDescriptor2(
0, // bInterfaceNumber
k_dfuInterfaceAlternateSetting + 1, // bAlternateSetting
0, // bNumEndpoints: Other than endpoint 0
0xFE, // bInterfaceClass: DFU (https://www.usb.org/defined-class-codes)
1, // bInterfaceSubClass: DFU
2, // bInterfaceProtocol: DFU Mode (not DFU Runtime, which would be 1)
// TODO: Use real descriptor, not required for now as the descriptor isn't
// used anywhere in DFU firmware, but is only present so NumWorks website work.
4, // iInterface: Index of the Interface string, see m_descriptor
&m_dfuFunctionalDescriptor),
m_configurationDescriptor(
9 + 9 + 9, // wTotalLength: configuration descriptor + interface descriptor + dfu functional descriptor lengths
9 + 9 + 9 + 9, // wTotalLength: configuration descriptor + interface descriptor 1 + interface descriptor 2 + dfu functional descriptor lengths2
1, // bNumInterfaces
k_bConfigurationValue, // bConfigurationValue
0, // iConfiguration: No string descriptor for the configuration
@@ -83,7 +94,7 @@ public:
* Bit 5: Remote Wakeup (allows the device to wake up the host when the host is in suspend)
* Bit 4..0: Reserved, set to 0 */
0x32, // bMaxPower: half of the Maximum Power Consumption
&m_interfaceDescriptor),
&m_interfaceDescriptor1),
m_webUSBPlatformDescriptor(
k_webUSBVendorCode,
k_webUSBLandingPageIndex),
@@ -99,6 +110,9 @@ public:
//m_interfaceStringDescriptor("@SRAM/0x20000000/01*256Ke"),
/* Switch to this descriptor to use dfu-util to write in the SRAM.
* FIXME Should be an alternate Interface. */
// Epsilon 25.6.0 descriptors for example
// @SRAM/0x20000000/01*252Ke
// @Flash/0x90030000/61*064Kg,64*064Kg
m_microsoftOSStringDescriptor(k_microsoftOSVendorCode),
m_workshopURLDescriptor(URLDescriptor::Scheme::HTTPS, "getupsilon.web.app"),
m_extendedCompatIdDescriptor("WINUSB"),
@@ -141,7 +155,8 @@ private:
// Descriptors
DeviceDescriptor m_deviceDescriptor;
DFUFunctionalDescriptor m_dfuFunctionalDescriptor;
InterfaceDescriptor m_interfaceDescriptor;
InterfaceDescriptor m_interfaceDescriptor1;
InterfaceDescriptor m_interfaceDescriptor2;
ConfigurationDescriptor m_configurationDescriptor;
WebUSBPlatformDescriptor m_webUSBPlatformDescriptor;
BOSDescriptor m_bosDescriptor;

View File

@@ -51,10 +51,6 @@ void resetLongRepetition() {
ComputeAndSetRepetitionFactor(sEventRepetitionCount);
}
static Keyboard::Key keyFromState(Keyboard::State state) {
return static_cast<Keyboard::Key>(63 - __builtin_clzll(state));
}
static inline Event innerGetEvent(int * timeout) {
assert(*timeout > delayBeforeRepeat);
assert(*timeout > delayBetweenRepeat);
@@ -96,7 +92,7 @@ static inline Event innerGetEvent(int * timeout) {
}
bool lock = isLockActive();
if ( key == Keyboard::Key::Left
|| key == Keyboard::Key::Right
|| key == Keyboard::Key::Up
@@ -108,7 +104,7 @@ static inline Event innerGetEvent(int * timeout) {
// shift = false;
}
}
Event event(key, shift, alpha, lock);
sLastEventShift = shift;
sLastEventAlpha = alpha;

View File

@@ -336,18 +336,14 @@ void InternalStorage::destroyRecordsWithExtension(const char * extension) {
}
}
InternalStorage::InternalStorage() :
m_magicHeader(Magic),
m_buffer(),
m_magicFooter(Magic),
m_delegate(nullptr),
m_lastRecordRetrieved(nullptr),
m_lastRecordRetrievedPointer(nullptr)
{
InternalStorage::InternalStorage() {
m_magicHeader = Magic;
m_magicFooter = Magic;
m_delegate = nullptr;
m_lastRecordRetrieved = nullptr;
m_lastRecordRetrievedPointer = nullptr;
assert(m_magicHeader == Magic);
assert(m_magicFooter == Magic);
// Set the size of the first record to 0
overrideSizeAtPosition(m_buffer, 0);
}
// PRIVATE

View File

@@ -6,7 +6,9 @@
namespace Ion {
uint32_t staticStorageArea[sizeof(Storage)/sizeof(uint32_t)] = {0};
// Declaration for N0110 with bootloader is in ion/src/device/bootloader/drivers/storage.cpp
// to fix LD build
__attribute__((weak)) uint32_t staticStorageArea[sizeof(Storage)/sizeof(uint32_t)] = {0};
Storage * Storage::sharedStorage() {
static Storage * storage = new (staticStorageArea) Storage();

View File

@@ -30,9 +30,13 @@ ifndef ARCH
$(BUILD_DIR)/app/res/mipmap/ic_launcher.png: ion/src/simulator/assets/logo.svg | $$(@D)/.
$(call rule_label,CONVERT)
$(Q) convert -background "#b1403b" $< $@
$(Q) convert -background "#5c83ab" $< $@
$(BUILD_DIR)/app/res/mipmap-v26/ic_launcher_foreground.png: ion/src/simulator/assets/logo.svg | $$(@D)/.
$(call rule_label,CONVERT)
$(Q) convert -background none $< -resize 694x694 -gravity center -background none -extent 1024x1024 $@
$(BUILD_DIR)/app/res/mipmap-v26/ic_launcher_monochrome.png: ion/src/simulator/assets/logo_monochrome.svg | $$(@D)/.
$(call rule_label,CONVERT)
$(Q) convert -background none $< -resize 1024x1024 -gravity center -background none -extent 1024x1024 $@
@@ -58,13 +62,13 @@ $(foreach ARCH,$(ARCHS),$(eval $(call rule_for_arch_jni_lib,$(ARCH))))
apk_deps = $(foreach ARCH,$(ARCHS),$(call path_for_arch_jni_lib,$(ARCH)))
apk_deps += $(subst ion/src/simulator/android/src/res,$(BUILD_DIR)/app/res,$(wildcard ion/src/simulator/android/src/res/*/*))
apk_deps += $(addprefix $(BUILD_DIR)/app/res/,mipmap/ic_launcher.png mipmap-v26/ic_launcher_foreground.png)
apk_deps += $(addprefix $(BUILD_DIR)/app/res/,mipmap/ic_launcher.png mipmap-v26/ic_launcher_foreground.png mipmap-v26/ic_launcher_monochrome.png)
.PRECIOUS: $(apk_deps)
$(BUILD_DIR)/%.apk: $(apk_deps)
$(call rule_label,GRADLE)
$(Q) ANDROID_HOME=$(ANDROID_HOME) EPSILON_VERSION=$(EPSILON_VERSION) OMEGA_VERSION=$(OMEGA_VERSION) BUILD_DIR=$(BUILD_DIR) EPSILON_VARIANT=$* ion/src/simulator/android/gradlew -b ion/src/simulator/android/build.gradle assembleRelease
$(Q) ANDROID_HOME=$(ANDROID_HOME) UPSILON_VERSION=$(UPSILON_VERSION) BUILD_DIR=$(BUILD_DIR) EPSILON_VARIANT=$* ion/src/simulator/android/gradlew -p ion/src/simulator/android assembleRelease --warning-mode all
$(Q) cp $(BUILD_DIR)/app/outputs/apk/release/android-release*.apk $@
endif

View File

@@ -12,18 +12,17 @@ def fileIfPath(path) {
buildscript {
repositories {
jcenter()
mavenCentral()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
classpath 'com.google.gms:google-services:4.2.0'
classpath 'com.android.tools.build:gradle:8.8.1'
}
}
allprojects {
repositories {
jcenter()
mavenCentral()
google()
}
buildDir = BUILD_DIR
@@ -32,14 +31,15 @@ allprojects {
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
namespace = "io.github.upsilon.simulator"
compileSdkVersion 35
defaultConfig {
applicationId "io.github.omega.simulator"
minSdkVersion 16
targetSdkVersion 29
def (major, minor, patch) = System.getenv('OMEGA_VERSION').toLowerCase().tokenize('.').collect{it.toInteger()}
versionCode major*1000000 + minor*10000 + patch * 100
versionName System.getenv('OMEGA_VERSION')
applicationId "io.github.upsilon.simulator"
minSdkVersion 21
targetSdkVersion 33
def d=new Date()
versionCode Instant.now().getEpochSecond().toInteger()
versionName LocalDate.now().format("yyyyMMdd")+'-'+System.getenv('UPSILON_VERSION')
}
signingConfigs {
environment {
@@ -54,9 +54,9 @@ android {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt')
if (projectVariable('SIGNING_STORE_FILE')) {
signingConfig signingConfigs.environment
signingConfig = signingConfigs.environment
} else {
signingConfig signingConfigs.debug
signingConfig = signingConfigs.debug
}
}
}
@@ -70,13 +70,15 @@ android {
}
}
lintOptions {
abortOnError false
checkReleaseBuilds false
abortOnError = false
checkReleaseBuilds = false
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "androidx.appcompat:appcompat:1.0.2"
implementation "com.google.android.gms:play-services-analytics:16.0.7"
implementation "androidx.appcompat:appcompat:1.7.0"
implementation(platform("org.jetbrains.kotlin:kotlin-bom:2.1.10"))
}
java{toolchain{languageVersion=JavaLanguageVersion.of(21)}}

View File

@@ -1,5 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -1,16 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.github.omega.simulator"
android:installLocation="auto">
<uses-feature android:glEsVersion="0x00020000" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<uses-feature android:name="android.hardware.gamepad" android:required="false" />
<uses-feature android:name="android.hardware.type.pc" android:required="false" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> -->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- <uses-permission android:name="android.permission.INTERNET"/> -->
<!-- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> -->
<application android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
@@ -18,11 +17,12 @@
android:theme="@style/AppTheme"
android:hardwareAccelerated="true" >
<activity android:name="OmegaActivity"
<activity android:name="UpsilonActivity"
android:label="@string/app_name"
android:alwaysRetainTaskState="true"
android:launchMode="singleInstance"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:exported="true"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@@ -10,7 +10,7 @@ namespace Haptics {
bool isEnabled() {
JNIEnv * env = static_cast<JNIEnv *>(SDL_AndroidGetJNIEnv());
jobject activity = static_cast<jobject>(SDL_AndroidGetActivity());
jclass j_class = env->FindClass("io/github/omega/simulator/OmegaActivity");
jclass j_class = env->FindClass("io/github/upsilon/simulator/UpsilonActivity");
jmethodID j_methodId = env->GetMethodID(j_class,"hapticFeedbackIsEnabled", "()Z");
assert(j_methodId != 0);
bool result = (env->CallBooleanMethod(activity, j_methodId) != JNI_FALSE);

View File

@@ -12,7 +12,7 @@ SDL_Texture * loadImage(SDL_Renderer * renderer, const char * identifier) {
JNIEnv * env = static_cast<JNIEnv *>(SDL_AndroidGetJNIEnv());
jobject activity = static_cast<jobject>(SDL_AndroidGetActivity());
jclass j_class = env->FindClass("io/github/omega/simulator/OmegaActivity");
jclass j_class = env->FindClass("io/github/upsilon/simulator/UpsilonActivity");
jmethodID j_methodId = env->GetMethodID(
j_class,
"retrieveBitmapAsset",

View File

@@ -12,7 +12,7 @@ const char * languageCode() {
JNIEnv * env = static_cast<JNIEnv *>(SDL_AndroidGetJNIEnv());
jobject activity = static_cast<jobject>(SDL_AndroidGetActivity());
jclass j_class = env->FindClass("io/github/omega/simulator/OmegaActivity");
jclass j_class = env->FindClass("io/github/upsilon/simulator/UpsilonActivity");
jmethodID j_methodId = env->GetMethodID(
j_class,
"retrieveLanguage",

View File

@@ -1,4 +1,4 @@
package io.github.omega.simulator;
package io.github.upsilon.simulator;
import java.util.Locale;
@@ -11,14 +11,10 @@ import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.Tracker;
import com.google.android.gms.analytics.HitBuilders;
import org.libsdl.app.SDLActivity;
import org.libsdl.app.SDL;
public class OmegaActivity extends SDLActivity {
public class UpsilonActivity extends SDLActivity {
protected String[] getLibraries() {
return new String[] {
"epsilon"

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/yellow" />
<background android:drawable="@color/blue" />
<foreground android:drawable="@mipmap/ic_launcher_foreground" />
<monochrome android:drawable="@mipmap/ic_launcher_monochrome" />
</adaptive-icon>

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="yellow">#C03535</color>
<color name="lightGray">#F7F7F7</color>
</resources>

View File

@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="app_name">Upsilon</string>
<color name="blue">#5c83ab</color>
<style name="AppTheme" parent="Theme.AppCompat">
<item name="colorPrimary">@color/yellow</item>
<item name="colorAccent">@color/yellow</item> -->
<item name="colorPrimary">@color/blue</item>
<item name="colorAccent">@color/blue</item> -->
<item name="android:windowLightStatusBar" tools:targetApi="21">false</item>
<item name="android:windowLightNavigationBar" tools:targetApi="21">true</item>
<item name="android:windowTranslucentNavigation" tools:targetApi="21">true</item>

View File

@@ -1,3 +0,0 @@
<resources>
<string name="app_name">Omega</string>
</resources>

View File

@@ -1,60 +1,53 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="2048"
width="2048"
viewBox="0 0 2048 2048"
id="svg"
version="1.1"
id="svg4"
width="268.99927"
height="268.99927"
viewBox="-254.54545 -254.54545 440.18062 440.18062"
sodipodi:docname="logo.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
id="defs1" />
<sodipodi:namedview
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
id="namedview6"
showgrid="false"
inkscape:document-rotation="0"
inkscape:zoom="0.10241699"
inkscape:cx="-688.3434"
inkscape:cy="1290.1447"
inkscape:window-width="1310"
inkscape:window-height="740"
inkscape:window-x="1970"
inkscape:window-y="312"
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="8.2264833"
inkscape:cx="144.22931"
inkscape:cy="95.788197"
inkscape:window-width="1920"
inkscape:window-height="1011"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
sodipodi:nodetypes="cssscccssscc"
style="fill:#8c302c;stroke-width:2.41038;fill-opacity:1"
id="path2-3-3"
d="M 2086.4474,1595.3277 1226.7788,783.8626 c -64.0824,-60.4892 -89.833,-34.55421 -168.9333,-34.55421 -158.20066,0 -212.52746,-43.98944 -212.52746,111.83386 0,54.5494 -66.60562,125.57083 -36.66705,171.21885 23.36652,35.6295 55.19723,135.5702 91.55,157.6311 l -5.28265,104.6642 -136.8456,-15.7295 c -26.65194,-3.0635 -57.07276,-6.1952 -57.07276,20.229 0,13.2122 5.50243,25.1069 14.22671,33.8312 663.40551,663.4055 110.02167,109.7988 740.12111,739.8983 764.7091,175.1285 815.297,-196.8835 631.0996,-477.5577 z" />
<path
d="m 1298.4261,1251.3119 h -124.0045 v -27.0439 c 36.3552,-22.0609 67.3575,-51.8916 90.724,-87.5211 29.9362,-45.6456 45.7616,-98.6066 45.7616,-153.156 0,-77.91046 -32.1766,-148.55819 -84.1283,-199.7283 C 1174.8272,732.69249 1103.1004,701 1024.0001,701 865.79945,701 737.09539,827.76998 737.09539,983.59329 c 0,54.54941 15.82541,107.50801 45.76398,153.15601 23.36652,35.6295 54.37129,65.4578 90.72406,87.5187 v 27.0439 H 749.57405 c -26.82742,0 -48.57399,21.4198 -48.57399,47.844 0,13.2122 5.43664,25.1732 14.22671,33.8312 8.79007,8.658 20.93357,14.0129 34.34728,14.0129 h 172.58337 c 26.8274,0 48.57398,-21.4198 48.57398,-47.8441 V 1195.875 c 0,-18.4965 -10.82228,-35.3329 -27.79403,-43.2439 -66.02905,-30.7828 -108.69401,-97.133 -108.69401,-169.03781 0,-103.05849 85.12348,-186.9052 189.75674,-186.9052 104.6332,0 189.7591,83.84671 189.7591,186.9052 0,71.90241 -42.6649,138.25501 -108.694,169.03781 -16.9693,7.9134 -27.7916,24.7498 -27.7916,43.2439 v 103.2809 c 0,26.4243 21.7466,47.8441 48.574,47.8441 h 172.5785 c 26.8274,0 48.574,-21.4198 48.574,-47.8441 0,-26.4242 -21.7466,-47.844 -48.574,-47.844 z"
id="path2-3"
style="fill:#ffffff;stroke-width:2.41038"
sodipodi:nodetypes="scccsssscccssssssscssscssssss" />
inkscape:current-layer="svgg"
showgrid="false" />
<g
id="svgg"
transform="matrix(1.1004516,0,0,1.1004516,-254.54545,-254.54545)">
<path
id="path1"
d="m 101.752,78.58 c -0.123,0.322 -0.14,19.178 -0.036,41.903 0.205,44.807 0.029,40.694 2.249,52.642 0.552,2.969 2.606,9.797 3.814,12.675 0.277,0.66 0.913,2.239 1.412,3.509 1.983,5.038 8.65,16.866 10.82,19.195 0.434,0.466 0.789,0.965 0.789,1.11 0,0.145 0.382,0.696 0.849,1.225 0.466,0.528 1.796,2.131 2.954,3.561 3.417,4.219 12.617,12.864 15.955,14.992 0.683,0.435 1.602,1.123 2.042,1.529 1.493,1.375 8.781,5.693 13.2,7.821 6.04,2.909 6.536,3.127 8.695,3.829 1.043,0.339 2.213,0.782 2.6,0.984 0.388,0.202 1.515,0.585 2.505,0.851 0.99,0.267 2.61,0.793 3.6,1.169 l 1.8,0.685 0.102,38.27 0.102,38.27 h 48.792 l 0.102,-38.252 0.102,-38.252 3.8,-1.177 c 2.09,-0.647 4.34,-1.407 5,-1.688 0.66,-0.281 1.83,-0.739 2.6,-1.018 3.645,-1.32 10.945,-4.914 14.166,-6.974 1.237,-0.791 2.337,-1.439 2.445,-1.439 0.353,0 7.532,-5.302 10.189,-7.524 7.969,-6.667 16.786,-16.95 21.328,-24.876 1.679,-2.929 6.272,-12.23 6.272,-12.701 0,-0.239 0.253,-0.944 0.563,-1.567 1.501,-3.019 3.988,-11.239 5.002,-16.532 1.874,-9.789 1.817,-8.155 1.826,-51.6 l 0.009,-41 C 281.2,78.131333 265,78.062667 248.8,77.994 v 35.834 c 0,35.769 -0.219,43.152 -1.42,47.972 -1.461,5.859 -1.435,5.784 -3.823,10.8 -10.364,21.773 -35.281,32.691 -58.757,25.748 -3.232,-0.956 -10.962,-4.853 -12.32,-6.211 -0.295,-0.295 -0.67,-0.537 -0.833,-0.537 -0.163,0 -0.651,-0.315 -1.085,-0.7 -0.434,-0.385 -1.728,-1.475 -2.875,-2.423 -3.453,-2.853 -9.687,-9.995 -9.687,-11.097 0,-0.129 -0.45,-0.823 -1,-1.544 -0.55,-0.722 -1,-1.472 -1,-1.667 0,-0.196 -0.482,-1.349 -1.071,-2.563 -1.738,-3.58 -2.511,-5.857 -3.262,-9.606 -0.242,-1.21 -0.562,-2.74 -0.71,-3.4 -0.149,-0.66 -0.38,-19.02 -0.514,-40.8 L 150.2,78.2 126.089,78.097 c -20.873,-0.089 -24.142,-0.025 -24.337,0.483"
stroke="none"
fill="#ebebeb"
fill-rule="evenodd"
sodipodi:nodetypes="cccsccsccccccccccccccccsccsccscccccscccssscscsccccccc" />
<path
id="path2"
d="M 99.206,80.016 C 63.451924,120.81099 31.751659,160.16447 0.5,195.438 0.103,195.839 0,216.885 0,297.971 V 400 h 80 c 52.658,0 80,-0.136 80,-0.397 17.9137,-22.48491 38.5951,-44.62504 54.871,-64.603 2.63454,-3.7258 7.40036,-7.49564 8.766,-11.123 -0.356,-0.356 -6.6,-0.505 -24.657,-0.586 l -24.18,-0.109 v -38.391 c 0,-36.297 -0.038,-38.391 -0.7,-38.389 -0.748,0.002 -4.243,-1.067 -5.395,-1.65 -0.382,-0.194 -0.96,-0.352 -1.286,-0.352 -0.326,0 -1.273,-0.295 -2.105,-0.655 -0.833,-0.361 -1.874,-0.786 -2.314,-0.946 -2.954,-1.071 -10.196,-4.633 -13.684,-6.729 -10.252,-6.162 -19.339,-14.009 -26.732,-23.086 -2.454,-3.013 -5.784,-7.721 -5.784,-8.178 0,-0.223 -0.168,-0.406 -0.373,-0.406 -0.205,0 -0.499,-0.405 -0.654,-0.9 -0.154,-0.495 -0.392,-0.99 -0.527,-1.1 -0.284,-0.231 -1.201,-1.853 -2.753,-4.874 -0.601,-1.169 -1.228,-2.186 -1.393,-2.259 -0.165,-0.074 -0.3,-0.341 -0.3,-0.595 0,-0.253 -0.432,-1.363 -0.96,-2.466 -0.528,-1.103 -1.257,-2.726 -1.62,-3.606 -0.362,-0.88 -0.83,-1.913 -1.039,-2.295 -0.21,-0.382 -0.381,-1.057 -0.381,-1.5 0,-0.443 -0.15,-0.805 -0.333,-0.805 -0.298,0 -0.941,-2.034 -1.519,-4.8 -0.114,-0.55 -0.376,-1.36 -0.581,-1.8 -0.608,-1.307 -1.454,-5.612 -2.633,-13.4 -0.535,-3.535 -0.675,-10.658 -0.885,-44.984 L 100.6,78.232 99.206,80.016"
stroke="none"
fill="#3c546c"
fill-rule="evenodd"
sodipodi:nodetypes="ccscscccccsccscccsssccccssccsscccccc" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="svg"
version="1.1"
width="400"
height="400"
viewBox="-254.545454545, -254.545454545, 654.545454545,654.545454545"
sodipodi:docname="logo_monochrome.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="2.0788939"
inkscape:cx="212.13204"
inkscape:cy="211.65101"
inkscape:window-width="2560"
inkscape:window-height="1374"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg" />
<g
id="svgg"
transform="matrix(0.95442112,0,0,0.95442112,-117.70251,-118.53586)">
<path
id="path1"
d="m 101.752,78.58 c -0.123,0.322 -0.14,19.178 -0.036,41.903 0.205,44.807 0.029,40.694 2.249,52.642 0.552,2.969 2.606,9.797 3.814,12.675 0.277,0.66 0.913,2.239 1.412,3.509 1.983,5.038 8.65,16.866 10.82,19.195 0.434,0.466 0.789,0.965 0.789,1.11 0,0.145 0.382,0.696 0.849,1.225 0.466,0.528 1.796,2.131 2.954,3.561 3.417,4.219 12.617,12.864 15.955,14.992 0.683,0.435 1.602,1.123 2.042,1.529 1.493,1.375 8.781,5.693 13.2,7.821 6.04,2.909 6.536,3.127 8.695,3.829 1.043,0.339 2.213,0.782 2.6,0.984 0.388,0.202 1.515,0.585 2.505,0.851 0.99,0.267 2.61,0.793 3.6,1.169 l 1.8,0.685 0.102,38.27 0.102,38.27 h 24.396 24.396 l 0.102,-38.252 0.102,-38.252 3.8,-1.177 c 2.09,-0.647 4.34,-1.407 5,-1.688 0.66,-0.281 1.83,-0.739 2.6,-1.018 3.645,-1.32 10.945,-4.914 14.166,-6.974 1.237,-0.791 2.337,-1.439 2.445,-1.439 0.353,0 7.532,-5.302 10.189,-7.524 7.969,-6.667 16.786,-16.95 21.328,-24.876 1.679,-2.929 6.272,-12.23 6.272,-12.701 0,-0.239 0.253,-0.944 0.563,-1.567 1.501,-3.019 3.988,-11.239 5.002,-16.532 1.874,-9.789 1.817,-8.155 1.826,-51.6 l 0.009,-41 -24.3,-0.103 -24.3,-0.103 v 35.834 c 0,35.769 -0.219,43.152 -1.42,47.972 -1.461,5.859 -1.435,5.784 -3.823,10.8 -10.364,21.773 -35.281,32.691 -58.757,25.748 -3.232,-0.956 -10.962,-4.853 -12.32,-6.211 -0.295,-0.295 -0.67,-0.537 -0.833,-0.537 -0.163,0 -0.651,-0.315 -1.085,-0.7 -0.434,-0.385 -1.728,-1.475 -2.875,-2.423 -3.453,-2.853 -9.687,-9.995 -9.687,-11.097 0,-0.129 -0.45,-0.823 -1,-1.544 -0.55,-0.722 -1,-1.472 -1,-1.667 0,-0.196 -0.482,-1.349 -1.071,-2.563 -1.738,-3.58 -2.511,-5.857 -3.262,-9.606 -0.242,-1.21 -0.562,-2.74 -0.71,-3.4 -0.149,-0.66 -0.38,-19.02 -0.514,-40.8 L 150.2,78.2 126.089,78.097 c -20.873,-0.089 -24.142,-0.025 -24.337,0.483"
stroke="none"
fill="#ebebeb"
fill-rule="evenodd" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -8,7 +8,7 @@ namespace Platform {
const char * languageCode() {
static char buffer[3] = {0};
char * locale = setlocale(LC_ALL, "");
if (locale[2] == '_') {
if (locale && locale[2] == '_') { // Check if locale is not null before accessing its elements
buffer[0] = locale[0];
buffer[1] = locale[1];
return buffer;

View File

@@ -11,13 +11,30 @@ ion_src += $(addprefix ion/src/simulator/shared/, \
dummy/keyboard_callback.cpp \
dummy/window_callback.cpp \
clipboard_helper.cpp \
collect_registers_x86_64.s \
collect_registers.cpp \
haptics.cpp \
journal.cpp \
store_script.cpp \
)
# Include architecture-specific assembly files
# When building for a specific architecture (via ARCH variable)
ifdef ARCH
ifeq ($(ARCH),arm64)
ion_src += ion/src/simulator/shared/collect_registers_arm64.s
else
ion_src += ion/src/simulator/shared/collect_registers_x86_64.s
endif
else
# When building universal binary, include both
ifneq ($(filter arm64,$(ARCHS)),)
ion_src += ion/src/simulator/shared/collect_registers_arm64.s
endif
ifneq ($(filter x86_64,$(ARCHS)),)
ion_src += ion/src/simulator/shared/collect_registers_x86_64.s
endif
endif
ifeq ($(EPSILON_TELEMETRY),1)
ion_src += ion/src/simulator/shared/dummy/telemetry_init.cpp
ion_src += ion/src/shared/telemetry_console.cpp

View File

@@ -39,7 +39,7 @@ SIMULATOR_ICONS = $(addprefix $(SIMULATOR_ICONSET)/,$(addsuffix .png,$(addprefix
$(addprefix $(SIMULATOR_ICONSET)/,icon_%.png): ion/src/simulator/assets/logoMacOS.png | $$(@D)/.
$(call rule_label,CONVERT)
$(Q) convert -background "#FFB734" -resize $* $< $@
$(Q) magick $< -background "#FFB734" -resize $* $@
# Export simulator app dependencies

View File

@@ -0,0 +1,21 @@
.text
.global _collect_registers
_collect_registers:
// Save callee-saved registers to the buffer pointed by x0
// ARM64 callee-saved registers: x19-x28, x29 (fp), x30 (lr), sp
stp x19, x20, [x0, #0]
stp x21, x22, [x0, #16]
stp x23, x24, [x0, #32]
stp x25, x26, [x0, #48]
stp x27, x28, [x0, #64]
stp x29, x30, [x0, #80]
// Save stack pointer
mov x1, sp
str x1, [x0, #96]
// Return current stack pointer
mov x0, sp
ret

View File

@@ -26,7 +26,7 @@ void shutdown() {
void rumble() {
if (sSDLHaptic && isEnabled()) {
SDL_HapticRumblePlay(sSDLHaptic, 1.0, 40);
SDL_HapticRumblePlay(sSDLHaptic, 1.0, 1);
}
}

Some files were not shown because too many files have changed in this diff Show More