Compare commits

..

197 Commits

Author SHA1 Message Date
M4x1m3
5a6dfd8a20 [ci] Remove duplicate tests action 2021-07-07 12:09:08 +02:00
Hyperengined
c8afdcacab [ion/battery] Doubled hysteresis to avoid sudden fluctuactions 2021-07-07 11:49:19 +02:00
Fevret
ef45fab63d [themes] Improved epsilon-dark icons 2021-07-07 11:43:14 +02:00
Laury
0366c4cd00 [home] Added support for a wallpaper in a special format (.obm) 2021-07-06 16:48:57 +02:00
Maxime FRIESS
c3b752d6cc Merge pull request #544 from ArtichOwO/omega-dev-OS-attributes
[MPY/MOD/OS] Added new function and attribute to OS module
2021-06-29 21:06:11 +02:00
Maxime FRIESS
c5ca1e916a Merge branch 'omega-dev' into omega-dev-OS-attributes 2021-06-29 20:52:29 +02:00
ArtichOwO
24f3ccf007 Removed username from "uname()", and "getlogin()" now uses "Ion::username()" 2021-06-29 20:41:12 +02:00
ArtichOwO
25b74ea2f8 Removed "Omega or Epsilon" check 2021-06-29 20:40:19 +02:00
Maxime FRIESS
0e7db3ce8a Merge pull request #548 from Pixelpunker/omega-dev
Some corrections and many additions to German translation, mostly Python toolbox
2021-06-29 17:52:45 +02:00
Pixelpunker
786a3273da All translated german strings limited to 35 characters 2021-06-29 17:11:10 +02:00
Pixelpunker
ed54927c5b Fix for 4 translation keys 2021-06-28 16:41:40 +02:00
Pixelpunker
2ee86ce52f Fix build error "BetaVersionMessage4" 2021-06-28 16:31:52 +02:00
Pixelpunker
a3720d3d76 Some corrections and many additions to German translation, mostly Python toolbox 2021-06-28 16:09:49 +02:00
ArtichOwO
ba94c7db00 [Code/Toolbox] Added "getlogin()" to code toolbox 2021-06-21 23:24:50 +02:00
ArtichOwO
4c29b05b53 [MPY/MOD/OS] Added "name" attribute, "getlogin()" function and "username" key in "uname()"
"os.name" returns either "Omega" (only if OMEGA_VERSION is defined) or "Epsilon"
"os.getlogin()" returns the calculator owner username
"os.uname()" returns an object which has now the "username" attribute
2021-06-21 19:34:26 +02:00
Maxime FRIESS
85f8f4fedd Merge pull request #538 from RedGl0w/omegaV15-5
Omega with epsilon 15.5
2021-06-20 22:22:26 +02:00
Maxime FRIESS
e62c328661 Merge pull request #536 from RedGl0w/omegaFixCI
[code/tests] Fix issue with toolboxIonKeys
2021-05-27 18:55:16 +02:00
Joachim LF
080ac51aae [Simulator/android] Fix language auto selection 2021-05-15 09:19:01 +02:00
Joachim LF
bf5f24f96c [Simulator/windows] Fix deleted file 2021-05-14 21:10:47 +02:00
Joachim LF
7e24502414 [Simulator] Use std::cout and added dummy store_script 2021-05-14 20:04:59 +02:00
Joachim LF
dd45419006 [Simulator/windows] fix build 2021-05-14 19:45:57 +02:00
Joachim LF
aba2388253 [Ion/web] Fix build 2021-05-14 19:41:37 +02:00
Joachim LF
5fca77a8f8 [Build] Disable telemetry 2021-05-14 14:18:10 +02:00
Joachim LF
f258da16f1 [Build] revert binpack move 2021-05-14 14:16:41 +02:00
Joachim LF
35e4146551 [Workflow/unit] change target name 2021-05-14 13:35:44 +02:00
Joachim LF
76dad83aec [n0110] Disable OTP lock 2021-05-14 13:29:49 +02:00
Joachim LF
f999c796c3 [Upstream] Merged epsilon 15.5 2021-05-14 13:28:22 +02:00
Maxime FRIESS
f86c22f10b Merge pull request #528 from RedGl0w/patch-20
Delete .gitlab-ci.yml
2021-05-12 23:58:36 +02:00
Maxime FRIESS
c841362a63 Merge pull request #535 from RedGl0w/fixLocalization
[shared/localization] Fix theme palette
2021-05-12 23:55:35 +02:00
Joachim LF
33ad74e1be [code/tests] Fix issue with toolboxIonKeys 2021-05-12 19:56:34 +02:00
Joachim Le Fournis
e4aa82e62a [shared/localization] Fix theme palette
this fixes https://github.com/Omega-Numworks/Omega/issues/534
2021-05-12 12:06:18 +02:00
Joachim Le Fournis
f40fe27b68 Delete .gitlab-ci.yml 2021-04-26 12:09:58 +02:00
Gabriel Ozouf
3e071a59fe build: Version 15.5.0 2021-04-16 10:53:34 +02:00
Gabriel Ozouf
f50f22081c [apps/main] Move lockUnlockedPCBVersion to ion_main
Although we always include the on-boarding when releasing a firmware,
moving this method here costs nothing and prevents mistakes if we ever
decide to remove on-boarding.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
313b5ed222 [apps/settings] Add comment on version cycle display 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
f8798aa561 [ion] Move pcbVersion method to its own file 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
46acd4eb61 [ion/device/n0110/internal_flash] Add method OTPLockAddress 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
018ea07796 [ion/device] Add comments and rename variables for clarity 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
d7f41e306c [ion/device/n0100] Add comment on dummy PCB version methods 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
029dc2be5e [build/targets.device.n0110] Move flag before target
This is in keeping with the order set up in build/all.mak.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
bf99a2976b [build] Improve comments 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
03c85c0b0e [ion/device/external_flash] Move model specific code
As the N0100 does not have an external flash chip, the code to handle
the external flash does not need to be compiled on this model.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
bd0c7de2bf [ion] Create method to lock PCB versions on old boards 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
08f351fe31 [settings] Add PCB version to software version / patch level cycle 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
0282104086 [ion] Add getter method for PCB version in string form 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
ed95b46c5b [build/n0110] Set PCB_LATEST to proper PCB version 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
b8727bc256 [ion/device] Rename some PCB version methods 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
5ccf8d6b97 [ion/device/external_flash] Add dsb instruction in method wait
This mimics the behavior of InternalFlash::wait, and fixes a bug found
on the bench when reading the flashed firmware.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
b80daf70d3 [ion/device/n0110/usb] Consolidate configs of Vbus pin
Even though the configuration of the Vbus pin depends on the hardware
running Epsilon, we do not actually need one VbusPin object for each
configuration. Indeed, an AFGPIOPin object can be used to configure the
pin as a standard GPIO, provided one does not call its init() method.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
36655f1c19 [ion/device/n0110] Change getter for OTPAddress 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
ed18f1e95f [ion/device] Lock OTP after writing version 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
cbb435d656 [ion/device] Adapt behaviour in factory
When flashing fo the first time, we need Epsilon to know the PCB version
before the OTP are flashed. We also need the to prevent Epsilon from
writing the OTP outside of the factory.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
00b74430cd [build] Add mendatory USE_IN_FACTORY variable to binpack rule
This variable specifies whether the binpack is used for first-time
flashing on assembly-line, or for diagnostic later on.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
8705ddaf8a [ion/device/bench] Add command to write and validate PCB version 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
ddae6607f9 [ion/device/n0110] Deduce Vbus config from PCB version
Revised PCB (version number > 0) should configure Vbus as a GPIO instead
of an alternate function.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
c4ef2016ba [ion/device/n0110] Methods to read and write PCB version in OTP 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
524a7d9619 [ion/device/n0110] Define OTP blocks in internal flash 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
e456667d5e [ion/device] Add parameter PCB_LATEST
This indicates the latest PCB revision on which this version of Epsilon
can run.
2021-04-16 10:46:10 +02:00
Léa Saviot
3000431f3b build: Version 15.3.6 2021-03-29 10:20:17 +02:00
Léa Saviot
50a32b470d [ion/drivers/external_flash] Remove assertion unvalid on n0100 2021-03-29 10:20:17 +02:00
Léa Saviot
3746354f26 [ion/external_flash] Code cleaning 2021-03-29 09:55:00 +02:00
Léa Saviot
8fae36bcd3 [ion/external_flash] Use both possible commands for QuadPageProgram 2021-03-29 09:55:00 +02:00
Léa Saviot
9e9c088e9e [ion/external_flash] Code cleaning 2021-03-29 09:55:00 +02:00
Léa Saviot
a635ecf59b [ion/external_flash] Make the AT25SF641B work
Main changes are:
- No QPI but QuadSPI
- Use 32 command instead of 33
- Better programming of the instruction/address/data modes, according to
the 641B spec
- Use sOperatingMode instead of DefaultOperatingMode

TODO:
- Support both QPI and QuadSPI, for both flashs
- There is still confusion between sOperatingMode and DefaultOperatingMode
  -> DefaultOperatingMode should not really be used
  -> Read and write commands assume quad operation
2021-03-29 09:55:00 +02:00
Hugo Saint-Vignes
a6ae1957d1 build: Version 15.3.5
Change-Id: I79e237766ba64f1e14b8e2889611153437ee6775
2021-03-24 10:49:08 +01:00
Hugo Saint-Vignes
3686f819d6 [ion/src/simulator] Add headers and fix Macros for iOS
Change-Id: I0f1f888e4823fc9a80a7ac986cf8732dc9df2998
2021-03-24 10:12:11 +01:00
Hugo Saint-Vignes
382c303bd2 [build] Update EPSILON_TELEMETRY variable precedence 2021-03-23 14:49:09 +01:00
Hugo Saint-Vignes
402858739e [ion/simulator/android] Fix method signature
Change-Id: I7ac83b8b3a4eca82313e9de3e3d9f5a76ff92951
2021-03-23 14:48:40 +01:00
Hugo Saint-Vignes
192794e299 [ion/simulator/android] Delete JNI local references in platform_language.cpp
Change-Id: I28251ec57ed0c87922efc2689f587f6bc0daaa76
2021-03-23 14:48:29 +01:00
M4x1m3
44d745eff3 [apps] Updates atomic 2021-03-21 20:24:23 +01:00
Cyprien Méjat
4e7a846540 [config.mak] Dev Branch 1.22 incrementation (#517) 2021-03-21 18:24:46 +01:00
M4x1m3
a35fb141c4 [ion] Made username volatile
This ensures the compiler doesn't assume that the username is fixed, allowing
us top change it before flashing, to let the user change his username.
2021-03-20 20:14:12 +01:00
Léa Saviot
58602544e2 build: Version 15.3.4 2021-03-17 09:52:00 +01:00
Cyprien Méjat
4242c77d64 [themes] Omega Atomic dark theme (#516)
* update dark mode in atomic

* Fix mistake

* update atomic epsilon dark
2021-03-16 23:55:44 +01:00
M4x1m3
f1d15022aa [apps/code] Removed keys from HU catalog 2021-03-15 21:46:56 +01:00
Maxime FRIESS
fc3986f65a Merge pull request #513 from RedGl0w/IonToolboxEpsilon
[Code] Added ion keys submenu
2021-03-15 21:42:50 +01:00
Maxime FRIESS
b795834c63 Merge branch 'omega-dev' into IonToolboxEpsilon 2021-03-15 21:23:35 +01:00
M4x1m3
9c8112658e Fixed device build 2021-03-15 21:05:52 +01:00
Maxime FRIESS
ed86abebde Merge pull request #511 from RedGl0w/strcmp
Strcmp
2021-03-15 20:49:52 +01:00
M4x1m3
671321db10 Merge branch 'RedGl0w-kmat' into omega-dev 2021-03-15 20:48:54 +01:00
M4x1m3
3ccd7d0fb7 Merge branch 'kmat' of https://github.com/RedGl0w/epsilon into RedGl0w-kmat 2021-03-15 20:48:43 +01:00
Maxime FRIESS
4f34cd17a1 Merge pull request #510 from RedGl0w/patch-12
[Calculation/expression_field] EE add Ans
2021-03-15 20:28:00 +01:00
M4x1m3
5cd22c9429 Merge branch '0b101-epsilon-appShortcuts' into omega-dev 2021-03-15 20:24:45 +01:00
M4x1m3
893539b76e Merge branch 'epsilon-appShortcuts' of https://github.com/0b101/Omega into 0b101-epsilon-appShortcuts 2021-03-15 20:24:33 +01:00
Joachim LF
b2e2f3c5a6 [Code] Added ion keys submenu 2021-03-15 20:10:54 +01:00
Maxime FRIESS
48ec836129 Merge pull request #508 from RedGl0w/CRLF
[Ion/clipboard] Remove CR when there's LF next
2021-03-15 19:52:51 +01:00
M4x1m3
3d320b2768 Merge branch 'Lauryy06-master' into omega-dev 2021-03-15 19:50:33 +01:00
M4x1m3
134456267b Merge branch 'master' of https://github.com/Lauryy06/epsilon into Lauryy06-master 2021-03-15 19:50:10 +01:00
Maxime FRIESS
d2df42bc35 Merge pull request #506 from RedGl0w/DrawStringFont
Draw string font
2021-03-15 19:34:39 +01:00
Maxime FRIESS
20d7094352 Merge branch 'omega-dev' into DrawStringFont 2021-03-15 19:31:16 +01:00
Maxime FRIESS
d95b50abef Merge pull request #505 from numworks/master
Pull epsilon master
2021-03-15 19:29:12 +01:00
M4x1m3
ed03aae9ed [apps] Fixed missing dynamically-generated dependency 2021-03-15 17:29:37 +01:00
Maxime FRIESS
32f567c60a Merge pull request #504 from quentinguidee/omega-dev-atomic-theme
[themes] Change Atomic app theme
2021-03-13 23:55:47 +01:00
Quentin Guidée
83e6fc9579 [themes] Change atomic theme 2021-03-13 23:43:45 +01:00
M4x1m3
73585d9f48 Changed from Atom to Atomic in README 2021-03-12 18:16:12 +01:00
M4x1m3
8a400b7871 Updated atomic 2021-03-12 18:11:46 +01:00
Laury
297fbd3c00 [python] Add a draw_line function in kandinsky 2021-03-11 19:47:22 +01:00
Léa Saviot
ece6aa5f27 [build/targets.simulator.web.mak] Rule for htmlpack.official.zip 2021-03-10 11:49:57 +01:00
Joachim LF
8feb8e3ea2 [Python/kandinsky] Added font constant 2021-03-08 18:03:15 +01:00
Joachim LF
7b57f31fbf [Python/kandinsky] Added in draw_string choice of font 2021-03-08 17:56:49 +01:00
Émilie Feral
6b8db108d2 [build] Add comment to dfu.py 2021-03-08 10:53:01 +01:00
Joachim LF
cf8ecfb438 [pyUSB] Update to V1.1.1 a54ebc7 2021-03-08 10:53:01 +01:00
Joachim LF
5605515fa1 [Ion/clipboard] Remove CR when there's LF next 2021-03-05 10:42:15 +01:00
Romain Goyet
30cfa022d1 [ion] Don't set the window title when screen only
Prevents the web simulator from overriding the HTML page's title
2021-03-03 12:37:15 -05:00
Léa Saviot
23f3407267 build: Version 15.3.3 2021-03-03 15:59:44 +01:00
Léa Saviot
1006b951b9 [ion/src/simulator] Fix journal.cpp 2021-03-03 15:37:57 +01:00
Romain Goyet
43b7f767ee [ion/simulator/web] Clean the htmlpack API 2021-03-03 15:37:57 +01:00
Romain Goyet
eb0ca7b118 [ion/simulator/web] Add a loader 2021-03-03 15:37:57 +01:00
Romain Goyet
0cdfc44c6f [ion/simulator/web] Improve dependency tracking 2021-03-03 15:37:57 +01:00
Romain Goyet
2ebff40c62 [ion/simulator/web] Implement a custom journal with callbacks
This journal adds two new callbacks:
 - onIonEvent
 - onEpsilonIdle
2021-03-03 15:37:57 +01:00
Romain Goyet
c66db8c98d [ion] Actually send None events to the destination journal
Said journal will most likely ignore it, but it gives it the opporunity
to do something about it.
2021-03-03 15:37:57 +01:00
Romain Goyet
a6b13185ab [ion/simulator] Extrude the QueueJournal class 2021-03-03 15:37:57 +01:00
Romain Goyet
e8956f4293 [build/simulator/web] Add a htmlpack target 2021-03-03 15:37:57 +01:00
Romain Goyet
36a40faaaf [build/emscripten] Silence the Emterpreter warning 2021-03-03 15:37:57 +01:00
Romain Goyet
2554ec666e [build] Add a rule to build a ZIP file out of its dependencies 2021-03-03 15:37:57 +01:00
Romain Goyet
1aac2a1d4d [ion/simulator/web] Use a shared layout.json file 2021-03-03 15:37:57 +01:00
Romain Goyet
32d591317b [simulator/web] Use specialHTMLTargets to allow picking a canvas 2021-03-03 15:37:57 +01:00
Romain Goyet
2703f9a506 [build] Add prerequisite path when processing through CPP 2021-03-03 15:37:57 +01:00
Romain Goyet
497e4890b1 [ion/simulator/web] Fix the build 2021-03-03 15:37:48 +01:00
Romain Goyet
6c389c9a1d [ion/simulator] Get rid of useless Ion:: prefixes 2021-03-03 15:37:48 +01:00
Romain Goyet
699cf22023 [ion/simulator] Don't enable the framebuffer in headless mode
A quick test on a state file with 64k events took 2.5 seconds to process
with the framebuffer vs 1.9 without.
2021-03-03 15:37:48 +01:00
Romain Goyet
543d3d540e [ion/simulator] Use shutdown instead of quit 2021-03-03 15:37:48 +01:00
Romain Goyet
2f2e45a6a5 [ion/simulator] Headless simulator maps Ion::Console to stdio 2021-03-03 15:37:48 +01:00
Romain Goyet
a834c954b8 [ion/simulator] Get rid of the headless target 2021-03-03 15:37:48 +01:00
Romain Goyet
2bee7eb267 [ion] Make Ion::Events::Journal optional 2021-03-03 15:37:48 +01:00
Romain Goyet
6d18c33068 [ion/simulator] State files can have a wildcard version 2021-03-03 15:37:48 +01:00
Romain Goyet
8242113641 [ion/simulator] Ignore invalid events in nws files 2021-03-03 15:37:48 +01:00
Romain Goyet
7c8c7f79f6 [ion/simulator] Don't leak file descriptors 2021-03-03 15:37:48 +01:00
Romain Goyet
f578c24af1 [ion/simulator] Used buffer I/O
Avoid making a syscall for every single byte
2021-03-03 15:37:48 +01:00
Romain Goyet
8059821025 [ion/simulator] Fix libpng/libjpeg usage 2021-03-03 15:37:48 +01:00
Romain Goyet
b32497da23 [ion/simulator] Remove a useless printf 2021-03-03 15:37:48 +01:00
Romain Goyet
c3c7651ca8 [ion/simulator] Add Termination event when headless 2021-03-03 15:37:48 +01:00
Romain Goyet
e8f1ea6aa5 [ion/simulator/sdl] Backport an Emscripten fix for setWindowTitle
See https://bugzilla.libsdl.org/show_bug.cgi?id=5133
2021-03-03 15:37:48 +01:00
Romain Goyet
ba3109e47a [ion/simulator] Fix the dummy language implementation 2021-03-03 15:37:48 +01:00
Romain Goyet
c2f8bbaf3c [ion/simulator] Load nws files sent from the host OS 2021-03-03 15:37:48 +01:00
Romain Goyet
0587e41b3c [ion/simulator] Support writing image files per-platform
Linux uses libpng, macOS/iOS use CoreGraphics, Windows GDI+
2021-03-03 15:37:48 +01:00
Romain Goyet
ab1df4fbef [ion/simulator] Unify iOS/macOS image loading 2021-03-03 15:37:48 +01:00
Romain Goyet
a4213dcca8 [ion/simulator] Allow "-" to designate stdin 2021-03-03 15:37:48 +01:00
Romain Goyet
2cf6f15dde [ion/simulator] Allow CTRL or GUI for common shortcuts 2021-03-03 15:37:48 +01:00
Romain Goyet
f37008d8d7 [ion/simulator] Ignore empty cli arguments 2021-03-03 15:37:48 +01:00
Romain Goyet
3740e0f135 [ion/simulator] Support headless msleep 2021-03-03 15:37:48 +01:00
Romain Goyet
cb3a6694a5 [ion/simulator/macos] Register the nws file extension 2021-03-03 15:37:48 +01:00
Romain Goyet
cba596dde7 [ion/simulator] Add actions 2021-03-03 15:37:48 +01:00
Romain Goyet
11f2b92e5d [ion/simulator/windows] Add an icon 2021-03-03 15:37:48 +01:00
Romain Goyet
a69fc679a9 [ion/simulator] Add StateFile support 2021-03-03 15:37:48 +01:00
Romain Goyet
f4905c59a2 [ion] Events::Journal has isEmpty 2021-03-03 15:37:47 +01:00
Romain Goyet
22b6990e63 [ion/simulator/android] Get the language directly
Without using the "--language" command-line option
2021-03-03 15:37:47 +01:00
Romain Goyet
09a7b9daca [ion/simulator] Sort the platform functions 2021-03-03 15:37:47 +01:00
Romain Goyet
0116dc2e07 [ion/simulator] Add a runtime "--headless" option
We probably can ditch the static headless version
2021-03-03 15:37:47 +01:00
Romain Goyet
37b8c56b3d [ion/simulator] Clean the callbacks 2021-03-03 15:37:47 +01:00
Romain Goyet
1a4cb3ad37 [ion/simulator] Add a Journal implementation 2021-03-03 15:37:47 +01:00
Romain Goyet
d4984722cf [ion/simulator] Rename the events_platform file 2021-03-03 15:37:47 +01:00
Romain Goyet
cbc3951ab1 [ion] Add an event journal
It's pretty much just two callbacks that one can hook into to get some
events in or out of Ion.

It adds a couple useless checks and pointers to any build and could be
hidden behind a feature flag, but the extra weight is minimal.
2021-03-03 15:37:47 +01:00
Romain Goyet
62aafa7597 [ion] Fix a comment 2021-03-03 15:37:47 +01:00
Romain Goyet
baf8b8cbf0 [ion/simulator] Clean the Keyboard implementation 2021-03-03 15:37:47 +01:00
Romain Goyet
90b25ecf51 [ion] Clean some dummy files 2021-03-03 15:37:47 +01:00
Romain Goyet
d02ce2dd16 [ion] Sort dummy functions
Dummy Ion-level functions should be in the top-level shared folder. And
dummy functions for simulator headers should be in the simulator folder.
2021-03-03 15:37:47 +01:00
Romain Goyet
79985a0199 [ion/simulator] Proper argument parsing 2021-03-03 15:37:47 +01:00
Romain Goyet
f10cd19616 [ion/simulator] Factorize the main function 2021-03-03 15:37:47 +01:00
Romain Goyet
945a7b8d56 [ion/simulator] Add a Window namespace 2021-03-03 15:37:47 +01:00
Romain Goyet
784234690c [ion/simulator] Sort Ion::Timing::msleep implementations 2021-03-03 15:37:47 +01:00
Romain Goyet
fd0284756f [apps] Simplify locale lookup by code 2021-03-03 15:37:47 +01:00
Yolwoocle
ca6a0bdcb6 [apps/code] Fix French translation mistakes (#500)
Corrected a few French translation issues in Python catalogue (lis -> lit; écris -> écrit)
2021-03-03 09:19:59 +01:00
Maxime FRIESS
35c4c7fa2e Merge pull request #499 from M4xi1m3/patch-151
Fixed issues with settings
2021-03-02 16:31:53 +01:00
M4x1m3
b08f793776 [apps/settings] Fix #151 2021-03-02 16:16:23 +01:00
M4x1m3
9f380bf424 [apps/settings] Fixed broken about submenu 2021-03-02 16:09:09 +01:00
Joachim Le Fournis
d7f7bbe862 [Inliner] Use png_destroy_read_struct 2021-03-02 09:56:10 +01:00
Joachim Le Fournis
4718ff8016 [Inliner] Fixed memory leak 2021-03-02 09:56:10 +01:00
Maxime FRIESS
a25ebc516a Merge pull request #498 from A2drien/credit-name
Update contributor and tester names (Omega 1.21)
2021-03-01 23:19:12 +01:00
A2drien
cabc1a9564 credit name update 2021-03-01 23:12:20 +01:00
Maxime FRIESS
acd80f06ed Merge pull request #495 from M4xi1m3/omega-atomic
[apps] Replaced atom with atomic
2021-03-01 21:52:37 +01:00
M4x1m3
c988233b84 [apps] Replaced atom with atomic 2021-03-01 20:10:58 +01:00
Maxime FRIESS
b3bba17306 Merge pull request #469 from RedGl0w/omegaSingleQuote
[Poincare/parser] support ' as derivative
2021-03-01 13:55:27 +01:00
Maxime FRIESS
668bd6ba48 Merge pull request #491 from RedGl0w/omegaUsernameHidden
[Settings] Always compile with empty username, and don't dipslay
2021-03-01 13:40:28 +01:00
Maxime FRIESS
af1be64644 Merge pull request #474 from M4xi1m3/units
Fixed python in debug and -j build issues
2021-02-28 09:38:02 +01:00
Maxime FRIESS
ea71a83143 Merge pull request #493 from M4xi1m3/patch-492
[external] Fixed #492
2021-02-27 23:52:04 +01:00
M4x1m3
30f1d8464c [external] Fixed #492 2021-02-27 23:42:06 +01:00
Joachim LF
6072307e34 [Settings] Always compile with empty username, and don't dipslay 2021-02-26 08:19:50 +01:00
Maxime FRIESS
4926e273ed Merge pull request #479 from Calvineries/omega-dev
ScriptSize French Translation
2021-02-25 15:25:28 +01:00
Maxime FRIESS
27ea26b03f Merge pull request #490 from M4xi1m3/jni-crash
[ion/android] Fix #489
2021-02-25 11:19:36 +01:00
M4x1m3
f274b34939 [ion/android] Fix #489 2021-02-25 10:00:44 +01:00
Calvineries
1838024934 ScriptSize French Translation 2021-02-17 01:35:01 +01:00
M4x1m3
7c51ab2130 [apps] Fixed build issue when too much cores 2021-02-15 14:57:04 +01:00
M4x1m3
6628b54218 [py] Fixed Illegal Instruction when building in debug 2021-02-15 14:56:41 +01:00
Joachim LF
491c873c90 [Poincare/parser] support ' as derivative 2021-02-12 08:36:57 +01:00
Joachim Le Fournis
37f78c5d4d [makefiles] Fix epsilon_run on windows 2021-02-08 18:02:15 -05:00
Hugo Saint-Vignes
4f2ea99c85 build: Version 15.3.2
Change-Id: I9cf7a21e14ba042d33c06062f922d8c0191adc5c
2021-02-08 10:56:34 +01:00
Hugo Saint-Vignes
bef8719ce0 [simulator/android] Handle getSerialNumber exception
Based on SDL commit :
85c1d40792

Change-Id: Ie6810dae48f5944a515ee016f228ecf33edd8fc4
2021-02-08 10:56:34 +01:00
Hugo Saint-Vignes
ba64458660 [ion/simulator/android] Delete JNI local references
Change-Id: Idd4d6c769786fb595a357bcc3f54e67429ed1840
2021-02-08 10:56:34 +01:00
0b101
aa51661aa7 Added app shortcuts 2021-02-05 16:58:55 -06:00
Hugo Saint-Vignes
73172f8d0c [ion/simulator/android] Add assert, remove TODO
Change-Id: Id818d0cd9a83727171ebe675ee50e35ef64e31d0
2021-02-05 17:51:40 +01:00
Hugo Saint-Vignes
5a20d914df [ion/simulator/android] Fix haptic feedback memory leaks 2021-02-05 17:31:46 +01:00
Hugo Saint-Vignes
05e6fbbcca [ion/simulator/android] Fix haptic feddback type return 2021-02-05 17:31:27 +01:00
Joachim Le Fournis
5f34d07e53 [Calculation/expression_field] EE add Ans 2020-11-05 11:39:29 +01:00
Joachim LF
8e4187fb60 [Poincare] Added kmat() 2020-10-31 10:58:39 +01:00
Joachim LF
a680539b7c [Apps/main] Added comments 2020-10-28 19:49:09 +01:00
Joachim LF
69a708fd1b [Apps/main] Removed strcmp (see #1695) 2020-10-28 19:45:05 +01:00
314 changed files with 4547 additions and 2713 deletions

View File

@@ -2,26 +2,13 @@
name: Bug report
about: Omega is not working like it should? Let us know!
title: ''
labels: 'Status: Triage, Type: Bug'
labels: Bug, Triage
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
#### Describe the bug
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- Omega Version: [go to settings > about > Omega Version and type the version here]
#### Environment
- Omega Version: {go to settings > about > Omega Version and type the version here}

1
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1 @@
blank_issues_enabled: false

View File

@@ -1,17 +1,10 @@
---
name: Feature request
about: Suggest an idea for Omega
about: Suggest an idea for an improvement of Omega
title: ''
labels: 'Status: Triage, Type: Feature'
labels: Feature, Triage
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Additional context**
Add any other context or screenshots about the feature request here.
#### What I want to see in the next version of Omega

View File

@@ -1,28 +0,0 @@
---
name: OMEGA BETA ONLY - Bug report
about: Omega 1.21 is not working like it should? Let us know!
title: "[BETA-1.21] …"
labels: 'Status: Triage, Type: Bug'
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- Omega Version: [go to settings > about > Omega Version and type the version here]
- Discord username: ..........#....

View File

@@ -1,8 +1,8 @@
---
name: Other
about: A question? A problem?
about: A question? A problem? ...
title: ''
labels: 'Status: Triage'
labels: Triage
assignees: ''
---

View File

@@ -2,18 +2,18 @@
name: Problems during installation
about: Need help to install Omega?
title: ''
labels: 'Status: Triage, Type: Installation issue'
labels: Installation issue, Triage
assignees: ''
---
**Describe the problem**
#### Describe the problem
**Logs**
#### Logs
```
Copy/paste the logs here (If you have some)
```
**Environment**
#### Environment
- Omega Version: {go to settings > about > Omega Version and type the version here}

View File

@@ -129,6 +129,8 @@ jobs:
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
- run: make -j2 PLATFORM=simulator
- run: make -j2 PLATFORM=simulator test.exe
- run: cmd /c output\release\simulator\windows\test.exe --headless
- uses: actions/upload-artifact@master
with:
name: epsilon-windows.exe
@@ -143,6 +145,8 @@ jobs:
with:
submodules: 'recursive'
- 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
- uses: actions/upload-artifact@master
with:
name: epsilon-web.zip
@@ -155,6 +159,8 @@ jobs:
with:
submodules: 'recursive'
- run: make -j2 PLATFORM=simulator
- run: make -j2 PLATFORM=simulator test.bin
- run: output/release/simulator/linux/test.bin --headless
- uses: actions/upload-artifact@master
with:
name: epsilon-linux.bin
@@ -168,6 +174,8 @@ jobs:
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
with:
name: epsilon-macos.zip

View File

@@ -1,14 +0,0 @@
name: Unit tests
on: [pull_request_target]
jobs:
units:
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
with:
submodules: 'recursive'
- run: make -j2 PLATFORM=simulator test.headless.bin
- run: output/release/simulator/linux/test.headless.bin

View File

@@ -1,26 +0,0 @@
image: gcc
stages:
- build
job:build:
stage: build
before_script:
- "echo 'deb http://httpredir.debian.org/debian jessie main contrib \n deb-src http://httpredir.debian.org/debian jessie main contrib \n deb http://httpredir.debian.org/debian jessie-updates main contrib \n deb-src http://httpredir.debian.org/debian jessie-updates main contrib \n deb http://security.debian.org/ jessie/updates main contrib \n deb-src http://security.debian.org/ jessie/updates main contrib ' > /etc/apt/source.list"
- "apt-get update"
- "apt -y install build-essential git imagemagick libx11-dev libxext-dev libfreetype6-dev libpng-dev libjpeg-dev pkg-config fltk1.3-dev gcc-arm-none-eabi nodejs npm"
- "git submodule update --init --recursive"
- "git clone https://github.com/RedGl0w/omega-auto-increment"
- "cd omega-auto-increment"
- "npm i request exeq"
- "PrivateToken=$PrivateToken node index.js"
- "cd .."
script:
- make clean
- make MODEL=n0100 epsilon.bin
artifacts:
paths:
- output/release/device/n0100/epsilon.bin
- omega-auto-increment/version.txt
name: artifact:build:simulator

6
.gitmodules vendored
View File

@@ -1,6 +1,6 @@
[submodule "apps/rpn"]
path = apps/rpn
url = https://github.com/Omega-Numworks/Omega-RPN.git
[submodule "apps/atom"]
path = apps/atom
url = https://github.com/Omega-Numworks/Omega-Atom.git
[submodule "apps/atomic"]
path = apps/atomic
url = https://github.com/Omega-Numworks/Omega-Atomic.git

View File

@@ -1,4 +1,4 @@
<p align="center"><img src="https://user-images.githubusercontent.com/12123721/109067616-08b0d500-76ef-11eb-9e23-78f40c335c18.png" /></p>
<p align="center"><img src="https://github.com/Omega-Numworks/Omega-Design/blob/master/Banners/Omega-Banner-Dev-Branch.png?raw=true" /></p>
<p align="center">
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="cc by-nc-sa 4.0" src="https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-525252.svg?labelColor=292929&logo=creative%20commons&style=for-the-badge" /></a>
@@ -155,7 +155,7 @@ Pour contribuer, merci de lire le [Wiki](https://github.com/Omega-Numworks/Omega
* [Omega Themes](https://github.com/Omega-Numworks/Omega-Themes)
* [Omega Website](https://github.com/Omega-Numworks/Omega-Website)
* [Omega RPN `APP`](https://github.com/Omega-Numworks/Omega-RPN)
* [Omega Atom `APP`](https://github.com/Omega-Numworks/Omega-Atom)
* [Omega Atomic `APP`](https://github.com/Omega-Numworks/Omega-Atomic)
* [Omega Design](https://github.com/Omega-Numworks/Omega-Design)
* [Omega Discord Bot](https://github.com/Omega-Numworks/Omega-Discord-Bot)
* [Omega App Template `BETA`](https://github.com/Omega-Numworks/Omega-App-Template)

View File

@@ -1,4 +1,4 @@
<p align="center"><img src="https://user-images.githubusercontent.com/12123721/109067616-08b0d500-76ef-11eb-9e23-78f40c335c18.png" /></p>
<p align="center"><img src="https://github.com/Omega-Numworks/Omega-Design/blob/master/Banners/Omega-Banner-Dev-Branch.png?raw=true" /></p>
<p align="center">
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="cc by-nc-sa 4.0" src="https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-525252.svg?labelColor=292929&logo=creative%20commons&style=for-the-badge" /></a>
@@ -154,7 +154,7 @@ To contribute, please refer to the [Wiki](https://github.com/Omega-Numworks/Omeg
* [Omega Themes](https://github.com/Omega-Numworks/Omega-Themes)
* [Omega Website](https://github.com/Omega-Numworks/Omega-Website)
* [Omega RPN `APP`](https://github.com/Omega-Numworks/Omega-RPN)
* [Omega Atom `APP`](https://github.com/Omega-Numworks/Omega-Atom)
* [Omega Atomic `APP`](https://github.com/Omega-Numworks/Omega-Atomic)
* [Omega Design](https://github.com/Omega-Numworks/Omega-Design)
* [Omega Discord Bot](https://github.com/Omega-Numworks/Omega-Discord-Bot)
* [Omega App Template `BETA`](https://github.com/Omega-Numworks/Omega-App-Template)

View File

@@ -85,9 +85,6 @@ language_preferences = apps/language_preferences.csv
SFLAGS += -I$(BUILD_DIR)
i18n_files += $(addprefix apps/language_,$(addsuffix .universal.i18n, $(EPSILON_I18N)))
ifeq ($(EPSILON_GETOPT),1)
i18n_files += $(addprefix apps/language_,$(addsuffix _iso6391.universal.i18n, $(EPSILON_I18N)))
endif
i18n_files += $(call i18n_with_universal_for,shared)
i18n_files += $(call i18n_with_universal_for,toolbox)
@@ -97,7 +94,7 @@ $(eval $(call rule_for, \
I18N, \
apps/i18n.cpp, \
$(i18n_files), \
$$(PYTHON) apps/i18n.py --codepoints $(code_points) --countrypreferences $(country_preferences) --languagepreferences $(language_preferences) --header $$(subst .cpp,.h,$$@) --implementation $$@ --locales $$(EPSILON_I18N) --countries $$(EPSILON_COUNTRIES) --files $$^ --generateISO6391locales $$(EPSILON_GETOPT), \
$$(PYTHON) apps/i18n.py --codepoints $(code_points) --countrypreferences $(country_preferences) --languagepreferences $(language_preferences) --header $$(subst .cpp,.h,$$@) --implementation $$@ --locales $$(EPSILON_I18N) --countries $$(EPSILON_COUNTRIES) --files $$^, \
global \
))
@@ -110,8 +107,11 @@ $(BUILD_DIR)/apps/i18n.h: $(BUILD_DIR)/apps/i18n.cpp
$(eval $(call depends_on_image,apps/title_bar_view.cpp,apps/exam_icon.png))
$(call object_for,$(apps_src) $(tests_src)): $(BUILD_DIR)/apps/i18n.h
$(call object_for,$(apps_src) $(tests_src)): $(BUILD_DIR)/apps/home/apps_layout.h
$(call object_for,$(apps_src) $(tests_src)): $(BUILD_DIR)/python/port/genhdr/qstrdefs.generated.h
$(call object_for,$(apps_src)): $(BUILD_DIR)/apps/home/apps_layout.h
apps_tests_src = $(app_calculation_test_src) $(app_code_test_src) $(app_graph_test_src) $(app_probability_test_src) $(app_regression_test_src) $(app_sequence_test_src) $(app_shared_test_src) $(app_statistics_test_src) $(app_settings_test_src) $(app_solver_test_src)
apps_tests_src += $(addprefix apps/,\

View File

@@ -8,6 +8,8 @@
#include <ion/backlight.h>
#include <poincare/preferences.h>
#include <algorithm>
extern "C" {
#include <assert.h>
}
@@ -218,6 +220,13 @@ bool AppsContainer::dispatchEvent(Ion::Events::Event event) {
return didProcessEvent || alphaLockWantsRedraw;
}
static constexpr Ion::Events::Event switch_events[] = {
Ion::Events::ShiftSeven, Ion::Events::ShiftEight, Ion::Events::ShiftNine,
Ion::Events::ShiftFour, Ion::Events::ShiftFive, Ion::Events::ShiftSix,
Ion::Events::ShiftOne, Ion::Events::ShiftTwo, Ion::Events::ShiftThree,
Ion::Events::ShiftZero, Ion::Events::ShiftDot, Ion::Events::ShiftEE
};
bool AppsContainer::processEvent(Ion::Events::Event event) {
// Warning: if the window is dirtied, you need to call window()->redraw()
if (event == Ion::Events::USBPlug) {
@@ -242,6 +251,15 @@ bool AppsContainer::processEvent(Ion::Events::Event event) {
switchTo(appSnapshotAtIndex(1));
return true;
}
for(int i = 0; i < std::min((int) (sizeof(switch_events) / sizeof(Ion::Events::Event)), APPS_CONTAINER_SNAPSHOT_COUNT); i++) {
if (event == switch_events[i]) {
m_window.redraw(true);
switchTo(appSnapshotAtIndex(i+1));
return true;
}
}
if (event == Ion::Events::OnOff) {
suspend(true);
return true;

Submodule apps/atom deleted from 8f710a9d3f

1
apps/atomic Submodule

Submodule apps/atomic added at 64f2e38ed1

View File

@@ -17,7 +17,8 @@ bool ExpressionField::handleEvent(Ion::Events::Event event) {
event == Ion::Events::Power ||
event == Ion::Events::Square ||
event == Ion::Events::Division ||
event == Ion::Events::Sto)) {
event == Ion::Events::Sto ||
event == Ion::Events::EE)) {
handleEventWithText(Poincare::Symbol::k_ans);
}
return(::ExpressionField::handleEvent(event));

View File

@@ -15,6 +15,7 @@ app_code_src = $(addprefix apps/code/,\
sandbox_controller.cpp \
script_name_cell.cpp \
script_parameter_controller.cpp \
toolbox_ion_keys.cpp \
)
app_code_test_src = $(addprefix apps/code/,\
@@ -29,6 +30,7 @@ app_code_test_src = $(addprefix apps/code/,\
tests_src += $(addprefix apps/code/test/,\
variable_box_controller.cpp\
toolbox_ion_keys_dummy.cpp \
)
app_code_src += $(app_code_test_src)

View File

@@ -1,15 +1,15 @@
AddScript = "Skript hinzufügen"
AllowedCharactersaz09 = "Erlaubte Zeichen: a-z, 0-9, _"
Autocomplete = "Autovervollständigung"
AutoImportScript = "Automatischer Import in Konsole"
BuiltinsAndKeywords = "Native Funktionen und Schlüsselwörter"
AutoImportScript = "Automatischer Import in die Konsole"
BuiltinsAndKeywords = "Native Funktionen & Schlüsselwörter"
Console = "Interaktive Konsole"
DeleteScript = "Skript löschen"
DuplicateScript = "Skript duplizieren"
ExecuteScript = "Skript ausführen"
FunctionsAndVariables = "Funktionen und Variablen"
ImportedModulesAndScripts = "Importierte Module und Skripte"
NoWordAvailableHere = "Kein Wort ist hier verfübar."
ScriptInProgress = "Aktuelle Skript"
NoWordAvailableHere = "Hier ist kein Wort verfügbar."
ScriptInProgress = "Aktuelles Skript"
ScriptOptions = "Skriptoptionen"
ScriptSize = "Script size"
ScriptSize = "Skriptgröße"

View File

@@ -12,4 +12,4 @@ ImportedModulesAndScripts = "Modules et scripts importés"
NoWordAvailableHere = "Aucun mot disponible à cet endroit."
ScriptInProgress = "Script en cours"
ScriptOptions = "Options de script"
ScriptSize = "Script size"
ScriptSize = "Taille du script"

View File

@@ -3,220 +3,176 @@ PythonPercent = "Modulo"
Python1J = "Imaginäres i"
PythonLF = "Zeilenvorschub"
PythonTab = "Tabulator"
PythonAmpersand = "Bitweise und"
PythonSymbolExp = "Bitweise exklusiv oder"
PythonVerticalBar = "Bitweise oder"
PythonAmpersand = "Bitweises und"
PythonSymbolExp = "Bitweises exklusives oder"
PythonVerticalBar = "Bitweises oder"
PythonImag = "Imaginärteil von z"
PythonReal = "Realteil von z"
PythonSingleQuote = "Einfaches Anführungszeichen"
PythonAbs = "Absolute/r Wert/Größe"
PythonAcos = "Arkuskosinus"
PythonAcosh = "Hyperbelkosinus"
PythonAppend = "Hängt x an das Ende der Liste"
PythonArrow = "Arrow from (x,y) to (x+dx,y+dy)"
PythonAsin = "Arkussinus"
PythonAsinh = "Hyperbelsinus"
PythonAbs = "Absoluter Wert/Absolute Größe"
PythonAcos = "Bogenkosinus"
PythonAcosh = "Bogenhyperbolischer Kosinus"
PythonAppend = "x an das Ende der Liste anfügen"
PythonArrow = "Pfeil von (x,y) nach (x+dx,y+dy)"
PythonAsin = "Sinusbogen"
PythonAsinh = "Kreisbogen hyperbolischer Sinus"
PythonAtan = "Arkustangens"
PythonAtan2 = "Gib atan(y/x)"
PythonAtan2 = "Rückgabe atan(y/x)"
PythonAtanh = "Hyperbeltangens"
PythonAxis = "Set axes to (xmin,xmax,ymin,ymax)"
PythonBar = "Draw a bar plot with x values"
PythonBin = "Ganzzahl nach binär konvertieren"
PythonCeil = "Aufrundung"
PythonChoice = "Zufallszahl aus der Liste"
PythonClear = "Leere die Liste"
PythonAxis = "Achsen auf (xmin,xmax,ymin,ymax)"
PythonBar = "Balkendiagramm mit x-Werten"
PythonBin = "Ganzzahl in Binärwert umwandeln"
PythonCeil = "Aufrunden"
PythonChoice = "Zufällige Zahl in der Liste"
PythonClear = "Liste leeren"
PythonCmathFunction = "cmath-Modul-Funktionspräfix"
PythonColor = "Definiere eine RGB-Farbe"
PythonColorBlack = "Black color"
PythonColorBlue = "Blue color"
PythonColorBrown = "Brown color"
PythonColorGray = "Gray color"
PythonColorGreen = "Green color"
PythonColorOrange = "Orange color"
PythonColorPink = "Pink color"
PythonColorPurple = "Purple color"
PythonColorRed = "Red color"
PythonColorWhite = "White color"
PythonColorYellow = "Yellow color"
PythonComplex = "a+ib zurückgeben"
PythonCopySign = "x mit dem Vorzeichen von y"
PythonColor = "Eine RGB-Farbe definieren"
PythonColorBlack = "Farbe Schwarz"
PythonColorBlue = "Farbe Blau"
PythonColorBrown = "Farbe Braun"
PythonColorGray = "Farbe Grau"
PythonColorGreen = "Farbe Grün"
PythonColorOrange = "Farbe Orange"
PythonColorPink = "Farbe Rosa"
PythonColorPurple = "Farbe Violett"
PythonColorRed = "Farbe Rot"
PythonColorWhite = "Farbe Weiß"
PythonColorYellow = "Farbe Gelb"
PythonComplex = "Gib a+ib zurück"
PythonCopySign = "Gib x mit Vorzeichen von y zurück"
PythonCos = "Kosinus"
PythonCosh = "Hyperbolic cosine"
PythonCount = "Zählt wie oft x vorkommt"
PythonDegrees = "x von Radian zu Grad umwandeln"
PythonCosh = "Hyperbolischer Kosinus"
PythonCount = "Zählt die Vorkommen von x"
PythonDegrees = "x von Bogenmaß in Grad umrechnen"
PythonDivMod = "Quotient und Rest"
PythonDrawString = "Schreibt Text bei (x,y)"
PythonDrawLine = "Eine Linie zeichnen"
PythonDrawString = "Text bei Pixel (x,y) darstellen"
PythonErf = "Fehlerfunktion"
PythonErfc = "Complementary error function"
PythonEval = "Return the evaluated expression"
PythonErfc = "Komplementäre Fehlerfunktion"
PythonEval = "Rückgabe ausgewerteter Ausdruck"
PythonExp = "Exponentialfunktion"
PythonExpm1 = "Berechne exp(x)-1"
PythonFabs = "Absoluter Wert"
PythonFillRect = "Malt ein Rechteck bei Pixel (x,y)"
PythonFloat = "Wandelt x zu float um"
PythonFloor = "Floor"
PythonFillRect = "Gefülltes Rechteck bei Pixel (x,y)"
PythonFloat = "x in einen Fließkommawert umwandeln"
PythonFloor = "Abrunden"
PythonFmod = "a modulo b"
PythonFrExp = "Mantissa and exponent of x: (m,e)"
PythonGamma = "Gamma function"
PythonGetPixel = "Return pixel (x,y) color"
PythonGetrandbits = "Integer with k random bits"
PythonGrid = "Toggle the visibility of the grid"
PythonHex = "Ganzzahl zu Hexadecimal"
PythonHist = "Draw the histogram of x"
PythonImportCmath = "cmath Modul importieren"
PythonImportIon = "ion Modul importieren"
PythonImportKandinsky = "kandinsky Modul importieren"
PythonImportRandom = "random Modul importieren"
PythonImportMath = "math Modul importieren"
PythonImportMatplotlibPyplot = "Import matplotlib.pyplot module"
PythonImportOs = "os Modul importieren"
PythonOsUname = "Informieren Sie sich über das System"
PythonFrExp = "Mantisse und Exponent von x: (m,e)"
PythonGamma = "Gamma-Funktion"
PythonGetPixel = "Farbe von Pixel (x,y) zurückgeben"
PythonGetrandbits = "Ganzzahl mit k Zufallsbits"
PythonGrid = "Sichtbarkeit des Gitters umschalten"
PythonHex = "Ganzzahl in Hexadezimal umwandeln"
PythonHist = "Zeichnet das Histogramm von x"
PythonImportCmath = "cmath-Modul importieren"
PythonImportIon = "Ion-Modul importieren"
PythonImportKandinsky = "Kandinsky-Modul importieren"
PythonImportRandom = "Random-Modul importieren"
PythonImportMath = "Math-Modul importieren"
PythonImportMatplotlibPyplot = "Matplotlib.pyplot-Modul importieren"
PythonImportOs = "OS-Modul importieren"
PythonOsUname = "Informationen über das System holen"
PythonOsGetlogin = "Benutzernamen holen"
PythonOsRemove = "Datei namens Dateiname entfernen"
PythonOsRename = "Datei mit altem Namen in neuen Namen umbenennen"
PythonOsRename = "Datei umbenennen von Alt nach Neu"
PythonOsListdir = "Dateien im Speicher auflisten"
PythonImportTime = "time Modul importieren"
PythonImportTurtle = "turtle Modul importieren"
PythonIndex = "Index, bei dem x zuerst vorkommt"
PythonInput = "Eingabeaufforderung"
PythonInsert = "x bei index i in der Liste einsetzen"
PythonInt = "x zu Ganzzahl"
PythonIonFunction = "ion module function prefix"
PythonIsFinite = "Prüft ob x endlich ist"
PythonIsInfinite = "Prüft ob x unendlich ist"
PythonIsNaN = "Prüft ob x NaN ist"
PythonIsKeyDown = "true wenn k gedrückt ist"
PythonKandinskyFunction = "kandinsky module function prefix"
PythonKeyLeft = "Linke Pfeiltaste"
PythonKeyUp = "Pfeiltaste nach oben"
PythonKeyDown = "Pfeiltaste nach unten"
PythonKeyRight = "Rechte Pfeiltaste"
PythonKeyOk = "OK Taste"
PythonKeyBack = "ZURÜCK Taste"
PythonKeyHome = "HOME Taste"
PythonKeyOnOff = "AN/AUS Taste"
PythonKeyShift = "SHIFT Taste"
PythonKeyAlpha = "ALPHA Taste"
PythonKeyXnt = "X,N,T Taste"
PythonKeyVar = "VAR Taste"
PythonKeyToolbox = "WERKZEUGBOX Taste"
PythonKeyBackspace = "LÖSCHEN Taste"
PythonKeyExp = "EXPONENTIAL Taste"
PythonKeyLn = "NATURAL LOGARITHM Taste"
PythonKeyLog = "DECIMAL LOGARITHM Taste"
PythonKeyImaginary = "IMAGINÄRES I Taste"
PythonKeyComma = "KOMMA Taste"
PythonKeyPower = "HOCH Taste"
PythonKeySine = "SINUS Taste"
PythonKeyCosine = "COSINUS Taste"
PythonKeyTangent = "TANGENZ Taste"
PythonKeyPi = "PI Taste"
PythonKeySqrt = "WURZEL Taste"
PythonKeySquare = "QUADRAT Taste"
PythonKeySeven = "7 Taste"
PythonKeyEight = "8 Taste"
PythonKeyNine = "9 Taste"
PythonKeyLeftParenthesis = "LEFT PARENTHESIS key"
PythonKeyRightParenthesis = "RIGHT PARENTHESIS key"
PythonKeyFour = "4 Taste"
PythonKeyFive = "5 Taste"
PythonKeySix = "6 Taste"
PythonKeyMultiplication = "MULTIPLIKATIONSTASTE"
PythonKeyDivision = "DIVISIONSTASTE"
PythonKeyOne = "1 Taste"
PythonKeyTwo = "2 Taste"
PythonKeyThree = "3 Taste"
PythonKeyPlus = "PLUS Taste"
PythonKeyMinus = "MINUS Taste"
PythonKeyZero = "0 Taste"
PythonKeyDot = "PUNKT Taste"
PythonKeyEe = "10 HOCH X Taste"
PythonKeyAns = "ANS Taste"
PythonKeyExe = "EXE Taste"
PythonLdexp = "Return x*(2**i), inverse of frexp"
PythonLength = "Length of an object"
PythonLgamma = "Log-gamma function"
PythonLog = "Logarithm to base a"
PythonLog10 = "Logarithm to base 10"
PythonLog2 = "Logarithm to base 2"
PythonMathFunction = "math module function prefix"
PythonMatplotlibPyplotFunction = "matplotlib.pyplot module prefix"
PythonImportTime = "Time-Modul importieren"
PythonImportTurtle = "Turtle-Modul importieren"
PythonIndex = "Index des ersten x-Vorkommens"
PythonInput = "Einen Wert abfragen"
PythonInsert = "x an Index i in die Liste einfügen"
PythonInt = "x in eine ganze Zahl umwandeln"
PythonIonFunction = "Ion-Modul-Funktionspräfix"
PythonIsFinite = "Prüfen, ob x endlich ist"
PythonIsInfinite = "Prüfen, ob x unendlich ist"
PythonIsNaN = "Prüfen, ob x keine Zahl ist"
PythonIsKeyDown = "Wahr, wenn die Taste k gedrückt ist"
PythonKandinskyFunction = "Kandinsky-Modul Funktionspräfix"
PythonLdexp = "Liefert x*(2**i), Inverse von frexp"
PythonLength = "Länge eines Objekts"
PythonLgamma = "Log-Gamma-Funktion"
PythonLog = "Logarithmus zur Basis a"
PythonLog10 = "Logarithmus zur Basis 10"
PythonLog2 = "Logarithmus zur Basis 2"
PythonMathFunction = "Funktionspräfix des Math-Moduls"
PythonMatplotlibPyplotFunction = "matplotlib.pyplot Modul-Präfix"
PythonMax = "Maximum"
PythonMin = "Minimum"
PythonModf = "Fractional and integer parts of x"
PythonMonotonic = "Value of a monotonic clock"
PythonOct = "Convert integer to octal"
PythonPhase = "Phase of z"
PythonPlot = "Plot y versus x as lines"
PythonPolar = "z in polar coordinates"
PythonPop = "Remove and return the last item"
PythonPower = "x raised to the power y"
PythonPrint = "Print object"
PythonRadians = "Convert x from degrees to radians"
PythonRandint = "Random integer in [a,b]"
PythonRandom = "Floating point number in [0,1["
PythonRandomFunction = "random module function prefix"
PythonRandrange = "Random number in range(start,stop)"
PythonRangeStartStop = "List from start to stop-1"
PythonRangeStop = "List from 0 to stop-1"
PythonRect = "Convert to cartesian coordinates"
PythonRemove = "Remove the first occurrence of x"
PythonReverse = "Reverse the elements of the list"
PythonRound = "Round to n digits"
PythonScatter = "Draw a scatter plot of y versus x"
PythonSeed = "Initialize random number generator"
PythonSetPixel = "Color pixel (x,y)"
PythonShow = "Display the figure"
PythonSin = "Sine"
PythonSinh = "Hyperbolic sine"
PythonSleep = "Suspend the execution for t seconds"
PythonSort = "Sort the list"
PythonSqrt = "Wurzel"
PythonSum = "Sum the items of a list"
PythonModf = "Bruch- und Ganzzahl-Anteile von x"
PythonMonotonic = "Wert einer monotonen Uhr"
PythonOct = "Ganzzahl in Oktal umwandeln"
PythonPhase = "Phase von z"
PythonPlot = "Plotten von y gegen x als Linien"
PythonPolar = "z in Polarkoordinaten"
PythonPop = "Letztes Element abnehmen"
PythonPower = "x erhöht mit der Potenz y"
PythonPrint = "Objekt drucken"
PythonRadians = "x von Grad in Bogenmaß umrechnen"
PythonRandint = "Zufällige Ganzzahl in [a,b]"
PythonRandom = "Fließkommazahl in [0,1]"
PythonRandomFunction = "Random-Modul Funktionspräfix"
PythonRandrange = "Zufallszahl im Bereich(start,stop)"
PythonRangeStartStop = "Liste von Start bis Stop-1"
PythonRangeStop = "Liste von 0 bis Stop-1"
PythonRect = "In kartesische Koordinaten"
PythonRemove = "Entferne das erste Vorkommen von x"
PythonReverse = "Kehrt die Elemente der Liste um"
PythonRound = "Runden auf n Stellen"
PythonScatter = "Streudiagramm von y gg. x zeichnen"
PythonSeed = "Zufallszahlengenerator initiieren"
PythonSetPixel = "Pixel (x,y) einfärben"
PythonShow = "Figur anzeigen"
PythonSin = "Sinus"
PythonSinh = "Hyperbolischer Sinus"
PythonSleep = "Ausführung aussetzen für t Sekunden"
PythonSort = "Die Liste sortieren"
PythonSqrt = "Quadratwurzel"
PythonSum = "Summe der Elemente einer Liste"
PythonTan = "Tangens"
PythonTanh = "Hyperbolic tangent"
PythonText = "Display a text at (x,y) coordinates"
PythonTimeFunction = "time module function prefix"
PythonTrunc = "x truncated to an integer"
PythonTurtleBackward = "Move backward by x pixels"
PythonTurtleCircle = "Circle of radius r pixels"
PythonTurtleColor = "Stiftfarbe setzen"
PythonTurtleColorMode = "Set the color mode to 1.0 or 255"
PythonTurtleForward = "Move forward by x pixels"
PythonTurtleFunction = "turtle module function prefix"
PythonTurtleGoto = "Move to (x,y) coordinates"
PythonTurtleHeading = "Return the current heading"
PythonTurtleHideturtle = "Hide the turtle"
PythonTurtleIsdown = "Return True if the pen is down"
PythonTurtleLeft = "Turn left by a degrees"
PythonTurtlePendown = "Pull the pen down"
PythonTurtlePensize = "Set the line thickness to x pixels"
PythonTurtlePenup = "Pull the pen up"
PythonTurtlePosition = "Return the current (x,y) location"
PythonTurtleReset = "Reset the drawing"
PythonTurtleRight = "Turn right by a degrees"
PythonTurtleSetheading = "Set the orientation to a degrees"
PythonTurtleSetposition = "Positionne la tortue"
PythonTurtleShowturtle = "Show the turtle"
PythonTurtleSpeed = "Drawing speed between 0 and 10"
PythonTurtleWrite = "Display a text"
PythonUniform = "Floating point number in [a,b]"
PythonImportTime = "Import time module"
PythonTimePrefix = "time module function prefix"
PythonTimeSleep = "Wait for n second"
PythonMonotonic = "Return monotonic time"
PythonTanh = "Hyperbolischer Tangens"
PythonText = "Text an (x,y) Koordinaten anzeigen"
PythonTimeFunction = "Time-Modul-Funktionspräfix"
PythonTrunc = "x abgeschnitten auf eine ganze Zahl"
PythonTurtleBackward = "Um x Pixel rückwärts bewegen"
PythonTurtleCircle = "Kreis mit Radius r Pixel"
PythonTurtleColor = "Setzt die Stiftfarbe"
PythonTurtleColorMode = "Setzt Farbmodus auf 1.0 oder 255"
PythonTurtleForward = "Um x Pixel vorwärts bewegen"
PythonTurtleFunction = "Turtle-Modul-Funktionspräfix"
PythonTurtleGoto = "Bewegen zu (x,y) Koordinaten"
PythonTurtleHeading = "Liefert den aktuellen Kurs"
PythonTurtleHideturtle = "Versteckt den Igel"
PythonTurtleIsdown = "Wahr, wenn der Stift unten ist"
PythonTurtleLeft = "Nach links um ein Grad drehen"
PythonTurtlePendown = "Den Stift nach unten ziehen"
PythonTurtlePensize = "Linienstärke auf x Pixel setzen"
PythonTurtlePenup = "Den Stift nach oben ziehen"
PythonTurtlePosition = "Aktuelle (x,y) Position zurückgeben"
PythonTurtleReset = "Die Zeichnung zurücksetzen"
PythonTurtleRight = "Um ein Grad nach rechts drehen"
PythonTurtleSetheading = "Ausrichtung auf einen Grad setzen"
PythonTurtleSetposition = "Den Igel auf Position setzen"
PythonTurtleShowturtle = "Den Igel anzeigen"
PythonTurtleSpeed = "Zeichengeschwindigkeit von 0 bis 10"
PythonTurtleWrite = "Einen Text anzeigen"
PythonUniform = "Fließkommazahl in [a,b]"
PythonImportTime = "Time-Modul importieren"
PythonTimePrefix = "Zeitmodul-Funktionspräfix"
PythonTimeSleep = "Warte für n Sekunden"
PythonMonotonic = "Monotone Zeit zurückgeben"
PythonFileOpen = "Öffnet eine Datei"
PythonFileSeekable = "Ist eine Datei durchsuchbar?"
PythonFileSeek = "Dateicursor verschieben"
PythonFileTell = "Cursorposition der Datei abrufen"
PythonFileSeekable = "Kann Datei durchsucht werden?"
PythonFileSeek = "Bewegt den Cursor einer Datei"
PythonFileTell = "Position des Cursors ermitteln"
PythonFileClose = "Schließt eine Datei"
PythonFileClosed = "Wenn Datei geschlossen wurde"
PythonFileRead = "Bis zu size Bytes lesen"
PythonFileWrite = "Schreibe b in die Datei"
PythonFileReadline = "Lies eine Zeile"
PythonFileClosed = "Wahr, wenn Datei geschlossen wurde"
PythonFileRead = "Lesen bis zu einer Größe von Bytes"
PythonFileWrite = "Schreibe b in Datei"
PythonFileReadline = "Liest Zeile oder Anzahl Bytes"
PythonFileReadlines = "Liest eine Liste von Zeilen"
PythonFileTruncate = "Größe der Datei ändern"
PythonFileTruncate = "Verkleinert die Datei auf Größe"
PythonFileWritelines = "Schreibt eine Liste von Zeilen"
PythonFileName = "Dateiname"
PythonFileMode = "Dateiöffnungsmodus"
PythonFileReadable = "Ist die Datei lesbar?"
PythonFileWritable = "Ist die Datei beschreibbar?"
PythonFileName = "Enthält den Namen der Datei"
PythonFileMode = "Enthält den Öffnungsmodus der Datei"
PythonFileReadable = "Kann Datei gelesen werden?"
PythonFileWritable = "Kann Datei geschrieben werden?"

View File

@@ -45,6 +45,7 @@ PythonCosh = "Hyperbolic cosine"
PythonCount = "Count the occurrences of x"
PythonDegrees = "Convert x from radians to degrees"
PythonDivMod = "Quotient and remainder"
PythonDrawLine = "Draw a line"
PythonDrawString = "Display a text from pixel (x,y)"
PythonErf = "Error function"
PythonErfc = "Complementary error function"
@@ -81,52 +82,6 @@ PythonIsInfinite = "Check if x is infinity"
PythonIsKeyDown = "Return True if the k key is down"
PythonIsNaN = "Check if x is a NaN"
PythonKandinskyFunction = "kandinsky module function prefix"
PythonKeyLeft = "LEFT ARROW key"
PythonKeyUp = "UP ARROW key"
PythonKeyDown = "DOWN ARROW key"
PythonKeyRight = "RIGHT ARROW key"
PythonKeyOk = "OK key"
PythonKeyBack = "BACK key"
PythonKeyHome = "HOME key"
PythonKeyOnOff = "ON/OFF key"
PythonKeyShift = "SHIFT key"
PythonKeyAlpha = "ALPHA key"
PythonKeyXnt = "X,N,T key"
PythonKeyVar = "VAR key"
PythonKeyToolbox = "TOOLBOX key"
PythonKeyBackspace = "BACKSPACE key"
PythonKeyExp = "EXPONENTIAL key"
PythonKeyLn = "NATURAL LOGARITHM key"
PythonKeyLog = "DECIMAL LOGARITHM key"
PythonKeyImaginary = "IMAGINARY I key"
PythonKeyComma = "COMMA key"
PythonKeyPower = "POWER key"
PythonKeySine = "SINE key"
PythonKeyCosine = "COSINE key"
PythonKeyTangent = "TANGENT key"
PythonKeyPi = "PI key"
PythonKeySqrt = "SQUARE ROOT key"
PythonKeySquare = "SQUARE key"
PythonKeySeven = "7 key"
PythonKeyEight = "8 key"
PythonKeyNine = "9 key"
PythonKeyLeftParenthesis = "LEFT PARENTHESIS key"
PythonKeyRightParenthesis = "RIGHT PARENTHESIS key"
PythonKeyFour = "4 key"
PythonKeyFive = "5 key"
PythonKeySix = "6 key"
PythonKeyMultiplication = "MULTIPLICATION key"
PythonKeyDivision = "DIVISION key"
PythonKeyOne = "1 key"
PythonKeyTwo = "2 key"
PythonKeyThree = "3 key"
PythonKeyPlus = "PLUS key"
PythonKeyMinus = "MINUS key"
PythonKeyZero = "0 key"
PythonKeyDot = "DOT key"
PythonKeyEe = "10 POWER X key"
PythonKeyAns = "ANS key"
PythonKeyExe = "EXE key"
PythonLdexp = "Return x*(2**i), inverse of frexp"
PythonLength = "Length of an object"
PythonLgamma = "Log-gamma function"
@@ -148,7 +103,7 @@ PythonPower = "x raised to the power y"
PythonPrint = "Print object"
PythonRadians = "Convert x from degrees to radians"
PythonRandint = "Random integer in [a,b]"
PythonRandom = "Floating point number in [0,1["
PythonRandom = "Floating point number in [0,1]"
PythonRandomFunction = "random module function prefix"
PythonRandrange = "Random number in range(start,stop)"
PythonRangeStartStop = "List from start to stop-1"
@@ -198,6 +153,7 @@ PythonUniform = "Floating point number in [a,b]"
PythonImportTime = "Import time module"
PythonImportOs = "Import os module"
PythonOsUname = "Get infos about the system"
PythonOsGetlogin = "Get username"
PythonOsRemove = "Remove file named filename"
PythonOsRename = "Rename file oldname to newname"
PythonOsListdir = "List files in memory"

View File

@@ -45,6 +45,7 @@ PythonCosh = "Hyperbolic cosine"
PythonCount = "Count the occurrences of x"
PythonDegrees = "Convert x from radians to degrees"
PythonDivMod = "Quotient and remainder"
PythonDrawLine = "Draw a line"
PythonDrawString = "Display a text from pixel (x,y)"
PythonErf = "Error function"
PythonErfc = "Complementary error function"
@@ -81,52 +82,6 @@ PythonIsInfinite = "Check if x is infinity"
PythonIsKeyDown = "Return True if the k key is down"
PythonIsNaN = "Check if x is a NaN"
PythonKandinskyFunction = "kandinsky module function prefix"
PythonKeyLeft = "LEFT ARROW key"
PythonKeyUp = "UP ARROW key"
PythonKeyDown = "DOWN ARROW key"
PythonKeyRight = "RIGHT ARROW key"
PythonKeyOk = "OK key"
PythonKeyBack = "BACK key"
PythonKeyHome = "HOME key"
PythonKeyOnOff = "ON/OFF key"
PythonKeyShift = "SHIFT key"
PythonKeyAlpha = "ALPHA key"
PythonKeyXnt = "X,N,T key"
PythonKeyVar = "VAR key"
PythonKeyToolbox = "TOOLBOX key"
PythonKeyBackspace = "BACKSPACE key"
PythonKeyExp = "EXPONENTIAL key"
PythonKeyLn = "NATURAL LOGARITHM key"
PythonKeyLog = "DECIMAL LOGARITHM key"
PythonKeyImaginary = "IMAGINARY I key"
PythonKeyComma = "COMMA key"
PythonKeyPower = "POWER key"
PythonKeySine = "SINE key"
PythonKeyCosine = "COSINE key"
PythonKeyTangent = "TANGENT key"
PythonKeyPi = "PI key"
PythonKeySqrt = "SQUARE ROOT key"
PythonKeySquare = "SQUARE key"
PythonKeySeven = "7 key"
PythonKeyEight = "8 key"
PythonKeyNine = "9 key"
PythonKeyLeftParenthesis = "LEFT PARENTHESIS key"
PythonKeyRightParenthesis = "RIGHT PARENTHESIS key"
PythonKeyFour = "4 key"
PythonKeyFive = "5 key"
PythonKeySix = "6 key"
PythonKeyMultiplication = "MULTIPLICATION key"
PythonKeyDivision = "DIVISION key"
PythonKeyOne = "1 key"
PythonKeyTwo = "2 key"
PythonKeyThree = "3 key"
PythonKeyPlus = "PLUS key"
PythonKeyMinus = "MINUS key"
PythonKeyZero = "0 key"
PythonKeyDot = "DOT key"
PythonKeyEe = "10 POWER X key"
PythonKeyAns = "ANS key"
PythonKeyExe = "EXE key"
PythonLdexp = "Return x*(2**i), inverse of frexp"
PythonLength = "Length of an object"
PythonLgamma = "Log-gamma function"
@@ -198,6 +153,7 @@ PythonUniform = "Floating point number in [a,b]"
PythonImportTime = "Import time module"
PythonImportOs = "Import os module"
PythonOsUname = " Información del sistema "
PythonOsGetlogin = "Get username"
PythonOsRemove = "Eliminar un archivo"
PythonOsRename = "Renombrar archivo"
PythonOsListdir = "Archivos de la lista"

View File

@@ -45,6 +45,7 @@ PythonCosh = "Cosinus hyperbolique"
PythonCount = "Compte les occurrences de x"
PythonDegrees = "Conversion de radians en degrés"
PythonDivMod = "Quotient et reste"
PythonDrawLine = "Trace une ligne"
PythonDrawString = "Affiche un texte au pixel (x,y)"
PythonErf = "Fonction d'erreur"
PythonErfc = "Fonction d'erreur complémentaire"
@@ -81,52 +82,6 @@ PythonIsInfinite = "Teste si x est infini"
PythonIsKeyDown = "Renvoie True si touche k enfoncée"
PythonIsNaN = "Teste si x est NaN"
PythonKandinskyFunction = "Préfixe fonction module kandinsky"
PythonKeyLeft = "Touche FLECHE GAUCHE"
PythonKeyUp = "Touche FLECHE HAUT"
PythonKeyDown = "Touche FLECHE BAS"
PythonKeyRight = "Touche FLECHE DROITE"
PythonKeyOk = "Touche OK"
PythonKeyBack = "Touche RETOUR"
PythonKeyHome = "Touche HOME"
PythonKeyOnOff = "Touche ON/OFF"
PythonKeyShift = "Touche SHIFT"
PythonKeyAlpha = "Touche ALPHA"
PythonKeyXnt = "Touche X,N,T"
PythonKeyVar = "Touche VAR"
PythonKeyToolbox = "Touche BOITE A OUTILS"
PythonKeyBackspace = "Touche EFFACER"
PythonKeyExp = "Touche EXPONENTIELLE"
PythonKeyLn = "Touche LOGARITHME NEPERIEN"
PythonKeyLog = "Touche LOGARITHME DECIMAL"
PythonKeyImaginary = "Touche I IMAGINAIRE"
PythonKeyComma = "Touche VIRGULE"
PythonKeyPower = "Touche PUISSANCE"
PythonKeySine = "Touche SINUS"
PythonKeyCosine = "Touche COSINUS"
PythonKeyTangent = "Touche TANGENTE"
PythonKeyPi = "Touche PI"
PythonKeySqrt = "Touche RACINE CARREE"
PythonKeySquare = "Touche CARRE"
PythonKeySeven = "Touche 7"
PythonKeyEight = "Touche 8"
PythonKeyNine = "Touche 9"
PythonKeyLeftParenthesis = "Touche PARENTHESE GAUCHE"
PythonKeyRightParenthesis = "Touche PARENTHESE DROITE"
PythonKeyFour = "Touche 4"
PythonKeyFive = "Touche 5"
PythonKeySix = "Touche 6"
PythonKeyMultiplication = "Touche MULTIPLICATION"
PythonKeyDivision = "Touche DIVISION"
PythonKeyOne = "Touche 1"
PythonKeyTwo = "Touche 2"
PythonKeyThree = "Touche 3"
PythonKeyPlus = "Touche PLUS"
PythonKeyMinus = "Touche MOINS"
PythonKeyZero = "Touche 0"
PythonKeyDot = "Touche POINT"
PythonKeyEe = "Touche 10 PUISSANCE X"
PythonKeyAns = "Touche ANS"
PythonKeyExe = "Touche EXE"
PythonLdexp = "Inverse de frexp : x*(2**i)"
PythonLength = "Longueur d'un objet"
PythonLgamma = "Logarithme de la fonction gamma"
@@ -198,6 +153,7 @@ PythonUniform = "Nombre décimal dans [a,b]"
PythonImportTime = "Importation du module temps"
PythonImportOs = "Importation du module os"
PythonOsUname = "Donne des infos sur le système"
PythonOsGetlogin = "Donne le nom d'utilisateur"
PythonOsRemove = "Supprime le fichier nommé filename"
PythonOsRename = "Renomme oldname en newname"
PythonOsListdir = "Liste les fichiers"
@@ -210,12 +166,12 @@ PythonFileSeek = "Déplace le curseur interne"
PythonFileTell = "Donne la posititon du curseur"
PythonFileClose = "Ferme un fichier"
PythonFileClosed = "True si le fichier a été fermé"
PythonFileRead = "Lis jusqu'à size bytes"
PythonFileWrite = "Écris b dans le fichier"
PythonFileReadline = "Lis une ligne ou jusqu'à size bytes"
PythonFileReadlines = "Lis une liste de lignes"
PythonFileRead = "Lit jusqu'à size bytes"
PythonFileWrite = "Écrit b dans le fichier"
PythonFileReadline = "Lit une ligne ou jusqu'à size bytes"
PythonFileReadlines = "Lit une liste de lignes"
PythonFileTruncate = "Redimensionne le fichier"
PythonFileWritelines = "Écris une liste de lignes"
PythonFileWritelines = "Écrit une liste de lignes"
PythonFileName = "Nom du fichier"
PythonFileMode = "Mode d'ouverture du fichier"
PythonFileReadable = "Indique si read peut être utilisé"

View File

@@ -45,6 +45,7 @@ PythonCosh = "Hiperbolikus koszinusz"
PythonCount = "Számolja az x elöfordulását"
PythonDegrees = "x konvertálása radiánokrol fokokra"
PythonDivMod = "Hányados és maradék"
PythonDrawLine = "Húzzon egy vonalat "
PythonDrawString = "Szöveg megjelenítése (x, y)-en"
PythonErf = "Hiba funkció"
PythonErfc = "Kiegészítö hiba funkció"
@@ -81,52 +82,6 @@ PythonIsInfinite = "x végtelen-e"
PythonIsKeyDown = "True-t válaszol ha a k gomb le van nyomva"
PythonIsNaN = "Ellenörizze hogy x nem NaN"
PythonKandinskyFunction = "kandinsky modul funkció elötag"
PythonKeyLeft = "BAL NYÍL gomb"
PythonKeyUp = "FEL NYÍL gomb"
PythonKeyDown = "LE NYÍL gomb"
PythonKeyRight = "JOBB NYÍL gomb"
PythonKeyOk = "OK gomb"
PythonKeyBack = "VISSZA gomb"
PythonKeyHome = "HOME gomb"
PythonKeyOnOff = "ON/OFF gomb"
PythonKeyShift = "SHIFT gomb"
PythonKeyAlpha = "ALPHA gomb"
PythonKeyXnt = "X,N,T gomb"
PythonKeyVar = "VAR gomb"
PythonKeyToolbox = "TOOLBOX gomb"
PythonKeyBackspace = "TÖRLÉS gomb"
PythonKeyExp = "EXPONENCIÁLIS gomb"
PythonKeyLn = "NEPERIAI LOGARITHM gomb"
PythonKeyLog = "DECIMÁLIS LOGARITHM gomb"
PythonKeyImaginary = "KÉPZELETBELI I gomb"
PythonKeyComma = "VESSZÖ gomb"
PythonKeyPower = "KIÁLLÍTÓ gomb"
PythonKeySine = "SZINUSZ gomb"
PythonKeyCosine = "KOSZINUSZ gomb"
PythonKeyTangent = "TANGENS gomb"
PythonKeyPi = "PI gomb"
PythonKeySqrt = "NÉGYZETGYÖK gomb"
PythonKeySquare = "NÉGYZET gomb"
PythonKeySeven = "7 gomb"
PythonKeyEight = "8 gomb"
PythonKeyNine = "9 gomb"
PythonKeyLeftParenthesis = "BAL ZÁRÓJEL gomb"
PythonKeyRightParenthesis = "JOB ZÁRÓJEL gomb"
PythonKeyFour = "4 gomb"
PythonKeyFive = "5 gomb"
PythonKeySix = "6 gomb"
PythonKeyMultiplication = "SZOZÁS gomb"
PythonKeyDivision = "OSZTÁS gomb"
PythonKeyOne = "1 gomb"
PythonKeyTwo = "2 gomb"
PythonKeyThree = "3 gomb"
PythonKeyPlus = "PLUS gomb"
PythonKeyMinus = "MINUS gomb"
PythonKeyZero = "0 gomb"
PythonKeyDot = "PONT gomb"
PythonKeyEe = "10 X KITEVÖ gomb"
PythonKeyAns = "ANS gomb"
PythonKeyExe = "EXE gomb"
PythonLdexp = "frexp ellentéte : x*(2**i)"
PythonLength = "Egy targy hossza"
PythonLgamma = "Gamma funkció logaritmusa"
@@ -217,6 +172,7 @@ PythonFileReadable = "read-et lehete használni"
PythonFileWritable = "write-ot lehete használni"
PythonImportOs = "os modul importálása"
PythonOsUname = "Rendszer informaciók"
PythonOsGetlogin = "Get username"
PythonOsRemove = "Fájl törlése"
PythonOsRename = "Fájl átnevezése"
PythonOsListdir = "Fájlok listája"

View File

@@ -45,6 +45,7 @@ PythonCosh = "Coseno iperbolico"
PythonCount = "Conta le ricorrenze di x"
PythonDegrees = "Conversione di radianti in gradi"
PythonDivMod = "Quoziente e resto"
PythonDrawLine = "Disegna una linea"
PythonDrawString = "Visualizza il testo dal pixel x,y"
PythonErf = "Funzione d'errore"
PythonErfc = "Funzione d'errore complementare"
@@ -73,6 +74,7 @@ PythonImportTurtle = "Importa del modulo turtle"
PythonImportTime = "Importa del modulo time"
PythonImportOs = "Importa modulo os"
PythonOsUname = "Ottieni informazioni sul sistema"
PythonOsGetlogin = "Get username"
PythonOsRemove = "Rimuovere un file"
PythonOsRename = "Rinomina file"
PythonOsListdir = "Elenca file"
@@ -86,52 +88,6 @@ PythonIsInfinite = "Testa se x est infinito"
PythonIsKeyDown = "Restituisce True premendo tasto k"
PythonIsNaN = "Testa se x è NaN"
PythonKandinskyFunction = "Prefisso funzione modulo kandinsky"
PythonKeyLeft = "Tasto FRECCIA SINISTRA"
PythonKeyUp = "Tasto FRECCIA ALTO"
PythonKeyDown = "Tasto FRECCIA BASSO"
PythonKeyRight = "Tasto FRECCIA DESTRA"
PythonKeyOk = "Tasto OK"
PythonKeyBack = "Tasto INDIETRO"
PythonKeyHome = "Tasto CASA"
PythonKeyOnOff = "Tasto ON/OFF"
PythonKeyShift = "Tasto SHIFT"
PythonKeyAlpha = "Tasto ALPHA"
PythonKeyXnt = "Tasto X,N,T"
PythonKeyVar = "Tasto VAR"
PythonKeyToolbox = "Tasto TOOLBOX"
PythonKeyBackspace = "Tasto CANCELLA"
PythonKeyExp = "Tasto ESPONENZIALE"
PythonKeyLn = "Tasto LOGARITMO NEPERIANO"
PythonKeyLog = "Tasto LOGARITMO DECIMALE"
PythonKeyImaginary = "Tasto I IMMAGINE"
PythonKeyComma = "Tasto VIRGOLA"
PythonKeyPower = "Tasto POTENZA"
PythonKeySine = "Tasto SENO"
PythonKeyCosine = "Tasto COSENO"
PythonKeyTangent = "Tasto TANGENTE"
PythonKeyPi = "Tasto PI"
PythonKeySqrt = "Tasto RADICE QUADRATA"
PythonKeySquare = "Tasto QUADRATO"
PythonKeySeven = "Tasto 7"
PythonKeyEight = "Tasto 8"
PythonKeyNine = "Tasto 9"
PythonKeyLeftParenthesis = "Tasto PARENTESI SINISTRA"
PythonKeyRightParenthesis = "Tasto PARENTESI DESTRA"
PythonKeyFour = "Tasto 4"
PythonKeyFive = "Tasto 5"
PythonKeySix = "Tasto 6"
PythonKeyMultiplication = "Tasto MOLTIPLICAZIONE"
PythonKeyDivision = "Tasto DIVISIONE"
PythonKeyOne = "Tasto 1"
PythonKeyTwo = "Tasto 2"
PythonKeyThree = "Tasto 3"
PythonKeyPlus = "Tasto PIÙ"
PythonKeyMinus = "Tasto MENO"
PythonKeyZero = "Tasto 0"
PythonKeyDot = "Tasto PUNTO"
PythonKeyEe = "Tasto 10 POTENZA X"
PythonKeyAns = "Tasto ANS"
PythonKeyExe = "Tasto EXE"
PythonLdexp = "Inversa di frexp : x*(2**i)"
PythonLength = "Longhezza di un oggetto"
PythonLgamma = "Logaritmo della funzione gamma"

View File

@@ -45,6 +45,7 @@ PythonCosh = "Cosinus hyperbolicus"
PythonCount = "Tel voorkomen van x"
PythonDegrees = "Zet x om van radialen naar graden"
PythonDivMod = "Quotiënt en rest"
PythonDrawLine = "Teken een lijn"
PythonDrawString = "Geef een tekst weer van pixel (x,y)"
PythonErf = "Error functie"
PythonErfc = "Complementaire error functie"
@@ -72,6 +73,7 @@ PythonImportMatplotlibPyplot = "Importeer matplotlib.pyplot module"
PythonImportTime = "Importeer time module"
PythonImportOs = "Importeer os module"
PythonOsUname = " Krijg systeeminfo"
PythonOsGetlogin = "Get username"
PythonOsRemove = "Een bestand verwijderen"
PythonOsRename = "Hernoem bestand"
PythonOsListdir = "Lijstbestanden"
@@ -86,52 +88,6 @@ PythonIsInfinite = "Controleer of x oneindig is"
PythonIsKeyDown = "Geef True als k toets omlaag is"
PythonIsNaN = "Controleer of x geen getal is"
PythonKandinskyFunction = "kandinsky module voorvoegsel"
PythonKeyLeft = "PIJL NAAR LINKS toets"
PythonKeyUp = "PIJL OMHOOG toets"
PythonKeyDown = "PIJL OMLAAG toets"
PythonKeyRight = "PIJL NAAR RECHTS toets"
PythonKeyOk = "OK toets"
PythonKeyBack = "TERUG toets"
PythonKeyHome = "HOME toets"
PythonKeyOnOff = "AAN/UIT toets"
PythonKeyShift = "SHIFT toets"
PythonKeyAlpha = "ALPHA toets"
PythonKeyXnt = "X,N,T toets"
PythonKeyVar = "VAR toets"
PythonKeyToolbox = "TOOLBOX toets"
PythonKeyBackspace = "BACKSPACE toets"
PythonKeyExp = "EXPONENTIEEL toets"
PythonKeyLn = "NATUURLIJKE LOGARITME toets"
PythonKeyLog = "BRIGGSE LOGARITME toets"
PythonKeyImaginary = "IMAGINAIRE I toets"
PythonKeyComma = "KOMMA toets"
PythonKeyPower = "MACHT toets"
PythonKeySine = "SINUS toets"
PythonKeyCosine = "COSINUS toets"
PythonKeyTangent = "TANGENS toets"
PythonKeyPi = "PI toets"
PythonKeySqrt = "VIERKANTSWORTEL toets"
PythonKeySquare = "KWADRAAT toets"
PythonKeySeven = "7 toets"
PythonKeyEight = "8 toets"
PythonKeyNine = "9 toets"
PythonKeyLeftParenthesis = "HAAKJE OPENEN toets"
PythonKeyRightParenthesis = "HAAKJE SLUITEN toets"
PythonKeyFour = "4 toets"
PythonKeyFive = "5 toets"
PythonKeySix = "6 toets"
PythonKeyMultiplication = "VERMENIGVULDIGEN toets"
PythonKeyDivision = "DELEN toets"
PythonKeyOne = "1 toets"
PythonKeyTwo = "2 toets"
PythonKeyThree = "3 toets"
PythonKeyPlus = "PLUS toets"
PythonKeyMinus = "MIN toets"
PythonKeyZero = "0 toets"
PythonKeyDot = "PUNT toets"
PythonKeyEe = "10 TOT DE MACHT X toets"
PythonKeyAns = "ANS toets"
PythonKeyExe = "EXE toets"
PythonLdexp = "Geeft x*(2**i), inversie van frexp"
PythonLength = "Lengte van een object"
PythonLgamma = "Log-gammafunctie"

View File

@@ -45,6 +45,7 @@ PythonCosh = "Cosseno hiperbólico"
PythonCount = "Contar as ocorrências de x"
PythonDegrees = "Converter x de radianos para graus"
PythonDivMod = "Quociente e resto"
PythonDrawLine = "Desenhe uma linha"
PythonDrawString = "Mostrar o texto do pixel (x,y)"
PythonErf = "Função erro"
PythonErfc = "Função erro complementar"
@@ -81,52 +82,6 @@ PythonIsInfinite = "Verificar se x é infinito"
PythonIsKeyDown = "Devolve True se tecla k pressionada"
PythonIsNaN = "Verificar se x é um NaN"
PythonKandinskyFunction = "Prefixo da função do módulo kandinsky"
PythonKeyLeft = "tecla SETA ESQUERDA"
PythonKeyUp = "tecla SETA CIMA "
PythonKeyDown = "tecla SETA BAIXO"
PythonKeyRight = "tecla SETA DIREITA"
PythonKeyOk = "tecla OK"
PythonKeyBack = "tecla VOLTAR"
PythonKeyHome = "tecla HOME"
PythonKeyOnOff = "tecla ON/OFF"
PythonKeyShift = "tecla SHIFT"
PythonKeyAlpha = "tecla ALPHA"
PythonKeyXnt = "tecla X,N,T"
PythonKeyVar = "tecla VAR"
PythonKeyToolbox = "tecla CAIXA DE FERRAMENTAS"
PythonKeyBackspace = "tecla APAGAR"
PythonKeyExp = "tecla EXPONENCIAL"
PythonKeyLn = "tecla LOGARITMO NATURAL"
PythonKeyLog = "tecla LOGARITMO DECIMAL"
PythonKeyImaginary = "tecla I IMAGINÁRIO"
PythonKeyComma = "tecla VÍRGULA"
PythonKeyPower = "tecla EXPOENTE"
PythonKeySine = "tecla SENO"
PythonKeyCosine = "tecla COSSENO"
PythonKeyTangent = "tecla TANGENTE"
PythonKeyPi = "tecla PI"
PythonKeySqrt = "tecla RAIZ QUADRADA"
PythonKeySquare = "tecla AO QUADRADO"
PythonKeySeven = "tecla 7"
PythonKeyEight = "tecla 8"
PythonKeyNine = "tecla 9"
PythonKeyLeftParenthesis = "tecla PARÊNTESE ESQUERDO"
PythonKeyRightParenthesis = "tecla PARÊNTESE DIREITO"
PythonKeyFour = "tecla 4"
PythonKeyFive = "tecla 5"
PythonKeySix = "tecla 6"
PythonKeyMultiplication = "tecla MULTIPLICAÇÃO"
PythonKeyDivision = "tecla DIVISÃO"
PythonKeyOne = "tecla 1"
PythonKeyTwo = "tecla 2"
PythonKeyThree = "tecla 3"
PythonKeyPlus = "tecla MAIS"
PythonKeyMinus = "tecla MENOS"
PythonKeyZero = "tecla 0"
PythonKeyDot = "tecla PONTO"
PythonKeyEe = "tecla 10 expoente X"
PythonKeyAns = "tecla ANS"
PythonKeyExe = "tecla EXE"
PythonLdexp = "Devolve x*(2**i), inverso de frexp"
PythonLength = "Comprimento de um objeto"
PythonLgamma = "Logaritmo da função gama"
@@ -198,6 +153,7 @@ PythonUniform = "Número decimal em [a,b]"
PythonImportTime = "Import time module"
PythonImportOs = "Import os module"
PythonOsUname = " Obter informações do sistema"
PythonOsGetlogin = "Get username"
PythonOsRemove = "Remover um ficheiro"
PythonOsRename = "Renomear ficheiro"
PythonOsListdir = "Listar ficheiros"

View File

@@ -50,6 +50,7 @@ PythonCommandCount = "list.count(x)"
PythonCommandCountWithoutArg = ".count(\x11)"
PythonCommandDegrees = "degrees(x)"
PythonCommandDivMod = "divmod(a,b)"
PythonCommandDrawLine = "draw_line(x1,y1,x2,y2,color)"
PythonCommandDrawString = "draw_string(\"text\",x,y)"
PythonCommandConstantE = "e"
PythonCommandErf = "erf(x)"
@@ -215,6 +216,7 @@ PythonCommandUniform = "uniform(a,b)"
PythonConstantE = "2.718281828459045"
PythonConstantPi = "3.141592653589793"
PythonOsCommandUname = "uname()"
PythonOsCommandGetlogin = "getlogin()"
PythonOsCommandRemove = "remove(filename)"
PythonOsCommandRename = "rename(oldname, newname)"
PythonOsCommandRemoveWithoutArg = "remove(\x11)"

View File

@@ -5,6 +5,7 @@ extern "C" {
#include <string.h>
#include <ctype.h>
}
#include "app.h"
namespace Code {
@@ -192,6 +193,7 @@ const ToolboxMessageTree KandinskyModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandSetPixel, I18n::Message::PythonSetPixel),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColor, I18n::Message::PythonColor),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawString, I18n::Message::PythonDrawString),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawLine, I18n::Message::PythonDrawLine),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillRect, I18n::Message::PythonFillRect)
};
@@ -200,52 +202,7 @@ const ToolboxMessageTree IonModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromIon, I18n::Message::PythonImportIon, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIonFunction, I18n::Message::PythonIonFunction, false, I18n::Message::PythonCommandIonFunctionWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIsKeyDown, I18n::Message::PythonIsKeyDown),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyLeft, I18n::Message::PythonKeyLeft, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyUp, I18n::Message::PythonKeyUp, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyDown, I18n::Message::PythonKeyDown, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyRight, I18n::Message::PythonKeyRight, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyOk, I18n::Message::PythonKeyOk, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyBack, I18n::Message::PythonKeyBack, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyHome, I18n::Message::PythonKeyHome, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyOnOff, I18n::Message::PythonKeyOnOff, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyShift, I18n::Message::PythonKeyShift, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyAlpha, I18n::Message::PythonKeyAlpha, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyXnt, I18n::Message::PythonKeyXnt, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyVar, I18n::Message::PythonKeyVar, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyToolbox, I18n::Message::PythonKeyToolbox, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyBackspace, I18n::Message::PythonKeyBackspace, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyExp, I18n::Message::PythonKeyExp, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyLn, I18n::Message::PythonKeyLn, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyLog, I18n::Message::PythonKeyLog, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyImaginary, I18n::Message::PythonKeyImaginary, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyComma, I18n::Message::PythonKeyComma, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyPower, I18n::Message::PythonKeyPower, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySine, I18n::Message::PythonKeySine, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyCosine, I18n::Message::PythonKeyCosine, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyTangent, I18n::Message::PythonKeyTangent, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyPi, I18n::Message::PythonKeyPi, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySqrt, I18n::Message::PythonKeySqrt, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySquare, I18n::Message::PythonKeySquare, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySeven, I18n::Message::PythonKeySeven, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyEight, I18n::Message::PythonKeyEight, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyNine, I18n::Message::PythonKeyNine, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyLeftParenthesis, I18n::Message::PythonKeyLeftParenthesis, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyRightParenthesis, I18n::Message::PythonKeyRightParenthesis, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyFour, I18n::Message::PythonKeyFour, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyFive, I18n::Message::PythonKeyFive, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySix, I18n::Message::PythonKeySix, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyMultiplication, I18n::Message::PythonKeyMultiplication, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyDivision, I18n::Message::PythonKeyDivision, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyOne, I18n::Message::PythonKeyOne, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyTwo, I18n::Message::PythonKeyTwo, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyThree, I18n::Message::PythonKeyThree, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyPlus, I18n::Message::PythonKeyPlus, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyMinus, I18n::Message::PythonKeyMinus, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyZero, I18n::Message::PythonKeyZero, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyDot, I18n::Message::PythonKeyDot, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyEe, I18n::Message::PythonKeyEe, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyAns, I18n::Message::PythonKeyAns, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyExe, I18n::Message::PythonKeyExe, false)
ToolboxMessageTree::Leaf(I18n::Message::IonSelector, I18n::Message::IonSelector)
};
const ToolboxMessageTree TimeModuleChildren[] = {
@@ -260,6 +217,7 @@ const ToolboxMessageTree OsModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportOs, I18n::Message::PythonImportOs, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromOs, I18n::Message::PythonImportOs, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandUname, I18n::Message::PythonOsUname, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandGetlogin, I18n::Message::PythonOsGetlogin, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandRemove, I18n::Message::PythonOsRemove, false, I18n::Message::PythonOsCommandRemoveWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandRename, I18n::Message::PythonOsRename, false, I18n::Message::PythonOsCommandRenameWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandListdir, I18n::Message::PythonOsListdir, false)
@@ -315,6 +273,7 @@ const ToolboxMessageTree catalogChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCosh, I18n::Message::PythonCosh),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDegrees, I18n::Message::PythonDegrees),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDivMod, I18n::Message::PythonDivMod),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawLine, I18n::Message::PythonDrawLine),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawString, I18n::Message::PythonDrawString),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandConstantE, I18n::Message::PythonConstantE, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandErf, I18n::Message::PythonErf),
@@ -536,6 +495,11 @@ KDCoordinate PythonToolbox::rowHeight(int j) {
bool PythonToolbox::selectLeaf(int selectedRow) {
m_selectableTableView.deselectTable();
ToolboxMessageTree * node = (ToolboxMessageTree *)m_messageTreeModel->childAtIndex(selectedRow);
if(node->insertedText() == I18n::Message::IonSelector){
m_ionKeys.setSender(sender());
Container::activeApp()->displayModalViewController(static_cast<ViewController*>(&m_ionKeys), 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin);
return true;
}
const char * editedText = I18n::translate(node->insertedText());
// strippedEditedText array needs to be in the same scope as editedText
char strippedEditedText[k_maxMessageSize];

View File

@@ -5,6 +5,7 @@
#include <escher.h>
#include <ion/events.h>
#include <kandinsky/font.h>
#include "toolbox_ion_keys.h"
namespace Code {
@@ -32,6 +33,7 @@ private:
void scrollToAndSelectChild(int i);
MessageTableCellWithMessage m_leafCells[k_maxNumberOfDisplayedRows];
MessageTableCellWithChevron m_nodeCells[k_maxNumberOfDisplayedRows];
toolboxIonKeys m_ionKeys;
};
}

View File

@@ -0,0 +1,27 @@
#include "../toolbox_ion_keys.h"
namespace Code {
toolboxIonKeys::toolboxIonKeys() :
ViewController(nullptr),
m_view()
{
}
bool toolboxIonKeys::handleEvent(Ion::Events::Event e) {
return false;
}
toolboxIonKeys::toolboxIonView::toolboxIonView():
View()
{
}
void toolboxIonKeys::toolboxIonView::drawRect(KDContext * ctx, KDRect rect) const {
return;
}
View * toolboxIonKeys::view(){
return &m_view;
}
}

View File

@@ -57,3 +57,5 @@ PythonCommandDef = "def \x11():\n "
PythonCommandDefWithArg = "def function(x):"
PythonCommandReturn = "return "
RandomModule = "random"
IonSelector = "Key selector"
PressAKey = "Press a key"

View File

@@ -0,0 +1,50 @@
#include "toolbox_ion_keys.h"
#include <apps/apps_container.h>
#include <assert.h>
#include <ion.h>
extern "C" {
#include <py/obj.h>
#include <py/objfun.h>
}
extern const mp_rom_map_elem_t modion_module_globals_table[48];
namespace Code {
toolboxIonKeys::toolboxIonKeys() :
ViewController(nullptr),
m_view()
{
}
bool toolboxIonKeys::handleEvent(Ion::Events::Event e) {
Ion::Keyboard::State state = Ion::Keyboard::scan();
for(uint16_t i = 0; i < sizeof(modion_module_globals_table)/sizeof(_mp_rom_map_elem_t); i++){
_mp_rom_map_elem_t element = modion_module_globals_table[i];
if(mp_obj_is_small_int(element.value)){
int key = mp_obj_get_int(element.value);
if(state.keyDown(static_cast<Ion::Keyboard::Key>(key))){
m_sender->handleEventWithText(qstr_str(MP_OBJ_QSTR_VALUE(element.key)), true);
}
}
}
Container::activeApp()->dismissModalViewController();
AppsContainer::sharedAppsContainer()->redrawWindow();
return true;
}
toolboxIonKeys::toolboxIonView::toolboxIonView():
View()
{
}
void toolboxIonKeys::toolboxIonView::drawRect(KDContext * ctx, KDRect rect) const {
ctx->fillRect(rect, Palette::GrayBright);
ctx->strokeRect(rect, Palette::GrayDark);
ctx->drawString(I18n::translate(I18n::Message::PressAKey),KDPoint(rect.left()+80, rect.top()+20));
}
View * toolboxIonKeys::view(){
return &m_view;
}
}

View File

@@ -0,0 +1,21 @@
#include <escher.h>
namespace Code {
class toolboxIonKeys : public ViewController {
public :
toolboxIonKeys();
View * view() override;
bool handleEvent(Ion::Events::Event e) override;
void setSender(InputEventHandler * sender) { m_sender = sender; }
private :
class toolboxIonView : public View {
public :
toolboxIonView();
void drawRect(KDContext * ctx, KDRect rect) const override;
};
toolboxIonView m_view;
InputEventHandler * m_sender;
};
}

View File

@@ -55,29 +55,43 @@ bool fileAtIndex(size_t index, File &entry) {
* TAR files are comprised of a set of records aligned to 512 bytes boundary
* followed by data.
*/
while (index-- > 0) {
for(;;) {
// Calculate the size
size = 0;
for (int i = 0; i < 11; i++)
size = size * 8 + (tar->size[i] - '0');
// Check if we found our file.
if (index == 0) {
// If yes, check for sanity and for exam mode stuff
if (!isSane(tar) || isExamModeAndFileNotExecutable(tar)) {
return false;
}
// Move to the next TAR header.
unsigned stride = (sizeof(TarHeader) + size + 511);
stride = (stride >> 9) << 9;
tar = reinterpret_cast<const TarHeader*>(reinterpret_cast<const char*>(tar) + stride);
// File entry found, copy data out.
entry.name = tar->name;
entry.data = reinterpret_cast<const uint8_t*>(tar) + sizeof(TarHeader);
entry.dataLength = size;
entry.isExecutable = (tar->mode[4] & 0x01) == 1;
// Sanity check.
if (!isSane(tar) || isExamModeAndFileNotExecutable(tar)) {
return false;
return true;
} else {
// move to the next TAR header.
unsigned stride = (sizeof(TarHeader) + size + 511);
stride = (stride >> 9) << 9;
tar = reinterpret_cast<const TarHeader*>(reinterpret_cast<const char*>(tar) + stride);
// Sanity check.
if (!isSane(tar)) {
return false;
}
}
index--;
}
// File entry found, copy data out.
entry.name = tar->name;
entry.data = reinterpret_cast<const uint8_t*>(tar) + sizeof(TarHeader);
entry.dataLength = size;
entry.isExecutable = (tar->mode[4] & 0x01) == 1;
return true;
// Achievement unlock: How did we get there ?
return false;
}
extern "C" void (* const apiPointers[])(void);

View File

@@ -1,9 +1,9 @@
ExternalApp = "External"
ExternalAppCapital = "EXTERNAL"
ExternalAppApiMismatch = "API mismatch"
ExternalAppExecError = "Cannot execute file"
ExternalNotCompatible = "External ist nicht kompatibel"
ExternalAppApiMismatch = "API stimmt nicht überein"
ExternalAppExecError = "Datei kann nicht ausgeführt werden"
ExternalNotCompatible = "Externe App ist nicht kompatibel"
WithSimulator = "mit dem Simulator"
WithN0100 = "mit n0100"
GetMoreAppsAt = "Weitere Apps erhalten Sie auf"
NoAppsInstalled = "Keine Apps installiert"
WithN0100 = "mit N0100"
GetMoreAppsAt = "Weitere Apps abrufen bei"
NoAppsInstalled = "Keine Apps installiert"

View File

@@ -29,5 +29,5 @@ NoIntersectionFound = "Kein Schnittpunkt gefunden"
NoPreimageFound = "Kein Urbild gefunden"
DerivativeFunctionColumn = "Spalte der Ableitungsfunktion"
HideDerivativeColumn = "Ableitungsfunktion ausblenden"
AllowedCharactersAZaz09 = "Erlaubte Zeichen: A..Z, a..z, 0..9, _"
AllowedCharactersAZaz09 = "Erlaubt: A..Z, a..z, 0..9, _"
ReservedName = "Reserviertes Wort"

View File

@@ -3,6 +3,7 @@ app_home_src = $(addprefix apps/home/,\
app_cell.cpp \
apps_layout.py \
controller.cpp \
selectable_table_view_with_background.cpp \
)
apps_src += $(app_home_src)

View File

@@ -8,6 +8,7 @@ namespace Home {
AppCell::AppCell() :
HighlightCell(),
m_nameView(KDFont::SmallFont, (I18n::Message)0, 0.5f, 0.5f, Palette::HomeCellText, Palette::HomeCellBackground),
m_backgroundView(nullptr),
m_visible(true), m_external_app(false)
{
}
@@ -15,8 +16,8 @@ AppCell::AppCell() :
void AppCell::drawRect(KDContext * ctx, KDRect rect) const {
KDSize nameSize = m_nameView.minimalSizeForOptimalDisplay();
ctx->fillRect(KDRect(0, bounds().height()-nameSize.height() - 2*k_nameHeightMargin, bounds().width(), nameSize.height()+2*k_nameHeightMargin), Palette::HomeBackground);
}
m_backgroundView->drawRect(ctx, KDRect(0, bounds().height()-nameSize.height() - 2*k_nameHeightMargin, bounds().width(), nameSize.height()+2*k_nameHeightMargin));
}
int AppCell::numberOfSubviews() const {
return m_visible ? 2 : 0;
@@ -70,6 +71,10 @@ void AppCell::setVisible(bool visible) {
}
}
void AppCell::setBackgroundView(const BackgroundView * backgroundView) {
m_backgroundView = backgroundView;
}
void AppCell::reloadCell() {
m_nameView.setTextColor(isHighlighted() ? (m_external_app ? Palette::HomeCellTextExternalActive : Palette::HomeCellTextActive) : (m_external_app ? Palette::HomeCellTextExternal : Palette::HomeCellText));
m_nameView.setBackgroundColor(isHighlighted() ? Palette::HomeCellBackgroundActive : Palette::HomeCellBackground);

View File

@@ -15,6 +15,7 @@ public:
void layoutSubviews(bool force = false) override;
void setVisible(bool visible);
void setBackgroundView(const BackgroundView * backgroundView);
void reloadCell() override;
void setAppDescriptor(::App::Descriptor * appDescriptor);
void setExtAppDescriptor(const char* name, const Image* icon);
@@ -25,8 +26,9 @@ private:
static constexpr KDCoordinate k_iconHeight = 56;
static constexpr KDCoordinate k_nameWidthMargin = 4;
static constexpr KDCoordinate k_nameHeightMargin = 1;
ImageView m_iconView;
IconView m_iconView;
MessageTextView m_nameView;
const BackgroundView * m_backgroundView;
bool m_visible;
bool m_external_app;
};

View File

@@ -1,2 +1,2 @@
Default,calculation,rpn,graph,code,statistics,probability,solver,atom,sequence,regression,settings
HidePython,calculation,rpn,graph,code,statistics,probability,solver,atom,sequence,regression,settings
Default,calculation,rpn,graph,code,statistics,probability,solver,atomic,sequence,regression,settings
HidePython,calculation,rpn,graph,code,statistics,probability,solver,atomic,sequence,regression,settings
1 Default calculation rpn graph code statistics probability solver atom atomic sequence regression settings
2 HidePython calculation rpn graph code statistics probability solver atom atomic sequence regression settings

View File

@@ -18,11 +18,11 @@ extern "C" {
namespace Home {
Controller::ContentView::ContentView(Controller * controller, SelectableTableViewDataSource * selectionDataSource) :
m_selectableTableView(controller, controller, selectionDataSource, controller)
m_selectableTableView(controller, controller, &m_backgroundView, selectionDataSource, controller),
m_backgroundView()
{
m_selectableTableView.setVerticalCellOverlap(0);
m_selectableTableView.setMargins(0, k_sideMargin, k_bottomMargin, k_sideMargin);
m_selectableTableView.setBackgroundColor(Palette::HomeBackground);
static_cast<ScrollView::BarDecorator *>(m_selectableTableView.decorator())->verticalBar()->setMargin(k_indicatorMargin);
}
@@ -31,7 +31,7 @@ SelectableTableView * Controller::ContentView::selectableTableView() {
}
void Controller::ContentView::drawRect(KDContext * ctx, KDRect rect) const {
ctx->fillRect(bounds(), Palette::HomeBackground);
m_selectableTableView.drawRect(ctx, rect);
}
void Controller::ContentView::reloadBottomRow(SimpleTableViewDataSource * dataSource, int numberOfIcons, int numberOfColumns) {
@@ -45,6 +45,10 @@ void Controller::ContentView::reloadBottomRow(SimpleTableViewDataSource * dataSo
}
}
BackgroundView * Controller::ContentView::backgroundView() {
return &m_backgroundView;
}
int Controller::ContentView::numberOfSubviews() const {
return 1;
}
@@ -56,6 +60,8 @@ View * Controller::ContentView::subviewAtIndex(int index) {
void Controller::ContentView::layoutSubviews(bool force) {
m_selectableTableView.setFrame(bounds(), force);
m_backgroundView.setFrame(KDRect(0, Metric::TitleBarHeight, Ion::Display::Width, Ion::Display::Height-Metric::TitleBarHeight), force);
m_backgroundView.updateDataValidity();
}
Controller::Controller(Responder * parentResponder, SelectableTableViewDataSource * selectionDataSource, ::App * app) :
@@ -63,6 +69,21 @@ Controller::Controller(Responder * parentResponder, SelectableTableViewDataSourc
m_view(this, selectionDataSource)
{
m_app = app;
for (int i = 0; i < k_maxNumberOfCells; i++) {
m_cells[i].setBackgroundView(m_view.backgroundView());
}
m_view.backgroundView()->setDefaultColor(Palette::HomeBackground);
#ifdef HOME_DISPLAY_EXTERNALS
int index = External::Archive::indexFromName("wallpaper.obm");
if(index > -1) {
External::Archive::File image;
External::Archive::fileAtIndex(index, image);
m_view.backgroundView()->setBackgroundImage(image.data);
}
#endif
}
bool Controller::handleEvent(Ion::Events::Event event) {

View File

@@ -2,6 +2,7 @@
#define HOME_CONTROLLER_H
#include <escher.h>
#include "selectable_table_view_with_background.h"
#include "app_cell.h"
namespace Home {
@@ -35,11 +36,13 @@ private:
SelectableTableView * selectableTableView();
void drawRect(KDContext * ctx, KDRect rect) const override;
void reloadBottomRow(SimpleTableViewDataSource * dataSource, int numberOfIcons, int numberOfColumns);
BackgroundView * backgroundView();
private:
int numberOfSubviews() const override;
View * subviewAtIndex(int index) override;
void layoutSubviews(bool force = false) override;
SelectableTableView m_selectableTableView;
SelectableTableViewWithBackground m_selectableTableView;
BackgroundView m_backgroundView;
};
static constexpr KDCoordinate k_sideMargin = 4;
static constexpr KDCoordinate k_bottomMargin = 14;

View File

@@ -0,0 +1,16 @@
#include "selectable_table_view_with_background.h"
SelectableTableViewWithBackground::SelectableTableViewWithBackground(Responder * parentResponder, TableViewDataSource * dataSource, BackgroundView * backgroundView, SelectableTableViewDataSource * selectionDataSource, SelectableTableViewDelegate * delegate) :
SelectableTableView(parentResponder, dataSource, selectionDataSource, delegate),
m_backgroundInnerView(this, backgroundView)
{
}
void SelectableTableViewWithBackground::BackgroundInnerView::drawRect(KDContext * ctx, KDRect rect) const {
m_backgroundView->drawRect(ctx, rect);
}
void SelectableTableViewWithBackground::BackgroundInnerView::setBackgroundView(const uint8_t * data) {
m_backgroundView->setBackgroundImage(data);
}

View File

@@ -0,0 +1,25 @@
#ifndef ESCHER_SELECTABLE_TABLE_VIEW_WITH_BACKGROUND_H
#define ESCHER_SELECTABLE_TABLE_VIEW_WITH_BACKGROUND_H
#include <escher/selectable_table_view.h>
#include <escher/background_view.h>
class SelectableTableViewWithBackground : public SelectableTableView {
public:
SelectableTableViewWithBackground(Responder * parentResponder, TableViewDataSource * dataSource, BackgroundView * backgroundView,
SelectableTableViewDataSource * selectionDataSource = nullptr, SelectableTableViewDelegate * delegate = nullptr);
View * subviewAtIndex(int index) override { return (index == 0) ? &m_backgroundInnerView : decorator()->indicatorAtIndex(index); }
protected:
virtual InnerView * getInnerView() { return &m_backgroundInnerView; }
class BackgroundInnerView : public ScrollView::InnerView {
public:
BackgroundInnerView(ScrollView * scrollView, BackgroundView * backgroundView): InnerView(scrollView), m_backgroundView(backgroundView) {}
void drawRect(KDContext * ctx, KDRect rect) const override;
void setBackgroundView(const uint8_t * data);
private:
BackgroundView * m_backgroundView;
};
BackgroundInnerView m_backgroundInnerView;
};
#endif

View File

@@ -23,13 +23,9 @@ parser.add_argument('--codepoints', help='the code_points.h file')
parser.add_argument('--countrypreferences', help='the country_preferences.csv file')
parser.add_argument('--languagepreferences', help='the language_preferences.csv file')
parser.add_argument('--files', nargs='+', help='an i18n file')
parser.add_argument('--generateISO6391locales', type=int, nargs='+', help='whether to generate the ISO6391 codes for the languages (for instance "en" for english)')
args = parser.parse_args()
def generate_ISO6391():
return args.generateISO6391locales[0] == 1
def has_glyph(glyph):
return glyph in codepoints
@@ -196,13 +192,6 @@ def print_header(data, path, locales, countries):
lambda arg: arg.upper(),
" Message::Language")
if generate_ISO6391():
print_block_from_list(f,
"constexpr const Message LanguageISO6391Names[NumberOfLanguages] = {\n",
locales,
lambda arg: arg.upper(),
" Message::LanguageISO6391")
# Countries enumeration
print_block_from_list(f,
"enum class Country : uint8_t {\n",
@@ -236,6 +225,12 @@ def print_header(data, path, locales, countries):
f.write(line[:-2] + "),\n")
f.write("};\n\n")
# Language ISO639-1 codes
f.write("constexpr const char * LanguageISO6391Codes[NumberOfLanguages] = {\n");
for locale in locales:
f.write(" \"" + locale + "\",\n")
f.write("};\n\n")
f.write("}\n\n")
f.write("#endif\n")
f.close()

View File

@@ -1 +0,0 @@
LanguageISO6391DE = "de"

View File

@@ -1 +0,0 @@
LanguageISO6391EN = "en"

View File

@@ -1 +0,0 @@
LanguageISO6391ES = "es"

View File

@@ -1 +0,0 @@
LanguageISO6391FR = "fr"

View File

@@ -1 +0,0 @@
LanguageISO6391IT = "it"

View File

@@ -1 +0,0 @@
LanguageISO6391NL = "nl"

View File

@@ -1 +0,0 @@
LanguageISO6391PT = "pt"

View File

@@ -19,6 +19,12 @@ void ion_main(int argc, const char * const argv[]) {
#else
void ion_main(int argc, const char * const argv[]) {
/* Lock OTP on older devices to prevent garbage being written where the PCB
* version is read. */
#if 0 // We don't want OTP locked on omega :p
Ion::Board::lockUnlockedPCBVersion();
#endif
// Initialize Poincare::TreePool::sharedPool
Poincare::Init();
@@ -36,7 +42,7 @@ void ion_main(int argc, const char * const argv[]) {
continue;
}
for (int j = 0; j < I18n::NumberOfLanguages; j++) {
if (strcmp(requestedLanguageId, I18n::translate(I18n::LanguageISO6391Names[j])) == 0) {
if (strcmp(requestedLanguageId, I18n::LanguageISO6391Codes[j]) == 0) {
GlobalPreferences::sharedGlobalPreferences()->setLanguage((I18n::Language)j);
GlobalPreferences::sharedGlobalPreferences()->setCountry(I18n::DefaultCountryForLanguage[j]);
break;
@@ -53,8 +59,12 @@ void ion_main(int argc, const char * const argv[]) {
const char * appNames[] = {"home", EPSILON_APPS_NAMES};
for (int j = 0; j < AppsContainer::sharedAppsContainer()->numberOfApps(); j++) {
App::Snapshot * snapshot = AppsContainer::sharedAppsContainer()->appSnapshotAtIndex(j);
int cmp = strcmp(argv[i]+2, appNames[j]);
if (cmp == '-') {
// Compare name in order to find if the firsts chars which are different are NULL and '-'
// -> check if the app name is in the argv
const char * s1 = argv[i]+2;
const char * s2 = appNames[j];
while (*s1 != '\0' && (*s1 == *s2)) {s1++; s2++;}
if (*s2 == '\0' && *s1 == '-') {
snapshot->setOpt(argv[i]+2+strlen(appNames[j])+1, argv[i+1]);
break;
}

View File

@@ -1,13 +1,13 @@
UpdateAvailable = "UPDATE VERFÜGBAR"
UpdateAvailable = "AKTUALISIERUNG VERFÜGBAR"
UpdateMessage1 = "Wichtige Verbesserungen für Ihren"
UpdateMessage2 = "Rechner stehen zur Verfügung."
UpdateMessage3 = "Verbinden Sie sich mit Ihrem Computer auf"
UpdateMessage2 = "Taschenrechner stehen zur Verfügung."
UpdateMessage3 = "Verbinden Sie sich mit Ihrem PC mit"
UpdateMessage4 = "www.numworks.com/update."
BetaVersion = "BETA VERSION"
BetaVersion = "VORABVERSION"
BetaVersionMessage1 = ""
BetaVersionMessage2 = "Your device runs a beta software."
BetaVersionMessage3 = "You might run into bugs or glitches."
BetaVersionMessage2 = "Gerät führt eine Vorabversion aus."
BetaVersionMessage3 = "Sie könnten auf Fehler stoßen."
BetaVersionMessage4 = ""
BetaVersionMessage5 = "Please send any feedback to"
BetaVersionMessage5 = "Bitte senden Sie Feedback an"
BetaVersionMessage6 = "contact@numworks.com"
Skip = "Überspringen"

View File

@@ -5,7 +5,7 @@ MeanDot = "mittel"
RegressionCurve = "Regressionskurve"
XPrediction = "Berechne Y"
YPrediction = "Berechne X"
ValueNotReachedByRegression = "Wert in diesem Fenster nicht erreicht"
ValueNotReachedByRegression = "Wert im Fenster nicht erreicht"
NumberOfDots = "Punktanzahl"
Covariance = "Kovarianz"
Linear = "Lineare"

View File

@@ -2,7 +2,7 @@ SequenceApp = "Folge"
SequenceAppCapital = "FOLGE"
SequenceTab = "Folgen"
AddSequence = "Folge hinzufügen"
ChooseSequenceType = "Das Bildungsgesetz der Folge auswählen"
ChooseSequenceType = "Bildungsgesetz der Folge auswählen"
SequenceType = "Bildungsgesetz der Folge"
Explicit = "Explizit"
SingleRecurrence = "Rekursion 1. Ordnung"
@@ -17,6 +17,6 @@ NEnd = "Endwert"
TermSum = "Summe der Terme"
SelectFirstTerm = "Erster Term "
SelectLastTerm = "Letzter Term "
ValueNotReachedBySequence = "Der Wert wird von der Folge nicht erreicht"
ValueNotReachedBySequence = "Wert wird von Folge nicht erreicht"
NColumn = "n-te Spalte"
FirstTermIndex = "Anfangsindex"

View File

@@ -9,8 +9,8 @@ ComplexFormat = "Komplexe Zahlen"
ExamMode = "Prüfungsmodus"
ExamModeActive = "Modus erneut starten"
ToDeactivateExamMode1 = "Um den Prüfungsmodus auszuschalten,"
ToDeactivateExamMode2 = "schließen Sie den Rechner an einen"
ToDeactivateExamMode3 = "Computer oder eine Steckdose an."
ToDeactivateExamMode2 = "schließen Sie den Taschenrechner an"
ToDeactivateExamMode3 = "einen Computer an."
# --------------------- Please do not edit these messages ---------------------
ExamModeWarning1 = "Caution: compliance of this"
ExamModeWarning2 = "unofficial software's exam mode"
@@ -40,9 +40,9 @@ FontSizes = "Python-Schriftgröße"
LargeFont = "Große "
SmallFont = "Kleine "
SerialNumber = "Seriennummer"
UpdatePopUp = "Erinnerung: Update"
BetaPopUp = "Beta pop-up"
Contributors = "Beiträger"
UpdatePopUp = "Erinnerung: Aktualisierung"
BetaPopUp = "Erinnerung: Vorabversion"
Contributors = "Mitwirkende"
Accessibility = "Barrierefreiheit"
AccessibilityInvertColors = "Farbumkehrung"
AccessibilityMagnify = "Lupe"
@@ -62,9 +62,9 @@ SymbolArgFunction = "Leer "
SymbolArgDefaultFunction = "Argument "
PythonFont = "Python Schriftart"
MemUse = "Speicher"
DateTime = "Date/time"
ActivateClock = "Activate clock"
Date = "Date"
Time = "Time"
RTCWarning1 = "Enabling the clock drains the battery faster"
RTCWarning2 = "when the calculator is powered off."
DateTime = "Datum/Uhrzeit"
ActivateClock = "Uhr aktivieren"
Date = "Datum"
Time = "Uhrzeit"
RTCWarning1 = "Das Aktivieren der Uhr verkürzt die"
RTCWarning2 = "Akkulaufzeit im Bereitschaftsmodus."

View File

@@ -19,12 +19,8 @@ constexpr SettingsMessageTree s_symbolFunctionChildren[3] = {SettingsMessageTree
constexpr SettingsMessageTree s_modelMathOptionsChildren[6] = {SettingsMessageTree(I18n::Message::AngleUnit, s_modelAngleChildren), SettingsMessageTree(I18n::Message::DisplayMode, s_modelFloatDisplayModeChildren), SettingsMessageTree(I18n::Message::EditionMode, s_modelEditionModeChildren), SettingsMessageTree(I18n::Message::SymbolFunction, s_symbolFunctionChildren), SettingsMessageTree(I18n::Message::ComplexFormat, s_modelComplexFormatChildren), SettingsMessageTree(I18n::Message::SymbolMultiplication, s_symbolChildren)};
constexpr SettingsMessageTree s_modelFontChildren[2] = {SettingsMessageTree(I18n::Message::LargeFont), SettingsMessageTree(I18n::Message::SmallFont)};
constexpr SettingsMessageTree s_accessibilityChildren[6] = {SettingsMessageTree(I18n::Message::AccessibilityInvertColors), SettingsMessageTree(I18n::Message::AccessibilityMagnify),SettingsMessageTree(I18n::Message::AccessibilityGamma),SettingsMessageTree(I18n::Message::AccessibilityGammaRed),SettingsMessageTree(I18n::Message::AccessibilityGammaGreen),SettingsMessageTree(I18n::Message::AccessibilityGammaBlue)};
constexpr SettingsMessageTree s_contributorsChildren[20] = {SettingsMessageTree(I18n::Message::Developers), SettingsMessageTree(I18n::Message::QuentinGuidee), SettingsMessageTree(I18n::Message::SandraSimmons), SettingsMessageTree(I18n::Message::JoachimLeFournis), SettingsMessageTree(I18n::Message::JeanBaptisteBoric), SettingsMessageTree(I18n::Message::MaximeFriess), SettingsMessageTree(I18n::Message::David), SettingsMessageTree(I18n::Message::DamienNicolet), SettingsMessageTree(I18n::Message::EvannDreumont), SettingsMessageTree(I18n::Message::SzaboLevente), SettingsMessageTree(I18n::Message::VenceslasDuet), SettingsMessageTree(I18n::Message::CharlotteThomas), SettingsMessageTree(I18n::Message::AntoninLoubiere), SettingsMessageTree(I18n::Message::BetaTesters), SettingsMessageTree(I18n::Message::CyprienMejat), SettingsMessageTree(I18n::Message::TimeoArnouts), SettingsMessageTree(I18n::Message::JulieC), SettingsMessageTree(I18n::Message::LelahelHideux), SettingsMessageTree(I18n::Message::Madil), SettingsMessageTree(I18n::Message::HilaireLeRoux)};
#ifdef OMEGA_USERNAME
constexpr SettingsMessageTree s_contributorsChildren[23] = {SettingsMessageTree(I18n::Message::Developers), SettingsMessageTree(I18n::Message::QuentinGuidee), SettingsMessageTree(I18n::Message::JoachimLeFournis), SettingsMessageTree(I18n::Message::MaximeFriess), SettingsMessageTree(I18n::Message::JeanBaptisteBoric), SettingsMessageTree(I18n::Message::SandraSimmons), SettingsMessageTree(I18n::Message::David), SettingsMessageTree(I18n::Message::DamienNicolet), SettingsMessageTree(I18n::Message::EvannDreumont), SettingsMessageTree(I18n::Message::SzaboLevente), SettingsMessageTree(I18n::Message::VenceslasDuet), SettingsMessageTree(I18n::Message::CharlotteThomas), SettingsMessageTree(I18n::Message::AntoninLoubiere), SettingsMessageTree(I18n::Message::CyprienMejat), SettingsMessageTree(I18n::Message::BetaTesters), SettingsMessageTree(I18n::Message::TimeoArnouts), SettingsMessageTree(I18n::Message::JulieC), SettingsMessageTree(I18n::Message::LelahelHideux), SettingsMessageTree(I18n::Message::Madil), SettingsMessageTree(I18n::Message::HilaireLeRoux), SettingsMessageTree(I18n::Message::HectorNussbaumer), SettingsMessageTree(I18n::Message::RaphaelDyda), SettingsMessageTree(I18n::Message::ThibautC)};
constexpr SettingsMessageTree s_modelAboutChildren[8] = {SettingsMessageTree(I18n::Message::Username), SettingsMessageTree(I18n::Message::SoftwareVersion), SettingsMessageTree(I18n::Message::OmegaVersion), SettingsMessageTree(I18n::Message::MicroPythonVersion), SettingsMessageTree(I18n::Message::MemUse), SettingsMessageTree(I18n::Message::SerialNumber), SettingsMessageTree(I18n::Message::FccId), SettingsMessageTree(I18n::Message::Contributors, s_contributorsChildren)};
#else
constexpr SettingsMessageTree s_modelAboutChildren[7] = {SettingsMessageTree(I18n::Message::SoftwareVersion), SettingsMessageTree(I18n::Message::OmegaVersion), SettingsMessageTree(I18n::Message::MicroPythonVersion), SettingsMessageTree(I18n::Message::MemUse), SettingsMessageTree(I18n::Message::SerialNumber), SettingsMessageTree(I18n::Message::FccId), SettingsMessageTree(I18n::Message::Contributors, s_contributorsChildren)};
#endif
MainController::MainController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate) :
ViewController(parentResponder),

View File

@@ -24,12 +24,8 @@ extern const Shared::SettingsMessageTree s_modelMathOptionsChildren[6];
extern const Shared::SettingsMessageTree s_modelFontChildren[2];
extern const Shared::SettingsMessageTree s_modelDateTimeChildren[3];
extern const Shared::SettingsMessageTree s_accessibilityChildren[6];
extern const Shared::SettingsMessageTree s_contributorsChildren[20];
#ifdef OMEGA_USERNAME
extern const Shared::SettingsMessageTree s_contributorsChildren[23];
extern const Shared::SettingsMessageTree s_modelAboutChildren[8];
#else
extern const Shared::SettingsMessageTree s_modelAboutChildren[7];
#endif
extern const Shared::SettingsMessageTree s_model;
class MainController : public ViewController, public ListViewDataSource, public SelectableTableViewDataSource {

View File

@@ -29,7 +29,7 @@ AboutController::AboutController(Responder * parentResponder) :
}
bool AboutController::handleEvent(Ion::Events::Event event) {
I18n::Message childLabel = m_messageTreeModel->childAtIndex(selectedRow())->label();
I18n::Message childLabel = m_messageTreeModel->childAtIndex(selectedRow()+(!hasUsernameCell()))->label();
/* We hide here the activation hardware test app: in the menu "about", by
* clicking on '6' on the last row. */
if ((event == Ion::Events::Six || event == Ion::Events::LowerT || event == Ion::Events::UpperT) && childLabel == I18n::Message::FccId) {
@@ -39,19 +39,24 @@ bool AboutController::handleEvent(Ion::Events::Event event) {
if (event == Ion::Events::OK || event == Ion::Events::EXE || event == Ion::Events::Right) {
if (childLabel == I18n::Message::Contributors) {
GenericSubController * subController = &m_contributorsController;
subController->setMessageTreeModel(m_messageTreeModel->childAtIndex(selectedRow()));
subController->setMessageTreeModel(m_messageTreeModel->childAtIndex(selectedRow()+(!hasUsernameCell())));
StackViewController * stack = stackController();
m_lastSelect = selectedRow();
stack->push(subController);
return true;
}
if (!(event == Ion::Events::Right)) {
if (childLabel == I18n::Message::SoftwareVersion) {
MessageTableCellWithBuffer * myCell = (MessageTableCellWithBuffer *)m_selectableTableView.selectedCell();
if (strcmp(myCell->accessoryText(), Ion::patchLevel()) == 0) {
const char * currentText = myCell->accessoryText();
if (strcmp(currentText, Ion::patchLevel()) == 0) {
myCell->setAccessoryText(Ion::pcbVersion());
} else if (strcmp(currentText, Ion::pcbVersion()) == 0) {
myCell->setAccessoryText(Ion::softwareVersion());
return true;
} else {
assert(strcmp(currentText, Ion::softwareVersion()) == 0);
myCell->setAccessoryText(Ion::patchLevel());
}
myCell->setAccessoryText(Ion::patchLevel());
return true;
}
if (childLabel == I18n::Message::OmegaVersion) {
@@ -96,11 +101,15 @@ bool AboutController::handleEvent(Ion::Events::Event event) {
return GenericSubController::handleEvent(event);
}
int AboutController::numberOfRows() const {
return m_messageTreeModel->numberOfChildren() - (!hasUsernameCell());
}
HighlightCell * AboutController::reusableCell(int index, int type) {
assert(index >= 0);
if (type == 0) {
assert(index < k_totalNumberOfCell-1);
return &m_cells[index];
assert(index < k_totalNumberOfCell-1-(!hasUsernameCell()));
return &m_cells[index+(!hasUsernameCell())];
}
assert(index == 0);
return &m_contributorsCell;
@@ -113,7 +122,7 @@ int AboutController::typeAtLocation(int i, int j) {
int AboutController::reusableCellCount(int type) {
switch (type) {
case 0:
return k_totalNumberOfCell-1;
return k_totalNumberOfCell-1-(!hasUsernameCell());
case 1:
return 1;
default:
@@ -122,13 +131,18 @@ int AboutController::reusableCellCount(int type) {
}
}
bool AboutController::hasUsernameCell() const {
return (*Ion::username()) != 0;
}
void AboutController::willDisplayCellForIndex(HighlightCell * cell, int index) {
GenericSubController::willDisplayCellForIndex(cell, index);
int i = index + (!hasUsernameCell());
GenericSubController::willDisplayCellForIndex(cell, i);
assert(index >= 0 && index < k_totalNumberOfCell);
if (m_messageTreeModel->childAtIndex(index)->label() == I18n::Message::Contributors) {
if (m_messageTreeModel->childAtIndex(i)->label() == I18n::Message::Contributors) {
MessageTableCellWithChevronAndMessage * myTextCell = (MessageTableCellWithChevronAndMessage *)cell;
myTextCell->setSubtitle(I18n::Message::Default);
} else if (m_messageTreeModel->childAtIndex(index)->label() == I18n::Message::MemUse) {
} else if (m_messageTreeModel->childAtIndex(i)->label() == I18n::Message::MemUse) {
char memUseBuffer[15];
int len = Poincare::Integer((int)((float) (Ion::Storage::k_storageSize - Ion::Storage::sharedStorage()->availableSize()) / 1024.f)).serialize(memUseBuffer, 4);
memUseBuffer[len] = 'k';
@@ -146,17 +160,16 @@ void AboutController::willDisplayCellForIndex(HighlightCell * cell, int index) {
MessageTableCellWithBuffer * myCell = (MessageTableCellWithBuffer *)cell;
static const char * mpVersion = MICROPY_VERSION_STRING;
static const char * messages[] = {
#ifdef OMEGA_USERNAME
Ion::username(),
#endif
(const char*) Ion::username(),
Ion::softwareVersion(),
Ion::omegaVersion(),
mpVersion,
"",
Ion::serialNumber(),
Ion::fccId()
Ion::fccId(),
""
};
myCell->setAccessoryText(messages[index]);
myCell->setAccessoryText(messages[i]);
}
}

View File

@@ -20,12 +20,10 @@ public:
int reusableCellCount(int type) override;
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
int typeAtLocation(int i, int j) override;
int numberOfRows() const override;
private:
#ifdef OMEGA_USERNAME
constexpr static int k_totalNumberOfCell = 8;
#else
constexpr static int k_totalNumberOfCell = 7;
#endif
bool hasUsernameCell() const;
ContributorsController m_contributorsController;
MessageTableCellWithChevronAndMessage m_contributorsCell;
//SelectableViewWithMessages m_view;

View File

@@ -28,13 +28,13 @@ int ContributorsController::reusableCellCount(int type) {
return k_totalNumberOfCell;
}
constexpr static int s_numberOfDevelopers = 12;
constexpr static int s_numberOfDevelopers = 13;
constexpr static I18n::Message s_developersUsernames[s_numberOfDevelopers] = {
I18n::Message::PQuentinGuidee,
I18n::Message::PSandraSimmons,
I18n::Message::PJoachimLeFournis,
I18n::Message::PJeanBaptisteBoric,
I18n::Message::PMaximeFriess,
I18n::Message::PJeanBaptisteBoric,
I18n::Message::PSandraSimmons,
I18n::Message::PDavid,
I18n::Message::PDamienNicolet,
I18n::Message::PEvannDreumont,
@@ -42,16 +42,19 @@ constexpr static I18n::Message s_developersUsernames[s_numberOfDevelopers] = {
I18n::Message::PVenceslasDuet,
I18n::Message::PCharlotteThomas,
I18n::Message::PAntoninLoubiere,
I18n::Message::PCyprienMejat,
};
constexpr static int s_numberOfBetaTesters = 6;
constexpr static int s_numberOfBetaTesters = 8;
constexpr static I18n::Message s_betaTestersUsernames[s_numberOfBetaTesters] = {
I18n::Message::PCyprienMejat,
I18n::Message::PTimeoArnouts,
I18n::Message::PJulieC,
I18n::Message::PLelahelHideux,
I18n::Message::PMadil,
I18n::Message::PHilaireLeRoux,
I18n::Message::PHectorNussbaumer,
I18n::Message::PRaphaelDyda,
I18n::Message::PThibautC,
};
void ContributorsController::willDisplayCellForIndex(HighlightCell * cell, int index) {

View File

@@ -23,8 +23,9 @@ public:
void setMessageTreeModel(const MessageTree * messageTreeModel);
void viewDidDisappear() override;
protected:
int m_lastSelect = 0;
StackViewController * stackController() const;
virtual int initialSelectedRow() const { return 0; }
virtual int initialSelectedRow() const { return m_lastSelect; }
constexpr static KDCoordinate k_topBottomMargin = 13;
SelectableTableView m_selectableTableView;
MessageTree * m_messageTreeModel;

View File

@@ -25,6 +25,7 @@ bool MathOptionsController::handleEvent(Ion::Events::Event event) {
subController = &m_preferencesController;
subController->setMessageTreeModel(m_messageTreeModel->childAtIndex(selectedRow()));
StackViewController * stack = stackController();
m_lastSelect = selectedRow();
stack->push(subController);
return true;
}

View File

@@ -4,7 +4,7 @@ ActivateExamMode = "Prüfungsmodus starten"
ActiveExamModeMessage1 = "Alle Ihre Daten werden "
ActiveExamModeMessage2 = "gelöscht, wenn Sie den "
ActiveExamModeMessage3 = "Prüfungsmodus einschalten."
ActiveDutchExamModeMessage1 = "Alle Ihre Daten werden gelöscht, wenn"
ActiveDutchExamModeMessage1 = "Alle Daten werden gelöscht, wenn"
ActiveDutchExamModeMessage2 = "Sie den Prüfungsmodus einschalten. "
ActiveDutchExamModeMessage3 = "Python wird nicht verfügbar sein."
Axis = "Achse"
@@ -25,7 +25,7 @@ CountryNL = "Niederlande "
CountryPT = "Portugal "
CountryUS = "Vereinigte Staaten "
CountryWW = "International "
CountryWarning1 = "Diese Einstellung definiert die verwendeten"
CountryWarning1 = "Einstellung definiert verwendete"
CountryWarning2 = "mathematischen Konventionen."
DataNotSuitable = "Daten nicht geeignet"
DataTab = "Daten"
@@ -43,16 +43,16 @@ FunctionColumn = "0(0) Spalte"
FunctionOptions = "Funktionsoptionen"
Goto = "Gehe zu"
GraphTab = "Graph"
HardwareTestLaunch1 = "Sie sind dabei den Hardwaretest zu"
HardwareTestLaunch2 = "starten. Um ihn wieder zu verlassen,"
HardwareTestLaunch3 = "müssen Sie einen Reset durchfuhren,"
HardwareTestLaunch1 = "Sie sind dabei, den Hardwaretest zu"
HardwareTestLaunch2 = "starten. Um ihn zu verlassen,"
HardwareTestLaunch3 = "müssen Sie einen Reset durchführen,"
HardwareTestLaunch4 = "der Ihre Daten löschen wird."
IntervalSet = "Intervall einstellen"
Language = "Sprache"
LowBattery = "Batterie erschöpft"
LowBattery = "Akku erschöpft"
Mean = "Mittelwert"
Move = " Verschieben: "
NameCannotStartWithNumber = "Ein Name darf nicht mit einer Zahl beginnen"
NameCannotStartWithNumber = "Name darf nicht mit Zahl beginnen"
NameTaken = "Dieser Name ist bereits vergeben"
NameTooLong = "Der Name ist zu lang"
Navigate = "Navigieren"
@@ -70,14 +70,14 @@ PoolMemoryFull1 = "Der Arbeitsspeicher ist voll."
PoolMemoryFull2 = "Versuchen Sie es erneut."
Rename = "Umbenennen"
Sci = "wiss"
SortValues = "Nach steigenden Werten sortieren"
SortSizes = "Nach steigenden Frequenzen sortieren"
SortValues = "Nach Werten sortieren"
SortSizes = "Nach Frequenzen sortieren"
SquareSum = "Quadratsumme"
StatTab = "Stats"
StandardDeviation = "Standardabweichung"
Step = "Schrittwert"
StorageMemoryFull1 = "Der Speicher ist voll. Löschen Sie"
StorageMemoryFull2 = "einige Daten und versuchen Sie es erneut."
StorageMemoryFull2 = "einige Daten, dann erneut versuchen."
StoreExpressionNotAllowed = "'store' ist verboten"
SyntaxError = "Syntaxfehler"
Sym = "sym"

View File

@@ -343,7 +343,7 @@ CyprienMejat = "Cyprien Méjat"
PCyprienMejat = "@A2drien"
TimeoArnouts = "Timéo Arnouts"
PTimeoArnouts = "@Dogm"
JulieC = "Julie C"
JulieC = "Julie C."
PJulieC = "@windows9x95"
LelahelHideux = "Lélahel Hideux"
PLelahelHideux = "@Lelahelry"
@@ -351,6 +351,12 @@ Madil = "Madil"
PMadil = "@le-grand-mannitout"
HilaireLeRoux = "Hilaire Le Roux"
PHilaireLeRoux = "@0Babass2"
HectorNussbaumer = "Hector Nussbaumer"
PHectorNussbaumer = "@Sycorax"
RaphaelDyda = "Raphaël Dyda"
PRaphaelDyda = "@Trixciel"
ThibautC = "Thibaut C."
PThibautC = "@Tibo_C"
SpeedOfLight = "2.99792458·10^8_m_s^-1"
YearLight = "9.461·10^15_m"
Boltzmann = "1.380649·10^-23_J_K^-1"

View File

@@ -13,12 +13,12 @@ LocalizationController::ContentView::ContentView(LocalizationController * contro
m_countryTitleMessage(KDFont::LargeFont, I18n::Message::Country),
m_borderView(Palette::BackgroundApps)
{
m_countryTitleMessage.setBackgroundColor(Palette::WallScreen);
m_countryTitleMessage.setBackgroundColor(Palette::BackgroundHard);
m_countryTitleMessage.setAlignment(0.5f, 0.5f);
assert(k_numberOfCountryWarningLines == 2); // textMessages is not overflowed
I18n::Message textMessages[k_numberOfCountryWarningLines] = {I18n::Message::CountryWarning1, I18n::Message::CountryWarning2};
for (int i = 0; i < k_numberOfCountryWarningLines; i++) {
m_countryWarningLines[i].setBackgroundColor(Palette::WallScreen);
m_countryWarningLines[i].setBackgroundColor(Palette::BackgroundHard);
m_countryWarningLines[i].setFont(KDFont::SmallFont);
m_countryWarningLines[i].setAlignment(0.5f, 0.5f);
m_countryWarningLines[i].setMessage(textMessages[i]);

View File

@@ -45,7 +45,7 @@ protected:
ContentView(LocalizationController * controller, SelectableTableViewDataSource * dataSource);
SelectableTableView * selectableTableView() { return &m_selectableTableView; }
void drawRect(KDContext * ctx, KDRect rect) const override { ctx->fillRect(bounds(), Palette::WallScreen); }
void drawRect(KDContext * ctx, KDRect rect) const override { ctx->fillRect(bounds(), Palette::BackgroundApps); }
void modeHasChanged();
private:

View File

@@ -4,7 +4,7 @@ AddEquation = "Gleichung hinzufügen"
ResolveEquation = "Lösen der Gleichung"
ResolveSystem = "Lösen des Gleichungssystems"
UseEquationModel = "Verwenden Sie ein Gleichungsmodell"
RequireEquation = "Die Eingabe muss eine Gleichung sein"
RequireEquation = "Eingabe muss eine Gleichung sein"
UndefinedEquation = "Nicht definierte Gleichung"
UnrealEquation = "Nicht reelle Gleichung"
TooManyVariables = "Es gibt zu viele Unbekannte"
@@ -17,8 +17,8 @@ NoSolutionEquation = "Die Gleichung hat keine Lösung"
NoSolutionInterval = "Keine Lösung im Intervall gefunden"
EnterEquation = "Geben Sie eine Gleichung ein"
InfiniteNumberOfSolutions = "Es gibt unendlich viele Lösungen"
ApproximateSolutionIntervalInstruction0= "Geben Sie das Intervall für die Suche"
ApproximateSolutionIntervalInstruction1= "nach einer ungefähren Lösung ein"
ApproximateSolutionIntervalInstruction0= "Geben Sie das Suchintervall"
ApproximateSolutionIntervalInstruction1= "für eine ungefähre Lösung ein"
OnlyFirstSolutionsDisplayed0 = "Es werden nur die ersten"
OnlyFirstSolutionsDisplayed1 = "zehn Lösungen angezeigt."
PolynomeHasNoRealSolution0 = "Das Polynom hat"

View File

@@ -25,15 +25,15 @@ UnitDistanceParsec = "Parsec"
UnitDistanceMile = "Meile"
UnitDistanceYard = "Yard"
UnitDistanceFoot = "Fuß"
UnitDistanceInch = "Inch"
UnitDistanceInch = "Zoll"
UnitMassMenu = "Masse"
UnitMassGramKilo = "Kilogramm"
UnitMassGram = "Gramm"
UnitMassGramMilli = "Milligramm"
UnitMassGramMicro = "Mikrogramm"
UnitMassGramNano = "Nanogramm"
UnitDistanceImperialMenu = "US Customary"
UnitMassImperialMenu = "US Customary"
UnitDistanceImperialMenu = "Angloamerikanisch"
UnitMassImperialMenu = "Angloamerikanisch"
UnitMassTonne = "Tonne"
UnitMassOunce = "Unze"
UnitMassPound = "Pfund"
@@ -95,7 +95,7 @@ UnitVolumePint = "Pint"
UnitVolumeQuart = "Quart"
UnitVolumeGallon = "Gallone"
UnitMetricMenu = "Metrisch"
UnitImperialMenu = "Empire"
UnitImperialMenu = "Angloamerikanisch"
Toolbox = "Werkzeugkasten"
AbsoluteValue = "Betragsfunktion"
NthRoot = "n-te Wurzel"
@@ -137,34 +137,34 @@ Vectors = "Vektoren"
Dot = "Skalarprodukt"
Cross = "Kreuzprodukt"
NormVector = "Norm"
Sort = "Sortieren aufsteigend"
InvSort = "Sortieren absteigend"
Sort = "Aufsteigend sortieren"
InvSort = "Absteigend sortieren"
Maximum = "Maximalwert"
Minimum = "Mindestwert"
Floor = "Untergrenze"
FracPart = "Bruchteil"
Ceiling = "Obergrenze"
Rounding = "Runden"
HyperbolicCosine = "Kosinus hyperbolicus"
HyperbolicSine = "Sinus hyperbolicus"
HyperbolicTangent = "Tangens hyperbolicus"
InverseHyperbolicCosine = "Areakosinus hyperbolicus"
InverseHyperbolicSine = "Areasinus hyperbolicus"
InverseHyperbolicTangent = "Areatangens hyperbolicus"
Prediction95 = "Schwankungsbereich 95%"
Prediction = "Einfacher Schwankungsbereich"
HyperbolicCosine = "Hyperbolischer Kosinus"
HyperbolicSine = "Hyperbolischer Sinus"
HyperbolicTangent = "Hyperbolischer Tangens"
InverseHyperbolicCosine = "Inverser hyperbolischer Kosinus"
InverseHyperbolicSine = "Inverser hyperbolischer Sinus"
InverseHyperbolicTangent = "Inverser hyperbolischer Tangens"
Prediction95 = "Vorhersageintervall 95%"
Prediction = "Einfaches Vorhersageintervall"
Confidence = "Konfidenzintervall"
RandomAndApproximation = "Zufall und Näherung"
RandomFloat = "Dezimalzahl in [0,1]"
RandomFloat = "Fließkommazahl in [0,1]"
RandomInteger = "Zufällige ganze Zahl in [a,b]"
PrimeFactorDecomposition = "Primfaktorzerlegung"
NormCDF = "P(X<a) wo X folgt N(μ,σ)"
NormCDF2 = "P(a<X<b) wo X folgt N(μ,σ)"
InvNorm = "m wo P(X<m)=a und X folgt N(μ,σ)"
PrimeFactorDecomposition = "Ganzzahlige Faktorisierung"
NormCDF = "P(X<a) wobei X auf N(μ,σ) folgt"
NormCDF2 = "P(a<X<b) wobei X auf N(μ,σ) folgt"
InvNorm = "m wobei P(X<m)=a, X folgt N(μ,σ)"
NormPDF = "Wahrscheinlichkeitsdichte N(μ,σ)"
BinomialPDF = "P(X=m) wo X folgt B(n,p)"
BinomialCDF = "P(X<=m) wo X folgt B(n,p)"
InvBinomial = "m wo P(X<=m)=a und X folgt B(n,p)"
BinomialPDF = "P(X=m) wobei X auf B(n,p) folgt"
BinomialCDF = "P(X<=m) wobei X auf B(n,p) folgt"
InvBinomial = "m wobei P(X<=m)=a, X folgt B(n,p)"
Probability = "Wahrscheinlichkeit"
BinomialDistribution = "Binomialverteilung"
NormalDistribution = "Normalverteilung"

View File

@@ -1,7 +1,7 @@
USBConnected = "DER RECHNER IST ANGESCHLOSSEN"
USBConnected = "TASCHENRECHNER IST ANGESCHLOSSEN"
ConnectedMessage1 = "Um Daten zu übertragen, verbinden"
ConnectedMessage2 = "Sie Sich von Ihrem Computer aus mit"
ConnectedMessage2 = "Sie sich von Ihrem Computer aus mit"
ConnectedMessage3 = "workshop.numworks.com."
ConnectedMessage4 = "Drücken Sie die RETURN-Taste am"
ConnectedMessage5 = "Taschenrechner oder ziehen Sie das Kabel,"
ConnectedMessage4 = "Drücken Sie die Zurück-Taste am"
ConnectedMessage5 = "Taschenrechner oder Kabel abziehen,"
ConnectedMessage6 = "um die Verbindung zu trennen."

View File

@@ -4,16 +4,15 @@ PLATFORM ?= device
DEBUG ?= 0
HOME_DISPLAY_EXTERNALS ?= 1
EPSILON_VERSION ?= 15.3.1
OMEGA_VERSION ?= 1.21.0
EPSILON_VERSION ?= 15.5.0
OMEGA_VERSION ?= 1.22.0
# OMEGA_USERNAME ?= N/A
OMEGA_STATE ?= public
EPSILON_APPS ?= calculation rpn graph code statistics probability solver atom sequence regression settings external
SUBMODULES_APPS = atom rpn
OMEGA_STATE ?= dev
EPSILON_APPS ?= calculation rpn graph code statistics probability solver atomic sequence regression settings external
SUBMODULES_APPS = atomic rpn
EPSILON_I18N ?= en fr nl pt it de es hu
EPSILON_COUNTRIES ?= WW CA DE ES FR GB IT NL PT US
EPSILON_GETOPT ?= 0
EPSILON_TELEMETRY ?= 0
ESCHER_LOG_EVENTS_BINARY ?= 0
THEME_NAME ?= omega_light
THEME_REPO ?= local

View File

@@ -4,6 +4,8 @@
# This work is licensed under the MIT license, see the file LICENSE for
# details.
# This script has been modified by NumWorks contributors
"""This module implements enough functionality to program the STM32F4xx over
DFU, without requiring dfu-util.
See app note AN3156 for a description of the DFU protocol.

52
build/device/usb/__init__.py Executable file → Normal file
View File

@@ -1,17 +1,32 @@
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
r"""PyUSB - Easy USB access in Python
@@ -33,8 +48,19 @@ import os
__author__ = 'Wander Lairson Costa'
# Use Semantic Versioning, http://semver.org/
version_info = (1, 0, 2)
__version__ = '%d.%d.%d' % version_info
try:
from usb._version import version as __version__
except ImportError:
__version__ = '0.0.0'
def _get_extended_version_info(version):
import re
m = re.match(r'(\d+)\.(\d+)\.(\d+)[.-]?(.*)', version)
major, minor, patch, suffix = m.groups()
return int(major), int(minor), int(patch), suffix
extended_version_info = _get_extended_version_info(__version__)
version_info = extended_version_info[:3]
__all__ = ['legacy', 'control', 'core', 'backend', 'util', 'libloader']

37
build/device/usb/_debug.py Executable file → Normal file
View File

@@ -1,17 +1,32 @@
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
__author__ = 'Wander Lairson Costa'

39
build/device/usb/_interop.py Executable file → Normal file
View File

@@ -1,17 +1,32 @@
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# All the hacks necessary to assure compatibility across all
# supported versions come here.
@@ -81,5 +96,5 @@ def as_array(data=None):
# When you pass a unicode string or a character sequence,
# you get a TypeError if the first parameter does not match
a = array.array('B')
a.fromstring(data) # deprecated since 3.2
a.frombytes(data.encode('utf-8'))
return a

37
build/device/usb/_lookup.py Executable file → Normal file
View File

@@ -1,17 +1,32 @@
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
r"""usb._lookups - Lookup tables for USB
"""

37
build/device/usb/_objfinalizer.py Executable file → Normal file
View File

@@ -1,19 +1,34 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import sys

43
build/device/usb/backend/__init__.py Executable file → Normal file
View File

@@ -1,17 +1,32 @@
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
r"""usb.backend - Backend interface.
@@ -62,7 +77,7 @@ import usb._objfinalizer as _objfinalizer
__author__ = 'Wander Lairson Costa'
__all__ = ['IBackend', 'libusb01', 'libusb10', 'openusb']
__all__ = ['IBackend', 'libusb0', 'libusb1', 'openusb']
def _not_implemented(func):
raise NotImplementedError(func.__name__)
@@ -196,7 +211,7 @@ class IBackend(_objfinalizer.AutoFinalizedObject):
This method should only be called when the interface has more than
one alternate setting. The dev_handle is the value returned by the
open_device() method. intf and altsetting are respectivelly the
open_device() method. intf and altsetting are respectively the
bInterfaceNumber and bAlternateSetting fields of the related interface.
"""
_not_implemented(self.set_interface_altsetting)
@@ -268,7 +283,7 @@ class IBackend(_objfinalizer.AutoFinalizedObject):
_not_implemented(self.intr_write)
def intr_read(self, dev_handle, ep, intf, size, timeout):
r"""Perform an interrut read.
r"""Perform an interrupt read.
dev_handle is the value returned by the open_device() method.
The ep parameter is the bEndpointAddress field whose endpoint

80
build/device/usb/backend/libusb0.py Executable file → Normal file
View File

@@ -1,24 +1,40 @@
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from ctypes import *
import errno
import os
import usb.backend
import usb.util
import sys
from usb.core import USBError
from usb.core import USBError, USBTimeoutError
from usb._debug import methodtrace
import usb._interop as _interop
import logging
@@ -30,6 +46,8 @@ __all__ = ['get_backend']
_logger = logging.getLogger('usb.backend.libusb0')
_USBFS_MAXDRIVERNAME = 255
# usb.h
if sys.platform.find('bsd') != -1 or sys.platform.find('mac') != -1 or \
@@ -350,6 +368,14 @@ def _setup_prototypes(lib):
# linux only
# int usb_get_driver_np(usb_dev_handle *dev,
# int interface,
# char *name,
# unsigned int namelen);
if hasattr(lib, 'usb_get_driver_np'):
lib.usb_get_driver_np.argtypes = \
[_usb_dev_handle, c_int, c_char_p, c_uint]
# int usb_detach_kernel_driver_np(usb_dev_handle *dev, int interface);
if hasattr(lib, 'usb_detach_kernel_driver_np'):
lib.usb_detach_kernel_driver_np.argtypes = [_usb_dev_handle, c_int]
@@ -415,6 +441,9 @@ def _check(ret):
errmsg = os.strerror(-ret)
else:
return ret
if ret is not None and -ret == errno.ETIMEDOUT:
raise USBTimeoutError(errmsg, ret, -ret)
raise USBError(errmsg, ret)
def _has_iso_transfer():
@@ -588,8 +617,35 @@ class _LibUSB(usb.backend.IBackend):
def reset_device(self, dev_handle):
_check(_lib.usb_reset(dev_handle))
@methodtrace(_logger)
def is_kernel_driver_active(self, dev_handle, intf):
if not hasattr(_lib, 'usb_get_driver_np'):
raise NotImplementedError(self.is_kernel_driver_active.__name__)
from errno import ENODATA
buf = usb.util.create_buffer(_USBFS_MAXDRIVERNAME + 1)
name, length = buf.buffer_info()
length *= buf.itemsize
# based on the implementation of libusb_kernel_driver_active
# (see libusb/os/linux_usbfs.c @@ op_kernel_driver_active):
# usb_get_driver_np fails with ENODATA when no kernel driver is bound,
# and if 'usbfs' is bound that means that a userspace program is
# controlling the device (e.g. using this very library)
try:
_check(_lib.usb_get_driver_np(
dev_handle,
intf,
cast(name, c_char_p),
length))
return cast(name, c_char_p).value != b'usbfs'
except USBError as err:
if err.backend_error_code == -ENODATA:
return False
raise err
@methodtrace(_logger)
def detach_kernel_driver(self, dev_handle, intf):
if not hasattr(_lib, 'usb_detach_kernel_driver_np'):
raise NotImplementedError(self.detach_kernel_driver.__name__)
_check(_lib.usb_detach_kernel_driver_np(dev_handle, intf))
def __write(self, fn, dev_handle, ep, intf, data, timeout):

58
build/device/usb/backend/libusb1.py Executable file → Normal file
View File

@@ -1,17 +1,32 @@
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from ctypes import *
import usb.util
@@ -22,14 +37,14 @@ import usb._interop as _interop
import usb._objfinalizer as _objfinalizer
import errno
import math
from usb.core import USBError
from usb.core import USBError, USBTimeoutError
import usb.libloader
__author__ = 'Wander Lairson Costa'
__all__ = [
'get_backend',
'LIBUSB_SUCESS',
'LIBUSB_SUCCESS',
'LIBUSB_ERROR_IO',
'LIBUSB_ERROR_INVALID_PARAM',
'LIBUSB_ERROR_ACCESS',
@@ -42,14 +57,14 @@ __all__ = [
'LIBUSB_ERROR_INTERRUPTED',
'LIBUSB_ERROR_NO_MEM',
'LIBUSB_ERROR_NOT_SUPPORTED',
'LIBUSB_ERROR_OTHER'
'LIBUSB_ERROR_OTHER',
'LIBUSB_TRANSFER_COMPLETED',
'LIBUSB_TRANSFER_ERROR',
'LIBUSB_TRANSFER_TIMED_OUT',
'LIBUSB_TRANSFER_CANCELLED',
'LIBUSB_TRANSFER_STALL',
'LIBUSB_TRANSFER_NO_DEVICE',
'LIBUSB_TRANSFER_OVERFLOW'
'LIBUSB_TRANSFER_OVERFLOW',
]
_logger = logging.getLogger('usb.backend.libusb1')
@@ -256,6 +271,7 @@ def _get_iso_packet_list(transfer):
return list_type.from_address(addressof(transfer.iso_packet_desc))
_lib = None
_lib_object = None
def _load_library(find_library=None):
# Windows backend uses stdcall calling convention
@@ -582,6 +598,8 @@ def _check(ret):
if ret < 0:
if ret == LIBUSB_ERROR_NOT_SUPPORTED:
raise NotImplementedError(_strerror(ret))
elif ret == LIBUSB_ERROR_TIMEOUT:
raise USBTimeoutError(_strerror(ret), ret, _libusb_errno[ret])
else:
raise USBError(_strerror(ret), ret, _libusb_errno[ret])
@@ -700,7 +718,8 @@ class _LibUSB(usb.backend.IBackend):
@methodtrace(_logger)
def _finalize_object(self):
self.lib.libusb_exit(self.ctx)
if self.ctx:
self.lib.libusb_exit(self.ctx)
@methodtrace(_logger)
@@ -936,12 +955,13 @@ class _LibUSB(usb.backend.IBackend):
return transferred.value
def get_backend(find_library=None):
global _lib
global _lib, _lib_object
try:
if _lib is None:
if _lib_object is None:
_lib = _load_library(find_library=find_library)
_setup_prototypes(_lib)
return _LibUSB(_lib)
_lib_object = _LibUSB(_lib)
return _lib_object
except usb.libloader.LibraryException:
# exception already logged (if any)
_logger.error('Error loading libusb 1.0 backend', exc_info=False)

48
build/device/usb/backend/openusb.py Executable file → Normal file
View File

@@ -1,17 +1,32 @@
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
from ctypes import *
import ctypes.util
@@ -24,7 +39,7 @@ import usb._interop as _interop
import usb._objfinalizer as _objfinalizer
import usb.util as util
import usb.libloader
from usb.core import USBError
from usb.core import USBError, USBTimeoutError
__author__ = 'Wander Lairson Costa'
@@ -458,7 +473,7 @@ def _setup_prototypes(lib):
POINTER(_openusb_intr_request)
]
lib.openusb_bulk_xfer.restype = c_int32
lib.openusb_intr_xfer.restype = c_int32
# int32_t openusb_bulk_xfer(openusb_dev_handle_t dev,
# uint8_t ifc,
@@ -491,7 +506,11 @@ def _check(ret):
ret = ret.value
if ret != 0:
raise USBError(_lib.openusb_strerror(ret), ret, _openusb_errno[ret])
if ret == OPENUSB_IO_TIMEOUT:
raise USBTimeoutError(_lib.openusb_strerror(ret), ret, _openusb_errno[ret])
else:
raise USBError(_lib.openusb_strerror(ret), ret, _openusb_errno[ret])
return ret
class _Context(_objfinalizer.AutoFinalizedObject):
@@ -726,6 +745,7 @@ def get_backend(find_library=None):
_lib = _load_library(find_library)
_setup_prototypes(_lib)
_ctx = _Context()
_logger.warning('OpenUSB backend deprecated (https://github.com/pyusb/pyusb/issues/284)')
return _OpenUSB()
except usb.libloader.LibraryException:
# exception already logged (if any)

44
build/device/usb/control.py Executable file → Normal file
View File

@@ -1,17 +1,32 @@
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
r"""usb.control - USB standard control requests
@@ -152,13 +167,18 @@ def get_descriptor(dev, desc_size, desc_type, desc_index, wIndex = 0):
util.CTRL_TYPE_STANDARD,
util.CTRL_RECIPIENT_DEVICE)
return dev.ctrl_transfer(
desc = dev.ctrl_transfer(
bmRequestType = bmRequestType,
bRequest = 0x06,
wValue = wValue,
wIndex = wIndex,
data_or_wLength = desc_size)
if len(desc) < 2:
raise USBError('Invalid descriptor')
return desc
def set_descriptor(dev, desc, desc_type, desc_index, wIndex = None):
r"""Update an existing descriptor or add a new one.

62
build/device/usb/core.py Executable file → Normal file
View File

@@ -1,17 +1,32 @@
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
r"""usb.core - Core USB features.
@@ -27,8 +42,8 @@ show_devices() - a function to show the devices present.
__author__ = 'Wander Lairson Costa'
__all__ = [ 'Device', 'Configuration', 'Interface', 'Endpoint', 'find',
'show_devices' ]
__all__ = [ 'Device', 'Configuration', 'Interface', 'Endpoint', 'USBError',
'USBTimeoutError', 'NoBackendError', 'find', 'show_devices' ]
import usb.util as util
import copy
@@ -45,10 +60,19 @@ _logger = logging.getLogger('usb.core')
_DEFAULT_TIMEOUT = 1000
_sentinel = object()
def _set_attr(input, output, fields):
for f in fields:
setattr(output, f, getattr(input, f))
def _try_getattr(object, name):
try:
attr = getattr(object, name)
except :
attr = _sentinel
return attr
def _try_get_string(dev, index, langid = None, default_str_i0 = "",
default_access_error = "Error Accessing String"):
""" try to get a string, but return a string no matter what
@@ -182,6 +206,8 @@ class _ResourceManager(object):
i = util.find_descriptor(cfg, bInterfaceNumber=intf, bAlternateSetting=alt)
else:
i = util.find_descriptor(cfg, bInterfaceNumber=intf)
if i is None:
raise ValueError('No matching interface (' + str(intf) + ',' + str(alt) + ')')
self.managed_claim_interface(device, i)
@@ -270,6 +296,14 @@ class USBError(IOError):
IOError.__init__(self, errno, strerror)
self.backend_error_code = error_code
class USBTimeoutError(USBError):
r"""Exception class for connection timeout errors.
Backends must raise this exception when a call on a USB connection returns
a timeout error code.
"""
pass
class NoBackendError(ValueError):
r"Exception class when a valid backend is not found."
pass
@@ -1247,7 +1281,7 @@ def find(find_all=False, backend = None, custom_match = None, **args):
def device_iter(**kwargs):
for dev in backend.enumerate_devices():
d = Device(dev, backend)
tests = (val == getattr(d, key) for key, val in kwargs.items())
tests = (val == _try_getattr(d, key) for key, val in kwargs.items())
if _interop._all(tests) and (custom_match is None or custom_match(d)):
yield d

37
build/device/usb/legacy.py Executable file → Normal file
View File

@@ -1,17 +1,32 @@
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import usb.core as core
import usb.util as util

37
build/device/usb/libloader.py Executable file → Normal file
View File

@@ -1,19 +1,34 @@
# -*- coding: utf-8 -*-
#
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import ctypes
import ctypes.util

57
build/device/usb/util.py Executable file → Normal file
View File

@@ -1,17 +1,32 @@
# Copyright (C) 2009-2017 Wander Lairson Costa
# Copyright (C) 2017-2018 Robert Wlodarczyk
# Copyright 2009-2017 Wander Lairson Costa
# Copyright 2009-2021 PyUSB contributors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# http://www.apache.org/licenses/LICENSE-2.0
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
r"""usb.util - Utility functions.
@@ -286,32 +301,28 @@ def get_string(dev, index, langid = None):
The return value is the unicode string present in the descriptor, or None
if the requested index was zero.
It is a ValueError to request a real string (index not zero), if: the
device's langid tuple is empty, or with an explicit langid the device does
not support.
"""
if 0 == index:
return None
from usb.control import get_descriptor
langids = dev.langids
if 0 == len(langids):
raise ValueError("The device has no langid")
if langid is None:
langids = dev.langids
if 0 == len(langids):
raise ValueError("The device has no langid"
" (permission issue, no string descriptors supported or device error)")
langid = langids[0]
elif langid not in langids:
raise ValueError("The device does not support the specified langid")
buf = get_descriptor(
dev,
255, # Maximum descriptor size
254, # maximum even length
DESC_TYPE_STRING,
index,
langid
)
blen = buf[0] & 0xfe # should be even, ignore any trailing byte (see #154)
if hexversion >= 0x03020000:
return buf[2:buf[0]].tobytes().decode('utf-16-le')
return buf[2:blen].tobytes().decode('utf-16-le')
else:
return buf[2:buf[0]].tostring().decode('utf-16-le')
return buf[2:blen].tostring().decode('utf-16-le')

View File

@@ -1,4 +1,6 @@
TOOLCHAIN ?= host-gcc
USE_LIBA ?= 0
ION_KEYBOARD_LAYOUT = layout_B2
EXE = bin
EXE = bin
EPSILON_TELEMETRY ?= 0

View File

@@ -2,6 +2,8 @@ MODEL ?= n0110
USE_LIBA = 1
EXE = elf
EPSILON_TELEMETRY ?= 0
BUILD_DIR := $(BUILD_DIR)/$(MODEL)
$(BUILD_DIR)/python/port/port.o: CXXFLAGS += -DMP_PORT_USE_STACK_SYMBOLS=1

View File

@@ -1,2 +1,3 @@
TOOLCHAIN ?= arm-gcc-m4f
ION_KEYBOARD_LAYOUT = layout_B2
PCB_LATEST = 0

View File

@@ -1,2 +1,3 @@
TOOLCHAIN ?= arm-gcc-m7f
ION_KEYBOARD_LAYOUT = layout_B3
PCB_LATEST = 343 # PCB version 3.43

View File

@@ -1,7 +1,7 @@
TOOLCHAIN = android
EXE = so
EPSILON_TELEMETRY ?= 1
EPSILON_TELEMETRY ?= 0
ARCHS = armeabi-v7a arm64-v8a x86 x86_64

View File

@@ -1,4 +1,4 @@
TOOLCHAIN = host-gcc
EXE = bin
EPSILON_SIMULATOR_HAS_LIBPNG = 1
EPSILON_TELEMETRY ?= 0

View File

@@ -3,11 +3,10 @@ EXE = bin
APPLE_PLATFORM = macos
APPLE_PLATFORM_MIN_VERSION = 10.10
EPSILON_TELEMETRY ?= 0
ARCHS = x86_64
EPSILON_SIMULATOR_HAS_LIBPNG = 1
ifdef ARCH
BUILD_DIR := $(BUILD_DIR)/$(ARCH)
else

View File

@@ -8,13 +8,4 @@ TARGET ?= $(HOST)
BUILD_DIR := $(BUILD_DIR)/$(TARGET)
EPSILON_SIMULATOR_HAS_LIBPNG ?= 0
include build/platform.simulator.$(TARGET).mak
SFLAGS += -DEPSILON_SIMULATOR_HAS_LIBPNG=$(EPSILON_SIMULATOR_HAS_LIBPNG)
ifeq ($(EPSILON_SIMULATOR_HAS_LIBPNG),1)
SFLAGS += `libpng-config --cflags`
LDFLAGS += `libpng-config --ldflags`
endif

View File

@@ -1,4 +1,4 @@
TOOLCHAIN = emscripten
EXE = js
HANDY_TARGETS_EXTENSIONS += zip
EPSILON_TELEMETRY ?= 0

View File

@@ -1,2 +1,4 @@
TOOLCHAIN = windows
EXE = exe
EPSILON_TELEMETRY ?= 0

View File

@@ -14,7 +14,7 @@ $(eval $(call rule_for, \
$(eval $(call rule_for, \
CPP, %, %.inc, \
$$(CPP) -P $$< $$@, \
$$(CPP) $$(addprefix -I,$$(dir $$^)) -P $$< $$@, \
global \
))
@@ -60,6 +60,12 @@ $(eval $(call rule_for, \
global \
))
$(eval $(call rule_for, \
ZIP, %.zip, , \
rm -rf $$(basename $$@) && mkdir -p $$(basename $$@) && cp $$^ $$(basename $$@) && zip -r -9 -j $$@ $$(basename $$@) > /dev/null && rm -rf $$(basename $$@), \
global \
))
ifdef EXE
ifeq ($(OS),Windows_NT)
# Work around command-line length limit

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