Compare commits

..

3457 Commits

Author SHA1 Message Date
Laury
2abc1d116a [themes] Updated submodules for fast-themes 2022-02-11 18:45:36 +01:00
Laury
63d1e0ee4e [themes] Color with pointers 2022-02-11 18:43:50 +01:00
Laury
84d88a3e8d [Apps] Updated submodules 2021-10-31 21:58:49 +01:00
lolocomotive
00b5d4b9fe Make gutter view background the right width (#70) 2021-10-31 21:43:29 +01:00
Lauryy06
2aee07ae55 [github] Updated issue templates 2021-10-31 21:40:52 +01:00
Yaya-Cout
41b2b64d80 Fix somes Upsilon name in somes files (#61) 2021-10-28 22:23:10 +02:00
Mino1289
473b0bbfcb [apps/settings|code] Add a Flag to remove Code option in settings if code app is not compiled (#67) 2021-10-28 22:20:00 +02:00
Mino1289
58ef8cb95d [apps/code] Remove import of mathsup (residue of #50) (#63) 2021-10-28 19:15:53 +02:00
Mino1289
5dce215165 [build/config.mak] Update of base theme (#64) 2021-10-28 19:15:26 +02:00
lolocomotive
f2f44f0f6f Make use theme colors instead of hard-coded ones (#65) 2021-10-28 19:13:21 +02:00
Laury
fbe542e5bf [python] Fix bug in draw_string 2021-10-28 14:41:33 +02:00
Laury
0a1b3bcaee [theme] Added upsilon light theme 2021-10-28 14:38:32 +02:00
Laury
f6e937a927 [settings] Bug fix in code options controller 2021-10-27 19:35:19 +02:00
Laporte
c4ed8f84d3 Custom themes script (#46) 2021-10-27 19:30:35 +02:00
Yaya-Cout
8e1b311be0 [apps/settings] Fix gamma selector (#60) 2021-10-27 19:29:53 +02:00
lolocomotive
89e51166e7 Make battery background use appropriate colors (#59) 2021-10-27 10:10:14 +02:00
Mino1289
e4961563e9 [apps/code] Remove base python script and add mathsup.py (#50) 2021-10-25 16:27:21 +02:00
Laury
e72b0f633e [calculation] Fix bug in second degree list controller 2021-10-24 19:31:14 +02:00
Hector
0550b66c03 Dark Theme changes (#42)
* Dark Theme changes

* added reader icon for dark mode

* epsilon Dark Theme changes
2021-10-20 23:11:30 +02:00
Lauryy06
e41910e2f8 [workflow] Re-update SDK version of emscripten 2021-10-20 22:38:49 +02:00
Lauryy06
d91ae29607 [workflow] Change sdk of emscripten for tests 2021-10-20 22:36:18 +02:00
ArtichautCosmique
3b90969b42 [mpy] Enabled property/etc decorators (#52) 2021-10-20 22:26:01 +02:00
lolocomotive
bd207cb845 Replace hard-coded color values with Palette colors and use the correct palette colors (#51) 2021-10-20 22:25:27 +02:00
lolocomotive
917ba7ce83 Allow themes to override default colors (#49) 2021-10-20 22:20:19 +02:00
Laury
9c9758fcb6 [reader] update README 2021-10-15 14:50:03 +02:00
Laury
83ce9d5e86 [reader] Rich text support (look at README.md) 2021-10-15 14:47:00 +02:00
ArtichOwO
d4f0c7d3e8 Added sys to the code toolbox 2021-10-15 14:47:00 +02:00
ArtichOwO
2837b240e9 [mpy] Added sys module
Removed useless "path" and "argv"
2021-10-15 14:46:39 +02:00
ArtichautCosmique
0906dc919b [mpy/kandinsky] Fix draw_string() on new line + good colors (#47)
* [mpy/kandinsky] Use good colors

* [kandinsky/context_text] Avoid returning to pos x=0 on new line, use arg's x coordinate instead
2021-10-11 20:25:03 +02:00
Faustin
9cda9d9e59 [apps/code] Add a settings for autocomplete (#36) 2021-10-07 21:48:19 +02:00
Yaya-Cout
553f3fc682 [apps/settings] Use right key to enable setting (#35) 2021-10-07 20:36:03 +02:00
Mino1289
9fdedecbff [apps/toolbox] Order of submenus & New electricity constants (#34) 2021-10-06 18:26:17 +02:00
Lauryy06
83c63a7011 [readme] Update readme 2021-10-01 21:37:44 +02:00
Yolwoocle
9636964cb9 Better English translation (#32) 2021-09-29 18:31:10 +02:00
Yaya-Cout
69d6ad5205 Add get_keys in toolbox and fix setlocaltime description (#33) 2021-09-29 18:30:30 +02:00
Laury
f9a123cc08 [mpy/ulab] Added support of from and to bytes array methods 2021-09-28 20:50:34 +02:00
Lauryy06
56f735e302 [github] update metric-workflow.yml 2021-09-26 20:50:53 +02:00
ArtichautCosmique
0a5e9e0889 [apps/code][mpy][makefile] Fix size error on n0100 (#30) 2021-09-26 20:37:56 +02:00
apoleon33
8c949d7048 [build]changed color of upsilon logo in pimp.mak (#31) 2021-09-26 20:36:13 +02:00
Laporte
2f7edc5024 Update pimp.mak (#29)
* Update pimp.mak

Mise a jour du pimp.mak pour le nouveau slogan et le logo ascii.

* Update pimp.mak
2021-09-26 14:25:00 +02:00
Lauryy06
cd40938b26 [readme] Add a capital line 10 2021-09-25 19:52:14 +02:00
ArtichautCosmique
0b54bf13f4 [storage][apps/code] Change sizes (#28) 2021-09-25 19:49:26 +02:00
Laury
f5f11c6478 [poincare] Added simplification of equals 2021-09-25 19:32:23 +02:00
ArtichautCosmique
efda561425 [ion/device/flasher] Pimp my flasher (light & verbose) (#27) 2021-09-25 18:55:43 +02:00
Lauryy06
15c96cefa6 [readme] Update french readme 2021-09-25 10:29:29 +02:00
Lauryy06
400d03ebdb [readme] Addition of a "useful links" section 2021-09-25 10:25:57 +02:00
Lauryy06
6f48adde7d Merge pull request #25 from Mino1289/upsilon-dev-dev 2021-09-25 10:17:21 +02:00
Mino1289
3a573b1204 [apps/code] fix typo 2021-09-24 11:15:56 +02:00
Mino1289
48598296cf [apps/code] Increase of number of variables loaded in the variable box 2021-09-24 11:09:23 +02:00
Lauryy06
a54d60644f Merge pull request #21 from ArtichOwO/USB-Prompt-Palette-Fix 2021-09-23 21:07:20 +02:00
Lauryy06
d579e9d14c Merge pull request #22 from ArtichOwO/Localisation-Palette-FIx 2021-09-23 21:05:57 +02:00
ArtichOwO
db0ae2f7a0 [apps/shared] Fixed localization text bg 2021-09-23 00:44:53 +02:00
ArtichOwO
2a66fbb75d [apps/usb] Fixed "white bg" text on usb prompt 2021-09-23 00:29:09 +02:00
Lauryy06
feb94af827 Merge pull request #19 from Yaya-Cout/upsilon-dev
[code/time] Add somes functions in python toolbox
2021-09-21 12:49:56 +02:00
Yaya.Cout
0b564510e7 [code/time] Add time in python toolbox 2021-09-20 17:21:41 +02:00
Lauryy06
05227184a1 [readme] Add a space line 152 2021-09-18 21:47:27 +02:00
Lauryy06
e551c69d06 Merge pull request #16 from lemoustachu/upsilon-dev 2021-09-18 21:33:40 +02:00
Laury
37c7b85da8 [reader] Removed unused include 2021-09-18 21:15:28 +02:00
Laury
0bed38576a [reader] Fix bug when changing page 2021-09-18 21:13:45 +02:00
Laury
7c02c9e72f [reader] Binded python font choice to reader files 2021-09-18 21:13:45 +02:00
Lauryy06
a5584634e5 Merge pull request #15 from Yaya-Cout/upsilon-dev 2021-09-18 13:12:02 +02:00
lemoustachu
62e5b3e135 update README.md 2021-09-18 08:49:47 +02:00
lemoustachu
62f43f393d removed abusive double <br> in readme 2021-09-18 08:47:49 +02:00
lemoustachu
3318780d7d update README.md by adding beaks to clearify the code 2021-09-18 08:44:40 +02:00
lemoustachu
a9fc3b7850 update tutorial on readme.md to build Upsilon 2021-09-18 08:41:08 +02:00
Yaya.Cout
959efdc995 [reader] Disabled reader app on N100 2021-09-17 19:28:53 +02:00
Lauryy06
fa278b0d78 Merge pull request #9 from FaustinM/omega-dev-get-battery-data 2021-09-15 18:39:48 +02:00
Lauryy06
e8044f938e Merge branch 'upsilon-dev' into omega-dev-get-battery-data 2021-09-15 18:38:40 +02:00
Lauryy06
02f4f6fe74 Merge pull request #13 from lemoustachu/upsilon-dev 2021-09-15 18:37:34 +02:00
Hugo Berthet-Rambaud
fe973b0535 update README.md
changed cd Omega to cd Upsilon
2021-09-13 08:38:53 +02:00
Hugo Berthet-Rambaud
71a764277f Merge branch 'Lauryy06:upsilon-dev' into upsilon-dev 2021-09-13 07:57:08 +02:00
Hugo Berthet-Rambaud
f6379d16fd Update README.md
just changed cd Omega to cd Upsilon in binpack commmands
2021-09-13 07:54:37 +02:00
Laury
2156ca7e42 [calculation] Added additional output about second degree polynomials 2021-09-12 21:28:07 +02:00
FaustinM
2f3339dff7 Removed a modified file from pull request 2021-09-12 00:15:55 +02:00
FaustinM
48a0da8a95 Add more python functions in ion module
Ion.battery_level() return a int with the current battery level
Ion.battery_ischarging() return a bool with the current battery charging state
bugfix for upsilon
2021-09-12 00:06:44 +02:00
FaustinM
3460e9ffd8 Merge remote-tracking branch 'origin/upsilon-dev' into upsilon-dev-get-battery-data 2021-09-11 21:16:23 +02:00
Laury
1487acbe38 [git] Added .vs to gitignore 2021-09-11 19:57:36 +02:00
Laury
367f64dac8 [reader] Fixed a bug when going backwards 2021-09-08 21:42:39 +02:00
Laury
19ee32986f [reader] Make improve coding style and added empty view message 2021-09-05 21:28:45 +02:00
Laury
7f0b8170d4 Merge OmegaWithReader 2021-09-05 17:44:51 +02:00
Lauryy06
bba7408e6c Merge upsilon-dev-ulab 2021-09-05 17:21:34 +02:00
Lauryy06
838ee83a8c Merge pull request #6 from Yaya-Cout/upsilon-dev
Fix OmegaVersion in settings
2021-09-05 17:01:15 +02:00
Laury
74c500df01 [code/ulab] removed unnecessary module utils 2021-09-05 16:57:50 +02:00
Laury
98b665ac4b [code/ulab] Disabled scipy in toolbox for n0100 + added 2 forgotten numpy functions 2021-09-05 16:57:09 +02:00
Laury
0f4502ebce [code/ulab] Added scipy 2021-09-05 16:27:44 +02:00
Yaya.Cout
9eb81a6daf Fix OmegaVersion in settings 2021-09-05 11:49:42 +02:00
Laury
a15c682e3e [code/ulab] Replaced translations by official documentation 2021-09-04 21:23:23 +02:00
Laury
74635f8d88 [code/ulab] Added ulab to toolbox 2021-09-03 22:57:04 +02:00
Yaya-Cout
ebe6a7cc5f Merge pull request #2 (Update some translations) 2021-09-02 17:58:23 +02:00
Lauryy06
3a4e33a1a7 Merge pull request #2 from ArtichOwO/uLab 2021-09-01 18:03:06 +02:00
Lauryy06
dd757969f3 [readme] Correct readme.fr 2021-09-01 18:00:24 +02:00
Laporte
0df76f1680 [readme] Update readme
* Update README.fr.md

* Update README.md
2021-09-01 17:58:06 +02:00
Laury
788e75eb4a Merge branch 'upsilon-dev' of https://github.com/Lauryy06/Upsilon into upsilon-dev 2021-09-01 17:53:01 +02:00
Laury
7b4a94296b [calculation][poincare] Revert 'b8544e3' and improve equal simplification 2021-09-01 17:31:51 +02:00
Lauryy06
86511cc59d Merge pull request #1 from ArtichOwO/FixMacSrc-StoreScript
[ion/mac] Added missing source
2021-09-01 17:20:53 +02:00
Laury
d90af0323e Merge omega-dev into upsilon dev 2021-08-31 23:03:30 +02:00
Laury
c0739b0e06 [atomic] updated submodule 2021-08-31 19:23:09 +02:00
Laury
210a83b04d [python/kandinsky] Added get_palette() function 2021-08-31 16:17:36 +02:00
Laury
fb4fc4862d [python] Enable operator overload 2021-08-31 15:48:11 +02:00
Laury
74c6bea8f8 Merge commit 'dc8a1d48d9e29fd2fc87ddd8075f6d7047a1aadb' into upsilon-master 2021-08-30 21:09:18 +02:00
Laury
7c1dc4d5c3 [python] merge '6fcab395' and fix a bug in fill_polygon() 2021-08-30 19:40:30 +02:00
ArtichOwO
eb02fb5baa [ion/mac] Added missing source 2021-07-14 19:52:32 +02:00
Laury
6fcab3952f [python] Add some useful functions in kandinsky 2021-07-08 22:34:43 +02:00
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
dc8a1d48d9 [escher] Remove unnecessary include 2021-07-06 16:23:28 +02:00
Laury
649f48919e [home] Added support for a wallpaper in a special format (.obm) 2021-07-06 14:54:55 +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
837fcd9bcc [MPY/MOD/ULAB] Added N100 compatibility
N100:
- doesn't have Scipy;
- uses function pointers
2021-06-23 23:08:46 +02:00
ArtichOwO
b0befbdbc5 [MPY/MOD] Added uLab 2021-06-23 22:40:41 +02:00
FaustinM
cf9142b5a2 Add "ion.battery()" for obtain the current voltage of the battery
Ion.battery() return a float with the current battery voltage

TODO : Update the translation of the toolbox (only FR and EN currently)
2021-06-23 16:57:42 +02:00
FaustinM
80587f35f1 Add a new entry in about menu to see current voltage
- Add a new traduction for this entry
- Add the entry in submenu
2021-06-23 16:55:37 +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
6f797833b2 [omega] 1.22.1 2021-03-21 20:31:06 +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
Quentin Guidée
58ff19858f [omega] 1.22.0 2021-03-15 21:54:08 +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
Quentin Guidée
9eff895a95 [omega] 1.21.0 2021-02-24 22:25:36 +01:00
Maxime FRIESS
6e7cf88e3f Merge pull request #487 from M4xi1m3/magnify-fix
[apps] Fixed #456
2021-02-24 21:53:42 +01:00
M4x1m3
ba6ee3f1b9 [apps] Fixed #456 2021-02-24 21:47:29 +01:00
ArtichautCosmique
41554caf27 [ion] Icon for the AUR repo (#484)
flat design this time
2021-02-21 18:59:52 +01:00
ArtichautCosmique
0a807c3b69 [ion] Brand new icon for the Windows simulator (#483) 2021-02-21 15:09:32 +01:00
ArtichautCosmique
73017819ac [ion] New icon for the macOS simulator (#464)
* New icon for the macOS simulator!!

* Added a shadow to the macOS icon
2021-02-19 19:04:21 +01:00
Maxime FRIESS
d0e0ee610c Merge pull request #470 from RedGl0w/omegaCIFix
Fix tests with omega and inf new symbol
2021-02-18 19:22:51 +01:00
Maxime FRIESS
a540ef8153 Merge pull request #480 from M4xi1m3/omega-dev
[ion/web] Fixed emscripten EGL error
2021-02-18 15:48:06 +01:00
M4x1m3
a77028a36b [ion/web] Fixed emscripten EGL error 2021-02-18 14:04:04 +01:00
Calvineries
1838024934 ScriptSize French Translation 2021-02-17 01:35:01 +01:00
Maxime FRIESS
0250ad8520 Merge pull request #473 from M4xi1m3/omega-dev
[external] Fixed #454
2021-02-16 18:32:10 +01:00
lapingenieur
fcc803d7c5 [readme] Added French README (#475)
Co-authored-by: Quentin <quentin.guidee@gmail.com>
Co-authored-by: Maxime FRIESS <M4x1me@protonmail.com>
2021-02-16 10:01:00 +01:00
Maxime FRIESS
d83e712256 Merge pull request #477 from gkelly/posix-shells
[build] Remove bash-ismes
2021-02-15 19:57:23 +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
M4x1m3
6f3cb70f64 [external] Fixed memory leak #454 2021-02-15 12:23:09 +01:00
Maxime FRIESS
77ec00bc50 Merge pull request #471 from M4xi1m3/mk-app-check
[build] Throw an error when user is missing apps
2021-02-13 22:13:46 +01:00
M4x1m3
085c90353d [build] Throw an error when user is missing apps 2021-02-13 22:01:27 +01:00
Joachim LF
b09da48748 [calculation/tests] Fix tests on omega 2021-02-12 10:21:42 +01:00
Joachim LF
ef3682b904 [Poincare/tests] Added infinity symbols 2021-02-12 09:05:41 +01:00
Joachim LF
135a56b6b3 [Poincare/tests] Fix ∞ tests 2021-02-12 09:05:15 +01:00
Joachim LF
491c873c90 [Poincare/parser] support ' as derivative 2021-02-12 08:36:57 +01:00
Maxime FRIESS
f6c9bb23c6 Merge pull request #468 from M4xi1m3/i18n-fix
[i18n] Fixed missing / duplicate entries.
2021-02-10 21:26:13 +01:00
M4x1m3
17284985f7 [i18n] Fixed missing / duplicate entries. 2021-02-10 21:11:10 +01:00
lapingenieur
76e1bf8822 [*.hu.i18n] Improved Hungarian translations 2021-02-10 20:03:36 +01:00
Maxime FRIESS
540c87c71f Merge pull request #465 from LeGmask/infinity
[poincare/parser] Use infinity symbol
2021-02-10 17:28:48 +01:00
Evann DREUMONT
391904900a [apps/toolbox] Add infinity in maths/calcul toolbox 2021-02-10 17:21:12 +01:00
Evann DREUMONT
763ce87d14 [poincare/parser] Use infinity symbol
- Use infinity symbol
- Parse inf, oo, infity
2021-02-10 17:20:14 +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
Maxime FRIESS
a60d47bd2e [ion/3ds] Changed launch logo to Homebrew 2021-02-07 18:08:29 +01:00
Maxime FRIESS
875b7b3734 Merge pull request #462 from M4xi1m3/3ds-simu-fix
[ion/3ds] Works again, added CIA target
2021-02-06 18:46:14 +01:00
M4x1m3
9773c09eba [ci] Build 3ds CIA 2021-02-06 18:38:01 +01:00
M4x1m3
fda0848036 [ion/3ds] Added CIA target 2021-02-06 18:34:53 +01:00
M4x1m3
7733378bdc [ion/3ds] Make simulator work again 2021-02-06 17:00:14 +01:00
Maxime FRIESS
3e3a6347a6 Merge pull request #460 from RedGl0w/omegaHomeFix
[Fix] Select last app with incomplete row in home
2021-02-06 16:27:03 +01:00
Maxime FRIESS
3227e7ca8a Merge pull request #452 from ArtichOwO/omega-dev
[themes] Wrong colors in Omega Dark
2021-02-06 16:25:46 +01:00
Maxime FRIESS
51ef7d7404 Merge pull request #461 from M4xi1m3/fix-ci
[Fix] Make CI work again
2021-02-06 16:16:52 +01:00
M4x1m3
da3c4a48d0 [ci] Fixed invalid YML 2021-02-06 16:05:37 +01:00
M4x1m3
ec0e72fcb8 [ci] Made CI run on push 2021-02-06 16:05:37 +01:00
M4x1m3
8a45b3d552 [ci] Moved unit tests to separate workflow 2021-02-06 16:05:27 +01:00
M4x1m3
d35e93901c [ci] Reintroduced 3DS with toggle switch 2021-02-06 15:11:54 +01:00
M4x1m3
8f380adc4f [ci] Fixed checkout and wrong makefile 2021-02-06 10:27:27 +01:00
Joachim LF
61a015b6f1 [Fix] Select last app with incomplete row in home 2021-02-06 09:28:56 +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
ArtichOwO
66ea24584c [Theme] Wrong colors in Omega Dark 2021-01-30 11:22:13 +01:00
Quentin
859976423f Merge pull request #451 from RedGl0w/someFixOnOmega21
Added env var for omega state
2021-01-29 12:26:27 +01:00
Quentin
f052ad7bf8 [.github/issue_template] New issue templates 2021-01-29 12:22:16 +01:00
Joachim LF
61646ccabc Added env var for omega state 2021-01-29 12:21:40 +01:00
Quentin Guidée
116cbf7df4 [.github/issue_template] Remove issue templates temporarily 2021-01-29 12:13:23 +01:00
Quentin Guidée
1354b3e4f3 [apps/settings] Add Omega to exam mode warnings 2021-01-29 11:48:55 +01:00
Quentin
5e91b12836 Merge pull request #449 from RedGl0w/someFixOnOmega21
Some fix on omega21
2021-01-29 10:34:50 +01:00
Cyprien Méjat
3b74553ed7 [escher] Fix color of the "auto" and "equal" axes buttons (#450) 2021-01-28 22:23:26 +01:00
Joachim LF
44fc94469e [code] Fix movement in input 2021-01-28 20:02:45 +01:00
Joachim LF
40b81313cb [Exam] Fixed exam mode to omega one 2021-01-28 20:02:31 +01:00
Quentin
0c01ccb13e Merge pull request #446 from RedGl0w/omegaE15
Fix home external apps display and accessibility
2021-01-23 15:30:31 +01:00
Joachim LF
71449239c8 Fix external apps display 2021-01-22 18:39:21 +01:00
Joachim LF
917e753426 Fix display issue 2021-01-22 17:56:58 +01:00
Quentin Guidée
134f1da4b0 [build/config] Fix Epsilon Version in settings 2021-01-22 15:06:52 +01:00
Quentin Guidée
0a3754aa23 [apps/*.i18n] Fixes for E15 2021-01-22 13:56:35 +01:00
Quentin Guidée
cb9f9e0e40 [.submodules] Update RPN submodule 2021-01-22 13:33:43 +01:00
Quentin
11f41a97d4 Merge pull request #445 from RedGl0w/omegaE15
[Update] Epsilon 15.3.1
2021-01-22 13:09:26 +01:00
Joachim LF
738a477b66 [Theme] Fix button_state 2021-01-21 19:56:22 +01:00
Joachim LF
9b17d1b882 [Update] Epsilon 15.3.1 2021-01-21 19:56:06 +01:00
Émilie Feral
11ef4bd996 build: Version 15.3.1 2021-01-07 12:47:23 +01:00
Émilie Feral
ed2d5e3b2d [simulator/android] Bump targetSdkVersion 2021-01-07 12:46:43 +01:00
Émilie Feral
49b74fb475 build: Version 15.3.0 2021-01-06 16:31:07 +01:00
Émilie Feral
e8887a4e70 [poincare] Remove unused variable 2021-01-06 16:30:07 +01:00
Hugo Saint-Vignes
5e7d93b331 [apps/statistics] Update and replace comment 2021-01-05 16:43:01 +01:00
Hugo Saint-Vignes
83722342f7 [apps/statistics] Reload CurveView before drawing histogram labels 2021-01-05 16:43:01 +01:00
Hugo Saint-Vignes
a42208f773 [apps/shared] Handle null labelStep in numberOfLabels 2021-01-05 16:33:48 +01:00
Hugo Saint-Vignes
9f0c7a87fd [apps/shared] Use sizeof data 2021-01-05 11:38:21 +01:00
Hugo Saint-Vignes
990c45b661 [apps/shared] Prevent label method from being called on uninitialized chars 2021-01-05 11:38:21 +01:00
Gabriel Ozouf
5b106f091d [interactive_curve_view_range] Fix isOrthonormal when using Navigate
The method isOrthonormal takes into account the "offscreen" portion of
the Y axis. This fixes a bug where zooming when using the Navigate
option would remove the orthonormality marker while the graph was still
orthonormal.
2021-01-05 11:01:45 +01:00
Gabriel Ozouf
878685b83c [interactive_curve_view_range] Test isOrthonormal 2021-01-05 11:01:45 +01:00
Gabriel Ozouf
abefc800d9 [interactive_curve_view_range] Fix variable type 2021-01-05 11:01:45 +01:00
Gabriel Ozouf
89c50509d8 [shared] InteractiveCurveViewRange::isOrthonormal
The old method isOrthonormal has been split into two :
  - shouldBeNormalized tests whether the range is close enough to a
    normal range
  - isOrthonormal tests whether the range is strictly orthonormal, but
    takes into account imprecisions of floating-point arithmetic
2021-01-05 11:01:45 +01:00
Roberta Rabotti
89107da1ae Update toolbox.it.i18n 2021-01-05 10:15:12 +01:00
Gabriel Ozouf
d022231a3a [statistics] Fix use of uninitialized variable 2021-01-05 10:12:02 +01:00
Martijn Oost
f449db62c3 [NL] fix omission sigma in toolbox
While changing from using sigma squared to just sigma I guess we deleted one character too much.
2021-01-04 15:14:38 +01:00
Martijn Oost
7a6c0e6e7d [NL] fix translations 2021-01-04 15:14:38 +01:00
Gabriel Ozouf
f6c91f7dbe [poincare/function] Add tests on getVariables 2020-12-29 17:20:09 +01:00
Gabriel Ozouf
4209f0a26c [poincare/function] getVariables always gets the argument
When applied to a function f(x) = constant, the method getVariables
would not find any, as the search is performed on the function's
definition.
Thus, when using the "Fill with formula" tool in Statistics, if the
formula to fill V1 is "V1=f(V2)", the formula will be considered
constant and applied to all values in V1. However, if V1 is longer than
V2, the program will attempt to read undefined values of V2.
With this change, the formula will only be applied to lines in V1 for
which there is a corresponding line in V2.
2020-12-29 17:20:09 +01:00
Gabriel Ozouf
d26ba0250b [statistics] Missing include 2020-12-29 13:34:35 +01:00
Gabriel Ozouf
48d93584e7 [poincare/parametered_expression] Fix variables detection
The method getVariables would not correctly remove the parameter from
the list of variables.
e.g. In the expression "box+y×int(z,x,0,1)", when trying to remove x
from the list of variables, the letter x would be removed from the name
"box" instead.
2020-12-29 13:34:09 +01:00
Gabriel Ozouf
fff514d410 [poincare/unit] Fix temperature conversion
The program would crash when trying to evaluate a unit conversion of the
form "x→_U" where U was a unit of temperature and x did not have any
unit.
2020-12-29 09:51:47 +01:00
Gabriel Ozouf
5ce5f4fbac [statistics] Fix glitch with histogram parameters
In the window to change the histogram parameters, it was possible to set
a rectangle width that was considered valid, but would make the starting
abscissa invalid, while triggering no error message. The message would
only show if the user closed the window and opened it again.
e.g. : Set a series with only one value 1e10
       Change its starting abscissa to 0
       Change its rectangle width to 1, confirm and close the menu
       Re-open the menu, a message appears, and stays onscreen when
leaving the menu.
2020-12-29 09:50:24 +01:00
Gabriel Ozouf
ea4770fc81 [shared/interactive_curve_view_range] Change normalization tolerance
The loss of significance that occurs when subtracting the bounds of the
axes must be taken into account when asserting whether the range is
orthonormal.
2020-12-29 09:47:29 +01:00
Hugo Saint-Vignes
e09bd0a18c [poincare] Factorize reduce and removeUnit methods 2020-12-22 17:32:40 +01:00
Hugo Saint-Vignes
7146eff7ee [poincare/src] Use reduce before removeUnit
With deepReduce(), when a simplifiaction was interrupted, expression could
contain Undefined children, which would trigger the assert in
removeUnit(). With reduce(), if a simplification is interrupted, the
entire expression becomes Undefined, which is handled by removeUnits().
2020-12-22 17:32:40 +01:00
Gabriel Ozouf
5bc9579db6 [shared/interactive_curve_view_range] Test zoom method 2020-12-22 17:22:33 +01:00
Gabriel Ozouf
e9c953fd6e [shared/interact_curve_view_range] Check orthonormality after zoom
Zooming in and out on a graph usually preserves orthonormality. However,
if the window has its bounds close to the limits for the values on the
axes, zooming can change the ratio.
2020-12-22 17:22:33 +01:00
Gabriel Ozouf
02d7a02a93 [poincare/unit] Add test 2020-12-22 17:21:37 +01:00
Gabriel Ozouf
9b3f7edfcd [poincare/unit] Handle kelvin with prefix
Units derived from kelvin (mK, cK, ...) were handled like Celsius and
Fahrenheit, causing a bug where multiplications such as 2*pi*_cK to
simplify as undef.
2020-12-22 17:21:37 +01:00
Hugo Saint-Vignes
fa523c25c9 [apps] Split italian text into two lines in variable box 2020-12-22 10:16:27 +01:00
Hugo Saint-Vignes
1939293cd2 [apps/shared] Add margin to avoid visible approximation errors 2020-12-21 16:12:27 +01:00
Léa Saviot
60f875220e build: Version 15.2.0 2020-12-17 17:10:56 +01:00
Gabriel Ozouf
24456780e6 [regression] Invalidate cursor when selected dot does not exist 2020-12-17 17:10:56 +01:00
Hugo Saint-Vignes
af3b2d4de4 [apps/shared] Tidy model name on sequence type change 2020-12-17 17:10:56 +01:00
Hugo Saint-Vignes
479f34502f [apps/shared] Rename methods and Factorize comparison logic 2020-12-16 16:16:26 +01:00
Hugo Saint-Vignes
10c296e671 [apps/shared] Add comment for isCursorHanging method 2020-12-16 16:16:26 +01:00
Hugo Saint-Vignes
b7bbb258a8 [apps/regression] Fix NaN comparison in isCursorHanging method 2020-12-16 16:16:26 +01:00
Hugo Saint-Vignes
7646f13ca8 [apps/shared] Fix NaN comparison in isCursorHanging method 2020-12-16 16:16:26 +01:00
Hugo Saint-Vignes
56a6917cfd [apps/shared] Fix context pointer when sorting rows 2020-12-16 11:40:54 +01:00
Gabriel Ozouf
efbbbe94ff [poincare/expression] Comment and variable names 2020-12-14 10:20:09 +01:00
Gabriel Ozouf
c7b758f536 [poincare/expression] Fix solutions to e^x=0
Because of the limitations of the floating-point representation, e^x is
null for x <= 710, causing the nextRoot functions to find roots for it.
To prevent this, we looking for places where a function changes sign, we
actually require the function to take two non-null values of different
signs.
2020-12-14 10:20:09 +01:00
Fournier Gabriel
890592854a fix for device 2020-12-13 22:13:33 +01:00
Fournier Gabriel
6c6f8b581c saving 2020-12-13 21:55:03 +01:00
Maxime FRIESS
f202a4f902 [mpy/files] Fixed append implementation (#434) 2020-12-10 21:30:54 +01:00
Hugo Saint-Vignes
78cb340065 [apps/regression] Only uniformize c if needed 2020-12-10 16:42:59 +01:00
Hugo Saint-Vignes
6e318593ae [apps/regression] Code review fixes 2020-12-10 16:42:59 +01:00
Hugo Saint-Vignes
79e59f525e [apps/regression] Ensure unicity for trigonometric regression 2020-12-10 16:42:59 +01:00
Gabriel Ozouf
94b2da8e60 [poincare/zoom] Comment on the representation of ranges 2020-12-10 13:45:56 +01:00
Gabriel Ozouf
185c780215 [poincare/zoom] Handle NAN in ExpandSparseWindow 2020-12-10 13:45:56 +01:00
Gabriel Ozouf
35bfb8ec16 [poincare/zoom] Method ExpandSparseWindow
This method is used to remove extraneous empty sapce in the middle of
the window for functions that are discontinuous between their points of
interest.
2020-12-10 13:45:56 +01:00
Gabriel Ozouf
625a89e610 [poincare/zoom] RefinedYRangeForDisplay signature 2020-12-10 13:45:56 +01:00
Gabriel Ozouf
3cdb076c2c [shared/interactive_curve_view_range] Factor zoom
The zoom method to zoom in and out on a curve view make use of the
SetZoom method in Poincare::Zoom.
2020-12-10 13:45:56 +01:00
Gabriel Ozouf
71070ee052 [poincare/zoom] Helper method SetZoom
Create a method SetZoom to zoom in and out on a window.
2020-12-10 13:45:56 +01:00
Hugo Saint-Vignes
c28a5198d6 [apps/regression/test] Add a test case, factorize logic 2020-12-09 17:31:14 +01:00
Hugo Saint-Vignes
a08e3e1024 [apps/regression] Update comment 2020-12-09 17:31:14 +01:00
Hugo Saint-Vignes
357db4493d [apps/regression] Add TODO to improve coefficient update 2020-12-09 17:31:14 +01:00
Hugo Saint-Vignes
e17ff842b5 [apps/regression/test] Update trigonometric tests 2020-12-09 17:31:14 +01:00
Hugo Saint-Vignes
d0f40f0177 [apps/regression] Set coefficient c initial value to 0 2020-12-09 17:31:14 +01:00
Émilie Feral
fe4e2e3e9d Misc. clang static analyzer fixes 2020-12-09 13:34:36 +01:00
Martijn Oost
c3ceb0074f [NL] fix translation mistakes 2020-12-09 13:31:15 +01:00
Émilie Feral
0f95b579a4 build: Version 15.1.0 2020-12-07 17:13:14 +01:00
Gabriel Ozouf
55f21f127c [poincare/zoom] Fix array overflow 2020-12-07 16:45:54 +01:00
Gabriel Ozouf
89979b4f50 [poincare/zoom] Comment on the RangeWithRatio method 2020-12-07 15:58:56 +01:00
Gabriel Ozouf
71be09b4e7 [poincare, graph] Factor helper function 2020-12-07 15:58:56 +01:00
Gabriel Ozouf
ffebd2e987 [shared] Rename methods 2020-12-07 15:58:56 +01:00
Gabriel Ozouf
1f8ab10ae5 [graph] Update tests on automatic zoom 2020-12-07 15:58:56 +01:00
Gabriel Ozouf
8726bbda3e [poincare/zoom] Update tests 2020-12-07 15:58:56 +01:00
Gabriel Ozouf
072fdda6b8 [poincare/zoom] Redraft search of orthonormal range
To find the optimal range with a specified ratio, we compute the values
of the function on a default range, then center the Y axis to display
the maximum number of points of the function.
2020-12-07 15:58:56 +01:00
Gabriel Ozouf
316d054935 [sequence] Restore margins on the sequence graph 2020-12-07 15:58:56 +01:00
Gabriel Ozouf
f3b770cb29 [graph] Add tests for the full range computation
Change-Id: I040a36c035ec75ee950f1998667b70a417dea2f3
2020-12-07 15:58:56 +01:00
Gabriel Ozouf
a9aeae94df [shared] Create helper functions for ranges
These functions are used to test the full algorithm used to compute
ranges.

Change-Id: I48069e245aa6e879f66aecc29709fc6f992f5220
2020-12-07 15:58:56 +01:00
Gabriel Ozouf
1e7babadb8 [solver] Change angle unit before test
A test in equation_solve relies on the angle unit being set to Degree,
but doesn't actually set it. Changing the angle unit to another one in a
test prior would break this test.

Change-Id: I6785b087f171d46226d484ebaa3ebdc9e791cedc
2020-12-07 15:58:56 +01:00
Gabriel Ozouf
7f63daa28e [poincare/zoom] Change weight function in RangeWithRatioForDisplay
Change-Id: I21520d8220083b40baa2e4928632632f2b73cb9b
2020-12-07 15:58:56 +01:00
Gabriel Ozouf
b1da6031c6 [shared] Do not compute range for convoluted functions
Evaluating a function containing a sequence, an integral or a
derivative, is time consuming. Computing a range requires a plethora of
evaluations, as such ranges for these functions cannot be evaluated in a
timely fashion.

Change-Id: I088a0e896dbc26e6563291cafdfe9ceba36dd5d0
2020-12-07 15:58:56 +01:00
Gabriel Ozouf
c89a7bc496 [graph] Take margins into account for normalization
When building an orthonormal range for the automatic zoom, we provide a
ratio for the screen without the margins. This way, adding the margins
will make the graph orthonormal, and the banner cannot cover the
function.

Change-Id: If3a3f799d4e7e3e81ab77c6b418d70b734a6fbca
2020-12-07 15:58:56 +01:00
Gabriel Ozouf
a8858023ba [shared] Remove const qualifiers from interestingRanges
Change-Id: I794aa144af9dc9eab3090eea7fd54a7cdac2fd68
2020-12-07 15:58:56 +01:00
Gabriel Ozouf
ff220b7103 [graph] Preserve default X range
When computing the automatic zoom, if the X axis has integer bounds
(most likely because the range has been built to be orthonormal), do not
add margins to the X axis, so that it keeps user friendly values.

Change-Id: I49d99b79c68fbd8a49e5c2521b250c40aad75d48
2020-12-07 15:58:56 +01:00
Gabriel Ozouf
6e9195fafa [shared] Add forceChangeY parameter to normalize()
Change-Id: Iff5417cd765f3fd09825b81cb41f883530b39233
2020-12-07 15:58:56 +01:00
Gabriel Ozouf
bd302bb67b [poincare/unreal] Type in derivate method
Unreal's derivate method returns true, to signify that it is unchanged
by the derivation operation. This implementation mostly exists for
documentation, as an Unreal derivand will be handled by the
defaultShallowReduce method.
2020-12-07 15:01:52 +01:00
Gabriel Ozouf
7ae03975cc [poincare/derivative] Derivate special numbers
Derivate the numbers Undefined, Unreal, Infinity symbolically :
  Undefined -> Undefined
  Unreal    -> Unreal
  Infinity  -> Undefined
2020-12-07 15:01:52 +01:00
Martijn Oost
76eb155ed5 [NL] translation fixes 2020-12-07 14:12:29 +01:00
Gabriel Ozouf
3f6e4444a5 [poincare/derivative] Reduce before replacing symbol
The general formula for deriving a power makes use of the logarithm,
which often disappears at simplification. However, replacing the symbol
before simplifying can lead to applying an invalid argument to the
logarithm, making the whole expression invalid.

e.g. diff(1/x,x,-2)
     If x is replaced by -2 before reducing the power derivative, ln(-2)
will reduce to Unreal, as will the rest of the expression.
2020-12-07 14:06:24 +01:00
Fournier Gabriel
92ee632ce2 word wrapping 2020-12-05 22:24:13 +01:00
Gabriel Ozouf
1a47207bee [poincare/trigonometry] Add comments 2020-12-04 11:59:12 +01:00
Gabriel Ozouf
1f0a18f94c [poincare/derivative] Update tests for trigonometric derivatives 2020-12-04 11:59:12 +01:00
Gabriel Ozouf
a113801ec2 [poincare/derivative] Fix derivative of trigonometric functions
The classic differentiation forumals for trigonometric functions assume
a variable in radians. A multiplicative constant must be added when
another unit is used.

Change-Id: Iec428acd7d93e415fddb184300437ae09d1d997c
2020-12-04 11:59:12 +01:00
Gabriel Ozouf
64208a7f3c [poincare/trigonometry] Method UnitConversionFactor
Change-Id: I4ef3e4404071a305354b572e15e5199040f9bf48
2020-12-04 11:59:12 +01:00
Gabriel Ozouf
f329ca825f [poincare] Add ReductionContext to unaryFunctionDifferential
Change-Id: I99ba90f8c38cab5d8fe2139f49e4f94c1d52d296
2020-12-04 11:59:12 +01:00
Hugo Saint-Vignes
f54c5a8172 [apps/statistics] Update wording
Change-Id: I4e3a042e1da6c7264932ff87fba0529f7aa1091d
2020-12-03 16:09:46 +01:00
Hugo Saint-Vignes
8cd3fe679f [escher/src] Add TODO comment 2020-12-02 17:20:32 +01:00
Hugo Saint-Vignes
636e863323 [escher] Moved repetition factor logic up in Escher from poincare
Change-Id: I7c8f932e3e7d04c928ca881113ba6b5df05b94e7
2020-12-02 17:20:32 +01:00
Gabriel Ozouf
b69f06b772 [poincare/logarithm] Comment clarity 2020-12-02 16:54:09 +01:00
Gabriel Ozouf
1531f96bb8 [poincare/derivative] Update test on derivation 2020-12-02 16:54:09 +01:00
Gabriel Ozouf
764d14fed1 [poincare/constant] Constants differentiate to 0 2020-12-02 16:54:09 +01:00
Gabriel Ozouf
a178c88e54 [poincare/logarithm] Fix derivative domain of definition
The logarithm function is undefined for negative numbers, but its
derivative, the inverse function, is defined everywhere. We thus need to
virtually limit the domain of definition of the derivative.
2020-12-02 16:54:09 +01:00
Gabriel Ozouf
591f47d6a9 [continuous_function_cache] Coding style 2020-12-02 16:50:17 +01:00
Gabriel Ozouf
937979503a [shared/continous_function] Detach cache of inactive function
When a function that had previously been cached is deactivated, its
cache can be used by another function. When the function is reactivated,
if it tries to reuse its previous cache, it will be filled with values
from another function, and will not be cleared. By detaching the cache
of a function that becomes inactive, we ensure that the next time this
function is cached, the chache will be cleared.

e.g. Define to functions f(x)=x, g(x)=-x, draw them both.
     Deactivate f, the redraw the graph
     Reactivate f, the draw again
2020-12-02 16:50:17 +01:00
Gabriel Ozouf
3501146e35 [shared/continuous_function_cache] Detach cache from function
When three functions or more, the third function and later don't use
caching. But it is still possible for them to have been linked to a
cache (for instance if previous functions had been deactivated earlier).
To avoid a function tapping into another function's cache, we reset the
cache.

e.g. Define 3 functions f(x)=1, g(x)=2, h(x)=3, and deactivate f.
     Draw the graph, come back, reactivate f, then draw again.
---> The space between y=2 and y=3 will be filled with the color of h,
as h "remembers" using cache n°2, wich currently contains the values of
function g.
2020-12-02 16:50:17 +01:00
Gabriel Ozouf
48bd7b6a77 [poincare/logarithm] Factor corner case log(x,0) and log(x,1) 2020-12-02 16:49:09 +01:00
Gabriel Ozouf
f09f06d7ac [poincare/logarithm] Update tests 2020-12-02 16:49:09 +01:00
Gabriel Ozouf
9775953142 [poincare/logarithm] ln(0) = undef
As a consequence, log(x,0) = ln(x)/ln(0) = undef
2020-12-02 16:49:09 +01:00
Gabriel Ozouf
71ac56f8a7 [ion/simulator] Update calculator keyboard image
Remove the "sto" from the x^y/sto->/F key, and add the % symbol to the
Backspace key.
2020-12-01 09:37:09 -05:00
Hugo Saint-Vignes
e295e9ead0 [github/workflows] Update Metrics to remove NumWorksBot
Change-Id: Icfd19cbad5472f6bf81a2a1accb88e79ab7a115b
2020-11-30 14:01:12 +01:00
Joachim Le Fournis
36742789b0 [py] Support round on int 2020-11-30 14:01:12 +01:00
Émilie Feral
312c02fd69 [.github/workflows] ci-workflows: update setup-emscripten 2020-11-30 14:01:12 +01:00
Romain Goyet
bd22c06d98 Use semantic branches on setup-arm-toolchain 2020-11-30 14:01:12 +01:00
ThePythonGuy
b343c5a02c [base.es.i18n] Translated some missing stuff to Spanish (#430)
* Update base.es.i18n

* Update base.es.i18n

* Update base.es.i18n

* Update base.es.i18n

* Update base.es.i18n

* Update apps/home/base.es.i18n

Co-authored-by: Quentin <quentin.guidee@gmail.com>

Co-authored-by: Quentin <quentin.guidee@gmail.com>
2020-11-28 22:40:43 +01:00
Quentin
1f05547437 [github] Update README.md to fix n0100 compilation (#429) 2020-11-27 16:51:08 +01:00
Quentin Guidée
68397ad0a6 [.github/workflows] Fix metrics 2020-11-27 16:42:07 +01:00
Quentin
f0ecb4c833 Merge pull request #428 from Omega-Numworks/omega-bot-for-workflows
[github/workflows] Omega-Robot for workflows
2020-11-27 14:25:01 +01:00
Quentin Guidée
5bbba6cf80 [github/workflows] Reintroduce OmegaRobot 2020-11-27 13:56:02 +01:00
Quentin
7f488b45f1 Merge pull request #427 from quentinguidee/merge-upstream
[upstream] Update
2020-11-27 13:52:03 +01:00
Quentin Guidée
ff029ea785 Merge branch 'omega-dev' into merge-upstream 2020-11-27 13:24:57 +01:00
Quentin Guidée
1347b1a20c [upstream] Update 2020-11-27 13:23:07 +01:00
Hugo Saint-Vignes
1fd970fe50 [apps/regression] Remove TODO and update comment
Change-Id: I049645e03c82e953dde14f363d113b718408efd5
2020-11-26 17:52:42 +01:00
Hugo Saint-Vignes
e9662e4c45 [apps/regression] Compute numberOfPoints automatically
Change-Id: I35a1902aeda06cc80ae8808d886b3e161bae8ad9
2020-11-26 17:52:42 +01:00
Hugo Saint-Vignes
72e8ac7d02 [apps/regression] Add tests for Trigonometric regressions
Change-Id: Ie4363d79a53c09369b24924b35bf26a66e9a8f93
2020-11-26 17:52:42 +01:00
Hugo Saint-Vignes
06d7104776 [apps/regression] Improve initial coefficient value
Change-Id: I2026b8de7e031f7e22921be2def800fa71d7a4e4
2020-11-26 17:52:42 +01:00
Hugo Saint-Vignes
1025fd9937 [apps/regression] Use cmath for sin and cos functions
Change-Id: I670eda49a73d9bf1d1d75194178344adda9b1014
2020-11-26 17:52:42 +01:00
Hugo Saint-Vignes
c55eb6b028 [apps/regression] Fix angleUnit dependent coefficients for trigonometric model
Change-Id: I8027c131b0fd7b020eb502168ac068a0b84da1e4
2020-11-26 17:52:42 +01:00
Gabriel Ozouf
2ba1941270 [poincare/zoom] Float litterals
Change-Id: Ifea5f356b9cee271c43b3d9b9168fd38db78d87a
2020-11-26 17:51:40 +01:00
Gabriel Ozouf
ddfde60982 [poincare/zoom] Update tests for the device
Change-Id: Ied73829ff294dc243ca177c5c2acfb374a7446b9
2020-11-26 17:51:40 +01:00
Gabriel Ozouf
746a781016 [poincare/zoom] Fix coding style
Change-Id: I263e1a95023f650376bf6a1c4bb45426d52d5e4c
2020-11-26 17:51:40 +01:00
Gabriel Ozouf
fdcccde996 [poincare/zoom] Update unit tests
Change-Id: Ic108bfbacd54d43ef6c721589ada813ca648e88e
2020-11-26 17:51:40 +01:00
Gabriel Ozouf
4869383263 [poincare/zoom] Better handling of single points of interest
Functions with a single point of inerest used to be drawn on a tiny
interval around this point.
Now, an orthonormal window is built around the point of interest, giving
a much nicer view.

Change-Id: I7793797aead2695532ddea44d93d62bb7ef870f4
2020-11-26 17:51:40 +01:00
Gabriel Ozouf
229865aff8 [poincare/zoom] Rework unit tests
Change-Id: Id0ff36517d14710701f6a4c1cec8817442b6f946
2020-11-26 17:51:40 +01:00
Gabriel Ozouf
291b400595 [poincare/zoom] Ignore imprecise float value
When looking for extrema in a function, we need to discard results where
the function growth rate is smaller than the precision of the float type
itself : these results are likely to be too noisy, and can cause false
positives.
e.g. : The sqrt(x^2+1)-x function

Change-Id: I6e2c002d7308b41a4c226d274cbb5d9efe4ea7db
2020-11-26 17:51:40 +01:00
Gabriel Ozouf
adf28345b1 [poincare/zoom] Reduce zoom artifact
Do not use the bounds of the interval when computing a refined range.
As the bounds are often integers, the zoom would give strange result on
some non-continuous functions (e.g. f(x) = x!).

Change-Id: Ie127fe15191cb3951cff223adc8dc3172188c789
2020-11-26 17:51:40 +01:00
Gabriel Ozouf
a418602763 [poincare/zoom] Remember points of interest when refining
Change-Id: I229cbffa2577d23bfa0a4c0632bc9ec32ae338e7
2020-11-26 17:51:40 +01:00
Gabriel Ozouf
ca9cb63909 [poincare/zoom] Reduce the step for searching points of interest
The algorithm to search for points of interest will miss some. We reduce
the step to make it more precise, so that tan(x) and tan(x-90) have the
same profile.

Change-Id: Ia1bac1d4e7b98d2d6f36f8ce12ed9dac67d40198
2020-11-26 17:51:40 +01:00
Gabriel Ozouf
540209f1a9 [poincare/zoom] Preserve standard bound when normalizing
Change-Id: I6d736e945eda6982ad26836763feded8a55134a0
2020-11-26 17:51:40 +01:00
Gabriel Ozouf
e4162976e4 [poincare/zoom] Method NextUnit
Change-Id: I8200c38fd44b662dcffa8e9850fc272f3e2dc7e8
2020-11-26 17:51:40 +01:00
Hugo Saint-Vignes
cfc37f1bac [apps/sequence] Factorize sequence row index offsets
Change-Id: Id6fa632521858c48fe7d3daf35fd846bf24a05eb
2020-11-24 13:26:55 +01:00
Hugo Saint-Vignes
387d3c9aa1 [apps/sequence] Fix row offset when returning to previous menu
Change-Id: Ic3eee6bb1ecb991b97dc9190fab95774938d294e
2020-11-24 13:26:55 +01:00
Hugo Saint-Vignes
b08a29cab4 [apps/sequence] Fix typo
Change-Id: Ic34b84073ef268eaddfe4224c3171c9aaa7ca395
2020-11-24 13:26:55 +01:00
Hugo Saint-Vignes
110f333122 [github/workflows] Update Metrics to remove NumWorksBot
Change-Id: Icfd19cbad5472f6bf81a2a1accb88e79ab7a115b
2020-11-24 10:41:59 +01:00
Gabriel Ozouf
4aa19ccd78 [i18n] Fix PT translation for imperial units
Pint -> "Pinto"
Cup -> "Copo"

Change-Id: I96dea0c6f1551db617f017d2121aaf0f2b6d0095
2020-11-24 10:40:56 +01:00
Gabriel Ozouf
56e03aae0c [shared] Remove angleUnitVersion
The angleUnitVersion check is no longer needed, as changing the angle
unit with a trigonometric function set would leave the cursor hanging.

Change-Id: I17d99c05daeacfec953865158cdfe7706635cd32
2020-11-24 09:55:22 +01:00
Gabriel Ozouf
5e679b7bc8 [graph] Change cursor initial position
The cursor now initially aligns with the grid, and tries to avoid points
where the function is not defined.

Change-Id: Ie3b304281f5848102c2f3c0aa5c031b351418186
2020-11-24 09:55:22 +01:00
Joachim Le Fournis
bd5cdb0f65 [py] Support round on int 2020-11-23 12:12:46 +01:00
Émilie Feral
99e63ec30b [.github/workflows] ci-workflows: update setup-emscripten 2020-11-23 11:26:01 +01:00
Hugo Saint-Vignes
962136ce8f [ion/simulator] Temporarly increase stack size on simulator
Change-Id: I0f27277ea704f81e316c7ff78fb7bed8c70ff4ae
2020-11-23 11:26:01 +01:00
Émilie Feral
5eaea62073 [.github/workflows] CI: use msys2/setup-msys2 instead of
numworks/setup-msys2
2020-11-23 11:26:01 +01:00
Fournier Gabriel
3e2b5178ed word wrap - part 1 and 2 2020-11-21 19:29:46 +01:00
Hugo Saint-Vignes
3ac3fba468 [poincare] Prevent system parenthesis text insertion
Change-Id: I5963d2fda37ed9776059b29edced75f88b4ccb2b
2020-11-20 13:33:00 +01:00
Romain Goyet
0de5c89d9b Use semantic branches on setup-arm-toolchain 2020-11-20 11:19:40 +01:00
Hugo Saint-Vignes
d8527b02ad [poincare] Add a vector type for matrix product and norm operations
Change-Id: I28b0956273f8c0a3a9bdc4389956caa106d6b8af
2020-11-19 11:41:29 +01:00
Hugo Saint-Vignes
522456677a [poincare] Add an Array class to factorize Matrix and Grid methods
Change-Id: Ia61caf0bf182c1111119740d43d957f203c0975c
2020-11-19 11:41:29 +01:00
Hugo Saint-Vignes
c0413709b7 [poincare] Require same vector orientation for dot and cross products
Change-Id: I4cf248cf564899314a1efb1c5e39a041395ba583
2020-11-19 11:41:29 +01:00
Hugo Saint-Vignes
cb54e22272 [poincare/test] Add tests on horizontal vectors
Change-Id: If2d6293ede044ffe71e632212eff155b80ad683f
2020-11-19 11:41:29 +01:00
Hugo Saint-Vignes
bee8d8531b [poincare] Handle horizontal vectors
Change-Id: I98088b2b9f2dbc0549795a5c3eed4787fea70068
2020-11-19 11:41:29 +01:00
Fournier Gabriel
5b21c57e4c list files on simulator 2020-11-17 22:44:35 +01:00
Martijn Oost
0ecfa0012c [nl] improved translation statistics 2020-11-17 14:06:18 +01:00
Gabriel Ozouf
0c44deb35f [poincare/matrix_layout] Change comparison order
Change-Id: Iaa048d82005a7dfa380357e80bbac447c0976e55
2020-11-17 11:42:55 +01:00
Gabriel Ozouf
323e72a50c [poincare/matrix_layout] Remove columns with backspace
Allow removing empty columns with backspace, the same way one can remove
empty rows. This allows deleting the internal columns that are not
automatically deleted.

Change-Id: I52def7939257942a8396721d01c4d1531ef90361
2020-11-17 11:42:55 +01:00
Gabriel Ozouf
7184202a6e [poincare/matrix_layout] Keep median rows and columns
Empty columns and rows are only removed automatically when they are the
last row/column. This way, the user can edit a median row/column without
the matrix collapsing.

Change-Id: If611fa0133f270d785809d433ae879879b6b093f
2020-11-17 11:42:55 +01:00
Gabriel Ozouf
62e2a71da1 [poincare/matrix_layout] Remove empty rows
Empty columns are automatically removed ; the same is now done to empty
rows.

Change-Id: Ib66dfe83f1ea712d3f9a450eedd7ade709296413
2020-11-17 11:42:55 +01:00
Fournier Gabriel
76beed20da fix nb_Files limit 2020-11-17 00:04:15 +01:00
Fournier Gabriel
86985a4aef Merge branch 'main' of https://github.com/Gabriel79/OmegaWithReaderTutorial into main 2020-11-17 00:03:29 +01:00
Fournier Gabriel
aacd1a6f32 Lister des fichiers 2020-11-16 23:44:47 +01:00
Fournier Gabriel
dd258a7975 Lister des fichiers 2020-11-16 23:37:45 +01:00
Hugo Saint-Vignes
04b2683af2 [poincare] Replaced an escape case with an assert only
Change-Id: I5ea501beeb42577a25dd752f8b9492210abd38fc
2020-11-16 17:12:42 +01:00
Hugo Saint-Vignes
73b5b0775a [poincare] Avoid nullptr context on non-Numbers sign and nullStatus methods
Change-Id: I3361344c1e0b50cdbe999d6ea50025022a51f603
2020-11-16 17:12:42 +01:00
Hugo Saint-Vignes
a0497d3bd7 [poincare] Prevent Bad access on abstract symbol context
Change-Id: I3077db5fdc2430ee11ceb1c6eb651e4331fb2ba0
2020-11-16 17:12:42 +01:00
Gabriel Ozouf
41778433b1 [graph] Fix a bug when zooming
When entering the Navigate menu, a portion of the Y axis is memoized to
preserve the grid units.
However, this portion was not modified when zooming, causing some
glitches.

Change-Id: I06b4ee044eaa75d48b8f338c9ef6ea33bb299e39
2020-11-16 16:50:21 +01:00
Fournier Gabriel
b4e9ceed18 ListBookController - partie 2 2020-11-15 18:55:34 +01:00
Fournier Gabriel
c37b4bd1f4 ListBookController - partie 1 2020-11-14 13:39:11 +01:00
Quentin
83b4d9390d Merge pull request #402 from RedGl0w/patch-4
[Python] Change heap (32 to 100K)
2020-11-13 20:50:22 +01:00
Quentin
3252bad547 Merge pull request #415 from RedGl0w/patch-9
[Ion/usb] Changed URL in order to have easier update
2020-11-13 20:42:51 +01:00
Gabriel Ozouf
ea3e3287dc [graph] Keep Auto when opening and closing Navigate
If the user opens the Navigate menu, then closes it immediately, the
Auto status is not turned off.

Change-Id: I2d1ca0cfdae1b9c957dede7bf9f3c2890dea1bb0
2020-11-13 17:32:08 +01:00
Gabriel Ozouf
4233f197d3 [shared] Keep graph units when using navigation
When using the Navigate menu on graphs, the grid units are computed
using the normal graph's range, so that the units won't change.

Change-Id: I8ff8853868e5c90319619a6271d6a7d87ae82ab0
2020-11-13 10:50:31 +01:00
Gabriel
a0acdc171b Squelette 2020-11-13 00:48:46 +01:00
Émilie Feral
80f3af389f [build] Add %_run targets to linux, macos and windows platforms 2020-11-12 14:49:12 +01:00
Émilie Feral
0dcb4e9aff [docs] Improve SDK doc: executables are not in the root folder anymore 2020-11-12 14:49:12 +01:00
Roberta Rabotti
6c508d9c29 [IT]translation changes: imperial units
Change translation Imperial units
2020-11-09 17:49:47 +01:00
Martijn Oost
f42b7e4b20 [nl] fix imperial unit translation 2020-11-09 17:31:23 +01:00
Léa Saviot
4df996cfd2 [poincare/expression_node] TODO: use ReductionContext via pointers 2020-11-09 15:50:27 +01:00
Léa Saviot
5df60e946a [poincare] shallowBeautify can modify the reduction context
UnitConvert must set UnitConversion to None, otherwise the unit asked
for in the conversion might get changed after being properly set in
UnitConvert::shallowBeautify.
2020-11-09 15:50:27 +01:00
Léa Saviot
3a0796d3c5 [poincare/test] Add tests about negtive unit convert simplification 2020-11-09 15:50:27 +01:00
Martijn Oost
d7f83eca1c [nl] fix spelling mistakes 2020-11-09 10:48:01 +01:00
Émilie Feral
6e0528deac [apps] it i18n: ortogonale --> ortonormale 2020-11-09 10:34:00 +01:00
Quentin Guidée
78beafe3f1 [ion] Fix web simulator 2020-11-06 23:53:51 +01:00
Émilie Feral
d789e8da97 [poincare] In Multiplication::shallowBeautify, when extracting the unit,
reduce without changing the unit in order to extract the right unit.

This fixes the following bug: simplify "πππ23*_cK"
2020-11-06 14:51:49 +01:00
Émilie Feral
50bc31fcfa [poincare] Test: add a simplification test regarding unit 2020-11-06 14:51:49 +01:00
Léa Saviot
e00cb91f74 [ion/utf8_helper] Reuse strlen value 2020-11-05 13:23:21 +01:00
Léa Saviot
f96e4e92ce [ion/utf8_helper] Fix bad variable use 2020-11-05 13:23:21 +01:00
Joachim Le Fournis
5f34d07e53 [Calculation/expression_field] EE add Ans 2020-11-05 11:39:29 +01:00
Émilie Feral
7acec88006 [python] Port: we used the wrong variable
Found by clang-analyzer
2020-11-05 10:28:24 +01:00
Émilie Feral
5afdec00b8 [poincare] Avoid reading "garbage" value: result variable can be
read in the while condition without being set to an initial value
(if the first ridderApproximation was undefined for instance)

Found by clang-analyzer
2020-11-05 10:28:24 +01:00
Romain Goyet
d9b5acc70d [fuzzer] Invoke Python3 2020-11-04 17:32:45 +01:00
Romain Goyet
55615c10e3 [fuzzer] Always keep assert() when building with AFL 2020-11-04 17:32:45 +01:00
Romain Goyet
cca750a1c4 [fuzzer] The fuzzer detects the number of CPUs 2020-11-04 17:32:45 +01:00
Romain Goyet
7030159530 [fuzzer] make the afl.py script executable 2020-11-04 17:32:45 +01:00
Émilie Feral
4f9c37e96b build: Version 15.0.0 2020-11-04 16:14:28 +01:00
Léa Saviot
7f6a3f0fc1 [apps/curve_view] Fix KDCoordinate overflow
Scenario: (with the current auto zoom algorithm)
Graph f(x) = x! -> Auto axes are x=[-13,17647;13,17647],
y=[3628793;2628807]
Press "0" "EXE" to go to x = 0 -> Axes are x=[-13,17647;13,17647],
y=[-0.8612717;13.13873]
Press auto
Press "0" "EXE" to go to x = 0 -> the assertion about KDCoordinates
breaks.
2020-11-04 15:58:43 +01:00
Émilie Feral
95aa47625c [.github] ci-workflow: missing line 2020-11-04 15:58:43 +01:00
Émilie Feral
c7711b74c2 [poincare] Sequence: reorder condition (optimization) 2020-11-04 15:58:43 +01:00
Émilie Feral
a7b55776d6 [sequence] Remove unused function 2020-11-04 15:58:42 +01:00
Émilie Feral
c5beb6fdd2 [app/sequence] Test: avoid duplicating sequence stores and ensure to
tidy it (empty the Poincare Pool) between quiz_cases
2020-11-04 15:58:42 +01:00
Émilie Feral
5e83bee589 [apps/shared] ExpressionModel: expressionReduced can call itself so it
need to keep a valid m_expression
2020-11-04 15:58:42 +01:00
Émilie Feral
cf2cbd109e [apps/sequence] Add breaking test 2020-11-04 15:58:42 +01:00
Émilie Feral
4cc3542a99 [poincare] Sequence: when approximating within a reduce routine, escape to avoid
infinite loop
2020-11-04 15:58:41 +01:00
Émilie Feral
7142f9545e [poincare] Finish replacing approximateContext 2020-11-04 15:58:41 +01:00
Léa Saviot
f8b3156f19 [poincare] Start replacing approximateContext 2020-11-04 15:58:41 +01:00
Léa Saviot
644cf4dcf3 [poincare] Step II: create ApproximateContext 2020-11-04 15:58:40 +01:00
Émilie Feral
75dc415e27 [poincare] Step I: add a parameter to approximation routines to indicate
if we're within a reduction routine
2020-11-04 15:58:40 +01:00
Gabriel Ozouf
58867b66ca [sequence] Add tests on self referencing sequences
Change-Id: I031f0e8f166aa2d017c0f86679bc9e13e6a432bd
2020-11-04 15:58:40 +01:00
Émilie Feral
291941f4e2 [.github/workflows] CI: use msys2/setup-msys2 instead of
numworks/setup-msys2
2020-11-04 15:58:39 +01:00
Émilie Feral
547b4b2d71 [.github/workflows] CI: trigger CI manually or on PR only 2020-11-04 15:58:39 +01:00
Martijn Oost
bf79d4e438 [nl] stats definitions improved 2020-11-04 15:58:39 +01:00
Léa Saviot
fbf38f891d [apps/shared] Rephrase "Pan" -> "Navigate", "Move" -> "Pan" 2020-11-04 15:58:39 +01:00
Gabriel Ozouf
6f21310e08 [ion/events] Add comment about defaultText method
Change-Id: Ief2b53395a7921d85b116ded935c9dfeb10d08fd
2020-11-04 15:58:38 +01:00
Gabriel Ozouf
993de56d59 [ion/events] Remove method defaultIsDefined
Change-Id: Ic5c057a451bfc49d99f4b2a70ec5dbff16844a86
2020-11-04 15:58:38 +01:00
Gabriel Ozouf
0185e0562c [escher/run_loop] Move kandinksy include
To check whether an ExternalText could be written with Epsilon's fonts,
UTF8Helper made a reference to Kandinsky, which is prohibited. This
check is now done in Escher, before dispatching the event.

Change-Id: I55e9db1ba43c3115775499db47b90a6bdd7cc7b3
2020-11-04 15:58:38 +01:00
Hugo Saint-Vignes
d5e810f2b8 [ion/shared] Remove contexpr array definition in header
Change-Id: I620e977b000ee53c3db97510e666dfda30f4db30
2020-11-04 15:58:38 +01:00
Hugo Saint-Vignes
8dc6391e92 [apps/shared] Prevent Array index overflow
Change-Id: I67ffcb71d0d62a3e67e6d63d2b30b0696800cb42
2020-11-04 15:58:37 +01:00
Gabriel Ozouf
fe950386a0 [interactive_curve_view_range] Fix assert
Change-Id: I2ff3cfe90f10b33db3e18b321cf931c9f0946479
2020-11-04 15:58:37 +01:00
Gabriel Ozouf
9e9033537c [WIP][interactive_curve_view_range] Tweak tolerance
Change-Id: Iacfb7de81a4ab8a7fb73770053e189d596016201
2020-11-04 15:58:37 +01:00
Gabriel Ozouf
ad7890a19c [interactive_curve_view_range] Missing refresh
Fixes the following bug :
  - Plot ln(x) (or any other curve that's normlalized by default)
  - Go back and replace ln(x) with log(x) (or any other curve that's NOT
    normalized by default)
--> The 'Equal Axes' button is still on.

Change-Id: I0ef50dc9866e908894bd4f5c3ade198f9b3ea318
2020-11-04 15:58:37 +01:00
Hugo Saint-Vignes
f789bb156d [ion/keyboard] Fix const const array
Change-Id: I75cfc94ed36493a78bd104f8c4734f2ecd3d042d
2020-11-04 15:58:36 +01:00
Hugo Saint-Vignes
aa50a5eb7c [apps/shared] Silence warning for unused variable
Change-Id: I1df4a8c111688e00a82d4448d47fd571fec738e4
2020-11-04 15:58:36 +01:00
Gabriel Ozouf
eb5f4b333a [ion/clipboard] Update comments 2
Change-Id: Ib628a888f6712ad6ea62ccb20192845d19e84986
2020-11-04 15:58:36 +01:00
Gabriel Ozouf
8bb0b47b9f [ion/clipboard] Update comments
Change-Id: I320f8130b7bc897b6e8e3bf7d79cfcda837a9984
2020-11-04 15:58:35 +01:00
Gabriel Ozouf
f66bde6d31 [ion/clipboard] Rework clipboard handling
Change the way the clipboard is fetched, so as to preserve the
Poincare/Python translation feature, and remove the cap on the length of
text being imported into the simulator.

Change-Id: I0f3e83c0c8aa4b64eb08d882aa6891b31f191e22
2020-11-04 15:58:35 +01:00
Gabriel Ozouf
010b474f77 [ion/clipboard] Add support for web simulator
Wrote methods for accessing the system clipboard from the web
simulator, as the methods in SDL_Clipboard do not work when the video
device uses emscripten.

Change-Id: Ib2e66530a6b013eca0cf69fb52372e9e3a21c8bb
2020-11-04 15:58:35 +01:00
Gabriel Ozouf
b9c34ace3a [ion/clipboard] Use system clipboard on simulator
Add methods to interface Epsilon's clipboard with the system's when
running a simulator.
Note that the clipboard still uses a buffer located in the
Escher::Clipboard class, as some features require a buffer to execute
computations on the clipboard's content.

Change-Id: I14c19615805d38735e64d481c617863db22db9bc
2020-11-04 15:58:35 +01:00
Hugo Saint-Vignes
6ba88921b9 [apps/calculation] Add Unknown NullStatus Todo
Change-Id: Ic67eca0b95350c72167057c40f18ae969793ef18
2020-11-04 15:58:34 +01:00
Hugo Saint-Vignes
42f20fb58d [poincare] Add NullStatus and sign for more complex expressions
Change-Id: Ic593517bf7a983985fe3c521e10c19ab0bca4191
2020-11-04 15:58:34 +01:00
Hugo Saint-Vignes
61d33be2a7 [poincare] Add NullStatus and sign for more expressions
Change-Id: I4443a28532f5b728afe169a3d2a70d9026bc1909
2020-11-04 15:58:34 +01:00
Hugo Saint-Vignes
4a3f749cc6 [poincare] Add NullStatus for expressions
Change-Id: Ibaba72e3e3589ba259c7b22d402e2b27937f27c1
2020-11-04 15:58:34 +01:00
Hugo Saint-Vignes
b2945c3f8b [poincare] Add isNumberZero tests
Change-Id: Ia8906e27c5c28f96c87ed39f522f4b1028ad80b8
2020-11-04 15:58:33 +01:00
Hugo Saint-Vignes
98499f6c9f [poincare] Rename isRationalZero to isNumberZero
Change-Id: I554dd5e9b9ab3af4364ca23cde590f9e0a458ef8
2020-11-04 15:58:33 +01:00
Hugo Saint-Vignes
58114255e5 [poincare] implement isRationalZero for other numbers
Change-Id: I40f61958f9e51adb376407b2a512097962979417
2020-11-04 15:58:33 +01:00
Hugo Saint-Vignes
9d077c672d [poincare/test] Add tests for multiplication reduction
Change-Id: I54186c0a7c12f7fb0122c0a67f4a6d0d462feb82
2020-11-04 15:58:32 +01:00
Hugo Saint-Vignes
0d883bfb19 [poincare] Handle division by 0 when combining powers
Change-Id: I108ba8131ef2f8d3d210a769322a815121311f6b
2020-11-04 15:58:32 +01:00
Hugo Saint-Vignes
aba09e1a1f [poincare] Fix multiplication.cpp comment typos
Change-Id: I1553144fb45f45cbdb4e021b14ef20cb319984cc
2020-11-04 15:58:32 +01:00
Gabriel Ozouf
3b24f9c2c3 [interactive_curve_view_range] Check auto status
Deactivate Auto status every time the range effectively changes.

Change-Id: I695b840d5e72061a73a229a6e726433660bdfdbf
2020-11-04 15:58:31 +01:00
Gabriel Ozouf
5a5955b513 [interactive_curve_view_range] Status unchanged
Only notify the delegate to the refresh the button when the status has
changed.

Change-Id: I6689d2c292ff96039a68cd1b437b18df5fb98829
2020-11-04 15:58:31 +01:00
Gabriel Ozouf
82a77df088 [interactive_curve_view_range] Missing resets
Added some missing resets of the Auto and Normalize statuses

Change-Id: I5514a2566c1f6ba73d04b526402b428b2edce4b4
2020-11-04 15:58:31 +01:00
Hugo Saint-Vignes
f2ba5daab9 [apps/regression] Comment assert that cannot be satisfied
Change-Id: Iaae5ee4292e33f923f47590ee4520bac44c5d750
2020-11-04 15:58:31 +01:00
Hugo Saint-Vignes
f58633b03c [apps/regression] Add escape case if data is not suitable for regression
Change-Id: Ie2e028a5030e1b0d3f133efdde971645d5b4687b
2020-11-04 15:58:31 +01:00
Hugo Saint-Vignes
b2d7ee800a [apps/statistics] Add pop-up to confirm parameter discard
Change-Id: I0d0d7dca0e167cfcb40f4b26d8208e12056ebf40
2020-11-04 15:58:30 +01:00
Hugo Saint-Vignes
a922e44558 [apps/statistics] Add temporary parameters for histogram
Change-Id: I67c21d59263b7eddd7ee8ee9e61c168e6b013d13
2020-11-04 15:58:30 +01:00
Hugo Saint-Vignes
cab22fcbce [apps/shared] Set buttonAction method as protected
Change-Id: Iaef80fdbb6083be688fadc2b5fc515dbbd0d004c
2020-11-04 15:58:30 +01:00
Gabriel Ozouf
aadf8f5716 [ion/events] Fix ExternalText buffer size
The size of the ExternalText events shared buffer is now defined as the
size of the SDL_TextInputEvent 'text' field, as it should.
Also fix a wrong parameter being passed to a strlcpy.

Change-Id: I6a57d49d61fec8a009c4711efce564c65544e571
2020-11-04 15:58:29 +01:00
Gabriel Ozouf
b0b6fe33c9 [ion/events] Factor includes of layout_events.h
Change-Id: Id7f68f4dfb4727453a02437a0b824492a8c94730
2020-11-04 15:58:29 +01:00
Gabriel Ozouf
4ea8263185 [ion/simulator/events_keyboard] Serve ExternalText
Generate an ExternalText event when catching a SDL_TextInputEvent whose
text cannot be boiled down to one of the regular events.

Change-Id: I036fa2a153c8351979521d7f8cba6b62aa64604b
2020-11-04 15:58:29 +01:00
Gabriel Ozouf
8181753553 [ion/utf8_helper] Method to check text compliance
Change-Id: I9683a8ba819b1a4aad18bcc4759160509e424d4e
2020-11-04 15:58:29 +01:00
Gabriel Ozouf
96b8e1859a [ion/events] Create event ExternalText
Added an event to represent the typing of text that is not on the
device's keyboard. ExternalText event's text is read from a buffer, that
will be filled when the event is generated.

ExternalText only exists on the simulator.

Change-Id: Ie78d2c7c2de91da986a1ce2130a5ecd123db48ee
2020-11-04 15:58:28 +01:00
Gabriel Ozouf
65156c8e5a [poincare/zoom] Add test for x*ln(x)
Change-Id: Ia28a7ffb826a9b6e3618b222b6ed9d0d43de308a
2020-11-04 15:58:28 +01:00
Hugo Saint-Vignes
93b5a3f63a [poincare] Handle equal negative numbers in GCD LCM
Change-Id: Ia46966270418a339f8a37e8a1971a7f7dd046034
2020-11-04 15:58:28 +01:00
Gabriel Ozouf
82c4fe2190 [poincare/zoom] Limit explosion detection
Do not take strong variations into account if they would erase more
interesting variations.

Change-Id: I6299a64bed449a611f90eda4234af10a183958d1
2020-11-04 15:58:28 +01:00
Gabriel Ozouf
3a90ed6109 [ion/events_keyboard] Fix selection on long press
A previous fix to prevent AlphaLock from interfering with the long press
feature broke the long press selection. Revert the changes and find
another solution to the previous problem.
We compare the alpha status to both the state of the Alpha key and the
Lock, which makes sense : Lock is supposed to mimic Alpha being
continuously pressed.

Change-Id: I1349eb83f8971d3a5efcb10de020bb6c0aed64a1
2020-11-04 15:58:27 +01:00
Hugo Saint-Vignes
2740056472 [apps/statiastics] Rename i18n messages accurately
Change-Id: If88f91d6e925dbb2ad293b537661eb3d137ea826
2020-11-04 15:58:27 +01:00
Hugo Saint-Vignes
81616950f3 [apps/statistics] Fix horizontal alignement for size legend
Change-Id: I834444aee7dd547c71254df4658c0db05eb101d7
2020-11-04 15:58:27 +01:00
Martijn Oost
6628e76d36 [NL] adjust translation in python app 2020-11-04 15:58:27 +01:00
Martijn Oost
52adea0c1f [NL] correct spelling mistake 2020-11-04 15:58:27 +01:00
Hugo Saint-Vignes
14e2f6247a [apps/shared] Update translation size -> frequency
Change-Id: I841bd22077cccacc7d2a4a541cca2e463f13925b
2020-11-04 15:58:26 +01:00
Hugo Saint-Vignes
bb8a28ade0 [poincare/zoom] Simplify plot ranges after adding margins
Change-Id: If8904ca4e7d306376de785a125fe5fba168de718
2020-11-04 15:58:26 +01:00
Hugo Saint-Vignes
3f25a37cc8 [i18n] Update Graph view parameters wording
Change-Id: Icd65c4e19b78cd8751d6b1b583c112abb08c9237
2020-11-04 15:58:26 +01:00
Hugo Saint-Vignes
2f97dab6d1 [apps/shared] Add toggle buttons in Graph view
Change-Id: I7548d11fb114b2605ce34d3bda0776277b79ff9d
2020-11-04 15:58:25 +01:00
Gabriel Ozouf
a76e54642c [poincare/zoom] Change struct to class
Change-Id: I06d1850074b266a694d74e4db4c754ff156c8098
2020-11-04 15:58:25 +01:00
Gabriel Ozouf
194cd0491c [sequence] Format comment
Change-Id: Iaff562cca9af3eb903d6cc8a529c730184235e4b
2020-11-04 15:58:25 +01:00
Gabriel Ozouf
29f47124b1 [poincare/zoom] Use std::min & max
Change-Id: If3983c16d3bfa0de31aefe8a3f5c650e1858f822
2020-11-04 15:58:25 +01:00
Gabriel Ozouf
3a87e47de5 [interactive_curve_view_controller] Zoom button
Renamed zoom button

Change-Id: I476c0991d5ab88c6642b793fbe10debbcca4e014
2020-11-04 15:58:24 +01:00
Gabriel Ozouf
0e4de43b8f [shared] Rename ZoomParameterController
Change-Id: I64a6500b66db4455217920a1e73efd5848216411
2020-11-04 15:58:24 +01:00
Gabriel Ozouf
f491be2db5 [poincare/zoom] Accelerate normal range search
Change-Id: I4a7f2e024ca82a3996ad3e395c8f62ca4170ec9e
2020-11-04 15:58:24 +01:00
Gabriel Ozouf
31e694f41a [poincare/zoom] Add tests
Change-Id: Ia7229d790ef1d2039071e35accb102804c94cb01
2020-11-04 15:58:23 +01:00
Gabriel Ozouf
9c320185dd [poincare/zoom] Return value for boring curve
Change-Id: Iad983da0aa3066f5be0c75c5b8e38e62a907d5a1
2020-11-04 15:58:23 +01:00
Gabriel Ozouf
c647bfe566 [poincare/zoom] Clean up and comment API
Change-Id: I58347d7188551471817fb334bcb54d5c5b398f72
2020-11-04 15:58:23 +01:00
Gabriel Ozouf
91e1154bb8 [sequence/curve_view_range] Fix normalize
Change-Id: I1e4aa49dd84f12fe4e0f2ab59912fc68fe00b2fa
2020-11-04 15:58:23 +01:00
Gabriel Ozouf
6f8d80f8ae [regression/store] Sanitize default range
Add range sanitation and checks for orthonormal ranges in setDefault.

Change-Id: I733a8808e944a477573a76b52fef479853b8ad6d
2020-11-04 15:58:22 +01:00
Gabriel Ozouf
c4cd3ecffa [poincare/zoom] Factor range sanitation
Checking wether the range that has been computed is suitable is now
done in Poincare::Zoom by SanitizeRange.

Change-Id: Ib7ff73a3beae29996b1a773744021ad85c6ba946
2020-11-04 15:58:22 +01:00
Gabriel Ozouf
b10be2c60c [poincare/zoom] Method SanitizeRange
Create a method to clean up an ill-formed range, ie a range whose bounds
are not finite, or where max <= min.

Change-Id: If4525e65f95385cfa970be72bbcc21ad84286bfa
2020-11-04 15:58:22 +01:00
Gabriel Ozouf
71e7070657 [function_graph_controller] Remove yRangeForCursorFirstMove
This method, that prevented the graph from panning when moving the
cursor for the first time, caused more problems than it solved.
For instance, the graph for 1/(1-x) was not symmetrical because of it.

Change-Id: Ibb22e38ec0ace6b219c0e42dda481c98b5f717f0
2020-11-04 15:58:21 +01:00
Gabriel Ozouf
3ba4f974f7 [interactive_curve_view_range] Move status update
The methods setDefault and normalize now update the zoomAuto and
zoomNormalize status.

Change-Id: I0400c22816c17d38fd1b3dee5c8a2f1ccfa79340
2020-11-04 15:58:21 +01:00
Gabriel Ozouf
958b172d08 [poincare/zoom] Handle undefined functions
Rework the logic so that :
  - an undefined function will be displayed with a clealry defined
    null range.
  - display both an undefined function and a correct function at the
    same time will not affect the correct range.

Change-Id: Ife9dc0d2ace667cab5a6b8826347078fca33e4d5
2020-11-04 15:58:21 +01:00
Gabriel Ozouf
20cbefad41 [function_graph_controller] Fix y for first move
Method yForCursorFirstMove is supposed to expand the window so that the
first move of the cursor won't cause it to pan. It now filters extreme
values to prevent the original window to be totally squashed, such as
with the drawing of e^x and (x-100)(x+10) at the same time.

Change-Id: Icd6c26b01475a112c4231f293e03ab31d80d5e51
2020-11-04 15:58:20 +01:00
Gabriel Ozouf
0a6ac0b40b [apps/graph] Remove tests on ranges
As zooming has moved to Poincare, so will the tests.

Change-Id: I6c1fe581edc903369779e46a295447273a89e517
2020-11-04 15:58:20 +01:00
Gabriel Ozouf
1bfeeb5842 [poincare/zoom] Detect explosions
Add a clause in InterestingRangesForDisplay to detect strong variations.
This improve the graph for x^x or x^2+x+1 for instance.

Change-Id: I74214c2382cfe4b0e2603556dd8c6cbd450effc0
2020-11-04 15:58:20 +01:00
Gabriel Ozouf
8ce9f363ad [interactive_curve_view_range] Force equal axes
Added a tolerance when checking orthonormality, so that ranges that are
nearly orthonormal will be made orthonormal.

Change-Id: Ie3bf076086561e3ff6374e7daa9dd1a884c52d5a
2020-11-04 15:58:19 +01:00
Gabriel Ozouf
482ca10363 [poincare/zoom] Improve null range
When displaying f(x) = undef, the range now defaults to an orthonormal
range, centered on the origin, with axis unit 1.

Change-Id: Ie3515be0572af4849b8ebd113449f4444755b34f
2020-11-04 15:58:19 +01:00
Gabriel Ozouf
190568ea84 [interactive_curve_view_controller] Fix Cursor
Restore the permanence of the cursor between accesses to the graph
window.
The cursor used to be reset when the models had been modified. As there
is no longer a system in place to track these modifications, we manually
check if there is a curve beneath the cursor before reseting it.

Change-Id: I6f71fc17744b5bf1ee552c82126bb4a08b823629
2020-11-04 15:58:19 +01:00
Gabriel Ozouf
16707aa518 [poincare/zoom] Tweak orthonormal range
Change some parameters to improve the output of
RangeWithRatioForDisplay. Notably, change how the size of the range is
weighed.

Change-Id: I7695c61c3f93482f3fed9c7d2183642573b02cff
2020-11-04 15:58:18 +01:00
Gabriel Ozouf
6be5e7d62c [apps/shared] Change Zoom API
Moved some code around to decrease redundancy and put more of the logic
into Poincare::Zoom

Change-Id: I4804cf39493ac7f2f0b3c4eb554e5c15c3cef1c9
2020-11-04 15:58:18 +01:00
Gabriel Ozouf
8572f4953c [poincare/zoom] Method CombineRanges
The logic behind combining several ranges will be handled by the Zoom
class directly.

Change-Id: I4de3f020d94b9bc1a21953b0c416158c65beb606
2020-11-04 15:58:18 +01:00
Gabriel Ozouf
81e425eb04 [poincare/zoom] Method FullRange
Change-Id: Ibfaa0b694afecab312199b20b102a57901f34ae7
2020-11-04 15:58:17 +01:00
Gabriel Ozouf
09c061e871 [poincare/zoom] Method RangeFromSingleValue
This method adds margins to a range whose bounds are equal.

Change-Id: I2b2fe26fe431deda112389060d401f738a75b1ae
2020-11-04 15:58:17 +01:00
Gabriel Ozouf
a525c35ebb [poincare/zoom] Factor constants
The mantissas {1, 2, 5} used in CurveViewRange to compute the grid units
can be factored in Zoom.

Change-Id: I2bcc9b9df1ff6b6df82092a5d78ed3db132bf63a
2020-11-04 15:58:17 +01:00
Gabriel Ozouf
88ea32bd0d [poincare/zoom] Change range forms for fixed ratio
When looking for a range with a certain ratio using
RangeWithRatioForDisplay, instead of looking for ranges of the form
0.01*1.1^n, search for ranges of the form a*10^k, with a being either 1,
  2, or 5.

Change-Id: I2eaa229574a9a6aa4afa6eb1a3d57365d3d52801
2020-11-04 15:58:17 +01:00
Gabriel Ozouf
43f50b7b2d [interactive_curve_view_range] Missing refresh
The normalized status would not be refreshed after a call to setDefault
triggered by InteractiveCurveViewController::viewWillAppear.

Change-Id: I923ef3ca0585dbcc1f32b992d7dd1f4a3a206532
2020-11-04 15:58:16 +01:00
Gabriel Ozouf
bcb4b3095b [function_graph_controller] Fix Y range expansion
The method FunctionGraphController::yRangeForCursorFirstMove expands the
Y range to include the values of the first cursor moves on the left and
the right of the center. It has been modified to preserve
orthonormality.

Change-Id: I898ab9721e45e2acde261f8b94b80cab81b39a92
2020-11-04 15:58:16 +01:00
Gabriel Ozouf
f54b15b9c8 [interactive_curve_view_range] Preserve ratio
Preserve orthonormality when adding margins to a default range.

Change-Id: Iaa1da8d36812e2dad1be3894198ee0fabcd3020f
2020-11-04 15:58:16 +01:00
Gabriel Ozouf
5d9c7b0c1f [interactive_curve_view_range] isOrthonormal
Change-Id: I154487908d1a2a11e01b2a4e51ef867e235babab
2020-11-04 15:58:15 +01:00
Gabriel Ozouf
29714b401e [shared/function] Create an orthonormal range
When the function does not have any points of interest, fall back to an
orthonormal range.

Change-Id: I90e4bcfae80ebd37f95d404a4a63121c93cf7cff
2020-11-04 15:58:15 +01:00
Gabriel Ozouf
d642339963 [interactive_curve_view_range] Normal ratio
The method NormaRatio returns the screen ratio for an orthonormal
range.

Change-Id: Ib834f9934232866646da16c78447782cdbdc0af2
2020-11-04 15:58:15 +01:00
Gabriel Ozouf
403315f6ac [poincare/zoom] Find range with specific ratio
Change-Id: Id0c816c42e3fa93519241bf53f920c333e204af1
2020-11-04 15:58:15 +01:00
Gabriel Ozouf
08c96c5107 [poincare/zoom] Method SetToRatio
Added a method to Zoom to set a range to a specific ratio. This method
is used by InteractiveCurveViewRange::normalize.

Change-Id: Id3029439294ece02ea19fb6c6de90b9edc85d771
2020-11-04 15:58:14 +01:00
Gabriel Ozouf
c4aad1641e [poincare/zoom] Rename k_defaultMaxInterval
Bring it in line with k_minimalDistance which as a similar role.

Change-Id: Ifc3ad793e8b5ff1e7f2598d0665abdd5c954e61f
2020-11-04 15:58:14 +01:00
Gabriel Ozouf
0465cec924 [poincare/zoom] Remove rounding of abscissa
As margins are added later in InteractiveCurveViewRange::setDefault,
rounding abscissa at this point is premature.

Change-Id: I411dd014b712649efd55cb995ed7a9c5c14a7f43
2020-11-04 15:58:14 +01:00
Gabriel Ozouf
ad6edffc07 [poincare/zoom] Remove tuneXRange argument
The ability to perform a range search without changing the X range was
only there to accomodate the Yauto feature.

Change-Id: I8c2b61b447fbd3dc1f4e303dff06d1a8d6e7a4f2
2020-11-04 15:58:14 +01:00
Gabriel Ozouf
07c52139b9 [apps/shared] InteractiveCurveViewRangeDelegate
Clean up the class by removing some unused methods and structures.

Change-Id: Ife38a9a0ed4bfb84986227d1f57fe3f5d2c4ff2a
2020-11-04 15:58:13 +01:00
Gabriel Ozouf
26754a3230 [graph] Force same grid unit on orthonormal graphs
Change-Id: I2abca9eb1c4a14057323ee97e1044715f89620ff
2020-11-04 15:58:13 +01:00
Gabriel Ozouf
7322751453 [regression] Compute Y range for curve
Regression's automatic Y range used to rely on the Yauto feature. Since
it has been removed, it is now done in Store::setDefault.

Change-Id: I1b6653bb8ebe0ba99decff05bae29bd5a69a9f6c
2020-11-04 15:58:13 +01:00
Gabriel Ozouf
0f1e27b2b6 [apps/sequence] Add Y range to interestingRanges
The computation of Sequence's graph default Y range used to rely on
Yauto. As this feature does not exist anymore, this work is now done int
Sequence::GraphController::interestingRanges.

Change-Id: Idba8560d5f25d0bf34dd0e1dd98c2af67f427709
2020-11-04 15:58:12 +01:00
Gabriel Ozouf
1d4d56a7dd [apps/range_parameter_controller] Change margins
Reduce the top and bottom margin of the table view to better see the
Confirm button.

Change-Id: I71df479400c44a10fe75b8beaae1c81be305cdfd
2020-11-04 15:58:12 +01:00
Gabriel Ozouf
f0cd0694a6 [apps/shared] Activating Auto zoom resets cursor
Change-Id: Ib815286e1316e20f72b31d3d9206aa032b06eff4
2020-11-04 15:58:11 +01:00
Gabriel Ozouf
bf76b56f90 [apps/shared] Change Zoom button in curves
Zoom is now called navigate, and its button is placed before the Axes
button.

Change-Id: Ied194c20438e573a237ce36f221b9be87cfd4bab
2020-11-04 15:58:11 +01:00
Gabriel Ozouf
43d21180bc [apps/shared] Deactivate zoomAuto on pan and zoom
The Auto mode for curve ranges must be deactivated when moving the
cursor outside the screen and when activating navigation (formerly
Zoom).

Change-Id: I281a1d069c2ebcc30e7ead469c4f48438054d7c2
2020-11-04 15:58:11 +01:00
Gabriel Ozouf
5c67f92d18 [apps/interactive_curve_view_controller] Buttons
Add two new buttons to toggle Auto and Normalized modes for curves.

Change-Id: Ib583d087ce5ae779d24f6a8bbc72ab7140752dd5
2020-11-04 15:58:10 +01:00
Gabriel Ozouf
cc22b0d298 [apps/shared] Reset curve range to default in Auto
When the range is set to ZoomAuto, the range is recomputed before
displaying the curve.
2020-11-04 15:58:10 +01:00
Gabriel Ozouf
e2725c8e61 [apps/interactive_curve_view_range] Status markers
Add member variable m_zoomAuto and m_zoomNormalized to remember the
interactive range's status.

Change-Id: I77c43ddd683d3c6011742801139d23f5e20c99fe
2020-11-04 15:58:10 +01:00
Gabriel Ozouf
13d1b7077c [apps/shared] Removed method computeYRange
This method of InteractiveCurveViewRangeDelegate was only used to
compute the Y range when Yauto was on.

Change-Id: I9b688a87e16fc58c7d2b00eb071076b98f945df6
2020-11-04 15:58:09 +01:00
Gabriel Ozouf
8970e294aa [apps] Remove modelVersion from curves apps
The graph range used to be reset to default whenever all functions were
modified. As we no longer want to reset the range without the user's
input, we do not need to track whether the functions changed at all.

/!\ As of this commit, there is no longer a way to restore the default
zoom, until a new automatic zoom button is added.

Change-Id: Ie74e8fd61e13055fa6ce2b2d1e883182d4ecffce
2020-11-04 15:58:09 +01:00
Gabriel Ozouf
1a5661fd4c [apps/range_parameter_controller] Remove YAuto
This allows for a great deal of simplifications in the class
RangeParamterController.

Change-Id: I5de55d4e8e1f598eb13b08fb8f042907f55b2fa8
2020-11-04 15:58:08 +01:00
Gabriel Ozouf
5a07db3452 [apps] Remove "Preadjustments" menu for curves
Change-Id: I1a30efd502c5db36325d87fa0f1dffacc37a4f1c
2020-11-04 15:58:08 +01:00
Gabriel Ozouf
d2b36be846 [poincare/zoom] Move automatic zoom to Poincare
Change-Id: I7a70ab54b33b9150682cc4f999ff4999a8288b7f
2020-11-04 15:58:07 +01:00
Hugo Saint-Vignes
7499a9e0a4 [apps] Set Country from language in main.cpp
Change-Id: I09f6733fa36e8f0c7870bc26eb8662cda79ae715
2020-11-04 15:58:07 +01:00
Hugo Saint-Vignes
5339d9e7b4 [apps/shared] Add static assert for cache steps
Change-Id: I77498775b4caf3d97522219d2a7c979601b985e8
2020-11-04 15:58:07 +01:00
Hugo Saint-Vignes
4acbf3346b [apps/shared] Add comments and minimize threshold
Change-Id: Ieb56513ea0a7fab35acf15531277aec5cd6071ca
2020-11-04 15:58:03 +01:00
Hugo Saint-Vignes
ebe207d67d [apps/shared] Fix cache overlap when plotting polar curves
Change-Id: I4b1d6dccdedc5b3cea455e2ad2038336b4b48064
2020-11-04 15:55:40 +01:00
Arthur Camouseigt
b567a09103 [VariableBox] Allowing sequences to display their type
Change-Id: I2929f7d9f3a266fbff81100a39f793fe6200da1d
2020-11-04 15:33:05 +01:00
Léa Saviot
ad80c2c4d7 [ion/keyboard] Do not define constexpr arrays in headers
They are duplicated in each compilation unit where they are called
2020-11-04 15:33:05 +01:00
Hugo Saint-Vignes
697f727429 [apps/shared] Add discard confirmation on range parameters
Change-Id: I609acbd136cb0bc84899777810f4c1497832952f
2020-11-04 15:33:05 +01:00
Hugo Saint-Vignes
3705ce4f92 [apps/graph] Add discard confirmation on domain parameters
Change-Id: I61043aa195f10038bbcfb6c091f08e684db20849
2020-11-04 15:33:04 +01:00
Hugo Saint-Vignes
150a5bfa5a [apps/shared] Add discard confirmation on table intervals
Change-Id: Id152577c570febf06b4d829fd2723c2a30c3ccd9
2020-11-04 15:33:04 +01:00
Hugo Saint-Vignes
bd23135198 [apps/shared] Add Discard confirmation pop-up
Change-Id: Ida3878894090ecfa99145618b8e1ff0bbcb4743a
2020-11-04 15:33:04 +01:00
Arthur Camouseigt
91dc5eb5ec [Sequence Graph] Fixing the banner to display u(n)
The banner used to display u(n+1)/u(n+2) if the sequences were not
explicit. This was incorrect and fixed

Change-Id: I59100942b51f4170d9662a6fd7b82d0f7e50ae6f
2020-11-04 15:33:04 +01:00
Arthur Camouseigt
bf95b460c3 [Sequence] Fixed computation error and asan fails
Change-Id: Ib3a619d29bee5cc6f10b939ee066459a5b135c5d
2020-11-04 15:33:04 +01:00
Arthur Camouseigt
86d0c19293 [ok view] Fixing the grey tone of the ok symbol
Change-Id: Id65a4e37c41e1b675178d3220c15ebfe26b1e71e
2020-11-04 15:33:04 +01:00
Arthur Camouseigt
bf0f6c7a33 [Global Context] Fixed rank approximation error for sequences
Change-Id: I29c0a55956aee8764e50650b229a49aa8a0f9336
2020-11-04 15:33:04 +01:00
Émilie Feral
f64a650ef6 [apps] I18n: localize Dutch exam mode messages 2020-11-04 15:33:04 +01:00
Martijn Oost
8f117e9d4e [NL] correct spelling mistake 2020-11-04 15:33:04 +01:00
Roberta Rabotti
8a5ed92a56 [IT] Translation changes: Prime factors 2020-11-04 15:33:04 +01:00
Serenela Moreira
59b2a64830 [pt] corrected prime factors
And improved translation of another detail
2020-11-04 15:33:04 +01:00
Gabriel Ozouf
25ab4b2a52 [shared/localization_controller] Table cropping
Forced the top cell of the country table to be cropped in the middle,
cutting the text, to avoid the cell looking squashed.

Change-Id: I4d126ed19249f47652bd7f2001384b2491cfe6f8
2020-11-04 15:33:03 +01:00
Hugo Saint-Vignes
b051242f2b [test] Avoid high precision number approximation
Change-Id: I88537653cea2a399581e9686bd027c9d20953667
2020-11-04 15:33:03 +01:00
Hugo Saint-Vignes
a326a1f9ff [poincare] Fix approximation test
Change-Id: I0951e01acf7266e33d05f40de3119b73c656b9a2
2020-11-04 15:33:03 +01:00
Hugo Saint-Vignes
d224778330 [ion/simulator] Temporarly increase stack size on simulator
Change-Id: I0f27277ea704f81e316c7ff78fb7bed8c70ff4ae
2020-11-04 15:33:03 +01:00
Hugo Saint-Vignes
fa9c9c1567 [apps/regression] Add todos for logistic regressions
Change-Id: If2ddc0527d8be89970803de240a6760d037570e2
2020-11-04 15:33:03 +01:00
Hugo Saint-Vignes
e517128a9e [apps/regression] Compute R2 better when dealing with constant regression
Change-Id: Ic724d8d96cb723718a1ce57e72132972a782fc5e
2020-11-04 15:33:03 +01:00
Hugo Saint-Vignes
3f43504398 [poincare] Check for nan values when inverting matrix
Change-Id: Idb542682003348da151975e635958cf909010d16
2020-11-04 15:33:03 +01:00
Gabriel Ozouf
ab864d10d8 [ion/events] Compare event for repetition
This fixes the following bug :
  (Anywhere with a movable cursor, like a table, a text field or a curve)
  - press Alpha (once, or twice to activate the lock)
  - keep pressing a direction
--> The cursor would only move once.

Change-Id: I46115d1a31ced244615bfdfe08f37dfe7e918d6e
2020-11-04 15:33:03 +01:00
Gabriel Ozouf
d8e6b63a2e [sequence] Type stays selected in menu
- Create a first-order recursive sequence
  - Select u_n -> Sequence type
--> The second line will be selected, as expected.

Change-Id: I2025ebaa9a7b49ee33ff5e63a4c767a858b46850
2020-11-04 15:33:03 +01:00
Émilie Feral
7168188a44 [ion] Simulator apple: fix rule_label for assets 2020-11-04 15:33:03 +01:00
Martijn Oost
388d1a785e [apps/calculation] Update NL translation
Change NL definition in additional results
2020-11-04 15:33:03 +01:00
Émilie Feral
64ff5b4c70 [app/shared] CurveView: simplify implementation of
pixelLengthToFloatLength (avoid avoidable overflows)
2020-11-04 15:33:03 +01:00
Émilie Feral
5b4fc6ff84 [apps/shared] CurveView: implement CurveView::pixelLength(Axis) 2020-11-04 15:33:03 +01:00
Émilie Feral
d6751e6e03 [apps/shared] CurveView: improve floatLengthToPixelLength to avoid
useless computations (and potential overflowing)

This fixes the drawing of arrow(100,100,0.1,3) in matplotlib module of
python
2020-11-04 15:33:02 +01:00
Gabriel Ozouf
5d3069ff34 [code/catalog] Capitalize 'line feed' in EN
Change-Id: I91b8c4b613b9e9dece13fbb0e9635b4aa8dbfd4a
2020-11-04 15:33:02 +01:00
Gabriel Ozouf
c1b0465ca4 [apps/i18n] Add 'Metric' message
'Metric' is used to label the toolbox sub-menus containing metric units
when the selected country uses the imperial system.

Change-Id: I6f40bcd3151be614a5a02cdd17c70ea4a91bfc00
2020-11-04 15:33:02 +01:00
Gabriel Ozouf
bad0c81bf0 [apps/math_toolbox] Rearrange unit toolbox
The layout of the unit toolbox changes depending on the unit system in
the selected country.
All units have been rearranged by increasing order of magnitude.

Change-Id: Ib51759cca88fd6b6122dd5a3a25b8ed04024aaf3
2020-11-04 15:33:02 +01:00
Gabriel Ozouf
2e2845370a [apps/math_toolbox] Add fork nodes in tree
Some nodes of the ToolboxMessageTree can be marked as "forks",
dispatching one branch or the other depending on preferences.
They are used in the Unit menu to provide a different toolbox depending
on the unit system.

Change-Id: I591f7abc3d24e682e827a540a9defac1877871b5
2020-11-04 15:33:02 +01:00
Gabriel Ozouf
6105f44a46 [escher/toolbox_message_tree] Add indirection
The children of a ToolboxMessageTree object can be stored as a simple
pointer, representing an array of all the children stored consecutively,
or as a double pointer, representing an array storing the addresses of
all children.

Change-Id: I10134684963aaafc635aaf9a2374d0f3c32d3d0c
2020-11-04 15:33:02 +01:00
Gabriel Ozouf
f777cad3f7 [kandinsky/font] Degree symbol
Aligned the top of the degree symbol ° with the top of capital C and F,
and reduced its right margin.

Change-Id: I63f50654afd965186400e451d71be41add9556c8
2020-11-04 15:33:02 +01:00
Gabriel Ozouf
0c1d0195cd [poincare/unit] Check uninitialized expressions
In Calculation, keeping the BACK key pressed can lead to iffy
simplifications and uninitialized expressions beign passed to
ShouldDisplayAdditionalOutputs and SetAdditionalExpressions methods.

Change-Id: If248ab193c471ff433828fc841e01a391e0c052d
2020-11-04 15:33:02 +01:00
Gabriel Ozouf
bc7ca057a0 [apps/calculation] Add Joules to results on energy
Change-Id: Ib775b1bd2bac1fd3bf755a9a4d3d5b3739a67cfa
2020-11-04 15:33:02 +01:00
Gabriel Ozouf
10f8e2f507 [poicare/unit] Rename method
hasAdditionalExpressions -> hasSpecialAdditionalExpressions

Change-Id: Ia5200402b23ab5adf0f94dabe027955a86d1174d
2020-11-04 15:33:02 +01:00
Gabriel Ozouf
ddbe76fec5 [poincare/unit] Add missing additonal results
Additional results are proposed for all units combinations that include
a non-base unit, in addition to units with special results.

Change-Id: I91f2a1a43c72bad0327132396534a223e87b06a2
2020-11-04 15:33:01 +01:00
Gabriel Ozouf
4e771fdb54 [poincare/unit] Missing prefix reset
When tuning the representative without tuning the prefix, the prefix
would not be reset to its default value, causing a problem for masses,
whose base prefix depend on the representative (k for grams, none for
the rest).
Fixes a crash when typing sqrt(_N) with country set to US.

Change-Id: Iade900de5fb31e06fdfafef34ae27da3f36983fa
2020-11-04 15:33:01 +01:00
Gabriel Ozouf
d862d5503c [poincare/unit] Fix rational exponent rounding
In metric, sqrt(N) would be simplified to _N_kg^-0.5_m^-0.5_s instead of
_kg^0.5_m^0.5_s^-1.
We solve this issue by preventing simplification using derived units
in presence of rational exponents.

Change-Id: I97118bb32c963809c8d176b7b297d1682965e9af
2020-11-04 15:33:01 +01:00
Gabriel Ozouf
4ba0603e0c [apps/calculation] Duplicate additional result
Fix duplicate additional results on units by comparing serialization.

Change-Id: Ia360ae7846716a801253b60fcf000240834528bc
2020-11-04 15:33:01 +01:00
Gabriel Ozouf
4d0950fa1e [ion/simulator] Handle typing % on simulator
Change-Id: Ib47786659e710e473f75d1c6887a9794fad0a75f
2020-11-04 15:33:01 +01:00
Gabriel Ozouf
ac2dd9cdf0 [i18n] Translated "Tonne" to "Metric Ton"
Change-Id: I515d78445065a94cc387781ee87a5fa23b3c2df2
2020-11-04 15:33:01 +01:00
Gabriel Ozouf
586e53bb42 [i18n] Set International as default country
When launching a firmware without onboarding, starts with International
selected by default instead of Canada.

Change-Id: Ice5cde4210c4c2934c909d97296460707343773f
2020-11-04 15:33:01 +01:00
Hugo Saint-Vignes
073893ae48 [poincare] Exact undef results with GCD and LCM
Change-Id: Iba39cd6140d8ef5b3fd24e0f53c9e28fbd57d438
2020-11-04 15:33:01 +01:00
Hugo Saint-Vignes
a89878a24d [poincare] Allow more BinomialCoefficient exact results
Change-Id: I9dbbf9471ee6d9e12fe4861a5b11990858382562
2020-11-04 15:33:01 +01:00
Gabriel Ozouf
857ca4eecd [poincare/trigonometry] Fix wrong use of pi
In Trigonometry::shallowReduceInverseFunction, the reduction of
atan(1/x) used the hard value of pi instead of its equivalent in the
selected angle unit.
This fixes a bug causing atan(1/tan(40°)) to be equal to π/2-40 instead
of 50.

Change-Id: Ifd7df5cd168fadf3146eee168c0bc2136ea15a7b
2020-11-04 15:33:01 +01:00
Hugo Saint-Vignes
91d9438421 [poincare] Fix forbidden array access
Change-Id: I3de76c114f6712ee08007601766577d87ed96877
2020-11-04 15:33:01 +01:00
Hugo Saint-Vignes
7e5ddcd36b [python/turtle] Prevent position overflow from turtle
Change-Id: Ieb8a7b64bab1ce6fac23ca4c8dcb43467b8d4d5c
2020-11-04 15:33:01 +01:00
Gabriel Ozouf
6a9a5dbe27 [i18n] Factor duplicate messages in universal
Units with the same name in all available languages have been moved to
the new file toolbox.universal.i18n.

Change-Id: I82ef362ca335dc61da5f3bca67714a9ae409793d
2020-11-04 15:33:01 +01:00
Gabriel Ozouf
63076758a3 [i18n] Check for redundancy in localized messages
After parsing the .i18n files, compare the messages and raise an error
if some of them could be factored into a universal file.

Change-Id: I0dcfe309dc4c310555a0ea16b6d1680e51a8e87d
2020-11-04 15:33:00 +01:00
Arthur Camouseigt
3019609946 [Sequence] Fixing display issue in sequence graphs
Change-Id: I1b914c31cf2e7a84329e86486e30f3a7244f235d
2020-11-04 15:33:00 +01:00
Gabriel Ozouf
64e7057d50 [apps/on_boarding] Remember language choice
When choosing a language and then pressing back from the country menu to
get back to the language menu, the previously selected language remains
selected.

Change-Id: I018c51cce09d47b15bb4864c135d381a94b2a72f
2020-11-04 15:33:00 +01:00
Gabriel Ozouf
54c28fc87f [escher/modal_view_controller] Hide regular view
Do not display the regular view when the main view takes up all the
frame.
This fixes a bug causing the language menu to be briefly visible before
the logo on start-up.

Change-Id: Ia2de44de52ac6f852e0eca05101587042f02913b
2020-11-04 15:33:00 +01:00
Gabriel Ozouf
77ac333e11 [on_boarding/i18n] Localize contact email address
Change-Id: I19ae4299e09b63c373734ddff835fedcabb6749c
2020-11-04 15:33:00 +01:00
Arthur Camouseigt
6a84ba2523 [global_context.cpp] Fixing sequence bug
u(n+2) = u(n+1) + u(n) + u(2)
u(0) = 2
u(1) = 2
Crashed because the global context was not checking if the sequence was
badly referencing itself

Change-Id: I97f694955e15518bb088db50deb761d7ee09d75f
2020-11-04 15:33:00 +01:00
Gabriel Ozouf
d5ce234d4d [probability] Align snapshot buffers
char buffers m_distribution and m_calculation had too weak an alignment,
causing a crash when starting the web simulator.

Change-Id: Ibfd3c2582bc4de97beb4d6cc51b9fb86300edb5e
2020-11-04 15:33:00 +01:00
Gabriel Ozouf
4bde3ed4b0 [poincare/solver] Fix type ambiguity warning
Change-Id: I9248080520d6fa6430dddb8811dbd0120fc08d79
2020-11-04 15:33:00 +01:00
Gabriel Ozouf
28d18dd6a5 [ion/utf8_helper] Signedness and capitalization
Change-Id: I3451a206fbd45a490eea0115621c07abb868344a
2020-11-04 15:33:00 +01:00
Gabriel Ozouf
bd068312d9 [apps/continuous_function_cache] Clear on bad step
Cache did not check that the step was the same before panning, causing
old values to remains cached.
e.g. :
  - Type f(x) = x, and plot it.
  - Go to Axes, and set Xmax = 0.
  - Confirm

Change-Id: Ie8ed10c336cf517a65f19b05bd14866daf8128c2
2020-11-04 15:33:00 +01:00
Gabriel Ozouf
3f19d66c78 [poincare/unit] Change temperature symbols
Celsius and Fahrenheit now use the degree symbol °.
  _Cel -> _°C
  _Fah -> _°F

Change-Id: Ic5935d3a6263a556692bebb6254b6b6d4de48431
2020-11-04 15:33:00 +01:00
Gabriel Ozouf
67e6e38825 [poincare/parsing] Parse degree sign ° in units
Change-Id: I518aba17214b049dfa8fd3b89f4ce124dbd6b41a
2020-11-04 15:33:00 +01:00
Gabriel Ozouf
d37540f032 [poincare/unit] Add Celsius and Fahrenheit
Temperatures can be converted to and from degree Celsius and Fahrenheit.
When used in non-trivial calculations, they are always reduced to undef,
as the rules for manipulating relative scales are not well defined.

Change-Id: If59e224a0e7f940b421bc894bbe2279c90f38d04
2020-11-04 15:33:00 +01:00
Arthur Camouseigt
4274b558b6 [Sequences] Changing the name of CacheContext to SequenceCacheContext
Change-Id: If2d542748f6f7b2363d6c1443f88c058475945eb
2020-11-04 15:32:59 +01:00
Arthur Camouseigt
960335c330 [Sequences] Fixed a few crashes
Change-Id: Ib929bbae0f9ca06409706336ff799075e1288694
2020-11-04 15:32:59 +01:00
Gabriel Ozouf
26bbdead7d [apps/shared] Allow movement from undef curve
Fix a bug preventing the cursor from moving to other curves using UP and
DOWN when the y value was undef.
To reproduce :
  - In Graph, define f(x) = 1 and g(x) = ln(x), then draw the curves
  - Press DOWN to select g
  - Press LEFT until g is not defined anymore
--> Pressing UP or DOWN won't allow you to select f

Change-Id: I79ed4a57b78ac0b8dac3f66e722e358bd4be18d9
2020-11-04 15:32:59 +01:00
Hugo Saint-Vignes
c130f8e881 [apps/shared] Prevent KDPoint overlfowed translation on cursorFrame
Change-Id: Ifc32eefaf4241d59d7567cadb9b2962ba5efb4d9
2020-11-04 15:32:59 +01:00
Arthur Camouseigt
ea36c6e5d7 [Clipboard] Changed the general copy/paste
Fixed issues due to copy/paste of empty formulas. When pasted, empty
formulas are now recognized by the parser and apear with the
correct layout

Without this process, copying an empty integral then pasting it gives :
int((), x, (), ()) instead of drawing an empty integral

Change-Id: I680aaf4eea953149e2d57efa8153ab4d3f93e2a7
2020-11-04 15:32:59 +01:00
Arthur Camouseigt
8f97a332f6 [Python] Modified the paste effect in script and shell area
When a formula is pasted in a script or in the shell, some symbols are
replaced by their equivalent in python :
x turns into *
^ turns into **
√ turns into sqrt
etc
Change-Id: If6f2a22d4f3c148c2655e0892023b0e28058a9a6
2020-11-04 15:32:59 +01:00
Gabriel Ozouf
4b965a0ff6 [shared/localization_controller] Add top border
When selecting a country, the table would be cropped by the text, with
no separator between the white of the cropped cell and the background
color.

Change-Id: Ia6be40bce40b7cdb3efa064989d45ef5c046e364
2020-11-04 15:32:59 +01:00
Arthur Camouseigt
913c81a0d3 [solver] Modified the way to solve some equations
The solutions of equations that need numerical approximations to be
solved are now computed base on the undeveloped equation (instead of
fully the expended one used to identify polynomials)

This allow (x-10)^7=0 to yield x=10 as result (9.95 before)
Change-Id: Ia8acbe57a9cfebf0b5016e9c896d21c8ddac7a64
2020-11-04 15:32:59 +01:00
Gabriel Ozouf
6e9a5a010f [poincare/integer] Add tests on euclidean division
This commit also adds tests on mixed fractions.

Change-Id: I0fee88eb00febccaa9445230f8f2bbb92cd1ba98
2020-11-04 15:32:59 +01:00
Gabriel Ozouf
bad21f0ab5 [poincare/integer] Fix negative mixed fraction
Mixed fractions for negative rational numbers are now computed as the
opposite of their opposite's mixed fraction, as is conventionnal.
ex : -9/5 is now decomposed as -1-4/5 instead of -2+1/5

Change-Id: I6df3dce585ccadd1bcd7cc562576995face98f9c
2020-11-04 15:32:59 +01:00
Hugo Saint-Vignes
b92c819ea2 [escher/src/text_area] Add char limit in text_area line
Change-Id: I9284936f0202d788edc785aa3f7c82b45ab34cf5
2020-11-04 15:32:59 +01:00
Arthur Camouseigt
51002066e9 [sequence] Fixed crash due to undefined sequence
Change-Id: Ie67ff4aa9a53eb8b04535e3b61737e11c9049316
2020-11-04 15:32:59 +01:00
Gabriel Ozouf
b8544e3708 [apps/shared/text_field_delegate_app] Refuse Equal
The Equal sign now triggers a syntax error in all apps but Solver. This
make its behaviour symmetrical with that of < and >.

Change-Id: Ia886c547a315d5627a69f3f2acac2cbce0e202c2
2020-11-04 15:32:58 +01:00
Arthur Camouseigt
fa0e8de0a9 [VariableBoxController] Changed the way sequences appear
Change-Id: I45a1cb01ab9c5aefd298c40050e69850a4cc5c71
2020-11-04 15:32:58 +01:00
Arthur Camouseigt
1d71a14d2c [Context] Modifying context method signature for sequences
This allows sequences to be used in functions by calling u(x)

Change-Id: I336e84a19bf9b3dd0f2e435d1aaebda3c9e71ec8
2020-11-04 15:32:58 +01:00
Arthur Camouseigt
3dca515441 [VariableBox] Added sequences to the variable box
It is now possible to call the value of a defined sequence anywhere.

Change-Id: I1990e93c50f9add175b7ea274e07004ba63289e5
2020-11-04 15:32:58 +01:00
Arthur Camouseigt
c006ed7b10 [Sequence & Shared] Changed the location of various files
Moved sequences files to shared in order to allow the system to compile
without the app sequence.

Change-Id: Ia8349814a72776244acc41af964059f24e58cff0
2020-11-04 15:32:58 +01:00
Arthur Camouseigt
ed358590ce [Sequence] Changed the way sequences are parsed
Change-Id: If19b46a317e4f336ac857690827ab08e147ac75a
2020-11-04 15:32:58 +01:00
Arthur Camouseigt
8434da60ef [sequence] Changed sequences behavior
Sequences can now be defined using specific terms form other sequences :
Un = n
Vn = u(3)

Initial values can also depend on other sequences.
Should there be a circular dependency, the sequences concerned will
display "undef" as value

Change-Id: I6fe1f3ff7b500f35d480ddefb42de729c327432e
2020-11-04 15:32:58 +01:00
Hugo Saint-Vignes
688394abce [ion] Set stack pointer when testing as well
Change-Id: Ibeae7961535208c224f9ac51f4cf33e3978665b3
2020-11-04 15:32:58 +01:00
Hugo Saint-Vignes
e199143412 [apps/shared/curve_view] Small binary code size optimization
Change-Id: I4b61506edb434cb901a6fb92ef5c145f43c51035
2020-11-04 15:32:57 +01:00
Hugo Saint-Vignes
8fdec305c4 [apps/graph/test] Fix caching test
Change-Id: I536d1422ca6c9ecded66f7876ae019aaf5742005
2020-11-04 15:30:54 +01:00
Hugo Saint-Vignes
70a628f2c8 [apps] Fix Python assert crash on malloc free
Change-Id: I48f86422f7d6af5227e2556e6ef531dfad696da4
2020-11-04 15:30:53 +01:00
Gabriel Ozouf
d917b2e1c9 [poincare/unit_convert] Fix improper reduction
In UnitConvert::shallowBeautify, an orphan expression would be reduced
without reaffecting the reduction's result. The reduction not being
taken into account would cause problem when handling undef values.
ex : Try to calculate i->_min

Change-Id: I4e53afa40ba838fed8c2fba9944c9c9ed1dc95b4
2020-11-04 15:30:53 +01:00
Arthur Camouseigt
1995781a9f [Poincare/IEEE754] Changed methods to use std function
Implemented std::nextafter to replace hand made one.
Methods next and previous are no longer making the difference between -0
and +0

Change-Id: I42e1a073623b70656d9df954694803840cf3088c
2020-11-04 15:30:53 +01:00
Martijn Oost
338968a493 improved translations in toolbox and the calculation, python and functions app 2020-11-04 15:30:53 +01:00
Arthur Camouseigt
ae43ec0cc9 [Poincare/layouts] Fixed a crash due to infinite loop
Change-Id: Ieb6563dd978c5c363326163b983b40ed13dab913
2020-11-04 15:30:53 +01:00
Gabriel Ozouf
a6db9688cd [apps/function] Factorize zoom in Function class
The new zoom implemented for ContinuousFunction is now factorized inside
Function to benefit the Sequence class. The same things is done to code
added to Graph::GraphController, which is moved into
FunctionGraphController.
This removes the reimplementation of several methods, most notably
computeYRange, as the implementation for function is general enough to
work on sequences.

Change-Id: I9b8211354064f46c3fa3dde3191dcb39d627a1d2
2020-11-04 15:30:53 +01:00
Gabriel Ozouf
33f9bb50a3 [apps/continuous_function] Forced X axis display
The auto zoom did not display the X axis when drawing positive curves
with roots, such as sqrt(x).

Change-Id: Ic80fd3207691dc917f7b64c07d7745ab5df1daa3
2020-11-04 15:30:53 +01:00
Gabriel Ozouf
a1aefb0cb2 [apps/graph] Added tests on graph ranges
Change-Id: I6c080f40c934cd31083be3d19aa0a4d0bb33c5cc
2020-11-04 15:30:53 +01:00
Gabriel Ozouf
17f39e5e39 [apps/graph] Take cursor into account for Y range
Additional checks have been added to ensure that the first move of the
cursor from the center of the graph would not cause the window to pan up
or down.

Change-Id: I44d7e86223941076cbf03db7a221e9c0427a64e4
2020-11-04 15:30:53 +01:00
Gabriel Ozouf
0ed0cc56e9 [poincare] Remove characteristicXHalfRange
Method characteristicXHalfRange was used to compute the range on which
to display cartesian function in Graph. With the new zoom algorithm,
this method is deprecated.

Change-Id: Ic681fab8d58d0f5628a94302a7b49dacaaa1a6a3
2020-11-04 15:30:53 +01:00
Gabriel Ozouf
8104caea50 [apps/shared] New automatic zoom on curves
Initial zoom for displaying curves is computed according to the
following rules :
  - For polar and parametric curves, the algorithm has not changed.
    Vertical and horizontal ranges are chosen in order to display the
    full curve with orthonormal graduations.
  - For cartesian curves, the horizontal range is chosen in order to
    display all points of interest (roots, extrema, asymptotes...).
    The vertical range is fitted to be able to display those points, but
    also cuts out points outside of the function's order of magnitude.

Change-Id: Idf8233fc2e6586b85d34c4da152c83e75513d85c
2020-11-04 15:30:53 +01:00
Gabriel Ozouf
1917999f6d [poincare/unit] Fix crash with Units in Graph
In Graph, the weak ReductionTarget would cause _X^0 to not be simplified
to 1, and would break an assertion in
Unit::chooseBestRepresentativeAndPrefix.

Change-Id: I8167a472802baf0a73bf48513f492e78517107ef
2020-11-04 15:30:53 +01:00
Gabriel Ozouf
9be5e7671c [apps/settings] Fix broken assert
Pressing OK or EXE with the brightness setting selected would cause a
crash because of a mishandling of the events for this cell.

Change-Id: I4978b4f749b5f19bc1e49ec05b60a32044d86638
2020-11-04 15:30:53 +01:00
Gabriel Ozouf
d6c7b2b1ac [poincare/multiplication] Factoring undef power
When factoring 1^inf * 1^-inf with Multiplication::factorizeBase, an
Undef factor would appear an be carried into the reduced multiplication.
We escape early in this situation by returning Undef.

Change-Id: Id826ad3cc131349e5bb460f7a8c82fe606294b97
2020-11-04 15:30:53 +01:00
Hugo Saint-Vignes
59d5adace3 [apps/shared] Optimize polar curve range display
Change-Id: Ic1b044212711d1f73e147cb0857084ff9d61fbd9
2020-11-04 15:30:53 +01:00
Hugo Saint-Vignes
0e11760f08 [apps/shared/curve_view] Improving performances for non cartesian curves
Change-Id: Ie1a9a6450e8f92ceaf93c5fe78711640be175e9e
2020-11-04 15:16:55 +01:00
Hugo Saint-Vignes
d937bc692b [apps/code] Fix crashes on full buffer
Change-Id: If9297f1ca29015cad0cc1cdda3ad610fd1493392
2020-11-04 15:11:45 +01:00
Hugo Saint-Vignes
aba135bc8b [escher] Add textArea line number limit
Change-Id: Ia0d9a9136282efc87c0996c141c0852ed75892f9
2020-11-04 15:11:45 +01:00
Hugo Saint-Vignes
52f83eb682 [apps/shared] Halve k_parametricStepFactor to maximise cache hits
Change-Id: Ibe3c441e4af88277d1e4594801b805336a1f3e0b
2020-11-04 15:11:45 +01:00
Gabriel Ozouf
db4a1b0265 [poincare/tests] Add tests on power layout
Change-Id: Ic7b0fbf87eec528221a4f836d34e1736e219ab96
2020-11-04 15:11:45 +01:00
Gabriel Ozouf
7c27440916 [poincare/layout] Tracking issue in addSibling
The addSibling method sometimes did not take into account the offset
introduced by adding parentheses, leading to some issues :
  - Type 2 SQUARE RIGHTPARENTHESIS LEFT SQUARE. Parentheses are added
    but the new square should be outside, between the two right
    parentheses.

Change-Id: Ifbc49cee2cd03c4511fc5a678d6d5d42243f4a22
2020-11-04 15:11:45 +01:00
Gabriel Ozouf
be8e452285 [poincare/layout_cursor] Fix cursor after Square
When typing Square in 2D Edition mode, the cursor would not be
repositionned correctly, leading to some issues :
  - Typing 2 POW 3, pressing RIGHT to return to the baseline, then
    typing POW again adds parentheses around 2^3, as is mathematically
    correct. Typing 2 SQUARE, then POW, would show 2^2^_, while
    the user really typed (2^2)^_.

Change-Id: I29c01d964924907a1866490189ea56e40771521d
2020-11-04 15:11:45 +01:00
Gabriel Ozouf
504223612d [apps/apps_container] Add timer to circuit breaker
poincareCircuitBreaker requires the Back key to be pressed for at least
50 ms before interrupting a computation.
This is effectively invisible for the user, but fixes a bug in
Calculation :
  - When leaving the additional results for a result using units by
    pressing the Back key, a reduction preceding a call to removeUnits
    would be interrupted, causing an undefined behaviour.

Change-Id: Iec667ae964f190de2171850cc22e1726959e6cb5
2020-11-04 15:11:45 +01:00
Gabriel Ozouf
df6383d2d8 [apps/i18n] Added default country for languages
After choosing a language at onboarding, the country menu now has a
specific country selected by default (Spain for Spanish, Italy for
Italian...)
Default countries are specified in apps/language_preferences.csv

Change-Id: Ia6392aceb9bebf7e62a692c5a79eb8c4d7b71a9d
2020-11-04 15:11:45 +01:00
Gabriel Ozouf
ec6ee82b81 [poincare/multiplication] Imperial volume display
With the imperial system selected, volumes are expressed as volume in
Calculation's results, instead of cubic lengths.

Change-Id: Ib6c0a1a595dce8ae8db6371b41af818b3fdc6236
2020-11-04 15:11:45 +01:00
Gabriel Ozouf
860ce558c2 [poincare/unit] Remove some additional results
Imperial additional results now only appear when the selected unit
system is Imperial.

Change-Id: Icc314d0148810bea67e4d729179393f1fceaf214
2020-11-04 15:11:45 +01:00
Gabriel Ozouf
801c61549c [poincare/unit] Change units for volume split
In additional outputs, a volume is now splitted as :
  _gal+_qt+_pt+_cup
instead of :
  _gal+_cup+_floz

Change-Id: I5020afbab23be6331d8a8742fd6295db178f0b37
2020-11-04 15:11:45 +01:00
Gabriel Ozouf
5e06f62ff6 [poincare/unit] Symbols for cup and tablespoon
_cp   -> _cup
_Tbsp -> _tbsp

Change-Id: Ied3e1624edc980f76c2f775cbb9e6028db8a83c5
2020-11-04 15:11:45 +01:00
Gabriel Ozouf
52dcd8e749 [poincare/unit] Restructure Unit
1. Information about a unit's dimension now uses inheritance.
   _m is an instance of DistanceAlias, which is derived from Alias.
   A UnitNode now keeps a pointer to an Alias and one to a Prefix.
   All aliases are still defined as constexpr.
   This cleans up a lot of the code used namely for computing the
   additional outputs in Calculation.

2. Instead of being defined with a string, each unit is described by its
   ratio with the base SI unit (ex: _L is 0.001 instead of "0.001_m^3").
   This greatly speeds up the calculations using units, as the algorithm
   to find the best unit used to parse the definition.

Change-Id: I4d6ed6ad4cb967026a3f01a335aec270066e2b9f
2020-11-04 15:11:45 +01:00
Gabriel Ozouf
e48e826536 [poincare/test] Updated tests on units
Change-Id: I7c146174bcedcccc3ed31a298c9720aa2a5ba3a9
2020-11-04 15:11:45 +01:00
Gabriel Ozouf
1f3c4b66a0 [poincare/unit] Changed imperial units definitions
Imperial units are now defined directly from the base unit, instead of
building on one another.

Change-Id: Ieb020643983ef49092d2d3033a7cc2135c646015
2020-11-04 15:11:45 +01:00
Gabriel Ozouf
87dd1b6310 [apps/i18n] Translate imperial units
Change-Id: I8f586b752c0c2114dfb656e34c9b9d928c5b6c59
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
f288573db0 [apps/unit] Add short and long tons
Change-Id: Ib48c6a7c773e9e1d18c9f55e6dda5330fe0a28f9
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
284c501532 [apps/unit] Add restriction to some input prefixes
The symbol for pint (_pt) conflicts with the symbol for pico-tonne. To
solve that, prefixes for tonnes are now restricted to the positive
prefixes : k, M, G, T.

Change-Id: Ie968374bbb5e0ebd2c0f08e4b1bdc1708eb6a041
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
b2f81db4a9 [apps/home] Apps placement defined by country
Instead of relying on the order in which the apps are passed at compile
time, the look of the Home app is defined in a config file, and depends
on the country chosen.

Change-Id: If7f56a284e0001d6d75ece1e7efdf5fd1d0a9978
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
fad375c11c [poincare] Add unitFormat to ReductionContext
Change-Id: I1d3fcd2f47c973c041e1be84e9a902dd58de3562
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
6c676782aa [apps/calculation] New additional results on units
The additional results on units now include conversions into both unit
systems (metric and imperial).

Change-Id: Ie0f12eb3735e775560b66c2cbd78bc9a659145bb
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
3ff25fb5c1 [poincare/unit] Standard unit methods
Added methods to return the standard format for each dimension,
depending on the chosen unit system.

Change-Id: I3591a806beca315674cc09093b57e8753db5db6a
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
9f40e45b20 [poincare/unit] Split for several dimensions
A split (such as _h+_min+_s) can now be generated for distances, volumes
and masses using imperial units.

Change-Id: Ib3ad63614979eddd02fbe0e99f16cf09dcf7c1fc
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
4d9f3aae97 [poincare/unit] Generalized BuildTimeSplit method
BuildTimesplit (used to create expressions of the form h+min+s) is now
based on the more general BuildSplit.

Change-Id: I3e55359cc6b9735269140942b29bd1d364fc35e7
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
5a31a6c1e2 [poincare/unit] Output units based on region
When the country is USA, the units will be simplified to common imperial
units rather than metric.

Change-Id: Ia533527a429ac26526380e324b9543b359f3b400
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
62f598110e [apps/shared] Created LocalizationController
Classes LanguageController and CountryController have been fused into
one class LocalizationController, as they were very similar. This allows
the Settings and OnBoarding apps to only keep one controller for both
functions.

Change-Id: Ic23f300c37122249d34caaf18a633b5815240a78
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
5749d871b0 [apps/i18n] Moved country preferences
Instead of being hardcoded in the python script, preferences specific to
each country are defined in the country_preferences.h and .csv files.

Change-Id: I71e276341e1586935b4d5814be5b1be80fa170a0
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
8121400cf2 [apps/i18n.py] Method for printing lists
New methods print_block_from_list factors code used to generate enum
classes and arrays.

Change-Id: I4ce7d22c3ffca4f12b9439f88ce288fcf9b85090
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
2b59509fdd [apps/i18n] Derive preferences from country
Each country comes with an set of preferences, built at compile time by
apps/i18n.py, used to define :
  - the exam mode
  - the method for computing quartiles
  - the unit system in which to output the results with units
Functions to access those preferences are available in
via sharedGlobalPreferences.

Change-Id: I220ebaa9b9e8954dfe33cd51936f47505b98978d
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
e2a6edd78f [poincare/preferences] Added UnitFormat preference
The UnitFormat can either be Imperial (for the US) or Metric (for the
rest of the world.

Change-Id: Ic698e6732f1fa225d88a14e61751b775fe70f1ab
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
4d6682e211 [poincare/unit] Added imperial units
The new units are :
  distance    mile, yard, foot, inch
  mass        pound, ounce
  volume      gallon, quart, pint, cup, fluid ounce
              table spoon, tea spoon

Change-Id: I6864067a1822a077764ed3b61fc46004732e9447
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
ea127cdfa9 [apps/statistics] Added tests for all countries
As some definitions now depend on the selected country, tests for the
statistics app now check that the right method is used for each country,
and that each method yields the correct results.

Change-Id: Ia5ad091136746f3284f7524376301fac0c582364
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
86f7a87d45 [apps/statistics] International quartiles
Implemented a new method for computing quartiles, used for all countries
except France and Italy. Quartiles are now computed as the medians of
the lower half and upper half of the dataset.

Change-Id: Idfb89a617799eca1d23326ebbcfbbea58e6236b8
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
8d362ef4de [apps/settings] Added message to country menu
Change-Id: Iec064d0ac86f54a10cf63236b6f958d53cecb2e2
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
b35cdca9bb [apps/exam_mode] Country-locked Dutch exam mode
The Dutch exam mode is now only accessible when the selected country is
Netherlands on an official firmware.

Change-Id: I6d70f79b6e728482d8c7d86ef6a2e5c53ee18a39
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
509a7e4628 [apps/on_boarding] Added country to onboarding
Change-Id: I55c50330baf226826e44467756bcd9e5c89d4262
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
a96b5d1bc4 [escher] Typo in StackViewController
Change-Id: I13bdd05759fd2f0bc6911adafe8950e46c2bfe85
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
fe25118d04 [apps/shared] Sorted countries in menu
Country names now appear in alphabetical order in the menu, depending on
the chosen language.

Change-Id: I57b8ce0a7120a3c8a433ce1b05628842c4d0aeb5
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
51747d3d36 [apps/settings] Added country to settings
Refactored Settings::MainController::handleEvent

Change-Id: Id8ad604183a64520dd785356514e87fddc50354c
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
1642276678 [apps/shared] CountryController
Created a CountryController class to chose the country in the settings
and at onboarding.

Change-Id: I6787e8b45744a8a98e83f59e5d2c4760364635cb
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
3f9b8f03af [apps/global_preferences] Added country preference
Change-Id: Ifbe09e2a24b4e1b9386f323bd5ebd9bed7fc8440
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
d156c8c99e [apps/i18n] Added country support
Added a list of supported countries to I18n, and created messages for
each country's names in each language.

Change-Id: I1b887d75da980d99e21f89cc151249e42c78de88
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
87591369b8 [apps/regression] Model stays selected in menu
When opening the window for choosing the regression model, the row
corresponding to the currently selected model will be highlighted.

Change-Id: I65772186fc302c3706a5571f98ecff620e4a8ca9
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
0a7833ec3d [poincare/test] Added 0*inf*π = undef test
Change-Id: Ie18e75c3cfd2a39f8436405f1061ba8fc5317b7f
2020-11-04 15:11:44 +01:00
Gabriel Ozouf
206013f2db [poincare/multiplication] Return Undef early
Multiplication::privateShallowReduce can create an Undef node by
multiplying 0 and inf. In this case, we set the whole multiplication to
undef, to avoid things such as undef*π.
This fixes the following bug :
  - In Graph, enter i*inf*π as one of the bounds. An assertion fails in
    Multiplication::removeUnit.

Change-Id: Ie9d0d561d6e310f52220b98541f22a4b5e56762c
2020-11-04 15:11:44 +01:00
Hugo Saint-Vignes
aa14a6a82e [apps/apps_conainer] Add Home and PowerOn/Off to interrupt computations
Change-Id: I3951cda606760843fb0703864b9da078bf7fd887
2020-11-04 15:11:44 +01:00
Arthur Camouseigt
58b69c2779 [AbsoluteValue] Adding formal derivate to absolute value
This will prevent diff(|x|, x, 0) to be evaluated to 0 instead of undef
This fixes issue #1393
Change-Id: I73f40aa29f04c373cd3e9edbbd4fbe7be6d7a988
2020-11-04 15:11:44 +01:00
Hugo Saint-Vignes
f562886a7e [poincare] Fixed crash due to infinite loop with horizontal layout
Change-Id: I00106525b29ce441e10a6d88766efdecd80d8291
2020-11-04 15:11:44 +01:00
Hugo Saint-Vignes
74a2211a6a [poincare] Use default methods for GCD and LCM instead of n_ary ones
Change-Id: Id353e4367bcb6700bae2f9c121af93b9379a8051
2020-11-04 15:11:44 +01:00
Émilie Feral
ec0e766c94 [apps/graph] text_field_function_title_cell: fix read of uninitialized buffer
This fixes the following crash: when reloading the cell before
initializing the m_textFieldBuffer, TextField::ContentView::text() will
use the content of the uninitialized m_textFieldBuffer to compute the
minimalSizeForOptimalDisplay.
2020-11-04 15:11:44 +01:00
Hugo Saint-Vignes
5b82b94c20 [poincare] Prevent forbidden ChildAtIndex call in fraction_layout
Change-Id: I00d282a6dd3618f669aaeb0202d6495ae8035f12
2020-11-04 15:11:44 +01:00
Arthur Camouseigt
edcc1f6e80 [Poincare/integral_layout.cpp] Fixed crash due to infinite loop
Changed previousNestedIntegral method to prevent integrals located in
integral bounds to be considered as nested.

Change-Id: Id8cc4369f53c278ac59039fde1c2818af2ccacab
2020-11-04 15:11:44 +01:00
Hugo Saint-Vignes
685b2a8d6d [poincare] Reduce Abs layout verticalMargin
Change-Id: I3edacc192b0274d73fd787bb81b0c895e29ddda3
2020-11-04 15:11:43 +01:00
Hugo Saint-Vignes
2512425868 [poincare] Factorize bracket pair rendering
Change-Id: I80f2d04c8833352f4097bcfdcf90b5ec147dc19f
2020-11-04 15:11:43 +01:00
Hugo Saint-Vignes
3aa5e8bcd6 [poincare] Add Vector Norm Layout
Change-Id: Iae5bbeabaa0ca627ae6651f187d1a42b970df37d
2020-11-04 15:11:43 +01:00
Hugo Saint-Vignes
8d2af7e77f [poincare/test] Add VectorOperation tests, tidy rref tests
Change-Id: I4072bee6b2d3bf1ad17045149bff8dcdb6a2f238
2020-11-04 15:11:43 +01:00
Hugo Saint-Vignes
6db02ea122 [poincare/vectors] Implement Vectors operations
Change-Id: Ib5aa2f5951f4eabe3b04078eab8b7d3a4d3769e7
2020-11-04 15:11:43 +01:00
Hugo Saint-Vignes
ca91b7c43d [apps/toolbox] Add Vector operation toolbox menus
Change-Id: Iab8faa45a3f30be979f7d705ac169e8f2b801da9
2020-11-04 15:11:43 +01:00
Hugo Saint-Vignes
8688fd5b95 [apps/shared] Add template for privateEvaluateXYAtParameter
Change-Id: I97b4165307f57e52924e321cb85154cb32ba1008
2020-11-04 15:11:43 +01:00
Hugo Saint-Vignes
56a9e8d74b [poincare] Fix LCM GCD bug on device compilation
Change-Id: I5ac11b7e72ede335db503b1d0f9c0be00710cd0b
2020-11-04 15:11:43 +01:00
Hugo Saint-Vignes
53e204db3a [liba] Add abs function for int
Change-Id: Ic133ff2f34c7ff24ecbec69d5f31e447a72ae4fe
2020-11-04 15:11:43 +01:00
Arthur Camouseigt
0a92499dd7 [Poincare/unit] Changing the value of AU
The value of astronomical unit was wrong. This fixes issue #1637

Change-Id: I175c8fae9044beb1e863ddbf3a260224a9c60bd6
2020-11-04 15:11:43 +01:00
Hugo Saint-Vignes
cbd26e69d1 [apps/graph/list] Apply changes on confirm with function interval selection
Change-Id: I0ec1ae54788f1c72fc8277544ed51a85ba4474d5
2020-11-04 15:11:43 +01:00
Hugo Saint-Vignes
cce1fa0c90 [poincare/test] Add tests for LCM and GCD
Change-Id: If91c1ef863c9810e1ab87525a5ed2b4c7ed45656
2020-11-04 15:11:43 +01:00
Hugo Saint-Vignes
cafb1c1c05 [poincare] LCM and GCD accept set of numbers
Change-Id: I367ff5e48fa2856e976aa020ac0d172216f3a421
2020-11-04 15:11:43 +01:00
Hugo Saint-Vignes
0322a1a6a7 [apps/shared] Fix draw curve issues when tStep << tStart
Change-Id: Iaf054cff1f78f3c800564a0e6c133192bdfab260
2020-11-04 15:11:43 +01:00
Arthur Camouseigt
22a15f5ed6 [Shared/store_parameter_controler] Fixed a bug
In stats when selecting an action on a column, all actions listed after
the one selected were applied. Adding breaks to the switch solved the
issue

Change-Id: I4a2f8a41f734a209abb17e76388eed551bf1769c
2020-11-04 15:07:20 +01:00
Hugo Saint-Vignes
9e12b61849 [apps/graph] Round x before evaluating graph cursor on scroll
Change-Id: I13500669963eb8130e188a898bed0bf63655add6
2020-11-04 15:07:20 +01:00
Hugo Saint-Vignes
bd2609bcba [apps/graph] Remove horizontal margins when panning on some graph calculations
Change-Id: I1a28555c5b4f04986b223617ab15110711a74841
2020-11-04 15:07:20 +01:00
Gabriel Ozouf
c04a7af22f [escher/layout_field] Change cursor behavior
Some code to prevent the input field from scrolling when switching to
the history in layout mode causes problems :
  - With a calculation in the history, type an empty matrix or fraction.
    Then with the cursor on an empty square, go to the history. The
    square will appear shifted to the right.

Change-Id: I72ebee675215dc3c3a3f8432890f6fee820ef5c9
2020-11-04 15:07:20 +01:00
Gabriel Ozouf
9e3470436a [apps/calculation] Move input memoization
Calculation's input is now only saved and restored when the app truly
closes or opens, instead of whenever the EditExpressionController enters
or leaves the responder chain (which also happens when the user switches
to the history or the toolbox, or triggers a syntax error).

Change-Id: I8404f1bc5619bcbc03272b406962d284fe25f7e2
2020-11-04 15:07:20 +01:00
Hugo Saint-Vignes
d027d99597 [apps/calculation] Reset highlighted cells in additional results
Change-Id: I517e7d3dd025413f405fed605631dad830540e76
2020-11-04 15:07:20 +01:00
Gabriel Ozouf
44da25dd64 [poincare/number] Fixed typo
Change-Id: Id691ade099f09c8479582751aaab6dbd7f077711
2020-11-04 15:07:20 +01:00
Gabriel Ozouf
891366c51d [poincare/expression_node] Added Double type
Float<float> and Float<double> used to share the same expression type
(Float), and the distinction was made by comparing their size. However,
due to padding, their size could be the same, leading to some issues :
  - On the simulator, in Calculation, type 1_mm^3 and go to the
    additional outputs. One of the results would be -0.0003081979_µm^3.

Change-Id: Ic8f9328bf462104776fbab636c34d0d152cd7e58
2020-11-04 15:07:20 +01:00
Arthur Camouseigt
1e82d5012b [Stats] Moved sort messages to shared+NL translation
This allows compilation without stats app

Change-Id: I0f564ee46756420f0cff5da91ed77677b22cdee0
2020-11-04 15:07:20 +01:00
Arthur Camouseigt
f9a1f1a1b7 [Poincare/test/approximation.cpp] Fixed broken test
Change-Id: I6d851abf9626d282133f143afa2a16ca2d8bec7e
2020-11-04 15:07:20 +01:00
Arthur Camouseigt
b7bfc253eb [poincare/trigonometry] Modified shallowReduceInverseFunction
This fixes issues #1541. Formulas as asin(sin(X)) with X a large number
were failling to simplify themselves into the image interval of asin
ex : previous version asin(sin(6)) = 6
     new version asin(sin(6)) = -2pi+6

Change-Id: Ia6200b67914224cecd2cd943bcf9bc2ff6e0447a
2020-11-04 15:07:20 +01:00
Arthur Camouseigt
5569ba92a2 [poincare/approximation_helper] Changed the way to approximate
To prevent incorrect approximations, such as cos(1.5707963267949) = 0, we lowered the precision value. This way,
  the approximation is more selective. However, when ploting functions such as e^(i.pi+x), the float approximation fails
  and therefore, the function appears "undef".
  As a result we created two functions Epsilon that behave differently according to the number's type. When it is a double,
  we want a maximal precision -> epsilon_double = 1x10^(-15), and when it is a float, we accept more agressive approximations
 -> epsilon_float = 10 x 1x10^(-7).

Change-Id: I844ac52ade665f51fe6888db38f4485c193286d9
2020-11-04 15:07:20 +01:00
Hugo Saint-Vignes
1f9d0b5810 [apps/code] Reorder rows due to color name change
Change-Id: I1c8f3e9d015cf55ec8fc38082f60e957b19b196d
2020-11-04 15:07:20 +01:00
Hugo Saint-Vignes
641186d89c [python] Accept "grey" color
Change-Id: Ia9b70eb3b4205ae9571eb4269410c30cfbdd1214
2020-11-04 15:07:20 +01:00
Hugo Saint-Vignes
e27c668c40 [apps,escher,kandinsky,poincare,python] Replace every "grey" with "gray"
Change-Id: I60a232849dce90f70e6977b6024d6e9b1ce1b731
2020-11-04 15:07:20 +01:00
Hugo Saint-Vignes
4331686818 [apps/toolbox] Update toolbox and additional result text for matrices
Change-Id: I59e1561dcb97c75e57f0c24cfe1953ff594daf92
2020-11-04 15:07:20 +01:00
Hugo Saint-Vignes
c4018d0648 [poincare] Update rowCanonize pivot selection for more consistent ref results
Change-Id: Id7e856f57ccd3d990077b0f6753089bc6edcc03b
2020-11-04 15:07:20 +01:00
Hugo Saint-Vignes
3bfc0c83d8 [poincare] Factorize Echelon Form classes
Change-Id: I7ec7290a4d94b9bd1224ad4c53be8b4662bd32d5
2020-11-04 15:07:20 +01:00
Hugo Saint-Vignes
f00c135b69 [apps/calculation] Add additional outputs for matrix
Change-Id: Ia4b285eb0f28eaed838d32a1fdfb785d13664f65
2020-11-04 15:07:20 +01:00
Hugo Saint-Vignes
007c38652f [poincare] Add ref and rref matrix functions
Change-Id: Id0e57a4f85d551ca5320c4b6e3c0baadae70946d
2020-11-04 15:07:20 +01:00
Arthur Camouseigt
997c103fba [Toolbox] Changed the required parameters for normal_distributions
Changed the parameter σ2 to σ. This is now consistant with the
probability app

Change-Id: I96101ba158cebef972e536cfa5cc1b2da71b543d
2020-11-04 15:07:19 +01:00
Arthur Camouseigt
6072ffd848 [poincare/normal_distribution.cpp] Fixed approximation error
Removed limitation in calculation of normal_distribution. It was used to
speed-up computation but yielded 0 for small values.
Previously P(X<5) with X->N(7,0.3162) gave 0 as a result
now it gives 1.26e-10

Change-Id: I3f1c997dfe2ba6424b372a0a82af6d9871443657
2020-11-04 15:07:19 +01:00
Gabriel Ozouf
de681705e6 [escher/expression_field] Renamed dumpLayout
Changed dumpLayout's name to moveCursorAndDumpContent, as the name
suggested the method was only usable on layouts (while it also works on
text). The method is also no longer marked const, and the previous name
could imply that it had no side effects.
Likewise, renamed restoreLayout to restoreContent.

Change-Id: I46b320e74c07b48e256dc2146f9ecc15af38a8e6
2020-11-04 15:07:19 +01:00
Gabriel Ozouf
67af3a5b4e [apps/calculation] Fixed grey and yellow squares
When closing and reopening Calculation, if the cursor was on an
EmptyLayout, this layout would be invisible, instead of being denoted by
its usual yellow square.
This also fixes a bug that would leave the grey squares in matrices when
leaving and reopening the app, causing a failed assertion on the simulator.

Change-Id: Ib723797c079f1441f5cde174aa5c492ad4226335
2020-11-04 15:07:19 +01:00
Gabriel Ozouf
e49dc08759 [escher/expression_field] Fixed dumpLayout
Closing the Calculation app because of a full pool would crash the
device, by attempting to dump a layout with no node.

Change-Id: Ic926da61ae93f47eb576848788e1de5e3f94f5bb
2020-11-04 15:07:19 +01:00
Hugo Saint-Vignes
433639c471 [ion] Implement dynamic scroll speed profile
Change-Id: Ib3ec2ef63d19bfb88b627f06bcc185fa1b232223
2020-11-04 15:07:19 +01:00
Gabriel Ozouf
2bfdc482a6 [apps/continuous_function] Cut clearCache method
Inlined call to ContinuousFunction::clearCache and removed the method,
as its name was confusing.

Change-Id: I54454fb0b06167e01249afaa5b23932451125f2e
2020-11-04 15:07:19 +01:00
Gabriel Ozouf
1de6ac702d [apps/continuous_function_cache] abs -> fabs
Replaced abs calls on float with fabs.

Change-Id: I26eda164416ca8b2d601431a59171fd7b00ed33f
2020-11-04 15:07:19 +01:00
Gabriel Ozouf
15988f0fae [liba/float] Redefined FLT_EPSILON
FLT_EPSILON is now compliant with the definition : the difference
between 1 and the next representable float.

Change-Id: I4f79c3eee93447e76893d850bd84265c9d45aca5
2020-11-04 15:07:19 +01:00
Gabriel Ozouf
aea9176f86 [apps/graph] Added tests for graph caching
Wrote some tests to check that the caching process does not lead to
aberrant values.

Change-Id: I28137e66f430dbcf4417733d1274319dbadfc9af
2020-11-04 15:07:19 +01:00
Gabriel Ozouf
b0533e6836 [apps/graph] Changed cache tolerance
This fixes a bug where, when drawing 1/x, a vertical bar would appear on
0, because of false positive cache hits.

Change-Id: I2eafeac5e254c8a556769a41c8edc532db44383a
2020-11-04 15:07:19 +01:00
Gabriel Ozouf
beb228fa78 [apps/graph] Fixed cache step quirks
Change-Id: I5b630301ab2a4b17a5a4d77c7d9a05120449e55e
2020-11-04 15:07:19 +01:00
Gabriel Ozouf
1bee23cf4f [apps/graph] Reworked function caching
Instead of being memoized all at once before display, functions values
are now stored at evaluation time. Fixed some quirks with caching
preparation.

Change-Id: I5d212c271c8c41a6dc9074a15c720f0bccf8ac40
2020-11-04 15:07:19 +01:00
Gabriel Ozouf
42fcf557b8 [apps/graph] Limited number of cached functions
The caches used for function values memoization are now stored in
ContinuousFunctionStore : there are now only a fixed number, instead of
one per function. This effectively enables caching only for the first
few functions on screen, while reducing the memory usage.

Change-Id: I2ade091717f73a14a756fe527c773db8e8627be7
2020-11-04 15:04:24 +01:00
Gabriel Ozouf
95fef86ec0 [apps/graph] Activated caching for graph drawing
Added a default argument to CurveView::drawCurve : a function to initiate the
memoization of continuous functions. The function is implemented in
ContinuousFunctionCache and provided by GraphView. This should be invisible
to other types of curves that rely on CurveView::drawCurve.

Change-Id: I59aa55d67154b6d4bf9614b7ed87c48408773d86
2020-11-04 15:00:43 +01:00
Gabriel Ozouf
c70b545ba1 [apps/shared] Cache lookup on function evaluation
When evaluating a ContinuousFunction for a float value, the function
will first try to ask its cache (if it has been filled beforehand).

Change-Id: I519d2d3dcf344ba63e30a0f011db2306c7141315
2020-11-04 14:45:35 +01:00
Gabriel Ozouf
a9c633a540 [apps/shared] Functions cache clears on change
Added several triggers to clear the cache when the function's type,
range or content is changed.

Change-Id: I4f49a90bb6571e335a4a601723d7715b8de1e25e
2020-11-04 14:45:35 +01:00
Gabriel Ozouf
552dca9494 [apps/shared] Implemented function memoization
ContinuousFunction now has an attribute of type ContinuousFunctionCache,
implementing methods to store and retrieve 320 float values, in order to
speed up function display in Graph.

Change-Id: I6f7ccdf3ae3c6dd8b08b93d786c8d0be7aa4dee8
2020-11-04 14:45:35 +01:00
Gabriel Ozouf
0308b18400 [liba/float.h] Comment on FLT_EPSILON's definition
Change-Id: Iac2da58d9a2f8e4b1bb131255341696db99df188
2020-11-04 14:45:35 +01:00
Gabriel Ozouf
4007f4d452 [apps] Tweaked panning for better cache alignement
Method InteractiveCurveViewRange::panToMakePointVisible now moves the
range of a whole number of pixels when panning horizontally. This allows
the cache of cartesian functions not to be invalidated.

Change-Id: Idb9904fef134dd13458e1f2287b0fe5145e8aec7
2020-11-04 14:45:35 +01:00
Hugo Saint-Vignes
5bc19af196 [apps/shared] Revert to pack record
It appeared that without the packed keyword, the compiler did not handle
access to unaligned record data members, which leads to crashes on the
device.

Change-Id: I401f075e7f62458a4733baa8d81983d4be34b730
2020-11-04 14:45:35 +01:00
Hugo Saint-Vignes
969fea7494 [poincare] Improve float variables usage
Change-Id: I965c425cbe70c0a201c504565d5d0991618ce0b9
2020-11-04 14:45:35 +01:00
Hugo Saint-Vignes
10de970814 [poincare] Remove unnecessary unit norm code
Change-Id: I7d7abf88d1dcc10fb4ae0f6b3570ebfe4b4af311
2020-11-04 14:45:35 +01:00
Hugo Saint-Vignes
9f2c4bccdf [apps/math_toolbox] Reorder toolbox units
Change-Id: I2a599c90ce221c173bd05bfa2d31e908c6bdbbdf
2020-11-04 14:45:35 +01:00
Hugo Saint-Vignes
a5a57c4076 [poincare] Improve prefixes for mass and inductance unities
Change-Id: Ic9eb7b5adff7b172452b4c73bd7ddc5c59761219
2020-11-04 14:45:35 +01:00
Hugo Saint-Vignes
11e41bb4dc [poincare] Add comments and alternative algorithm to beautify units
Change-Id: I4b1ce9528d9d6796fe08f8566ee5d1efafa1d87d
2020-11-04 14:45:35 +01:00
Hugo Saint-Vignes
51f1cdb076 [poincare] Handle rational unit exponents
Change-Id: Id710702dbed19d34992da90978d5823d68abb80a
2020-11-04 14:45:35 +01:00
Arthur Camouseigt
09e39ad890 [Stat+Reg] Allowing lists of values to be sorted
Change-Id: I181bb55443bf87356d127eb6c56ff6140806fdea
2020-11-04 14:45:35 +01:00
Arthur Camouseigt
018dd91ca1 [Probability] Changed distribution parameter's type to double
Plots are still rendered in float but computations are now in double

Change-Id: I7e0a38effb780861b1443ee92a097cd319de3bc8
2020-11-04 14:45:35 +01:00
Arthur Camouseigt
082f9819e9 [Poincare] Changed ConvertFloatToText to prevent conversion error
We now compute the value of the mantissa in double (instead of float)
to limit conversion error occuring for big numbers.

Change-Id: Ia61c052f0bc4a9196c53e2c7900eb48e3343d39c
2020-11-04 14:45:35 +01:00
Hugo Saint-Vignes
776edd4dd8 [apps/shared] Extend function table view to 101 cells
Increasing the lenght of graph table view to give users more
possibilities

Change-Id: I4023a5f81974b8302bf81b56d2610908e207241f
2020-11-04 14:45:35 +01:00
Arthur
6380bf7885 [poincare/integral_layout] Changing the integral layout and behavior
Should there be multiple integrals in a row,
they now all have the same height.

Change-Id: I106c4e2cb2671f6518f1d916f414f6e9349f83dc
2020-11-04 14:45:35 +01:00
Arthur
02af868274 [poincare/sum_layout.cpp] Modified the look of the sigma symbol
Change-Id: Ib79414eed96aedacc51b89dce22a14a4e7891cdf
2020-11-04 14:45:35 +01:00
Arthur
bd74ab9718 [poincare/sequence_layout] Modified the height of sigma and product signs
Because of their previous even height, those symbols were not aligned with fractions. Now that they have an uneven size, they line up correctly.
2020-11-04 14:45:35 +01:00
Arthur
45db7f1d48 [poincare/integral_layout.cpp] Reduced the gap between integral sign and integrand
The gap between the integral sign and the integrand has been reduced. It looks more natural this way.
2020-11-04 14:45:35 +01:00
Arthur Camouseigt
9998f9b578 [apps/shared/ok_view.cpp] Changed the look of the OK symbol
New look for the ok symbol. The updated version is antialiazed.

Change-Id: I1ee0e4b6680a7582f6216854a5e5cfe308801669
2020-11-04 14:45:35 +01:00
Arthur Camouseigt
92f56445fe [poincare/sum_layout] Modified the way to draw sigma
New way of drawing sigma sign. Only a single branch is stored. The full
symbol is created by mirroring half a symbol.

Change-Id: I0fc32393203e51578c88b01125a907d402291534
2020-11-04 14:45:35 +01:00
Arthur Camouseigt
1e0449791d [poincare/integral_layout] Changing the integral symbol
Changed the look of the integral symbol and the positions of the upper
and lower bounds. Added a drawing of the window to explain the meaning
of various margins.

Change-Id: I3ffc07848dc9ad68dce3c0e01853d548e31dd152
2020-11-04 14:45:35 +01:00
Arthur Camouseigt
653b7d0ac4 [poincare] Bigger product and sum signs
Replacing the product and sum signs with bigger and antialiased ones.
2020-11-04 14:45:35 +01:00
Gabriel Ozouf
abb662b606 [poincare/test] Added tests on fraction layouts
Change-Id: I351d707c03b96c93e090e2e74c1841ebe9d7a691
2020-11-04 14:45:35 +01:00
Gabriel Ozouf
4ca4d4f45e [poincare/layout] Factored Parenthesis collapsing
Parenthesis collapsing is no longer handled by LeftParenthesisLayout and
RightParenthesisLayout, but by ParenthesisLayout itself.

Change-Id: I6797cd40ee02881544e01e9b88f31a597c51d179
2020-11-04 14:45:35 +01:00
Gabriel Ozouf
e2e062e128 [poincare/layout] Changed Fraction collapsing
Fraction are now only collapsed if they are the first thing to be
collapsed or if a parenthesis is open.

Change-Id: Ie7f3a99498b9981dff70221efd7de6bee6d0c379
2020-11-04 14:45:35 +01:00
Gabriel Ozouf
e295516928 [apps/calculation] Remember input layout
When leaving the Calculation app, the layout currently being edited is
now stored in a buffer, to be restored when the app resumes.

Change-Id: I59c16e18f7193bdcbb36888b54cb2722897f85f5
2020-11-04 14:45:35 +01:00
Gabriel Ozouf
8ab23f66b5 [escher/expression_field] Methods on layout
Added some methods to manipulate the layout of a LayoutField from an
ExpressionField, like storing into and restoring from a buffer.

Change-Id: I7b7b5b53626f19237a5215bd196e897a518e9577
2020-11-04 14:45:35 +01:00
Gabriel Ozouf
9527894b25 [poincare] Function LayoutFromAddress
Created function Layout::LayoutFromAddress, which creates in the pool a layout
that has been stored in a buffer. Functionally identical to
Expression::ExpressionFromAddress.

Change-Id: I204e6b7d42f259ef2732563aa2a168a644060867
2020-11-04 14:45:35 +01:00
Gabriel Ozouf
0927ffca29 [apps/calculation] Moved input buffer to snapshot
The cacheBuffer from EditExpressionController has been moved in the
snapshot, to act as a zone where layout information can be kept while
the app is inactive.

Change-Id: If9206abf77f37d6b984826e5f09658848381a75f
2020-11-04 14:45:35 +01:00
Hugo Saint-Vignes
3db1cad18b [poincare] Move IsApproximatelyEqual to a better helper
Change-Id: I056a96b3721005e01c6ef3f166a80a08195ff338
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
9f4aafd6b6 [apps/graph] FunctionTitleCell reload
Changed TextFieldFunctionTitleCell::reloadCell to solve an issue with
the alignment of a function's name and definition when changing the
expression :
  - typing u_n = (1/3)/2 then changing to u_n = 1/(2/3) without erasing
    the formula first. u_n would no longer be aligned with the = sign.

Change-Id: Ib58e4220dc67c77639272c7ea784418bddffb432
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
43fc937469 [apps/sequence] SequenceTitleCell reload
SequenceTitleCell::reloadCell now triggers a layoutSubviews, causing the
vertical alignment to be recomputed. This solves issues regarding the
alignment of a sequence's name and definition, such as :
  - typing u_n = v_n ; v_n would be displayed above u_n
  - typing u_n = (1/3)/2 then changing to u_n = 1/(2/3) without erasing
    the formula first. u_n would no longer be aligned with the = sign.

Change-Id: I4a771d96ea79e42e2f4822e93f9f1cbbcf867610
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
e03bb7432e [escher] Tweaked LayoutField event handling
LayoutField does no redraw its content on every occasion anymore. This
allows the input window in Calculation to not scroll to the beginning
when writing an overly long formula.

Change-Id: I14276828884035463b0a6438bfca4dd76c7f5057
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
41cf0aaac6 [apps] Stopped battery warning when plugged
Change-Id: Id4f0d5d730c6045bf69cfadd724dc8ad819494d5
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
735fc6e1bb [poincare] Generalize Binomial Coefficient n to any real
Change-Id: I3cda882e67db4becfe232c6428e14905e922662b
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
ada369bf08 [apps/shared] Add comment for selectNonHiddenCellAtClippedLocation
Change-Id: I0e0f7963274688facb467caa934f410e66c9f859
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
af32f33141 [ion] Remove unused function and rename longRepetitionScrollSpeed
Change-Id: I11268eb34060c74eb8770ba0eb999f84737c76d8
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
70cd166da5 [escher] Scroll speed increase for long repetition in layout fields
Change-Id: I9460cb44631f0b225598804334da5a0e74029915
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
70830e0b74 [escher] Scroll speed increase for long repetition in selectable table
Change-Id: Idfc3edcedff5a933b6f2168b475e22ea56ea0ab0
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
e35f2cc938 [escher] Scroll speed increase for long repetition in text area
Change-Id: Ia468bd3ae3f247937127228a11e3d51653dd2ae2
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
c9964e69c2 [escher] Scroll speed increase for long repetition in scrollable views.
Change-Id: Ie7671ced53da1a144068756f6b584dbb287f9e0e
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
b60c67ff88 [apps] Factorize scrolling speed for long repetition
Change-Id: I5fcfaf04e418942664641c4b1cd044cda7f5aebb
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
241a217f58 [apps/graph] Add fast scroll for regression and sequence graph views
Change-Id: I6b36e929234ec5dc161b0eefb20eb84aa360fe3b
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
1879eb36d8 [ion/test] Typo Fix
Change-Id: I49d041dea6333a7f7f1a179e2ffcff2391dbaa28
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
0a2ededfcf [apps/shared] Remove packed data members for RecordDataBuffer
Change-Id: I04ea5ccb4c15bda975bf5af178f07092c0387312
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
78a1350f15 [poincare/test/derivative.cpp] Added context-aware tests.
New tests compute derivatives while replacing symbols with their definitions or undefined, as the device does.

Change-Id: I99179bf6540182ff929938fb96a00a1ed2fbcf49
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
a9c94236c2 [poincare] Implemented further derivation methods and updated tests.
Derivation now works on tangents and the three hyperbolic functions.

Change-Id: I62049e79c661c3c4a031be0a93c403fb936d611b
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
eab8167a56 [poicare/logarithm] Implemented didDerivate and unaryFunctionDifferential for Logarithm
Derivation now computes as expected on logarithms, as long as their base is not a function of the derivation variable.

Change-Id: Ia56da1c1151c0ddf3887be84ddb4bd02664c5188
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
407d4bce6e [poincare/cosine] Implemented didDerivate and unaryFunctionDifferential for Cosine
Derivation now propagates as expected on cosines.

Change-Id: I6f5af48ac7462c5b8e77ff1a6428a65bf6c0c7de
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
5cf85368ea [poincare] Added framework to derivate unary functions, and implemented it for Sine
Added a method unaryFunctionDifferential to ExpressionNode and Expression, to be implemented by subclasses representing unary functions.
Added a function derivateUnaryFunction to Derivative, to factor (f°g)' -> g' * f'°g.

Change-Id: Id1780f1082ccd001f1282fe4ddfff2b7055d3a27
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
648cdbaa29 [poincare] Implemented didDerivate method for Power
Derivation now propagates to powers as expected, whether the base, the exponent, or both are functions of the variable. This also makes division derive as intended.

Change-Id: I51cbd5f7ec9f6aaa1df068625bbda1437941fa08
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
6f378ef3ef [poincare] Implemented didDerivate for Multiplication
Derivation propagates as expected on multiplications (but not power). Some tests involving diff had to be updated to reflect that behaviour.

Change-Id: Ifa32031bc37a156c18d296757bcdd6ccdb0ea43e
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
c65687e9f6 [poincare] Implemented didDerivate methods for Number, Symbol and Addition
Number's subclasses, with the exception of Undefined and Unreal, derive as zero. Symbols derive as expected. Derivation propagates as expected on additions.

Change-Id: Icedbb1dfac8099347a19c14bf2537011b2e8b199
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
051e608835 [poincare] Added method didDerivate to Expression and ExpressionNode
This method is to be implemented by derivable expression subclasses, for use in Derivative::shallowReduce. It performs the calculation for the derivative, and returns whether calculations happened.

Change-Id: I13cdb131e2044578392f5178a9f389314c1c4c8a
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
eed1648363 [apps/statistics] Improve variance accuracy for statistics
Change-Id: Ie8f6f93c8e95940662e72a23619b53ac4ab0d6b6
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
29b0e86225 [quiz] Improve test possibilities for regression and statistics
Change-Id: I4414fad24e10dcbd56cd9aff1e35e00ba66dda2c
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
d16e49fc5f [apps/regression] Improve Variance precision
Change-Id: Ia9e406b14c0baec76835e226a7801ba73ff9174e
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
db69f6a6f5 [regression] Implement R2 computation using evaluated values
Change-Id: Iecf8cb84f092c2ec8a9bc17bc0265d7dddaac36c
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
5c95cbd1d3 [regression] Add r2 to any regression stats
Change-Id: I3088dd66b1c3f48973b8a9277de687bdd24e094b
2020-11-04 14:45:34 +01:00
Hugo Saint-Vignes
d3727dde97 [regression] Add unit tests for regression metrics
Change-Id: I25d7fd89053a1bd5fb369c8c145dba92d188f550
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
e8505d79e7 [ion/device/exam_mode] Fixed missing parentheses in assertion
Change-Id: If10b6ea98ed224d79cfa50f38f9e229331d0f9f9
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
0454b65a94 [ion/device/usb] Fixed missing static member definitions
Change-Id: Iedf6ce51d3213f9265fec247c7bdfda4e3304d3a
2020-11-04 14:45:34 +01:00
Gabriel Ozouf
1d74a8f757 [poincare/power] Fixed missing template definitions
Change-Id: I9e7db458c97cc1fba29689690b67c3c678976405
2020-11-04 14:45:34 +01:00
Arthur
d77e924014 [Apps/Calculation] Modified the calculationStore of additional results
-Additional results are now stored in smaller calculationStores

Change-Id: I7d09bfb09e57cbb80e9385668adeb29a31398bc0
2020-11-04 14:45:34 +01:00
Arthur
d7a0914d13 [Apps/CalculationStore] Changed the way to store calculations
-No more limit to the number of calculations
-All calculations are memoized
-Added tests to test/calculation_store.cpp

Change-Id: Ia10e2b009576eaf4496ba44a0c88f6e7e76f6cef
2020-11-04 14:45:34 +01:00
Quentin Guidée
715ff95cf1 [epsilon] Fix upstream merge 2020-11-03 19:49:43 +01:00
Quentin Guidée
5d50c80604 Merge remote-tracking branch 'upstream/master' into omega-dev 2020-11-03 19:35:37 +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
Émilie Feral
e0dcdcea28 [build] Add a target flasher.verbose.flash 2020-10-27 08:50:05 +01:00
Émilie Feral
1f81c97371 [ion] USB::DFU takes an argument specifying if the DFU mode should be
leavable from keyboard
2020-10-27 08:50:05 +01:00
Émilie Feral
2d71e98b52 [ion] n0100 Console: fix pin alternate function 2020-10-27 08:45:41 +01:00
Gabriel Ozouf
c71b2dee99 [curve_view] Factor bounding box code for joinDots
Change-Id: Iae974aa2bee12e6c56bad84fd3b45093fb2a856f
2020-10-23 08:56:56 +02:00
Gabriel Ozouf
26fdfcd25c [curve_view] Fixed variable names
Change-Id: I8aad13c6bce719ba8f3a30cd86f06f7c89ec041e
2020-10-23 08:56:56 +02:00
Gabriel Ozouf
fe8e490ac0 [curve_view] Filter unwanted vertical asymptotes
Change-Id: Ia603a2fb1553b6dfc038d2a28472ce48e41936db
2020-10-23 08:56:56 +02:00
Gabriel Ozouf
106916e7bf [curve_view] Add double evaluation
Add the possibility to use a double-typed evaluator when tracing a
curve, useful when errors caused by float approximation mess with the
drawing.

Change-Id: I3ab410deec4823149239b0a26b1885fd2a493226
2020-10-23 08:56:56 +02:00
Quentin Guidée
3c9bf7456e Merge branch 'omega-hotfix' into omega-dev 2020-10-18 09:59:17 +02:00
Quentin
a812b52fee Merge pull request #416 from RedGl0w/SDLHotfix
[Ion/SDL] Fix conflicts with master
2020-10-18 09:56:30 +02:00
Émilie Feral
c91c2a6e3f [app/shared] CurveView: Avoid dashSize overflow in
drawHorizontalOrVerticalSegment
2020-10-12 09:48:55 +02:00
Émilie Feral
8e025b0823 [apps/shared] CurveView: avoid overflowing KDCoordinate
This fixes the following bug: add the sequence, u(n)=2^n. On the graph,
go to "sum of terms" and try to sum terms from 0 to 18 by moving the
cursor. It hangs.
2020-10-12 09:48:55 +02:00
Joachim LF
ab906da53d [Ion/SDL] Fix conflicts with master 2020-10-11 12:37:44 +02:00
Joachim Le Fournis
f2edb0a033 [Ion/usb] Changed URL in order to have easier update 2020-10-11 09:08:48 +02:00
Quentin Guidée
e8b86ca6a1 [upstream] Update 2020-10-10 02:28:33 +02:00
Émilie Feral
17fd1aea29 [ion] Haptics implementation are on all simulators but
Ion::Haptics::isEnabled is per platform.
2020-09-30 17:30:34 +02:00
Émilie Feral
0c0510599d [ion] Simulator: haptics feedback are only implemented on Android and
depends on the System settings
2020-09-30 17:30:34 +02:00
Émilie Feral
9786db308a [ion] Haptics events don't depend on SCREEN_ONLY 2020-09-30 17:30:34 +02:00
Émilie Feral
979c227d54 [ion] web: improve key highlight positions 2020-09-30 17:30:34 +02:00
Émilie Feral
595532e0a5 [ion] Remove useless variables 2020-09-30 17:30:34 +02:00
Émilie Feral
42cedf5b10 [ion] Windows: improve resgen.py script 2020-09-30 17:30:34 +02:00
Émilie Feral
f4b9635fee [ion] Change variable name 2020-09-30 17:30:34 +02:00
Émilie Feral
560c4b3821 [ion] Linux: improve incbin.py script 2020-09-30 17:30:34 +02:00
Émilie Feral
5da82d8423 [ion] Add comment 2020-09-30 17:30:34 +02:00
Émilie Feral
33425e04c0 [ion] Coding style 2020-09-30 17:30:34 +02:00
Émilie Feral
7535abc298 [ion] Change name of variable in Makefile 2020-09-30 17:30:34 +02:00
Émilie Feral
308b321ead [ion] Clean windows flag 2020-09-30 17:30:34 +02:00
Émilie Feral
8976ebfc41 [ion] Makefile linux: simplify build system by generating a header 2020-09-30 17:30:34 +02:00
Émilie Feral
4620aa8aa8 [ion] Remove useless comment 2020-09-30 17:30:34 +02:00
Émilie Feral
c96efa76b9 [ion] Windows Makefile: build .rc from the list of assets 2020-09-30 17:30:34 +02:00
Émilie Feral
40392fff9c [ion] Simulator: assets declaration is common to all targets 2020-09-30 17:30:34 +02:00
Émilie Feral
815a06adad [ion] Avoid unhighlighting key when the mouse is still on it.
Distinguish with smartphones behaviour.
2020-09-30 17:30:34 +02:00
Émilie Feral
22b585057d [ion] Simulator: key layouts assets are PNG instead of JPG V (fix windows) 2020-09-30 17:30:34 +02:00
Émilie Feral
165b129385 [ion] Simulator: key layouts assets are PNG instead of JPG IV (fix linux) 2020-09-30 17:30:34 +02:00
Émilie Feral
1946c68ef8 [ion] Simulator: key layouts assets are PNG instead of JPG III (fix ios) 2020-09-30 17:30:34 +02:00
Émilie Feral
d2632bff4f [ion] Simulator: key layouts assets are PNG instead of JPG II (fix
android)
2020-09-30 17:30:34 +02:00
Émilie Feral
d4b7b6baf0 [ion] Simulator: key layouts assets are PNG instead of JPG I (fix macos) 2020-09-30 17:30:34 +02:00
Émilie Feral
11236c67cb [ion] Improve key positions 2020-09-30 17:30:34 +02:00
Émilie Feral
0b114abb95 [ion] Simulator windows: fix pixel format typo 2020-09-30 17:30:34 +02:00
Émilie Feral
8000ff733e [ion] Simulator: improve key center positions 2020-09-30 17:30:34 +02:00
Émilie Feral
8b5caeb394 [ion] IonSimulatorLoadImage returns a Texture (otherwise the pixels data
which needs to be deleted when freeing the surface is hard to retrieve)
2020-09-30 17:30:34 +02:00
Émilie Feral
02b648e36d [ion] IonSimulatorLoadImage returns a surface instead of a texture: this
way we can set a transparent color key before turning it into a texture.
2020-09-30 17:30:34 +02:00
Émilie Feral
674703f4dc [ion] Missing include 2020-09-30 17:30:34 +02:00
Émilie Feral
64bcbd708a [ion] Linux: fix images: get the asset addresses instead of consecutive
table addresses
2020-09-30 17:30:34 +02:00
Émilie Feral
2236dcdbed [ion] Fix: unhighlight the key on mouse up event (when you clicked on the key
on a smartphone, you want the key to be deselected)
2020-09-30 17:30:34 +02:00
Émilie Feral
af544a95d1 [ion] Windows: IonSimulatorLoadImage can now load any resource. Enable
to use key layouts jpg files in C/C++ code.
2020-09-30 17:30:34 +02:00
Émilie Feral
22250b4234 [ion] linux: enable to use key layouts jpg files in C/C++ code 2020-09-30 17:30:34 +02:00
Émilie Feral
a27122802d [ion] Macos Makefile: add depencies on keys layouts jpg images 2020-09-30 17:30:34 +02:00
Émilie Feral
ad1ef783ce [ion][escher] Revert previous commit: move inliner back to escher 2020-09-30 17:30:34 +02:00
Émilie Feral
4ae39f56fd [ion] Simulator: Layout uses jpg images instead of image built by the
inliner
2020-09-30 17:30:34 +02:00
Émilie Feral
652d2e6bac TODOs 2020-09-30 17:30:34 +02:00
Émilie Feral
50031c4836 [ion] Unhighlight the key on mouse up event (when you clicked on the key
on a smartphone, you want the key to be deselected)
2020-09-30 17:30:34 +02:00
Émilie Feral
ef363c57ac [ion] Reset the highlighted key once it has been drawn 2020-09-30 17:30:34 +02:00
Émilie Feral
ded2174578 [ion] simulator/shared: fix macro EPSILON_SDL_SCREEN_ONLY 2020-09-30 17:30:34 +02:00
Émilie Feral
c5add52e61 [ion] simulator: move key_layouts to ion/src/simulator/assets 2020-09-30 17:30:34 +02:00
Émilie Feral
1ad55139b4 [ion] simulator/shared/key_layouts: udpate png files 2020-09-30 17:30:34 +02:00
Émilie Feral
db1874fdac [ion] simulator/shared/layout: update the center of keys to centered the
highlight keys
2020-09-30 17:30:34 +02:00
Émilie Feral
23a542e639 [ion/simulator/shared/layout] Round instead of truncate when converting
relative to absolute coordinates
2020-09-30 17:30:34 +02:00
Émilie Feral
a8c318f90f [ion] simulator: move background render methods to layout 2020-09-30 17:30:34 +02:00
Émilie Feral
a3ef7c9234 [ion] simulator: fix magic number in display 2020-09-30 17:30:34 +02:00
Émilie Feral
649fb0bebe [ion] Simulator: highlight keys when the mouse is over 2020-09-30 17:30:34 +02:00
Émilie Feral
94851da7f9 [ion] Add drafts of images reprensenting key shapes 2020-09-30 17:30:34 +02:00
Émilie Feral
fcf4c011cb [ion] simulator/layout: change signature of makeAbsolute 2020-09-30 17:30:34 +02:00
Émilie Feral
8f8f42edd5 [ion] simulator: add forgotten Display::quit 2020-09-30 17:30:34 +02:00
Émilie Feral
f7479e0cf5 [ion][escher] Move image inliner to ion 2020-09-30 17:30:34 +02:00
Émilie Feral
ca56ba6327 [ion] Fix include 2020-09-30 17:30:34 +02:00
Émilie Feral
158afa7a27 [ion] simulator: the key detection distance threshold is responsive to
the frame dimension
2020-09-30 17:30:34 +02:00
Léa Saviot
b020cb2f98 [ion/simulator] Add haptic feedback 2020-09-30 17:30:34 +02:00
Émilie Feral
1c0f6a7913 [ion] Keyboard: don't detect a key down when the mouse is too far away
from a key
2020-09-30 17:30:34 +02:00
Joachim Le Fournis
aeb22bf35d [external] change heapSize 2020-09-05 11:20:15 +02:00
Joachim Le Fournis
befcfd10b7 [Python] Change heap 2020-09-05 11:16:25 +02:00
Quentin
ae41a19fb2 Merge pull request #401 from quentinguidee/merge-omega-themes-submodule
Merge omega-themes submodule in the main repository
2020-09-04 14:43:31 +02:00
Émilie Feral
4c41b1699d [docs] Add/remove dependencies in windows SDK 2020-09-03 15:36:21 +02:00
Quentin Guidée
ff7a72eca8 [themes] Remove submodule dependency 2020-09-03 14:59:55 +02:00
Quentin Guidée
28fe0e31b1 [github] Update README.md 2020-09-02 16:14:13 +02:00
Quentin Guidée
be931445ac [themes] Update submodule 2020-09-02 15:35:54 +02:00
Quentin
4c10ad471b Merge pull request #396 from quentinguidee/omega-dev-doc-design
[build/doc] Better Doxygen design
2020-09-02 11:57:15 +02:00
Quentin Guidée
9233422b1a [build/doc] Some design improvements 2020-09-02 11:41:53 +02:00
Gabriel Ozouf
b7c7695707 [apps/code] Remove interruption check
A check for interruption in ConsoleController::printText caused script
to immediately stop when launched after an interrupted script.
This check was used to break out of infinite print loop, but now
becomes redundant with how micropython_port_vm_hook_loop was changed.

Change-Id: Ifa8d415e1b2c2406ad67300eb14ce46889af296f
2020-08-31 15:32:02 +02:00
Gabriel Ozouf
7dcf1662b0 [python/helpers] Change interrupt check delay
Keyboard interruption used to be checked once every 20000 calls to
micropython_port_vm_hook_loop. However, if costly functions were
executed in between calls to this method, the delay for activating
interruptions would increase.
Now, keyboard interruption is checked after a fixed amount of time has
passed. This way, if the process waits a long time between two calls
to micropython_port_vm_hook_loop, it is still interrupted in a timely
manner.

Change-Id: I37ca3bd4a996fa086078f504340dd857526e356a
2020-08-31 15:32:02 +02:00
Gabriel Ozouf
34ebf1e6e0 [python/kandinsky] Remove additional interrupt
Additional checks for interruptions were making the kandinsky module
slower.
/!\ Some scripts are now very difficult to interrupt

Change-Id: I4c18273d8895deaac68084411a52556c8459d52b
2020-08-31 15:32:02 +02:00
Quentin Guidée
46658f7077 [omega] 1.20.3 2020-08-26 14:17:23 +02:00
Gabriel Ozouf
0a493d1f34 [kandinsky/color] Update comment on blend method
Change-Id: I5fb68608657d2f604c8cb7c9294382ed4a8603ff
2020-08-25 15:51:58 +02:00
Gabriel Ozouf
e33543aacb [kandinsky/color] Add tests on color blending
Change-Id: If1792bd9ec44052238632d28b806f5582b190fe9
2020-08-25 15:51:58 +02:00
Gabriel Ozouf
078bba2fb9 [kandinsky/color] Fix blend method
When computing the barycenter between two colors, the some of the two
factors a and (1-a) was equal to 255/256 instead of 1.

Change-Id: Ia9a779d43470ef42d9430ad730e842da0f007140
2020-08-25 15:51:58 +02:00
Gabriel Ozouf
38e15da5d0 [kandinsky/color] Blend identical colors
KDColor::blend used to produce different colors when blending two
identical colors (ex : use draw_string in Python to print white text on
a white background).
blend now escapes early when its two color arguments are identical.

Change-Id: I01dc5a0d5e4e6a20e09fee0f346dafc313dae97b
2020-08-25 15:51:58 +02:00
Joachim Le Fournis
d154611023 [Ion] Fix broken link 2020-08-24 16:37:03 -04:00
Charlotte THOMAS
cf5cd35bc9 [Change] Constants based on the CODATA 2018 (#398) 2020-08-17 21:52:39 +02:00
Quentin
fa5bfaf15d Merge pull request #347 from boricj/feature/rtcBringup
[Feature] Real-time clock
2020-08-16 17:57:43 +02:00
Jean-Baptiste Boric
eff8f09dda [apps] Settings for date/time 2020-08-16 15:49:40 +02:00
Jean-Baptiste Boric
43376996a1 [python] Add RTC functions in time module 2020-08-16 15:49:40 +02:00
Jean-Baptiste Boric
93e6daec6b [apps] Show clock in titlebar 2020-08-16 15:49:40 +02:00
Jean-Baptiste Boric
2fd15b7d7f [ion] Add RTC subsystem 2020-08-16 15:49:40 +02:00
Hugo Saint-Vignes
7eb694822d [python] Add magenta color
Change-Id: I7a5e12f6f3d79da802149a6aeef88387941ccdd8
2020-08-11 17:08:23 +02:00
Hugo Saint-Vignes
0b683b6994 [apps/shared] Handle identical layout in MinimalSizeForOptimalDisplay
Change-Id: I99a523e9e88ea9c3064e4367d96b01edb0020df9
2020-08-11 17:06:07 +02:00
Quentin Guidée
60f871c29c [build/doc] Fix CSS indentation 2020-08-10 21:27:40 +02:00
Quentin
07da4831b1 Merge pull request #395 from M4xi1m3/omega-dev-doc
[build/doc] Custom CSS, for the pleasure of your eyes.
2020-08-10 16:02:00 +02:00
M4x1m3
dbc0e94c91 [build/doc] Custom CSS, for the pleasure of your eyes. 2020-08-10 15:57:02 +02:00
Quentin Guidée
b987d22419 Merge branch 'omega-hotfix' into omega-dev 2020-08-09 13:28:57 +02:00
Quentin Guidée
a74a5ac796 [fix] conflicts 2020-08-09 13:28:22 +02:00
Quentin Guidée
e2dfb9fc4f Merge branch 'omega-hotfix' into omega-dev 2020-08-06 15:24:58 +02:00
Quentin Guidée
4f30089d47 Revert "Merge pull request #393 from RedGl0w/MenuFix"
This reverts commit a9d75c6c7a, reversing
changes made to ebc9384131.
2020-08-06 15:23:08 +02:00
Quentin Guidée
d0de9b4af2 [omega] Set version to 1.21.0 2020-08-05 10:44:08 +02:00
Quentin Guidée
7a40497a9f Merge branch 'omega-hotfix' into omega-dev 2020-08-04 10:36:11 +02:00
Léa Saviot
edafa0e155 [poincare/multiplication] Assert no child is undef in removeUnit 2020-07-29 10:13:19 +02:00
Léa Saviot
b885098963 [apps/calculation] Fix additionalInformationType
If an expression hasUnits and is then reduced, it might not have units
anymore for instance if it was replaced with undefined).
Scenario: Enter "[5000000000000000]^20 _s" in the calculation app
2020-07-29 10:13:19 +02:00
Léa Saviot
f3628f368f [poincare/expression] Return undef if simplification interrupted
Without this change, we would get weird "reduced" expression, such as
multiplication(undef, _s), but we do not always check
sSimplificationHasBeenInterrupted afterwards.
2020-07-29 10:13:19 +02:00
Hugo Saint-Vignes
5c75cc55d3 [apps/shared] Apply changes on confirm with GoTo functions
Change-Id: I6ebec412b4b6612710476274a8665375d21f9ef8
2020-07-29 10:07:07 +02:00
Hugo Saint-Vignes
61792058d3 [apps/shared] Fix typos for Interval and curve view temporary params
Change-Id: I610726ed5966d353397be923b76dd003297940a7
2020-07-29 10:07:07 +02:00
Joachim LF
d37bf9e344 [Apps/Shared] Fixed interval and curve view exit 2020-07-29 10:07:07 +02:00
Émilie Feral
b4a3dd10e1 [apps/shared] ToolBoxHelpers: don't overflow buffer
If the commandLength is > than the buffer size, we have to escape at
some point to avoid overflowing the buffer.
2020-07-29 09:43:51 +02:00
Quentin
a9d75c6c7a Merge pull request #393 from RedGl0w/MenuFix
[Apps/home] Change menu behaviour with incomplete lines
2020-07-27 16:45:30 +02:00
Joachim LF
c57f8d257b [Apps/home] Change menu behaviour with incomplete lines 2020-07-27 16:41:01 +02:00
Quentin
ebc9384131 Merge pull request #392 from RedGl0w/KeyDown
[ion/src/simulator] Visual keyboard only change state on keydown
2020-07-27 13:25:20 +02:00
Quentin
b478c98fe0 Merge pull request #391 from quentinguidee/omega-rename-username
[username] Change USERNAME to OMEGA_USERNAME
2020-07-24 10:27:12 +02:00
Quentin Guidée
93f4281bdc [themes] Update submodule 2020-07-24 09:05:01 +02:00
Quentin Guidée
7b07a2e3ac [username] Change USERNAME to OMEGA_USERNAME 2020-07-24 08:24:12 +02:00
Quentin
d2a2925746 Merge pull request #390 from quentinguidee/omega-hotfix
[apps/settings] remove LEDS_CHOICE
2020-07-24 00:03:03 +02:00
Quentin Guidée
7fc145d455 [apps/settings] remove LEDS_CHOICE 2020-07-23 23:22:31 +02:00
Quentin Guidée
2f246ad604 [android] Change SDK version to 29 2020-07-23 20:15:24 +02:00
Quentin Guidée
d1aaa7c125 Merge branch 'omega-hotfix' into omega-dev 2020-07-23 18:24:39 +02:00
Quentin Guidée
0235de8010 [omega] 1.20.2 2020-07-23 18:23:30 +02:00
Quentin Guidée
636c5c1d24 Merge branch 'omega-hotfix' into omega-master 2020-07-23 18:23:11 +02:00
Quentin
36bcd138d8 Merge pull request #389 from M4xi1m3/omega-hotfix
Omega 1.20.2
2020-07-23 18:07:37 +02:00
Quentin Guidée
22415c1bc3 [ion/src/simulator] Update background.jpg 2020-07-23 18:06:27 +02:00
M4x1m3
12fb82b028 [apps/code] Added os in toolbox 2020-07-23 17:13:40 +02:00
M4x1m3
c5500eee06 [mpy/os] Removes useless file 2020-07-23 11:12:31 +02:00
M4x1m3
587ea39aaf [app/code] Wipe scripts when adding one with opt 2020-07-23 11:12:31 +02:00
M4x1m3
f582ce0e6d [simu] Added shadow to logo 2020-07-23 11:12:31 +02:00
M4x1m3
b11c58f11c [simu] Persistant script store (and other stuff) 2020-07-23 11:12:27 +02:00
Quentin Guidée
7bdd973ddc Merge branch 'omega-hotfix' into omega-dev 2020-07-21 22:38:03 +02:00
Quentin Guidée
32be8854c9 [omega] 1.20.1 2020-07-21 22:37:29 +02:00
Quentin Guidée
4af76cc3ae [omega] 1.20.1 2020-07-21 22:32:19 +02:00
Quentin
93c431be04 Merge pull request #387 from M4xi1m3/omega-hotfix
[mpy] Fix crash on append on new file, new os module
2020-07-21 22:30:32 +02:00
M4x1m3
63acf7b0ee [app/code] Changed color of mandelbrot script 2020-07-21 22:27:04 +02:00
M4x1m3
14a3ea51c4 [mpy/os] listdir 2020-07-21 22:27:04 +02:00
M4x1m3
18ccc0c771 [mpy/os] rename 2020-07-21 22:27:04 +02:00
M4x1m3
f65881420c [mpy/file] Fixed concurency issues 2020-07-21 22:27:04 +02:00
M4x1m3
8eeae5f161 [mpy/os] Added remove 2020-07-21 22:27:04 +02:00
M4x1m3
2dce8a1343 [mpy/os] uname 2020-07-21 22:27:00 +02:00
M4x1m3
b9a6298ffa [mpy] Added os module 2020-07-21 18:00:12 +02:00
M4x1m3
2040a2cd5b [mpy/files] Fixed crash with new files in append mode 2020-07-21 16:57:57 +02:00
Quentin Guidée
a38297f8d0 [github] Fix README.md 2020-07-21 09:41:07 +02:00
Quentin
f3067ccfee [Fix] Conflicts 2020-07-21 09:41:07 +02:00
Quentin Guidée
73037e3faf [github] Fix README.md 2020-07-21 09:32:14 +02:00
Quentin Guidée
132f899237 [omega] 1.20.0 2020-07-20 17:09:03 +02:00
Quentin Guidée
8f3415f74d [i18n] Fix it and nl homescreen translations 2020-07-20 17:02:52 +02:00
Léa Saviot
3e6e1729a2 [ion/device] Add screen id for gamma calibration 2020-07-20 10:35:59 +02:00
Quentin
635c5cbabd Merge pull request #385 from M4xi1m3/omega-dev-e14
[ion] Fixed issue with backspace
2020-07-19 16:01:08 +02:00
M4x1m3
58a33e8190 [ion] Fixed issue with backspace 2020-07-19 15:39:27 +02:00
Charlotte THOMAS
0086368b2c [i18n] Translated constants in Italian and NL (#384)
* NL: translation of the physics constant
EN: correction of "Elemental charge" into "Elementary Charge"

* Italian translation

* Fixed some italian translation ( thanks Clem' :) )

* [Fix]: NL and IT translation

Co-authored-by: Shadow15510 <antoine.royer31@orange.fr>
2020-07-18 17:19:35 +02:00
Quentin
094e2c86b4 Merge pull request #383 from M4xi1m3/omega-dev-e14
[ci] Added customs RAM and ROM sections to the metric system
2020-07-18 17:16:28 +02:00
M4x1m3
699c653882 [ci/metric] Removed space in numbers (fixed leading 0s issue) 2020-07-18 17:08:26 +02:00
M4x1m3
96d49feaf6 [ci/metric] Marked parenthesis as safe character. 2020-07-18 15:48:41 +02:00
M4x1m3
b87e9879bc [ci] Added customs RAM and ROM sections to the metric system 2020-07-18 15:40:03 +02:00
Quentin Guidée
57a37d7028 [GitHub] CI Metric 2020-07-18 12:22:30 +02:00
Quentin Guidée
26ecff543a [GitHub] CI Metric 2020-07-18 11:50:11 +02:00
Quentin Guidée
c2df1c33d1 [Fix] Examination level 2020-07-18 10:31:14 +02:00
Quentin Guidée
a826bb7cc9 [Update] Update README.md 2020-07-18 09:32:18 +02:00
Charlotte THOMAS
357aa8291d [Fix] Repaired units (#381) 2020-07-18 00:02:20 +02:00
Quentin Guidée
6f8192cce2 Merge branch 'omega-dev-e14' of github.com:Omega-Numworks/Omega into omega-dev-e14 2020-07-17 23:52:16 +02:00
Quentin Guidée
e37e59e4bc [Update] Contributors 2020-07-17 23:50:30 +02:00
Quentin
c31480c7cb Merge pull request #380 from LeGmask/patch-1
[Fix] Fixed non-erasable empty character
2020-07-17 22:54:57 +02:00
Evann DREUMONT
2d2eb8c9aa [Fix] Fixed non-erasable empty character 2020-07-17 20:36:32 +00:00
Quentin Guidée
9188f8c054 [Update] Contributors 2020-07-17 21:26:30 +02:00
Quentin Guidée
28f5e119db [GitHub] Fix link README.md 2020-07-17 21:04:40 +02:00
Quentin
88b9f6735c Merge pull request #379 from M4xi1m3/omega-dev-e14
[escher] Fixed theme engine
2020-07-17 20:46:39 +02:00
M4x1m3
52cd5318a1 [escher] Fixed theme engine 2020-07-17 19:59:06 +02:00
Quentin
b323e63f09 Merge pull request #378 from M4xi1m3/omega-dev-e14
[ion/kb] Reverted #370, found a better way to fix.
2020-07-17 16:34:24 +02:00
Quentin Guidée
2de3da8e67 [Change] Move Expression Format with others Format settings 2020-07-17 11:58:47 +02:00
M4x1m3
efd2896a34 [ion/kb] Reverted #370, found a better way to fix. 2020-07-17 10:09:07 +02:00
Émilie Feral
22549d4d50 [apps/calculation] CalculationStore: change name CalculationHeight -->
HeightComputer
2020-07-16 14:37:38 +02:00
Émilie Feral
83ecefda00 [apps/calculation] Fix tests 2020-07-16 14:37:38 +02:00
Émilie Feral
1fb8c09714 [apps/calculation] Remove old TODOs 2020-07-16 14:37:38 +02:00
Émilie Feral
df74c2c551 [apps/calculation] The heights (common and expanded) of calculation cells are
computed when the calculation is added to the store and don't change afterwards.
Otherwise, if their heights change when scrolling (due to a modification of the
display output type - ExactOnly, ApproximateOnly...), it generates crashes.
2020-07-16 14:37:38 +02:00
Émilie Feral
c2db00cc88 [apps/calculation] When leaving calculation app, do not invalid
calculation height memoization. They're computed from the layouts which
don't depend on the complex format (or any other settings parameters
which could have changed).
2020-07-16 14:37:38 +02:00
Léa Saviot
708477dece [apps/i18n] Fix missing upper case 2020-07-16 11:53:12 +02:00
Léa Saviot
b4dd4b5e7e [apps/code/i18n] Make italian wording fit 2020-07-16 11:53:12 +02:00
Léa Saviot
c20261940f [poincare] Handle removeUnit that create Undefined expressions
UnitConvert::removeUnit replaces the unit ocnvert with an undefined.
2020-07-16 11:46:23 +02:00
Léa Saviot
3a046f5bcb [poincare/multiplication] Fix Multiplication::removeUnit
Scenario:
f(x) = 0->_A
evaluate 0f(0)
2020-07-16 11:46:23 +02:00
Léa Saviot
36bc70aaee [poincare/power] Better Power::shallowReduce
Take care of an undefined index that arrived during the remove unit
2020-07-16 11:46:23 +02:00
Léa Saviot
9e94304db0 [poincre/test] Rename assert_simplify -> assert_reduce
And assert_expression_simplify -> assert_expression_reduce
2020-07-16 11:46:23 +02:00
Émilie Feral
c92b3d49e9 [apps/calculation] HistoryController: reload the subview selection when
deleting row

This fixes the following bug: input 1, OK, 1.2 OK, delete the row whose
input is '1' with the selection on the output view. The output of 1.2
does not toggle and it should.
2020-07-16 09:48:22 +02:00
Quentin Guidée
dacb7351c3 [Fix] Remove unused i18n keys 2020-07-16 00:31:11 +02:00
Quentin Guidée
96b1cd38cf Merge remote-tracking branch 'upstream/master' into omega-dev-e14 2020-07-15 13:39:24 +02:00
Léa Saviot
43744bcae9 [poincare/power] Fix shallowReduce
Scenario: f(x) = 0->0
In graph, go to x = e^(f(0))
2020-07-15 13:07:17 +02:00
Quentin Guidée
e31912054c Merge branch 'omega-dev-e14' of github.com:Omega-Numworks/Omega into omega-dev-e14 2020-07-15 12:09:28 +02:00
Quentin Guidée
b5a9323a81 [Fix] Conflicts 2020-07-15 12:09:12 +02:00
Quentin
e2611648c9 Merge pull request #376 from M4xi1m3/omega-dev-e14
[mpy] Added passing errors to JS
2020-07-15 11:41:16 +02:00
M4x1m3
231223086c [mpy] Added passing errors to JS 2020-07-15 11:38:40 +02:00
Joachim Le Fournis
46ede2eb59 Resolved the wrong gender of font in fr 2020-07-15 10:41:37 +02:00
Charlotte THOMAS
b5f9deb169 Update calculation.cpp
removed white
2020-07-15 10:28:15 +02:00
Charlotte THOMAS
7754693bdf fix: change IsIS => IsSI in test too 2020-07-15 10:28:15 +02:00
Charlotte THOMAS
f1dab081e1 Fix: CI test 2020-07-15 10:28:15 +02:00
Charlotte THOMAS
9d8b62894f Fix: Changed "IS" to "SI" because even in english the short for "International System of Units" is "SI" 2020-07-15 10:28:15 +02:00
Quentin
8ee213a443 Merge pull request #375 from M4xi1m3/omega-dev-e14
Various improvements to the 3DS simu.
2020-07-14 17:09:49 +02:00
M4x1m3
efd5be4c23 [build] Added 3ds in help, fixed the pimp 2020-07-14 17:04:30 +02:00
M4x1m3
5c23d6fb8e [ion/3ds] Changed background to new one 2020-07-14 17:03:02 +02:00
Quentin Guidée
c2390bebe3 Merge branch 'omega-dev-e14' of github.com:Omega-Numworks/Omega into omega-dev-e14 2020-07-14 15:52:50 +02:00
Quentin Guidée
6a77ec3f87 [Update] RPN 2020-07-14 15:52:37 +02:00
Quentin
443b70ec10 Merge pull request #374 from M4xi1m3/omega-dev-e14
[ci] Generate .sha256 for N0100
2020-07-14 15:32:07 +02:00
Maxime FRIESS
a7ca30b793 [ci] Generate .sha256 for N0100 2020-07-14 15:17:19 +02:00
Quentin Guidée
6553afacdd Merge branch 'omega-dev-e14' of github.com:Omega-Numworks/Omega into omega-dev-e14 2020-07-14 14:37:11 +02:00
Quentin Guidée
360bb17a4f [Fix] Conflicts 2020-07-14 14:36:39 +02:00
Quentin
7590e6ce31 Merge pull request #373 from M4xi1m3/omega-dev-e14
[ci] Added hu to N0100
2020-07-14 13:57:31 +02:00
Maxime FRIESS
0a384e7c8a [ci] Added hu to N0100 2020-07-14 13:56:26 +02:00
Quentin
cb58189fc5 Merge pull request #372 from M4xi1m3/omega-dev-e14
N0100 Generate one binary per langage
2020-07-14 13:19:54 +02:00
M4x1m3
84442fca10 [ci] Faster way 2020-07-14 12:10:41 +02:00
M4x1m3
c915894c0d [ci] N0100 generates one fw per language. 2020-07-14 12:00:43 +02:00
Quentin Guidée
ef8b74781b [Update] Atom 2020-07-14 11:50:41 +02:00
Quentin
f8fa492418 Merge pull request #371 from quentinguidee/omega-dev-e14
[Fix] Missing translations
2020-07-14 11:40:28 +02:00
Quentin Guidée
7227d0dccb [Fix] Missing translations 2020-07-14 11:28:01 +02:00
Quentin
3f11728e1a Merge pull request #370 from M4xi1m3/e14-bf2
[escher] Fixed alpha+arrow / alpha-lock + arrow
2020-07-14 11:27:38 +02:00
M4x1m3
c029474a61 [escher] Fixed alpha+arrow / alpha-lock + arrow 2020-07-14 11:00:08 +02:00
Quentin
15b1c96580 Merge pull request #369 from M4xi1m3/e14-bf3
[apps/home] Made external apps selectable again.
2020-07-14 10:36:38 +02:00
M4x1m3
51cb57d1a1 [apps/home] Made external apps selectable again. 2020-07-14 10:04:00 +02:00
Quentin Guidée
5c3dd4f6d2 [Revert] 3DS workflows 2020-07-13 11:49:25 +02:00
Quentin Guidée
3bac01189f [i18n/fr] Format expressions -> Format expression 2020-07-13 11:15:37 +02:00
Quentin Guidée
0d80f148b4 [Fix] Click on symbolic expression caused undef 2020-07-13 11:09:22 +02:00
Quentin Guidée
d13e79509a [Update] RPN with Epsilon 14 2020-07-13 10:48:07 +02:00
Joachim LF
04901e3231 Fixed % in alpha lock 2020-07-13 10:38:22 +02:00
Joachim LF
d7ac7e19bb [Update] Epsilon 14 2020-07-13 10:36:47 +02:00
Léa Saviot
b83c686773 build: Version 14.4.1 2020-07-10 10:49:19 +02:00
Léa Saviot
2af89fb546 [build/android] Prevent code relocations in MicroPython 2020-07-09 20:24:16 -04:00
Léa Saviot
1fde815769 [ion/android] Do not setWindowStyle if SDL not initialized
When a library was broken, we would see an error due to the failed
setWindowStyle call, instead of getting the briken library error.
2020-07-09 20:24:16 -04:00
Joachim LF
4a5681576c Visual keyboard only change state on keydown 2020-07-09 19:17:36 +02:00
Quentin
d2a2c9e208 Merge pull request #366 from M4xi1m3/omega-dev
Adding file support to micropython
2020-07-08 13:20:25 +02:00
Léa Saviot
ef8a4f9e7b build: Version 14.4.0 2020-07-07 09:55:21 +02:00
Léa Saviot
d8f17da04e [apps/calculation] Add TODO comments about factorization 2020-07-07 09:55:20 +02:00
Léa Saviot
cc4ff3d40d [apps/calculation] Apply fix about Height computation
There was a problem with the way of computing Height, see
Calculation::HistoryViewCell. We did not encounter a problemeatic
scenario here, but there is no reason it would have been safe before.
2020-07-07 09:55:20 +02:00
Léa Saviot
982b467268 [apps/calculation] Fix scrolling
If the last cell is too big to fit entirely, we would scroll to the top
of the calculation, instead of the bottom
2020-07-07 09:46:26 +02:00
Léa Saviot
1128134c37 [apps/calculation] Raise exception if row height miscomputed
Scenario:
Put the complex mode to exponential, then go back to Calculation and:
Toolbox, Down, Down, Down, Down, OK, OK, Two, Plus, Imaginary,
Toolbox, Down, Down, Down, Down, OK, Down, OK, Two, Plus,
Imaginary, OK, Toolbox, Down, Down, Down, Down, Down, OK,
Down, OK, Up, OK, Right, Zero, OK, OK, Toolbox, Down,
Down, OK, Toolbox, Back, Up, Zero, Up, OK, Zero, Up, Up, Up
2020-07-07 09:46:26 +02:00
Léa Saviot
924e235ba8 [apps/calculation] Factorize some code 2020-07-06 17:16:22 +02:00
Léa Saviot
35f20c4312 [apps/calculation] Comment possible failed height computation 2020-07-06 16:35:35 +02:00
M4x1m3
c4363103f6 [apps/code] Added exceptions handling in toolbox 2020-07-06 12:45:47 +02:00
M4x1m3
73688343a0 [apps/code] Added File category to python toolbox 2020-07-06 11:56:11 +02:00
M4x1m3
646088e429 [mpy/files] Removed RAM/FLASH logic, added a bit of doc. 2020-07-06 10:05:55 +02:00
M4x1m3
efcf9903a9 [mpy/files] implemented open 2020-07-05 21:20:52 +02:00
M4x1m3
61a9e492bd [mpy/files] truncate, readlines, writelines, name, mode 2020-07-05 21:20:47 +02:00
M4x1m3
55bc23c6d7 [mpy/files] __iter__, __next__ 2020-07-05 21:20:40 +02:00
M4x1m3
fba5295502 [mpy/files] readline 2020-07-05 21:20:37 +02:00
M4x1m3
a47ef29236 [mpy/files] __enter__, __exit__ 2020-07-05 21:20:32 +02:00
M4x1m3
1aebec52bb [mpy/files] fixed read, added write 2020-07-05 21:20:25 +02:00
M4x1m3
8178eadd49 [mpy/files] read 2020-07-05 21:20:20 +02:00
M4x1m3
7d61f867cf [mpy/files] closed attribute 2020-07-05 21:20:14 +02:00
M4x1m3
420edf6092 [mpy/files] close 2020-07-05 21:20:09 +02:00
M4x1m3
a20ac589ec [mpy/files] seek, tell, seekable 2020-07-05 21:19:57 +02:00
M4x1m3
d0f3ec887e [mpy/files] Added ion.file 2020-07-05 21:19:49 +02:00
Léa Saviot
1ef3f34a31 [ion/apple] App needs to be inside Payload folder to build .ipa
Otherwise the .ipa cannot be uploaded to the app store.
2020-07-03 14:21:56 +02:00
Quentin
ce00a8ba94 Merge pull request #364 from M4xi1m3/omega-dev
Made CI output binpacks instead of DFU
2020-07-03 11:25:32 +02:00
Maxime FRIESS
7c837238bd Made CI output binpacks instead of DFU 2020-07-03 11:12:44 +02:00
Quentin Guidée
b8b5a9cb7c [GitHub] Create CODE_OF_CONDUCT.md 2020-07-02 22:26:25 +02:00
Quentin Guidée
7996610451 [Update] Epsilon master 2020-07-02 19:07:29 +02:00
Quentin Guidée
cd2a250d20 [Change] Settings camelCase 2020-07-02 18:10:19 +02:00
Émilie Feral
38f3c9b813 build: Version 14.3.0 2020-07-02 17:09:38 +02:00
Léa Saviot
759fa6a60a [escher] Fix constexpr due to linux warning 2020-07-02 17:09:38 +02:00
Léa Saviot
6b60fc561f [apps/regression] Fix wrong proportional model fit 2020-07-02 17:09:38 +02:00
Romain Goyet
5dfccd4a04 [ion/simulator] Relayout on any windows event
We might be relayouting a bit too often, but better safe than sorry!
Jokes aside, most SDL_WINDOWEVENT should trigger a relayout, and in
general those events aren't triggered on a regular basis anyway.
2020-07-02 14:42:59 +02:00
Romain Goyet
7a9954152a [ion/simulator] Ion::Simulator::Main::relayout() should not draw
That function is supposed to recompute the layout, not perform any
drawing. Namely, presenting the render without a potential previous call
to SDL_RenderClear could lead to some visual glitches.
2020-07-02 14:42:59 +02:00
Romain Goyet
026fe120fe [simulator] Make the calculator's screen pixel-perfect 2020-07-02 14:42:59 +02:00
Émilie Feral
558d0f6343 [.github/workflow] ci-workflow: fix emscripten version to 1.39.16 (later
versions removed EMTERPRETER)
2020-07-02 14:42:59 +02:00
Romain Goyet
585bf65294 [ion/simulator] Relayout on any windows event
We might be relayouting a bit too often, but better safe than sorry!
Jokes aside, most SDL_WINDOWEVENT should trigger a relayout, and in
general those events aren't triggered on a regular basis anyway.
2020-07-02 14:41:49 +02:00
Romain Goyet
85a10ab084 [ion/simulator] Ion::Simulator::Main::relayout() should not draw
That function is supposed to recompute the layout, not perform any
drawing. Namely, presenting the render without a potential previous call
to SDL_RenderClear could lead to some visual glitches.
2020-07-02 14:41:49 +02:00
Romain Goyet
3d24b3c054 [simulator] Make the calculator's screen pixel-perfect 2020-07-02 14:40:36 +02:00
Quentin
bd6c7200cd [GitHub] Update README.md 2020-07-02 13:23:29 +02:00
Quentin
81a1f907d0 Merge pull request #363 from M4xi1m3/omega-dev
Changed simulator background
2020-07-02 11:00:04 +02:00
M4x1m3
154152440b Changed simulator background 2020-07-02 10:57:59 +02:00
Léa Saviot
3cf80b86d6 [apps/i18n] Fix italian translation typo 2020-07-02 10:23:27 +02:00
Quentin
19ed9e96d9 [GitHub] Update README.md 2020-07-01 23:15:24 +02:00
Quentin
35589e2e75 [GitHub] README with better Discord visibility 2020-07-01 22:21:21 +02:00
Quentin
b1f8040741 Merge pull request #362 from M4xi1m3/omega-dev
Enabled circuit breaker with emscripten
2020-07-01 21:38:36 +02:00
Quentin
101e4477f3 [.github/workflows] Fix 3DS CI 2020-07-01 21:37:06 +02:00
M4x1m3
81e9cbc0e0 Enabled circuit breaker with emscripten
This is possible because we use WASM and ASYNCIFY with the latest-upstream
toolchain.
2020-07-01 21:23:50 +02:00
Quentin
6c6da43047 [GitHub] Update README.md 2020-07-01 13:35:05 +02:00
Quentin
e2fef63062 Merge pull request #361 from M4xi1m3/omega-dev
Fixed 3DS build, added 3DS CI
2020-07-01 12:20:54 +02:00
M4x1m3
10a11dddeb Fixed 3DS build, added 3DS CI 2020-07-01 11:45:26 +02:00
Léa Saviot
a4c0903f53 [i18n/pt] Fix typo 2020-06-30 17:24:50 +02:00
Gabriel Ozouf
e78c5c02d3 [apps/calculation] Fixed history scroll
Fixed a bug involving mishandled negative offsets in
CalculationSelectableTableView::scrollToSubviewOfTypeOfCellAtLocation
and cleaned up the function.

Change-Id: I4394ca9dc9748e8b761e7f722e41014d71d3373f
2020-06-30 15:41:56 +02:00
Quentin
80404db33d [Makefile] Fixed i18n dependency issue 2020-06-28 18:52:11 +02:00
Émilie Feral
cb62747e48 build: Version 14.2.0 2020-06-26 17:48:31 +02:00
Émilie Feral
96c7d84633 [apps/calculation] Factorize code to avoid selecting ellipsis on cell
where ellipsis is not displayed
2020-06-26 17:48:31 +02:00
Émilie Feral
1281a4a508 [apps/calculation] HistoryController: avoid duplicate code when handling
backspace event. Keep the same selected subview.
2020-06-26 17:48:31 +02:00
Émilie Feral
94d3ac9828 [apps/calculation] HistoryController: fix order of actions in Backspace
handle event

This fixes the following bug: input 1/2/3/4/5/6/7/8, OK, OK, input 1,
OK, up, backspace. The selection disappeared.
2020-06-26 17:48:31 +02:00
Émilie Feral
aef804d149 [apps/calculation] HistoryController: avoid 2 calls to
setSelectedSubviewType in tableViewDidChangeSelectionAndDidScroll
2020-06-26 17:48:31 +02:00
Émilie Feral
736833da34 [escher] Typo 2020-06-26 17:48:31 +02:00
Émilie Feral
457fa6a925 [apps/calculation] When EditExpressionController becomes the first
responder, scroll to the bottom of the table (and not the last cell).
Indeed, the last cell might be to big to be displayed and scroll to it
might scroll to its top.

This fixes the following bug: input 1/2/3/4/5/6/7/8, OK, up, down. We
did not scroll to the bottom of the table.
2020-06-26 17:48:31 +02:00
Émilie Feral
1da2f23914 [escher] SelectableTableView: fix delegate notification when
deselecting table view

This fixes the following bug: input 1.2/2, OK, up, down, the exact ouput
is still displayed but should have toggled
2020-06-26 17:48:31 +02:00
Émilie Feral
db331e054a [apps/code] variable_box_controller: avoid unused variable warning when DEBUG=0 2020-06-26 10:47:14 +02:00
Émilie Feral
9508a89a1b [apps/calculation] Missing inclusion 2020-06-26 10:47:14 +02:00
Émilie Feral
0b74dd005d [apps/calculation] SelectableTableView: fix scrollToSubviewOfTypeOfCellAtLocation
When scrolling, the table layout is likely to change and the selected
cell might not been the same.
2020-06-26 10:45:55 +02:00
Quentin
ac682a15c4 Merge branch 'omega-dev' of github.com:Omega-Numworks/Omega into omega-dev 2020-06-26 10:37:10 +02:00
Quentin
50a0fce958 [Feature] Add Omega and Mu symbols, closes #301 2020-06-26 10:37:01 +02:00
Gabriel Ozouf
123d5f9076 [apps/calculation] Fixed tall calculation scroll
When displaying a calculation taller than the screen, the output could
be displayed above the screen.
  - type 1/2/3/4/5/6/7/8/9 (the main fraction between the 1 and 2)
  - press UP to select the output
==> The output is still offscreen.

Change-Id: Ic3ed7664ae693d22486f8b2f9f3a8f2324c3d7c9
2020-06-26 09:50:10 +02:00
Gabriel Ozouf
363bf4a620 [apps/calculation] Fixed ellipsis scrolling
When scrolling to a calculation without additional outputs from a
calculation with additional outputs, the ellipsis, though invisible,
would remain selected.

Change-Id: I7408ae004b9374e432ac58361616fa2ecf1550d8
2020-06-25 18:03:29 +02:00
Roberta Rabotti
981c627bc4 [IT]changed Sample standard deviation 2020-06-25 17:15:09 +02:00
Roberta Rabotti
d48f66fdad [IT]chenges graphs 2020-06-25 17:15:03 +02:00
Émilie Feral
bac2949a5e [escher][apps] SelectableTableViewDelegate: add
tableViewDidChangeSelectionAndDidScroll method and implement it for
Calculation::HistoryController

This fixes the following bug: In the calculation application, input 1,
OK, 1/2/3/4/5/6/7/8, OK, up, up, left, down, up. The selection failed.
2020-06-25 13:48:47 +02:00
Léa Saviot
2d1d3ca944 [apps/code] Fix variables loading in the console
The two following scenari display empty variable boxes, when there
should be loaded variables.
1) Open the console, go back to the scripts menu, go back to the
console, open the variable box
2) Open the console, execute mandelbrot, open the variable box
2020-06-25 11:31:01 +02:00
Quentin
ee575ecf1c Merge pull request #359 from M4xi1m3/omega-dev
[apps/home] Changed wrong background color on app_cell
2020-06-24 16:18:06 +02:00
Maxime FRIESS
f2cd8367d6 [apps/home] Changed wrong background color on app_cell 2020-06-24 14:59:53 +02:00
Quentin
aa6ce1f389 [Fix] Webworkflows 2020-06-23 19:20:21 +02:00
M4x1m3
150e4a727c [simu/web] Changed to emsdk upstream-latest. Now using WASM. 2020-06-23 19:17:31 +02:00
Quentin
af0ed7ebc8 [Docker] Rename job 2020-06-23 19:13:20 +02:00
Quentin
0f4df66097 [Docker] Rename job 2020-06-23 19:12:46 +02:00
Quentin
6af893c7a6 [Docker] README.md 2020-06-23 19:06:32 +02:00
Evann DREUMONT
8b973e9c77 [Feature] Add docker and docker CI
fix CI
2020-06-23 19:06:15 +02:00
Quentin
c6fc70aa42 [Docker] README.md 2020-06-23 18:22:00 +02:00
Quentin
37eca1dfb2 Merge pull request #358 from LeGmask/docker
[Docker] Add docker and docker CI
2020-06-23 17:52:42 +02:00
Evann DREUMONT
036401a3c4 [Feature] Add docker and docker CI
fix CI
2020-06-23 17:39:12 +02:00
Quentin
6da053508d Merge branch 'M4xi1m3-omega-dev' into omega-dev 2020-06-23 17:36:13 +02:00
Quentin
1f3ad54c05 [Change] OMEGA_THEME_* to THEME_* 2020-06-23 17:35:39 +02:00
Quentin
ea75f8ac26 Merge branch 'omega-dev' of https://github.com/M4xi1m3/Omega into M4xi1m3-omega-dev 2020-06-23 17:30:06 +02:00
Quentin
5d42fbc938 Merge pull request #353 from quentinguidee/patch-themes
[Fix] Patched colors
2020-06-23 17:23:20 +02:00
M4x1m3
72d9e31847 Added support for git theme repos
Usage:
OMEGA_THEME_REPO must be set to a valid git url, or local for local repository
OMEGA_THEME_NAME must be set to an existing theme in the repository
2020-06-22 19:02:32 +02:00
Quentin
3c1cc62302 [Fix] undefined reference to CalculationTrigoAndComplexForeground 2020-06-20 19:46:47 +02:00
Quentin
27a0935311 [Fix] Patched colors 2020-06-20 19:46:47 +02:00
Quentin
3f959a44db Merge pull request #355 from M4xi1m3/omega-dev
[simu/web] Changed to emsdk upstream-latest. Now using WASM.
2020-06-20 19:34:22 +02:00
Quentin
1b76a48ae2 [Revert] Omega App 2020-06-20 19:31:42 +02:00
M4x1m3
f04c645fee [simu/web] Changed to emsdk upstream-latest. Now using WASM. 2020-06-20 19:05:22 +02:00
Quentin
710e4cf56b [Change] Contributors 2020-06-19 20:49:05 +02:00
Émilie Feral
ef210f9cff build: Version 14.1.0 2020-06-19 12:10:24 +02:00
Léa Saviot
1045f54633 [apps/code] Fix variables loading in the console
Scenario: execute a script, open the variable box, select a leaf, reopen
the variable box -> it shows empty
2020-06-19 12:10:24 +02:00
Quentin
8d10e2884b [Update] Themes Submodules 2020-06-19 11:47:07 +02:00
Quentin
d9d6d1f31e [Update] Themes Submodules 2020-06-19 11:19:09 +02:00
Quentin
523cd87334 [Update] Themes 2020-06-19 11:14:58 +02:00
Quentin
49fd8d1534 [GitHub] Update README.md with 3DS simulator 2020-06-19 09:21:10 +02:00
Quentin
38c503da40 Merge branch 'omega-dev' of github.com:Omega-Numworks/Omega into omega-dev 2020-06-19 09:14:39 +02:00
Quentin
03afd1d681 [Revert] Stay Home(ga) 2020-06-19 09:14:22 +02:00
Quentin
b35d6105c5 [GitHub] Disable blank issues 2020-06-18 23:42:34 +02:00
Evann DREUMONT
2dff5c511e [Feature] Add \ and @ 2020-06-18 22:28:55 +02:00
Quentin
5134d0e352 [Fix] Conflicts 2020-06-18 19:58:34 +02:00
Quentin
2c99f38a93 [Revert] Compact display 2020-06-18 19:38:22 +02:00
Quentin
db10723e76 [Update] Upstream 2020-06-18 19:25:17 +02:00
Émilie Feral
043c564a25 [.github/workflow] ci-workflow: fix emscripten version to 1.39.16 (later
versions removed EMTERPRETER)
2020-06-17 09:51:00 +02:00
Léa Saviot
cf4eaa3d1f [apps/poincare] Use symbolicComputation in recursivelyMatches
This fixes a failed assertion for the scenario:
[3]->x then, in the Equation app, solve x+1->0
2020-06-15 16:20:09 +02:00
Léa Saviot
1f0b3770e3 [apps/code] Fix syntaxic coloration
Scenario: +, -, / operators where no longer properly colored during
script edition.
This was due to the MicroPython update, which changed the lexer tokens
order.
2020-06-15 13:26:32 +02:00
Émilie Feral
1cae01b120 [apps/solver] Equation: handle circularly defined equations 2020-06-15 13:09:03 +02:00
Evann DREUMONT
f0c46adebe [Feature] Add root and log setting (#290)
* [setting + layout] add function setting

* [GitHub] GitHub Actions

* [GitHub/Fix] GitHub Actions

* Update config.mak

* Fix setting name

* Fix setting name

* Fix setting name

* Fix setting name

* Fix setting name

* Fix setting name

* Fix typo error

* Fix trad

Co-authored-by: Quentin Guidée <quentin.guidee@gmail.com>
2020-06-13 00:10:33 +02:00
Quentin
b7a5abe597 [Feature] Add ALPHA to some shortcuts 2020-06-13 00:03:01 +02:00
Antonin Loubiere
5f15b37918 [Feature] Add Toolbox / Table shortcuts (#327) 2020-06-12 23:58:49 +02:00
Quentin
c12d3bbd33 [Fix] Toolbox crash 2020-06-12 23:55:38 +02:00
Quentin
a6162a9623 Merge pull request #332 from M4xi1m3/omega-3ds-dev
[Feature] Port Omega to the 3DS
2020-06-12 23:00:28 +02:00
Quentin
23002f2522 Merge pull request #338 from coco33920/correct_units
[Change] A way to stop the US Unit's imperialism
2020-06-12 22:32:53 +02:00
Quentin
e3fd67fff7 Merge branch 'M4xi1m3-omega-dev' into omega-dev 2020-06-12 22:14:02 +02:00
Quentin
a58a36e7da Merge branch 'omega-dev' of https://github.com/M4xi1m3/Omega into M4xi1m3-omega-dev 2020-06-12 22:13:31 +02:00
Quentin
bdf0930077 [Update] Themes 2020-06-12 22:13:18 +02:00
M4x1m3
5f928bb8f2 [build] Made HOME_DISPLAY_EXTERNALS=1 default (closes #343) 2020-06-12 21:17:27 +02:00
M4x1m3
2d1e48eb79 [apps/external] Fixed external app color bug 2020-06-12 21:16:18 +02:00
Émilie Feral
1ed97500d0 [ion] Increase stack in DEBUG=1 to avoid breaking the test due to stack
overflow
2020-06-12 14:12:35 +02:00
Émilie Feral
d21c9b0880 [poincare] Expression: clean magic numbers 2020-06-12 13:49:32 +02:00
Léa Saviot
ff3b756080 [apps/console] Fix the script console fetch status cleaning
unloadPythonEnvironment is not called when leaving the app, only after
editing a script, so it did not do what we wanted.
2020-06-11 14:12:50 +02:00
Émilie Feral
dfef134603 [poincare] typo 2020-06-11 12:03:21 +02:00
Émilie Feral
a26dc4be79 [apps/calculation/additional_outputs] Expression::removeUnit can be
called on reduced expression only
2020-06-11 12:02:48 +02:00
Émilie Feral
ad86378a5c [poincare] Unit: -_m should be beautified to -1x_m 2020-06-11 12:02:17 +02:00
Émilie Feral
555db32670 [apps/code] Fix test on variable_box_controller 2020-06-11 11:36:45 +02:00
Léa Saviot
6e6236a651 [poincare/integer] Integer::isExtractable
This factorizes and fixes wrong isExtractable checks
2020-06-10 11:57:41 +02:00
Léa Saviot
bee7441444 [apps/code] Fix an assertion break
Scenario: write a script, execute it in the console and open the
variable box, go back to edition and trigger autocompletion.
2020-06-10 10:49:22 +02:00
Arthur Camouseigt
d7fb5c256c [turtle] Fixed remanent images bug
We now erase the turtle before writing text. This way we can redraw it
on top of it, preventing overlapping and remanent images.

Those scripts are causing issues :
goto(-30,50)
write('coucou')
left(270)
goto(30,50)
write('oui')
-----------
up()
goto(-30,50)
write('coucou')
goto(30,50)
write('oui')

Change-Id: I01a6e5f8308937b5051165548c2046883da587d2
2020-06-10 10:35:13 +02:00
Léa Saviot
1ccb55a16e [apps/code] Fix script importation status
Scenario: Execute the script parabola.py, open the variable box, select
any leaf, enter, open the variable box again -> no variables are loaded
anymore
2020-06-09 15:12:13 +02:00
Léa Saviot
213d3d322d [apps/solver] Fix symbol replacement in equation solving
If the symbol replacement led to an undefined reduce equation, we did
not realize we could try without replacing the symbol.
2020-06-08 17:11:59 +02:00
Léa Saviot
9bd411f405 [apps/solver] Add test about failing equation resolution 2020-06-08 17:10:02 +02:00
Quentin
973a64c813 [Fix] Github conflicts fail in qstrdefs.in.h 2020-06-07 22:34:42 +02:00
Quentin
b058898e27 Merge pull request #345 from quentinguidee/omega-dev
[Feature] RGB files compatibility
2020-06-06 14:21:12 +02:00
Quentin
e4a3110149 [Feature] RGB files compatibility 2020-06-05 21:07:24 +02:00
Léa Saviot
84e8ac5bec [apps/calculation/i18n] Fix typo 2020-06-05 15:58:28 +02:00
Léa Saviot
9a1ff2bd33 [apps/code] Status at the beginning of a script is one byte long
This saves space + avoids clashes with the NumWorks Workshop when
exchanging scripts
2020-06-05 11:28:12 +02:00
Léa Saviot
d53a16eb91 [ion/storage] Add TODO 2020-06-05 11:02:39 +02:00
Léa Saviot
7699dc9929 [apps/on_boarding] Fix too long i18n 2020-06-05 10:31:58 +02:00
Émilie Feral
97ffab1fc2 build: Version 14.0.0 2020-06-04 14:58:20 +02:00
Émilie Feral
2630d0dee2 [poincare] Change approximation test to work on the device
implementation of libm (hypotf is not as accurate on the device)
2020-06-04 14:58:20 +02:00
Émilie Feral
9556ae3aa4 [poincare] Unit: comparison can rely on the pointer addresses only when
the object are ordered in a table. Otherwise, the compiler is free to
order them as it wants.

This fixes the test on the device: 10_m^2→_mm×_km simplifies to 10×_km×_mm
2020-06-04 14:58:20 +02:00
Émilie Feral
6abc3b8c99 [poincare] Enable to set POINCARE_TREE_LOG from environment variable 2020-06-04 14:58:20 +02:00
Léa Saviot
49e4abb964 [poincare/multiplication] Fix comment 2020-06-04 14:58:20 +02:00
Léa Saviot
72e342e1b1 [apps/curve_view] Fix drawArrow
Compute everything in pixels + fix glitch when zooming on the tip of
arrow(0,0,2,3)
2020-06-04 14:58:20 +02:00
Émilie Feral
2ebad3062c [apps/code] Test: strcpy isn't available on the device 2020-06-04 14:50:10 +02:00
Émilie Feral
fc238f639a [python] Fix test on matplotlib 2020-06-04 14:50:10 +02:00
Émilie Feral
4b83da21b7 [poincare] Fix Multiplication between 0 and a unreduced matrix: it
should not be equal to 0 but to Matrix(0)
2020-06-04 14:50:10 +02:00
Émilie Feral
420dd04766 [apps/shared][python/port] CurveView::drawArrow uses pixel computation
instead of float computation to avoid precision errors, by default the
arrow size is decided in pixels.
2020-06-04 14:50:10 +02:00
Léa Saviot
a9fbcf99b2 [poincare/test] Add failing test about multiplication simplification
The result should be 0*[[1,0][0,1]]^500, or, maybe later, [[0,0][0,0]]
2020-06-04 14:50:10 +02:00
Léa Saviot
0c040a7db6 [poincare/power] Fix infinite loop in reduction
Fix the broken simplification test 1/identity(2)^500
2020-06-04 14:50:10 +02:00
Léa Saviot
55ae258653 [poincare/test] Add failing matrix/power simplification test 2020-06-04 14:50:10 +02:00
Arthur Camouseigt
4b20c69174 [python/modturtle.cpp] Added support for float parameter in colormode()
The function can now accept the value 1.0 in addition to 1

Change-Id: I9a7021076844784ca997fc618253524089cbe855
(cherry picked from commit c69e1542ecc9a7e474a3f1e92cc97f644bf4b701)
2020-06-04 14:50:10 +02:00
Émilie Feral
1b2750c247 [python] matplotlib: add assertions to ensure authorized access to
args[i]
2020-06-04 14:50:10 +02:00
Arthur Camouseigt
aec25eb8d4 [matplotlib/modpyplot.cpp] Modified the error messages due to too many arguments
Change-Id: I48a8283a0c6311a52df152cbce3b0c824b46454b
(cherry picked from commit 94b90533c751c10dadb8e6144e613ed4839f09c4)
2020-06-04 14:50:10 +02:00
Arthur Camouseigt
e1a356fe88 [matplotlib/modpyplot.cpp] Added support for third parameter color in plot function
It is now possible to specify the color of the plot through a third positional argument in the plot function. However, is a keyword (color or c) is then used, it will override the previous color command.

Change-Id: I5a73ddb322e650db486de568e4a56b4752751cfb
(cherry picked from commit e6cc196cca405e5a4f8058a6af917aa0e7962b8a)
2020-06-04 14:50:10 +02:00
Arthur Camouseigt
4b88521e14 [matplotlib/modpyplot.cpp] Removing c keyword from some functions to match pyplot spec
Change-Id: I53fa8c9edc8bcfdfb9c36797b41a1c36494e2c74
(cherry picked from commit 42b245ed97d6fa3394316888489660f4f76f0a78)
2020-06-04 14:50:10 +02:00
Arthur Camouseigt
06dc97152c [matplotlib/modpyplot.cpp] Added support for keyword argument c, a shortcut for color
Change-Id: I89227a73fca6fd50ae190107fc23c3c7acadc6db
(cherry picked from commit bc642c2d8d105ed609cf8b4d86800879645afd7e)
2020-06-04 14:50:10 +02:00
Émilie Feral
7b150deaeb [apps/calculation] Hide additional outputs for Dutch exam mode 2020-06-04 14:50:10 +02:00
Émilie Feral
90fb9b4ea2 [apps/calculation] Hide calculations involving units in Dutch exam mode 2020-06-04 14:50:10 +02:00
Émilie Feral
fbeb5ed982 [apps/controller] All code regarding Dutch exam mode is in
ExamModeConfiguration
2020-06-04 14:50:10 +02:00
Léa Saviot
8412087cc8 [apps/calculaiton] Fix cursor bug
Scenario:
1 EXE MATRIX MATRIX Down Down 1 Up Up -> it crashed
2020-06-04 14:50:10 +02:00
Émilie Feral
e24de79a9e [apps/calculation] HistoryController: avoid dereferencing nullptr 2020-06-04 14:50:10 +02:00
Émilie Feral
66ba985108 [apps/code] In toolbox: plot(x,y) --> plot(x,y,color) 2020-06-04 14:50:10 +02:00
Émilie Feral
6c54fb4ebc [apps/code] Add 'write' to the toolbox (in Turtle module and catalog) 2020-06-04 14:50:10 +02:00
Émilie Feral
8ceb368047 [poincare] Adding a number before orphan unit is done at beautification
instead of at reducing (revert previous commit)

This fixes the following bug: input log(0*f(_t)) --> crash due to an
infinite loop where we remove/add 1 before the multiplication
2020-06-04 14:50:10 +02:00
Léa Saviot
163a14d9b9 [apps/exam_mode] Dutch exam mode available when language is EN/NL 2020-06-04 14:50:10 +02:00
Léa Saviot
1635f6132b [apps/code] Fix circular importation in the variable box
Scenario (crashed only on the calculator):

script1.py
from script2 import *
a=1

script2.py
from script1 import *
b=2
2020-06-04 14:50:10 +02:00
Léa Saviot
6819041c1d [apps/code] Remove TODOs 2020-06-04 14:50:10 +02:00
Léa Saviot
622cbe2e03 [apps/code] Fix auticompletion of color from Turtle
It added color(|)/color(,,) instead of just color(|)
2020-06-04 14:50:10 +02:00
Léa Saviot
e6b87be75e [apps/i18n] Fix some i18n
Did not fit or missed a space
2020-06-04 14:50:10 +02:00
Léa Saviot
02b7ed3e27 [poincare/test] Add test for commit 02a1246 2020-06-04 14:50:10 +02:00
Émilie Feral
2f4c59b881 [apps/code] VariableBoxController::addNodeIfMatches: factorize the checking
for node unicity and the insertion index computation
2020-06-04 14:50:10 +02:00
Léa Saviot
e5976984a2 [poincare/poincare] Fix typo 2020-06-04 14:50:10 +02:00
Arthur Camouseigt
d6e32594b8 [test/matplotlib.cpp][modpyplot.cpp] Changed matplotlib tests
Modified the tests for pyplot module and added error raisers to module functions

Change-Id: I164feafaf562f16d646841c1f9dfbbe32e6a763b
2020-06-04 14:50:10 +02:00
Arthur Camouseigt
68e3208799 [matplotlib/modpyplot.cpp] Removed function previously used for setting colors
Change-Id: I76bb489d5a5b78162873f68c5e3cca8cebb77aba
2020-06-04 14:50:10 +02:00
Arthur Camouseigt
c39b432dd6 [matplotlib/modpyplot.cpp] Adding keyword arguments support for plot function
plot function can now take into account the following keywords arguments :
- color

Change-Id: I29b82ba25fa68ec4d8e1797112f133440dee22a0
2020-06-04 14:50:10 +02:00
Arthur Camouseigt
b26d448573 [matplotlib/modpyplot.cpp] Adding keyword arguments support for scatter function
scatter function can now take into account the following keywords arguments :
- color

Change-Id: Iaea5a7a46d25e3efe2214368334ce859900d6ae6
2020-06-04 14:50:10 +02:00
Arthur Camouseigt
5daaa2c050 [matplotlib/modpyplot.cpp] Adding keyword arguments support for hist function
hist function can now take into account the following keyword arguments :
- color

Change-Id: I69eca6555d892db958d2bd002f438a40908b2d9d
2020-06-04 14:50:10 +02:00
Arthur Camouseigt
0e3684e137 [matplotlib/modpyplot.cpp] Adding keyword arguments support for bar function
bar function can now take into account the following keywords arguments :
- color

Change-Id: Iefa68cff59986d89c37cfecd7e3750f03c33ca59
2020-06-04 14:50:09 +02:00
Arthur Camouseigt
41da4f2bd5 [matplotlib/modpyplot] Adding keyword argument support for arrow function
Arrow function can now take into account the following keywords arguements :
- head_width
- color

Change-Id: I205dcd5776d53a4efcbf1e6da4edf29d8e399cab
2020-06-04 14:50:09 +02:00
Émilie Feral
555617aff3 [apps/code] Factorize VariableBoxController::addNode 2020-06-04 14:50:09 +02:00
Émilie Feral
705b1812f1 [apps/code] VariableBoxController: fix NodeNameCompare when nameLength >
nodeNameLength (step 2)
2020-06-04 14:50:09 +02:00
Émilie Feral
41bb169edd [apps/variable_box_controller] Auto-import: ignore variable when it is
the autocompleted one
2020-06-04 14:50:09 +02:00
Émilie Feral
d82e6de6e8 [apps/code] VariableBoxController: fix NodeNameCompare when nameLength >
nodeNameLength
2020-06-04 14:50:09 +02:00
Émilie Feral
2b53ea748d [apps/code] Typo 2020-06-04 14:50:09 +02:00
Émilie Feral
d99357fd0d [poincare] Power: don't escape normal shallowReduce for expression
containing matrix of complex form (for instance ConfidenceInterval).

This fixes the following bug: input (2_m*confidence(0.2,12))^(-1) -->
crashes
2020-06-04 14:50:09 +02:00
Émilie Feral
ade90db392 [poincare] UnitConvert: implement removeUnit since UnitConvert can be a
reduced expression
2020-06-04 14:50:09 +02:00
Émilie Feral
b3994127c2 [poincare] Remove false assertion (splitIntoNormalForm can be called by
denominator() at reduction - there is no reason that there is no unit at
this stage...)
2020-06-04 14:50:09 +02:00
Arthur Camouseigt
985c31920d [matplotlib/plot_store.cpp] Removed useless function
checkFloatType function used to check for an obj type before cast. This is already done by mp_obj_get_float

Change-Id: I745bb3066328678ab0b2a2149c8f38a84f26fbd2
2020-06-04 14:50:09 +02:00
Arthur Camouseigt
68ff71f72a [matplotlib/modpyplot.cpp] Modified the way to add mp_float
To prevent crashes caused by failed casts from char to float, removed optimization.

Change-Id: Ia91aafa007538b6c05f7aace5e5962989d313c98
2020-06-04 14:50:09 +02:00
Léa Saviot
34a4a3311a [apps/code] Add test on variable_box_controller 2020-06-04 14:50:09 +02:00
Léa Saviot
5412410723 [apps/code] Remove duplicates in the variable box
Example script:
from turtle import *
hideturtle()

We had "hideturtle" in the local variables, and "hideturtle()" in the
imported. Now we should only have the latter.
2020-06-04 14:50:09 +02:00
Léa Saviot
40d98389d4 [apps/code] Cleaner code in VariableBoxController::loadCurrentVariablesInScript 2020-06-04 14:50:09 +02:00
Léa Saviot
6b558c3328 [apps/code] Replace if with assertion 2020-06-04 14:50:09 +02:00
Léa Saviot
b466a8711b [apps/code] Remove dead code 2020-06-04 14:50:09 +02:00
Léa Saviot
38443c0e83 [apps/code] Fix VariableBoxController::empty
No scenario, but it seems right to reset m_shortenResultCharCount
2020-06-04 14:50:09 +02:00
Émilie Feral
8b64851903 [poincare] Multiplication::shallowBeautify: handle edge case: the
expression contains a unit but we can't extract it (2^_min for instance)
2020-06-04 14:50:09 +02:00
Léa Saviot
c102bf2e4e [apps/code] Fix again variable_box_controller
Scenario: add the script
from matplotlib.pyplot import *\nfrom math import *\n\ng=9.81\n\ndef x(t,v_0,alpha):\n  return v_0*cos(alpha)*t\ndef y(t,v_0,alpha,h_0):\n  return -0.5*g*t**2+v_0*sin(alpha)*t+h_0\n\ndef vx(v_0,alpha):\n  return v_0*cos(alpha)\ndef vy(t,v_0,alpha):\n  return -g*t+v_0*sin(alpha)\n\ndef t_max(v_0,alpha,h_0):\n  return (v_0*sin(alpha)+sqrt((v_0**2)*(sin(alpha)**2)+2*g*h_0))/g\n\ndef simulation(v_0=15,alpha=pi/4,h_0=2):\n  tMax=t_max(v_0,alpha,h_0)\n  accuracy=1/10**(floor(log10(tMax))-1)\n  T_MAX=floor(tMax*accuracy)+1\n  X=[x(t/accuracy,v_0,alpha) for t in range(T_MAX)]\n  Y=[y(t/accuracy,v_0,alpha,h_0) for t in range(T_MAX)]\n  VX=[vx(v_0,alpha) for t in range(T_MAX)]\n  VY=[vy(t/accuracy,v_0,alpha) for t in range(T_MAX)]\n  for i in range(T_MAX):\n    arrow(X[i],Y[i],VX[i]/accuracy,VY[i]/accuracy)\n  grid()\n  show()tan(if :\n    \n  celse:\n  )c
then autocomplete after the last c.
2020-06-04 14:50:09 +02:00
Léa Saviot
5d49f5dca2 [apps/code] Fix VariableBoxController::addNodesFromImportMaybe
Scenario: write a ascrip "from matplotlib.pyplot0 import *" than open
the variable box
2020-06-04 14:50:09 +02:00
Léa Saviot
9d8eb1dbb6 [apps/code] Fix misnamed i18n 2020-06-04 14:50:09 +02:00
Léa Saviot
2bea3f3d47 [apps/code] Fix again VariableBoxController::loadCurrentVariablesInScript 2020-06-04 14:50:09 +02:00
Léa Saviot
00291c8974 [apps/code] Fix var initialisation in variable_box_controller 2020-06-04 14:50:09 +02:00
Arthur
59bf8bbcf4 [matplotlib] Added cyan color to the color palette
Change-Id: I29476d8148ad98285505adc460b90628573518fa
2020-06-04 14:50:09 +02:00
Arthur
472cfc012c [matplotlib] Added colors to the toolbox in python
Change-Id: I3ff3d4fb3552bcb8c375c77651db3b7c44991646
2020-06-04 14:50:09 +02:00
Arthur
fe7c4b1a8a [python/turtle] Added write method
Allows user to print strings with the turtle

Change-Id: I06a3832f6fa36d29506be10c48a1b2fb34cb69fb
2020-06-04 14:50:09 +02:00
Arthur
7cd0b7e0e0 [matplotlib] Removed useless initializers in PlotStore constructor
Change-Id: Idea0ce07cbc800139539f9d3fb27811920645184
2020-06-04 14:50:09 +02:00
Arthur
13d0bcf676 [matplotlib] Modified isEmpty method for showing axis
Added a condition for being considered empty.
Allows axis("on") or axis((0,1,2,3)) to display something with show()
This behavior is the same as the python module

Change-Id: If5f3b07c280ee9ead2bc23d23cbbb4f01da7eae5
2020-06-04 14:50:09 +02:00
Émilie Feral
d8666a52d3 [python] matplotlib: fix tests about arrow function 2020-06-04 14:50:09 +02:00
Émilie Feral
0c9fb57b33 [python] matplotlib: check float type of the head_width arg of arrow function 2020-06-04 14:50:09 +02:00
Émilie Feral
9b7c47a7f0 [python] matplotlib: arrow can have up to 6 args 2020-06-04 14:50:09 +02:00
Émilie Feral
12db7a5093 [apps/shared] Change default shape of arrow in CurveView (to match
matplotlib shape)
2020-06-04 14:50:09 +02:00
Émilie Feral
083f959b7b [python] matplotlib: Enable to change the arrow shape via the head_width
arg
2020-06-04 14:50:09 +02:00
Émilie Feral
c826c53659 [apps/shared] CurveView: change drawArrow API to take arrow shape
arguments in float instead of coordinates
2020-06-04 14:50:09 +02:00
Émilie Feral
0f8f82b94b [python] matplotlib: Add a parameter to to arrow to set the arrow width 2020-06-04 14:50:09 +02:00
Émilie Feral
e92b56b78e [apps/shared] CurveView: change drawArrow arguments (new definition of
arrow shape)
2020-06-04 14:50:09 +02:00
Émilie Feral
e2c06cbb44 [python] matplotlib: add color argument to plot, scatter, hist, bar and
arrow
2020-06-04 14:50:08 +02:00
Émilie Feral
a22990943b [python] matplotlib: missing static keyword 2020-06-04 14:50:08 +02:00
Émilie Feral
273d10dc26 [python] Change names: ColorParse::ParseColor --> Color::Parse 2020-06-04 14:50:08 +02:00
Émilie Feral
5aaa6723d0 [apps/calculation] Fix duplicate removal in unit additional results
This fixes the following bug: input _ns, go to additional results -->
crash
2020-06-04 14:50:08 +02:00
Émilie Feral
5725ba1c14 [escher] LayoutField: reset selection when clearing layout 2020-06-04 14:50:08 +02:00
Émilie Feral
80015ca6aa [apps/shared] RoundCursorView: fix potential black trail when redrawing
cursor (issue #1458 on GitHub)
2020-06-04 14:50:08 +02:00
Émilie Feral
9a3e2c960f [escher] LayoutField: update the grey squares when using insertion
cursor
2020-06-04 14:50:08 +02:00
Émilie Feral
79e7626dc3 [escher] LayoutField: the insertion cursor can't point to an EmptyLayout
as it might be destroyed

This fixes the following crash: input 1, OK, input ans/[], go up to the history --> crash
2020-06-04 14:50:08 +02:00
Émilie Feral
a53379781f [apps/shared] Fix comment 2020-06-04 14:50:08 +02:00
Léa Saviot
691c6739af [apps/variable_box_controller] Fix loadCurrentVariablesInScript
Scenario: write the script:

def squares():
  for i in range(660):
    forward(L)lo)

Put the cursor right of "lo" and press backspace.
2020-06-04 14:50:08 +02:00
Émilie Feral
03367cfdf6 [poincare] Makefile: POINCARE_TREE_LOG is by set by default when DEBUG=1 2020-06-04 14:50:08 +02:00
Émilie Feral
b596488a01 [poincare] Multiplication::shallowBeautify: removeUnit can only be
called on reduced expression

This fixes the following bug: input i+10*sqrt(i)
2020-06-04 14:50:08 +02:00
Émilie Feral
a4c591dea6 [apps/calculation] additional_outputs: fix complex range for infinite
values
2020-06-04 14:50:08 +02:00
Émilie Feral
6a0d65b049 [apps/calculation] additional_outputs: the complex illustration chose
its range to be orthornomal
2020-06-04 14:50:08 +02:00
Émilie Feral
d3bd086125 [apps/graph] Fix order of actions to edit the function name, we should
update the bufferSize before setting the text

This fixes the following bug: add a function, rename it "f123456",
change its type to a polar function, rename it --> crash
2020-06-04 14:50:08 +02:00
Émilie Feral
465fa5c63f [escher] TextField: fix insertTextAtLocation (confusion between size and
length)

This fixes the following bug: in a textfield, input '000', clear, input
'00', backspace --> crash
2020-06-04 14:50:08 +02:00
Émilie Feral
ab69c0069c [python] Fix alignement issues in MicroPython::collectRootsAtAddress 2020-06-04 14:50:08 +02:00
Émilie Feral
f2a1c635ef [apps/code] I18n: Missing translations 2020-06-04 14:50:08 +02:00
Léa Saviot
7d5304686d [apps/scrollable_multiple_expressions_view] Add TODO comment 2020-06-04 14:50:08 +02:00
Léa Saviot
b096d6f5e4 [escher/table_view] COding style 2020-06-04 14:50:08 +02:00
Léa Saviot
44af4b1fde [escher/table_view] Fix numberOfDisplayableRows/Columns
Did not take into account the margin so was too big sometimes
2020-06-04 14:50:08 +02:00
Léa Saviot
515aa543d3 [escher/table_view] Remove dead code 2020-06-04 14:50:08 +02:00
Léa Saviot
12a45ef8e6 [escher/poincare] Coding style 2020-06-04 14:50:08 +02:00
Léa Saviot
9d5e58f32b [escher/scroll_view] Do not compute offset if view invisible 2020-06-04 14:50:08 +02:00
Léa Saviot
3e4478454c [escher] Avoid useless redrawing in ExpressionView::setLayout 2020-06-04 14:50:08 +02:00
Léa Saviot
e8d97f561c [apps/proba] Fix tests 2020-06-04 14:50:08 +02:00
Léa Saviot
9b2f91f5e1 [apps/probability] Geometric distribution default computed value is 1 2020-06-04 14:50:07 +02:00
Léa Saviot
a9c47a9468 [apps/probability] Change geometric distribution definition
THe distribution now represents the number of trials neded before a
success, so is defined for k in {1, 2, 3, ...}
2020-06-04 14:50:07 +02:00
Léa Saviot
d200688f20 [apps/proba] Geometric distibution should return 0, not nan for x < 0 2020-06-04 14:50:07 +02:00
Léa Saviot
503227b49b [apps/proba] Fix float/integer comparison 2020-06-04 14:50:07 +02:00
Léa Saviot
5f26ca40cc [apps/escher] Fix scroll view indicator margin
So it does not overflow the scrolled view. Fixed for the language
controllers (on boarding app and settings), one value was changed from a
magic 14 to Metric::CommonTopMargin = 15, it did not seem to break
anything.
2020-06-04 14:50:07 +02:00
Léa Saviot
b8244ec0c5 [apps] Fix margins of LanguageController
Add margin at the bottom and fix margin values
2020-06-04 14:50:07 +02:00
Léa Saviot
d41b93c711 [apps/code] Put back the squares script template 2020-06-04 14:50:07 +02:00
Léa Saviot
6dfccc6edf Revert "[apps/code] EXE event accepts autocompletion"
This reverts commit 5a96fd0e5de4a9bda30900e0c81a0b15f3fe081a.
2020-06-04 14:50:07 +02:00
Émilie Feral
88a39c335f [poincare] Fix Unit::IsISEnergy 2020-06-04 14:50:07 +02:00
Émilie Feral
7bb4a2ae98 [apps/calculation] Additional outputs: do not display identical unit as
the outpu
2020-06-04 14:50:07 +02:00
Émilie Feral
05a42cd2eb [apps/shared] PoincareHelpers: implement Reduce static inline function 2020-06-04 14:50:07 +02:00
Émilie Feral
1f9cdc5648 [apps] Calculation: do not offer additional results on units if there
will be only one identical to the output
2020-06-04 14:50:07 +02:00
Émilie Feral
7b2d020128 [poincare] Unit: implement IsIS 2020-06-04 14:50:07 +02:00
Émilie Feral
0f4eee2d71 [poincare] Add comment on how Units are built 2020-06-04 14:50:07 +02:00
Émilie Feral
a48f65ba95 [poincare] Unit: ensure one unique instance of each prefix 2020-06-04 14:50:07 +02:00
Émilie Feral
bcbdc9312e [poincare] Fix Unit::isSecond, Unit::isMeter and Unit::isKilogram: the
EmptyPrefix is not unique, we can't only compare pointers
2020-06-04 14:50:07 +02:00
Émilie Feral
b6ee72bc21 [poincare] Clean tests on Unit 2020-06-04 14:50:07 +02:00
Émilie Feral
3b7d7e7898 [poincare] Clean magic numbers in Unit 2020-06-04 14:50:07 +02:00
Émilie Feral
67b1c12bf7 [poincare] Remove useless variables 2020-06-04 14:50:07 +02:00
Léa Saviot
0b88bb0767 [apps/code] Reset m_autocompletionResultIndex when addingAutocompletion 2020-06-04 14:50:07 +02:00
Léa Saviot
a53edf5202 [apps/code] Remove TODOs 2020-06-04 14:50:07 +02:00
Léa Saviot
f763bb50ac [apps/code] Do not display subtitles in var box from console 2020-06-04 14:50:07 +02:00
Léa Saviot
780c593c26 [apps/code] Autocompletion for "abs" proposes parentheses 2020-06-04 14:50:06 +02:00
Léa Saviot
b070eaad45 [apps/code] Remove double call to addAutocompletion 2020-06-04 14:50:06 +02:00
Léa Saviot
c915eb0b27 [apps/code] Do not autocomplete with arguments
Eg : arr|ow(x,y,dx,dy) should give arrow(|,,,)
2020-06-04 14:50:06 +02:00
Léa Saviot
e4aac3f9c6 [apps/code] Remove more TODOs 2020-06-04 14:50:06 +02:00
Léa Saviot
8142e1d344 [apps/code] Remove TODO comment 2020-06-04 14:50:06 +02:00
Léa Saviot
0dac6b5bac [apps/code] Replace int with size_t 2020-06-04 14:50:06 +02:00
Léa Saviot
7ef17960c8 [apps/code/variable_box_controller] More TODOs removal 2020-06-04 14:50:06 +02:00
Léa Saviot
714410287a [apps/code] Remove TODOs 2020-06-04 14:50:06 +02:00
Léa Saviot
68867e45e7 [apps] Factorize isDisplayingEmptyController
Because we can now, it might need to be de-factorized later, if more
classes inherit from alternate_empty_nested_menu_controller
2020-06-04 14:50:06 +02:00
Léa Saviot
c5f2f7cf83 [apps/code] Remove TODO comments 2020-06-04 14:50:06 +02:00
Léa Saviot
43d0ab5ea7 [apps] Rename displayEmptyController -> displayEmptyControllerIfNeeded 2020-06-04 14:50:06 +02:00
Léa Saviot
e28f4ed7e2 [apps/code/variable_box_controller] Use std::min 2020-06-04 14:50:06 +02:00
Léa Saviot
59db24c518 [apps/code/variable_box_controller] Comment out unused variables 2020-06-04 14:50:06 +02:00
Léa Saviot
f306b51fc5 [apps/escher] Move ModalViewEmptyController to escher 2020-06-04 14:50:06 +02:00
Léa Saviot
645a55284f [apps/variable_box_empty_controller] Remove unneeded include 2020-06-04 14:50:06 +02:00
Léa Saviot
790cb374df [apps/code] i18n in alphabetical order 2020-06-04 14:50:06 +02:00
Léa Saviot
8ed902ceb2 [app/code] Comment about ContentFetchedFromConsoleStatus in Script 2020-06-04 14:50:06 +02:00
Léa Saviot
cf6b9d580b [apps/code] rename Script::scriptContent() -> Script::content() 2020-06-04 14:50:06 +02:00
Léa Saviot
6d7b294bca [apps/escher] Rename ToolboxMessageTree::children -> childAtIndex 2020-06-04 14:50:06 +02:00
Léa Saviot
bba5b237d2 [apps/code] Display different varbox titles from editor and console 2020-06-04 14:50:06 +02:00
Léa Saviot
5986716031 [apps/code] Fix first varbox row that never appeared again
After scrolling down
2020-06-04 14:50:06 +02:00
Léa Saviot
2fbf5d2d9f [apps/code] No variables starting with underscore in imported variables
In the variable box
2020-06-04 14:50:06 +02:00
Léa Saviot
ccca872a0f [appx/code] Empty variable box before loading it in the console 2020-06-04 14:50:06 +02:00
Léa Saviot
0c82334a96 [apps/code] Fix preventing module importations in varbox from console 2020-06-04 14:50:06 +02:00
Léa Saviot
5ffcb77c69 [apps/code] Fix missing return 2020-06-04 14:50:06 +02:00
Léa Saviot
ac654f0097 [apps/code] Load varbox before returning it in console 2020-06-04 14:50:06 +02:00
Léa Saviot
d1c8bbdaf7 [apps/code] The console marks imported script for the var box
After lauching the console, if we fetch a script we mark it as fetched.
When the variable box displays variables from imported scripts, it scans
all the variables from the scripts marked as fetched.
2020-06-04 14:50:06 +02:00
Léa Saviot
9e973adbab [apps/code] VarBox from console 2020-06-04 14:50:06 +02:00
Léa Saviot
c81420c4b2 [apps/code] EXE event accepts autocompletion 2020-06-04 14:50:06 +02:00
Léa Saviot
d8cab18eb3 [apps/code] Do not display varbox source name if it does not fit 2020-06-04 14:50:06 +02:00
Léa Saviot
4fb0a7e467 [apps/code] properly display the importation source
- It sould be nameOfScript.py, not just nameOfScript, when the source is
a script
- Fix the source for script name variables. For instance, "from
script1 import *" should display the node "script1" with the source "script1.py"
- If a script has the same name as a module, the module will be imported
and not the script, so do not load its variables (even if the module is
not in the toolbox).
2020-06-04 14:50:06 +02:00
Léa Saviot
f49bf76b19 [apps/code] More complete comment 2020-06-04 14:50:06 +02:00
Léa Saviot
2eed894599 [apps/variable_box_empty_controller] Draw the background
This was not necessary when it was only used for the expressions
variable box, because the background was already of the right color
thanks to the previous displayed menu. We need to draw it for the python
variable box.
2020-06-04 14:50:06 +02:00
Léa Saviot
3fe6af281f [apps/code] Fix variable box that crashed 2020-06-04 14:50:05 +02:00
Léa Saviot
a7773576f8 [apps/code] Fix PythonTextArea::autocompletionType 2020-06-04 14:50:05 +02:00
Léa Saviot
f9bbc94eea [apps/code] Handle autocompletionAlternativeAtIndex with no nodes 2020-06-04 14:50:05 +02:00
Léa Saviot
2a823419ff [apps/code] Cycle through possible autocompletions with up/down 2020-06-04 14:50:05 +02:00
Léa Saviot
afdf34bbb9 [apps/code] Signed/unsigned comparison 2020-06-04 14:50:05 +02:00
Léa Saviot
e7bfb3b5f3 [apps/code] Use variable 2020-06-04 14:50:05 +02:00
Léa Saviot
94e9a10f16 [apps/code] Autocomplete only with parentheses if needed
For instance, type "abs", there is "()" autocompletion
2020-06-04 14:50:05 +02:00
Léa Saviot
5d2910188d [apps/code] Add the parentheses in the autocompletion 2020-06-04 14:50:05 +02:00
Léa Saviot
2ed0c85ebf [apps/code] Autocompletion end is end of token, not next ' ' 2020-06-04 14:50:05 +02:00
Léa Saviot
da2730dd64 [apps/code] Autocomplete at the end of tokens
Not at the end of "words" separated by spaces.
2020-06-04 14:50:05 +02:00
Léa Saviot
9bf361d5a5 [apps/code] Autocomplete only after edition
Reverts 39c3d66cd
2020-06-04 14:50:05 +02:00
Léa Saviot
4502ae4fbd [apps/code] Change autocomplete color 2020-06-04 14:50:05 +02:00
Léa Saviot
7636c001e1 [apps/code] Fix varbox parentheses bug
Scenario: write i, open the varbox and select "in" -> parentheses are
added, but there shouldn't be any
2020-06-04 14:50:05 +02:00
Léa Saviot
e630b0e9e5 [apps/code] Remove __import__ from builtins 2020-06-04 14:50:05 +02:00
Léa Saviot
e73ae9bcdf [apps/code] Fix varbox that should autocomplete the current word 2020-06-04 14:50:05 +02:00
Léa Saviot
dd6c2a4f54 [apps/code] Translate the variable box 2020-06-04 14:50:05 +02:00
Léa Saviot
0f2ac5b110 [escher/text_field] Fix std::min use 2020-06-04 14:50:05 +02:00
Léa Saviot
5393ec7273 [apps/code] Add matplotlib.pyplot in the var box 2020-06-04 14:50:05 +02:00
Léa Saviot
a165c6d85b [escher] Clean InputEventHandler 2020-06-04 14:50:05 +02:00
Léa Saviot
003317647e [apps/code] Display empty message in var box 2020-06-04 14:50:05 +02:00
Léa Saviot
398de8bda3 [apps/code] Empty controller in the var box 2020-06-04 14:50:05 +02:00
Léa Saviot
f98c171d2a [apps/variable_box] Prepare for Code::VariableBox factorization 2020-06-04 14:50:05 +02:00
Léa Saviot
f371126708 [apps/code] Fix assertion 2020-06-04 14:50:05 +02:00
Léa Saviot
33d8d10286 [apps/code] Do not select subtitles in the variable box 2020-06-04 14:50:05 +02:00
Léa Saviot
0d6016116d [apps/code] Cosmetic fixes on the variable box 2020-06-04 14:50:05 +02:00
Léa Saviot
bbeb17c3a9 [apps/code] Rename ScriptNode::Types to With/WithoutParentheses
Because some functions already have the parentheses in their name, so
their type would have been Variable but it is clearer to give it the
type WithoutParentheses. this is the case for nodes created from toolbox
nodes.
2020-06-04 14:50:05 +02:00
Léa Saviot
74b786f875 [apps/code] Add list methods to the variable box 2020-06-04 14:50:05 +02:00
Léa Saviot
3d64b8dc47 [apps] AlternateEmptyNestedMenuController handles empty lists 2020-06-04 14:50:05 +02:00
Léa Saviot
b3d87c0e18 [escher/stack_view_controller] Inline some methods 2020-06-04 14:50:05 +02:00
Léa Saviot
b41d1e393e [apps/code] Autocomplete when cursor at the end of the word
Not just after adding or deleting text
2020-06-04 14:50:05 +02:00
Léa Saviot
03471bb7b4 [apps/code] Insert right text form var box
The text was iffset due to the subtitle rows
2020-06-04 14:50:05 +02:00
Léa Saviot
38854d2435 [apps/code] Fix cell type 2020-06-04 14:50:05 +02:00
Léa Saviot
1d416b3299 [apps/code] Fix varbox row height 2020-06-04 14:50:05 +02:00
Léa Saviot
d5e1e620fd [apps/code] Display source and description in var box 2020-06-04 14:50:05 +02:00
Léa Saviot
96d68d6b44 [apps/code/varbox] Subtitles and basic items are displayed properly 2020-06-04 14:50:05 +02:00
Léa Saviot
34a1a8e35f [apps/code] Fix willDisplayCellForIndex
Problem: some nodes were not displayed, because the subtitles count was
not taken into account when using the index parameter if
willDisplayCellForIndex
2020-06-04 14:50:05 +02:00
Léa Saviot
69abd75460 [apps/code] Clean ScriptNodeCell 2020-06-04 14:50:05 +02:00
Léa Saviot
0863abc4da [apps/code] VariableBox cells with node origins 2020-06-04 14:50:05 +02:00
Léa Saviot
52644bf76d [apps/code] Subtitles in the variable box 2020-06-04 14:50:05 +02:00
Léa Saviot
a98f4b6ca0 [apps/code] Edit the builtins list 2020-06-04 14:50:05 +02:00
Léa Saviot
6aa150d5d7 [apps/code] Cleaning 3 2020-06-04 14:50:05 +02:00
Léa Saviot
86435bf647 [apps/code] Cleaning 2 2020-06-04 14:50:04 +02:00
Léa Saviot
327dd0ac41 [apps/code] Cleaning 1 2020-06-04 14:50:04 +02:00
Léa Saviot
044dc706cb [apps/code] Remove unneeded code 2020-06-04 14:50:04 +02:00
Léa Saviot
332cd0ed3a [apps/code] Handle "from a.b import *" in the var box 2020-06-04 14:50:04 +02:00
Léa Saviot
97aaff9430 [apps/code] Fix imported script variables fetching 2020-06-04 14:50:04 +02:00
Léa Saviot
1e59abf55b [apps/code] Load global and imported variables from imported scripts 2020-06-04 14:50:04 +02:00
Léa Saviot
4f24a7d870 [apps/code] Use nodesForOrigin 2020-06-04 14:50:04 +02:00
Léa Saviot
0428c814e8 [apps/code] Fix array shifting 2020-06-04 14:50:04 +02:00
Léa Saviot
0b0a7227a6 [apps/code– Fix typo in python_toolbox 2020-06-04 14:50:04 +02:00
Léa Saviot
2b83d9b952 [apps/code] Continue cleaning and refactoring in variable box 2020-06-04 14:50:04 +02:00
Léa Saviot
b11bab4045 [apps/code] Refactoring 2020-06-04 14:50:04 +02:00
Léa Saviot
d2bfe01cd4 [apps/code] VariableBoxController::contains method 2020-06-04 14:50:04 +02:00
Léa Saviot
4cb947759d [apps/code] Get imported modules in the variable box 2020-06-04 14:50:04 +02:00
Léa Saviot
a0f1d0f24b [apps/code] Start getting importations in the variable box 2020-06-04 14:50:04 +02:00
Léa Saviot
78a747d9c6 [apps/code] Start loading imported variables in var box 2020-06-04 14:50:04 +02:00
Léa Saviot
6311f408b4 [escher/text_area] Fix overlap in textInsert 2020-06-04 14:50:04 +02:00
Léa Saviot
af3394d35a [apps/code] Better event handling for autocompletion 2020-06-04 14:50:04 +02:00
Léa Saviot
5a37b1df53 [apps/code] Use Default color at beginning of autocompleted token 2020-06-04 14:50:04 +02:00
Léa Saviot
fd1b0e08ee [escher/text_field] Fix insertion size computation 2020-06-04 14:50:04 +02:00
Léa Saviot
ac3a09bdeb [apps/code] Insert only the completing text when autocompleting 2020-06-04 14:50:04 +02:00
Léa Saviot
ad5c998b97 [apps/code] Add module names to the builtins 2020-06-04 14:50:04 +02:00
Léa Saviot
14f914e3d6 [apps/code] Remove unused functions and argument 2020-06-04 14:50:04 +02:00
Léa Saviot
bc4d96bc3f [apps/code] Reload the variable box less often 2020-06-04 14:50:04 +02:00
Léa Saviot
e32a5ccc17 [apps/code] Simpler VarBoxController::autocompletionForText 2020-06-04 14:50:04 +02:00
Léa Saviot
6b93a5b83a [apps/code] Load current script vars according to autocompleted text 2020-06-04 14:50:04 +02:00
Léa Saviot
e934bb39e3 [apps/code] Clean ScriptNode 2020-06-04 14:50:04 +02:00
Léa Saviot
1b828196e9 [apps/code] Use ScriptNode::Type in VariableBoxController 2020-06-04 14:50:04 +02:00
Léa Saviot
f412d95584 [apps/code] Load builtins according to autocompleted text 2020-06-04 14:50:04 +02:00
Léa Saviot
1599b16e03 [apps/code] Fix current script variables fetching 2020-06-04 14:50:04 +02:00
Léa Saviot
4b36a16cea [apps/code] Fix NodeNameCompare 2020-06-04 14:50:04 +02:00
Léa Saviot
86349675c1 [apps/code] Code cleaning 2020-06-04 14:50:04 +02:00
Léa Saviot
25f73770de [apps/code] Remove compilation warning 2020-06-04 14:50:04 +02:00
Léa Saviot
558d539194 [apps/code] Clean VariableBoxController::scriptNodeAtIndex 2020-06-04 14:50:04 +02:00
Léa Saviot
6f2dedf8ee [apps/code] Search aphabetically if var is already in var box 2020-06-04 14:50:04 +02:00
Léa Saviot
75ea4ce74e [apps/code] Clean comments 2020-06-04 14:50:04 +02:00
Léa Saviot
5d4a3f8726 [apps/code] Add variables in alphabetical order in the var box 2020-06-04 14:50:03 +02:00
Léa Saviot
c273f734fe [apps/code] Add some buitin vars in the varbox 2020-06-04 14:50:03 +02:00
Léa Saviot
eec92d51fc [apps/code] Fix VariableBoxController::autocompletionForText 2020-06-04 14:50:03 +02:00
Léa Saviot
0f02a61dc4 [apps/code] Use textLength in VarBoxController::insertTextInCaller 2020-06-04 14:50:03 +02:00
Léa Saviot
eeb42f2544 [apps/code] autocompletionText uses the right text length
Before, there was no notion that the autocompleted text might not be a
null terminated string.
2020-06-04 14:50:03 +02:00
Léa Saviot
12bb77cd9f [apps/code] Do not import the same current variable twice 2020-06-04 14:50:03 +02:00
Léa Saviot
7f486d790f [apps/code] Get current script variables and functions 2020-06-04 14:50:03 +02:00
Léa Saviot
b9693f1f26 [apps/code] Load variable box with script index argument 2020-06-04 14:50:03 +02:00
Léa Saviot
321f87ea78 [apps/code] VariableBoxController::autocompletionForText 2020-06-04 14:50:03 +02:00
Léa Saviot
f883516716 [apps/code] Editor asks VariableBox for autocompletion 2020-06-04 14:50:03 +02:00
Léa Saviot
72aedaadd0 [apps/code] VarBox contains current/buitin/imported vars and functions 2020-06-04 14:50:03 +02:00
Léa Saviot
1e2492c5f4 [apps/code] Autocomplete only at the end of the word
For instance, if the cursor is: "he|llo" and the user adds the letter
'i', there is no autocompletion provided as the cursor is still in the
middle of a word.
2020-06-04 14:50:03 +02:00
Léa Saviot
77e34f0446 [apps/code] Reload the view for autocompletion changes 2020-06-04 14:50:03 +02:00
Léa Saviot
f82079a40a [apps/code] Autocomplete only if char before cursor is not ' ' or '\n' 2020-06-04 14:50:03 +02:00
Léa Saviot
a2cc923a02 [apps/code] Fix assertion 2020-06-04 14:50:03 +02:00
Léa Saviot
5dd4f12ee3 [apps/code] Handle acception/dismissal of autocompletion 2020-06-04 14:50:03 +02:00
Léa Saviot
938e0dd840 [apps/code] Autocompletion steps 2020-06-04 14:50:03 +02:00
Léa Saviot
343d2328b8 [ion/utf8_helper] EndOfWord helper 2020-06-04 14:50:03 +02:00
Léa Saviot
32fbea9d06 [apps/code] Handle autocomplete coloring 2020-06-04 14:50:03 +02:00
Léa Saviot
9b8b0bc98f [apps/code] PythonTextArea should always be the PythonUser when coloring 2020-06-04 14:50:03 +02:00
Émilie Feral
62e2e733b2 [poincare] Add comment on unit tests 2020-06-04 14:50:03 +02:00
Émilie Feral
22fd3388ed [poincare] Add tests on Unit::BuildTimeSplit 2020-06-04 14:50:03 +02:00
Émilie Feral
a248302132 [poincare] Unit: define order on representatives in a way that time
addition are displayed: years + months + ... + seconds
2020-06-04 14:50:03 +02:00
Émilie Feral
5fa50ec79d [poincare] Unit::BuildTimeSplit can split negative time 2020-06-04 14:50:03 +02:00
Émilie Feral
23540e93ce [poincare] Unit::BuildTimeSplit rounds its argument to avoid displaying
very small seconds due to approximations

This fixes: Input "310_min", in additional results, you get
"5_h+10_min+0.000000???_s"
2020-06-04 14:50:03 +02:00
Émilie Feral
fe0a858352 [poincare] Unit: improve BuildTimeSplit to avoid displaing null sub unit
in the final addition and to keep the fractional part of the seconds
2020-06-04 14:50:03 +02:00
Émilie Feral
115ae59b5a [apps/calculation] additional_outputs: reorder unit addition outputs 2020-06-04 14:50:03 +02:00
Émilie Feral
73a598e023 [poincare] Unit: enable to tune both the prefix and the Representant or
just the prefix on a given Unit
2020-06-04 14:50:03 +02:00
Émilie Feral
e063c0a913 [apps/calculation] additional_outputs: add electronVolt row to
additional results on energy units
2020-06-04 14:50:03 +02:00
Émilie Feral
ec95ed0789 [poincare] Add Unit::ElectronVolt builder 2020-06-04 14:50:03 +02:00
Émilie Feral
0d0a37c02a [apps/calculation] additional_outputs: improve unit_list_controller to
compute all expressions before being displayed
2020-06-04 14:50:03 +02:00
Émilie Feral
785d7a0a62 [apps] additional_outputs: misc. clean-up on unit additional results 2020-06-04 14:50:03 +02:00
Émilie Feral
1a9014645c [apps] additional_outputs: fill unit additional results 2020-06-04 14:50:03 +02:00
Émilie Feral
53db27ffeb [poincare] Discard UnitConversion::Classic mode. This will be done in
Calculation app
2020-06-04 14:50:03 +02:00
Émilie Feral
7b28f760b7 [poincare] Float: float can be layouted 2020-06-04 14:50:03 +02:00
Émilie Feral
83a63155b1 [apps] PoincareHelpers: enable to specify the UnitConversion mode in
Simplify
2020-06-04 14:50:03 +02:00
Émilie Feral
397aac27c5 [poincare] Add test on Unit helpers 2020-06-04 14:50:03 +02:00
Émilie Feral
71b13bb84f [poincare] Fix Unit::BuildTimeSplit 2020-06-04 14:50:03 +02:00
Émilie Feral
845a118073 [poincare] Add Unit::BuildTimeSplit and helpers for time units 2020-06-04 14:50:02 +02:00
Émilie Feral
94c5941fb5 [poincare] Unit: improve ChooseBestMultipleForValue 2020-06-04 14:50:02 +02:00
Émilie Feral
8d12cf1e8b [poincare] Multiplication: clean code 2020-06-04 14:50:02 +02:00
Émilie Feral
ec7382c75e [poincare] Unit::chooseBestMultipleForValue handles edge cases (inf, 1,
0) cases itself
2020-06-04 14:50:02 +02:00
Émilie Feral
687766567d [poincare] Multiplication::shallowBeautify: don't bother to choose best
unit for UnitConversion::Classic
2020-06-04 14:50:02 +02:00
Émilie Feral
4d7b9aa2a9 [poincare] Add watthour representation to classic unit conversion 2020-06-04 14:50:02 +02:00
Émilie Feral
cc114900fa [poincare] Add Liter representation to classic unit conversion 2020-06-04 14:50:02 +02:00
Émilie Feral
e2dc79c2d5 [poincare] Partially implement simplification for UnitConversion::Classic 2020-06-04 14:50:02 +02:00
Léa Saviot
ddd3904ea9 [apps/calculation] Translate ES toolbox 2020-06-04 14:50:02 +02:00
Roberta Rabotti
33b2633729 [it]python 2020-06-04 14:50:02 +02:00
Roberta Rabotti
71ab038e97 [it]python 2020-06-04 14:50:02 +02:00
Roberta Rabotti
98da319a2b [it]python 2020-06-04 14:50:02 +02:00
Roberta Rabotti
e203f7ae08 [it]Forma 2020-06-04 14:50:02 +02:00
Léa Saviot
e542296b81 [apps/shared.i18n] Remove unused value 2020-06-04 14:50:02 +02:00
Léa Saviot
6cd9b744e1 [apps/code] Fix some toolbox descriptions 2020-06-04 14:50:02 +02:00
Léa Saviot
33ebd3d1aa [apps/pt] Remove superfluous upper case 2020-06-04 14:50:02 +02:00
Serenela Moreira
21e4af967a [pt] base and catalog translations
new translations that were missing after version 13
2020-06-04 14:50:02 +02:00
Léa Saviot
e803ada15f [apps/Makefiles] Automatize i18n adding for different locales 2020-06-04 14:50:02 +02:00
Roberta Rabotti
8aa323b043 [it]python 2020-06-04 14:50:02 +02:00
Léa Saviot
c7c47acc1b [build/config] Change the languages order 2020-06-04 14:50:02 +02:00
Léa Saviot
64a221a72c [apps/code] Add missing i18n (not translated yet) 2020-06-04 14:50:02 +02:00
Léa Saviot
c9d7229566 [apps/code] Fix ' characters 2020-06-04 14:50:02 +02:00
Léa Saviot
883455c958 [apps] IT and NL iso6391 definitions 2020-06-04 14:50:02 +02:00
Roberta Rabotti
40a1f1a10c [it]changes 2020-06-04 14:50:02 +02:00
Roberta Rabotti
51d20a6164 [it]changes 2020-06-04 14:50:02 +02:00
Roberta Rabotti
1f66eb9203 [it]changes 2020-06-04 14:50:02 +02:00
Roberta Rabotti
549f537ff6 [it] Add i18n files to Makefiles 2020-06-04 14:50:02 +02:00
Roberta Rabotti
3ef28ec155 [it] new translation files 2020-06-04 14:50:02 +02:00
Serenela Moreira
834a8784c9 [pt] chaged settings name 2020-06-04 14:50:02 +02:00
Serenela Moreira
b1e8f65a67 [pt] corrected typo 2020-06-04 14:50:02 +02:00
Serenela Moreira
7aecec705e [pt] shorten too long lines and other details 2020-06-04 14:50:02 +02:00
Serenela Moreira
e880dfe4b4 [pt] corrected base 2020-06-04 14:50:02 +02:00
Serenela Moreira
4802299f3c [pt] corrected regression and sequences 2020-06-04 14:50:02 +02:00
Serenela Moreira
e26739d4ad [pt] corrected toolbox 2020-06-04 14:50:02 +02:00
Serenela Moreira
ff0fb4b4c2 [pt] corrected typos in usb 2020-06-04 14:50:02 +02:00
Serenela Moreira
578c8be857 [pt] corrected shared and base 2020-06-04 14:50:02 +02:00
Serenela Moreira
b9ce07b24d [pt] translated catalog - python 2020-06-04 14:50:02 +02:00
Serenela Moreira
9c2753148b [pt] changed toolbox 2020-06-04 14:50:02 +02:00
Serenela Moreira
ad348cb64e [pt] changed graph mistakes 2020-06-04 14:50:02 +02:00
Serenela Moreira
d0a9dabd64 [pt] changed details in home and probabilities 2020-06-04 14:50:02 +02:00
Serenela Moreira
1f54ddf245 [pt] changed settings again
improved details
2020-06-04 14:50:02 +02:00
Serenela Moreira
a64ad87146 [pt] corrected settings and statistics 2020-06-04 14:50:02 +02:00
Jorick Alberga
b1e737879d [nl] Translation Epsilon 2020-06-04 14:50:02 +02:00
Jorick Alberga
c70b5b07cc [nl] Epsilon translation 2020-06-04 14:50:02 +02:00
Jorick Alberga
08fe49526c [nl] Epsilon translation update 2020-06-04 14:50:02 +02:00
Jorick Alberga
7f561b0a3d [nl] Update translation Epsilon 2020-06-04 14:50:02 +02:00
Jorick Alberga
07f924bed6 [nl] Translation Functions app And other translation
In file: epsilon/apps/graph/base.nl.i18n some text would look better if placed slightly to the left. I'm talking about lines 23 and 24: SelectLowerBound and SelectUpperBound
2020-06-04 14:50:01 +02:00
Jorick Alberga
1426da8c44 [nl] Also python-app 2020-06-04 14:50:01 +02:00
Jorick Alberga
00064ba824 [nl] Translation Python-app 2020-06-04 14:50:01 +02:00
Jorick Alberga
8a37096680 [nl] Start translation 2020-06-04 14:50:01 +02:00
Émilie Feral
ae71c23147 [poincare] Override method Unit::node to return UnitNode 2020-06-04 14:50:01 +02:00
Émilie Feral
3308b13b9c [poincare] UnitConvert:
- do the smart part at beautification to avoid
requiring an escape case just for UnitConvert
- Use UnitConvert::None
2020-06-04 14:50:01 +02:00
Émilie Feral
c3e68d1968 [poincare] Add test on the UnitConversion mode 2020-06-04 14:50:01 +02:00
Émilie Feral
3f34e5e644 [poincare] Enable to choose the "UnitConversion" mode at simplification
between: only SI, none, default...
2020-06-04 14:50:01 +02:00
Émilie Feral
d805c59202 [poincare] Fix extractUnit into removeUnit paradigm 2020-06-04 14:50:01 +02:00
Émilie Feral
4e2da5de05 [poincare] Add crashing tests on units 2020-06-04 14:50:01 +02:00
Émilie Feral
38659587f5 [poincare] Multiplication::shallowBeautify: fix typo (fix tests) 2020-06-04 14:50:01 +02:00
Émilie Feral
56c45d1390 [poincare] Parsing: expression -> expression is always parsed but return
"undef" when the left expression is neither a custom variable or
function nor a unit.
This makes the behaviour consistent on theses expressions:
2 -> a+a
2 -> 2*a
2020-06-04 14:50:01 +02:00
Émilie Feral
e4848a7535 [apps/calculation] HistoryController: favour understandable code 2020-06-04 14:50:01 +02:00
Ruben Dashyan
266482ef99 [apps/calculation] Additional outputs for Unit 2020-06-04 14:50:01 +02:00
Ruben Dashyan
f8050f0673 [poincare/symbol_abstract] Remove redundant code
This case is already handled in shallowReduce of Function and Symbol
2020-06-04 14:50:01 +02:00
Ruben Dashyan
407ce0534c [poincare/expression] Use extractUnits instead of hasUnit when possible 2020-06-04 14:50:01 +02:00
Ruben Dashyan
f227cd719f [poincare/multiplication] Use extractUnits instead of splitIntoNormalForm in shallowBeautify 2020-06-04 14:50:01 +02:00
Ruben Dashyan
914bb38a8e [poincare/test/helper] Do not beautify in assert_simplify helper function
Simplifying a Store expression does not generally reduce the children,
so the children should probably not be beautified ?
2020-06-04 14:50:01 +02:00
Ruben Dashyan
c71cce2957 [poincare/test] Factor assertions 2020-06-04 14:50:01 +02:00
Ruben Dashyan
651b705dbd Revert "[poincare/expression] deepBeautify bubbles up Undefined children"
This reverts commit 300399fe4d.

Not necessary anymore to bubble up Undefined children in deepBeautify
since Unit::shallowBeautify does not introduce any Undefined Expression.
2020-06-04 14:50:01 +02:00
Ruben Dashyan
01b94f8543 [poincare/unit] Units homogeneity is already handled in each Expression subclass
specifically if needed or generically in defaultHandleUnitsInChildren
2020-06-04 14:50:01 +02:00
Ruben Dashyan
7ef28a93bc [poincare/multiplication] Do not expand Multiplication in presence of units 2020-06-04 14:50:01 +02:00
Ruben Dashyan
bf9653d510 [poincare/expression] Turn getUnit into extractUnits
Addition::shallowReduce factors the unit across its terms.
Previously expressions of the form 1_m+π_m were reduced to undef.
2020-06-04 14:50:01 +02:00
Ruben Dashyan
94e1fdfc7a [poincare/test/simplification] Uncomment passing tests 2020-06-04 14:50:01 +02:00
Ruben Dashyan
f2bfc7ec9b [poincare/expression] Remove redundancies in getUnit 2020-06-04 14:50:01 +02:00
Ruben Dashyan
9a762f1bf6 [poincare] A (Power of) Unit must not be orphan 2020-06-04 14:50:01 +02:00
Ruben Dashyan
c12ab3a2e2 [poincare/multiplication] Simplify shallowBeautify 2020-06-04 14:50:01 +02:00
Ruben Dashyan
2895d365a6 [poincare/multiplication] Make sure a Multiplication is not made of (Power of) Units only 2020-06-04 14:50:01 +02:00
Ruben Dashyan
4d1129b0db [poincare/multiplication] Reorder steps in shallowBeautify 2020-06-04 14:50:01 +02:00
Ruben Dashyan
b8786dd32c Revert "[poincare/multiplication] Fix handling of units with non-integer exponent"
This reverts commit 50f1ee9721.

Since Power::shallowReduce now checks that the exponent of a Unit is an
Integer, instead of Unit::shallowBeautify, there is no need anymore to
handle that in Multiplication::splitIntoNormalForm.
2020-06-04 14:50:01 +02:00
Ruben Dashyan
1351babe37 [poincare] Move Power vs Unit checks to Power::shallowReduce 2020-06-04 14:50:01 +02:00
Ruben Dashyan
fa1235939b [poincare/multiplication] Correct cast 2020-06-04 14:50:01 +02:00
Ruben Dashyan
c181650922 [poincare/multiplication] Simplify privateShallowReduce 2020-06-04 14:50:01 +02:00
Ruben Dashyan
f224ac31e3 [poincare/n_ary_expression] Add TODO about mergeSameTypeChildrenInPlace 2020-06-04 14:50:01 +02:00
Ruben Dashyan
965e3b1d9a [poincare/n_ary_expression] Factor mergeMultiplicationChildrenInPlace
from Multiplication to NAryExpression so as to use it in Addition
2020-06-04 14:50:01 +02:00
Ruben Dashyan
43327e482e [poincare/multiplication] Use mergeChildrenAtIndexInPlace instead of mergeMultiplicationChildrenInPlace 2020-06-04 14:50:01 +02:00
Ruben Dashyan
4558e777c8 [poincare/multiplication] Remove old TODO 2020-06-04 14:50:01 +02:00
Ruben Dashyan
0c4434d088 [poincare/expression] getUnit returns an uninitialized Expression
when there is no Unit instead of Undefined
2020-06-04 14:50:01 +02:00
Ruben Dashyan
f5b964339c [poincare/test/expression_properties] Fix helper assert_reduced_expression_unit
First reduce
Then getUnit
2020-06-04 14:50:01 +02:00
Ruben Dashyan
2fea3c9b3a [poincare/addition] Addition has no Unit 2020-06-04 14:50:01 +02:00
Ruben Dashyan
121e16a6a5 [poincare/absolute_value] AbsoluteValue has no Unit
shallowReduce returns Undefined if its unique child has a Unit
2020-06-04 14:50:01 +02:00
Ruben Dashyan
032723eae1 [poincare/layout_node] Remove unused variable 2020-06-04 14:50:01 +02:00
Ruben Dashyan
8365735f98 [apps/calculation/additional_outputs/expression_list_controller] Computed Layouts must not be uninitialized 2020-06-04 14:50:01 +02:00
Ruben Dashyan
a31524173f [apps/calculation/history_controller] Factor handleEvent 2020-06-04 14:50:01 +02:00
Ruben Dashyan
a3265996fe [apps/calculation/history_controller] Factor handleEvent 2020-06-04 14:50:01 +02:00
Ruben Dashyan
f3bcedd43d [apps/calculation/history_controller] Simplify and harmonize handleEvent 2020-06-04 14:50:01 +02:00
Ruben Dashyan
167827f0e4 [apps/calculation] EditExpressionController accesses subview directly 2020-06-04 14:50:01 +02:00
Ruben Dashyan
63ab8710b9 [apps/calculation] Factor EditExpressionController::insertTextBody 2020-06-04 14:50:01 +02:00
Ruben Dashyan
145381ad4b [apps/calculation/additional_outputs] Remove parentResponder parameter from ListControllers' constructor
which was always set to nullptr
2020-06-04 14:50:01 +02:00
Ruben Dashyan
e018c9ddc8 [poincare/trigonometry_cheat_table] Reorder parameter names correctly 2020-06-04 14:50:01 +02:00
Ruben Dashyan
b8993eafa9 [poincare/expression] Call reduce instead of deepReduce 2020-06-04 14:50:01 +02:00
Ruben Dashyan
8e71e03b6e [poincare] Remove ostream and iostream header inclusions and keep them precisely where needed 2020-06-04 14:50:01 +02:00
Ruben Dashyan
b05202f2ec [poincare] Remove stdio.h inclusions 2020-06-04 14:50:01 +02:00
Ruben Dashyan
e03c628381 [poincare/multiplication] shallowBeautify builds Unit only if necessary 2020-06-04 14:50:01 +02:00
Ruben Dashyan
e43362eee0 [poincare/multiplication] Factor CanSimplifyUnitProduct 2020-06-04 14:50:01 +02:00
Ruben Dashyan
9cbbffcdd6 [poincare/multiplication] shallowBeautify builds Power only if necessary 2020-06-04 14:50:01 +02:00
Ruben Dashyan
94bad10ddb [poincare/multiplication] CanSimplifyUnitProduct gets int8_t entryUnitExponent parameter instead of operationOnExponents 2020-06-04 14:50:00 +02:00
Ruben Dashyan
79a81968c8 [poincare/unit] Avoid cloning expression in Dimension::Vector::FromBaseUnits 2020-06-04 14:50:00 +02:00
Ruben Dashyan
2f708cc36c [poincare/unit] Dimension::Vector::FromBaseUnits accepts only products of powers of base units
and no other factor at all
2020-06-04 14:50:00 +02:00
Ruben Dashyan
394e86a28a [poincare] Unit::Dimension holds a Vector
The Vector does not need to be recomputed from a Representative's
definition, which requires parsing and time-consuming reduction.
2020-06-04 14:50:00 +02:00
Ruben Dashyan
d7dab2ae99 [poincare/multiplication] bestUnitNorm not necessary anymore 2020-06-04 14:50:00 +02:00
Ruben Dashyan
191680d96f [poincare/multiplication] Simplify Unit::Dimension::Vector::Metrics comparison 2020-06-04 14:50:00 +02:00
Ruben Dashyan
67241bb564 [poincare] Make code more object oriented
Turn ExponentsOfBaseUnits function into a static method of the
Unit::Dimension::Vector class
2020-06-04 14:50:00 +02:00
Ruben Dashyan
b6d07cbd90 [poincare] Make code more object oriented
Turn ExponentsOfBaseUnits function into a method of the
Unit::Dimension::Vector class
2020-06-04 14:50:00 +02:00
Ruben Dashyan
e2cdf78605 [poincare] Define and use Unit::Dimension::Vector::Metrics 2020-06-04 14:50:00 +02:00
Ruben Dashyan
2f6770cd69 [poincare/multiplication] Change signature of ExponentsOfBaseUnits 2020-06-04 14:50:00 +02:00
Ruben Dashyan
0eb6df27dc [poincare] Turn Unit::Dimension::Vector type into a struct 2020-06-04 14:50:00 +02:00
Ruben Dashyan
202beb3b13 [poincare/unit] Add comment about namespace and scope usage 2020-06-04 14:50:00 +02:00
Ruben Dashyan
2fa71e4350 [poincare] Define and use Unit::NumberOfBaseUnits instead of magic number 2020-06-04 14:50:00 +02:00
Ruben Dashyan
be2892eae5 [poincare] Define Unit::Dimension::Vector type 2020-06-04 14:50:00 +02:00
Ruben Dashyan
157d74c0da [poincare/unit] Coding style 2020-06-04 14:50:00 +02:00
Ruben Dashyan
f01f91d000 [poincare/unit] Clean serialize
The prefix should be correct at that point and it should not be
necessary to check whether the prefix is allowed.
2020-06-04 14:50:00 +02:00
Ruben Dashyan
bc0b21463e [quiz][ion/test] Move time measurements to quiz
to be able to do measurements in any test
2020-06-04 14:50:00 +02:00
Léa Saviot
068ed96d79 [apps/range_1D] Add comment abour k_minFloat 2020-06-04 14:50:00 +02:00
Léa Saviot
ed753b793b [apps/statistics] Do not initRangeParameters too often 2020-06-04 14:50:00 +02:00
Léa Saviot
51b5edbe69 [apps/statistics] Remove too strict condition
One could not set the bin with / x start to a value that would not show
any data
-> The condition was asymetrical, as nextFirstDrawnBarAbscissa could not
be higher to the biggest data, but could have been too small to display
any data
-> We restricted the user
2020-06-04 14:50:00 +02:00
Léa Saviot
59aea9ca83 [apps/statistics] Factorize HistogramParamCtrlr::setParamAtIdx 2020-06-04 14:50:00 +02:00
Léa Saviot
250f4ec3dd [apps/statistics] Clean code 2020-06-04 14:50:00 +02:00
Léa Saviot
93d687abc2 [apps/calculation] Fix height computation in additional results 2020-06-04 05:47:55 -07:00
Émilie Feral
884d9890cf [.github/workflow] ci-workflow: update setup-emscripten to v2 2020-06-04 09:37:11 +02:00
Quentin
6f2ed02d07 [Fix] CI 2020-06-02 18:56:19 +02:00
Quentin
b2e5d1ef15 [Update] RPN 2020-06-02 18:42:37 +02:00
Quentin
482c7df15d [Update] RPN 2020-06-02 14:08:35 +02:00
Joachim Le Fournis
899e0d4a6b [apps/shared] Fixed a small mistake in parameter_text_field_delegate.cpp
In this commit, there was a small oversight in 7a4ee746b2, which caused https://github.com/numworks/epsilon/issues/1570
2020-05-29 02:27:48 -07:00
Léa Saviot
b034f8e054 [apps/calculation] Fix history navigation
When calculations span on two lines, better selection
2020-05-28 04:44:27 -07:00
Léa Saviot
a56a73b0ba [apps/calculation] Fix calculation height computation
It was done in two places before, which created inconsistencies
2020-05-28 04:44:27 -07:00
Léa Saviot
0379327b06 [apps/calculation] Geographic navigation in the history 2020-05-28 04:44:27 -07:00
Léa Saviot
1d3a949b6f [apps/shared] Add escape case 2020-05-28 04:44:27 -07:00
Léa Saviot
e2f4b30b84 [apps/calculation] Remove unused variable 2020-05-28 04:44:27 -07:00
Léa Saviot
c4908c2bd9 [apps/calculation] Fix bottom calculation margin
Scenario: enter a calculation that uses two lines, the margin on the
bottom is too big
2020-05-28 04:44:27 -07:00
Léa Saviot
5535145b51 [apps/calculation] Calculation on 2 lines if does not fit when expanded
Scenario: 1+1+1+1+1+1+1+10.5 fits on one line when not expanded, but
when the exact result is displayed not -> we thus always display it on
two lines
2020-05-28 04:44:27 -07:00
Léa Saviot
feee0a673c [apps/calculation] HistoryViewCell cleaning 2020-05-28 04:44:27 -07:00
Léa Saviot
6948011ae0 [apps/calculation] Handle navigation in single lined output 2020-05-28 04:44:27 -07:00
Léa Saviot
579485c8c0 [apps/calculation] CanBeSingleLine differs if args are view/layout sizes
If the sizes are for layouts, we need to add the margins added by the
views.
2020-05-28 04:44:27 -07:00
Léa Saviot
4f50a72abf [apps/calculation] Clean Calculation::height 2020-05-28 04:44:27 -07:00
Léa Saviot
11c39b6206 [apps/calculation] Calculation::height has two types of margin arguments
One for the margin between layouts and on top / at the bottom of the
cell, the other for the margin surrounding each layout.
2020-05-28 04:44:27 -07:00
Léa Saviot
78cac6ddae [apps/calculation] Calculation::height has CanBeSingleLine argument 2020-05-28 04:44:27 -07:00
Léa Saviot
1c2801907f [apps/calculation] Factorize and clean code 2020-05-28 04:44:27 -07:00
Léa Saviot
30c243e2e4 [apps/scrollable_multiple_expressions_view] Factorize baseline() 2020-05-28 04:44:27 -07:00
Léa Saviot
525290427a [apps/calculation] Calculation::height takes verticalMargin argument 2020-05-28 04:44:27 -07:00
Léa Saviot
7ccaf3fc50 [apps/calculation] Rename allExpressionsInline to forceSingleLine 2020-05-28 04:44:27 -07:00
Léa Saviot
5a68b44aa1 [apps/calc] Merge SingleLine and allExpressionsInline behaviours 2020-05-28 04:44:27 -07:00
Léa Saviot
c3d8520e73 [apps/calculation] Remove unnecessary bool 2020-05-28 04:44:27 -07:00
0b101
b48d3d6e4a Added a new compact result display mode 2020-05-28 04:44:27 -07:00
Joachim Le Fournis
67fc7502e2 [App/zoom_parameter_controller] Add comment
See : https://github.com/numworks/epsilon/pull/1548#discussion_r425708055
2020-05-22 00:42:05 -07:00
Joachim Le Fournis
f1209bcf76 [App/zoom_parameter_controller] Changed subview order
This fixes #500
2020-05-22 00:42:05 -07:00
Émilie Feral
7f3f67aba0 [python] Clean type confusion 2020-05-18 14:39:46 +02:00
Émilie Feral
4e1f7c1cb8 [python] Fix comment 2020-05-18 14:39:46 +02:00
Émilie Feral
4cd0d20585 [ion] Fix comment 2020-05-18 14:39:46 +02:00
Émilie Feral
0f61b2ccf3 [ion] Add comment on default collectRegisters implementation 2020-05-18 14:39:46 +02:00
Émilie Feral
3f6647f3ae [ion][python] Implement an architecture-dependant collect_registers.
setjmp is not guaranteed to collect all registers without modification
on all platforms.

This fixes the following bug: when the pointer of a newly allocated
object on the Python heap is stored in rpb registers on x86_64 arch, it
was not collected by the garbarge collector.
2020-05-18 14:39:46 +02:00
Émilie Feral
5a32006dcd [python] Revert: collectRoots does not need to look for unaligned
pointers as they should not exist
2020-05-18 14:39:46 +02:00
Émilie Feral
3f5487ca90 [python] Forbid inlining on gc_collect to avoid missing some roots 2020-05-18 14:39:46 +02:00
TheTrueBrot
055f8bf1bd Fixed a small mistake in the german Translation 2020-05-15 02:54:34 -07:00
Léa Saviot
e7988b9fa2 [apps/round_cursor_view] Add comment about flaw in algorithm 2020-05-15 02:52:54 -07:00
Léa Saviot
a0c5a1fe1c [apps] InteractCurveVwCtlr::addMargin adds more than the required margin 2020-05-15 02:52:54 -07:00
Léa Saviot
ee78948cf8 [apps/interactive_curve_view_range] Clean panToMakePointVisible 2020-05-15 02:52:54 -07:00
Léa Saviot
456cd3c73a Revert "[apps] Add FLT_EPSILON in float comparisons in interactive_curve_vw_rge"
This reverts commit 18381fd334.
2020-05-15 02:52:54 -07:00
Léa Saviot
016f87c266 [escher/layout_field] Reset the scroll when clearing the layout
Scenario: Go to the graph app, create f(x) = 1 then create g(x) -> there
is a weird big margin in the edition field
2020-05-15 02:39:11 -07:00
Léa Saviot
73c55f0437 [apps/regression] Add test for proportional_regression 2020-05-13 15:25:33 +02:00
Léa Saviot
21a4139c19 [apps/regression] Clean partialDerivate of the models 2020-05-13 15:25:33 +02:00
Léa Saviot
980a62da6c [apps/regression] Clean proportional_model.cpp 2020-05-13 15:25:33 +02:00
Léa Saviot
588533fadf [apps/regression] Remove r and r2 for Proportional regression 2020-05-13 15:25:33 +02:00
Léa Saviot
2e5e2a3258 [apps/regression] Rename Affine -> Linear and Linear -> Proportional 2020-05-13 15:25:33 +02:00
Joachim LF
740e9e9d12 [Regression] Fixed affine and linear name errors 2020-05-13 15:25:33 +02:00
Joachim LF
5297f28ffa [Regression] Switched affine and linear 2020-05-13 15:25:33 +02:00
Joachim LF
833f6ec778 [Regression] Add affine regression 2020-05-13 15:25:33 +02:00
Émilie Feral
c955f45457 [escher] View: remove useless virtual destructor 2020-05-12 13:19:28 +02:00
Quentin
ebf836e361 Merge pull request #336 from M4xi1m3/omega-dev-exthome
External apps on home menu
2020-05-11 14:13:46 +02:00
Quentin
f16918ba1a Merge pull request #335 from M4xi1m3/fast-lto
[build] Enable jobserver lto.
2020-05-11 14:12:58 +02:00
Romain Goyet
a07ab8015e [apps/calculation] Correct insert in fractions 2020-05-11 10:34:28 +02:00
Romain Goyet
884e53f75d [escher/layout_field] Add a comment 2020-05-11 10:34:28 +02:00
Romain Goyet
213d80002c [escher/layout_field] Insertion event can be customized 2020-05-11 10:34:28 +02:00
Romain Goyet
fc4b0a8d35 [escher] Add an insertionField in LayoutField 2020-05-11 10:34:28 +02:00
Charlotte THOMAS
0f2f51cdf4 A stop to the imparialism of the US Units
A constant rule the total number of units
Passed the lbs and inch as base units to avoid unwanted conversion from SI to imperial ones
2020-05-08 18:20:57 +02:00
Léa Saviot
efe5b4d6f8 [ion/storage] Private constructor and cleaner sharedStorage() 2020-05-07 06:22:42 -07:00
M4x1m3
befe0b8214 [build] Enable jobserver lto. 2020-05-07 09:24:26 +02:00
Léa Saviot
bbb8308a6d [poincare/normal_distribution] More values are computed
We limited the precision too much before.
2020-05-06 01:01:58 -07:00
Quentin
1d7a83526c Merge pull request #334 from M4xi1m3/omega-dev
[apps/external] Fixed extapps not displayed on device since #333
2020-05-05 16:43:10 +02:00
M4x1m3
2ae312c703 [apps/external] Added icon support, fixed stuff. 2020-05-05 16:17:03 +02:00
M4x1m3
becada912a [app/external] External apps on home menu. 2020-05-05 16:17:03 +02:00
M4x1m3
efac211a13 [apps/external] Fixed extapps not displayed on device since #333 2020-05-05 11:42:48 +02:00
Joachim Le Fournis
480459ab19 Changed setRecompute() to forceRecompute()
See https://github.com/numworks/epsilon/pull/1538#discussion_r419255425
2020-05-04 01:16:04 -07:00
Joachim Le Fournis
9e8229e767 [Interval] Removed useless getter
See https://github.com/numworks/epsilon/pull/1538#discussion_r419252679
2020-05-04 01:16:04 -07:00
Joachim LF
43bceac2c9 [Interval] Coding style on compute 2020-05-04 01:16:04 -07:00
Joachim LF
f250311856 [Interval] Patch the need recomputing 2020-05-04 01:16:04 -07:00
sagessylu
a52202fa90 put accents in toolbox French translation 2020-05-04 01:15:46 -07:00
Émilie Feral
9b419acf40 [python] kandinsky port: rename TupleForRGB to TupleForKDColor 2020-04-30 14:12:32 +02:00
Émilie Feral
25b2ff31c2 [apps/code] Simplify colormode entry in toolbox 2020-04-30 14:12:32 +02:00
Émilie Feral
4bca330f0d [python] Coding style 2020-04-30 14:12:32 +02:00
Émilie Feral
0811221943 [python] Clean port ColorParser 2020-04-30 14:12:32 +02:00
Émilie Feral
7c24f2fc28 [python] Coding style 2020-04-30 14:12:32 +02:00
Émilie Feral
ba15415847 [python] modturtle: avoid unexpected cast 2020-04-30 14:12:32 +02:00
Émilie Feral
4f99aa709a [apps/code] Add colormode to Toolbox: in Catalog and Turtle module 2020-04-30 14:12:32 +02:00
Émilie Feral
686a1493e5 [python] Coding style 2020-04-30 14:12:32 +02:00
Émilie Feral
e7df25d558 [python] Kandinsky module: color accepts "#FF0000", "red" kinds of
arguments
2020-04-30 14:12:32 +02:00
Émilie Feral
af0cdbcc1b Coding style 2020-04-30 14:12:32 +02:00
Émilie Feral
1b0b9e48f5 [python] ColorParser: add a TODO 2020-04-30 14:12:32 +02:00
Émilie Feral
8f5fa50f22 [python] Color: avoid magic number 255, clean code of ColorParser and
Turtle::colormode
2020-04-30 14:12:32 +02:00
Émilie Feral
c920df1f76 [python] Change enum class name: ColorModes --> ColorMode 2020-04-30 14:12:32 +02:00
Émilie Feral
995cc04533 [python] Use of mp_obj_is_str instead of MP_OBJ_IS_STR for more
consistency
2020-04-30 14:12:32 +02:00
Émilie Feral
a564efcaa5 [python] Fix bug in ParseColor 2020-04-30 14:12:32 +02:00
Émilie Feral
3d1b3f9a0b [python] Factorize implementation of pencode (Turtle module) 2020-04-30 14:12:32 +02:00
Émilie Feral
f5e8d4d9bb [python] Avoid modifying micropython external source, use parsenum.h methods directly 2020-04-30 14:12:32 +02:00
Joachim LF
e76abcf67e [Python] universal colors 2020-04-30 14:12:32 +02:00
Léa Saviot
061fe05b40 [poincare/normal_distribution] Fix StandardNormalCumulDistFuncAtAbs 2020-04-28 02:52:17 -07:00
TheTrueBrot
2768c143c8 Fix a mistake in German translation 2020-04-28 02:17:54 -07:00
Émilie Feral
2d0d4a3a8d [apps] Fix misc errors in German translation 2020-04-27 15:29:05 +02:00
M4x1m3
4434b528f6 [ion/3ds] LED driver 2020-04-26 12:50:48 +02:00
Maxime FRIESS
bb9f52b355 [Feature] Made external app testable on simu again. (#333)
Build with make PLATFORM=simulator FORCE_EXTERNAL=1 EXTERNAL_BUILTIN=1
2020-04-24 16:00:06 +02:00
M4x1m3
b169c3dc2d [ion/3ds] Cleaning, added support for battery and USB. Now can quit exam mode. 2020-04-21 22:08:13 +02:00
M4x1m3
1919933f8d [ion/3ds] Cleaning, non-debug keyboard, can exit now. 2020-04-21 22:08:10 +02:00
M4x1m3
18ad90e2d3 [ion/3ds] Added smdh data to the 3dsx 2020-04-21 22:08:04 +02:00
M4x1m3
e20cbaa4af [ion/3ds] Produces .3dsx file. 2020-04-21 22:08:00 +02:00
M4x1m3
460987e9a7 [poincare] Made the simu build again on linux. 2020-04-21 22:07:50 +02:00
maximilianwalter
0b488bc548 Update toolbox.de.i18n 2020-04-21 06:45:17 -07:00
maximilianwalter
b87674ab73 Update toolbox.de.i18n 2020-04-21 06:45:17 -07:00
maximilianwalter
de7aaeb188 Update base.de.i18n 2020-04-21 06:45:17 -07:00
maximilianwalter
37b876a941 added equivalents 2020-04-21 06:45:17 -07:00
maximilianwalter
7b40f55973 added equivalents 2020-04-21 06:45:17 -07:00
M4x1m3
e8740edb04 [ion/3ds] Modified the build system to work with epsilon master 2020-04-19 15:29:21 +02:00
M4x1m3
f7609e0001 [poincare] Made the simu build again on linux. 2020-04-19 15:23:29 +02:00
M4x1m3
b49af643ef [ion/3ds] Added keyboard support. 2020-04-19 15:23:26 +02:00
M4x1m3
0deb74b47b [ion/3ds] Added button support. 2020-04-19 15:23:16 +02:00
M4x1m3
3f976d3873 [ion/3ds] Got something on screen! 2020-04-19 15:23:10 +02:00
M4x1m3
2f01603c4d [ion/3ds] Got it to build. 2020-04-19 15:23:04 +02:00
Quentin
13874cd2e0 Merge branch 'omega-hotfix' into omega-dev 2020-04-16 14:24:47 +02:00
Quentin
3013dda9d6 [Fix] Conflicts 2020-04-16 14:12:38 +02:00
Quentin
0d88a5ac70 Merge branch 'RedGl0w-RevertPercent' into omega-hotfix 2020-04-16 14:05:58 +02:00
Quentin
a7a212c652 Merge branch 'RevertPercent' of https://github.com/RedGl0w/epsilon into RedGl0w-RevertPercent 2020-04-16 14:05:11 +02:00
Quentin
f37040dc8a [Fix] Conflicts 2020-04-16 14:04:56 +02:00
Émilie Feral
61399d07eb [python] Turtle: use std::fabs std::copysign when possible 2020-04-16 09:44:37 +02:00
Émilie Feral
675a0d3f4c Add missing definition of static member variables 2020-04-15 10:34:00 -04:00
Léa Saviot
c2bd19d9a1 [apps/solver] Fix polar tests 2020-04-15 09:16:32 -04:00
Léa Saviot
9988447b9a [poincare] Expression::isIdenticalToWithoutParentheses 2020-04-15 09:16:32 -04:00
Romain Goyet
56f3204a17 [apps/solver] Fix the polar tests 2020-04-15 09:16:32 -04:00
Romain Goyet
240e60cb68 [liba] Include strlcat in the bridge too 2020-04-15 09:16:32 -04:00
Romain Goyet
870d704e7f [apps/solver] Rewrite the tests to they can be read by a human being 2020-04-15 09:16:32 -04:00
Romain Goyet
2e6dec5f1d [libaxx] initializer_list use size_t 2020-04-15 09:16:32 -04:00
Romain Goyet
5faa251c1f [apps/solver] Quiz assertion are supposed to run in release mode too 2020-04-15 09:16:32 -04:00
Émilie Feral
42d643aa7e [apps/settings] improve German locale 2020-04-15 09:15:37 -04:00
Joachim LF
c15bb3d893 Negative diameter circle turtle support 2020-04-15 06:15:28 -07:00
Émilie Feral
dcfabf754d [ion] Init random seed with time in simulator main 2020-04-15 09:11:52 -04:00
Émilie Feral
870dd868e9 [ion] Tidy files:
- move from shared to simulator/shared
- delete files used only be deprecated blackbox
2020-04-15 09:11:52 -04:00
Romain Goyet
4d981fbfb6 [poincare] Define a member variable even if it's kind of useless
https://stackoverflow.com/questions/8016780/undefined-reference-to-static-constexpr-char
2020-04-14 09:31:02 -04:00
Romain Goyet
84768472bd Explicit std::min/max template usage
This is unfortunately required in several cases:
 - Sometimes when we use either float and double (this should be changed)
 - Because KDCoordinate is not an int, so any arithmemtic promotes it to
an int
 - Because we mix pointer differences and ints
2020-04-14 09:31:02 -04:00
Romain Goyet
c71dcca691 [apps/code] Consistently use size_t 2020-04-14 09:31:02 -04:00
Romain Goyet
644c44e069 Misc cleanups 2020-04-14 09:31:02 -04:00
Romain Goyet
950862f8d0 Use std::min and std::max 2020-04-14 09:31:02 -04:00
Romain Goyet
77ee5126e1 [libaxx] Add algorithm
Only contains a super simple min and max implementation
2020-04-14 09:31:02 -04:00
Aleks ANDRÉ
1839a91982 Terminologie lycée FR
Références :
* [Seconde](https://cache.media.education.gouv.fr/file/SP1-MEN-22-1-2019/95/7/spe631_annexe_1062957.pdf)
* [Première](https://cache.media.education.gouv.fr/file/SP1-MEN-22-1-2019/16/8/spe632_annexe_1063168.pdf)
* [Terminale (spécialité)](https://cache.media.education.gouv.fr/file/SPE8_MENJ_25_7_2019/90/7/spe246_annexe_1158907.pdf )
* [Terminale (complémentaire)](https://cache.media.education.gouv.fr/file/SPE8_MENJ_25_7_2019/13/4/spe265_annexe_1159134.pdf)
* [Terminale (experte)](https://cache.media.education.gouv.fr/file/SPE8_MENJ_25_7_2019/82/5/spe264_annexe_1158825.pdf)
2020-04-14 03:36:05 -07:00
Romain Goyet
196a94e199 [ci] Report .text, .rodata, .bss and .data sections
Note that .text and .rodata are cumulative (internal+external)
2020-04-14 01:44:35 -07:00
Romain Goyet
56f4b275a5 [python] Turn a warning into a error when appropriate 2020-04-14 01:17:25 -07:00
Romain Goyet
cbb0110c2f [liba] Define UINT8_MAX
This will be needed in python to check that some QSTRs aren't too big.
And it doesn't cost anything to add it straight away.
2020-04-14 01:17:25 -07:00
Romain Goyet
8a43b17df9 [python] Reorder QSTRs to match an implicit assertion in uPy
In py/scope.c, an assertion is made that some qstrs should be "low".
Let's make sure it is indeed the case.

Note: https://github.com/micropython/micropython/pull/5903
2020-04-14 01:17:25 -07:00
Joachim LF
53743ab531 Revert percent 2020-04-11 19:06:40 +02:00
Romain Goyet
807dd73e7b [poincare] Use a Tuple instead of an ArrayBuilder for expression
The Tuple is simply an initializer_list along with a convenience method
to cast between a list of TreeHandle and a list of Expression
2020-04-10 13:35:14 -04:00
Romain Goyet
1bd6105a0a [libaxx] Add initializer_list 2020-04-10 13:35:14 -04:00
Émilie Feral
e1b9703a2e [.github] workflows: don't launch the windows executable from msys2 2020-04-10 13:34:00 -04:00
Émilie Feral
ec5587904f [poincare] Unit: double comparison should be done with care. On windows
platform pow(10.0, -6.0) leads to small loss of precision and eventually
to beautify(_Mg) --> _t
2020-04-10 13:34:00 -04:00
Émilie Feral
8c844a772b [poincare] Fix tests to be passed on windows platform (approximation
issues)
2020-04-10 13:34:00 -04:00
Émilie Feral
499d0a8292 [.github/workflows] Crash of the tests on windows should trigger a CI
failure
2020-04-10 13:34:00 -04:00
Léa Saviot
e6ce3ca249 [apps] GET_OPT uses generated i18n language codes to find language 2020-04-10 04:46:22 -07:00
Léa Saviot
2ed354710f [build/simulator] NDEBUG flag in release mode
This way, asserts are not performed on simulator platforms
2020-04-10 00:49:15 -07:00
Joachim Le Fournis
4a9bfca1f6 [ion] Alpha-locked percent becomes backspace 2020-04-09 12:09:03 -04:00
Émilie Feral
8dbe719a68 [Build] Add address sanitizer option if ASAN=1 2020-04-09 15:14:30 +02:00
Joachim LF
a4af2942e6 [Fix] Conflicts 2020-04-09 14:52:49 +02:00
Émilie Feral
f2efd46814 [build] defaults.mak: don't override previously-added SFLAGS 2020-04-09 14:30:57 +02:00
Léa Saviot
449b1a4fc4 [liba/openbds] Use OpenBSD and not FreeBSD s_erff.c and s_logbf.c files 2020-04-09 13:58:56 +02:00
Léa Saviot
49cd841f99 [poincare/test] Increase some test precisions 2020-04-09 13:58:56 +02:00
Léa Saviot
44fb06890e [poincare/test] Reduce asin(-1) approximation test precision
Now the computation is really done in floats
2020-04-09 13:58:56 +02:00
Neven Sajko
dd6a729f65 Better usage of some floating point constants 2020-04-09 13:58:56 +02:00
Neven Sajko
201ecaef5b Performance fixes relating to floating point: erf and erfc
erf and erfc are missing float versions, so I import them from
openlibm. erf is used from Poincare::NormalDistribution::
StandardNormalCumulativeDistributiveFunctionAtAbscissa<float>, and erfc
is used (?) just from MicroPython.

To clarify, if there is no float version of a function like erf, but
there is a double version, C++ promotes the possible float parameter to
double and soft-float hilarity ensues.
2020-04-09 13:58:56 +02:00
Neven Sajko
c0c73accef [probability] Prevent soft-float in StudentDistribution::lnCoefficient 2020-04-09 13:58:56 +02:00
Neven Sajko
bdc5be94b6 Performance fixes relating to floating point
Removes unneccesary usage of soft-float double usage. The reason for the
useless double math being done were broken standard C++ functions:
atanh<float>, sqrt<float>, asinh<float>, operator/<float>. This was in
turn caused by missing float versions of C++ functions hypot, atan2,
logb, scalbn.

A logbf implementation was missing from the libm, so I added one from
openlibm.
2020-04-09 13:58:56 +02:00
Neven Sajko
c92b770112 Performance fixes relating to floating point constants
This replaces unnecessary double-precision soft-float operations with
single-precision floating-point operations, mainly by casting.

In a couple places I also replace a function call with a constant.
2020-04-09 13:58:56 +02:00
Émilie Feral
068325d151 Coding style: remove unecessary 'virtual' keyword when 'override' is
present 2/2
2020-04-09 11:36:51 +02:00
Émilie Feral
82c4936e04 Coding style: remove unecessary 'virtual' keyword when 'override' is
present 1/2
2020-04-09 11:36:51 +02:00
Romain Goyet
64a1094edf [escher/layout_field] Use IsMoveEvent 2020-04-09 09:47:43 +02:00
Romain Goyet
ec4def61c3 [escher/layout_field] Avoid calling the same method over and over again 2020-04-09 09:47:43 +02:00
Quentin
e383c3429f [Fix] Conflicts 2020-04-08 15:05:17 +02:00
Quentin
e77e26e2de Merge branch 'RedGl0w-patch-1' into omega-hotfix 2020-04-08 13:47:41 +02:00
Quentin
765ac98044 Merge branch 'patch-1' of https://github.com/RedGl0w/epsilon into RedGl0w-patch-1 2020-04-08 13:44:04 +02:00
Joachim Le Fournis
ded69970ab Update extapp_api.cpp 2020-04-08 13:35:26 +02:00
Quentin
53d9a9ec25 [GitHub] Remove metrics workflow 2020-04-08 13:33:42 +02:00
Joachim Le Fournis
68f6bbc378 Update Makefile 2020-04-08 13:23:59 +02:00
Quentin
26d68c8039 [Update] Upstream 2020-04-08 12:48:09 +02:00
Quentin
883d1312a3 [Fix] Fix compilation crash 2020-04-08 12:37:02 +02:00
Jean-Baptiste Boric
2f61b823d0 [poincare] Remove statically-allocated buffers 2020-04-08 10:09:47 +02:00
Jean-Baptiste Boric
2768ac2b48 [escher] Remove statically-allocated buffers 2020-04-08 10:09:47 +02:00
Jean-Baptiste Boric
64d0b3107f [apps] Remove statically-allocated buffers 2020-04-08 10:09:47 +02:00
FloMiau
b59085bd7f Update German language file
replace "Testmodus" with "Prüfungsmodus"
Real: "Reel" -> "Reell"
Gradians: "Gone" -> "Gon"
2020-04-08 10:09:24 +02:00
Romain Goyet
743eb104bf [ion] Replace Ion::Events::Event::id() by an explicit cast operator 2020-04-08 09:56:33 +02:00
Romain Goyet
35d446353f [escher] Avoid long switches on Left/Up/Right/Down 2020-04-08 09:56:33 +02:00
Romain Goyet
ed7e6bec9d [build/device] Generate a RAM map 2020-04-07 17:15:05 +02:00
David
9272d4e75f Increase Brightness Levels to 12 2020-04-07 15:10:22 +02:00
Quentin
a3e91fd3ff [Fix] Fix conflicts ._. 2020-04-07 15:01:44 +02:00
Quentin
aea963dac0 [Fix] Fix conflicts ._. 2020-04-07 14:53:19 +02:00
Aleks ANDRÉ
3ae1dcd9bf retours à la ligne aidant à la lecture 2020-04-07 14:42:38 +02:00
Émilie Feral
c363231673 [build] --silent option in rule_for_arch_executable prevent from running
'make V=1' and getting the expected output
2020-04-07 14:22:33 +02:00
Aleks ANDRÉ
ee56f02f2b Margin, messages 2020-04-07 13:57:47 +02:00
Aleks ANDRÉ
b30eb20ac2 Margins, message 2020-04-07 13:57:27 +02:00
Aleks ANDRÉ
53e15787cd Margins, message 2020-04-07 13:57:06 +02:00
Aleks ANDRÉ
1fd216c97e Margins, message 2020-04-07 13:56:46 +02:00
Aleks ANDRÉ
73f34f8f3d Relecture
– zéro → racine. Il s’agit de la terminologie du programme de [1re spécialité](https://cache.media.education.gouv.fr/file/SP1-MEN-22-1-2019/16/8/spe632_annexe_1063168.pdf)
– homogénéisation avec autres applications
2020-04-07 13:55:24 +02:00
Aleks ANDRÉ
e399472577 Anglicismes 2020-04-07 13:46:11 +02:00
Quentin
4411f3aeee [Fix] Re-enable all apps 2020-04-07 13:25:11 +02:00
Quentin
d6d235f273 [Feature] Contributors Controller in the Omega App (WIP) 2020-04-07 13:08:31 +02:00
wow
42fa0e7fbc More friendly french translations 2020-04-07 11:46:30 +02:00
Émilie Feral
7df8c2935a [python] upgrade to micropython 1.12 2020-04-07 11:28:32 +02:00
Émilie Feral
010fb1894f [python] Remove mpversion useless header 2020-04-07 11:28:32 +02:00
Émilie Feral
26aab94ac0 [apps/shared] Avoid signed/unsigned int comparison warning 2020-04-07 09:51:39 +02:00
Émilie Feral
e1d7b6bb04 [apps] Avoid unsigned/signed comparison: storeChecksumAtIndex takes an
int as parameter
2020-04-07 09:51:39 +02:00
Émilie Feral
154625a945 [python] Fix warning: comparisons between signed and unsigned integers 2020-04-07 09:51:39 +02:00
Romain Goyet
e314f2eb65 [ci] Use steps to pass the binary_size result 2020-04-06 19:18:47 -04:00
Joachim LF
7e02a90b2a Don't scan not loaded script in toolbox 2020-04-06 18:31:32 +02:00
Joachim LF
77af9ab92b I18NWarn 2020-04-06 18:29:48 +02:00
Neven Sajko
bc7d598517 [ion] do not increment volatile variable in isr_systick
In 2019 a proposal was approved which is deprecating this and other
harmful usage of volatile in C++ in 2020. See web links at the end.

Note that this did not at all change the GCC-generated machine code.

Deprecating volatile (adopted in 2019 for C++20):
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1152r0.html
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1152r4.html

Related, but less relevant:

volatile_load<T> and volatile_store<T>:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1382r1.pdf

Deprecating volatile: library:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1831r0.html
2020-04-06 17:18:03 +02:00
Neven Sajko
1c9b402645 [ion] Remove volatile qualifier from millis return type
Qualification of an integer return type as volatile is ignored by the
compiler. To clarify, an integer value (not a variable), which is what
the return type is, can not be assigned to anyway, so qualification as
volatile does not make sense.
2020-04-06 17:18:03 +02:00
Romain Goyet
e34811ff18 [ci] Report metrics on each PR 2020-04-06 15:29:03 +02:00
Romain Goyet
02738ba06a [build] Add a tool to compare the size of two ELF files 2020-04-06 15:29:03 +02:00
Léa Saviot
efff509e2a [apps/global_preferences] DefaultLanguage is the first of the locales
Not EN, because we might build without the EN locale
2020-04-06 13:35:18 +02:00
Léa Saviot
19b5653851 [apps/i18n] Remove Language::Default
We never translate a i18n message to something else than the currrent
language selected
2020-04-06 13:35:18 +02:00
Émilie Feral
c58456a058 [python] matplotlib: add comment WIP 2020-04-06 12:30:52 +02:00
Émilie Feral
b7392dbd95 [python] matplotlib: clean implementation (by using
mp_obj_float_binary_op)
2020-04-06 12:30:52 +02:00
Émilie Feral
190802aa23 [python] Remove unused duplicate file 2020-04-06 12:30:52 +02:00
Aleks ANDRÉ
5348640925 Traduction 2020-04-06 10:37:34 +02:00
Romain Goyet
bfb39618e1 [poincare] Add some missing std::move 2020-04-06 10:13:14 +02:00
Romain Goyet
84f6b179de [build] rule_for now takes both "local" and "global" parameters
Previous the build would fail on macOS if you had an epsilon.elf file in
at the root of the project. Indeed, the %.elf -> %.bin rule would get
triggered, but this rule should only operate on generated (intermediate)
elf file.
2020-04-06 10:12:54 +02:00
Romain Goyet
7d5cad32b1 [build/all] Q isn't defined (and isn't needed either) 2020-04-06 10:02:06 +02:00
Romain Goyet
edde8e8eba [build/all] Re-sourcing emsdk isn't needed 2020-04-06 10:02:06 +02:00
Romain Goyet
f450e36e65 [build/all] Use the short iOS and Android targets 2020-04-06 10:02:06 +02:00
Romain Goyet
88912be9a8 [build] The all target can live in a standalone Makefile 2020-04-06 10:02:06 +02:00
Romain Goyet
a840e7fb05 [liba] Define SEEK_CUR
For some reason it was defined in Python and raised re-def errors
2020-04-06 09:51:04 +02:00
Romain Goyet
6de90d97a4 [build] Remove duplication of HANDY_TARGETS_EXTENSIONS 2020-04-03 22:26:55 -04:00
Romain Goyet
13b5cd0151 [ci] Build for the iOS Simulator too
This means building an x86_64 binary that will run on a Mac simulating
an iPhone or an iPad
2020-04-03 22:26:55 -04:00
Romain Goyet
1886918900 [ci] Simplify bucket names 2020-04-03 22:26:55 -04:00
Romain Goyet
1b2bbd163b [ion/device] Rename a file 2020-04-03 22:26:55 -04:00
Romain Goyet
f7911bae72 [build] Remove DEFAULT
It was redundant with HANDY_TARGETS and HANDY_TARGETS_EXTENSIONS
2020-04-03 22:26:55 -04:00
Romain Goyet
99b916e179 [build] Share multi-app code 2020-04-03 22:26:55 -04:00
Romain Goyet
f9b0843578 [build/simulator/apple] Share code 2020-04-03 22:26:55 -04:00
Romain Goyet
fff20eb530 [ion/simulator/apple] Rename Make helper 2020-04-03 22:26:55 -04:00
Romain Goyet
d4149b1a3d [build] Move %_run targets in the build dir 2020-04-03 22:26:55 -04:00
Romain Goyet
ed7038262c [ci] Misc cleanups 2020-04-03 22:26:55 -04:00
Romain Goyet
3f2b14ac3e [build] Misc cleanups 2020-04-03 22:26:55 -04:00
Romain Goyet
ba57dbde61 [build] macOS and iOS can now build any binary 2020-04-03 22:26:55 -04:00
Romain Goyet
ada205b1a7 [build] Use variants
- Move helpers functions into build/helpers.mak
- Move official warning into official targets only
2020-04-03 22:26:55 -04:00
Quentin
1c00373348 [Feature] Selectable tableViewCell in the Omega App 2020-04-03 17:07:26 +02:00
Émilie Feral
8d621e4dce [apps/shared] ScrollableMultipleExpressionsView: reload scroll content
view layout when changing the displayed expression layouts

Fix bug: input (transpose([1 1 1 1 1 1])[1 1 1 1 1 1])^30, click on 'OK'
and then 'up'. The cell is mis-displayed.
2020-04-03 10:42:42 +02:00
Émilie Feral
300de8fb15 [apps/calculation] HistoryViewCell: when changing SubviewType, set the
right subcell as first responder!

This fixes the following bug: when selecting a cell whose content is too
long to be displayed, the scrolling is broken
2020-04-03 10:42:42 +02:00
Émilie Feral
90222c3f45 [apps/calculation] SelectableTableView: scrollToCell once the margin
have been updated

This fixes the following bug: input the vertical matrix [1,2,3], the
scroll failed
2020-04-03 10:42:42 +02:00
Émilie Feral
e6516ae0e7 [apps/calculation] Fix typo 2020-04-03 10:39:05 +02:00
Émilie Feral
40986ebb99 [python] Change math module test to be true on all platforms 2020-04-01 16:39:59 +02:00
Émilie Feral
8a5af352bf [python] Fix warning: signed/unsigned int comparison 2020-04-01 16:39:59 +02:00
Émilie Feral
cdff61f64b [python] Add tests for each module 2020-04-01 16:39:59 +02:00
Émilie Feral
ec5803f06f [python] Test: fix printText 2020-04-01 16:39:59 +02:00
Émilie Feral
d0a77bda2b [python] Improve test API 2020-04-01 16:39:59 +02:00
Émilie Feral
ffb8f8f953 [python] Test: add all template scripts 2020-04-01 16:39:59 +02:00
Émilie Feral
11dc259566 [python] test: add a function to run single command test 2020-04-01 16:39:59 +02:00
Émilie Feral
d7804ad5d1 [python] Tidy matplotlib tests 2020-04-01 16:39:59 +02:00
Émilie Feral
2738d30684 [python] test: check wether script execution lead to a Python error 2020-04-01 16:39:59 +02:00
Émilie Feral
2f171eb2fd [python] Add matplotlib test WIP 2020-04-01 16:39:59 +02:00
Léa Saviot
11ac25e935 [apps/code] Fix toolbox comment 2020-04-01 13:42:44 +02:00
Léa Saviot
92c62ce3dc [apps/code] Remove superfluous spaces in toolbox 2020-04-01 13:42:44 +02:00
Quentin
00e58de708 [Feature] Stay Home 2020-04-01 12:46:04 +02:00
Quentin
3fac1fdf78 [Feature] Stay Home 2020-04-01 12:45:41 +02:00
Quentin
651abf9c7b [Feature] Stay Home 2020-04-01 12:45:00 +02:00
Quentin
0b83604e3e [Update] Epsilon 13.2.0 2020-04-01 12:24:38 +02:00
Quentin
9b1add66a4 [Git] Fix conflicts 2020-04-01 12:23:52 +02:00
Quentin
b854ec903a Merge branch 'omega-hotfix' into omega-dev 2020-04-01 12:14:37 +02:00
Quentin
15ecd45a76 [Fix] Compilation error 2020-04-01 12:14:06 +02:00
Léa Saviot
76e0deb9bf [tests/solver] Test solve equation with max number of variables 2020-04-01 11:47:19 +02:00
Émilie Feral
633776b92f [apps/shared] Fix CurveView::drawArrow on arrow without orientation 2020-04-01 11:46:25 +02:00
Quentin
0d56576f9c [Git] Fix conflicts 2020-04-01 11:36:16 +02:00
Léa Saviot
511a96f464 [apps/code] Add matplotlib.pyplot functions to the toolbox catalog
Not just in the modules submenu
2020-04-01 10:18:09 +02:00
Émilie Feral
0f00bdda33 [apps] Fix test build 2020-04-01 10:18:09 +02:00
Émilie Feral
244b97e89b [python] matplotlib: handle case plot([],[]) 2020-04-01 10:18:09 +02:00
Émilie Feral
e5660635d6 [python] matplotlib: handle case hist([]) 2020-04-01 10:18:09 +02:00
Émilie Feral
3987167419 [python] matplotlib: add comment 2020-04-01 10:18:09 +02:00
Émilie Feral
28224bd75e [python] matplotlib: fix hist implementation
This fixes the following crash: input 'hist([1,2,100],[1,2]) on a Python
console with matplotlib.pyplot imported
2020-04-01 10:18:09 +02:00
Émilie Feral
bc1eae17d7 [python] matplotlib: change text() relative position to be similar to
python3
2020-04-01 10:18:09 +02:00
Émilie Feral
642a7c7f61 [apps/code] Increase python heap to 32k 2020-04-01 10:18:09 +02:00
Émilie Feral
7c612f35a8 [python] matplotlib: change Store::Rectangle structure to (left, right,
top, bottom) and avoid rounding error when converting flaot rect to
pixel
2020-04-01 10:18:09 +02:00
Émilie Feral
d468f5e130 [python] WIP matplotlib: avoid empty pixel line between bars and axis
line
2020-04-01 10:18:09 +02:00
Émilie Feral
84bc46ca8c [python] matplotlib: PlotView: improve rect drawing (use round instead
of truncating pixelFloat
2020-04-01 10:18:09 +02:00
Émilie Feral
b3b6565410 [python] modpyplot: show() does nothing when the store is empty 2020-04-01 10:18:09 +02:00
Émilie Feral
ce33faad11 [python] matplotlib: PlotView: rectangle are always visible despite the
pixel width
2020-04-01 10:18:09 +02:00
Émilie Feral
51eabf08e1 [python] matplotlib: fix PlotStore::initRange for an only dot 2020-04-01 10:18:09 +02:00
Émilie Feral
2c82460470 [python] matplotlib: add a comment to PlotView 2020-04-01 10:18:09 +02:00
Émilie Feral
b290bed409 [python] matplotlib: fix typo in ErrorValue 2020-04-01 10:18:09 +02:00
Émilie Feral
d247843da6 [apps/code] Clean ConsoleController::reloadData (always returns true) 2020-04-01 10:18:09 +02:00
Émilie Feral
81284120af [apps/code] ConsoleController: refreshOutput is now done only when the
console is active
2020-04-01 10:18:09 +02:00
Émilie Feral
574eacb69c [python] matplotlib: flush heap memory when any error is raised 2020-04-01 10:18:09 +02:00
Léa Saviot
2f4064d92b [apps/code] Fix axis() command without arguments
It inserted axis(,,,) instead of axis()
2020-04-01 10:18:09 +02:00
Léa Saviot
2ac1396dd2 [apps/code] Put back the polynomial script 2020-04-01 10:18:09 +02:00
Léa Saviot
b2c95bcbbf [apps/code] Parabola script 2020-04-01 10:18:09 +02:00
Émilie Feral
61e7ec52e6 [python] matplotlib: make pyplot a submodule of matplotlib 2020-04-01 10:18:09 +02:00
Émilie Feral
7d5568ff1a [python] WIP: change change pyplot name: pyplot --> matplotlib.pyplot 2020-04-01 10:18:09 +02:00
Léa Saviot
399cfffc83 [apps/code] Fix toolbox texts 2020-04-01 10:18:09 +02:00
Léa Saviot
89ef6ec71b [apps/code] Add MatplotlibPyplot in the toolbox 2020-04-01 10:18:09 +02:00
Léa Saviot
f5e69395ee [apps/code] Reorder toolbox modules 2020-04-01 10:18:09 +02:00
Émilie Feral
1c4f43c665 [python] matplotlib: handle empty range histogram 2020-04-01 10:18:09 +02:00
Émilie Feral
1c714a6ee6 [python] matplotlib: PlotStore checks for type before accepting a new object
This fixes the crash: when a non-float value is added through the
tupple, the next float extraction will fail
2020-04-01 10:18:09 +02:00
Émilie Feral
6d10e9fdc2 [python] matplotlib: improve and fix arguments checking 2020-04-01 10:18:09 +02:00
Émilie Feral
bf7c3b1aab [python] matplotlib: implement "plot(y)' 2020-04-01 10:18:09 +02:00
Émilie Feral
dc58b9692f [python] matplotlib: imporve 'hist' 2020-04-01 10:18:09 +02:00
Émilie Feral
1895b83251 [python] Remove useless code 2020-04-01 10:18:09 +02:00
Émilie Feral
f97f56c021 [python] matplotlib: improve 'bar' arguments acceptation 2020-04-01 10:18:09 +02:00
Émilie Feral
18d59d923a [python] matplotlib: fix automatic range initialization 2020-04-01 10:18:09 +02:00
Émilie Feral
9a240bb0b4 [python] matplotlib: improve 'grid' 2020-04-01 10:18:09 +02:00
Émilie Feral
1b768ba34a [python] modpyplot: improve 'axis' arguments acceptance 2020-04-01 10:18:09 +02:00
Émilie Feral
81170610eb [python] Matplotlib: init store range depending on 'auto' parameter 2020-04-01 10:18:09 +02:00
Émilie Feral
8aa1930f80 [python] Matplotlib: handle 'auto' range computation 2020-04-01 10:18:09 +02:00
Émilie Feral
fb3f6ab6f3 [apps/code][python] ConsoleController doesn't keep any pointer/boolean to know
if the sandbox/matplotlib view controller is displayed. Its state won't be
always right; instead, use the StackViewController depth.

This fixes the following bug: when popping the sandbox/matplotlib view
controller, the first responder token was not given to the console
controller!
2020-04-01 10:18:09 +02:00
Émilie Feral
d0c5ac0343 [escher] StackViewController: add a method to return the
topViewController
2020-04-01 10:18:09 +02:00
Émilie Feral
15e5f7a285 [python] Matplotlib: reload labels in PlotController::viewWillAppear 2020-04-01 10:18:09 +02:00
Émilie Feral
89b54d424e [apps/code] ConsoleController: when becoming first responder, check if a
controller is displayed and switch the first responder accordingly
2020-04-01 10:18:09 +02:00
Émilie Feral
7e73afc654 [python] Matplotlib: flush the plot store when the controller is popped 2020-04-01 10:18:09 +02:00
Émilie Feral
24cd5079d4 [python] matplotlib: fix modpyplot_gc_collect 2020-04-01 10:18:08 +02:00
Émilie Feral
886fc98350 [escher] Palette: factorize data color iteration 2020-04-01 10:18:08 +02:00
Émilie Feral
c4847b22cc Coding style 2020-04-01 10:18:08 +02:00
Émilie Feral
bd3fa60594 [app/graph] Enables zoom on CalculationGraphControllers 2020-04-01 10:18:08 +02:00
Émilie Feral
4022cdfa60 [python] Matplotlib: plot_controller inherits from
ZoomAndPanCurveViewController to be able to pan
2020-04-01 10:18:08 +02:00
Émilie Feral
d504564334 [apps/shared] Create ZoomAndPanCurveViewController,
ZoomParameterController inherits from ZoomAndPanCurveViewController
2020-04-01 10:18:08 +02:00
Émilie Feral
52b6508d6c [apps/shared] Create ZoomCurveViewController:
SimpleInteractiveCurveViewController inherits from
ZoomCurveViewController
2020-04-01 10:18:08 +02:00
Émilie Feral
7d48d4e7c4 [apps/code] Console controller: display only one ExecutionViewController
at a time
2020-04-01 10:18:08 +02:00
Émilie Feral
53ec023ea0 [apps/code] ConsoleController: factorize code to reload the table 2020-04-01 10:18:08 +02:00
Émilie Feral
659da1dff8 [apps][python] ExecutionEnvironment handles hide sand display of sandbox
and plot controller the same way
2020-04-01 10:18:08 +02:00
Émilie Feral
51da01aa11 [apps/code] Remove 'm_preventEdition' from ConsoleController, it was
always used with m_preventEdition = true.
2020-04-01 10:18:08 +02:00
Émilie Feral
b5d3070ef5 [python] matplotlib: improve arrow method, draw arrow edge 2020-04-01 10:18:08 +02:00
Émilie Feral
9e822e85e5 [apps/shared] CurveView: implement drawArrow 2020-04-01 10:18:08 +02:00
Émilie Feral
70335b7a47 [python] matplotlib port: draft version of arrow method 2020-04-01 10:18:08 +02:00
Émilie Feral
bc8dc0c59c [apps] Use drawSegment when drawing lines instead of drawCurve or
drawCartesianCurve
2020-04-01 10:18:08 +02:00
Émilie Feral
aaf71328ba [apps/shared] CurveView: resolve name conflict -
drawHorizontalOrVerticalSegment & drawSegment -
2020-04-01 10:18:08 +02:00
Émilie Feral
7d60c6554e [python] matplotlib port: first version of hist method 2020-04-01 10:18:08 +02:00
Émilie Feral
c69ec608e8 [python] matplotlib: label are centered around their position 2020-04-01 10:18:08 +02:00
Émilie Feral
0ae81374d9 [python] matplotlib port: implement bar method 2020-04-01 10:18:08 +02:00
Émilie Feral
373a85f2b7 [python] matplotlib port: clean duplicate 2020-04-01 10:18:08 +02:00
Émilie Feral
da1c6090b5 [python] matplotlib port: factorize input validation 2020-04-01 10:18:08 +02:00
Romain Goyet
a0319905d7 [wip] Clean Rect and drawing 2020-04-01 10:18:08 +02:00
Romain Goyet
d71ad9b288 [wip] Convenience to test matplotlib 2020-04-01 10:18:08 +02:00
Romain Goyet
3df8018943 [apps/code] Remove useless code 2020-04-01 10:18:08 +02:00
Romain Goyet
a062c570d5 [python/matplotlib] Add grid control 2020-04-01 10:18:08 +02:00
Romain Goyet
a3b1b51f75 [pyton/matplotlib] Support plot 2020-04-01 10:18:08 +02:00
Romain Goyet
a6773ad73b [python/matplotlib] Add Text, simplify Dots 2020-04-01 10:18:08 +02:00
Romain Goyet
5ada80d03b [python/matplotlib] Add a Dot iterator 2020-04-01 10:18:08 +02:00
Romain Goyet
6f3d3f62de [python/matplotlib] Validate the plot parameters 2020-04-01 10:18:08 +02:00
Romain Goyet
6a796f5f7c [python] Add an "axis" function to the matplotlib module 2020-04-01 10:18:08 +02:00
Romain Goyet
c99bed6922 [python] Stub a matplotlib module 2020-04-01 10:18:08 +02:00
Romain Goyet
2b73c4c9aa [apps/code] Quick hacks to allow pushing a view controller 2020-04-01 10:18:08 +02:00
Romain Goyet
131df18b00 [python] A module can now ask to present a view controller 2020-04-01 10:18:08 +02:00
Quentin
e35b9c5fb1 Merge branch 'omega-dev' of github.com:Omega-Numworks/Omega into omega-dev 2020-04-01 00:17:56 +02:00
Quentin
9ecdaeeb88 Merge branch 'omega-hotfix' into omega-dev 2020-04-01 00:17:37 +02:00
Quentin
735294b91b [Git] Fix conflicts 2020-04-01 00:17:17 +02:00
Léa Saviot
bd0b9f8a4a [apps/curve_view] Fix typo
The labels would not float on the right of the display
2020-03-31 15:16:39 +02:00
Léa Saviot
620ef3f570 [poincare] Use SymbolAbstract::hasSameNameAs 2020-03-31 13:42:42 +02:00
Léa Saviot
169d6bf94d [poincare/parametered_expression] Use parameter() 2020-03-31 13:42:42 +02:00
Léa Saviot
94fb5815f9 [poincare] Fix replaceReplaceableSymbols for parametered expressions
Scenario: ans*int(0,x,0,0)->x then cos(x) crashed because replaceReplaceableSymbols
would not care if it was replacing parameters in a parametered
expression
2020-03-31 13:42:42 +02:00
Léa Saviot
764cf1087a [apps/solver] Fix EquationStore::resolveLinearSystem
Scenario: solve a system with the maximum number of variables -> our
routine to compute the number of variables did not use
k_maxNumberOfVariables, so we ended up adding the same children to the
matrix Ab, which created ghosts, which made the deep reduction crash.
2020-03-31 12:05:38 +02:00
Émilie Feral
64c7688866 [.github] workflow: update to actions/checkout@v2 2020-03-31 11:37:59 +02:00
David
a7c62aa176 [Feature] Made Compact Display the Default (#317)
* Made Compact Display the Default

* Made Input Field Slightly Smaller

* Removed Comma

* Fixed bug with x->a(x)

* Update escher/include/escher/expression_field.h

* Update escher/include/escher/expression_field.h
2020-03-28 17:09:00 +01:00
Quentin
0ab6c53999 Merge branch 'omega-hotfix' into omega-dev 2020-03-27 21:30:53 +01:00
Quentin
bf9d365ee8 [Fix] GitHub Actions 2020-03-27 21:30:42 +01:00
Quentin
0beec8f506 Merge branch 'omega-hotfix' into omega-dev 2020-03-27 21:17:09 +01:00
Quentin
6c3261b356 [Git] Fix conflicts 2020-03-27 21:16:47 +01:00
David
cd8965fdd4 [Feature] Shift + Home is now a shortcut to go to calculation (#320) 2020-03-27 21:02:35 +01:00
Émilie Feral
b8b3829ea4 [ion] Web: enable to set environment variable 2020-03-27 09:32:31 -04:00
Romain Goyet
51b3a007e5 [ion/simulator/web] Remove old comment 2020-03-26 09:31:58 +01:00
Romain Goyet
df5c0752fb [escher] Remove a useless header 2020-03-26 09:31:58 +01:00
Romain Goyet
8bd01b600b [ion/simulator/web] Properly handle touch events 2020-03-26 09:31:58 +01:00
Émilie Feral
d950e37b22 [build] Emscripten toolchain: do not use a memory-init-file 2020-03-25 14:35:35 +01:00
Romain Goyet
64bab33792 [build] Add apk has a handy target on android 2020-03-25 13:44:10 +01:00
Romain Goyet
5e9543e3b7 Remove whitespace 2020-03-25 13:44:10 +01:00
Romain Goyet
2cdb5d38bf [build/android] Ignore the linter on release builds 2020-03-25 13:44:10 +01:00
Romain Goyet
b36de49b48 [simulator/android] Sign iff signing environment is provided 2020-03-25 13:44:10 +01:00
Romain Goyet
fca1dde44d [simulator/android] Use target-agnostic rules 2020-03-25 13:44:10 +01:00
Romain Goyet
693cff1e23 [build] Defining EXE is not required
Some platforms don't have direct executable formats. For instance, on
Android, there *is* an EXE format for a given ARCH, but .so does not
apply to ARCH-less builds.

And having default rules for %.so on ARCH-less Android would get in
the way when copying the shared obejcts for the APK.
2020-03-25 13:44:10 +01:00
Romain Goyet
964541d645 [build] Don't show any message if official tos have been accepted 2020-03-25 13:44:10 +01:00
Romain Goyet
625afcfd42 [build/android] Unify the behavior with iOS and macOS 2020-03-25 13:44:10 +01:00
Romain Goyet
46647cc35c [build] Allow building official targets on CI environments 2020-03-25 13:44:10 +01:00
Émilie Feral
3245a0060e [build] Fix target all_official: get rif of .mem 2020-03-24 16:44:20 +01:00
Émilie Feral
f84b3dc5c1 [poincare] Power approximation: avoid approximating a power to 0 when
one of the real/imaginary part was not null
2020-03-24 16:22:43 +01:00
Émilie Feral
7c79c70890 [poincare] When simplification has been interrupted, escape the end of
simplification. Otherwise we can be stuck in infinite loop.

This fixes the following bug: when simplifying an expression as
'bigRational1^x*bigRational2^x', we use the rule a^x*b^x --> (a¨b)^x. However,
in this case, a*b can't be reduce (resulting rational would be too big) and
we're stuck in the loop a^x*b^x --> (a¨b)^x --> a^x*b^x --> (a¨b)^x...
2020-03-24 16:22:43 +01:00
Émilie Feral
c0f73e97d2 [ion] Android Makefile: simplify rule_for_gradle 2020-03-24 10:26:59 -04:00
Émilie Feral
43bf89c6e4 [ion] Android build: specify libepsilon libraries' name when building
the apk
2020-03-24 10:26:59 -04:00
Romain Goyet
62324b9cac [build/emscripten] Don't use memory init files anymore
Those provide a really small size gain and are painful to deploy
2020-03-24 15:02:10 +01:00
Romain Goyet
ca89c06ffe [build/emscripten] We now use the newer #canvas convention 2020-03-24 15:02:10 +01:00
Romain Goyet
fd629de548 [build] Clean the "all" targets
Remove "DEBUG=0" because it's the default
Use handy targets when possible
2020-03-24 15:02:10 +01:00
Romain Goyet
eadfe4aa56 [ion/simulator/web] Name the target "epsilon.zip" to match other targets
This way it's consistent with epsilon.ipa on TARGET=ios and epsilon.apk
on TARGET=android
2020-03-24 15:02:10 +01:00
Romain Goyet
edbd879b4b [ion] Modularize the HTML simulator 2020-03-24 15:02:10 +01:00
Léa Saviot
05d24e0c61 [ion/android] Longer comment on Home button hiding fix 2020-03-24 10:10:02 +01:00
Léa Saviot
f31de20039 [ion/android] Hide the status bar and navigation buttons
This is a hack, we should find why this was broken after v12.
2020-03-24 10:10:02 +01:00
Quentin Guidée
dde2d67634 Fix conflicts 2020-03-23 10:37:17 +01:00
Quentin Guidée
3da284913d [Build] Increment Epsilon version 2020-03-23 10:35:46 +01:00
Quentin Guidée
9b8f5b4132 Merge branch 'omega-hotfix' into omega-dev 2020-03-21 11:43:09 +01:00
Quentin Guidée
06905c70e4 Merge remote-tracking branch 'upstream/master' into omega-hotfix 2020-03-21 11:42:39 +01:00
Quentin Guidée
742e7a165d [Feature] Hide undef with symbolic calculation 2020-03-21 11:10:14 +01:00
Quentin Guidée
10c9a4458d Merge branch 'omega-hotfix' into omega-dev 2020-03-20 22:05:21 +01:00
Quentin Guidée
ea796d9b51 Merge branch '0b101-fixedCompactCutoffBug2' into omega-hotfix 2020-03-20 22:04:46 +01:00
Émilie Feral
5f5636fe4d [build] Fix all_official target 2020-03-20 09:32:24 +01:00
Émilie Feral
1809037273 [ion] Fix epsilon.official.ipa dependencies 2020-03-19 13:36:10 +01:00
David
dab8880fbd Merge branch 'omega-hotfix' into fixedCompactCutoffBug2 2020-03-18 11:59:10 -05:00
David
c5b21cff71 [Fix] Compact cutoff bug 2020-03-18 11:56:48 -05:00
Romain Goyet
81cd18ad67 [build] Signing android apps is easier
Signing parameters can be passed on the command line, e.g. "ANDROID_SIGNING_STORE_FILE=foobar", or they can be written to a ~/.gradle/gradle.properties file using the "EPSILON_SIGNING_STORE_FILE=foobar" syntax.
2020-03-18 17:30:20 +01:00
Quentin Guidée
6716a43141 Merge branch '0b101-freedomUnits' into omega-dev 2020-03-17 21:22:52 +01:00
Quentin Guidée
a25bb04122 Fix conflicts 2020-03-17 21:22:31 +01:00
Quentin Guidée
b1d558617a Merge branch 'omega-hotfix' into omega-dev 2020-03-17 21:03:52 +01:00
Quentin Guidée
bfe2fc1a04 Merge remote-tracking branch 'upstream/master' into omega-hotfix 2020-03-17 20:59:23 +01:00
Émilie Feral
5f8f1d96ee [build] Actually use the mobileprovision file stored in build/artifacts/ 2020-03-16 18:07:01 +01:00
Émilie Feral
8c370b409c [build] Add the .mem files to all_official/ 2020-03-16 18:07:01 +01:00
Émilie Feral
d2f40130b2 [build] Change folder name: stable_release --> all_official 2020-03-16 18:07:01 +01:00
Jacob Young
a8783fe21f Remove a duplicate function, cleanup sorting and use consistent argument names in math.h.
Add missing math.h tests and make each test a single line for easier comparison with math.h.
Add missing cmath undefs and functions and use constexpr instead of static.
2020-03-16 15:00:40 +01:00
Léa Saviot
e828491171 [apps/probability] Test on finite integral computations 2020-03-16 11:40:40 +01:00
Léa Saviot
29b4c75227 [apps/probability] Assert discrete distributions override evaluation 2020-03-16 11:40:40 +01:00
Léa Saviot
5c70fdc7a6 [apps/probability] Handle a == b case in finite integral computation
For non continuous distributions, P(a <= X <= a) is not necessarily
null.
2020-03-16 11:40:40 +01:00
Émilie Feral
d222d13156 [poincare] CHange name PowerNode::tryComputeRealRootOfRationalPow -->
PowerNode::computeNotPrincipalRealRootOfRationalPow
2020-03-16 11:36:37 +01:00
Léa Saviot
da6306cb11 [poincare/multiplication] Interrupt reduction if overflow
When the overflow is due to the max size a rational can hold, stop the
reduction, otherwise some false results can appear.
For instance: 1.0092^50*ln(1.0092) was computed to 0 due to this problem
2020-03-13 14:16:43 +01:00
Léa Saviot
f00bd4d1c5 [poincare/multiplication] Factorize code 2020-03-13 14:16:43 +01:00
Léa Saviot
1e11650122 [poincare/test] Fix precision in approximation test 2020-03-13 14:16:43 +01:00
Léa Saviot
e636a2c315 [poincare/test] Add failing tests (commented but to fix later!) 2020-03-13 14:16:43 +01:00
Léa Saviot
313cbf6767 [poincare/arithmetic] Shortcut the LCM and GCD computation if equal
This fixes: LCM(7.88861e+169, 7.88861e+169), which overflowed at some
point during the computation
2020-03-13 14:16:43 +01:00
Léa Saviot
97d94d9e56 [poincare/test] Add failing test on multiplication simplification 2020-03-13 14:16:43 +01:00
LeaNumworks
13b2deb714 [poincare/approximation_helper] Clearer code
This should do the same output.
2020-03-12 14:41:50 +01:00
Léa Saviot
576d1dcd6b [poincare/power] Rename and comment computeRealRootOfRationalPow 2020-03-12 14:41:50 +01:00
Léa Saviot
175af27ea9 [poincare/approximation_helper] Factorize some code 2020-03-12 14:41:50 +01:00
Émilie Feral
879c1e3bf1 [poincare] ApproximationHelper: fix precision threshold of
NeglectRealOrImaginaryPartIfNeglectable
2020-03-12 14:41:50 +01:00
Émilie Feral
d431642e60 [poincare] Add tests on atanh approximation 2020-03-12 14:41:50 +01:00
Émilie Feral
a2e9d8efd6 [poincare] Improve trigonometry functions and power functions
approximations. We neglect the real or imaginary parts when it is
neglectable compared to the input.
2020-03-12 14:41:50 +01:00
Émilie Feral
9936d99411 [poincare] Add comment on Power::templatedApproximate 2020-03-12 14:41:50 +01:00
Émilie Feral
12a5f5499c [poincare] Handle real root finding in Power and NthRoot in order to
remove beautifying x^(p/q) -> root(x,q)^p. This triggered precision
loss!
2020-03-12 14:41:50 +01:00
Émilie Feral
5407709798 [poincare] Add approximation tests that fails because of precision loss 2020-03-12 14:41:50 +01:00
Émilie Feral
515405a5df [poincare] In Power::approximation and SquareRoot::approximation, the
real (or imaginary) part negligence should depend on the argument value
relatively to some other values (norms of the parameters) and not of its
value absolutely!
2020-03-12 14:41:50 +01:00
Quentin Guidée
676107e5b7 Merge branch 'omega-hotfix' into omega-dev 2020-03-12 13:26:31 +01:00
Quentin Guidée
eadcf0b6f9 Merge remote-tracking branch 'upstream/master' into omega-hotfix 2020-03-12 13:26:13 +01:00
Léa Saviot
ebdac63681 [poincare/parser] u_ v_ w_ are not special identifiers anymore 2020-03-12 11:48:54 +01:00
Quentin Guidée
9ed8958006 [GitHub] Removed converter and cli installer from the README 2020-03-11 19:46:12 +01:00
Quentin Guidée
4bfe189ed5 [GitHub] Updated submodules 2020-03-11 19:15:24 +01:00
Quentin Guidée
bd5bb45344 Merge branch 'omega-hotfix' into omega-dev 2020-03-11 19:12:47 +01:00
Quentin Guidée
d50511f1be [Fix] Fix conflicts 2020-03-11 19:12:20 +01:00
Quentin Guidée
f340bb718d [Fix] Max OSX -> macOS 2020-03-11 18:16:53 +01:00
Léa Saviot
90f2e5beed [ion/sdl] Do not process more than one buffered event
Scenario:
Make an infinite loop script (while 1 : 1+1) and run it. Input 1234567
then press Back to interrupt the infinite loop -> the script execution
stops, then 1234567 is input in the input line, which is quite weird. It
is even weirder when the key pressed during the [script execution / a
long computation] result in navigation inside the calculator apps.
2020-03-11 15:36:52 +01:00
Léa Saviot
9ab3558cfe [ion/events_keyboard] Remove unused cases 2020-03-11 15:36:52 +01:00
Léa Saviot
1242258992 [ion] Handle key events in all simulators as in EPSILON_SDL_SCREEN_ONLY
This way, physical keyboard events can be caught by python on all
simulators
2020-03-11 15:36:52 +01:00
Léa Saviot
4a4ba52e38 [ion/events] Better handling of Shift on the web target 2020-03-11 15:36:52 +01:00
Léa Saviot
18f3054b50 [ion/simulator/web] Do not duplicate events in scan and getPlatformEvent
Some events were caught by bith scan() and getPlatformEvent()
2020-03-11 15:36:52 +01:00
Léa Saviot
a7d419c4bd [ion/emscripten] Get physical keyboard events in scan() 2020-03-11 15:36:52 +01:00
Léa Saviot
8168a125e6 [apps/statistics] Remove unused variable in HistogramView
It is unused as HistogramView now inherits Shared::HorizontallyLabeledCurveView
2020-03-11 13:58:41 +01:00
Léa Saviot
702772a7c9 [apps/reg] Store::m_seriesChecksum is Snapshot::m_prevModelsVersions
Share these objects instead of duplicating them
2020-03-11 11:43:36 +01:00
Léa Saviot
53705fb333 [apps/graph_ctrlr] Reload range if no previous model is present
We memoize the checksum of the x first models, and we check that one of
these models is still present when the graph view appears. If so, we do
not reload the range, other wise we reload it.

Scenario:
f(t) = [t^2  t+1] in parametric
Display the graph
f(x) = 1 on ]-inf;0]
g(x) = 2 on [0;inf[
Display the graph -> the range did not change
2020-03-11 11:43:36 +01:00
Léa Saviot
aab8974934 [apps] Memoize five model checksums 2020-03-11 11:43:36 +01:00
Romain Goyet
2bf83c43a8 [apps/shared] Factorize CurveView::label
There was a lot of code duplication.
I removed the initialization of xLabel{} and yLabels{} because those are
scratch buffers that shouldn't be accessed before being written to
anyway.
2020-03-11 09:51:33 +01:00
Maxime FRIESS
afc34dfea8 [Feature] Added message when compilation starts
* Added message when compilation starts.

* Added version, getting fancy.

* Fixed echo -e incompatibility.

* Added OS printing, moved pimp to proper pimp file.

* Fixed recursive pimp.
2020-03-10 21:45:23 +01:00
Quentin Guidée
14c900be4d [Change] CustomSoftwareVersion -> OmegaVersion 2020-03-10 18:21:59 +01:00
Quentin Guidée
e1a372414f Merge branch 'omega-hotfix' into omega-dev 2020-03-10 18:03:51 +01:00
Quentin
8a27c81a83 Merge pull request #298 from M4xi1m3/omega-hotfix
Removed duplicate rule, deleted .gradle, added to gitignore.
2020-03-10 18:02:59 +01:00
Léa Saviot
ef249b0bdb [poincare/parser] parseSpecialId must go through one of the subcases
Otherwise we might go through the method without creating leftHandSide
2020-03-10 11:35:37 +01:00
Léa Saviot
79f3ee43bc [poincare/parser] log_ is not a special identifier anymore
The change was made a few commits ago, but this was forgotten
2020-03-10 11:35:37 +01:00
Ruben Dashyan
1ca902c129 [apps/shared/round_cursor_view] Comment about markRectAsDirty 2020-03-10 11:11:57 +01:00
Ruben Dashyan
037fa088e9 [escher/transparent_view] markRectAsDirty is protected
as it is in View.
2020-03-10 11:11:57 +01:00
Ruben Dashyan
d64e58b9dc [escher/transparent_view] Remove redundancy 2020-03-10 11:11:57 +01:00
Ruben Dashyan
8337e36f46 [apps/shared/*_cursor_view] CursorView inherits from TransparentView
so that CursorView tells its superview to redrawn in the background,
except the RoundCursorView.
2020-03-10 11:11:57 +01:00
Ruben Dashyan
ed98218e7b [poincare/grid_layout] Explicit the making of a protected member as public 2020-03-10 10:33:30 +01:00
Ruben Dashyan
aa4a33d849 [poincare/layout_node] Remove unused method 2020-03-10 10:33:30 +01:00
Ruben Dashyan
afb1d18d65 [apps/shared/sum_graph_controller] Factor constexpr 2020-03-10 10:33:30 +01:00
Ruben Dashyan
f0ef84b3bc [apps/shared/sum_graph_controller] In LegendView::setSumLayout, factor Layout building 2020-03-10 10:33:30 +01:00
Ruben Dashyan
55bb3f677a [apps/shared/sum_graph_controller] In LegendView::setSumLayout, simplify equal sign 2020-03-10 10:33:30 +01:00
Ruben Dashyan
0a92579571 [apps/shared/sum_graph_controller] Fix variable type 2020-03-10 10:33:30 +01:00
Ruben Dashyan
04794dd26f [apps/shared/sum_graph_controller] Uniformize number of significant digits 2020-03-10 10:33:30 +01:00
Ruben Dashyan
7ee8c31c70 [apps/shared/sum_graph_controller] In LegendView::setSumLayout, factor sum symbol layout 2020-03-10 10:33:30 +01:00
Ruben Dashyan
24fa8b28a9 [apps/shared/sum_graph_controller] In LegendView::setSumLayout, factor m_sum.setAlignment 2020-03-10 10:33:30 +01:00
Ruben Dashyan
6b527d3b00 [apps/shared/sum_graph_controller] Rename setSumSymbol to setSumLayout 2020-03-10 10:33:30 +01:00
Ruben Dashyan
e1624c79aa [apps/shared/sum_graph_controller] Class doesn't need to hold m_sumLayout 2020-03-10 10:33:30 +01:00
Ruben Dashyan
7a633b1e75 [apps/sequence/sequence] SequenceModel's name method need not be virtual 2020-03-10 10:33:30 +01:00
Ruben Dashyan
fccd72b757 [apps/sequence/sequence] Do not memoize nameLayout
Fixes the following bug:
In the graph tab of the Sequence app, compute the sum of the terms of
a sequence from 1 to 9 and then from 1 to 10. The Layout is memoized
after the first time and mispositioned the second time since it is
not recomputed.
2020-03-10 10:33:30 +01:00
Romain Goyet
c1215063ee Small fixes to the documentation 2020-03-10 10:26:49 +01:00
Léa Saviot
cf84a30768 [poincare/absolute_value] ShallowReduce done in double, not float
This fixes abs(-2.3*10^-39) that returned a negative value
2020-03-10 10:23:33 +01:00
Quentin Guidée
13f1acb592 Merge branch 'omega-hotfix' into omega-dev 2020-03-09 21:44:40 +01:00
David
ad672f9111 [Fix] Display bug where "x=a(x)" got cutoff 2020-03-09 21:44:22 +01:00
David
d1c8d6f11c Fixed display bug where "x=a(x)" got cutoff 2020-03-09 15:38:24 -05:00
Léa Saviot
5ca6b7dbf8 [poincare/code_point_layout] Fix collapsing
Scenario: Enter "(12/34 * 10)" then press "Divide" -> the numerator of
the division was not the whole parenthesed expression
2020-03-09 16:41:58 +01:00
Quentin Guidée
d94021677e Merge branch 'omega-hotfix' into omega-dev 2020-03-06 16:13:02 +01:00
Quentin Guidée
bd6f30fda5 Merge remote-tracking branch 'upstream/master' into omega-hotfix 2020-03-06 16:06:39 +01:00
Léa Saviot
1dc6e77049 [poincare/matrix] Forbid nested matrices
Scenario: in calculation,
1/matrix(matrix(matrix(matrix(... matrix(1) ... )))) gave kind of a
weird result. These kind of computations also broke the fuzzer.
2020-03-04 16:21:25 +01:00
redgl0w
dfe51df321 Updated the month definition 2020-03-04 10:08:44 +01:00
redgl0w
035a0377bd Updated the month definition 2020-03-04 10:08:44 +01:00
Léa Saviot
4f76e4418f [apps/console_edit_cell] Fix input result copying 2020-03-02 17:24:54 +01:00
Léa Saviot
a06660ee25 [poincare/vert_off_lay] Subscript layout serializes without _
This way there is no parsing confusion when copy pasting the subscript of
a subscript layout
2020-03-02 09:55:11 +01:00
Neven Sajko
aae5e49c01 Remove useless uses of const for return types
An integer or float value can not be assigned to, so there is no point
in qualifying it as const.
2020-03-02 09:48:23 +01:00
M4x1m3
8a4e9520f3 Removed .gradle, added it to gitignore. 2020-03-01 16:48:36 +01:00
M4x1m3
175e38711e Removed duplicate binpack rule. 2020-03-01 16:45:53 +01:00
Quentin Guidée
1d048ade53 [Reformat] Clean all spaces 2020-03-01 00:19:51 +01:00
Charlotte THOMAS
67a1000ddc [Feature] New Constants & Units
* Added some constant
Move mass on a new submenu of Physics
Added universal translation for a future easter-egg

* Added lenght constant menu
Added radiuses and distances submenu to lenght
Added Faraday Constant

* Constant
Added 16 usual pKa couple values

* Added some constant
( stefan-boltzmann, water triple point, wien, atmospheric pressure, vacuum impedance, bohr magneton, nuclear magneton, muon mass, atomic mass unit, bohr radius )
Missing hungarian translation

* Planck update
added some plancks units ( fondamentals units and energy/power units )

* Changed the Physics constants submenu
Here's the new pattern

1. Fundamental Constants => for the 5 fundamental constants
2. Electromagnetism => 3 constants remain in this submenu
3. Nuclear and Atomic Constnats => bohr magneton & nuclear magneton, bohr radius and particle mass submenu
4. Thermodynamics => this section is mostly unchanged
5. Gravitation => same as before
6. Speed => 2 submenus one for sound speeds and one for escape velocities
7. Mass => the mass of earth/sun/moon
8. Length => 2 submenus, one for radius of earth/sun/moon and one for distances earth-moon and earth-sun
9. Planck Units => The natural system of units

* Units
Added steradian, lumen and lux to the avaliables units
Warning steradian is a new fundamental units ( definition is nullptr )

* Remove debugging and includes

* Added 15 constants

* Update apps/toolbox.fr.i18n

Co-Authored-By: Quentin <quentin.guidee@gmail.com>

* Update apps/toolbox.fr.i18n

Co-Authored-By: Quentin <quentin.guidee@gmail.com>

* Corrected french and english

* Added hu translation
Correct de translation
added combining double acute accent

* q

* Revert "q"

This reverts commit 959786ae504ddf106249a3f799929471eecb8708.

Co-authored-by: Quentin <quentin.guidee@gmail.com>
2020-02-29 23:50:49 +01:00
Quentin Guidée
95095423cd Update config.mak 2020-02-29 19:56:55 +01:00
Quentin Guidée
94c221dcf4 Merge branch 'omega-hotfix' into omega-master 2020-02-29 19:52:54 +01:00
Quentin Guidée
83686568ad Merge branch 'omega-hotfix' into omega-dev 2020-02-29 18:56:01 +01:00
Maxime FRIESS
33060d80c8 [Fix] Bring Alpha+Up/Down/Left/Right scrolls to top/bottom/left/right 2020-02-29 18:55:19 +01:00
Quentin Guidée
849c6e2559 [Feature] Omega App 2020-02-29 18:42:22 +01:00
Quentin Guidée
8a7f815c8e [Feature] Omega App : List 2020-02-29 15:27:17 +01:00
M4x1m3
ac75bfd0fc Allow simulator to be loaded with multiple scripts. 2020-02-29 14:24:35 +01:00
Quentin Guidée
0a10e38caf [Fix] Omega App 2020-02-29 14:01:03 +01:00
Quentin Guidée
79c425100d [Feature] Omega App 2020-02-29 14:00:36 +01:00
Quentin Guidée
d8464ba6a9 Fix conflicts 2020-02-29 12:45:54 +01:00
Quentin Guidée
d589107e01 Fix conflicts 2020-02-29 12:36:33 +01:00
Quentin Guidée
d71916c077 Merge branch 'DSchndr-german' into omega-hotfix 2020-02-29 12:32:28 +01:00
Quentin Guidée
9b6d68e932 Fixed conflicts 2020-02-29 12:31:16 +01:00
Quentin Guidée
3affdcfd3d Merge branch 'omega-hotfix' into omega-dev 2020-02-29 10:57:50 +01:00
Quentin Guidée
7bf3cd377c [Fix] Allow to compile only the code app 2020-02-29 10:57:29 +01:00
Quentin Guidée
3e04537abe Merge branch 'omega-hotfix' into omega-dev 2020-02-28 19:52:46 +01:00
Quentin Guidée
587b8dbf8c Merge branch 'numworks-master' into omega-hotfix 2020-02-28 19:50:56 +01:00
Quentin Guidée
02a5826789 Merge branch 'master' of https://github.com/numworks/epsilon into numworks-master 2020-02-28 19:50:43 +01:00
Quentin Guidée
9bf0d39030 [GitHub/Fix] GitHub Actions 2020-02-28 19:36:19 +01:00
Quentin Guidée
f04c75583c [GitHub/Fix] GitHub Actions 2020-02-28 19:35:54 +01:00
Quentin Guidée
03e8353f17 [GitHub/Fix] GitHub Actions 2020-02-28 19:22:47 +01:00
Quentin Guidée
e21245afbf [GitHub] GitHub Actions 2020-02-28 19:21:06 +01:00
Quentin Guidée
9f1dc91cde [GitHub] GitHub Actions 2020-02-28 19:09:21 +01:00
Quentin Guidée
dc73193f8a [GitHub] GitHub Actions 2020-02-28 18:52:03 +01:00
Ruben Dashyan
d727fb4cf8 [poincare/test/function_solver] Run solver tests with negative steps 2020-02-28 18:08:01 +01:00
Ruben Dashyan
0a6af26162 [poincare/test/function_solver] Factor helper functions 2020-02-28 18:08:01 +01:00
Ruben Dashyan
29b0841a21 [poincare/test/function_solver] Change term: extremum -> point of interest 2020-02-28 18:08:01 +01:00
Ruben Dashyan
6d48ef5eb0 [poincare/test/function_solver] Simplify helper function's
Remove currentStart and simply use start instead
2020-02-28 18:08:01 +01:00
Ruben Dashyan
a62efecb17 [poincare/test/function_solver] Remove helper functions' default parameter values 2020-02-28 18:08:01 +01:00
Ruben Dashyan
d6b2be1b05 [poincare/test/function_solver] Build Expressions by parsing text 2020-02-28 18:08:01 +01:00
Ruben Dashyan
2d22887eaf [poincare/test/function_solver] Factor Poincare::Context usage 2020-02-28 18:08:01 +01:00
Ruben Dashyan
a72e4d43ae [poincare/expression] Short-circuit brentMinimum and brentRoot 2020-02-28 18:08:01 +01:00
Ruben Dashyan
bb24c21320 [poincare/solver] Fix typo in BrentRoot algorithm 2020-02-28 18:08:01 +01:00
Ruben Dashyan
74f7705413 [poincare/solver] Fix typo 2020-02-28 18:08:01 +01:00
Ruben Dashyan
9a79081b47 [poincare/expression] Fix typo in nextIntersection
The approximative solution should be rounded up to zero if it is
dominated by the solver's precision.
2020-02-28 18:08:01 +01:00
Neven Sajko
4da9f34993 [poincare] Fix checking for special tree identifier value
Unsigned types are never negative, so the existant check does not make
sense. Check correctly using the newly introduced
TreeNode::IsValidIdentifier method.
2020-02-28 09:18:14 +01:00
Léa Saviot
f12c53b3f2 [apps/code] printText should not be asynchronous in emscripten
Otherwise, we need to put in the whitelist all methods that might call
printText, which are a lot.
2020-02-27 11:32:26 +01:00
Quentin Guidée
c99ced1699 Merge branch 'omega-hotfix' into omega-dev 2020-02-26 22:20:07 +01:00
Quentin Guidée
a9c46dc28c Fix conflicts 2020-02-26 22:17:57 +01:00
Quentin Guidée
bfa727520b Merge branch 'omega-hotfix' into omega-dev 2020-02-26 17:46:03 +01:00
David
2913bcb8b5 [Fix] Bug with the default display mode 2020-02-26 17:44:52 +01:00
Neven Sajko
f74ed8ecd7 [ion] Fix error check in the USB stack
The return type of the function receiveSomeData needs to be wider so the
-1 error value could fit.

Fixes #1335
2020-02-26 11:09:43 +01:00
Ruben Dashyan
bdb29b9bf9 [apps/regression/graph_controller] Remove setRoundCrossCursorView's parameter
Get it directly from model
2020-02-26 09:50:43 +01:00
Ruben Dashyan
b8b6e4b5b8 [apps/regression/graph_controller] Update model before setting cursor view 2020-02-26 09:50:43 +01:00
Ruben Dashyan
4f279f15da [apps/regression/graph_controller] Inline selectRegressionCurve in header 2020-02-26 09:50:43 +01:00
Ruben Dashyan
436b934f76 [apps/regression/graph_controller] selectRegressionCurve does not update the cursor view
selectRegressionCurve is only called from GoToParameterController and is
part of the GraphController's API for updating the model. It should not
update the view. viewWillAppear does.
2020-02-26 09:50:43 +01:00
Ruben Dashyan
7e6a601af0 [apps/regression/graph_controller] Inline selectRegressionCurve in moveCursorVertically
In the graph controller, selectRegressionCurve is only called at one
place (in moveCursorVertically). In general, setRoundCrossCursorView is
called and *m_selectedDotIndex is updated. There is no reason at all to
do things differently.

Though selectRegressionCurve is called from GoToParameterController.
2020-02-26 09:50:43 +01:00
Ruben Dashyan
d13c243876 [apps/regression/graph_controller] Simplify viewWillAppear 2020-02-26 09:50:43 +01:00
Ruben Dashyan
7b00072ccf [apps/regression/graph_controller] Factor m_roundCursorView.setColor in setRoundCrossCursorView 2020-02-26 09:50:43 +01:00
Émilie Feral
8075468568 .gitignore: add build/artefacts 2020-02-25 17:37:29 -05:00
Émilie Feral
d2e9d5fbea [build] Split stable_release target from target.mak, change name to
all_official
2020-02-25 17:37:29 -05:00
Émilie Feral
3aeb4b9ea9 [build] Coding style 2020-02-25 17:37:29 -05:00
Émilie Feral
c8cbd9475d [ion] android Makefile: declare targets as PHONY 2020-02-25 17:37:29 -05:00
Émilie Feral
38d02663b4 [build] epsilon_src & epsilon_official_src have to be defined because
they're used by target.simulator.web.mak
2020-02-25 17:37:29 -05:00
Émilie Feral
6c0bb3cdde [build] Replace make by $(MAKE) in Makefiles 2020-02-25 17:37:29 -05:00
Émilie Feral
ef62c70913 [build] Target: clean epsilon targets dependencies 2020-02-25 17:37:29 -05:00
Émilie Feral
a92ee368c5 [ion] ios Makefile: fix code-signing with new certificates 2020-02-25 17:37:29 -05:00
Émilie Feral
ac6d6f4d5c [build] Complete stable_release target 2020-02-25 17:37:29 -05:00
Émilie Feral
a7c26ce3a8 [ion] ios Makefile: fix codesigning 2020-02-25 17:37:29 -05:00
Émilie Feral
d6504a6c6a [build] Make a target stable_release which build every executable needed
for a stable release
2020-02-25 17:37:29 -05:00
Émilie Feral
558e2734f0 [ion] Android Makefile: fix rule for libepsilon 2020-02-25 17:37:29 -05:00
Émilie Feral
92a3e07643 [ion] Enable to build official and unofficial softwares for ios and
macos platform
2020-02-25 17:37:29 -05:00
Émilie Feral
4aace23362 [ion] Makefile of android: enable to build epsilon.apk and
epsilon.official.apk
2020-02-25 17:37:29 -05:00
Émilie Feral
be0b2787b4 [ion] Web Makefile: simulator.html expects a epsilon.js file and not a
epsilon.official.js file
2020-02-25 17:37:29 -05:00
Émilie Feral
06202aac49 [build] Remove useless clean_for_apps_selection target 2020-02-25 17:37:29 -05:00
Émilie Feral
b85f19c99c [build] Remove useless and wrong workshop_python_emulator (GET_OPT
option is missing, which also forces a real clean)
2020-02-25 17:37:29 -05:00
Émilie Feral
2351b03fb7 [build] Fix binpack target 2020-02-25 17:37:29 -05:00
Émilie Feral
6693102d5f [build] binpack: fix name change build --> output 2020-02-25 17:37:29 -05:00
Émilie Feral
1e81a944e3 [build] Web: enable to build target simulator.official.zip and
epsilon.official.js
2020-02-25 17:37:29 -05:00
Quentin Guidée
724980280a Merge branch 'coco33920-add_name' into omega-dev 2020-02-25 20:59:08 +01:00
Quentin Guidée
485a8da0fd Merge branch 'add_name' of https://github.com/coco33920/Omega-1 into coco33920-add_name 2020-02-25 20:59:00 +01:00
Quentin Guidée
ae36929760 Merge branch 'omega-dev' of github.com:Omega-Numworks/Omega into omega-dev 2020-02-25 20:46:40 +01:00
Quentin Guidée
cea1df1015 Merge branch 'omega-hotfix' into omega-dev 2020-02-25 20:46:26 +01:00
Quentin Guidée
00350b1530 [Change] Remove the LED color choice by default 2020-02-25 20:43:01 +01:00
Colin Thomas
81c5e4797c Add name into contributors page 2020-02-25 20:11:05 +01:00
DSchndr
acb71d2975 German translations 2020-02-25 20:10:33 +01:00
Charlotte THOMAS
3f76902340 [Fix] Replaced Const by Constante in French i18n files 2020-02-25 19:37:28 +01:00
Charlotte THOMAS
854b660859 [Feature] New physical constants
* Units
Added units to physics constant

* Units
Corrected the value of speed of light ( from 2.998e8 to 2.99792458e8 m/s )

* fix compilation error

* Units
Rename Units Of Measurements => Speed
Suppress light year ( native unit )
Added some speed of sound values

* Update shared.de.i18n

* Update toolbox.es.i18n

* Update toolbox.fr.i18n

* Update toolbox.pt.i18n

* Update toolbox.en.i18n

* Update shared.universal.i18n

Co-authored-by: Quentin <quentin.guidee@gmail.com>
2020-02-25 17:57:25 +01:00
Léa Saviot
02e79ad595 [apps/code] Do not refresh the print if the sandbox is displayed
Otherwise the first responder becomes the console edit line, and events
(such as Toolbox) are not intercepted by the sandbox anymore.
2020-02-25 15:31:25 +01:00
Quentin Guidée
912e7fbc29 Merge branch 'omega-hotfix' into omega-dev 2020-02-25 15:22:02 +01:00
Quentin Guidée
b26a35a200 Merge remote-tracking branch 'upstream/master' into omega-hotfix 2020-02-25 15:21:24 +01:00
Quentin Guidée
c603469a64 Merge branch 'omega-hotfix' into omega-dev 2020-02-25 15:18:20 +01:00
Léa Saviot
383aafcc55 [python/modion] Allow interruption of modion_keyboard_keydown 2020-02-25 15:17:13 +01:00
Léa Saviot
c377491c7f [ion/simulator.html] Fix digits clickable area position
When resizing the window, the clickable zone would drift from the
buttons.
2020-02-25 15:16:53 +01:00
Léa Saviot
238eeb8106 [ion/web] Fix keyboard buttons positions 2020-02-25 15:16:53 +01:00
Léa Saviot
526a9e550c [ion/simulator/web] The buttons should appear in the browser window
When the window height is very small, there are still some problems with
the buttons, that are half out of the window
2020-02-25 15:16:53 +01:00
Léa Saviot
754110d5c6 [ion/simulator/web] Change background 2020-02-25 15:16:53 +01:00
Léa Saviot
18d6ad34bc Revert "[ion/sdl/web] Fix the HTML page actions"
This reverts commit 5796a0d930.
2020-02-25 15:16:53 +01:00
Léa Saviot
22afe4df2d [apps/statistics] EXE should open the histogram param controller
The OK button already does it.
2020-02-25 15:15:03 +01:00
David
88f202c4e7 [Fix] Improved the compact result display 2020-02-25 15:14:38 +01:00
Charlotte THOMAS
1f39c37b56 [Feature] Adding units to physics const
* Units
Added units to physics constant

* Units
Corrected the value of speed of light ( from 2.998e8 to 2.99792458e8 m/s )

* fix compilation error
2020-02-25 15:08:24 +01:00
Léa Saviot
e5a2208b27 [apps/interactive_curve_view_range] Recompute yRange after setDefault
Scenario : f(x)=8x, scroll to the right until the window range has
changed, then set the preadjustment to default -> the x change had no
impact on the yRange because we did not set the yAuto before doing the
changes.
2020-02-25 15:07:16 +01:00
Quentin Guidée
074afa2fef Fix conflicts 2020-02-23 13:45:07 +01:00
Quentin Guidée
1a77250624 Fix conflicts 2020-02-23 13:43:36 +01:00
Quentin Guidée
24907511f5 Fix conflicts 2020-02-23 13:27:10 +01:00
Quentin Guidée
836b23b06c Merge branch 'omega-dev' of github.com:Omega-Numworks/Omega into omega-dev 2020-02-21 18:14:07 +01:00
Quentin Guidée
a32e802cf4 New Omega App 2020-02-21 18:13:57 +01:00
Quentin
7a4a67a144 Merge pull request #271 from RedGl0w/patch-15
Android simulator renamed
2020-02-21 17:06:07 +01:00
Léa Saviot
c8537df3b4 [apps/calc] Do not forget to call parent method
Scenario: Open several times the additional outputs menu, there are
drawing problems (multiple stack headers)
2020-02-21 17:04:19 +01:00
Léa Saviot
686e25ec43 [apps/variable_box_controller] Fix expressionLayoutForRecord 2020-02-21 17:03:56 +01:00
redgl0w
ae884856fe Update strings.xml 2020-02-21 16:56:24 +01:00
Quentin Guidée
4d8a6488c4 Simulator and web simulator renamed 2020-02-21 16:56:16 +01:00
Léa Saviot
8fe41a8673 [python/modkandinsky] fillRect accepts negative width and height 2020-02-21 16:04:05 +01:00
Léa Saviot
0a3ce4cade [apps/settings_message_tree] Remove .cpp file 2020-02-21 16:03:07 +01:00
Léa Saviot
750f655b2f [apps] Move SettingsMessageTree in Shared
It is needed in exam_mode_configuration. This way, we can build one app
only
2020-02-21 16:03:07 +01:00
Neven Sajko
f5e53e03e3 [apps/code] Deduplicate definitions of pi and e
Merge the language-specific definitions of these mathematical constants
into one definition. Note that the definitions were in fact inconsistent
across languages.
2020-02-21 15:36:21 +01:00
Quentin Guidée
e9a440abca Merge branch 'omega-hotfix' into omega-dev 2020-02-20 23:44:06 +01:00
Quentin Guidée
5420a8a34f Merge remote-tracking branch 'upstream/master' into omega-hotfix 2020-02-20 23:41:50 +01:00
Quentin Guidée
1310c459b0 Merge branch 'omega-hotfix' into omega-dev 2020-02-20 23:30:40 +01:00
0b101
43795a7456 Fixed result display bug 2020-02-20 23:28:14 +01:00
Quentin Guidée
071c19c6a0 Merge branch '0b101-moveResultDisplay' into omega-dev 2020-02-20 22:51:59 +01:00
Quentin Guidée
295d86ce71 Merge branch 'moveResultDisplay' of git://github.com/0b101/Omega-1 into 0b101-moveResultDisplay 2020-02-20 22:49:28 +01:00
0b101
377ab54a58 Moved the result display settings to the math sub-menu 2020-02-20 15:45:54 -06:00
Quentin Guidée
f1e39b6709 Fix compilation in official 2020-02-20 22:14:54 +01:00
Quentin Guidée
2c22c3ea68 Merge branch 'omega-hotfix' into omega-dev 2020-02-20 21:54:16 +01:00
Quentin Guidée
f486f856f7 Merge branch 'zardam-freeMemory' into omega-hotfix 2020-02-20 21:52:26 +01:00
Quentin Guidée
0d102be511 Merge branch 'freeMemory' of git://github.com/zardam/epsilon into zardam-freeMemory 2020-02-20 21:49:51 +01:00
Léa Saviot
80c03220dd [poincare/function] Fix getVariables
Faulty scenario:
Equation x+y=f(0) without defining any variable
2020-02-20 11:58:56 +01:00
Léa Saviot
0d8cb0123b [python/port] Fix user interruption char set up
print can be user interrupted, so the interruption char needs to be
set for the whole runCode method
2020-02-20 11:43:31 +01:00
Léa Saviot
9bc0776a6a [apps/code] Allow interruption of infinite print loops
while (True):
  print("hello")
is now interruptible when the user presses Back
2020-02-20 10:59:01 +01:00
Émilie Feral
c3d8e09ceb [apps/calculation] Calculation: invalid heights memoization when forcing the
display output
2020-02-20 10:56:11 +01:00
Émilie Feral
a2a47bb8ae [apps/calculation] Additional outputs: dismiss the pop-up before doing
any Poincare computations to optimize the available space in the
Poincare pool
2020-02-20 10:56:11 +01:00
Émilie Feral
99e88df284 [apps/calculation] Additional outputs: Clean cells when the pop-up
disappears to avoid uselessly overloading the Poincare pool
2020-02-20 10:56:11 +01:00
Émilie Feral
94daf465c4 [escher][apps/calculation] Improve ScrollView::scrollToContentRect to
scroll "smartly" when scrolling to a too-big-to-be-displayed rect

This fixes calculation history navigation on big cells (that are bigger
than the displayed table)
2020-02-20 10:56:11 +01:00
Émilie Feral
24d9f37205 [apps/calculation] Clean how cell subtype is selected/
This fixes crashes: indeed, in the way it was done before, we called
scrollToSubviewOfTypeOfCellAtLocation after setting the new selected subtype
and before reloading the data. However, selecting a new subtype might expand
the selected cell which can temper with the cell repartition. If so, we need to
reload the data to be able to call 'selectedCell' for instance.
2020-02-20 10:56:11 +01:00
Léa Saviot
cf37e5c45a [apps/code] Fix input(), that did not return the input 2020-02-20 10:52:19 +01:00
Léa Saviot
f7c38979a1 [apps/var_box] Create dummy layout when the real layout makes pool error 2020-02-20 10:44:19 +01:00
Léa Saviot
52ae25a04c [apps] Use willExitApp parameter in dismissModalViewController
This prevents relayouting and thus accessing to expressions/ayotus
possibly deleted by a pool exception
2020-02-20 10:44:19 +01:00
Quentin Guidée
54b39a14d6 Merge branch 'omega-hotfix' into omega-dev 2020-02-20 00:43:11 +01:00
Quentin Guidée
73736c9b15 Fix conflicts 2020-02-20 00:42:47 +01:00
Léa Saviot
84a66d3b31 [apps/code] Fix input(), that did not return the input 2020-02-20 00:20:41 +01:00
Léa Saviot
73bec71db3 [apps/code] Allow interruption of infinite print loops
while (True):
  print("hello")
is now interruptible when the user presses Back
2020-02-20 00:08:42 +01:00
Quentin Guidée
c3d3f0d491 Merge branch 'Gegenter-omega-dev-e13' into omega-hotfix 2020-02-19 23:57:15 +01:00
Quentin Guidée
eb2e0ddd3a Merge branch 'omega-dev-e13' of https://github.com/Gegenter/Omega into Gegenter-omega-dev-e13 2020-02-19 23:53:24 +01:00
Damien Nicolet
03886f7d9f Free 1776 bytes of heap by making sTableRows const 2020-02-19 19:23:26 +01:00
Émilie Feral
2a03583fe0 [apps/calculation] Reset history cell memoization when reloading the
table. Otherwise, the Poincare pool store useless layouts for cells that
aren't displayed.

This fixes the following issue: input "(transpose([1 2 3 4 5 6][1 2 3 4 5
6])^8", the computation works, clear the history, input the same
calculation again, it fails with a memory error.
2020-02-19 10:34:28 +01:00
Quentin Guidée
1f8ae2dc88 Omega 1.20.0 2020-02-18 21:30:05 +01:00
Émilie Feral
f6d59ae184 [build] Use $(MAKE) instead of make in Makefiles 2020-02-18 11:34:21 +01:00
Émilie Feral
9cc74c740e [build] Do not version binpack-*.tgz 2020-02-18 11:34:21 +01:00
Émilie Feral
e073b88f4e [build] Revert deletion: required shasum computation 2020-02-18 11:34:21 +01:00
Émilie Feral
8002765c3a [build] Target device n0110: enable to call 'make %.two_binaries'
without specifying the building directory
2020-02-18 11:34:21 +01:00
redgl0w
eb498a0e0f Fixed binpack 2020-02-18 11:34:21 +01:00
Émilie Feral
013f817b35 [apps] Fix i18n to be able to build without settings app in offical
software
2020-02-18 10:11:06 +01:00
Léa Saviot
42125a1f56 [apps/settings] Fix i18n to be able to build without settings app 2020-02-18 10:11:06 +01:00
Léa Saviot
92378b9496 [escher/layout_field] Handle Cut events 2020-02-18 10:08:34 +01:00
Léa Saviot
baba9a4ff0 [apps/code] Regroup the "list.*" methods in the toolbox 2020-02-18 10:07:33 +01:00
Léa Saviot
9544f1c961 [apps/eschr] Don't copy an expr when editing it, if it is too long
Scenario: Create a new sequence which is the multiplication of a lot of
imaginary i. Save it (many multiplication sign are added), then try to
edit it again, in linear edition mode: the text overflows the buffer. If
we still copied it, it might get copied until the middle of a code point,
which would make the UTF8Decoder crash afterwards.
2020-02-18 10:06:36 +01:00
Léa Saviot
176d55b7fa [apps/expression_model] Fix text() implementation 2020-02-18 10:06:36 +01:00
David
96723d8d99 Update apps/toolbox.hu.i18n
Co-Authored-By: Gegenter <36822415+Gegenter@users.noreply.github.com>
2020-02-17 14:41:32 -06:00
David
c456db337f Update apps/toolbox.hu.i18n
Co-Authored-By: Gegenter <36822415+Gegenter@users.noreply.github.com>
2020-02-17 14:41:24 -06:00
David
513c3a8676 Update apps/toolbox.hu.i18n
Co-Authored-By: Gegenter <36822415+Gegenter@users.noreply.github.com>
2020-02-17 14:40:02 -06:00
David
b3e714f8ab Update apps/toolbox.hu.i18n
Co-Authored-By: Gegenter <36822415+Gegenter@users.noreply.github.com>
2020-02-17 14:39:11 -06:00
David
c18b9244ed Update apps/toolbox.hu.i18n
Co-Authored-By: Gegenter <36822415+Gegenter@users.noreply.github.com>
2020-02-17 14:39:04 -06:00
David
41999663aa Update apps/toolbox.hu.i18n
Co-Authored-By: Gegenter <36822415+Gegenter@users.noreply.github.com>
2020-02-17 14:38:58 -06:00
David
ef781d49d0 Update apps/toolbox.hu.i18n
Co-Authored-By: Gegenter <36822415+Gegenter@users.noreply.github.com>
2020-02-17 14:38:52 -06:00
David
207daa31bc Update apps/toolbox.hu.i18n
Co-Authored-By: Gegenter <36822415+Gegenter@users.noreply.github.com>
2020-02-17 14:38:45 -06:00
U-DESKTOP-L7NJ45P\Gegenter
1a81c4b8bb Fixed most of the translations(probably all of them) 2020-02-17 21:20:23 +01:00
Quentin Guidée
dcaa1cb46d Updated to public 2020-02-17 20:33:42 +01:00
Quentin Guidée
df67332880 Fix telemetry 2020-02-17 20:21:42 +01:00
Quentin Guidée
fed07bc94b Font size fix code app 2020-02-17 19:49:53 +01:00
Quentin Guidée
174a57d6ac Merge branch 'omega-dev-e13' of github.com:Omega-Numworks/Omega into omega-dev-e13 2020-02-17 19:05:29 +01:00
Quentin Guidée
2ae5eecac7 Fix infinite loop 2020-02-17 19:05:18 +01:00
Quentin
1aa4c62af3 Merge pull request #250 from Gegenter/patch-4
fixed even more translations
2020-02-17 18:15:28 +01:00
Gegenter
3d932214dc fml 2020-02-17 18:07:00 +01:00
Quentin
0dd49bf4e1 Merge pull request #249 from Gegenter/patch-3
Epstein did not kill himself
2020-02-17 18:00:58 +01:00
Quentin
9622d0ebe1 Merge pull request #248 from Gegenter/patch-2
good stuff
2020-02-17 18:00:46 +01:00
Quentin
441ad3469a Merge pull request #247 from Gegenter/patch-1
Fixed some translations
2020-02-17 18:00:29 +01:00
Gegenter
9ad553a3c8 Epstein did not kill himself
straight facts. oh i also corrected stuff
2020-02-17 17:59:31 +01:00
Gegenter
6fe0fad2a2 good stuff 2020-02-17 17:51:52 +01:00
Quentin Guidée
2388ce3c1a Update README.md 2020-02-17 17:41:59 +01:00
Quentin Guidée
a2b8b603c5 Merge branch 'omega-dev-e13' of github.com:Omega-Numworks/Omega into omega-dev-e13 2020-02-17 17:10:42 +01:00
Quentin Guidée
5b2f33c80a Fix conflicts 2020-02-17 17:10:32 +01:00
Quentin
f5af1d3951 Merge pull request #242 from RedGl0w/patch-8
Fixed %
2020-02-17 16:50:05 +01:00
Gegenter
7a95c325fd Fixed 2020-02-17 16:37:01 +01:00
Romain Goyet
269305c68f [liba] Simplify strlcat 2020-02-17 10:31:24 -05:00
Romain Goyet
553eaaeac0 [ion] Fix telemetry on iOS and Android 2020-02-17 10:31:24 -05:00
Romain Goyet
ff0d03a19b [build] Let platforms override EPSILON options when unset 2020-02-17 10:31:24 -05:00
Romain Goyet
b7f928fee2 [ci] Use proper telemetry flag 2020-02-17 10:31:24 -05:00
Romain Goyet
1353e512fe [apps] Remove dead code 2020-02-17 10:31:24 -05:00
Romain Goyet
a187f39094 [apps] Report telemetry events 2020-02-17 10:31:24 -05:00
Romain Goyet
5dee4a8166 [apps] Add screen telemetry identification 2020-02-17 10:31:24 -05:00
Romain Goyet
b06de12902 [escher] Add a telemetry API based off ion's 2020-02-17 10:31:24 -05:00
Romain Goyet
670490e642 [ion] Add a telemetry API 2020-02-17 10:31:24 -05:00
Romain Goyet
1389f336b8 [build] Add an Objective-C++ rule 2020-02-17 10:31:24 -05:00
Romain Goyet
aa0dbee303 [ion] Console::writeLine can ommit trailing CR/LF 2020-02-17 10:31:24 -05:00
Romain Goyet
7f767990d2 [escher] Inline empty functions in ViewController 2020-02-17 10:31:24 -05:00
Romain Goyet
02a19fc83d [liba] Add strlcat 2020-02-17 10:31:24 -05:00
Romain Goyet
dc4f43eeb0 [liba] Improve strlcpy
Use memcpy (can be optimized) and return the correct size
2020-02-17 10:31:24 -05:00
Romain Goyet
7f43b73049 [apps] Don't forget to call viewWillAppear
At the moment ViewController::viewWillAppear doesn't do anything, so
there is no real impact. But if we want to use it it needs to be called
from subclasses.
2020-02-17 10:31:24 -05:00
0b101
97b756bc54 Fixed error 2020-02-17 08:56:25 -06:00
0b101
978c3e28e9 Added more units 2020-02-17 08:54:43 -06:00
redgl0w
3a954653bd Update text_field.cpp 2020-02-17 09:54:09 +01:00
redgl0w
eaef26c1aa Update editor_controller.cpp 2020-02-17 09:53:30 +01:00
Quentin Guidée
2172eaa7a4 Merge branch 'omega-dev-e13' of github.com:Omega-Numworks/Omega into omega-dev-e13 2020-02-16 23:52:20 +01:00
Quentin Guidée
9af87b293a Update contributors O1.19 2020-02-16 23:52:11 +01:00
Quentin
35f32313e1 Merge pull request #239 from 0b101/TranslationSL
Added (google) translations for result display
2020-02-16 22:48:18 +01:00
0b101
8b7bc904af Added (google) translations 2020-02-16 15:42:59 -06:00
Quentin Guidée
3123a6183e Translation missing 2020-02-16 22:19:19 +01:00
Quentin Guidée
fd0de2cd21 Merge branch '0b101-CompactResult' into omega-dev-e13 2020-02-16 22:11:22 +01:00
Quentin Guidée
42889fa4dd Merge branch 'CompactResult' of https://github.com/0b101/Omega-1 into 0b101-CompactResult 2020-02-16 21:56:10 +01:00
Quentin Guidée
b5f6783ce5 Remove double time module 2020-02-16 21:15:53 +01:00
Quentin Guidée
3d1ac9fc98 Updated Omega-Themes 2020-02-16 21:08:32 +01:00
Quentin Guidée
24ad107c8a Update Atom 2020-02-16 21:04:46 +01:00
Quentin Guidée
1fe318f9ad Update Atom 2020-02-16 20:37:32 +01:00
Quentin Guidée
f4eca02766 Update Atom/RPN 2020-02-16 20:33:38 +01:00
Quentin Guidée
dcda4ca7da Update Atom 2020-02-16 20:33:13 +01:00
Quentin Guidée
78cfa01e6f Update Atom 2020-02-16 20:22:34 +01:00
Quentin Guidée
fac5b0c416 ExamMode types 2020-02-16 20:22:05 +01:00
0b101
0a07a82a96 Added Compact Result Display 2020-02-16 12:47:29 -06:00
Quentin Guidée
83ea330220 Fix n0110 2020-02-16 18:50:40 +01:00
Quentin Guidée
053d11be7a Merge branch 'Gegenter-omega-dev-e13' into omega-dev-e13 2020-02-16 15:26:53 +01:00
Quentin Guidée
731496b3b2 Fixed hu 2020-02-16 15:26:41 +01:00
Gegenter
1617e1b26a newline 2020-02-16 15:10:44 +01:00
U-DESKTOP-L7NJ45P\Gegenter
a4e3e6fcf2 Updates 2020-02-16 15:09:27 +01:00
U-DESKTOP-L7NJ45P\Gegenter
4dacfe532a Updates 2020-02-16 15:07:25 +01:00
U-DESKTOP-L7NJ45P\Gegenter
8ff0b18b36 Updates 2020-02-16 14:58:16 +01:00
Quentin Guidée
49e687d12c Update Atom 2020-02-16 14:21:27 +01:00
Quentin Guidée
8343610b8d Fix palette E13 2020-02-16 14:10:17 +01:00
Quentin Guidée
1a35ca891e [WIP] Fix settings 2020-02-16 13:47:28 +01:00
Quentin Guidée
9de231ba64 [WIP] Fix settings 2020-02-16 13:14:41 +01:00
Quentin Guidée
f1ee3d78ef [WIP] Fix settings 2020-02-16 12:42:08 +01:00
Quentin Guidée
661a48f29d [WIP] Fix settings 2020-02-16 12:27:42 +01:00
Quentin Guidée
29b848625b [WIP] Fix settings 2020-02-16 12:17:57 +01:00
Quentin Guidée
be3829610a [WIP] Fix settings 2020-02-16 12:15:31 +01:00
Quentin Guidée
3e2585a211 Merge branch 'omega-dev-e13' of github.com:Omega-Numworks/Omega into omega-dev-e13 2020-02-16 11:58:15 +01:00
Quentin Guidée
1d2bf7fcb3 [WIP] Fix settings 2020-02-16 11:58:06 +01:00
Quentin
ef86c17834 Merge pull request #228 from RedGl0w/patch-7
Patch #226
2020-02-16 11:50:49 +01:00
Quentin Guidée
b52626ed65 [WIP] Fix settings 2020-02-16 10:50:34 +01:00
Quentin Guidée
17f4ef4c0d Re-enable external 2020-02-16 10:05:16 +01:00
Quentin Guidée
dffcfa5294 Merge branch 'RedGl0w-patch-10' into omega-dev-e13 2020-02-16 10:04:14 +01:00
Quentin Guidée
5b0e806e00 Merge branch 'patch-10' of https://github.com/RedGl0w/epsilon into RedGl0w-patch-10 2020-02-16 10:01:42 +01:00
redgl0w
71f21c677c Update pointer_text_table_cell.h 2020-02-16 08:54:10 +01:00
Quentin Guidée
5e60f261d9 Fix ram from 16 to 32K for python heap 2020-02-16 00:21:35 +01:00
Quentin Guidée
1039b22260 Symbolic computation 2020-02-13 20:07:38 +01:00
Quentin Guidée
b2a683a8f2 RPN Fixed 2020-02-13 19:24:07 +01:00
Quentin Guidée
da5ce1840e Merge remote-tracking branch 'upstream/master' into omega-dev-e13 2020-02-13 12:31:59 +01:00
Léa Saviot
c23ad0c882 [poincare/parser] Fix a comment 2020-02-13 10:26:18 +01:00
Quentin Guidée
e7d1a677c3 Fix crash n0110 2020-02-12 23:24:36 +01:00
Quentin Guidée
30386e53f6 Fixed some errors with E13 2020-02-12 23:05:53 +01:00
Quentin Guidée
123b41232b [WIP] Fixed Accessibility settings. Must be reverted 2020-02-12 20:17:03 +01:00
Quentin Guidée
9212b24626 Fixed some errors with E13 2020-02-12 19:52:24 +01:00
Quentin Guidée
31cdd5bcc8 Fixed some conflicts 2020-02-12 18:24:13 +01:00
Quentin Guidée
ab8f731515 Fixed some conflicts 2020-02-12 17:42:58 +01:00
Léa Saviot
7123c7c098 build: Version 13.0.0 2020-02-12 15:46:32 +01:00
Léa Saviot
bbee8945b3 [apps/code/toolbox] Remove too long i18n 2020-02-12 15:46:32 +01:00
Léa Saviot
af621838b9 [quiz/runner] For device, sleep after the tests have properly finished 2020-02-12 15:13:27 +01:00
Léa Saviot
6dced2d157 [python/test] Do not use such a big python heap 2020-02-12 15:13:27 +01:00
Ruben Dashyan
406549ff08 [apps/math_toolbox] Remove micro- nano- picoliter 2020-02-12 15:13:27 +01:00
Ruben Dashyan
3abb86bcdd [apps/math_toolbox] Remove all Siemens prefixes except milli 2020-02-12 15:13:27 +01:00
Ruben Dashyan
28f7202827 [apps/math_toolbox] Remove all Ohm prefixes except kilo 2020-02-12 15:13:27 +01:00
Ruben Dashyan
57fb47da01 [apps/math_toolbox] Remove tera- giga- mega- kilo- nano- picofarad 2020-02-12 15:13:27 +01:00
Ruben Dashyan
7bbd398491 [apps/math_toolbox] Remove tera- giga= mega- nano- picovolt 2020-02-12 15:13:27 +01:00
Ruben Dashyan
48deee5622 [apps/math_toolbox] Remove all Coulomb prefixes 2020-02-12 15:13:27 +01:00
Ruben Dashyan
444f157b1a [apps/math_toolbox] Remove tera- nano- picowatt 2020-02-12 15:13:27 +01:00
Ruben Dashyan
284207a367 [apps/math_toolbox] Remove tera- giga- micro- nano- picoelectronvolt 2020-02-12 15:13:27 +01:00
Ruben Dashyan
b85d65d037 [apps/math_toolbox] Remove tera- giga- mega- micro- nano- picojoule 2020-02-12 15:13:27 +01:00
Ruben Dashyan
11c65697a0 [apps/math_toolbox] Add hectopascal 2020-02-12 15:13:27 +01:00
Ruben Dashyan
1e1f3b3936 [apps/math_toolbox] Shortcut Pascal menu and remove all prefixes 2020-02-12 15:13:27 +01:00
Ruben Dashyan
63cb3fbcc0 [apps/math_toolbox] Remove tera- giga- mega- micro- nano- piconewton 2020-02-12 15:13:27 +01:00
Ruben Dashyan
c09c4a02db [apps/math_toolbox] Remove terahertz 2020-02-12 15:13:27 +01:00
Ruben Dashyan
3e5efe5f22 [apps/math_toolbox] Remove pico- nanomole 2020-02-12 15:13:27 +01:00
Ruben Dashyan
76ed3f5ad3 [apps/math_toolbox] Remove pico- nanoampere 2020-02-12 15:13:27 +01:00
Ruben Dashyan
bab5d20dfb [apps/math_toolbox] Shortcut Gram menu and move tonne 2020-02-12 15:13:27 +01:00
Ruben Dashyan
e6397d7093 [apps/math_toolbox] Remove tera- giga- mega- picogram 2020-02-12 15:13:27 +01:00
Ruben Dashyan
41de2abc22 [apps/math_toolbox] Remove tera- giga- megameter 2020-02-12 15:13:27 +01:00
Ruben Dashyan
1c407bc398 [apps/math_toolbox] Remove picosecond 2020-02-12 15:13:27 +01:00
Léa Saviot
5309610b01 [apps/code/toolbox] Fix z.real and z.imag cursor position 2020-02-12 15:13:27 +01:00
Léa Saviot
6711b96ed9 [apps/code/Toolbox] No conjugation in English 2020-02-12 15:13:27 +01:00
Léa Saviot
737f38dd66 [escher/metric] Increase pop up width
The table cells have a new right margin, which makes old toolbox
messages overflow the toolbox. We increase the toolbox width by 10px to
fix this.
2020-02-12 15:13:27 +01:00
Léa Saviot
faee99b51b [apps/code] Fix list items of the toolbox 2020-02-12 15:13:27 +01:00
Léa Saviot
cefaf878d0 [apps/code/toolbox] Fix messages
Too long + wrong code point for the signle quotation mark
2020-02-12 15:13:27 +01:00
Ruben Dashyan
a08c5be0d8 [poincare/multiplication] Call directly shallowReduce instead of deepReduce 2020-02-12 15:13:27 +01:00
Ruben Dashyan
13391d486e [poincare/n_ary_expression] Do not compute numberOfChildren repeatedly 2020-02-12 15:13:26 +01:00
Émilie Feral
466f588a99 [apps/settings] Between two 'didEnterResponderChain', the exam mode page
might change the number of rows/the displayed messages. We then have to
re-layout the SelectableViewWithMessages to set the right frame to the
SelectableTableView.
2020-02-12 15:13:26 +01:00
Émilie Feral
46fb233428 [apps/settings] I18n: improve message alignment 2020-02-12 15:13:26 +01:00
Émilie Feral
2868a25385 [apps] ExamModeConfiguration: display Dutch exam mode only when the
language is English
2020-02-12 15:13:26 +01:00
Émilie Feral
8a87bcfc5b [apps/settings] SelectableViewWithMessages: position the additional
messages at the bottom of the view
2020-02-12 15:13:26 +01:00
Émilie Feral
3c52631245 [apps/settings] Improve warning messages about non-official software 2020-02-12 15:13:26 +01:00
Ruben Dashyan
089f1c4518 [apps/math_toolbox] Shortcut Liter menu 2020-02-12 15:13:26 +01:00
Ruben Dashyan
de08e7774d [apps/math_toolbox] Shortcut Siemens menu 2020-02-12 15:13:26 +01:00
Ruben Dashyan
e74f0b1a9f [apps/math_toolbox] Shortcut Ohm menu 2020-02-12 15:13:26 +01:00
Ruben Dashyan
316c8c4fd9 [apps/math_toolbox] Shortcut Farad menu 2020-02-12 15:13:26 +01:00
Ruben Dashyan
b0abc7a100 [apps/math_toolbox] Shortcut Volt menu 2020-02-12 15:13:26 +01:00
Ruben Dashyan
e07cc2014d [apps/math_toolbox] Shortcut Coulomb menu 2020-02-12 15:13:26 +01:00
Ruben Dashyan
f03d5f29eb [apps/math_toolbox] Shortcut Watt menu 2020-02-12 15:13:26 +01:00
Ruben Dashyan
01fb8f1881 [apps/math_toolbox] Shortcut Newton menu 2020-02-12 15:13:26 +01:00
Ruben Dashyan
40c5eec1b4 [apps/math_toolbox] Shortcut Hertz menu 2020-02-12 15:13:26 +01:00
Ruben Dashyan
2c65c1164c [apps/math_toolbox] Shortcut Mole menu 2020-02-12 15:13:26 +01:00
Ruben Dashyan
be6760bf48 [apps/math_toolbox] Shortcut Ampere menu 2020-02-12 15:13:26 +01:00
Ruben Dashyan
70b46e3275 [apps/math_toolbox] Remove Weber unit 2020-02-12 15:13:26 +01:00
Ruben Dashyan
010173515a [apps/math_toolbox] Remove Katal unit 2020-02-12 15:13:26 +01:00
Ruben Dashyan
912d777e92 [apps/math_toolbox] Remove Dalton unit 2020-02-12 15:13:26 +01:00
Ruben Dashyan
42358e0df2 [apps/shared.universal.i18n] Fix typo 2020-02-12 15:13:26 +01:00
Ruben Dashyan
79c161e49a [apps/toolbox.i18n] Fix typo 2020-02-12 15:13:26 +01:00
Léa Saviot
6f4a51a56d [apps/poincare] Use IEEE754::exponentBase10 instead of floor(log10) 2020-02-12 15:13:26 +01:00
Léa Saviot
c9f83f6e7e [apps/statistics] Fix bar width computation
There was a float -> double conversion lack of precision, which resulted
in akward results
Scenario:
Data
V N    Then display the histogram: the second bar is [1.9;2[ but
1 1    contains the 2 value
2 1
2020-02-12 15:13:26 +01:00
Émilie Feral
922d3cc0c6 [build] Fix targets 2020-02-12 15:13:26 +01:00
Émilie Feral
72ef9d5fd7 [apps/probability] Clean Makefile 2020-02-12 15:13:26 +01:00
Émilie Feral
f69bc6c8e4 [apps] Makefile: fix tests build 2020-02-12 15:13:26 +01:00
Émilie Feral
63d2aab416 [apps/settings] Improve messages of cautious in non-official softwares 2020-02-12 15:13:26 +01:00
Émilie Feral
5432a97bd2 [apps] Change license of exam_mode_configuration_official to
CC-BY-NC-ND-4.0
2020-02-12 15:13:26 +01:00
Émilie Feral
e17ae9024e [apps] Gather all code regarding exam mode in ExamModeCOnfiguration file 2020-02-12 15:13:26 +01:00
Émilie Feral
541acb6a7c [apps/settings] Factorize SettingsMessageTree model definition between
different targets (none/beta/update)
2020-02-12 15:13:26 +01:00
Émilie Feral
672a1a3967 [apps/settings] Change non-official-version warning messages 2020-02-12 15:13:26 +01:00
Ruben Dashyan
51698ee8c5 [apps/graph/graph/graph_controller] Fix initial cursor color 2020-02-12 15:13:26 +01:00
Ruben Dashyan
b54d5a31ba [apps/shared/function] BaseNameCompliant returns a NameNotCompliantError
instead of a boolean
2020-02-12 15:13:26 +01:00
Émilie Feral
ce5f8236a9 [apps] Add comment around warning regarding non-official releases 2020-02-12 15:13:26 +01:00
Émilie Feral
f079660d69 [apps] i18n routine: enable to add comment in *.i18n files 2020-02-12 15:13:26 +01:00
Émilie Feral
6d2d5c6837 [build] Add confirmation before building official softwares 2020-02-12 15:13:26 +01:00
Émilie Feral
3612d25539 [apps/settings] AboutController::m_view should live inside the Settings
app

This fixes the following bug: AboutController::view was built at first
call of "AboutController::view()" but the Settings can be rebuilt later
and the pointers might have moved (hence the ones used in
AboutController::view constructor which is not rebuilt then)
2020-02-12 15:13:26 +01:00
Léa Saviot
4d8099e273 [poincare/matrix] shallowReduce checks there are no unit children 2020-02-12 15:13:26 +01:00
Ruben Dashyan
473d12f165 [apps/shared/function] Fix typo
introduced in
[ion/unicode/codepoint] Rename is[(Lower|Upper)Case]Letter to isLatin[(Small|Capital)]Letter
2020-02-12 15:13:26 +01:00
Ruben Dashyan
9526d1d591 [poincare/unit] Lighten Dimension constructor 2020-02-12 15:13:26 +01:00
Ruben Dashyan
1e3b8581e5 [poincare/unit] Lighten Representative constructor 2020-02-12 15:13:26 +01:00
Ruben Dashyan
9fc1182733 [escher/message_tree] Inline in header file 2020-02-12 15:13:26 +01:00
Ruben Dashyan
7d72d5abd7 [poincare/tree_handle] Assert B is not an ancestor of A in replaceWithInPlace(A, B) 2020-02-12 15:13:26 +01:00
Émilie Feral
fffcadf384 [apps/settings] Display a caution message in the 'about' page in non-official
software versions
2020-02-12 15:13:26 +01:00
Émilie Feral
b28f426d36 [apps/settings] Add warning message about software liability 2020-02-12 15:13:25 +01:00
Émilie Feral
f57fb84429 [apps/settings] Create a class SelectableViewWithMessages used in
ExamModeController for future factorization
2020-02-12 15:13:25 +01:00
Émilie Feral
7ccb10e33b [apps/settings] Display exam mode caution message in non-official
version only
2020-02-12 15:13:25 +01:00
Émilie Feral
10de2c00ac [apps/settings] Add a warning message in Exam mode page 2020-02-12 15:13:25 +01:00
Émilie Feral
485684e8db [apps/settings] Add messages for exam mode compliance warning 2020-02-12 15:13:25 +01:00
Émilie Feral
9ed55e97a9 [apps/settings] Non-official builds don't feature Dutch exam mode 2020-02-12 15:13:25 +01:00
Émilie Feral
1ebf56ef4a [build] Duplicate targets: official/non-official 2020-02-12 15:13:25 +01:00
Émilie Feral
a211b6efb6 [poincare] Change unit name: hour -> h 2020-02-12 15:13:25 +01:00
Ruben Dashyan
ca50e764a5 [poincare/test] Test the presence of units as Expression children 2020-02-12 15:13:25 +01:00
Ruben Dashyan
e39ad9d923 [poincare/expression_node] Fix ExpresssionNode::Type ordering
A Multiplication whose children are all real or ComplexCartesian are
multiplied to form a single ComplexCartesian. That step of shallowReduce
assumed that the last child is a ComplexCartesian. Since a Unit is now
considered as real, the previous assumption can be maintained be
reordering the ExpresssionNode::Type.
2020-02-12 15:13:25 +01:00
Ruben Dashyan
4a6b633c74 [poincare] Fix commit "Reducing an Expression which hasUnit in its children returns Undefined in general" 2020-02-12 15:13:25 +01:00
Léa Saviot
c124447837 [poincare/test] Add test on UnitConvert simplification 2020-02-12 15:13:25 +01:00
Léa Saviot
b2a37cfd3e [poincare] Fix tests 2020-02-12 15:13:25 +01:00
Léa Saviot
94d71634b6 [poincare/unit_convert] In shallowReduce, fix units testing on the right
First reduce the right member by replacing the units to make sure there
is a unit, then reduce without replacing to keep "complex units" such as
L, N, ...
2020-02-12 15:13:25 +01:00
Léa Saviot
1e3294139d [poincare/parser] 0→0→c should not be parsable 2020-02-12 15:13:25 +01:00
Ruben Dashyan
681ab5429a [poincare/test/simplification] Fix typos 2020-02-12 15:13:25 +01:00
Ruben Dashyan
81d755927c [apps/calculation/calculation] Fix array length computation 2020-02-12 15:13:25 +01:00
Ruben Dashyan
b5233845ba [poincare/expression] Fix Unit approximation in beautifyAndApproximateScalar
A Unit is considered as real, which was not the case before.
2020-02-12 15:13:25 +01:00
Léa Saviot
2e5df5196f [poincare/expression] hasUnits makes less computations 2020-02-12 15:13:25 +01:00
Léa Saviot
23e8033a3e [poincare/test] Add tests on unit convert simplification 2020-02-12 15:13:25 +01:00
Léa Saviot
1588f81bea [poincare/power] Fix shallowReduce with units
(3_m^2)^3 should be reduced to 3_m^6
2020-02-12 15:13:25 +01:00
Léa Saviot
308ffb3e3c [poincare/test] Add tests on getUnit 2020-02-12 15:13:25 +01:00
Ruben Dashyan
cc280373d0 [poincare] Reducing an Expression which hasUnit in its children returns Undefined in general 2020-02-12 15:13:25 +01:00
Ruben Dashyan
f465637c86 [poincare/complex_cartesian] Add defaultShallowReduce 2020-02-12 15:13:25 +01:00
Ruben Dashyan
2d5708c782 [poincare] Remove dummy defaultShallowReduce
Decimal and BasedInteger have no children
2020-02-12 15:13:25 +01:00
Léa Saviot
e4601206be [poincare/power] Fix getUnit -> return Undef if base has undef unit 2020-02-12 15:13:25 +01:00
Léa Saviot
2527f30429 [poincare] Beware of units in "difficult" shallowReduces - Power 2020-02-12 15:13:25 +01:00
Léa Saviot
e1a7dcdb13 [poincare] Beware of units in "difficult" shallowReduces - Addition 2020-02-12 15:13:25 +01:00
Léa Saviot
b93277bb7b [poincare/test] Fix tests
Unparsable tests are now parsable but return undef at the simplification
2020-02-12 15:13:25 +01:00
Léa Saviot
d5b07f1f90 [poincare] Implemment getUnit 2020-02-12 15:13:25 +01:00
Léa Saviot
94334169f0 [poincare/expr] Remove beautifiedExpHasUnits and reducedExpIsUnitsOnly 2020-02-12 15:13:25 +01:00
Léa Saviot
ecdcb100fb [poincare/unit_convert] Fix UnitConvert::shallowReduce 2020-02-12 15:13:25 +01:00
Léa Saviot
d98eddf960 [poincare/parser] UnitConvert does not check the right member is a unit 2020-02-12 15:13:25 +01:00
Émilie Feral
9dbb1153a1 [escher] Add TODOs on EditableField, InputEventHandler, LayoutField,
TextInput, TextArea, TextInput
2020-02-12 15:13:25 +01:00
Émilie Feral
9c25fdb66e [escher] TextField: fix shouldFinishEditing to reset selection 2020-02-12 15:13:25 +01:00
Émilie Feral
2470821a6b [apps/settings] Fix sub controller viewWillAppear /
didEnterResponderChain behaviours

This fixes the following bug: when editing the number of significant
digits, input "1+", click on "OK", the data was reloaded and "1+"
disappeared...
2020-02-12 15:13:25 +01:00
Émilie Feral
4e6411e4a5 [poincare] Unit: missing include for device build 2020-02-12 15:13:25 +01:00
Ruben Dashyan
3aea607be2 [poincare] Force Float(1) in front of an orphan (Power of) Unit 2020-02-12 15:13:25 +01:00
Ruben Dashyan
d8e36e3cf1 [poincare/test/simplification] Fix units' tests 2020-02-12 15:13:25 +01:00
Ruben Dashyan
907bd0db62 [poincare/test/simplification] Fix typo 2020-02-12 15:13:25 +01:00
Ruben Dashyan
30fb27d36a [poincare/test/simplification] Add tests on Units 2020-02-12 15:13:25 +01:00
Léa Saviot
16a832507e [emscripten/whitelist] Whitelist some methods 2020-02-12 15:13:25 +01:00
Émilie Feral
533f1312db [solver] Add test with 6 variables 2020-02-12 15:13:25 +01:00
Émilie Feral
3df80ed780 [poincare] ParameteredExpression: overrides getVariables to avoid
considering parameter as a variable
2020-02-12 15:13:25 +01:00
Léa Saviot
b8f65442db [ion/simulator] Keyboard shift + left/right/up/down now works 2020-02-12 15:13:25 +01:00
Émilie Feral
5cb26b19a5 [poincare] Parsing: Unit token does not accept '_' char except at first
position. This enables to parse "_km_s" as Multiplication(Unit(km),
Unit(s))
2020-02-12 15:13:25 +01:00
Émilie Feral
f91ca59ca3 [poincare] Test: call Expression::Parse instead of creating a parser
object everytime we need to parse something
2020-02-12 15:13:24 +01:00
Léa Saviot
5afb49c85d [poincare] Rename RightArrow -> RightwardsArrow 2020-02-12 15:13:24 +01:00
Léa Saviot
83ea9cf1e1 [poincare/parser] Rename Store with RightwardsArrow 2020-02-12 15:13:24 +01:00
Léa Saviot
7a65e5180b [poincare/right_arrow_expression] Factorize Store and UnivtConvert 2020-02-12 15:13:24 +01:00
Léa Saviot
8a0e5403ae [poincare/test] Add unit conversion tests 2020-02-12 15:13:24 +01:00
Ruben Dashyan
657ae5ff63 [poincare/unit] Fix shallowBeautify
Expressions with Units inside an Opposite were beautifed as Undefined
2020-02-12 15:13:24 +01:00
Ruben Dashyan
22e22b8123 [poincare/tree_handle] Make sure B has the same parent as A after A.replaceWithInPlace(B)
Even when A has no parent, B should be detached from its old parent.
2020-02-12 15:13:24 +01:00
Léa Saviot
4651f7ef0d [poincare/expression] Fix simplifyAndApproximate with convertUnit 2020-02-12 15:13:24 +01:00
Émilie Feral
1484dbc5d4 [poincare] Multiplication::shallowReduce: simplify implementation!
(recursivelyMatches all children is equivalent to recursivelyMatches on
the current node)
2020-02-12 15:13:24 +01:00
Émilie Feral
ff438cbea8 [poincare] Multiplication::shallowReduce: don't apply 0*a --> 0 when a
involves unit or infinity
2020-02-12 15:13:24 +01:00
Émilie Feral
ee1224dd95 [poincare] Multiplication::shallowBeautify: Keep the unit when the value
is 0 or undefined, add tests
2020-02-12 15:13:24 +01:00
Émilie Feral
879843ce2b [escher] LayoutField: reset selection when the field should finish
editing

This fixes the following bug: in solver, input Matrix(Matrix()) and select the
inner Matrix. When handling "OK" event, the "=0" is inserted at a wrong
position leading to a crash !
2020-02-12 15:13:24 +01:00
Ruben Dashyan
2ae435a628 [apps/calculation/calculation] Remove redundancy
When each Calculation had its own text buffer, the Expression of an
overflowing output text was Undefined. Hence that Expression could have
been Undefined without the corresponding text being 'undef'. That situation
may not happen anymore since Calculation are stored in a shared buffer.
2020-02-12 15:13:24 +01:00
Léa Saviot
cb119b796a [poincare/symbol] Use flag RplceAllSymbolsWithUndefAndDoNotRplceUnits 2020-02-12 15:13:24 +01:00
Léa Saviot
c543985094 [poincare] Unit conversion 2020-02-12 15:13:24 +01:00
Ruben Dashyan
1393e5e973 [apps/calculation/calculation] Rearrange the conditions forcing DisplayOutput::ApproximateOnly 2020-02-12 15:13:24 +01:00
Ruben Dashyan
46a5a7cf5c [apps/calculation/calculation] Force DisplayOutput::ApproximateOnly when there is Unit
The most common case where only the approximate output is displayed
happens when the exact and the approximate outputs are equal, more
precisely when the exact output is equal to the approximate output with
the number of significant digits taken from user settings. That
clarification matters for the Poincare::Integers which have more digits than
the number of significant digits set by the user.

Besides, an Expression containing Units is simplified as
Multiplication(Float, Unit...) recorded identically into the exact and
the approximate outputs (except perhaps the number of significant
digits). Generally, the case where the number of digits in the output is
smaller or equal to the user setting would be matched by the condition,
stated above, that exact and approximate output are equal. But that
should also be the case whatever the number of significant digits. That
is why the presence of Units is matched specifically.
2020-02-12 15:13:24 +01:00
Émilie Feral
4bcb3283c2 [escher] TextField: handleEventWithText: don't move the cursor position
if the text could not be inserted
2020-02-12 15:13:24 +01:00
Émilie Feral
0ffcf34eb7 [escher] TextField: make the handleEventWithText behaviour consistent:
when a text cannot be inserted because it overflows the buffer, don't
add anything

insertTextAtLocation already behaves like this but handleEventWithText
used to cap the inserted text which sometimes leads to a different
behaviour - it would insert a truncated text
2020-02-12 15:13:24 +01:00
Émilie Feral
0c55ea4531 [ion] unicode: UTF8Helper::CopyAndRemoveCodePoints returns a boolean
which is true if the whole source was copied
2020-02-12 15:13:24 +01:00
Ruben Dashyan
0a61e0f7bc [apps/shared/round_cursor_view] Add warning about getPixels 2020-02-12 15:13:24 +01:00
Ruben Dashyan
8d3f86c77f [kandinsky/context] getPixel only if in the clipping rect
Fixes the redrawing of RoundCursorView when its frame overlaps the
clipping rect.
2020-02-12 15:13:24 +01:00
Ruben Dashyan
7b8f7007c4 [kandinsky/context] Inline in header file 2020-02-12 15:13:24 +01:00
Ruben Dashyan
63424fb98b [apps/*/function_graph_controller] Factor selectFunctionWithCursor 2020-02-12 15:13:24 +01:00
Ruben Dashyan
246a9aa7a4 [apps/shared/function_graph_controller] Clarify function selection in initCursorParameters 2020-02-12 15:13:24 +01:00
Ruben Dashyan
1cdd61ea47 [apps/shared/function_graph_controller] Do not compute the numberOfActiveFunctions repeatedly 2020-02-12 15:13:24 +01:00
Ruben Dashyan
503a9ed128 [apps/shared/round_cursor_view] Fix GRAPH_CURSOR_SPEEDUP macro usage 2020-02-12 15:13:24 +01:00
Émilie Feral
9d1a5ea0a8 [escher] LayoutField: fix putCursorRightOfLayout to update matrix
layouts if necessary
2020-02-12 15:13:24 +01:00
Émilie Feral
18b4514412 [python] port: add a comment abouth how we use setjmp 2020-02-12 15:13:24 +01:00
Léa Saviot
2318019d7b [apps/solver] Center used/ignored variables messages 2020-02-12 15:13:24 +01:00
Léa Saviot
9200e6062d [aps/solver] Reset the solution selection when leaving the view
Solve an equation that has solutions, select a solution, then go back
and change the equation. WHen you go to the solutions, the previous
solution is still selected, which is a little weird
2020-02-12 15:13:24 +01:00
Émilie Feral
fdb1417a02 [buil] emscripten toolchain: fix build with emmc version >= 1.39.5 2020-02-12 15:13:24 +01:00
Léa Saviot
bb2e8ad3c5 [apps/settings] Fix selection
Scenario: Got to About menu, press 6 on FCC ID then cancel, there are
two selected rows
This reverts 41e41b8d4 with a better fix
2020-02-12 15:13:24 +01:00
Léa Saviot
963edd5c35 [apps/solver] Fix addition of "=0" to equations
ShiftRight no longer puts the cursor at the end of the text/layout.
2020-02-12 15:13:24 +01:00
Léa Saviot
c5315189ac [apps/solver] Fix SolutionsController::k_maxNumberOfVisibleCells 2020-02-12 15:13:24 +01:00
Émilie Feral
de74aa7e59 [python] Enable PYSTACK for emscripten platform: this "fixes" bug
probably due to gc_collect (we suspect that transpiled C does not have
access to javascript variables preventing it from collecting all
required roots and leading to deleting objects prematuraly). Enabling
PyStack reduces the use of the heap and fixes the bug.
2020-02-12 15:13:24 +01:00
Émilie Feral
58acedfd34 [python] Test: inline code to avoid changing runCode behaviour 2020-02-12 15:13:24 +01:00
Léa Saviot
f7892d887f [poincare/tokenizer] Fix popToken with greek code points 2020-02-12 15:13:24 +01:00
Ruben Dashyan
a13ce5df49 [poincare/test/simplification] Test simplification of units 2020-02-12 15:13:24 +01:00
Léa Saviot
ae3fa46191 [escher/text_field] Fix handling of \n
The buffer length did not take into account the \n removal. In fact, we
could just remove the \n while also removing the empty code points,
which is what we do now.
2020-02-12 15:13:24 +01:00
Léa Saviot
4b996b333b [poincare/empty_context] Add missing file 2020-02-12 15:13:24 +01:00
Émilie Feral
0348db5d2e [escher] TextArea: fix drawStringAt action with negative length 2020-02-12 15:13:24 +01:00
Léa Saviot
eff0a26835 [apps/probability] Clean distribution_controller
Cleaner .cpp and fix the number of cells
2020-02-12 15:13:24 +01:00
Léa Saviot
96df307833 [poincare/test] Clean arguments of ProcessExpression 2020-02-12 15:13:24 +01:00
Léa Saviot
3b80b747b2 [test/solver] Add more tests 2020-02-12 15:13:24 +01:00
Léa Saviot
9102ba1381 [poincare/function] Fix shallowReduce to take into account symbComp 2020-02-12 15:13:24 +01:00
Léa Saviot
6a57b46f8d [poincare.test] Add tests on symbolic computation 2020-02-12 15:13:24 +01:00
Léa Saviot
c4beb5ec63 [apps/solver] Fix x10 display in approximate solutions
Scenario: Solve the equation cos(x) = 10 between -1000 and 1000, the x10
solution was badly displayed.
2020-02-12 15:13:24 +01:00
Léa Saviot
25ef10a0c5 [tests/solver] Add test on solver + user defined symbols 2020-02-12 15:13:24 +01:00
Léa Saviot
470b713226 [test] Fix tests for new SymbolicComputation parameter 2020-02-12 15:13:24 +01:00
Léa Saviot
72259f359c [apps/solver] Fix rowHeight for approximated solutions
User variables rows were too small
2020-02-12 15:13:24 +01:00
Léa Saviot
248e875192 [apps/solver] Always display used variables
Scenario: 3->x, 4->y, equation x+y+c=0 would not display the values of x
and y
2020-02-12 15:13:24 +01:00
Léa Saviot
424ee9fa15 [poincare] Add SymbolicComputation parameter to the reduction context
This way, in solver, we can reduce expression without expanding symbols
2020-02-12 15:13:24 +01:00
Léa Saviot
016a68d469 [apps/solver] Do not select "User variables used" row 2020-02-12 15:13:23 +01:00
Léa Saviot
db0e7f0d8b [apps/solver] Display user variables in the solutions 2020-02-12 15:13:23 +01:00
Léa Saviot
afbca672fd [escher/button_row_controller] Remove unused variable 2020-02-12 15:13:23 +01:00
Léa Saviot
7e7a37bf8e [apps/solver/solutions_controller] Code cleaning 2020-02-12 15:13:23 +01:00
Léa Saviot
0e64e89496 [apps/solver] Do not use symbol context if no solution found
Still replace the functions
2020-02-12 15:13:23 +01:00
Ruben Dashyan
844a28db7b [poincare/parsing/tokenizer] Token::Identifiers may contain Greek letters except pi 2020-02-12 15:13:23 +01:00
Ruben Dashyan
7964a2ae6a [poincare/unit][kandinsky/font] Use Greek capital letter omega as Ohm unit symbol 2020-02-12 15:13:23 +01:00
Ruben Dashyan
3308427dd4 [poincare/unit] Fix micro prefix symbol 2020-02-12 15:13:23 +01:00
Ruben Dashyan
7cfdadd394 [kandinsky/font] Define IndexForReplacementCharacterCodePoint 2020-02-12 15:13:23 +01:00
Ruben Dashyan
dd92450115 [kandinsky/font] Included header is in C language 2020-02-12 15:13:23 +01:00
Ruben Dashyan
009faa1e37 [kandinsky/font] Factor indexForCodePoint default return value 2020-02-12 15:13:23 +01:00
Émilie Feral
ed035ec3f7 [poincare] Unit: h --> hour 2020-02-12 15:13:23 +01:00
Émilie Feral
22bbe932c8 [poincare] Unit: no prefix for tonne unit 2020-02-12 15:13:23 +01:00
Émilie Feral
a78d34293c [app] Toolbox: add the unit menu 2020-02-12 15:13:23 +01:00
Léa Saviot
b29d014695 [escher/text_field] Fix removing of \n in insertTextAtLocation
Scenario: Copy a text with \n (for instance from a script), then paste
it in a script name -> if \n are replaed with \0 instead of just being
removed, there are problems with the extension
2020-02-12 15:13:23 +01:00
Romain Goyet
ad665fba73 [python] Add a simple test 2020-02-12 15:13:23 +01:00
Ruben Dashyan
179ce5d5d5 [ion/unicode/codepoint] Rename is[(Lower|Upper)Case]Letter to isLatin[(Small|Capital)]Letter
to conform with unicode terminology
2020-02-12 15:13:23 +01:00
Ruben Dashyan
575b911da9 [ion/unicode] Split isDigit into isDecimalDigit, isBinaryDigit, isHexadecimalDigit 2020-02-12 15:13:23 +01:00
Ruben Dashyan
d48a882f04 [poincare/parsing/tokenizer] Fix popWhile return value
for handling CodePoints whose char size is larger than one.
2020-02-12 15:13:23 +01:00
Ruben Dashyan
25a5fb1048 [poincare/parsing/tokenizer] popWhile tests 'didPop' condition only once 2020-02-12 15:13:23 +01:00
Ruben Dashyan
622673a0fa [poincare/parsing/tokenizer] Remove unused method 2020-02-12 15:13:23 +01:00
Ruben Dashyan
31c07e0a58 [poincare/parsing/tokenizer] Simplify popIdentifier 2020-02-12 15:13:23 +01:00
Ruben Dashyan
15a9137d14 [poincare/unit] Remove angstrom unit 2020-02-12 15:13:23 +01:00
Ruben Dashyan
09e1c2eb8b [escher/text_input] insertTextAtLocation location parameter not const anymore 2020-02-12 15:13:23 +01:00
Ruben Dashyan
742ee475ea [escher/text_area] Fix typo 2020-02-12 15:13:23 +01:00
Ruben Dashyan
6da74ea3e1 [poincare/unit] Add prefixes for liter 2020-02-12 15:13:23 +01:00
Ruben Dashyan
c66ef8212a [poincare/unit] Do not output units with short-scale prefixes 2020-02-12 15:13:23 +01:00
Ruben Dashyan
ab836c7a01 [poincare/unit] Distinguish prefixability of units at input and output 2020-02-12 15:13:23 +01:00
Ruben Dashyan
b578ed56f8 [poincare/parsing/tokenizer] Avoid using UTF8Helper 2020-02-12 15:13:23 +01:00
Ruben Dashyan
9b0b4e3096 [ion/unicode] Define and use CodePoint const methods
isLowerCaseLetter
isUpperCaseLetter
isLetter
isDigit

Remove similar ones from UTF8Helper and from Poincare::Tokenizer.
2020-02-12 15:13:23 +01:00
Léa Saviot
7665ad6fe0 [apps/graph/graph_controller] Fix interestingRanges step
Scenario
Create an empty f function
Create g(x) = 1/x
Go to the graph
Change f(x) to f(theta) = theta^2 + 3
Go back to the graph -> the axes computation was very long
2020-02-12 15:13:23 +01:00
Léa Saviot
244c7b31eb [ion/web] Fix screenshots 2020-02-12 15:13:23 +01:00
Ruben Dashyan
50f1ee9721 [poincare/multiplication] Fix handling of units with non-integer exponent 2020-02-12 15:13:23 +01:00
Ruben Dashyan
1c15f8fc58 [poincare/multiplication] Avoid useless Expression cloning 2020-02-12 15:13:23 +01:00
Ruben Dashyan
ffe25f3b4a [poincare/multiplication] Avoid beautifying square meters to ha and cube meters to L
by changing the metric for unit product comparisons
2020-02-12 15:13:23 +01:00
Ruben Dashyan
4d7c12987d [poincare/test/simplification] Gather hyperbolic trigonometry tests 2020-02-12 15:13:23 +01:00
Ruben Dashyan
f9e419dcd6 [poincare/expression] defaultDeepReduceChildren does not recompute the number of children 2020-02-12 15:13:23 +01:00
Ruben Dashyan
8f31f56544 [poincare/unit] Fix pressure units 2020-02-12 15:13:23 +01:00
Émilie Feral
855cec527f [poincare] Power: remove rule i^(p/q) -> e^(i*Pi*p/2q).
This is handles in ComplexCartesian class when the simplification target
is the user and it doesn't need to be handled for other simplification
targets (we even prefer the first form).
2020-02-12 15:13:23 +01:00
Émilie Feral
1f02e8e381 [poincare] AbsoluteValue: add rule |x*y| --> |x|*|y| and |x^y| --> |x|^y 2020-02-12 15:13:23 +01:00
Ruben Dashyan
3692c083e2 [poincare/unit] Simplify shallowReduce 2020-02-12 15:13:23 +01:00
Ruben Dashyan
cadc409561 [poincare/unit] Avoid non-necessary cloning in shallowReduce 2020-02-12 15:13:23 +01:00
Ruben Dashyan
2c4160e59c [poincare/unit] Fix shallowReduce
The result had non-reduced child.
2020-02-12 15:13:23 +01:00
Émilie Feral
bbb9e83703 [apps/calculation] Fix and add tests 2020-02-12 15:13:23 +01:00
Émilie Feral
551e4998f4 [apps/calculation][apps/solver][poincare] Simplify sign =/≈ computation
between outputs in Calculation/Solver
2020-02-12 15:13:23 +01:00
Émilie Feral
c2540a1d8a [apps/calculation] Calculations now hold 4 texts: input, exact output
and 2 approximate outputs - one with the maximal number of significant
digits and one with the number of significant digits asked by the user.
This enables to find the approximate output without going through the
approximation routine again.
2020-02-12 15:13:23 +01:00
Ruben Dashyan
5631ef6ad0 [poincare/multiplication] Fix typo in shallowBeautify 2020-02-12 15:13:23 +01:00
Ruben Dashyan
b3f4dcb13d [poincare/unit] Fix electron-volt unit definition 2020-02-12 15:13:23 +01:00
Ruben Dashyan
054aac2c1c [poincare/expression] Equalize simplified and approximate output in presence of units 2020-02-12 15:13:23 +01:00
Ruben Dashyan
c4f112e5aa [apps/calculation/calculation] Do not approximate approximateOutput again 2020-02-12 15:13:23 +01:00
Ruben Dashyan
a9ca60338c [poincare] Beautify Unit products according to value's order of magnitude 2020-02-12 15:13:23 +01:00
Ruben Dashyan
380e6fff3d [poincare/unit] Improve Tree log 2020-02-12 15:13:23 +01:00
Ruben Dashyan
e6009250de [poincare/test/parsing] Fix Parser usage 2020-02-12 15:13:23 +01:00
Émilie Feral
4b98652ed9 [poincare] Parser: Context is now a member variable of the Parser class
instead of being given as a parameter in all methods
2020-02-12 15:13:23 +01:00
Émilie Feral
ba4f9297d4 [poincare] Test: add parsing tests for units 2020-02-12 15:13:23 +01:00
Émilie Feral
99481e7a28 [poincare] Unit: avoid useless parentheses addition in before deep
reducing
2020-02-12 15:13:23 +01:00
Émilie Feral
489901a613 [poincare] Units are now prefixed by "_" to distinct them from user
variable
2020-02-12 15:13:22 +01:00
Émilie Feral
313430ec97 [poincare] Expression: add comment for future improvement 2020-02-12 15:13:22 +01:00
Émilie Feral
bf73b69808 [poincare] Units: change signature of serialize to follow same
conventions as Expression::serialize
2020-02-12 15:13:22 +01:00
Émilie Feral
3428e0aa6f [poincare] Decimal: strlcpy returns the length of the source even if the
copy was partially completed. Always return the real copied length in
Decimal::convertToText.
2020-02-12 15:13:22 +01:00
Ruben Dashyan
eba529d5ee [poincare/multiplication] Optimize shallowBeautify for units: do not use deepReduce repeatedly 2020-02-12 15:13:22 +01:00
Ruben Dashyan
8f41bd7cd0 [poincare/multiplication] shallowBeautify recognizes derived units 2020-02-12 15:13:22 +01:00
Ruben Dashyan
300399fe4d [poincare/expression] deepBeautify bubbles up Undefined children 2020-02-12 15:13:22 +01:00
Ruben Dashyan
454bfc4f36 [poincare/multiplication] Units always stay in the numerator 2020-02-12 15:13:22 +01:00
Ruben Dashyan
cb638a8126 [poincare/power] Units always stay in the numerator 2020-02-12 15:13:22 +01:00
Ruben Dashyan
97508c155c [poincare/test/parsing] Test parsing of unit symbols 2020-02-12 15:13:22 +01:00
Ruben Dashyan
1f3abec05e [poincare/parser] Parse unit symbols 2020-02-12 15:13:22 +01:00
Ruben Dashyan
92d17145b2 [poincare] Define Unit class 2020-02-12 15:13:22 +01:00
Émilie Feral
a82ff2b703 [apps/calculation] HistoryController: in historyViewCellDidChangeSelection,
limit the whole table reloading to cases where the cell height did
actually change to avoid useless blinking
2020-02-12 15:13:22 +01:00
Émilie Feral
71de56f87a [apps/calculation] HistoryViewCell: fix setHighlighted to reload
subviews highlight
2020-02-12 15:13:22 +01:00
Émilie Feral
b39b8da036 [apps/calculation] HistoryViewCell: prevent from selecting ellipsis
suview if it not visible
2020-02-12 15:13:22 +01:00
Émilie Feral
a39ca58470 [apps/calculation] HistoryViewCell: fix first responder. The first
responder is the HistoryViewCell when the ellipsis subview is selected
2020-02-12 15:13:22 +01:00
Émilie Feral
767d1654cc [apps/calculation] HistoryViewCell: select the right expression of
output when coming from ellipsis subview
2020-02-12 15:13:22 +01:00
Émilie Feral
39dbb7d68c [apps/calculation] Fix relayouting when highlighted cell changed
This fixes the following scenario: add "1.2" 5 times, go up three times,
and down three times, the last cell was not correctly relayout.
2020-02-12 15:13:22 +01:00
Léa Saviot
86bd4be03e [python/port] Fix gc_collect_root on emscripten
Any data access should be aligned.
2020-02-12 15:13:22 +01:00
Léa Saviot
d70c4c7205 [ion] Typo 2020-02-12 15:13:22 +01:00
Léa Saviot
40ed9b3557 Revert "[eshcer/layout_field] Factor handleEvent"
This reverts commit d1ebbc685d67702994aa3ef822886a681cee63b9.

There were problems in the calculation app for instance:
- Write 34 then press ans -> the cursor is not drawn right of ans, but
left.
- Write a large layout, go up in th history, then go back to edition:
the view is not scrolled to the cursor
2020-02-12 15:13:22 +01:00
Léa Saviot
8554bbd8c8 [poincare/layout_cursor] Fix cursor position after adding square root
Scenario:
Go to the 'Calculation' app
Type 'sqrt(sqrt(i))', by pressing the square button twice and then the i button
Press OK
Scroll up, and press OK
Press left until the cursor is right before the i.
Press "sqrt" : the root is added, but the cursor jumped to the right of the i.
The cursor should have stayed on the left of the i.

Note: The behavior is correct when you type the entire expression straight away by doing the following:
Press "sqrt", "sqrt", "i"
Press "left", so the cursor is right before the i
Press "sqrt" again. At this point, the cursor remains on the left of i.
2020-02-12 15:13:22 +01:00
Émilie Feral
bbe39aac14 [apps/calculation] HistoryController: display additional results pop-up
when handling OK/exe on the ellipsis view
2020-02-12 15:13:22 +01:00
Émilie Feral
7d0a1cd0b2 [apps/calculation] HistoryViewCell: enable selecting the ellipsis 2020-02-12 15:13:22 +01:00
Émilie Feral
9a97fc01b2 [apps/calculation] HistoryViewCell: m_expandedCalculation memoizes true
only when the calculation is actually expanded (when the output is
selected and the display output is ExactApproximateToggle)

This avoid blinking when changing input/output selection
2020-02-12 15:13:22 +01:00
Émilie Feral
f276a88e79 [apps/calculation] HistoryViewCell: display ellipsis view when
highlighted
2020-02-12 15:13:22 +01:00
Émilie Feral
b56cd8b012 [escher] Metric: add EllipsisCellWidth. This will be soon used by
Calculation::HistoryCell
2020-02-12 15:13:22 +01:00
Émilie Feral
251db5b60e [apps/shared][apps/calculation] Change class names:
ScrollableInputExactApproximateExpressionsCell -->
ScrollableThreeExpressionsCell
AbstractScrollableExactApproximateExpressionsView -->
AbstractScrollableMultipleExpressionsView
ScrollableExactApproximateExpressionsView -->
ScrollableTwoExpressionsView
ScrollableInputExactApproximateExpressionsView -->
ScrollableTwoExpressionsCell
2020-02-12 15:13:22 +01:00
Émilie Feral
87e4836196 [apps/calculation][apps/shared]
AbstractScrollableExactApproximateExpressionsView children classes
reload scroll after reloading the subview selection when entering the
responder chain and when cell becomes first responder. We don't reload
scroll when setting content of cells as this is done every time we
relayout - when scrolling in the table for instance.
2020-02-12 15:13:22 +01:00
Émilie Feral
ef5681ec0b [escher] Remove BurgerMenuView 2020-02-12 15:13:22 +01:00
Émilie Feral
56319ef275 [apps/shared] AbstractScrollableExactApproximateExpressionsView can hold up to
three expressions but no more BurgerMenuView.
ScrollableExactApproximateExpressionsView and
ScrollableInputExactApproximateExpressionsView inherit from it.
2020-02-12 15:13:22 +01:00
Émilie Feral
3de0ee7f98 [apps/calculation] ExpressionWithEqualSignView inherits from
ExpressionView instead of composing

This is useful for future change on
ScrollableExactApproximateExpressionView
2020-02-12 15:13:22 +01:00
Léa Saviot
88ab0e686c [apps] Less operations in willExitResponderChain if exiting app
If nextFirstResponder is nullptr, it means we are exiting the app, so
there is no need to relayout, reselect, ...
We did it bbefore because a long time ago, we used to keep all apps side
by side so they had to be thouroughly cleaned when exiting
2020-02-12 15:13:22 +01:00
Léa Saviot
90e5a08d3a [escher/app] Coding style 2020-02-12 15:13:22 +01:00
Léa Saviot
5e45a60f99 [apps/settings] Fix selection glitch
Scenario: Go to the Result format submenu of Settings. Modify the
significant figures with a wrong value (for instance, "7::"), press OK
then 0 -> he first row is selected, as well as the last row
2020-02-12 15:13:22 +01:00
Léa Saviot
19435687d5 [apps/settings] Coding style 2020-02-12 15:13:22 +01:00
Léa Saviot
60706835e7 [poincare/tree_node] Assertions on parent id that should not be this id 2020-02-12 15:13:22 +01:00
Léa Saviot
b7e177865a [apps/code] Fix prompt after input 2020-02-12 15:13:22 +01:00
Léa Saviot
3dcb40b5d4 [apps/code] Do not call interrupt in printText 2020-02-12 15:13:22 +01:00
Léa Saviot
1dacd71acb [apps/code] Remove unneeded arguments 2020-02-12 15:13:22 +01:00
Léa Saviot
c6c3e3f340 [apps/code] Hide prompt when running script 2020-02-12 15:13:22 +01:00
Léa Saviot
f47f1f0543 [apps/code] Refresh view in printText 2020-02-12 15:13:22 +01:00
Léa Saviot
f20bb1fcf2 [apps/code] Display the console before running auto-imported script 2020-02-12 15:13:22 +01:00
Léa Saviot
42bdf29ead [python] Fix compilation warnings 2020-02-12 15:13:22 +01:00
Léa Saviot
a5bf4b68fa [apps/code] Remove duplicate i18n 2020-02-12 15:13:22 +01:00
Léa Saviot
d5a18fcf13 [apps/code] Add time module in the toolbox 2020-02-12 15:13:22 +01:00
Léa Saviot
200e542a96 [apps/code] Add ion module in toolbox 2020-02-12 15:13:22 +01:00
Léa Saviot
8742ea9d25 [apps/code/i18N] Alphabetical rearrangement 2020-02-12 15:13:22 +01:00
Émilie Feral
373409b50e [apps/regression] Fix test compilation 2020-02-12 15:13:22 +01:00
Émilie Feral
60048cb9a9 [poincare] Create a ContextWithParent that implements expressionTypeForIdentifier 2020-02-12 15:13:22 +01:00
Émilie Feral
c629cb66ba [apps/calculation] Calculation: don't memoize the display in height
computation. It has to be updated everytime an exception is raised and
this was forgotten.
2020-02-12 15:13:22 +01:00
Émilie Feral
4e948ce533 [poincare] Change Factor approximation to return undef on non real
values
2020-02-12 15:13:22 +01:00
Émilie Feral
8deb81b8c2 [apps/calculation] CalculationStore: Equal and Store node are always at
the root, no need to recursively check their presence
2020-02-12 15:13:22 +01:00
Émilie Feral
0c19b54365 [apps/calculation] Do not display additional results for Equal or Store
expressions
2020-02-12 15:13:22 +01:00
Émilie Feral
2a37fa4447 [apps/calculation] ComplexListController: change the way the
Complex model parameters are computed.

Sometimes, approximation without simplification doesn't not give the
same results as approximation after simplification. As we decided to
display the additional results from an approximation without
simplifcation (done in Expression::hasDefinedComplexApproximation), we
compute the model parameters the same way (to ensure that both
parameters are defined)
2020-02-12 15:13:21 +01:00
Émilie Feral
58a4dcf62a [poincare] Multiplication: improve splitIntoNormalForm to fill Numeral
factor (instead of returning uninitialized factors) if the multiplication is 1x1
2020-02-12 15:13:21 +01:00
Émilie Feral
8d7eebbf0e [apps/calculation] Calculation: fix variable confusion 2020-02-12 15:13:21 +01:00
Léa Saviot
f0ca8296bf [poincare/function] f(1/0) = undef when f(x) = 3 2020-02-12 15:13:21 +01:00
Léa Saviot
167fdf285f [poincare/test] Simplification test on f(1/0) when f(x) = 3 2020-02-12 15:13:21 +01:00
Léa Saviot
a3a1f86f8d [apps] Add context parameter to fix tests 2020-02-12 15:13:21 +01:00
Léa Saviot
78adca7113 [poincare/tests] Fix tests after parsing change 2020-02-12 15:13:21 +01:00
Léa Saviot
9d6bab092f [poincare/parser] Identifier is not already function -> symbol
We check the context: if an identifier is already a function, we
interpret it as such, otherwise it is a symbol.
This way, in the Equation app, x(x+1) is interpreted as x*(x+1)
2020-02-12 15:13:21 +01:00
Léa Saviot
756eeeb2d8 [poincare/parser] Add context 2020-02-12 15:13:21 +01:00
Émilie Feral
158a45e94d [apps/shared] AbstractScrollableExactApproximateExpressionsView: let the
child class decides which subview to select
2020-02-12 15:13:21 +01:00
Émilie Feral
3d3189d0dd [escher] BurgerMenuView: when drawRect, reinitialize the rectangle to
avoid corruption when re-drawing above a burger. Indeed,
blendRectWithMask pulls the current color to blend it.
2020-02-12 15:13:21 +01:00
Émilie Feral
764277fbb8 [escher] BurgerMenuView: fix masks 2020-02-12 15:13:21 +01:00
Émilie Feral
d61336936e [apps/shared] Create a class Dots to share dots masks between CurveView
and RoundCursorView. Use the same dot for illustrations of additional
results in Calculation app and Function app
2020-02-12 15:13:21 +01:00
Émilie Feral
ba159de21d [apps/calculation] Trigonometry additional results are displayed if the
input OR the output is a cosine/sine
2020-02-12 15:13:21 +01:00
Émilie Feral
f5523fe01c [apps] Slightly change the message of Empty variable box to avoid text
cropping
2020-02-12 15:13:21 +01:00
Émilie Feral
60cac1f928 [apps] Add borders to VariableBoxEmptyController 2020-02-12 15:13:21 +01:00
Émilie Feral
581756b046 [escher] Fix Bordered::drawInnerRect 2020-02-12 15:13:21 +01:00
Émilie Feral
061c96df45 [escher] Add vertical borders to StackView 2020-02-12 15:13:21 +01:00
Émilie Feral
3fa4e0838a [escher] Create a class Bordered instead of BorderedCell: this enable
non-cell view to use it as well
2020-02-12 15:13:21 +01:00
Émilie Feral
398b529811 [apps/calculation][poincare] AdditionalInformationType is determined
from both input and output expressions of a Calculation
2020-02-12 15:13:21 +01:00
Émilie Feral
be6f11208f [apps/calculation] additional_outputs: make a parent class to
TrigonometryGraphCell and ComplexGraphCell inheriting from
BorderedCell
2020-02-12 15:13:21 +01:00
Émilie Feral
235b03a923 [escher] Create a BorderedCell that draws the border around a cell and
use it in TableCell
2020-02-12 15:13:21 +01:00
Émilie Feral
404c0945f9 [apps/calculation] additional_outputs: ComplexGraphView: simplify
computation of ellipsis equation (avoid computational errors for real =
-6 and imaginary = 1E-8 for instance)
2020-02-12 15:13:21 +01:00
Émilie Feral
06fa3bba5b [apps/shared][apps/calculation] CurveView: enable to personalize the
maximal glyph length of graduation labels. Shorten them in
ComplexGraphView
2020-02-12 15:13:21 +01:00
Léa Saviot
8b250e0ca0 [apps/i18n] Fix portuguese from Portugal, not Brazil 2020-02-12 15:13:21 +01:00
Léa Saviot
22601fd8a3 [apps/settings/exam_mode] "How to deactivate" messages 2020-02-12 15:13:21 +01:00
Léa Saviot
a51d434a78 [apps/settings] Inline method 2020-02-12 15:13:21 +01:00
Léa Saviot
155d2a4758 [apps/probability] Remove unneeded parameter 2020-02-12 15:13:21 +01:00
Léa Saviot
fafa0b90d1 [poincare/vertical_offset_layout] Fix up/down navigation
Scenario: 2^2^2^2 then Down, Right, Left, Down. The final Down does
nothing.
2020-02-12 15:13:21 +01:00
Léa Saviot
f6c15198bc [apps/regression] Power regression uses logarithm of series
This matches other apps results and we directly compute the values from
the data instead of doing a gradient descent.
2020-02-12 15:13:21 +01:00
Léa Saviot
97b495a4dc [apps/interactive_curve_view_range] Orthonormal keep max grid unit
When setting the axes then putting on the orthnormalization, 2 * (max of
the two axes units) is put to 1 cm instead of doing 2 units = 1cm. This
roughly keeps the configuration of the window.
2020-02-12 15:13:21 +01:00
Léa Saviot
ac6ce97dea [python/modturtle] Allowinterruption during reset
Scenario:
fro m turtle import *
while 1==1:
  reset()
-> This script cannot be interrupted
2020-02-12 15:13:21 +01:00
Léa Saviot
97c5ef79af [apps/calc] Display ApproximateOnly if approximate layout cannot be created 2020-02-12 15:13:21 +01:00
Léa Saviot
1af28d4310 [apps/calc] Display ApproximateOnly if exact layout cannot be created 2020-02-12 15:13:21 +01:00
Émilie Feral
8e407bd01e [apps/calculation] additional_outputs: fix assertion which checks that
both real and imaginary are well defined in ComplexGraphView
2020-02-12 15:13:21 +01:00
Émilie Feral
227a52940d [poincare] Fix Function::deepReplaceReplaceableSymbols, replace
replaceable symbols in the child first

This fixes the following bug: when checking whether 'blop(g(0))' is
circularly defined with g(x) = blop(g(0)), g(0) was not checked which
triggers a crash.
2020-02-12 15:13:21 +01:00
Émilie Feral
f6dcc35bce [poincare] Standardize the convention of 'deepReplaceReplaceableSymbols'
and 'ExpressionWithoutSymbols': they return an uninitialized expression
when the expression is circularly defined
2020-02-12 15:13:21 +01:00
Émilie Feral
71a968ec05 [apps/calculation] Clean Unicode character treated as a whitespace 2020-02-12 15:13:21 +01:00
Émilie Feral
2b18f585d0 [poincare] additionalInformationType returns "Complex" only when both
real and imaginary parts are defined (not NAN or INFINITY)
2020-02-12 15:13:21 +01:00
Émilie Feral
72d1370cff [poincare] Returns a RealUndefined evaluation for Expression that are
always real.
This avoids that floor(i) is simplified to (undef, 0) but approximates
to (undef, undef)
2020-02-12 15:13:21 +01:00
Léa Saviot
0260e2ffb4 [apps/proba] Fisher distribution authorized parameter values 2020-02-12 15:13:21 +01:00
Léa Saviot
8c801392a5 [apps/proba] Fisher distribution zoom values 2020-02-12 15:13:21 +01:00
Léa Saviot
09a2d554d1 [apps/probability] Fisher tests 2020-02-12 15:13:21 +01:00
Léa Saviot
55a4e3d94c [apps/proba] Implement Fisher formulae 2020-02-12 15:13:21 +01:00
Léa Saviot
93c96186c4 [apps/probability] Initial Fisher distribution 2020-02-12 15:13:21 +01:00
Léa Saviot
08cdf5a8d2 [apps/probability/i18n] Put some definitions in universal 2020-02-12 15:13:21 +01:00
Émilie Feral
a4d630ace0 [apps/calculation] additional_outputs: IllustratedListController:
textAtIndex depends on the selected subview
2020-02-12 15:13:21 +01:00
Émilie Feral
9d540ca16c [apps/calculation] additional_outputs: In RationalListController,
special case for textAtIndex of the Euclidean division: copy only the
right part of the equality
2020-02-12 15:13:21 +01:00
Émilie Feral
21f3cd629d [apps/shared] CurveView: fix drawLabelsAndGraduations
Fix following bug: when handling label = "0", not shifted,
the label position should be computed as for the other labels.
2020-02-12 15:13:21 +01:00
Émilie Feral
685f030f83 [apps/calculation] Fix ScrollableInputExactApproximateExpressionCell and
ScrollableExactAppromiateExpressionsCell layout (layout of cells can be
asked at any moment - when handling copy/cut events)
2020-02-12 15:13:21 +01:00
Émilie Feral
0ec3675b76 [poincare] Fix AdditionalInformationType: fix typo 2020-02-12 15:13:20 +01:00
Émilie Feral
a4e8d24a23 [apps/calculation] Improve text inserted in EditExpressionController
when handling OK events on additional outputs pop-ups
2020-02-12 15:13:20 +01:00
Émilie Feral
fef0538941 [apps/calculation] Handle OK events on additional outputs pop-up - WIP 2020-02-12 15:13:20 +01:00
Léa Saviot
3d4d46c489 [apps/code/menu_controller] Fix Clear handling in text field
The menu controller handled Clear but it clashed with any ongoing
selection.
In fact, eveything handled in textFieldDidReceiveEvent was already
handled in TextFieldWithExtension
2020-02-12 15:13:20 +01:00
Léa Saviot
5a7c03d485 [apps/editor_controller] Fix backspace handling in text area
The editor controller handles backspace if it is at the beginning of a
line, to remove multiple spaces to match the indentation, but it should
not do so if there is an ongoing selection
2020-02-12 15:13:20 +01:00
Léa Saviot
ce20f3f50f [escher/text_field] Fix empty Paste event
If there is no text in the clipboard and a Paste event in a text
field, the cursor moved at the beginning of the text
2020-02-12 15:13:20 +01:00
Léa Saviot
2fea9d61b6 [escher/text_field] Fix cut event text deletion
If there is a Cut event and the text field is edited but there is no
selection, the text is not stored in the clipboard but it was still
deleted.
2020-02-12 15:13:20 +01:00
Léa Saviot
66cf4ed83f [escher/text_field] Fix Cut / Clear redrawing 2020-02-12 15:13:20 +01:00
Émilie Feral
e324c1af10 [poincare] AdditionalInformationType: integer above 1E16 don't have
additioncal informations
2020-02-12 15:13:20 +01:00
Émilie Feral
c441611190 [apps/calculation] Do no display the factor expression if it is
undefined in Integer additional outputs
2020-02-12 15:13:20 +01:00
Émilie Feral
90957d137a [apps/calculation] HistoryViewCell: avoid blinking 2020-02-12 15:13:20 +01:00
Émilie Feral
272d405eb7 [apps/calculation] additional_outputs: Always force selection on the
left subviews of cells when IllustratedListController pop-up is displayed
2020-02-12 15:13:20 +01:00
Émilie Feral
dd61468056 [apps/calculation] ScrollableInputExactApproximateExpressionsCell:
relayoutSubviews after changing member variables that affect the
subviews frames
2020-02-12 15:13:20 +01:00
Émilie Feral
a655d60d0f [apps/calculation] additional_outputs: fix rowHeight of
illustrated_list_controller (calculation are all expanded)
2020-02-12 15:13:20 +01:00
Émilie Feral
2c55e0d6d9 [apps/calculation] additional_outputs: factorize flat ellipsis handling 2020-02-12 15:13:20 +01:00
Émilie Feral
2dbd840c00 [apps/calculation] additional_outputs: fix flat ellipsis for pure
imaginary in ComplexGraphView
2020-02-12 15:13:20 +01:00
Émilie Feral
e382d8f15e [apps/calculation] additional_outputs: improve labels layout in
ComplexGraphView
2020-02-12 15:13:20 +01:00
Émilie Feral
340bbb5644 [apps/calculation] additional_outputs: fix ellipsis equation in
ComplexGraphView
2020-02-12 15:13:20 +01:00
Émilie Feral
c2364d27cd [apps/calculation] additional_outputs: clean and improve ComplexModel
range
2020-02-12 15:13:20 +01:00
Émilie Feral
e13cba5a90 [apps/calculation] additional_outputs: flat ellipsis to reprensent the
angle in ComplexGraphView
2020-02-12 15:13:20 +01:00
Émilie Feral
88c3f609e8 [apps/calculation] additional_outputs: improve comments of
ComplexGraphView
2020-02-12 15:13:20 +01:00
Émilie Feral
aa6d328bac [apps/calculation] additional_outputs: improve label positioning in
ComplexGraphView
2020-02-12 15:13:20 +01:00
Émilie Feral
427a3d3051 [apps/calculation] additional_outputs: draw the principal angle on
ComplexGraphView
2020-02-12 15:13:20 +01:00
Émilie Feral
7cd6d12730 [apps/calculation] additional_outputs; change position of absolute value
label in ComplexGraphView
2020-02-12 15:13:20 +01:00
Émilie Feral
56485a9733 [apps/calculation] additional_outputs; fix range of ComplexGraphView 2020-02-12 15:13:20 +01:00
Émilie Feral
61d0161e74 [apps/calculation] additional_outputs: add labels to ComplexGraphView 2020-02-12 15:13:20 +01:00
Émilie Feral
c6e54f90c3 [apps/shared] CurveView: fix confusion between after/before relative
position in drawLabel
2020-02-12 15:13:20 +01:00
Émilie Feral
8c69314fea [apps/calculation] additional_outputs: avoid potential useless cast of 0
to 0.0f
2020-02-12 15:13:20 +01:00
Émilie Feral
8175df9abd [apps/calculation] additional_outputs: improve drawRect of
ComplexGraphView
2020-02-12 15:13:20 +01:00
Émilie Feral
083074e5ac [apps/calculation] additional_outputs: ComplexGraphView has labels 2020-02-12 15:13:20 +01:00
Émilie Feral
1f4b823509 [apps/calculation] HistoryController: pointer to Calculation are expring
pointer, they've to be recomputed everytime we reload the table (because
of a scroll or when deselecting the table)
2020-02-12 15:13:20 +01:00
Émilie Feral
eb4a36696a [apps/calculation] Trigonometry: set the range to see "cos(θ)" label 2020-02-12 15:13:20 +01:00
Émilie Feral
800adce876 [apps/shared] CurveView: change API; drawLabel can draw a label at a
position and the relative position of the label (above, below, to the
left or right of the graduation) can be chosen. 'positionLabel' is a
private method used by 'drawLabelsAndGraduations' and 'drawLabel' to
determine the position of the label knowing the position of the
graudation and its relative position
2020-02-12 15:13:20 +01:00
Émilie Feral
bbea104262 [apps/calculation] TrigonometryGraphView: avoid multiple calls to
std::cos and std::sin
2020-02-12 15:13:20 +01:00
Émilie Feral
027e46c237 [apps/calculation] additional_outputs: improve drawRect of TrigonometryGraphView 2020-02-12 15:13:20 +01:00
Émilie Feral
17bc808257 [apps/shared] CurveView: fix drawLabelsAndGraduations when
graduationOnly is on: the graduation are not drawn only when outside of
the drawn rect
2020-02-12 15:13:20 +01:00
Émilie Feral
95137909c6 [apps/shared] CurveView: fixes drawLabelsAndGraduations when the 'fixCoordinate' parameter is true.
This fixes the graduation drawing of the box view in the statistics app
2020-02-12 15:13:20 +01:00
Émilie Feral
aed52236d3 [apps/calculation] additional_outputs: improve drawRect of
TrigonometryGraphView
2020-02-12 15:13:20 +01:00
Émilie Feral
29bab70dcd [apps/shared] CurveView: add a parameter "color" to drawLabel 2020-02-12 15:13:20 +01:00
Émilie Feral
dfd4811136 [apps/shared] CurveView: change API to expose 'drawLabel' and
'drawLabelsAndGraduations'
2020-02-12 15:13:20 +01:00
Émilie Feral
98c6f4ba47 [apps/shared] CurveView: factorize code of drawLine and drawSegment 2020-02-12 15:13:20 +01:00
Émilie Feral
818067e03b [apps/shared] CurveView: add a parameter to drawSegment to draw dashed
segment
2020-02-12 15:13:20 +01:00
Émilie Feral
39d65a1ad0 [apps/calculation] additional_outputs: improve circle range 2020-02-12 15:13:20 +01:00
Émilie Feral
b47ded4074 [apps/calculation] Add a parameter in Shared::CurveView to choose the
curve thickness
2020-02-12 15:13:20 +01:00
Émilie Feral
bf07b5ab76 [apps/shared] CurveView: fix typo 2020-02-12 15:13:20 +01:00
Émilie Feral
d86d4512e9 [apps/calculation] Normalize the trigonometrical circle of
TrigonometryListController
2020-02-12 15:13:20 +01:00
Émilie Feral
65dfb0ebcb [apps/calculation] additional_outputs: TrigonometryGraphView: first
draft of drawRect
2020-02-12 15:13:20 +01:00
Émilie Feral
74d9ebd5bb [apps/calculation] additional_outputs, TrigonometryModel: fix range to
display the half circle where the angle is
2020-02-12 15:13:20 +01:00
Émilie Feral
bd7d5f14dd [apps/calculation] additional_outputs: TrigonometryListController set
the right angle model to the view
2020-02-12 15:13:20 +01:00
Émilie Feral
6f3bf2f570 [apps/calculation] AdditionalOutputs: TrigonometryGraphCell change
member name
2020-02-12 15:13:20 +01:00
Émilie Feral
f52f25e491 [calculation] HistoryViewCell: add TODO 2020-02-12 15:13:20 +01:00
Émilie Feral
414f1eb25c [apps/calculation] HistoryController: ensure to display burger views
when scrolling up and down
2020-02-12 15:13:20 +01:00
Émilie Feral
1b83526c57 [apps/shared] Revert "ScrollableExactApproximateExpressionsView: remove useless reload"
This was not useless: without it, when you push several times the
calculation "1.2", going up in the history will display corrupted
cells...
2020-02-12 15:13:20 +01:00
Émilie Feral
73a8ec24f2 [calculation] Revert "HistoryViewCell: remove useless m_expandedCalculation"
When scrolling up and down, only 'setCalculation' is called by
'willDisplayCellForIndex' - and not 'cellDidSelectSubview'. So a new cell
should be informed of the expanded state in 'setCalculation'.
2020-02-12 15:13:20 +01:00
Émilie Feral
80d8e8eead Coding style 2020-02-12 15:13:20 +01:00
Émilie Feral
c47394ae22 [calculation] (revert previous commit) HistoryViewCell: setCalculation
should decide which subviews is displayed.
'setCalculation' is the only method called when scrolling (when using
a new cell for a calculation) so it should take into accound whether the
cell is expanded or not.

This fixes the bug: when pushing several calculations (which expand) in
the store, scrolling up and down corrupts the cells contents
2020-02-12 15:13:20 +01:00
Émilie Feral
c12304a00e [calculation] Remove outdated comment 2020-02-12 15:13:20 +01:00
Émilie Feral
6a2f11ef1b [escher] ExpressionTableCell & ExpressionTableCellWithExpression:
reloadScroll when displaying cell
2020-02-12 15:13:20 +01:00
Émilie Feral
8a07d335a3 [calculation] Additional Ouputs: speed up scrolling in
ExpressionsListController by memoizing layouts. Avoid glitering
2020-02-12 15:13:20 +01:00
Émilie Feral
74b5ca2f12 [escher] ExpressionTableCellWithExpression: avoid to add margins around
the accessory subview twice
2020-02-12 15:13:20 +01:00
Émilie Feral
3806a78141 [escher] ExpressionTableCellWithExpression: make the accessory
expression scrollable and set it as the first responder
2020-02-12 15:13:20 +01:00
Émilie Feral
711c4a6554 [escher] ScrollableExpressionView: fix background color 2020-02-12 15:13:20 +01:00
Émilie Feral
4bd3dfd542 [escher] TableCell: the subviews are layoutted horizontally or
vertically. We add an option to decide which subviews should overlap on
top of the other if there is not enough space
2020-02-12 15:13:20 +01:00
Émilie Feral
5974149162 [escher] Metric: change name TableCellLabelTopMargin to
TableCellHorizontalMargin and add TableCellHorizontalMargin
2020-02-12 15:13:20 +01:00
Émilie Feral
d0e2e71e10 [escher] TableCell: fix layoutSubviews 2020-02-12 15:13:20 +01:00
Émilie Feral
816e17df66 [escher] TableCell: factorize code 2020-02-12 15:13:19 +01:00
Émilie Feral
9312d2bd65 [escher] ExpressionTableCell is composed of a ScrollableExpressionView
instead of an ExpressionView
2020-02-12 15:13:19 +01:00
Émilie Feral
9301dd510a [calculation][escher] Move ScrollableExpressionView from apps/calculation/ to
escher/
2020-02-12 15:13:19 +01:00
Émilie Feral
70ce133b4c [calculation] Change name: simple_list_controller -->
expressions_list_controller
2020-02-12 15:13:19 +01:00
Émilie Feral
7abe8e2e4d [calculation] ScrollableInputExactApproximateExpressionsCell: margins
are controlled by the scrollview instead of TableCell in order to
display arrows indicator correctly
2020-02-12 15:13:19 +01:00
Émilie Feral
439c85eda5 [escher] TableCell: make the label margin optional 2020-02-12 15:13:19 +01:00
Émilie Feral
2e3a904b9b [escher] TableCell: fix layoutSubview to avoid letting subviews overflow bounds() 2020-02-12 15:13:19 +01:00
Émilie Feral
10c906e5e2 [shared] AbstractScrollableExactApproximateExpressionsView: when the
left subview is selected, reload the scroll to display the left view
2020-02-12 15:13:19 +01:00
Émilie Feral
acd9e63cbd [shared] AbstractScrollableExactApproximateExpressionsView: fix
setDisplayLeft and setDisplayCenter to re-layoutSubviews
2020-02-12 15:13:19 +01:00
Émilie Feral
7e96ccf5a6 [shared] Typo 2020-02-12 15:13:19 +01:00
Émilie Feral
c6efb99e05 [calculation] ScrollableInputExactApproximateExpressionsCell: select the
left expression when the cell becomes first responder
2020-02-12 15:13:19 +01:00
Émilie Feral
d8d0f33b1b [calculation] ExpressionWithEqualSignView: add a margin between
expression and equal sign
2020-02-12 15:13:19 +01:00
Émilie Feral
85ba8f8076 [calculation] RationalListController: display MixedFraction layout 2020-02-12 15:13:19 +01:00
Émilie Feral
ef3e33f343 [poincare] Implement Integer::CreateMixedFraction 2020-02-12 15:13:19 +01:00
Émilie Feral
40996deb0a [calculation] RationalListController: use
Integer::CreateEuclideanDivision to build layout
2020-02-12 15:13:19 +01:00
Émilie Feral
df6817547f [poincare] Integer: create 2 methods 'CreateMixedFraction' and
'CreateEuclideanDivision' that build expected expressions from 2
integers
2020-02-12 15:13:19 +01:00
Émilie Feral
6af04edf32 [poincare] Expression::additionalInformationType: return Rational for
all forms of type [±12]/[±32]
2020-02-12 15:13:19 +01:00
Émilie Feral
ae438ca546 [poincare] DivisionQuotient, DivisionRemainder: add method to reduce on
Integers
2020-02-12 15:13:19 +01:00
Émilie Feral
de2046fea8 [poincare] BasedInteger: fix multiplication sign with Decimal integer 2020-02-12 15:13:19 +01:00
Émilie Feral
280f20c93c [poincare] Fix remainder of division by 0: rem(12,0) should be undefined
and not infinity
2020-02-12 15:13:19 +01:00
Émilie Feral
f47a18bf4a [calculation] Remove useless includes 2020-02-12 15:13:19 +01:00
Émilie Feral
df47a355a2 [calculation] HistoryController: display RationalListController when
clicking on a burger of a Rational input
2020-02-12 15:13:19 +01:00
Émilie Feral
54f1984cf0 [calculation] Create a class RationalListController 2020-02-12 15:13:19 +01:00
Émilie Feral
47e7a8407b [calculation] WIP: add messages for RationalListController 2020-02-12 15:13:19 +01:00
Émilie Feral
f94727b62d [calculation] HistoryController: factorize code 2020-02-12 15:13:19 +01:00
Émilie Feral
1dae85694f [calculation] IllustratedListController: empty calculation store before
reloading it
2020-02-12 15:13:19 +01:00
Émilie Feral
847eb8d907 [calculation] Create a class ListController to factorize
IllustratedListController and SimpleListController
2020-02-12 15:13:19 +01:00
Émilie Feral
714e5f12d9 [calculation] WIP: display IntegerListController when clicking on a
burger view of an integer input
2020-02-12 15:13:19 +01:00
Émilie Feral
51d5fc0473 [calculation] AdditionalOutputs: Create a IntegerListController 2020-02-12 15:13:19 +01:00
Émilie Feral
8d40ef8ccb [calculation] Add sketch messages for IntegerListController 2020-02-12 15:13:19 +01:00
Émilie Feral
80100b62af [calculation] Additional outputs: Create a class SimpleListController.
Future IntegerListController and RationalListController will inherit
from it
2020-02-12 15:13:19 +01:00
Émilie Feral
2cae1cdf50 [poincare] Integer: factorize overflown integer handling in
serialization methods
2020-02-12 15:13:19 +01:00
Émilie Feral
7209265254 [poincare] Parser: forbid parsing 0xABCF as 0xABC*F 2020-02-12 15:13:19 +01:00
Émilie Feral
00e8af789b [poincare] BasedInteger: use dot mutliplication sign around
binary/hexadecimal integers
2020-02-12 15:13:19 +01:00
Émilie Feral
a900e39cf3 [poincare] Parser: fix sequence parsing 2020-02-12 15:13:19 +01:00
Émilie Feral
b875d02fdf [poincare] Parsing: prevents from tokenizing "0b" "0x" 2020-02-12 15:13:19 +01:00
Émilie Feral
30c4e01737 [poincare] Fix and add tests about BasedInteger 2020-02-12 15:13:19 +01:00
Émilie Feral
1f3dc95a0f [poincare] Fix AdditionalInformation on Integer and Rational 2020-02-12 15:13:19 +01:00
Émilie Feral
aabe663376 [poincare] Number: "12242" is parsed as a BasedInteger instead of a
Rational
2020-02-12 15:13:19 +01:00
Émilie Feral
ce85fa2185 [poincare] BasedInteger: fix multiplication sign between 0x23A and π 2020-02-12 15:13:19 +01:00
Émilie Feral
e72ba3d064 [poincare] Number: fix number to handle BasedInteger case 2020-02-12 15:13:19 +01:00
Émilie Feral
a1b2cbb0a9 [ion] Unicode: clean warning 2020-02-12 15:13:19 +01:00
Émilie Feral
54c55d130a [poincare] Tokenize/Parse BasedInteger 2020-02-12 15:13:19 +01:00
Émilie Feral
7c2ef5847b [poincare] Add class BasedInteger 2020-02-12 15:13:19 +01:00
Émilie Feral
fef07ee239 [poincare] Integer: add methods to serialize/layout/build in hexadecimal and binary 2020-02-12 15:13:19 +01:00
Émilie Feral
49d52f293e [calculation] First version of the TrigonometryListController 2020-02-12 15:13:19 +01:00
Émilie Feral
83a29a822b [calculation] Improve ComplexListController 2020-02-12 15:13:19 +01:00
Émilie Feral
715a1a2d5e [calculation] AdditionalInformation are base on the Calculation input
instead of exact output
2020-02-12 15:13:19 +01:00
Émilie Feral
1eb0744caa [calculation] IllustratedListController: fix setExpression (use virtual
symbol)
2020-02-12 15:13:19 +01:00
Émilie Feral
a75acf6f87 [calculation] IllustratedListController: fix numberOfRows 2020-02-12 15:13:19 +01:00
Émilie Feral
d178adc936 [apps/calculation] Improve expressions that are displayed in Complex
pop-up
2020-02-12 15:13:19 +01:00
Émilie Feral
d698af035c [calculation] ScrollableInputExactApproximateExpressionsView: improve
margins, background color, size
2020-02-12 15:13:19 +01:00
Émilie Feral
157aa206c6 [calculation] Calculation: add a parameter to height to compute the
height of the calculation cell with all expressions inlined
2020-02-12 15:13:19 +01:00
Émilie Feral
52ac7b1a94 [calculation] IllustratedListController: fix first responder when
IllustratedListController becomes first responder
2020-02-12 15:13:19 +01:00
Émilie Feral
24873ef730 [calculation] IllustratedListController: forbid selection of the
illustration cell
2020-02-12 15:13:19 +01:00
Émilie Feral
79a84d1044 [calculation] Add an equal sign in
ScrollableInputExactApproximateExpressionsCell
2020-02-12 15:13:19 +01:00
Émilie Feral
f850226341 [calculation] Fix ScrollableInputExactApproximateExpressionsView margins 2020-02-12 15:13:19 +01:00
Émilie Feral
dcdc5ac879 [calculation] ScrollableInputExactApproximateExpressionsCell inherits
from TableCell to draw borders
2020-02-12 15:13:18 +01:00
Émilie Feral
d1439c2453 [calculation] ScrollableInputExactApproximateExpressionsCell is a
responder
2020-02-12 15:13:18 +01:00
Émilie Feral
90033a54c0 [shared] Avoid extra function call 2020-02-12 15:13:18 +01:00
Émilie Feral
c7ae89fcba [calculation] Additional outputs: display left and center subviews of
InputExactApproximateExpressionsView in the additional output pop-up
2020-02-12 15:13:18 +01:00
Émilie Feral
eac83fce0b [calculation] Improve margins of additional results pop-up 2020-02-12 15:13:18 +01:00
Émilie Feral
2ebbe5ae25 [calculation] WIP: first version of ComplexListController 2020-02-12 15:13:18 +01:00
Émilie Feral
47e4abee81 [apps/calculation] Reload display output when HistoryController appears
(to avoid displaying 2 = 2 when leaving and reentering Calculation app)
2020-02-12 15:13:18 +01:00
Émilie Feral
ec0c7c0384 [apps/calculation] Create ScrollableInputExactApproximateExpressionsView
inheriting from Shared::ScrollableExactApproximateExpressionsView
2020-02-12 15:13:18 +01:00
Émilie Feral
6ed9e11de3 [apps/shared] ScrollableExactApproximateExpressionsView: split
ScrollableExactApproximateExpressionsView into
AbstractScrollableExactApproximateExpressionsView and
ScrollableExactApproximateExpressionsView to factorize code with future
ScrollableInputExactApproximateExpressionsView
2020-02-12 15:13:18 +01:00
Émilie Feral
a21689d72c [apps/calculation][poincare] Move additionalInformationType method from
Calculation to Poincare module
2020-02-12 15:13:18 +01:00
Émilie Feral
66b88de4b4 [apps/calculation] WIP: Improve Calculation::additionalOuput 2020-02-12 15:13:18 +01:00
Émilie Feral
e932e8f895 [apps/calculation] Fix HistoryController: update the OutputView when
reloading the table data
2020-02-12 15:13:18 +01:00
Émilie Feral
904995f841 [apps/shared] ScrollableExactApproximateExpressionsView: remove useless
reload
2020-02-12 15:13:18 +01:00
Émilie Feral
400819d87d [apps/calculation] HistoryViewCell: remove useless m_expandedCalculation 2020-02-12 15:13:18 +01:00
Émilie Feral
6c9832c9e1 [apps/calculation] Avoid blinking in Calculation 2020-02-12 15:13:18 +01:00
Émilie Feral
8e57c00ff8 [apps/calculation] Additional outputs: clean complex model (handle
undefined values)
2020-02-12 15:13:18 +01:00
Émilie Feral
b33a778ccb [ion] N0110 linker script: fix symbol name of section
internal_to_external
2020-02-12 15:13:18 +01:00
Émilie Feral
f0ec2136b7 [apps/calculation] WIP: display the complex graph when clicking on the
burger menu
2020-02-12 15:13:18 +01:00
Émilie Feral
b566846c49 [apps/calculation] SelectableView: force relayouting subviews in
scrollToCell
2020-02-12 15:13:18 +01:00
Émilie Feral
efe66a1218 [apps/calculation] HistoryViewCell: memoize the calculation additional
output and display burger when required
2020-02-12 15:13:18 +01:00
Émilie Feral
fa5902dcd2 [apps/calculation] Calculation: add a methods additionalOuput 2020-02-12 15:13:18 +01:00
Émilie Feral
29c50702ae [apps/shared] ScrollableExactApproximateExpressionsView: add a burger
view
2020-02-12 15:13:18 +01:00
Émilie Feral
8915148e72 [escher] Add a class BurgerMenuView 2020-02-12 15:13:18 +01:00
Émilie Feral
bb8bf9862c [apps/calculation] ComplexGraphView: add the angle value on the graph 2020-02-12 15:13:18 +01:00
Émilie Feral
27618e20d1 [apps/calculation] ComplexModel: use inheritance instead of composition
with std::complex<float> class
2020-02-12 15:13:18 +01:00
Émilie Feral
6af92c6d14 [apps/calculation] ComplexModel: change methods names 2020-02-12 15:13:18 +01:00
Émilie Feral
94ae9be992 [apps/calculation] ComplexGraphView: draw the angle and a segment from
the origin to the complex dot
2020-02-12 15:13:18 +01:00
Émilie Feral
f7942207f5 [apps/shared][apps/calculation] Create a methods
Shared::CurveView::drawAxisLabel and use it in ComplexGraphView
2020-02-12 15:13:18 +01:00
Émilie Feral
9c3dd84c42 [apps/shared] CurveView: factorize code of drawLabels and drawLabel 2020-02-12 15:13:18 +01:00
Émilie Feral
0beceede5f [apps/shared][apps/calculation] Create CurveView::drawLabel and use it
in complex_graph_view
2020-02-12 15:13:18 +01:00
Émilie Feral
3fb59d9f37 [apps/calculation/additional_outputs] ComplexGraphView draw dots from
model
2020-02-12 15:13:18 +01:00
Émilie Feral
1ceaeb935c [apps/calculation] First draft of complex additional result MVC 2020-02-12 15:13:18 +01:00
Léa Saviot
140c9c9660 [poincare/layout_node] Forward forSelection param in moveCursorVertically
1
Fixes the scenario: ------
                        133
                    12|+--- then Right then Shift Up -> the whole
                        820 fraction should be selected
2020-02-12 15:13:18 +01:00
Léa Saviot
ef7fb400c9 [escher/test] Fix and add layout_field select up down tests 2020-02-12 15:13:18 +01:00
Léa Saviot
e10bd18f8e [escher/text_area] insertTextAtLocation removes system parentheses 2020-02-12 15:13:18 +01:00
Léa Saviot
c192d2c920 [poincare/serialization_helper] Better ReplaceSysPrthesesByUsrPrtheses 2020-02-12 15:13:18 +01:00
Léa Saviot
a42b52d10e [escher/text_area/field] When pasting, force cursor right of text 2020-02-12 15:13:18 +01:00
Léa Saviot
c03c9086b8 [ion/utf8_helper] Add FIXME comment 2020-02-12 15:13:18 +01:00
Léa Saviot
408a33f8a6 [escher/layout_field] Allow copy-paste of ^2 2020-02-12 15:13:18 +01:00
Léa Saviot
8f86769cd1 [escher/layout_field] When pasting, force cursor right of pasted text
Even if the text is inserted code point per code point
2020-02-12 15:13:18 +01:00
Léa Saviot
d446d1cb61 [escher/text_input] Fix ShiftDown in text field with extension
The extension should not be selected
2020-02-12 15:13:18 +01:00
Léa Saviot
8cf13adaf0 [apps/editor_controller] Handle deleted scripts in cleanStorageEmptySpace 2020-02-12 15:13:18 +01:00
Léa Saviot
d9b284c1ec [escher/text_input] ShiftUp/Down selects whole textfield on left/right 2020-02-12 15:13:18 +01:00
Léa Saviot
cef4466ca8 [apps/expression_model] Smaller member variable size 2020-02-12 15:13:18 +01:00
Léa Saviot
f402f514a7 [apps/expression_model] Fix memoization of circularity
Scenario f(x)=cf(f(0)) in graph
2020-02-12 15:13:18 +01:00
Léa Saviot
2eaf84cc73 [escher/app/modal_view] If will exit app, do not relayout
App::willBecomeInactive calls dismissModalViewController, which puts
back the previous repsonder and calls layoutSubviews on the
modalViewController. We do not want to do all these operations when the
app will be exited anyways.
2020-02-12 15:13:18 +01:00
Léa Saviot
1d954db19d [poincare/layout_cursor] Better empty layout handling in selectLeftRight 2020-02-12 15:13:18 +01:00
Léa Saviot
8a8d4677a8 [escher/layout_field] Fix addSelection
Better handling of adding an horizontal to the selection of all its
children / or the contrary
2020-02-12 15:13:18 +01:00
Léa Saviot
94cd3ecde7 [poincare/layout_cursor] Fix selectUpDown if pointed layout detached
Scenario: 23/[[1 |empty] [empty empty]] then select up
2020-02-12 15:13:18 +01:00
Léa Saviot
344ea5a67a [apps/code] Handle Home event when in the toolbox
If editing a script, the empty space at the end of the script should be
moved to the end of the storage.
2020-02-12 15:13:18 +01:00
Léa Saviot
67f10d0abd [poincare/layout_node] Fix changeGreySquaresOfAllMatrixRelatives
There was a problem with node adresses that changed during an iterator
use.
Scenario : Matrix, Root, get right of the matrix, 50 zeroes, Divide,
Zero, Zero then shift up
2020-02-12 15:13:18 +01:00
Léa Saviot
3ff94b8930 [escher/text_input] Fix cursor position when deleting selection 2020-02-12 15:13:18 +01:00
Léa Saviot
cb53038909 [escher] Text input has alignment, not text field 2020-02-12 15:13:18 +01:00
Léa Saviot
aad1636238 [escher/text_input] Methods reordering 2020-02-12 15:13:18 +01:00
Léa Saviot
fb18b7cd69 [escher/text_input] Maxe some member variables protected 2020-02-12 15:13:18 +01:00
Léa Saviot
9b53b182a9 [escher/text_input] Fix deleteSelection 2020-02-12 15:13:18 +01:00
Léa Saviot
367df21288 [escher/text_input] Use move method to select
This fixes the dot that could be selected in the Python app script names
2020-02-12 15:13:18 +01:00
Léa Saviot
e3d06d87fb [escher/text_field] Fix Cut event when selection 2020-02-12 15:13:18 +01:00
Léa Saviot
e161d42839 [escher/text_field] Reset selection after Cut event 2020-02-12 15:13:18 +01:00
Léa Saviot
3d6b0a2d20 [escher/text_field] Fix selection deletion
The draft text length should be modified accordingly
2020-02-12 15:13:18 +01:00
Léa Saviot
0e7809b5d9 [escher/text_field] Rename size -> length 2020-02-12 15:13:18 +01:00
Léa Saviot
2c1cc02a19 [escher/layout_field] Fix selection + matrices
When selecting inside a matrix and then selecting outside, the grey
squares should disappear.
2020-02-12 15:13:18 +01:00
Léa Saviot
5fbc321a85 [apps/calculation] Coding style 2020-02-12 15:13:18 +01:00
Léa Saviot
7d2a24b826 [poincare/tree_pool] Fix node fetching after pool exception 2020-02-12 15:13:18 +01:00
Léa Saviot
5f52c36439 [escher/layout_field] Reset selection when finishing edition 2020-02-12 15:13:18 +01:00
Léa Saviot
bc1c566737 [poincare/fraction_layout] Better selection up/down in fraction 2020-02-12 15:13:17 +01:00
Léa Saviot
b1aeda47e8 [poincare/layout] Add parameter for selection when moving cursor 2020-02-12 15:13:17 +01:00
Léa Saviot
51742aef40 [escher/layout_cursor] Set height to the selection height
4
For instance, 123+- with "123+" selected, the cursor on the left of the
                  5
fraction will have the height of the selection.
2020-02-12 15:13:17 +01:00
Léa Saviot
c29ab14f20 [escher/layout_field] Better handling of layout recomputation
After a selection event, there is no need to recompute the layout. We
still need to dirty the union of the previous and next selection
rectangles.
2020-02-12 15:13:17 +01:00
Léa Saviot
f9b738a41e [escher/layout_field] Remove TODO comment 2020-02-12 15:13:17 +01:00
Léa Saviot
f7ada7dac0 [escher/layout_field] Simplify the layout selection algorithm 2020-02-12 15:13:17 +01:00
Léa Saviot
61f26e3e4c [escher/test] Layout selection in layout_field 2020-02-12 15:13:17 +01:00
Léa Saviot
a92326f9c9 [poincare/layout_cursor] Rename MoveDirection -> Direction 2020-02-12 15:13:17 +01:00
Léa Saviot
0bae9f9a73 [poincare/layout_cursor] Clean and fix selectLeftRight 2020-02-12 15:13:17 +01:00
Léa Saviot
145cc512a0 [poincare/layout_cursor] Better selectUpDown algorithm + comments 2020-02-12 15:13:17 +01:00
Léa Saviot
ff58c17093 [poincare/layout_cursor] Fix Up/Down selection
Scenario:
   2
|1+---  then select all towoards th right, then select up
   3
2020-02-12 15:13:17 +01:00
Léa Saviot
97c9268d37 [poincare/horizontal_layout] Uniformize selection background height 2020-02-12 15:13:17 +01:00
Léa Saviot
9ff3cbf32d [escher/expression_view] Layout selection color 2020-02-12 15:13:17 +01:00
Léa Saviot
785cd2f88c [poincare/layout_cursor] Rename layoutReference -> layout
It was an historic name
2020-02-12 15:13:17 +01:00
Léa Saviot
5c2ea9899d [poincare/layout_field] Select up/down 2020-02-12 15:13:17 +01:00
Léa Saviot
efc8a238ea [escher] Rename deleteSelectedText -> deleteSelection 2020-02-12 15:13:17 +01:00
Léa Saviot
5de65e0d7e [escher/layout_field] Copy selection 2020-02-12 15:13:17 +01:00
Léa Saviot
2e589f6eac [escher] Delete selection on layouts 2020-02-12 15:13:17 +01:00
Léa Saviot
f38bac6942 [escher/layout_field] Handle text addition while layouts are selected 2020-02-12 15:13:17 +01:00
Léa Saviot
a959f9fa98 [poincare/lyt_cursor] When selecting, we add one full layout each time 2020-02-12 15:13:17 +01:00
Léa Saviot
35fe6f0bc9 [poincare/layout_cursor] Simplify the selection 2020-02-12 15:13:17 +01:00
Léa Saviot
02e9694a5d [poincare/layout_cursor] Fix overselection
Select whole parent when selecting from one child to anorther, if the
parent is not horizontal
2020-02-12 15:13:17 +01:00
Léa Saviot
027f24b7b8 [poincare/layout_cursor] Fix empty layout selection 2020-02-12 15:13:17 +01:00
Léa Saviot
ed33e37695 [poincare/layout_cursor] Fix selection crash
Scenario: Horizontal layout has just an integral layout child, cursor
left of the integral and shift right
2020-02-12 15:13:17 +01:00
Léa Saviot
03f07d65ed [escher/layout_field] Remove selection on simple left/right/up/down 2020-02-12 15:13:17 +01:00
Léa Saviot
b9a8f12f25 [escher/poincare] Clean layout selection 2020-02-12 15:13:17 +01:00
Léa Saviot
65addcab21 [poincare/layout_node] Use background color in LayoutNode::draw 2020-02-12 15:13:17 +01:00
Léa Saviot
377cca7e3d [escher/layout_field] Start handling selection 2020-02-12 15:13:17 +01:00
Léa Saviot
ecf23123a6 [escher/text_input] Clean TextInput::ContentView::resetSelection 2020-02-12 15:13:17 +01:00
Léa Saviot
df167376f0 [escher/text_area] Handle cut event 2020-02-12 15:13:17 +01:00
Léa Saviot
33b5f008a2 [escher/text_field] Selection 2020-02-12 15:13:17 +01:00
Léa Saviot
9c5843500a [escher/text_input] Fix reload and scroll after deleteSelectedText 2020-02-12 15:13:17 +01:00
Léa Saviot
20c761d3f0 [escher/text_area] Fix slection over wrote
Scenario: 34567          then press 0 -> we want 3067
           ** selected
2020-02-12 15:13:17 +01:00
Léa Saviot
73b1f7da20 [escher/text_input] Fix selection algorithm
There was a glitch when :
** are the selected glyphs and | is the cursor

12345678
234567|8    then Shift+up
    **
2020-02-12 15:13:17 +01:00
Léa Saviot
e98b67634d [escher/text_area] Improve dirty tracking 2020-02-12 15:13:17 +01:00
Léa Saviot
1f44f80e4a [escher] Scroll to cursor when selecting up / down 2020-02-12 15:13:17 +01:00
Léa Saviot
961ba10122 [ion/events] shift+Left/Right/Up/Down can be repeated 2020-02-12 15:13:17 +01:00
Léa Saviot
b6f3b39086 [escher/text_input] Rename currentSelectionIsEmpty -> selectionIsEmpty 2020-02-12 15:13:17 +01:00
Léa Saviot
67008f454e [escher/text_area] Replace the selection when event with text 2020-02-12 15:13:17 +01:00
Léa Saviot
d05a95c87c [apps/code] Reset selection when leaving script editor 2020-02-12 15:13:17 +01:00
Léa Saviot
1be417e2c4 [apps/code] Code cleaning 2020-02-12 15:13:17 +01:00
Léa Saviot
95d0715606 [escher/solid_text_area] Remove unused class 2020-02-12 15:13:17 +01:00
Léa Saviot
a2c7e57a77 [apps/python_text_area] Color the white spaces 2020-02-12 15:13:17 +01:00
Léa Saviot
9d9efc985f [apps/python_text_area] Clean drawLine 2020-02-12 15:13:17 +01:00
Léa Saviot
30923ed4c6 [escher/text_area] Select up/down 2020-02-12 15:13:17 +01:00
Léa Saviot
349b4f8532 [escher/text_area] Fix selection color 2020-02-12 15:13:17 +01:00
Léa Saviot
1eba12784f [escher/text_area] Remove unnecessary scroll 2020-02-12 15:13:17 +01:00
Léa Saviot
ab48f8d879 [ion/events] if shift/alpha pressed, it is active
No need to press shift between ezach event -> one long shift press keeps
it active
2020-02-12 15:13:17 +01:00
Léa Saviot
bb69b2c131 [ion/events_modifier] Reindent 2020-02-12 15:13:17 +01:00
Léa Saviot
14cc6ffc59 [escher/text_area] Select and copy 2020-02-12 15:13:17 +01:00
Léa Saviot
0a21ed2cfb [liba] strlcpy third argument in size, not length 2020-02-12 15:13:17 +01:00
Émilie Feral
4025d75734 [apps/code] Fix number of displayable rows in ConsoleController 2020-02-12 15:13:17 +01:00
Émilie Feral
d64321d116 [apps/code] Remove useless class member in ConsoleController 2020-02-12 15:13:17 +01:00
Léa Saviot
e0bbc73b8b [apps/regression] Fix code cleaning 2020-02-12 15:13:17 +01:00
Ruben Dashyan
51cc6a4d71 [poincare/layout_helper] Simplify Infix and Prefix 2020-02-12 15:13:17 +01:00
Ruben Dashyan
ad938aed48 [poincare/tree_pool] Factor expression in registerNode 2020-02-12 15:13:17 +01:00
Ruben Dashyan
78f1270752 [poincare/tree_pool] Correct identifier type in registerNode 2020-02-12 15:13:17 +01:00
Ruben Dashyan
ff4879abb1 [poincare/tree_pool] Factor updateNodeForIdentifierFromNode
Hence fixing typo in assertion
2020-02-12 15:13:17 +01:00
Ruben Dashyan
4313560872 [poincare/tree_pool] Remove redundancy
The first condition generally implies the second (if size > 0).
If size == 0 then there is nothing to alloc.
2020-02-12 15:13:16 +01:00
Ruben Dashyan
e984277d66 [poincare/multiplication] shallowBeautify and denominator call new splitIntoNormalForm 2020-02-12 15:13:16 +01:00
Léa Saviot
0209c6d2d4 [ion/storage] Increase size to 32K 2020-02-12 15:13:16 +01:00
Léa Saviot
4ffcace024 [ion/storage] Add TODO about code optimization 2020-02-12 15:13:16 +01:00
Léa Saviot
c1b792c23d [apps/code] Get out of script edition on usb enumeration
The storage needs to be in a clean state
2020-02-12 15:13:16 +01:00
Léa Saviot
7e801906b8 [test/ion] Add Storage available space moving test 2020-02-12 15:13:16 +01:00
Léa Saviot
5853e96947 [apps/code] Remove EditorController::m_areaBuffer
This was a very large buffer that took a lot of RAM space (the size of
the storage). Instead of having it, we just move the available space of
the storage at the end of the edited script, and move it back when the
edition finishes.
This is slower but saves a lot of space.
2020-02-12 15:13:16 +01:00
Léa Saviot
a2a0abdcef [poincare/TreeNode] Fix hasNode 2020-02-12 15:13:16 +01:00
Léa Saviot
ed211f185a [poincare/tree_pool] Use uint16_t for node identifiers, not int 2020-02-12 15:13:16 +01:00
Léa Saviot
0a1c6a3d1d [poincare/tree_pool] Store node offsets, not node pointers
This saves place because we store uint16_t, not uint32_t
2020-02-12 15:13:16 +01:00
Léa Saviot
6a62f23000 [poincare/tree_pool] Replace test with assertion 2020-02-12 15:13:16 +01:00
Léa Saviot
23dafffcdc [poincare/tree_pool] TODO comment about not needed cleaning 2020-02-12 15:13:16 +01:00
Léa Saviot
ea3f23cb09 [poincare/tree_pool] Fix and add assertions on TreePool::node(id) 2020-02-12 15:13:16 +01:00
Émilie Feral
37061b9cb5 [python] Fix gc_collect to be sure to get unaligned pointers 2020-02-12 15:13:16 +01:00
Émilie Feral
4b58efbc0a [python] Fix stack boundary on the device 2020-02-12 15:13:16 +01:00
Émilie Feral
d1e93a2918 [python] Python stack: fix limit 2020-02-12 15:13:16 +01:00
Léa Saviot
d0a65b01c0 py/qstr: Raise exception in qstr_from_strn if str to intern is too long. 2020-02-12 15:13:16 +01:00
Léa Saviot
c9d337d536 py/builtinimport: Raise exception on empty name. 2020-02-12 15:13:16 +01:00
Ruben Dashyan
95c7235831 [poincare] Align implementation of shallowReduce in Symbol and Function 2020-02-12 15:13:16 +01:00
Ruben Dashyan
70c9d063a2 [poincare/symbol] Use replaceWithInPlace in shallowReduce 2020-02-12 15:13:16 +01:00
Ruben Dashyan
686b74cfe4 [poincare/constant] Remove unused parameters from templatedApproximate 2020-02-12 15:13:16 +01:00
Ruben Dashyan
961a0f5f2b [poincare/constant] Simplify shallowReduce 2020-02-12 15:13:16 +01:00
Ruben Dashyan
c238c5f736 [poincare/symbol_abstract] Remove unnecessary friend class Store 2020-02-12 15:13:16 +01:00
Ruben Dashyan
f0bfb41cab [poincare/symbol_abstract] Factor serialize 2020-02-12 15:13:16 +01:00
Ruben Dashyan
87c1f4f39c [poincare] Remove redundancy
TreeNode::serialize(char * buffer, int bufferSize, ...) returns
the number of chars it did write in buffer, null-terminating char
excluded.
strlcpy(char * dst, const char * src, size_t len) returns the length of
src.
Hence the min.
The case where bufferSize equals 0 does not need to be handled separately
since it is already contained in the min.
2020-02-12 15:13:16 +01:00
Ruben Dashyan
e4820a52f7 [poincare/symbol_abstract] Make nodeSize private 2020-02-12 15:13:16 +01:00
Ruben Dashyan
4bdc2043c8 [poincare/power] coding style in denominator 2020-02-12 15:13:16 +01:00
Ruben Dashyan
1556e2daad [poincare/power] Simplify denominator 2020-02-12 15:13:16 +01:00
Ruben Dashyan
55e01fbfd4 [poincare/parser] Remove currentTokenIsReservedFunction and currentTokenIsSpecialIdentifier
Use GetReservedFunction and IsSpecialIdentifierName instead.
2020-02-12 15:13:16 +01:00
Ruben Dashyan
9a3e0e9bd3 [poincare/parser] Simplify GetReservedFunction 2020-02-12 15:13:16 +01:00
Ruben Dashyan
4ef46b4fdb [poincare/parser] IsReservedFunctionName returns a pointer
and is hence renamed GetReservedFunction
2020-02-12 15:13:16 +01:00
Ruben Dashyan
967343f75d [poincare/parser] Remove IsReservedName unused parameter
The function is only called in apps/shared/function.
2020-02-12 15:13:16 +01:00
Ruben Dashyan
ab80741838 [poincare/test/simplification] Remove redundant tests 2020-02-12 15:13:16 +01:00
Ruben Dashyan
caa7e6fbbf [poincare/test/helper] Print richer information when test fails 2020-02-12 15:13:16 +01:00
Ruben Dashyan
3271fc90a4 [poincare/test] Clean header inclusions 2020-02-12 15:13:16 +01:00
Ruben Dashyan
5d1cc521f4 [poincare/expression] Mark nbChildren variable as const in deepBeautify 2020-02-12 15:13:16 +01:00
Ruben Dashyan
6ff28bf5ea [poincare/addition] Do not recompute the number of children in shallowBeautify 2020-02-12 15:13:16 +01:00
Léa Saviot
4e6378fe18 [test/regression] Add a logistic test 2020-02-12 15:13:16 +01:00
Léa Saviot
a8ead6b66e [apps/regression] Better initialisation of logistic model coefficients
It provides a better fit for:
x = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0}
y = {5.0, 9.0, 40.0, 64.0, 144.0, 200.0, 269.0, 278.0, 290.0, 295.0}
(coeffs should be {64.9, 1.0, 297.4})
2020-02-12 15:13:16 +01:00
Léa Saviot
3747b5a4b0 [apps/regression] Virtualize only the specialized part of initCoefs 2020-02-12 15:13:16 +01:00
Léa Saviot
2c497d4f55 Revert "[escher] Force relayouting in a table view"
This reverts commit 94281b906d5135f4d3181ca248f572e32be9119c.
The commit created a lot of blinking in the calculation history (for
instance for multiple lines of 56) + "the table's size might be
miscomputed" due to the layouting order (but we have not searched for an
example of such a miscomputation)
2020-02-12 15:13:16 +01:00
Ruben Dashyan
5787d50a45 Revert "[apps/calculation/edit_expression_controller] Define viewWillAppear"
This reverts commit 960736203ff2f816688868e3397d178d931fa3c3.
2020-02-12 15:13:16 +01:00
Ruben Dashyan
7f4dd1255a Revert "[escher/layout_field] Factor insertLayoutAtCursor"
This reverts commit b06cac4fcce0c1ab3fedd6c44846983962316749.
2020-02-12 15:13:16 +01:00
Émilie Feral
3a19939a64 [apps/regression] Missing ; 2020-02-12 15:13:16 +01:00
Ruben Dashyan
89aa0ac302 [apps/regression/graph_controller] Clean moveCursorHorizontally 2020-02-12 15:13:16 +01:00
Ruben Dashyan
2fb6824947 [apps/shared/interactive_curve_view_controller] Rewrite comment about addMargin 2020-02-12 15:13:16 +01:00
Ruben Dashyan
8cb2b99254 [apps/graph/calculation_graph_controller] Remove handleLeftRightEvent 2020-02-12 15:13:16 +01:00
Ruben Dashyan
bc0b5c092a [escher/layout_field] Factor insertLayoutAtCursor 2020-02-12 15:13:16 +01:00
Ruben Dashyan
89ea31d190 [eshcer/layout_field] Factor handleEvent 2020-02-12 15:13:16 +01:00
Ruben Dashyan
d604df85b2 [escher/layout_field] Remove magic number 2020-02-12 15:13:16 +01:00
Ruben Dashyan
7fce83d1dd [escher/expression_field] Detect whether view's height did change by memoizing the height
Such changes used to be detected only when the height was equal to the
maximal allowed value, by detecting whether the height shifted from or
to that maximal value. For that purpose, a boolean was memoized in
InputViewController and in Calculation::EditExpressionController.
2020-02-12 15:13:16 +01:00
Ruben Dashyan
40d75ffefa [escher/expression_field] Remove unused reload() method 2020-02-12 15:13:16 +01:00
Ruben Dashyan
3bc3532358 [escher/expression_field] Replace maximalHeight() by k_maximalHeight
To harmonize with k_minimalHeight
2020-02-12 15:13:16 +01:00
Ruben Dashyan
b832a9e9f4 [apps/calculation/edit_expression_controller] Define viewWillAppear 2020-02-12 15:13:16 +01:00
Ruben Dashyan
b624e47ccb [apps/calculation/edit_expression_controller] Remove dummy viewDidDisappear
HistoryController does not override ViewController's default
viewDidDisappear.
2020-02-12 15:13:15 +01:00
Ruben Dashyan
7a49e23e3b [apps/calculation] Factor HistoryController::reload 2020-02-12 15:13:15 +01:00
Émilie Feral
e550712ccc [apps/settings] Separation is always below the CellWithSeparator 2020-02-12 15:13:15 +01:00
Émilie Feral
f7fc8da94d [apps/settings] Use a MessageTableCellWithGaugeWithSeparator in the main
controller to mimic two tables
2020-02-12 15:13:15 +01:00
Émilie Feral
953c9dfe64 [apps/settings] Create a parent class CellWithSeparator to
MessageTableCellWithEditableTextWithSeparator for future factorization
2020-02-12 15:13:15 +01:00
Émilie Feral
3627dc0c0f [apps/code] Choose editor font size from GlobalPreferences 2020-02-12 15:13:15 +01:00
Émilie Feral
c2dabf6510 [apps/code] Choose console text size from GlobalPreferences 2020-02-12 15:13:15 +01:00
Émilie Feral
b3d45833d0 [apps/settings] Add a menu "Font size" in settings 2020-02-12 15:13:15 +01:00
Émilie Feral
d48006f994 [apps/settings] Add messages about font sizes 2020-02-12 15:13:15 +01:00
Émilie Feral
39a6fdaf1c [apps/settings] MainController: get rid of magic numbers 2020-02-12 15:13:15 +01:00
Émilie Feral
4a41ec0fda [apps] GlobalPreferences: add font (Large or Small) 2020-02-12 15:13:15 +01:00
Léa Saviot
1434158bee [apps/graph] Faster curve navigation after some time
If the user presses the LEft/Right keys for a long time, the cursor will
move faster.
2020-02-12 15:13:15 +01:00
Léa Saviot
b9bc9008ac [ion] Detect long repeated events
This will be use for instance to sroll faster if the user presses the
directional keys for a long time
2020-02-12 15:13:15 +01:00
Léa Saviot
973c2149d4 [ion/battery] Battery level has some hysteresis
This prevents a blinking battery pictogra wwhen the battery level is at
the limit between two states.
2020-02-12 15:13:15 +01:00
Léa Saviot
984bfca68e [escher] ScrollView TODO comment 2020-02-12 15:13:15 +01:00
Léa Saviot
8644d28a0e [escher] Force relayouting in a table view 2020-02-12 15:13:15 +01:00
Léa Saviot
0630ae55c7 [apps/escher] Force expressionField relayout when size changed
Scenario: in Calculations and in Graph, edit the layout field by adding
many parentheses. When the layout field has maximal height but the
parentheses are bigger than it, ther is a margin that appears at the
bottom, because we did not relayout the layout field to optimize
redrawing. We need to force the relayout, otherwise as the layout field
stays we the same frame, the relayouting is not properly done.
2020-02-12 15:13:15 +01:00
Léa Saviot
9f018eb9d9 [escher/view] setFrame and layoutSubviews can be forced 2020-02-12 15:13:15 +01:00
Léa Saviot
f85658f5e6 [escher/view] Inline some view methods 2020-02-12 15:13:15 +01:00
Ruben Dashyan
1c668dca52 [escher/layout_field] Remove unused enum class 2020-02-12 15:13:15 +01:00
Ruben Dashyan
ecd6cb29f1 [escher/expression_field] Rename k_textFieldHeight to k_minimalHeight
That constant has nothing to do with TextField. It is the minimal height
of ExpressionField.
2020-02-12 15:13:15 +01:00
Ruben Dashyan
063cc66ba2 [escher/layout_field] Make protected methods private
LayoutField has no derived class
2020-02-12 15:13:15 +01:00
Ruben Dashyan
737d76471b [escher/layout_field] Remove unused accessor 2020-02-12 15:13:15 +01:00
Ruben Dashyan
310e1ab829 [apps/calculation/edit_expression_controller] Make ContentView View-specific methods private 2020-02-12 15:13:15 +01:00
Léa Saviot
9e6c3c7a26 [poincare/code_point_layout] Fix typo in canBeOmittedMultiplicationLeftFactor 2020-02-12 15:13:15 +01:00
Léa Saviot
16885e6be8 [poincare/tree_node] Coding style 2020-02-12 15:13:15 +01:00
Léa Saviot
83fde09370 [poincare] Fix serializing/parsing of layout x|2|
Would give the fucntion xabs(2)
2020-02-12 15:13:15 +01:00
Léa Saviot
463b44f055 [poincare/nth_root_layout] isSquareRoot 2020-02-12 15:13:15 +01:00
Léa Saviot
a233b02623 [apps/regression] Better coef initialisation for trigonometric_model
It improves the trigonometric fit of
x = {0.0, 0.975, 1.97, 2.945, 3.971, 4.887, 5.924, 6.964, 7.979, 8.974, 9.998};
y = {-23.784, -23.322, -28.322, -18.422, -4.813206, 7.146241, 16.631, 16.632, 9.209189, -6.050863, -19.659};
2020-02-12 15:13:15 +01:00
Léa Saviot
0055a59c75 [apps/banner_view] Fix minimalSizeForOptimalDisplay
Should not use m_frame as it may not be set properly. By default, a
banner view wants to take the whole screen width
This fixes the following scenario :
Draw the polar curve r=12. When navigating from the tab to the graph,
the curve was visibly redrawn because the banner view height was not
computed properly.
2020-02-12 15:13:15 +01:00
Ruben Dashyan
491a93d8f1 [apps/calculation/edit_expression_controller] Access view more directly 2020-02-12 15:13:15 +01:00
Ruben Dashyan
59e6c9d324 [apps/calculation/edit_expression_controller] view() does not return nullptr 2020-02-12 15:13:15 +01:00
Ruben Dashyan
227c9a8d68 [apps/calculation/edit_expression_controller] Inline view() in header 2020-02-12 15:13:15 +01:00
Ruben Dashyan
7630460424 [apps/code] Add methods on lists to python toolbox catalog 2020-02-12 15:13:15 +01:00
Ruben Dashyan
a3053acac4 [apps/shared/expression_model] Add TODOs for later 2020-02-12 15:13:15 +01:00
Ruben Dashyan
c3cf5c1ef4 Rename UCodePointUnknownX to UCodePointUnknown 2020-02-12 15:13:15 +01:00
Ruben Dashyan
b728fb8a1b [poincare/symbol_abstract] No need to clone the expression for a Function
Already cloned in the global context.
2020-02-12 15:13:15 +01:00
Ruben Dashyan
fc392d4e81 [poincare/function] Remove old TODO 2020-02-12 15:13:15 +01:00
Ruben Dashyan
3183ca7d7e Replace Poincare::Function unknown earlier (in Context) 2020-02-12 15:13:15 +01:00
Ruben Dashyan
dd80be026d [poincare] Rename shallowReplaceReplaceableSymbols to deep... 2020-02-12 15:13:15 +01:00
Ruben Dashyan
47ed5814a2 [poincare] Remove hasReplaceableSymbols 2020-02-12 15:13:15 +01:00
Ruben Dashyan
7539a0dc37 [poincare/symbol] Remove SymbolNode::isUnknown unnecessary parameter 2020-02-12 15:13:15 +01:00
Ruben Dashyan
a52fd2c697 [apps/graph/graph_view] Do not draw the functions with undef expression 2020-02-12 15:13:15 +01:00
Ruben Dashyan
34aa27ea08 [apps/shared/continuous_function] Simplify templatedApproximateAtParameter 2020-02-12 15:13:15 +01:00
Ruben Dashyan
5750d00574 [apps/shared] Remove redundant call to isCircularlyDefined
ExpressionModel::expressionReduced does already call isCircularlyDefined
and returns undef if true.
The isCircularlyDefined method is then made private.
2020-02-12 15:13:15 +01:00
Ruben Dashyan
9480bcacd5 [apps/*/expression_model] Make expressionAddress private 2020-02-12 15:13:15 +01:00
Léa Saviot
78eea601c7 [ion/device] Prevent the user from leaving DFU during software download
We prevent the use of the Back key to leave DFU after a flash erase
operation. This way, we prevent the user from interrupting a software
download. After every software download, the calculator resets, which
unlocks the "exit on pressing back"
2020-02-12 15:13:15 +01:00
Léa Saviot
0f52335183 [apps/code] Fix syntaxic coloration
This fixes the coloration of:
"123\n"+1
"\n\n"+1

For strings, lex->vstr.len gave the wrong value because it had already
translated escaped chars, so "\n" would be one char long.
2020-02-12 15:13:15 +01:00
redgl0w
751610d0ef Merge branch 'omega-dev' into patch-7 2020-02-09 10:07:15 +01:00
redgl0w
80b247b773 Update layout_events.h 2020-02-09 09:09:14 +01:00
redgl0w
5dece161cc Update layout_events.h 2020-02-09 09:08:20 +01:00
Quentin Guidée
d057d66949 Added: Beta testers + New contributors 2020-02-04 19:31:02 +01:00
Quentin Guidée
d8cc958cf5 [WIP] Added: Beta testers 2020-02-04 00:00:22 +01:00
Quentin
12ed3d0a30 Merge pull request #222 from RedGl0w/patch-5
Fixed #205
2020-02-02 19:28:59 +01:00
redgl0w
75f7b9a875 Update layout_events.h 2020-02-02 10:23:29 +01:00
redgl0w
207a069562 Update layout_events.h 2020-02-02 10:22:39 +01:00
Quentin
9e798d6dd0 Merge pull request #217 from LeGmask/Patch
Fix #216
2020-01-30 19:59:08 +01:00
Evann DREUMONT
4a1dae3625 Fix #216 2020-01-30 19:16:01 +01:00
Quentin Guidée
ae0f575691 Merge branch 'M4xi1m3-ram-usage' into omega-dev 2020-01-29 13:58:09 +01:00
M4x1m3
f9afca7549 Fixed weird display issue. 2020-01-29 07:11:28 +01:00
M4x1m3
26b624ef0d Memory usage display. 2020-01-28 22:45:13 +01:00
Quentin Guidée
5e95afe9e4 Merge remote-tracking branch 'upstream/master' into omega-dev 2020-01-27 23:31:17 +01:00
Quentin Guidée
e461571a3d Fix conflicts 2020-01-27 18:36:50 +01:00
Quentin Guidée
24748e4306 Fixed README.md 2020-01-27 18:35:59 +01:00
Quentin Guidée
507eaafa30 Fix README.md 2020-01-27 18:34:00 +01:00
Quentin Guidée
65bad19dd2 Removed All-Contributors + add contributors manually 2020-01-27 18:32:21 +01:00
Quentin Guidée
5a2cd95bf9 Merge branch 'all-contributors/add-MixedMatched' into omega-hotfix 2020-01-27 17:29:29 +01:00
Quentin Guidée
17df2f1405 Fix conflicts 2020-01-27 17:29:03 +01:00
allcontributors[bot]
342360dcfa docs: create .all-contributorsrc [skip ci] 2020-01-27 16:23:55 +00:00
allcontributors[bot]
40defea6ce docs: update README.md [skip ci] 2020-01-27 16:23:54 +00:00
Quentin Guidée
7df73520a6 Merge branch 'all-contributors/add-RedGl0w' into omega-hotfix 2020-01-27 17:19:43 +01:00
Quentin Guidée
ac3fca3e84 Fix conflicts 2020-01-27 17:19:28 +01:00
allcontributors[bot]
588bbef312 docs: create .all-contributorsrc [skip ci] 2020-01-27 16:14:19 +00:00
allcontributors[bot]
77ddf8ecc6 docs: update README.md [skip ci] 2020-01-27 16:14:18 +00:00
Quentin Guidée
c9510f3fa9 Merge branch 'all-contributors/add-M4xi1m3' into omega-hotfix 2020-01-27 17:12:07 +01:00
Quentin Guidée
f2f5ac15b1 Fix conflicts 2020-01-27 17:11:41 +01:00
Quentin Guidée
cdcb8d4c6c Merge branch 'all-contributors/add-quentinguidee' into omega-hotfix 2020-01-27 17:06:59 +01:00
allcontributors[bot]
e83f06341b docs: create .all-contributorsrc [skip ci] 2020-01-27 16:02:17 +00:00
allcontributors[bot]
69c8fa12bb docs: update README.md [skip ci] 2020-01-27 16:02:16 +00:00
allcontributors[bot]
bc85a47568 docs: create .all-contributorsrc [skip ci] 2020-01-27 15:58:31 +00:00
allcontributors[bot]
fb38235ac9 docs: update README.md [skip ci] 2020-01-27 15:58:30 +00:00
Quentin
593dc42c36 Merge pull request #199 from M4xi1m3/omega-dev
[apps/code] Fixed #198
2020-01-26 17:31:06 +01:00
M4x1m3
30bc2a0cdf [apps/code] Fixed #198 2020-01-26 14:20:09 +01:00
Quentin
587b6ee2a3 Merge pull request #179 from citorva/omega-dev
Remove External app for unsupported devices (web/n0100) and adds a ba…
2020-01-26 00:05:26 +01:00
Venceslas
ebcd8acf50 Update Makefile 2020-01-25 23:46:20 +01:00
Quentin Guidée
25690ceb48 Updated theme submodule 2020-01-25 23:09:57 +01:00
Venceslas
8940f0e248 Update Makefile 2020-01-25 16:13:37 +01:00
Venceslas
a9bbda5572 Update Makefile 2020-01-25 16:05:10 +01:00
Quentin Guidée
c6a01e285c Fixed HU translation 2020-01-24 19:52:20 +01:00
Quentin Guidée
34e5411857 Merge branch 'M4xi1m3-issue-176' into omega-dev 2020-01-24 03:34:03 +01:00
Quentin Guidée
1328e41a55 Merge branch 'issue-176' of https://github.com/M4xi1m3/Omega into M4xi1m3-issue-176 2020-01-24 03:31:32 +01:00
Quentin
018a504ee2 Merge pull request #191 from M4xi1m3/omega-dev
Shift+Up and Shift+Down in python editor (closes #177)
2020-01-24 03:28:51 +01:00
M4x1m3
56b9bd0a61 Added option to duplicate scripts (closes 176) 2020-01-23 23:21:42 +01:00
M4x1m3
335f870a23 Shift+Up and Shift+Down in python editor (closes #177) 2020-01-23 22:17:04 +01:00
Venceslas
b4fdde072b Update controller.cpp 2020-01-23 20:57:33 +01:00
Quentin Guidée
346b7eb62a Fixed the input color and size 2020-01-23 19:20:07 +01:00
Quentin Guidée
797e5e1b83 Added purple and orange LED 2020-01-23 18:20:03 +01:00
Quentin Guidée
e4b19f3522 Updated submodules 2020-01-23 13:24:21 +01:00
Romain Goyet
d14638163a [docs] Cleanup 2020-01-22 08:43:41 -05:00
Quentin Guidée
5774cff0d8 Fixed exam mode position 2020-01-21 20:56:51 +01:00
Venceslas
3ad641f596 Update controller.cpp 2020-01-21 19:42:26 +01:00
citorva
c94affa7cd Remove External app for unsupported devices (web/n0100) and adds a basic examination checking system 2020-01-19 23:45:35 +01:00
Garret Kelly
668bc95f15 [build] Don't invoke bash-specific '[['
'[[' isn't available when $SHELL isn't set to bash, so use expr from
coreutils to check for the presence of the device in DFU mode.
2020-01-15 22:34:39 -05:00
Quentin Guidée
a9e0c5f6b6 Fix conflicts 2020-01-15 20:15:20 +01:00
Quentin Guidée
afed02dfc2 Merge branch 'omega-hotfix' into omega-master 2020-01-15 20:14:04 +01:00
Quentin Guidée
20718258f3 README.md 2020-01-15 20:13:46 +01:00
Quentin
614a898207 Merge pull request #167 from elicolh/patch-1
switching right and up in get_keys()
2020-01-15 18:56:44 +01:00
elicolh
77a3b492fd switching right and up in get_keys() 2020-01-15 18:55:30 +01:00
Quentin Guidée
8ed907b356 [1.18.5] HOTFIX LED COLOR RED 2020-01-14 20:27:56 +01:00
Quentin Guidée
8c6be2b389 HOTFIX LED COLOR RED 2020-01-14 20:26:50 +01:00
Émilie Feral
de603befc5 [ion] main_sdl: Update the static sNeedsRefresh when actually refreshing the
screen
2020-01-13 15:44:44 +01:00
Quentin Guidée
c9b209e4f7 Merge branch 'Gegenter-patch-1' into omega-dev 2020-01-12 10:34:40 +01:00
Gegenter
d7f8212685 Translated 2020-01-12 10:30:35 +01:00
Quentin Guidée
6f5f7fe744 Merge branch 'RedGl0w-patch-1' into omega-dev 2020-01-12 02:05:57 +01:00
Quentin Guidée
6245b4b290 Fix conflicts and hu translations 2020-01-12 02:05:46 +01:00
Quentin Guidée
a9706addf6 Merge branch 'RedGl0w-patch-2' into omega-dev 2020-01-12 01:58:26 +01:00
Quentin Guidée
d8adfdbd55 Merge branch 'patch-2' of https://github.com/RedGl0w/epsilon into RedGl0w-patch-2 2020-01-12 01:58:17 +01:00
Quentin Guidée
f9023a5760 Merge branch 'RedGl0w-patch-4' into omega-dev 2020-01-12 01:50:58 +01:00
Quentin Guidée
d63d1c494e Merge branch 'patch-4' of https://github.com/RedGl0w/epsilon into RedGl0w-patch-4 2020-01-12 01:50:44 +01:00
Quentin Guidée
a8f2caa74f Merge branch 'omega-dev' of github.com:Omega-Numworks/Omega into omega-dev 2020-01-12 01:47:15 +01:00
Quentin Guidée
b55944ff3a Merge branch 'Gegenter-omega-dev' into omega-dev 2020-01-12 01:42:18 +01:00
U-DESKTOP-L7NJ45P\Gegenter
5bc940c511 Spaces corrected 2020-01-11 18:04:14 +01:00
U-DESKTOP-L7NJ45P\Gegenter
c172a27a8b Hungarian Language Added 2020-01-11 17:46:28 +01:00
Quentin
06546c6984 Merge pull request #159 from M4xi1m3/omega-dev
Fixed apps dependency in ion.
2020-01-11 17:45:00 +01:00
M4x1m3
61f214bcb2 Fixed apps dependency in ion. 2020-01-11 17:33:13 +01:00
redgl0w
dff9927656 Update layout_cursor.cpp 2020-01-10 20:52:35 +01:00
redgl0w
9cb4758bb6 Update README.md 2020-01-10 20:06:24 +01:00
redgl0w
4824ad61fc Update exam_mode_controller.cpp 2020-01-10 20:06:05 +01:00
redgl0w
c89fe21f5d Update README.md 2020-01-10 20:05:00 +01:00
redgl0w
46d2721c8d Update base.fr.i18n 2020-01-10 18:35:04 +01:00
redgl0w
152e5152f5 Update base.fr.i18n 2020-01-10 18:31:29 +01:00
redgl0w
bed98a8723 Update base.pt.i18n 2020-01-10 18:30:32 +01:00
redgl0w
f79172c1fe Update base.es.i18n 2020-01-10 18:29:36 +01:00
redgl0w
2829d0ee71 Update base.de.i18n 2020-01-10 18:28:27 +01:00
Quentin Guidée
45fb6cce93 Fixed trigonometry 2020-01-10 12:16:28 +01:00
Quentin Guidée
17ee342d7d Red color for the led 2020-01-10 11:57:52 +01:00
redgl0w
71ad0cce74 Added translations (without translating) 2020-01-10 07:55:58 +01:00
redgl0w
ae91706bce Simplified reloading 2020-01-10 07:27:31 +01:00
redgl0w
f6b0882dfb Corrected theme issue 2020-01-10 07:26:05 +01:00
redgl0w
35791b1ed7 Update archive.cpp 2020-01-09 17:35:26 +01:00
redgl0w
8149a1def1 Update main_controller.cpp 2020-01-09 17:34:58 +01:00
redgl0w
8cd1675672 Update .gitlab-ci.yml 2020-01-09 17:31:12 +01:00
Quentin Guidée
61766e5eb3 Updated themes submodules 2020-01-09 17:03:31 +01:00
Quentin Guidée
6ddbb9610c Merge branch 'omega-dev' of github.com:Omega-Numworks/Omega into omega-dev 2020-01-09 15:31:49 +01:00
Quentin Guidée
644d5dbd36 Updated themes submodules 2020-01-09 15:31:32 +01:00
Quentin
f731be7943 Merge pull request #126 from M4xi1m3/omega-dev
Remove static buffers
2020-01-07 18:13:44 +01:00
M4x1m3
e3fdd41bda Merge branch 'omega-dev' of https://github.com/Omega-Numworks/Omega into omega-dev 2020-01-07 18:07:15 +01:00
Quentin Guidée
a44fceb297 Merge remote-tracking branch 'upstream/master' into omega-dev 2020-01-07 16:35:38 +01:00
Quentin Guidée
58cc7588b0 Merge branch 'omega-hotfix' into omega-dev 2020-01-07 16:33:05 +01:00
Quentin Guidée
a08a46d62f Fix templates 2020-01-07 16:32:33 +01:00
Quentin Guidée
9740d2428b Fix conflicts 2020-01-07 16:29:34 +01:00
Quentin
8a24a37b75 Merge pull request #137 from Omega-Numworks/quentinguidee-patch-1
Update issue templates
2020-01-07 16:27:38 +01:00
Quentin
27b4dcdf04 Update issue templates 2020-01-07 16:25:29 +01:00
Léa Saviot
e1881d7b8b [build/scenarion] Fix commands for scenario creator and logger 2020-01-07 13:50:02 +01:00
Léa Saviot
f1f4e43159 [ion/console] Default ion sources have console_stdio, not _display 2020-01-07 13:50:02 +01:00
Émilie Feral
f68ec6a28d [apps] VariableBoxController: fix the maximal number of displayed cells 2020-01-06 16:26:42 +01:00
Léa Saviot
00d28108fb [apps] Fix i18n to be able to build standalone apps
Example failing build: make PLATFORM=simulator EPSILON_APPS=regression
2020-01-06 15:15:49 +01:00
Ruben Dashyan
389fbbca3a [python/port] Support for unicode strings 2020-01-06 15:15:19 +01:00
Léa Saviot
57ceda5ac0 [bench] USBPlugged command 2020-01-06 14:31:37 +01:00
Léa Saviot
849b9009d2 [apps/var_box_controller] Fix k_maxNumberOfDisplayedRows computation 2020-01-06 14:18:35 +01:00
Léa Saviot
fd63f70f6d [apps/variable_box_controller] Fix memoization
There was a broken assertion:
Create at least 7 functions
Go to the calculation app
Open the variable box and delete the last function
2020-01-06 14:18:35 +01:00
Émilie Feral
f3c6aab669 [apps/calculation] HistoryViewCell: when reloading the entire table due
to a cell selection, the cell used for the selected row might change. We
thereby have to update the selected cell once the table has been
reloaded.

This fixes the following bug: add 5 times the calculation "12.2". Go up,
the selected expression is the left one instead of the right one.
2020-01-06 14:07:20 +01:00
Émilie Feral
6a5708a562 [apps/shared] ScrollableExactApproximateExpressionsView: when only the
right expression is displayed, prevent from selecting the left
expression.

This fixes the following bug: add '1' to the calculation store, select
the output expression and go to the left. The selection is now on an
invisible cell.
2020-01-06 14:07:20 +01:00
Quentin Guidée
ebe5b80c01 Merge branch 'omega-hotfix' into omega-dev 2020-01-05 18:48:00 +01:00
Quentin Guidée
5dd5335596 Merge branch 'omega-hotfix' into omega-master 2020-01-05 18:47:36 +01:00
Quentin Guidée
b655c3799a Switched from Slack to Discord 2020-01-05 18:47:12 +01:00
M4x1m3
bcda0d71e3 Switched to jbboric's version of the rammap. 2020-01-04 20:49:54 +01:00
Romain Goyet
ae06bb0d81 Generate a RAM map 2020-01-04 20:24:56 +01:00
Jean-Baptiste Boric
786306a1d6 Remove statically-allocated buffers 2020-01-04 10:35:34 +01:00
Jean-Baptiste Boric
739bd31d10 Remove statically-allocated buffers 2020-01-04 10:34:28 +01:00
Jean-Baptiste Boric
c7f675a621 Remove statically-allocated buffers 2020-01-04 10:31:00 +01:00
Quentin Guidée
1819e6b259 Merge branch 'omega-hotfix' into omega-dev 2020-01-03 20:46:43 +01:00
Quentin Guidée
473c3e878c [1.18.4] Fixed #122 2020-01-03 20:46:29 +01:00
Quentin Guidée
b004e2f22d Merge branch 'omega-hotfix' into omega-master 2020-01-03 20:45:36 +01:00
Quentin Guidée
eb7efdad4a Merge branch 'M4xi1m3-omega-hotfix' into omega-hotfix 2020-01-03 20:44:53 +01:00
M4x1m3
26d3466fec [poincare] Fixed #122 2020-01-03 20:39:30 +01:00
Quentin Guidée
2799ebc5a7 Merge branch 'omega-hotfix' into omega-dev 2020-01-01 18:28:48 +01:00
Quentin Guidée
caa51fd292 Merge branch 'omega-hotfix' into omega-master 2020-01-01 18:28:28 +01:00
Quentin Guidée
677f66c818 Updated README.md 2020-01-01 18:28:11 +01:00
Quentin Guidée
3b053670da Merge branch 'omega-hotfix' into omega-dev 2019-12-30 22:03:20 +01:00
Quentin Guidée
2f0fdc1a26 [1.18.3] Fixed a keyboard issue 2019-12-30 22:03:01 +01:00
Quentin Guidée
79de4f48bb Merge branch 'omega-hotfix' into omega-master 2019-12-30 22:02:22 +01:00
Quentin Guidée
596ad276a3 Fix keyboard issue with shift + 2019-12-30 22:02:01 +01:00
Quentin Guidée
9fb20c216f Merge branch 'MixedMatched-pythonfont' into omega-dev 2019-12-30 21:43:11 +01:00
Quentin Guidée
b30437c683 Merge branch 'pythonfont' of https://github.com/MixedMatched/Omega into MixedMatched-pythonfont 2019-12-30 21:42:57 +01:00
Danny Simmons
966356d04a [apps/settings] Fix main_controller 2019-12-30 15:36:23 -05:00
Quentin Guidée
167a784b28 Merge branch 'omega-hotfix' into omega-dev 2019-12-30 21:24:20 +01:00
Quentin Guidée
b9b4ca7a89 Merge branch 'omega-hotfix' into omega-master 2019-12-30 21:23:47 +01:00
Quentin
ecf2933025 Merge pull request #117 from M4xi1m3/omega-hotfix
[simulator] changed apps id, changed icon, removed telemetry
2019-12-30 21:22:50 +01:00
Danny Simmons
418d809555 [apps/settings] Translate I18n references 2019-12-30 14:40:38 -05:00
AD Simmons
cdfb1f724b [apps/code] Add PythonFont preferences as the python font size in code 2019-12-29 16:24:23 -05:00
AD Simmons
d702978eba [apps/settings] Add preferences_controller back into main_controller 2019-12-29 16:23:52 -05:00
AD Simmons
4ffaf2ed44 [apps/settings] Add PythonFont preferences to preferences_controller 2019-12-29 16:23:17 -05:00
AD Simmons
2813e91a8e [poincare/preferences] Create PythonFont references in sharedPreferences 2019-12-29 16:22:34 -05:00
AD Simmons
275ec2a198 [apps/settings] Untranslated I18n references for Python Font 2019-12-29 16:21:35 -05:00
M4x1m3
ba15b793cd [simulator] changed apps id 2019-12-29 20:35:37 +01:00
Quentin Guidée
0ad70b8fee Merge branch 'omega-hotfix' into omega-dev 2019-12-29 17:17:17 +01:00
Quentin Guidée
114c97c1f9 [1.18.2] Fixed a bug where all contributors where not shown 2019-12-29 17:17:04 +01:00
Quentin Guidée
0d0f4c9313 Merge branch 'omega-hotfix' into omega-master 2019-12-29 17:16:10 +01:00
Quentin Guidée
05da125732 Merge branch 'M4xi1m3-omega-hotfix' into omega-hotfix 2019-12-29 17:15:44 +01:00
M4x1m3
ffe78c22cd [settings/about] Not all contributors were shown. 2019-12-29 16:33:08 +01:00
Quentin Guidée
33b4eaa88e Merge branch 'omega-hotfix' into omega-dev 2019-12-29 11:56:40 +01:00
Quentin Guidée
ffac1b68fb [1.18.1] Disabled External in NoSym exam mode 2019-12-29 11:54:56 +01:00
Quentin Guidée
f6d2ef441e [1.18.1] Disabled External in NoSym exam mode 2019-12-29 11:53:45 +01:00
Quentin Guidée
e50f7f123a Init Omega 1.19 2019-12-29 11:46:24 +01:00
Quentin Guidée
863a278d6c Fix binpacks 2019-12-29 11:35:56 +01:00
Quentin Guidée
3d63ce043a Fix binpacks 2019-12-29 11:30:41 +01:00
Quentin Guidée
ef57ca81a3 Submodule updates 2019-12-28 14:48:16 +01:00
Quentin Guidée
fd02d153db O1.18 Merge 2019-12-28 14:45:48 +01:00
Quentin Guidée
be95067207 Fix for #113 2019-12-28 14:39:40 +01:00
Quentin
a0d38ecdea Merge pull request #113 from RedGl0w/MakeRun
Added `make PLATFORM=simulator run`
2019-12-28 14:36:34 +01:00
Quentin Guidée
b504892998 Theme submodule updated 2019-12-28 00:51:18 +01:00
Quentin Guidée
4f8453eb1a Merge branch 'M4xi1m3-fix-layout' into omega-dev 2019-12-27 23:52:36 +01:00
Quentin Guidée
c5ba1d8f6b Merge branch 'fix-layout' of https://github.com/M4xi1m3/Omega into M4xi1m3-fix-layout 2019-12-27 23:44:06 +01:00
Quentin
718d4e14f4 Merge pull request #114 from M4xi1m3/make-doc
[build] Added target doc, using doxygen.
2019-12-27 23:41:58 +01:00
Quentin Guidée
f630cc6274 Merge branch 'M4xi1m3-issue-109' into omega-dev 2019-12-27 23:40:22 +01:00
Quentin Guidée
083862dc2a Fix conflicts 2019-12-27 23:36:07 +01:00
Quentin Guidée
9e05f855f2 Merge branch 'M4xi1m3-mp-fix' into omega-dev 2019-12-27 23:33:19 +01:00
Quentin Guidée
4da34b7d81 Fix conflicts 2019-12-27 23:30:25 +01:00
Quentin Guidée
d837111da5 Merge branch 'M4xi1m3-issue-89' into omega-dev 2019-12-27 23:24:00 +01:00
Quentin Guidée
c87c5b63e3 Fix conflicts 2019-12-27 23:22:23 +01:00
Quentin Guidée
8866b1c9e9 Merge branch 'M4xi1m3-issue-106' into omega-dev 2019-12-27 23:19:37 +01:00
M4x1m3
0d183cedf2 [build] Added target doc, using doxygen. 2019-12-27 21:32:15 +01:00
M4x1m3
b8ae0f625d [settings/math] Changed from "Multiply symbol" to "Multiply", fixed #109. 2019-12-27 20:54:50 +01:00
M4x1m3
76a6678a29 [settings/about] MicroPython -> µPython, fixes offset of the version. 2019-12-27 20:36:59 +01:00
M4x1m3
3a4ffa9fb9 [settings/about] MicroPython version from mpconfig.h 2019-12-27 20:31:41 +01:00
M4x1m3
e1d907f7c2 [ion/keyboard] Fixed layout. Added shift + ( 2019-12-27 20:17:38 +01:00
M4x1m3
765e648d2b Added missing names, added usernames, closes #89 2019-12-27 19:44:48 +01:00
redgl0w
c91227bc2e Update Makefile 2019-12-27 19:33:06 +01:00
M4x1m3
9a9ae068ef Reworked exam mode, fixed #106 2019-12-27 16:48:45 +01:00
Quentin Guidée
b7fe5b51c8 Fixed alpha + % 2019-12-25 19:24:33 +01:00
Quentin Guidée
160adf6bab Fix compilation errors on n0110 2019-12-25 14:40:57 +01:00
Quentin Guidée
57f2b41c3f Fix: OMEGA not displayed on the home screen 2019-12-25 14:37:08 +01:00
Quentin Guidée
7e6ceaa8ac Merge branch 'RedGl0w-AlphaLock' into omega-dev 2019-12-24 17:36:50 +01:00
Quentin Guidée
85c98cefe5 Fix conflicts 2019-12-24 17:33:32 +01:00
Quentin Guidée
be8085eaf8 Updated submodules 2019-12-24 17:23:55 +01:00
Quentin Guidée
d030e5959e Merge branch 'pr/104' into omega-dev 2019-12-24 17:00:06 +01:00
Quentin Guidée
0ffe82fd17 Update themes 2019-12-24 16:56:55 +01:00
Quentin
b392e80bfc Merge pull request #103 from zardam/omega-dev-dutch
Disable "External" in Dutch exam mode
2019-12-24 16:28:06 +01:00
M4x1m3
dd16c9336c Merge branch 'omega-dev' of https://github.com/Omega-Numworks/Omega into omega-dev 2019-12-24 13:47:21 +01:00
Damien Nicolet
26dcc7c546 Disable "External" in Dutch exam mode 2019-12-24 13:28:13 +01:00
Quentin Guidée
eff2ba92a4 Ignore MacOS files 2019-12-24 10:57:56 +01:00
redgl0w
9a813b8dfb Update events.h 2019-12-24 09:23:28 +01:00
redgl0w
3924121008 Update layout_events.h 2019-12-24 09:22:57 +01:00
redgl0w
3e91ba0f80 Update layout_events.h 2019-12-24 09:22:27 +01:00
redgl0w
f838d31ec1 Update events_modifier.cpp 2019-12-24 09:21:14 +01:00
redgl0w
bb83ec9b76 Update text_area.cpp 2019-12-24 09:20:33 +01:00
redgl0w
a680bb5aa2 Update layout_field.cpp 2019-12-24 09:19:12 +01:00
Quentin Guidée
004551d6b7 [EXPERIMENTAL] Upstream merged with Omega 2019-12-24 01:20:28 +01:00
Quentin Guidée
a159d80b1c Resolved conflicts 2019-12-24 01:07:22 +01:00
Émilie Feral
588c05f6b4 [ion] Reset: Add memory barriers before/after calling for a core reset: 2019-12-23 11:52:00 +01:00
Émilie Feral
9fca8e8b8b [ion] Reset: factorize cache disabling 2019-12-23 11:52:00 +01:00
Émilie Feral
7b7447b110 [ion] N0110 cache: clean isb/dsb calls 2019-12-23 11:52:00 +01:00
Émilie Feral
934e2c8aeb [poincare] Change name IntegerApproximationIfPossible --> PositiveIntegerApproximationIfPossible 2019-12-23 09:26:18 +01:00
Émilie Feral
07ecc119ab [poincare] Fix gcd and lcm approximations 2019-12-23 09:26:18 +01:00
Émilie Feral
c2f86e0806 [poincare] Add tests on lcm and gcd approximations 2019-12-23 09:26:18 +01:00
M4x1m3
53c7dfee8a [build] added print-*, made it work 2019-12-22 17:13:28 +01:00
M4x1m3
45d7aee713 [build] Icon theming! 2019-12-22 14:01:34 +01:00
redgl0w
eb28aabd75 Removed experiment 2019-12-22 11:18:52 +01:00
redgl0w
c903e674d3 Remove %
Removed % and put again the remove glyph
2019-12-22 11:14:56 +01:00
Quentin
ce621f0a1b Merge pull request #99 from zardam/omega-extapp
External application, API v2
2019-12-22 11:06:01 +01:00
Quentin
9c1698b233 Merge pull request #100 from M4xi1m3/omega-dev
Various improvements to build system
2019-12-22 11:05:33 +01:00
M4x1m3
d53676068b Added target run for simulator 2019-12-21 15:20:35 +01:00
M4x1m3
e6e583d967 Added OMEGA_THEME (#33). Added cleanall target 2019-12-21 15:08:24 +01:00
Émilie Feral
053fb935e3 [apps] Change color of LED in power on self test: blue is too easily
confused with white
2019-12-20 14:04:56 +01:00
Léa Saviot
4e96a11a4c [escher/responder] Clean commonAncestor method 2019-12-20 11:49:30 +01:00
Léa Saviot
0412a45cea [escher/responder] Inline some methods 2019-12-20 11:49:30 +01:00
Romain Goyet
5b00192b67 [ion/device] Remove ad-hoc compiler optimizations
Since we hand-specify which regs/regs.h functions shoudl be inlined, we
don't need to depend on specific compiler optimization levels.
2019-12-20 09:41:43 +01:00
Romain Goyet
d0660b6543 [ion/device] Force inlining compile-time bit ranges
Most of the time register operations can be optimized to a single
assembly instruction. That being said, aggressive -Os optimization can
lead the compiler to think that factorizing calls to setBitRange is a
good idea.

But we really want register operations to be inlined (and therefore
optimized as a single instruction), so we enforce inlining setBitRange
and REGS_FIELD macros.
2019-12-20 09:41:43 +01:00
Romain Goyet
ae8c111da5 [ion] Prevent duplicating SFLAGS
Using $(sort) in the Makefile has the side effect of removing duplicates
2019-12-20 09:41:43 +01:00
Romain Goyet
2c7a26103b [ci] Use a recent ARM GCC toolchain 2019-12-19 21:46:21 -05:00
Damien Nicolet
fe11d6e354 Block external files in exam mode 2019-12-19 20:17:16 +01:00
Émilie Feral
e13425d231 [apps] Add comment about LED color in Dutch exam mode 2019-12-19 15:52:45 +01:00
Émilie Feral
0254266803 [ion] ExamMode: add comment 2019-12-19 15:52:45 +01:00
Émilie Feral
3454265d7e [ion] ExamMode: change firstOneBitInByte name to
numberOfBitsAfterLeadingZeroes and add comment
2019-12-19 15:52:45 +01:00
Émilie Feral
73673384ae [ion] Avoid unclear, over-optimized computation in modulo 3 2019-12-19 15:52:45 +01:00
Émilie Feral
902cc64d32 [apps] GlobalPreferences: add an assertion to ensure the the fetched
exam mode can be casted in GlobalPreferences::ExamMode
2019-12-19 15:52:45 +01:00
Émilie Feral
425f0cb459 [apps] GlobalPreferences: remove useless assertion 2019-12-19 15:52:45 +01:00
Émilie Feral
96c63bd4a5 [apps][ion] Yellow LED is equivalent to Dutch exam mode, do not update
the LED color (with plugging/charging events) if the displayed color was Red or Yellow
2019-12-19 15:52:45 +01:00
Émilie Feral
01ab6b5aeb [build] Fix test.elf build 2019-12-19 15:52:45 +01:00
Émilie Feral
7d8bd45047 [build] Fix target two_binaries 2019-12-19 15:52:45 +01:00
Émilie Feral
9d154e4e97 [ion] Exam mode: add assertion 2019-12-19 15:52:45 +01:00
Émilie Feral
2ccdc2d0dc [apps] Fix messages regarding Dutch exam mode in non-English languages 2019-12-19 15:52:45 +01:00
Émilie Feral
2fc8799fee [ion] Exam mode on device: Fix FetchExamMode and IncrementExamMode 2019-12-19 15:52:45 +01:00
Émilie Feral
f5e7c016e8 [apps] GlobalPreferences: avoid multiple calls to examMode() 2019-12-19 15:52:45 +01:00
Émilie Feral
7fc730597c [apps] Fix exam mode messages 2019-12-19 15:52:45 +01:00
Émilie Feral
8c6a2836de [settings] Fix row initialization in sub menus 2019-12-19 15:52:45 +01:00
Émilie Feral
a3774fb510 [settings] Exam mode: reactivate the current exam mode (stick to Dutch
exam mode if it is already on)
2019-12-19 15:52:45 +01:00
Émilie Feral
de34c0b8db [apps] Change pop-up message for Dutch exam mode 2019-12-19 15:52:45 +01:00
Émilie Feral
6ecfe9c5db [apps] Two exam modes in settings: Standard & Dutch 2019-12-19 15:52:45 +01:00
Émilie Feral
6cd98a3a48 [apps] AppsContainer::activateExamMode can make the LED blink in orange
or red according to the chosen exam mode
2019-12-19 15:52:45 +01:00
Émilie Feral
49d2a248da [settings] Fix messages for Dutch exam mode 2019-12-19 15:52:45 +01:00
Émilie Feral
5491dee5ce [calculation][solver] Do not display exact solutions in Dutch exam mode 2019-12-19 15:52:45 +01:00
Émilie Feral
da735b93a4 [apps] GlobalPreferences: change exam mode API 2019-12-19 15:52:45 +01:00
Émilie Feral
f4de842a86 [ion] Change exam mode to have 3 states (off, standard, Dutch) 2019-12-19 15:52:45 +01:00
Émilie Feral
82fb00689e [apps/settings] Message: add messages to activate Dutch exam mode 2019-12-19 15:52:45 +01:00
Émilie Feral
510151c7db [apps/home] Prevent from entering Python application in exam mode 2019-12-19 15:52:45 +01:00
Émilie Feral
6a7ca32630 [apps/home] Add messages: ForbidenAppInExamMode 2019-12-19 15:52:45 +01:00
Léa Saviot
b155af0c0d [ion/external_flash] Finer flash sectors
Instead of 128 sectors of 64K, there are now 8 sectors of 4K, 1 of 32K
and 127 of 64K. This makes a more finely erasable flash, which is needed
for the exam mode.
2019-12-19 14:47:25 +01:00
Damien Nicolet
8583ddafca External application, API v2 2019-12-19 00:31:23 +01:00
Romain Goyet
273834ee84 [ion/cache] Improve cache cleaning
- Avoid fetching CCSIDR twice
 - Use for loop instead of do/while
 - Only compute the target register once
 - Avoid an useless nop
2019-12-16 10:22:47 +01:00
Romain Goyet
67302a90c7 [ion/cache] Follow CMSIS' order 2019-12-16 10:22:47 +01:00
Romain Goyet
d25346d82f [ion/cache] Use DCSW to reduce code duplication 2019-12-16 10:22:47 +01:00
Romain Goyet
34e6141bdb [ion/regs] Avoid code duplication 2019-12-16 10:22:47 +01:00
Quentin
d951920b2c Merge pull request #97 from M4xi1m3/omega-dev
[build] Fixed binpack.
2019-12-15 16:23:26 +01:00
M4x1m3
8ffd812e41 [build] Fixed binpack. 2019-12-15 16:16:39 +01:00
Quentin
ada383f003 Merge pull request #96 from M4xi1m3/omega-dev
Fixed 2.4GB internal.bin
2019-12-15 16:07:27 +01:00
M4x1m3
c66aeba14e [build] Excluded .exam_mode_buffer from internal bin. 2019-12-15 15:43:02 +01:00
Quentin Guidée
03584eda4d Fixed an compilation issue 2019-12-15 14:23:37 +01:00
Quentin Guidée
6a55305d52 Merge remote-tracking branch 'upstream/master' into omega-dev 2019-12-15 14:18:36 +01:00
Quentin Guidée
55f59ea7c5 Merge branch 'zardam-omega-extapp' into omega-dev 2019-12-15 13:31:47 +01:00
Quentin Guidée
9e6029e52f Merge branch 'omega-extapp' of https://github.com/zardam/epsilon into zardam-omega-extapp 2019-12-15 13:19:08 +01:00
Quentin Guidée
139679d9d2 Merge branch 'omega-hotfix' into omega-dev 2019-12-15 13:02:53 +01:00
Quentin Guidée
89c0749add [1.17.2] Fixed color popup exam mode 2019-12-15 13:02:24 +01:00
Quentin Guidée
120c5ba81d Merge branch 'omega-hotfix' into omega-master 2019-12-15 13:01:35 +01:00
Quentin Guidée
c685f39e40 Fixed: popup exam mode color 2019-12-15 13:01:05 +01:00
Quentin Guidée
56960f3944 Merge branch 'M4xi1m3-omega-dev' into omega-dev 2019-12-15 12:41:41 +01:00
Quentin Guidée
d424f7801e Merge branch 'omega-dev' of https://github.com/M4xi1m3/Omega into M4xi1m3-omega-dev 2019-12-15 12:36:47 +01:00
M4x1m3
e347dd5616 [preferences/exam] Allowed reactivation of exam mode
Settings are not modifiable when reactiving exam mode.
Decided to do it like that for consistency with the TI-Nspire CAS models.
Should be ok with exam mode specs (at least for france).
2019-12-15 10:32:43 +01:00
M4x1m3
ef8cd53cec [apps/title bar] Added indicator for symbolic calculation in exam mode. 2019-12-15 09:26:07 +01:00
M4x1m3
6499d77283 Merge branch 'omega-dev' of https://github.com/M4xi1m3/Omega into omega-dev 2019-12-15 08:58:18 +01:00
M4x1m3
3b038617db Merge branch 'omega-dev' of https://github.com/Omega-Numworks/Omega into omega-dev 2019-12-15 08:57:49 +01:00
Quentin Guidée
2b20b2d19c Merge branch 'omega-dev' of https://github.com/M4xi1m3/Omega into M4xi1m3-omega-dev 2019-12-14 20:44:32 +01:00
M4x1m3
5ae425f104 [apps/settings] Fixed compilation error
Co-Authored-By: Quentin <quentin.guidee@gmail.com>
2019-12-14 15:51:12 +01:00
Léa Saviot
6762bb05af [ion/cache] Add missing memory barrier
__asm volatile("nop") creates a memory barrier that prevents a crash on
the flasher.
Scenario: On the n0110, build flasher.bin, flash it at 0x20030000, build
bench.bin, flash it using the flasher at 0x20008000 -> the flasher cannot
make the device jump to the bench and crashes in the method
Ion::Device::Reset::Jump, inside Ion::Device::Cache::disableDCache().
2019-12-13 10:33:48 +01:00
Damien Nicolet
472929c028 External API for KhiCAS 2019-12-13 01:02:14 +01:00
Damien Nicolet
2700098c08 External application launcher app 2019-12-13 01:02:14 +01:00
Damien Nicolet
f763563834 Memory optimisation 2019-12-13 01:02:14 +01:00
Émilie Feral
e5bb8f4b21 [ion] Add TODOs 2019-12-12 17:30:42 +01:00
Émilie Feral
21756a5f4a [ion] Make name consistent 2019-12-12 17:30:42 +01:00
Émilie Feral
ec4e3eca92 [ion] Linker scripts: build only 1 binary for n0100 and 2 for n0110 and
ensure to fill the sector dedicated to the exam mode with 1
2019-12-12 17:30:42 +01:00
Léa Saviot
88d52c6e9c [apps/apps_container] Fix screen noise before the logo on n0100
Push a white screen before fetching the examm mode, as this fetch takes
some time and the screen noise becomes visible on a n0100 when
downloading a new software.
2019-12-12 15:45:33 +01:00
Émilie Feral
070d362f15 [python] Improve comment 2019-12-12 14:16:13 +01:00
Quentin Guidée
17432be1d8 Fixed conflicts 2019-12-11 14:27:31 +01:00
Léa Saviot
1b7f9cf7b4 [apps/on_boarding] Fix LED clash between on boarding and exam mode 2019-12-11 13:51:38 +01:00
Léa Saviot
9f592a0bc4 [ion/n0110] Persist exam mode through reset 2019-12-11 13:51:38 +01:00
Léa Saviot
762f67d996 [ion/device] Flash driver handles Internal and external flash 2019-12-11 13:51:38 +01:00
Léa Saviot
ebc5843795 [apps/ion/exam_mode] Store the exam mode activation in the flash
This way, it is not cleared by a reset
2019-12-11 13:51:38 +01:00
Émilie Feral
e550005e43 [settings] Enable exam mode reactivation 2019-12-11 13:51:38 +01:00
M4x1m3
ca4de2bf38 [apps/settings] Exam mode settings not editable while in exam mode. 2019-12-10 22:03:01 +01:00
Quentin Guidée
9556dced21 Merge branch 'M4xi1m3-omega-dev' into omega-dev 2019-12-10 20:21:35 +01:00
Quentin Guidée
70edf4420c base.fr.i18n fixed 2019-12-10 20:20:59 +01:00
M4x1m3
df6ba6e70b Merge branch 'omega-dev' into omega-dev 2019-12-09 22:48:58 +01:00
M4x1m3
896d14b9c8 [settings] Translated symbolic calc. 2019-12-09 22:39:16 +01:00
M4x1m3
01bd446d0b [settings] Updated messages trees for others prompts. 2019-12-09 22:36:20 +01:00
M4x1m3
b31d11cd7a [apps/calc] Checks for exam symbolic setting. 2019-12-09 22:34:53 +01:00
M4x1m3
db2807c57e [settings] Added symbolic calculation in exam mode. 2019-12-09 22:28:22 +01:00
M4x1m3
f9fb3a963e [ion/storage] Reorganised for use in a future workshop-like. 2019-12-09 20:42:52 +01:00
Émilie Feral
79ea22bc64 [ion] N0110 board: fix MPU configuration on FMC memory bank 2019-12-09 15:52:38 +01:00
Quentin Guidée
70a2100460 Merge branch 'RedGl0w-KeyBrightness' into omega-dev 2019-12-08 22:13:00 +01:00
Quentin Guidée
f7388eddb7 Merge branch 'KeyBrightness' of https://github.com/RedGl0w/Epsilon-Omega into RedGl0w-KeyBrightness 2019-12-08 22:01:20 +01:00
Quentin Guidée
408cc3e0de Merge branch 'MixedMatched-omega-dev' into omega-dev 2019-12-08 21:52:47 +01:00
Quentin Guidée
729a8a9d84 Merge branch 'omega-dev' of https://github.com/MixedMatched/Omega into MixedMatched-omega-dev 2019-12-08 21:48:15 +01:00
Quentin Guidée
9055edd620 [1.17.1] Fixed an issue with the multiplication symbol 2019-12-08 21:41:51 +01:00
Quentin Guidée
a001f15e1b Merge branch 'omega-hotfix' into omega-dev 2019-12-08 21:41:11 +01:00
Quentin Guidée
1fe1943fcf [1.17.1] Fixed an issue with the multiplication symbol 2019-12-08 21:40:11 +01:00
Danny Simmons
13fe95bb98 [apps/settings] Remove symbol_controller and references to it 2019-12-08 15:38:10 -05:00
Danny Simmons
b332d183fc [apps/settings] Modify preferences_controller to add symbols 2019-12-08 15:37:17 -05:00
Danny Simmons
caf04ad635 [poincare/preferences] correct some preferences references 2019-12-08 15:35:56 -05:00
Danny Simmons
890d6a5c3b [apps/settings] Fix the I18n refrences for English+Spanish 2019-12-08 15:34:30 -05:00
RedGl0w
1442e6977d Simplified code 2019-12-08 18:18:28 +01:00
Quentin Guidée
72666e927d Updated themes submodule (dark mode) 2019-12-08 16:23:36 +01:00
Quentin Guidée
e1c1b47297 Added themes submodule 2019-12-08 15:40:12 +01:00
RedGl0w
f6aab242a2 Corrected settings update 2019-12-08 11:09:57 +01:00
RedGl0w
d3215a5e30 Corrected shift 2019-12-07 12:53:21 +01:00
RedGl0w
094dff8518 https://github.com/Omega-Numworks/Omega/pull/81\#issuecomment-561861710 2019-12-07 12:49:58 +01:00
Quentin Guidée
40beb87516 Merge branch 'omega-hotfix' into omega-dev 2019-12-07 11:02:34 +01:00
redgl0w
8d3e1c2154 Added and corrected https://github.com/Omega-Numworks/Omega/pull/80 2019-12-06 20:30:55 +01:00
redgl0w
2568a852e7 Changed settings reloading 2019-12-06 20:21:50 +01:00
redgl0w
5cd3fa92c3 Corrected last commit 2019-12-06 19:48:51 +01:00
redgl0w
26ce12f6d2 Applied and modified d50bd08444\#diff-4f54cda3940834a07cd7f83ea12ebd85 2019-12-06 19:34:36 +01:00
Quentin Guidée
f24f7b0603 Merge remote-tracking branch 'upstream/master' into omega-dev 2019-12-06 19:34:28 +01:00
Quentin Guidée
bb5a18fede Merge branch 'omega-hotfix' into omega-dev 2019-12-06 19:32:22 +01:00
Quentin Guidée
e9b5b13cfe Public -> dev 2019-12-06 19:28:05 +01:00
Quentin Guidée
16df0f268b Merge branch 'omega-hotfix' into omega-dev 2019-12-06 19:27:17 +01:00
Léa Saviot
53b8a6845e [github/workflows] Add beta build tests 2019-12-06 15:22:00 +01:00
Léa Saviot
4bc99cc530 [apps/Makefile] Fix update prompt build
make -j8 output/release/device/n0110/epsilon.onboarding.update.two_binaries
made a compilation error
2019-12-06 15:22:00 +01:00
Léa Saviot
dbea83497b [apps/on_boarding] If POST are OK, the led is white
Green is used to indicate end-of-charge, so we put the POST led in white
so there is no confusion
2019-12-06 11:49:16 +01:00
Quentin Guidée
6107f54837 Merge branch '0b101-DisplayMPVersion' into omega-dev 2019-12-06 09:27:14 +01:00
Quentin Guidée
66ad982c39 Added: MicroPython version in the settings 2019-12-06 09:18:57 +01:00
Quentin Guidée
986a024e13 [1.18.0] Increment Omega version 2019-12-06 08:35:46 +01:00
Émilie Feral
49aa58446b [python] modkandinsky: fill_rect and draw_string calls might take some
time. As "micropython_port_vm_hook_loop" is not called while we are
executing module code, we add an extra check for user interruption in
module functions.
2019-12-04 11:27:32 +01:00
Émilie Feral
0db66f1784 [python] Turtle: add TODO 2019-12-04 11:27:32 +01:00
Émilie Feral
59b6dbd74e [python] micropython_port_interruptible_msleep should always call micropython_port_interrupt_if_needed even if the delay is small 2019-12-04 11:27:32 +01:00
Émilie Feral
b36f9416b4 [hardware_test] Keyboard test: check only a subset of keys 2019-12-04 11:19:23 +01:00
Émilie Feral
a515160470 [poincare] NAryExpressionNode: fix sortChildrenInPlace to put
expressions involving matrices as last children
2019-12-02 17:08:53 +01:00
Adrien Bertrand
de179f0af6 Update apps/settings/base.fr.i18n
Co-Authored-By: 0b101 <0b101@users.noreply.github.com>
2019-03-31 09:08:57 -05:00
David Meenan
aed18445db Display MicroPython version in settings 2019-03-31 09:03:01 -05:00
2100 changed files with 99324 additions and 19233 deletions

View File

@@ -1,14 +1,27 @@
---
name: Bug report
about: Omega is not working like it should? Let us know!
about: Upsilon is not working like it should? Let us know!
title: ''
labels: Triage
labels: 'Status: Triage, Type: Bug'
assignees: ''
---
#### Describe the bug
**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
#### Environment
- Omega Version: { go to settings > about > Omega Version and type version here}
**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):**
- Upsilon Version: [go to settings > about > Upsilon Version and type the version here]

View File

@@ -1,10 +1,17 @@
---
name: Feature request
about: Suggest an idea for an improvement of Omega
about: Suggest an idea for Upsilon
title: ''
labels: Triage
labels: 'Status: Triage, Type: Feature'
assignees: ''
---
#### What I want to see in the next version of Omega
**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.

View File

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

View File

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

12
.github/workflows/ci-docker.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
name: Docker Image CI
on: [pull_request, push]
jobs:
docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: true
- name: Build the Docker image
run: docker build . --file docker/Dockerfile --tag omega:$(date +%s)

View File

@@ -1,106 +1,199 @@
name: Continuous integration
on: [pull_request, push]
#on: [pull_request, push]
on:
push:
pull_request:
workflow_dispatch:
inputs:
triggerIos:
description: 'Run iOS tests'
required: true
default: 'no'
triggerMacos:
description: 'Run macOS tests'
required: true
default: 'no'
trigger3DS:
description: 'Run 3DS tests'
required: true
default: 'no'
jobs:
build-simulator-android:
nintendo_3ds:
if: github.event.inputs.trigger3DS == 'yes'
runs-on: ubuntu-latest
steps:
- run: wget https://github.com/devkitPro/pacman/releases/download/v1.0.2/devkitpro-pacman.amd64.deb -O /tmp/devkitpro-pacman.deb
- run: yes | sudo dpkg -i /tmp/devkitpro-pacman.deb
- run: yes | sudo dkp-pacman -Syu --needed devkitARM 3dstools libctru
- run: echo ::set-env name=DEVKITPRO::/opt/devkitpro
- run: echo ::set-env name=DEVKITARM::/opt/devkitpro/devkitARM
- run: echo ::set-env name=PATH::$DEVKITPRO/tools/bin:$DEVKITARM/bin:$PATH
- uses: actions/checkout@v1
with:
submodules: true
- run: make -j2 PLATFORM=simulator TARGET=3ds
- run: make -j2 PLATFORM=simulator TARGET=3ds epsilon.cia
- uses: actions/upload-artifact@master
with:
name: epsilon-3ds.3dsx
path: output/release/simulator/3ds/epsilon.3dsx
- uses: actions/upload-artifact@master
with:
name: epsilon-3ds.cia
path: output/release/simulator/3ds/epsilon.cia
android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- run: make -j2 PLATFORM=simulator TARGET=android
- uses: actions/upload-artifact@master
with:
name: epsilon-simulator-android.apk
path: output/release/simulator/android/app/outputs/apk/release/android-release-unsigned.apk
build-device-n0100:
name: epsilon-android.apk
path: output/release/simulator/android/epsilon.apk
n0100:
runs-on: ubuntu-latest
steps:
- run: sudo apt-get install binutils-arm-none-eabi build-essential gcc-arm-none-eabi imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
- uses: actions/checkout@v1
- run: make -j2 MODEL=n0100 epsilon.dfu
- run: make -j2 MODEL=n0100 epsilon.onboarding.dfu
- run: make -j2 MODEL=n0100 epsilon.onboarding.update.dfu
- run: make -j2 MODEL=n0100 flasher.light.dfu
- run: make -j2 MODEL=n0100 flasher.verbose.dfu
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
- uses: numworks/setup-arm-toolchain@2020-q2
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- run: mkdir final-output
- run: make -j2 MODEL=n0100 EPSILON_I18N=en output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.en.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 EPSILON_I18N=fr output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.fr.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 EPSILON_I18N=nl output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.nl.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 EPSILON_I18N=pt output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.pt.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 EPSILON_I18N=it output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.it.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 EPSILON_I18N=de output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.de.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 EPSILON_I18N=es output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.es.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 EPSILON_I18N=hu output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.hu.bin
- run: rm output/release/device/n0100/apps/i18n.o output/release/device/n0100/apps/i18n.cpp
- run: make -j2 MODEL=n0100 output/release/device/n0100/flasher.light.bin
- run: mv output/release/device/n0100/flasher.light.bin final-output/flasher.light.bin
- run: find final-output/ -type f -exec bash -c "shasum -a 256 -b {} > {}.sha256" \;
- run: tar cvfz binpack-n0100.tgz final-output/*
- uses: actions/upload-artifact@master
with:
name: epsilon-device-n0100.dfu
path: output/release/device/n0100/epsilon.dfu
- run: make -j2 MODEL=n0100 test.elf
build-device-n0110:
name: epsilon-binpack-n0100.tgz
path: binpack-n0100.tgz
n0110:
runs-on: ubuntu-latest
steps:
- run: sudo apt-get install binutils-arm-none-eabi build-essential gcc-arm-none-eabi imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
- uses: actions/checkout@v1
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
- uses: numworks/setup-arm-toolchain@2020-q2
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- run: make -j2 epsilon.dfu
- run: make -j2 epsilon.onboarding.dfu
- run: make -j2 epsilon.onboarding.update.dfu
- run: make -j2 epsilon.onboarding.beta.dfu
- run: make -j2 flasher.light.dfu
- run: make -j2 flasher.verbose.dfu
- run: make -j2 bench.ram.dfu
- run: make -j2 bench.flash.dfu
- run: make -j2 binpack
- run: cp output/release/device/n0110/binpack-n0110-`git rev-parse HEAD | head -c 7`.tgz output/release/device/n0110/binpack-n0110.tgz
- uses: actions/upload-artifact@master
with:
name: epsilon-device-n0110.dfu
path: output/release/device/n0110/epsilon.dfu
- run: make -j2 test.elf
build-simulator-windows:
name: epsilon-binpack-n0110.tgz
path: output/release/device/n0110/binpack-n0110.tgz
windows:
runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
steps:
- uses: numworks/setup-msys2@v1
- uses: actions/checkout@v1
- run: msys2do 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: msys2do make -j2 PLATFORM=simulator
- uses: msys2/setup-msys2@v2
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- run: pacman -S --noconfirm mingw-w64-x86_64-gcc mingw-w64-x86_64-freetype mingw-w64-x86_64-pkg-config make mingw-w64-x86_64-python3 mingw-w64-x86_64-libjpeg-turbo mingw-w64-x86_64-libpng
- 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-simulator-windows.exe
name: epsilon-windows.exe
path: output/release/simulator/windows/epsilon.exe
- run: msys2do make -j2 PLATFORM=simulator test.headless.exe
- run: output\release\simulator\windows\test.headless.exe
build-simulator-web:
web:
runs-on: ubuntu-latest
steps:
- uses: numworks/setup-emscripten@v1
with:
sdk: latest-fastcomp
- uses: actions/checkout@v1
sdk: 1.40.1-fastcomp
- uses: actions/checkout@v2
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-simulator-web.zip
path: output/release/simulator/web/simulator.zip
- run: make -j2 PLATFORM=simulator TARGET=web test.headless.js
- run: node output/release/simulator/web/test.headless.js
build-simulator-linux:
name: epsilon-web.zip
path: output/release/simulator/web/epsilon.zip
linux:
runs-on: ubuntu-latest
steps:
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
- uses: actions/checkout@v1
- uses: actions/checkout@v2
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-simulator-linux.bin
name: epsilon-linux.bin
path: output/release/simulator/linux/epsilon.bin
- run: make -j2 PLATFORM=simulator test.headless.bin
- run: output/release/simulator/linux/test.headless.bin
build-simulator-macos:
macos:
if: github.event.inputs.triggerMacos == 'yes'
runs-on: macOS-latest
steps:
- run: brew install numworks/tap/epsilon-sdk
- uses: actions/checkout@v1
- uses: actions/checkout@v2
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-simulator-macos.zip
path: output/release/simulator/macos/app/Payload
- run: make -j2 PLATFORM=simulator ARCH=x86_64 test.headless.bin
- run: output/release/simulator/macos/x86_64/test.headless.bin
build-simulator-ios:
name: epsilon-macos.zip
path: output/release/simulator/macos/epsilon.app
ios:
if: github.event.inputs.triggerIos == 'yes'
runs-on: macOS-latest
steps:
- run: brew install numworks/tap/epsilon-sdk
- uses: actions/checkout@v1
- run: make -j2 PLATFORM=simulator TARGET=ios GOOGLE_ANALYTICS=0
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0
- run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0 APPLE_PLATFORM=ios-simulator
- uses: actions/upload-artifact@master
with:
name: epsilon-simulator-ios.ipa
path: output/release/simulator/ios/app/epsilon.ipa
name: epsilon-ios.ipa
path: output/release/simulator/ios/epsilon.ipa
env:
ACCEPT_OFFICIAL_TOS: 1

40
.github/workflows/metric-workflow.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
name: Metrics
on: [pull_request_target]
jobs:
binary-size:
runs-on: ubuntu-latest
steps:
- name: Install dependencies
run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
- name: Install ARM toolchain
uses: numworks/setup-arm-toolchain@2020-q2
- name: Checkout PR base
uses: actions/checkout@v2
with:
submodules: recursive
ref: ${{ github.event.pull_request.base.sha }}
path: base
- name: Build base
run: make -j2 -C base epsilon.elf
- name: Checkout PR head
uses: actions/checkout@v2
with:
submodules: recursive
ref: ${{ github.event.pull_request.head.sha }}
path: head
- name: Build head
run: make -j2 -C head epsilon.elf
- name: Retrieve binary size analysis
id: binary_size
run: echo "::set-output name=table::$(python3 head/build/metrics/binary_size.py base/output/release/device/n0110/epsilon.elf head/output/release/device/n0110/epsilon.elf --labels Base Head --sections .text .rodata .bss .data --custom 'Total (RAM)' .data .bss --custom 'Total (ROM)' .text .rodata .data --escape)"
- name: Add comment
uses: actions/github-script@v3.0.0
with:
script: |
await github.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body: `${{ steps.binary_size.outputs.table }}`,
});

6
.gitignore vendored
View File

@@ -1,4 +1,10 @@
/output/
/build/artifacts/
build/device/**/*.pyc
epsilon.elf
epsilon.map
.vscode
.DS_Store
.gradle
.idea/
.vs

View File

@@ -1,25 +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

8
.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
url = https://github.com/Lauryy06/Upsilon-RPN.git
[submodule "apps/atomic"]
path = apps/atomic
url = https://github.com/Lauryy06/atomic

76
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,76 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at getomega.pro@gmail.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

118
Makefile
View File

@@ -1,40 +1,62 @@
include build/config.mak
# Disable default Make rules
.SUFFIXES:
object_for = $(addprefix $(BUILD_DIR)/,$(addsuffix .o,$(basename $(1))))
# Define the default recipe
default:
# Define a standard rule helper
# If passed a last parameter value of with_local_version, we also define an
# extra rule that can build source files within the $(BUILD_DIR). This is useful
# for rules that can be applied for intermediate objects (for example, when
# going .png -> .cpp -> .o).
include build/config.mak
include build/pimp.mak
include build/defaults.mak
include build/platform.$(PLATFORM).mak
include build/toolchain.$(TOOLCHAIN).mak
include build/variants.mak
include build/helpers.mk
define rule_label
@ echo "$(shell printf "%-8s" $(strip $(1)))$(@:$(BUILD_DIR)/%=%)"
endef
define rule_for
ifeq ($(strip $(5)),with_local_version)
$(addprefix $$(BUILD_DIR)/,$(strip $(2))): $(addprefix $$(BUILD_DIR)/,$(strip $(3)))
@ echo "$(shell printf "%-8s" $(strip $(1)))$$(@:$$(BUILD_DIR)/%=%)"
$(Q) $(4)
ifeq (${MODEL}, n0100)
ifeq ($(filter reader,$(apps_list)),)
$(warning reader app included, removing it on n0100. )
EPSILON_APPS := $(filter-out reader,$(EPSILON_APPS))
endif
ifneq ($(words $(EPSILON_I18N)), 1)
$(warning Only use 1 language on n0100, defaulting to en. )
EPSILON_I18N := en
endif
ifeq ($(INCLUDE_ULAB), 1)
$(warning Removing uLab on n0100. )
INCLUDE_ULAB := 0
endif
endif
ifeq (${MODEL}, n0110)
apps_list = ${EPSILON_APPS}
else
apps_list = $(foreach i, ${EPSILON_APPS}, $(if $(filter external, $(i)),,$(i)))
endif
ifdef FORCE_EXTERNAL
apps_list = ${EPSILON_APPS}
endif
ifeq ($(INCLUDE_ULAB), 1)
SFLAGS += -DINCLUDE_ULAB
endif
ifdef HOME_DISPLAY_EXTERNALS
ifneq ($(filter external,$(apps_list)),)
SFLAGS += -DHOME_DISPLAY_EXTERNALS
else
$(warning HOME_DISPLAY_EXTERNALS is set but external isn't included, ignoring flag.)
endif
endif
$(addprefix $$(BUILD_DIR)/,$(strip $(2))): $(strip $(3)) | $$$$(@D)/.
@ echo "$(shell printf "%-8s" $(strip $(1)))$$(@:$$(BUILD_DIR)/%=%)"
$(Q) $(4)
endef
.PHONY: info
info:
@echo "EPSILON_VERSION = $(EPSILON_VERSION)"
@echo "EPSILON_APPS = $(EPSILON_APPS)"
@echo "EPSILON_I18N = $(EPSILON_I18N)"
@echo "THEME_NAME = $(THEME_NAME)"
@echo "THEME_REPO = $(THEME_REPO)"
@echo "BUILD_DIR = $(BUILD_DIR)"
@echo "PLATFORM" = $(PLATFORM)
@echo "DEBUG" = $(DEBUG)
@echo "EPSILON_GETOPT" = $(EPSILON_GETOPT)
@@ -65,6 +87,18 @@ help:
@echo " make PLATFORM=simulator TARGET=macos"
@echo " make PLATFORM=simulator TARGET=web"
@echo " make PLATFORM=simulator TARGET=windows"
@echo " make PLATFORM=simulator TARGET=3ds"
.PHONY: doc
doc:
@echo "DOXYGEN"
@mkdir -p output/doc/
$(Q) doxygen build/doc/Doxyfile
.PHONY: print-%
print-%:
@echo $* = $($*)
@echo $*\'s origin is $(origin $*)
# Since we're building out-of-tree, we need to make sure the output directories
# are created, otherwise the receipes will fail (e.g. gcc will fail to create
@@ -83,7 +117,9 @@ $(BUILD_DIR)%/.:
# Each sub-Makefile can either add sources to $(%_src) variables or define a
# new executable target. The $(%_src) variables list the sources that can be
# built and linked to executables being generated.
ifndef USE_LIBA
$(error platform.mak should define USE_LIBA)
endif
ifeq ($(USE_LIBA),0)
include liba/Makefile.bridge
else
@@ -102,7 +138,11 @@ include build/struct_layout/Makefile
include build/scenario/Makefile
include quiz/Makefile # Quiz needs to be included at the end
all_src = $(apps_all_src) $(escher_src) $(ion_all_src) $(kandinsky_src) $(liba_src) $(libaxx_src) $(poincare_src) $(python_src) $(epsilon_src) $(runner_src) $(ion_target_device_flasher_light_src) $(ion_target_device_flasher_verbose_src) $(ion_target_device_bench_src) $(tests_src)
all_src = $(apps_src) $(escher_src) $(ion_src) $(kandinsky_src) $(liba_src) $(libaxx_src) $(poincare_src) $(python_src) $(runner_src) $(ion_device_flasher_src) $(ion_device_bench_src) $(tests_src)
# Make palette.h a dep for every source-file.
# This ensures that the theming engine works correctly.
$(call object_for,$(all_src)): $(BUILD_DIR)/escher/palette.h $(BUILD_DIR)/apps/i18n.h
all_objs = $(call object_for,$(all_src))
.SECONDARY: $(all_objs)
@@ -116,8 +156,7 @@ all_objs = $(call object_for,$(all_src))
include build/targets.mak
# Fill in the default recipe
DEFAULT ?= $(BUILD_DIR)/epsilon.$(EXE)
default: $(DEFAULT)
default: $(firstword $(HANDY_TARGETS)).$(firstword $(HANDY_TARGETS_EXTENSIONS))
# Load standard build rules
include build/rules.mk
@@ -127,6 +166,11 @@ clean:
@echo "CLEAN"
$(Q) rm -rf $(BUILD_DIR)
.PHONY: cleanall
cleanall:
@echo "CLEANALL"
$(Q) rm -rf output
.PHONY: cowsay_%
cowsay_%:
@echo " -------"
@@ -141,3 +185,23 @@ cowsay_%:
.PHONY: clena
clena: cowsay_CLENA clean
.PHONY: compile
compile: output/$(BUILD_TYPE)/simulator/$(HOST)/epsilon.$(EXE)
.PHONY: cleanandcompile
cleanandcompile:
${MAKE} cleanall
${MAKE} compile
.PHONY: start
start:
@echo "INFO Starting output/$(BUILD_TYPE)/simulator/$(HOST)/epsilon.$(EXE)"
@$(Q) output/$(BUILD_TYPE)/simulator/$(HOST)/epsilon.$(EXE) -v
.PHONY: clean_run
clean_run: cleanandcompile
${MAKE} start
.PHONY: run
run: compile
${MAKE} start

183
README.fr.md Normal file
View File

@@ -0,0 +1,183 @@
<p align="center"><img src="https://github.com/Laporte12974/UpsilonDesign/blob/89a15953ae128aef8aa7d066dcaaf8d5c70f02a5/UPSILogo.png" /></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>
<a href="https://github.com/Lauryy06/Upsilon/issues"><img alt="Issues" src="https://img.shields.io/github/issues/Lauryy06/Upsilon.svg?labelColor=292929&logo=git&style=for-the-badge" /></a>
<br/>
<a href="https://discord.gg/Q9buEMduXG"><img alt="Discord" src="https://img.shields.io/discord/663420259851567114?color=blue&labelColor=292929&label=chat%20-%20discord&logo=discord&style=for-the-badge" /></a>
</p>
> Don't understand french ? speak english ? here's the [english README](./README.md) !
## À propos
Upsilon est un fork d'Omega, un fork d'Epsilon, l'OS de Numworks tournant sur les calculatrices du même nom, qui apporte beaucoup de fonctionnalités en plus, mais qui fut archivé et fermé pour des raisons légales après un changement de politique de Numworks. Upsilon est fait pour ceux qui aimeraient voir un futur pour les OS créées par les utilisateurs pour Numworks, même après l'arrèt du projet initial.
### Quelques fonctionnalités supplémentaires
- Un module python kandinsky amélioré
- Un support pour fonds d'écrans personnalisés
- Des applications externes
- Un thème Upsilon
- La surcharge des opérateurs en python
- Un tableau périodique légèrement amélioré
- L'utilisation possible du signe "=" dans les calculs
- *Ainsi que tout ce qui a été ajouté sur Omega, et bien plus...* [Changelogs complets d'Omega](https://github.com/Omega-Numworks/Omega/wiki/Changelog) | [Fonctionnalités principales d'Omega & captures d'écran](https://github.com/Omega-Numworks/Omega/wiki/Main-features).
## Installation
### Manuelle
*A l'heure actuelle, seule l'installation manuelle est possible.*
Tout d'abord, suivez **la première étape** [ici](https://www.numworks.com/resources/engineering/software/build/), puis :
<details>
<summary><b>Modèle n0100</b></summary>
(note : vous pouvez changer `EPSILON_I18N=fr` en `en`, `nl`, `pt`, `it`, `de`, `es` ou `hu`).
```bash
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout omega-master
make MODEL=n0100 clean
make MODEL=n0100 EPSILON_I18N=fr OMEGA_USERNAME="{Votre nom ici, 15 caractères max}" -j4
make MODEL=n0100 epsilon_flash
```
Important : N'oubliez pas l'argument `--recursive`, Upsilon a besoin de sous-modules.
Vous pouvez aussi changer le nombre de processus parallèles pendant la compilation en changeant la valeur suivant `-j`.
</details>
<details>
<summary><b>Modèle n0110</b></summary>
```bash
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout omega-master
make clean
make OMEGA_USERNAME="{Votre nom ici, 15 caractères max}" -j4
make epsilon_flash
```
Important : N'oubliez pas l'argument `--recursive`, Upsilon a besoin de sous-modules.
Vous pouvez aussi changer le nombre de processus parallèles pendant la compilation en changeant la valeur suivant `-j`.
</details>
<details>
<summary><b>Fichiers binaires</b></summary>
Ces fichiers peuvent être utilisés pour distribuer Upsilon (pour que tout le monde puisse le flasher via [Webdfu_Numworks](https://ti-planet.github.io/webdfu_numworks/)).
```bash
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout omega-master
make clean
make MODEL=n0100 OMEGA_USERNAME="" -j8
make MODEL=n0100 OMEGA_USERNAME="" binpack -j8
make OMEGA_USERNAME="" -j8
make OMEGA_USERNAME="" binpack -j8
```
Important : N'oubliez pas l'argument `--recursive`, Upsilon a besoin de sous-modules.
Vous pouvez aussi changer le nombre de processus parallèles pendant la compilation en changeant la valeur suivant `-j`.
</details>
<details>
<summary><b>Simulateur web</b></summary>
D'abord, installez emsdk :
```bash
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install latest-fastcomp
./emsdk activate latest-fastcomp
source emsdk_env.sh
```
Puis, compilez Upsilon :
```bash
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout omega-master
make clean
make PLATFORM=simulator TARGET=web OMEGA_USERNAME="{Votre nom ici, 15 caractères max}" -j4
```
Le simulateur se trouve dans `output/release/simulator/web/simulator.zip`
Important : N'oubliez pas l'argument `--recursive`, Upsilon a besoin de sous-modules.
Vous pouvez aussi changer le nombre de processus parallèles pendant la compilation en changeant la valeur suivant `-j`.
</details>
<details>
<summary><b>Simulateur 3DS</b></summary>
Vous aurez besoin de devkitPro et de devkitARM disponible dans votre `$PATH` (instructions [ici](https://devkitpro.org/wiki/Getting_Started) (en anglais))
```bash
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout --recursive upsilon-dev
make PLATFORM=simulator TARGET=3ds -j
```
Vous pouvez ensuite copier epsilon.3dsx sur une carte SD pour l'exécuter depuis le HBC ou utiliser 3dslink pour le lancer via le réseau :
```bash
3dslink output/release/simulator/3ds/epsilon.3dsx -a <ADRESSE IP 3DS>
```
</details>
Si vous avez besoin d'aide, n'hésitez pas à rejoindre notre serveur discord : https://discord.gg/Q9buEMduXG
<a href="https://discord.gg/Q9buEMduXG"><p align="center"><img alt="Omega Banner Discord" src="https://user-images.githubusercontent.com/12123721/86287349-54ef5800-bbe8-11ea-80c1-34eb1f93eebd.png" /></p></a>
---
## Liens utiles
* [Upsilon external (pour installer des applications supplémentaires et des fonds d'écran)](https://lauryy06.github.io/Upsilon-External/)
* [Documentation d'ulab](https://micropython-ulab.readthedocs.io/en/latest/)
## Contribution
Pour contribuer, merci de lire le [Wiki d'Omega](https://github.com/Omega-Numworks/Omega/wiki/Contributing), les mêmes règles s'appliquent ici.
## Les autres projets
Les anciens projets d'Omega, avant sa fermeture, qui ont été utilisés pour ce projet
* [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 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)
* [External Apps](https://github.com/Omega-Numworks/External-Apps)
## À propos d'Epsilon
Upsilon est un fork d'Omega, visant a continuer le projet des OS utilisateurs pour Numworks
Omega est un fork d'Epsilon, un système d'exploitation performant pour calculatrices graphiques. Il inclut huit applications pour les mathématiques de lycée et d'études supérieurs
Vous pouvez essayer Epsilon depuis votre navigateur sur le [simulateur en ligne](https://www.numworks.com/simulator/).
## Licence
NumWorks est une marque déposée de NumWorks SAS, 24 Rue Godot de Mauroy, 75009 Paris, France.
Nintendo est Nintendo 3DS sont des marques déposées de Nintendo of America Inc, 4600 150th Ave NE, Redmond, WA 98052, Etats-Unis.
NumWorks SAS et Nintendo of America Inc ne sont en aucun cas associés avec ce projet.
* NumWorks Epsilon est disponible sous [Lisense CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).
* Omega est disponible sous [Lisense CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).
* Upsilon est disponible sous [Lisense CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).

331
README.md
View File

@@ -1,86 +1,210 @@
<p align="center"><img src="https://github.com/Omega-Numworks/Omega-Design/blob/master/Omega-Banner.png" /></p>
<p align="center"><img src="https://github.com/Laporte12974/UpsilonDesign/blob/89a15953ae128aef8aa7d066dcaaf8d5c70f02a5/UPSILogo.png" /></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-lightgrey.svg?labelColor=292929&logo=creative%20commons&style=for-the-badge" /></a>
<a href="https://github.com/Omega-Numworks/Omega/issues"><img alt="Issues" src="https://img.shields.io/github/issues/Omega-Numworks/Omega.svg?labelColor=292929&logo=git&style=for-the-badge" /></a>
</br>
<a href="https://join.slack.com/t/omeganumworks/shared_invite/enQtODI0NjU5NDU2MDUwLTRkODc1NDgzNmJkMzNlZGEyYWU2YzNlOWY4NWZlZjk1ZTM0YzY0ZjJjYTgyYzYwNDA1ZWZiYmUyMjA2MGU0ZDM"><img alt="Slack" src="https://img.shields.io/badge/Chat-Slack-blue?labelColor=292929&logo=slack&style=for-the-badge" /></a>
<a href="https://gitlab.com/joachim2lefournis/Omega/pipelines"><img alt="Pipeline" src="https://img.shields.io/gitlab/pipeline/joachim2lefournis/Omega/omega-master?labelColor=292929&logo=gitlab&style=for-the-badge" /></a>
<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>
<a href="https://github.com/Lauryy06/Upsilon/issues"><img alt="Issues" src="https://img.shields.io/github/issues/Lauryy06/Upsilon.svg?labelColor=292929&logo=git&style=for-the-badge" /></a>
<br/>
<a href="https://discord.gg/Q9buEMduXG"><img alt="Discord" src="https://img.shields.io/discord/663420259851567114?color=blue&labelColor=292929&label=chat%20-%20discord&logo=discord&style=for-the-badge" /></a>
</p>
> Vous ne comprenez pas l'anglais ? Vous êtes francophone ? Regardez le [*LISEZ-MOI* français](./README.fr.md) !
## About
Omega is an extension to Numworks' Epsilon, the OS that runs on their calculator, which brings many features to it. Omega is for people who want to add features to the calculator, but cannot because they have been rejected by Numworks (and for reasons that are 100% understandable!). For example, there is no point in having a Dark Mode on the calculator, but it's fun, so we would add it into Omega!
Upsilon is a fork of Omega, an user-made OS that runs on the Numworks calculator, which brings many features to it, but was discontinued because of a policy change from Numworks. Upsilon is for the people who want to see a future for user-made OSes for Numworks, even after the closure and archiving of Omega.
## Some new features
- Adding symbolic calculation back into the calculator
- An app for RPN
- A periodic table app + all of the molar masses for the elements in the toolbox
- More steps for brightness (16 instead of 5)
- Different colors for the LED in exam mode
- 32 KB Python heap instead of 16 KB
The main new features are listed [here](https://github.com/Omega-Numworks/Omega/wiki/Main-features), and the complete changelog can be found [here](https://github.com/quentinguidee/Omega/wiki/Complete-changelog).
### Some new features
- Enhancements for the Kandinsky python module
- Support for wallpapers
- Exernal apps
- A custom theme
- Operator overload for python
- Improvements for the Periodic table application
- *And everything that has been added to Omega before its termination!* [See Omega's changelog here](https://github.com/Omega-Numworks/Omega/wiki/Changelog) | [Main Omega features + screenshots](https://github.com/Omega-Numworks/Omega/wiki/Main-features).
<br>
## Installation
First of all, follow **step 1** [here](https://www.numworks.com/resources/engineering/software/build/). Then:
### Manual
*As of today, only the manual installation is available. You can refer to this [website](https://www.numworks.com/resources/engineering/software/build/) for the first step if you get errors.*
### 1. Install SDK
<br>
<details>
<summary><b>1.1 Linux</b></summary>
<br>
<details>
<summary>Debian or Ubuntu</summary>
<br>
You just have to install dependencies by running these command with superuser privileges in a Terminal:
```bash
apt-get install build-essential git imagemagick libx11-dev libxext-dev libfreetype6-dev libpng-dev libjpeg-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
```
And there you can go to step 2!
<br>
</details>
<details>
<summary>Fedora</summary>
<br>
First install basics dev tools.
```bash
dnf install make automake gcc gcc-c++ kernel-devel
```
Then install required packages.
```bash
dnf install git ImageMagick libX11-devel libXext-devel freetype-devel libpng-devel libjpeg-devel pkg-config
```
Then, install GCC cross compiler for ARM.
```bash
dnf install arm-none-eabi-gcc-cs arm-none-eabi-gcc-cs-c++
```
<br>
</details>
<br>
</details>
<details>
<summary><b>1.2 Mac</b></summary>
<br>
It's recommended to use [Homebrew](https://brew.sh/). Once it's installed, just run:
```bash
brew install numworks/tap/epsilon-sdk
```
and it will install all dependencies.
<br>
And there you can go to step 2!
<br>
</details>
<details>
<summary><b>1.3 Windows</b></summary>
<br>
[Msys2](https://www.msys2.org/) environment is recommended to get most of the required tools on Windows easily. It's where you'll paste all the commands of this tutorial. Once it's installed, paste these commands into the Msys2 terminal.
```bash
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-freetype mingw-w64-x86_64-pkg-config mingw-w64-x86_64-libusb git make python
echo "export PATH=/mingw64/bin:$PATH" >> .bashrc
```
Next, you'll need to install the [GCC toolchain for ARM](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads). When prompted for an install location, choose `C:\msys64\home\User\gcc-arm\`. You'll then need to add this folder to your $PATH. Just enter:
```bash
echo "export PATH=$PATH:$HOME/gcc-arm/bin" >> .bashrc
```
Just restart and you can go to step 2!
</details>
<br>
### 2. Set up repo
Clone repo and use 'upsilon-dev' branch by pasting these two commands:
```bash
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout upsilon-dev
```
<br>
### 3. Choose the target
<details>
<summary><b>Model n0100</b></summary>
```
git clone --recursive https://github.com/Omega-Numworks/Omega.git
cd Omega
git checkout omega-master
(note: you can change the `EPSILON_I18N=en` flag to `fr`, `nl`, `pt`, `it`, `de`, `es` or `hu`).
```bash
make MODEL=n0100 clean
make MODEL=n0100 USERNAME="{Your name, max 15 characters}" -j4
make MODEL=n0100 epsilon_flash
make MODEL=n0100 EPSILON_I18N=en OMEGA_USERNAME="{Your name, max 15 characters}" -j4
```
Important: Don't forget the `--recursive` tag, because Omega relies on submodules.
Also, you can change the number of processes that run in parallel during the build by changing the value of the `-j` flag.
Now, run either:
```bash
make MODEL=n0100 epsilon_flash
```
to directly flash the calculator after pressing simultaneously `reset` and `6` buttons and pluging in.
<br>
or:
```bash
make MODEL=n0100 OMEGA_USERNAME="" binpack -j4
```
to make binpack wich you can flash to the caculator from [Ti-planet's webDFU](https://ti-planet.github.io/webdfu_numworks/n0100/). Binpacks are a great way to share a custom build of Upsilon to friends.
</details>
<details>
<summary><b>Model n0110</b></summary>
```
git clone --recursive https://github.com/Omega-Numworks/Omega.git
cd Omega
git checkout omega-master
```bash
make clean
make USERNAME="{Your name, max 15 characters}" -j4
make OMEGA_USERNAME="{Your name, max 15 characters}" -j4
```
Now, run either:
```bash
make epsilon_flash
```
to directly flash the calculator after pressing simultaneously `reset` and `6` buttons and pluging in.
Important: Don't forget the `--recursive` tag, because Omega relies on submodules.
Also, you can change the number of processes that run in parallel during the build by changing the value of the `-j` flag.
</details>
<br>
<details>
<summary><b>Bin files</b></summary>
These can be used to distribute Omega (so that it can be flashed by anyone with [Webdfu_Numworks](https://ti-planet.github.io/webdfu_numworks/)).
or:
```bash
make OMEGA_USERNAME="" binpack -j4
```
git clone --recursive https://github.com/Omega-Numworks/Omega.git
cd Omega
git checkout omega-master
make clean
make MODEL=n0100 USERNAME="" -j8
make MODEL=n0100 USERNAME="" binpack -j8
make USERNAME="" -j8
make USERNAME="" binpack -j8
```
to make binpack wich you can flash to the caculator from [Ti-planet's webDFU](https://ti-planet.github.io/webdfu_numworks/n0110/). Binpacks are a great way to share a custom build of Upsilon to friends.
Important: Don't forget the `--recursive` tag, because Omega relies on submodules.
Also, you can change the number of processes that run in parallel during the build by changing the value of the `-j` flag.
</details>
<details>
@@ -88,7 +212,7 @@ Also, you can change the number of processes that run in parallel during the bui
First, install emsdk :
```
```bash
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install latest-fastcomp
@@ -96,71 +220,84 @@ cd emsdk
source emsdk_env.sh
```
Then, compile Omega :
Then, compile Upsilon :
```
git clone --recursive https://github.com/Omega-Numworks/Omega.git
cd Omega
git checkout omega-master
```bash
make clean
make PLATFORM=simulator TARGET=web USERNAME="{Your name, max 15 characters}" -j4
make PLATFORM=simulator TARGET=web OMEGA_USERNAME="{Your name, max 15 characters}" -j4
```
The simulator is now in `output/release/simulator/web/simulator.zip`
Important: Don't forget the `--recursive` tag, because Omega relies on submodules.
Also, you can change the number of processes that run in parallel during the build by changing the value of the `-j` flag.
</details>
<details>
<summary><b>3DS Simulator</b></summary>
You need devkitPro and devkitARM installed and in your path (instructions [here](https://devkitpro.org/wiki/Getting_Started))
```bash
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout --recursive upsilon-dev
make PLATFORM=simulator TARGET=3ds -j
```
You can then put epsilon.3dsx on a SD card to run it from the HBC or use 3dslink to launch it over the network:
```bash
3dslink output/release/simulator/3ds/epsilon.3dsx -a <3DS' IP ADDRESS>
```
</details>
<br>
Important: Don't forget the `--recursive` tag, because Upsilon relies on submodules.
Also, you can change the number of processes that run in parallel during the build by changing the value of the `-j` flag.
Don't forget to put your pseudo instead of `{your pseudo, max 15 char}`. If you don't want one, just remove the `OMEGA_USERNAME=""` argument.
<br>
If you need help, you can join our Discord server here : https://discord.gg/NFvzdCBTQn
<a href="https://discord.gg/NFvzdCBTQn"><p align="center"><img alt="Omega Banner Discord" src="https://user-images.githubusercontent.com/12123721/86287349-54ef5800-bbe8-11ea-80c1-34eb1f93eebd.png" /></p></a>
---
## Useful links
* [Upsilon external (to install additional apps and wallpapers)](https://lauryy06.github.io/Upsilon-External/)
* [Ulab documentation](https://micropython-ulab.readthedocs.io/en/latest/)
## Contributing
To contribute, please refer to the [Wiki](https://github.com/Omega-Numworks/Omega/wiki/Contributing)
## Branches
* `omega-master` : stable releases
* `omega-dev` : beta releases
* `omega-hotfix` : developers only, branch to fix issues
To contribute, please refer to [Omega's Wiki](https://github.com/Omega-Numworks/Omega/wiki/Contributing), the same rules apply here.
## Related repositories
* [Omega CLI Installer](https://github.com/Omega-Numworks/Omega-CLI-Installer) `BETA`
* [Omega WEB Installer](https://github.com/Omega-Numworks/Omega-WEB-Installer) `BETA`
* [Omega RPN](https://github.com/Omega-Numworks/Omega-RPN)
* [Omega Atom](https://github.com/Omega-Numworks/Omega-Atom)
Here are the main links toward Omega's different websites and repositories, that have been used for the creation of Upsilon.
## Omega License
* [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 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)
* [External Apps](https://github.com/Omega-Numworks/External-Apps)
Omega is released under a [CC BY-NC-SA License](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).
## About Epsilon
---
Upsilon is a fork of Omega, after the project's discontinuation.
<p align="center"><img src="docs/epsilon.svg?sanitize=true" alt="NumWorks Epsilon logo" height="70" ></p>
<!-- [![Build Status](https://github.com/numworks/epsilon/workflows/Continuous%20integration/badge.svg)](https://github.com/numworks/epsilon/actions?workflow=Continuous+integration) -->
<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-lightgrey.svg?labelColor=292929&logo=creative%20commons&style=for-the-badge" /></a>
<a href="https://github.com/numworks/epsilon/issues"><img alt="Issues" src="https://img.shields.io/github/issues/numworks/epsilon.svg?labelColor=292929&logo=git&style=for-the-badge" /></a>
</p>
Epsilon is a high-performance graphing calculator operating system. It includes eight apps that cover the high school mathematics curriculum.
Omega is a fork of Epsilon, a high-performance graphing calculator operating system. It includes eight apps that cover the high school mathematics curriculum.
You can try Epsilon straight from your browser in the [online simulator](https://www.numworks.com/simulator/).
## Diving in
We highly recommend you start by reading the [online documentation](https://www.numworks.com/resources/engineering/software/) for this project. You'll learn how to install the [SDK](https://www.numworks.com/resources/engineering/software/build/) and about the overall architecture of the Epsilon.
## Contributing
If you run into an issue, we would be very happy if you would file a bug on the [issue tracker](https://github.com/numworks/epsilon/issues).
We welcome contributions. For smaller changes just open a pull request straight away. For larger changes we recommend you open an issue first for discussion.
## License
NumWorks Epsilon is released under a [CC BY-NC-SA License](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode). NumWorks is a registered trademark.
NumWorks is a registered trademark of NumWorks SAS, 24 Rue Godot de Mauroy, 75009 Paris, France.
Nintendo and Nintendo 3DS are registered trademarks of Nintendo of America Inc, 4600 150th Ave NE, Redmond, WA 98052, USA.
NumWorks SAS and Nintendo of America Inc aren't associated in any shape or form with this project.
* NumWorks Epsilon is released under a [CC BY-NC-SA License](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).
* Omega is released under a [CC BY-NC-SA License](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).
* Upsilon is released under a [CC BY-NC-SA License](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).

View File

@@ -1,41 +1,70 @@
include apps/helpers.mk
include apps/shared/Makefile
include apps/home/Makefile
include apps/on_boarding/Makefile
include apps/hardware_test/Makefile
include apps/usb/Makefile
apps =
apps =
# All selected apps are included. Each Makefile below is responsible for setting
# the $apps variable (name of the app class) and the $app_headers
# (path to the apps header).
$(foreach i,${EPSILON_APPS},$(eval include apps/$(i)/Makefile))
$(foreach i,${apps_list},${eval include apps/$(i)/Makefile})
app_src += $(addprefix apps/,\
app_equals = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
# We list all the apps that are missing
apps_missing = $(foreach i, ${apps_list}, $(if $(call app_equals, apps/$(i)/Makefile, $(wildcard apps/$(i)/Makefile)),, $(i) ) )
# If the two doesn't match, we got an error.
ifneq ($(strip $(apps_missing)),)
miss_modules = 0
# Check if the missing apps are one that are supposed to be submodules
$(foreach i, $(SUBMODULES_APPS), $(if $(call app_equals, $(filter $(i), $(apps_missing)), $(i)), $(eval miss_modules=1)))
ifeq ($(miss_modules), 1)
PLS_IGNORE := $(shell >&2 printf "\nSome submodules apps seem to be missing. To download them, assumming you git clone'd the repo, do\n")
PLS_IGNORE := $(shell >&2 printf " git submodule init\n")
PLS_IGNORE := $(shell >&2 printf " git submodule update\n\n")
endif
$(error Missing apps: $(strip $(apps_missing)))
endif
apps_src += $(addprefix apps/,\
alternate_empty_nested_menu_controller.cpp \
apps_container.cpp \
apps_container_launch_default.cpp:-onboarding \
apps_container_launch_on_boarding.cpp:+onboarding \
apps_container_prompt_beta.cpp:+beta \
apps_container_prompt_none.cpp:-beta \
apps_container_prompt_none.cpp:-update \
apps_container_prompt_update.cpp:+update \
apps_container_storage.cpp \
apps_window.cpp \
backlight_dimming_timer.cpp \
battery_timer.cpp \
battery_view.cpp \
clock_timer.cpp \
empty_battery_window.cpp \
exam_pop_up_controller.cpp \
exam_mode_configuration_official.cpp:+official \
exam_mode_configuration_non_official.cpp:-official \
global_preferences.cpp \
i18n.py \
lock_view.cpp \
main.cpp \
math_toolbox.cpp \
math_variable_box_controller.cpp \
math_variable_box_empty_controller.cpp \
shift_alpha_lock_view.cpp \
suspend_timer.cpp \
title_bar_view.cpp \
variable_box_controller.cpp \
variable_box_empty_controller.cpp \
)
apps_launch_on_boarding_src += apps/apps_container_launch_on_boarding.cpp
apps_launch_default_src += apps/apps_container_launch_default.cpp
apps_prompt_none_src += apps/apps_container_prompt_none.cpp
apps_prompt_beta_src += apps/apps_container_prompt_beta.cpp
apps_prompt_update_src += apps/apps_container_prompt_update.cpp
tests_src += $(addprefix apps/,\
exam_mode_configuration_non_official.cpp \
)
snapshots_declaration = $(foreach i,$(apps),$(i)::Snapshot m_snapshot$(subst :,,$(i))Snapshot;)
apps_declaration = $(foreach i,$(apps),$(i) m_$(subst :,,$(i));)
@@ -43,61 +72,67 @@ snapshots_construction = $(foreach i,$(apps),,m_snapshot$(subst :,,$(i))Snapshot
snapshots_list = $(foreach i,$(apps),,&m_snapshot$(subst :,,$(i))Snapshot)
snapshots_count = $(words $(apps))
snapshot_includes = $(foreach i,$(app_headers),-include $(i) )
epsilon_app_names = '$(foreach i,${EPSILON_APPS},"$(i)", )'
epsilon_app_names = '$(foreach i,${apps_list},"$(i)", )'
$(call object_for,apps/apps_container_storage.cpp apps/apps_container.cpp apps/main.cpp): CXXFLAGS += $(snapshot_includes) -DAPPS_CONTAINER_APPS_DECLARATION="$(apps_declaration)" -DAPPS_CONTAINER_SNAPSHOT_DECLARATIONS="$(snapshots_declaration)" -DAPPS_CONTAINER_SNAPSHOT_CONSTRUCTORS="$(snapshots_construction)" -DAPPS_CONTAINER_SNAPSHOT_LIST="$(snapshots_list)" -DAPPS_CONTAINER_SNAPSHOT_COUNT=$(snapshots_count) -DEPSILON_APPS_NAMES=$(epsilon_app_names) -DUSERNAME="$(USERNAME)"
$(call object_for,apps/apps_container_storage.cpp apps/apps_container.cpp apps/main.cpp): CXXFLAGS += $(snapshot_includes) -DAPPS_CONTAINER_APPS_DECLARATION="$(apps_declaration)" -DAPPS_CONTAINER_SNAPSHOT_DECLARATIONS="$(snapshots_declaration)" -DAPPS_CONTAINER_SNAPSHOT_CONSTRUCTORS="$(snapshots_construction)" -DAPPS_CONTAINER_SNAPSHOT_LIST="$(snapshots_list)" -DAPPS_CONTAINER_SNAPSHOT_COUNT=$(snapshots_count) -DEPSILON_APPS_NAMES=$(epsilon_app_names) -DOMEGA_USERNAME="$(OMEGA_USERNAME)"
# I18n file generation
country_preferences = apps/country_preferences.csv
language_preferences = apps/language_preferences.csv
# The header is refered to as <apps/i18n.h> so make sure it's findable this way
SFLAGS += -I$(BUILD_DIR)
i18n_files += $(addprefix apps/language_,$(addsuffix .universal.i18n, $(EPSILON_I18N)))
i18n_files += $(addprefix apps/,\
shared.de.i18n\
shared.en.i18n\
shared.es.i18n\
shared.fr.i18n\
shared.pt.i18n\
shared.universal.i18n\
toolbox.de.i18n\
toolbox.en.i18n\
toolbox.es.i18n\
toolbox.fr.i18n\
toolbox.pt.i18n\
variables.de.i18n\
variables.en.i18n\
variables.es.i18n\
variables.fr.i18n\
variables.pt.i18n\
)
i18n_files += $(call i18n_with_universal_for,shared)
i18n_files += $(call i18n_with_universal_for,toolbox)
i18n_files += $(call i18n_without_universal_for,variables)
$(eval $(call rule_for, \
I18N, \
apps/i18n.cpp, \
$(i18n_files), \
$$(PYTHON) apps/i18n.py --header $$(subst .cpp,.h,$$@) --implementation $$@ --locales $$(EPSILON_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 $$^, \
global \
))
$(BUILD_DIR)/apps/i18n.h: $(BUILD_DIR)/apps/i18n.cpp
# Handle PNG files
$(eval $(call depends_on_image,apps/title_bar_view.cpp,apps/exam_icon.png))
all_app_src = $(app_src) $(epsilon_src) $(apps_launch_on_boarding_src) $(apps_launch_default_src) $(apps_prompt_none_src) $(apps_container_prompt_update) $(apps_prompt_beta_src) $(tests_src)
$(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,$(all_app_src)): $(BUILD_DIR)/apps/i18n.h
$(call object_for,$(all_app_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_probability_test_src) $(app_regression_test_src) $(app_sequence_test_src) $(app_shared_test_src) $(app_statistics_test_src) $(app_solver_test_src)
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)
# Configure variants
apps_all_src = $(app_src)
apps_all_src += $(apps_launch_default_src) $(apps_launch_on_boarding_src
apps_all_src += $(apps_prompt_none_src) $(apps_prompt_update_src) $(apps_prompt_beta_src)
apps_tests_src += $(addprefix apps/,\
alternate_empty_nested_menu_controller.cpp \
global_preferences.cpp \
)
apps_default_src = $(app_src) $(apps_launch_default_src) $(apps_prompt_none_src)
apps_onboarding_src = $(app_src) $(apps_launch_on_boarding_src) $(apps_prompt_none_src)
apps_onboarding_update_src = $(app_src) $(apps_launch_on_boarding_src) $(apps_prompt_update_src)
apps_onboarding_beta_src = $(app_src) $(apps_launch_on_boarding_src) $(apps_prompt_beta_src)
ifeq ($(THEME_REPO),local)
$(foreach img,$(image_list), $(eval $(call rule_for, \
ICON, \
$(img), \
$(addprefix themes/themes/local/, $(addsuffix .json, $(THEME_NAME))), \
$$(PYTHON) themes/themes_manager.py -i $(THEME_REPO) $(THEME_NAME) $$@ $(BUILD_DIR)/, \
global \
)))
else
$(foreach img,$(image_list), $(eval $(call rule_for, \
ICON, \
$(img), \
$(addsuffix /escher/palette.h, $(BUILD_DIR)), \
$$(PYTHON) themes/themes_manager.py -i $(THEME_REPO) $(THEME_NAME) $$@ $(BUILD_DIR)/, \
global \
)))
endif

View File

@@ -0,0 +1,18 @@
#include "alternate_empty_nested_menu_controller.h"
void AlternateEmptyNestedMenuController::viewDidDisappear() {
if (isDisplayingEmptyController()) {
pop();
}
NestedMenuController::viewDidDisappear();
}
bool AlternateEmptyNestedMenuController::displayEmptyControllerIfNeeded() {
assert(!isDisplayingEmptyController());
// If the content is empty, we push an empty controller.
if (numberOfRows() == 0) {
push(emptyViewController());
return true;
}
return false;
}

View File

@@ -0,0 +1,19 @@
#ifndef APPS_ALTERNATE_EMPTY_NESTED_MENU_CONTROLLER_H
#define APPS_ALTERNATE_EMPTY_NESTED_MENU_CONTROLLER_H
#include <escher/nested_menu_controller.h>
class AlternateEmptyNestedMenuController : public NestedMenuController {
public:
AlternateEmptyNestedMenuController(I18n::Message title) :
NestedMenuController(nullptr, title)
{}
// View Controller
void viewDidDisappear() override;
protected:
virtual ViewController * emptyViewController() = 0;
bool isDisplayingEmptyController() { return StackViewController::depth() == 2; }
bool displayEmptyControllerIfNeeded();
};
#endif

View File

@@ -1,14 +1,20 @@
#include "apps_container.h"
#include "apps_container_storage.h"
#include "global_preferences.h"
#include "exam_mode_configuration.h"
#include <ion.h>
#include <poincare/init.h>
#include <poincare/exception_checkpoint.h>
#include <ion/backlight.h>
#include <poincare/preferences.h>
#include <algorithm>
extern "C" {
#include <assert.h>
}
using namespace Poincare;
using namespace Shared;
AppsContainer * AppsContainer::sharedAppsContainer() {
@@ -23,17 +29,18 @@ AppsContainer::AppsContainer() :
m_globalContext(),
m_variableBoxController(),
m_examPopUpController(this),
m_promptController(k_promptMessages, k_promptColors, k_promptNumberOfMessages),
m_promptController(k_promptMessages, k_promptFGColors, k_promptBGColors, k_promptNumberOfMessages),
m_batteryTimer(),
m_suspendTimer(),
m_backlightDimmingTimer(),
m_clockTimer(ClockTimer(this)),
m_homeSnapshot(),
m_onBoardingSnapshot(),
m_hardwareTestSnapshot(),
m_usbConnectedSnapshot()
{
m_emptyBatteryWindow.setFrame(KDRect(0, 0, Ion::Display::Width, Ion::Display::Height));
#if __EMSCRIPTEN__
m_emptyBatteryWindow.setFrame(KDRect(0, 0, Ion::Display::Width, Ion::Display::Height), false);
// #if __EMSCRIPTEN__
/* AppsContainer::poincareCircuitBreaker uses Ion::Keyboard::scan(), which
* calls emscripten_sleep. If we set the poincare circuit breaker, we would
* need to whitelist all the methods that might be in the call stack when
@@ -43,15 +50,34 @@ AppsContainer::AppsContainer() :
* quite painy to maintain).
* We just remove the circuit breaker for now.
* TODO: Put the Poincare circuit breaker back on epsilon's web emulator */
#else
/*
* This can be run in Omega, since it uses WebASM.
*/
// #else
Poincare::Expression::SetCircuitBreaker(AppsContainer::poincareCircuitBreaker);
#endif
// #endif
Ion::Storage::sharedStorage()->setDelegate(this);
}
bool AppsContainer::poincareCircuitBreaker() {
constexpr uint64_t minimalPressDuration = 20;
static uint64_t beginningOfInterruption = 0;
Ion::Keyboard::State state = Ion::Keyboard::scan();
return state.keyDown(Ion::Keyboard::Key::Back);
bool interrupt = state.keyDown(Ion::Keyboard::Key::Back) || state.keyDown(Ion::Keyboard::Key::Home) || state.keyDown(Ion::Keyboard::Key::OnOff);
if (!interrupt) {
beginningOfInterruption = 0;
return false;
}
if (beginningOfInterruption == 0) {
beginningOfInterruption = Ion::Timing::millis();
return false;
}
if (Ion::Timing::millis() - beginningOfInterruption > minimalPressDuration) {
beginningOfInterruption = 0;
return true;
}
return false;
}
App::Snapshot * AppsContainer::hardwareTestAppSnapshot() {
@@ -84,7 +110,7 @@ MathToolbox * AppsContainer::mathToolbox() {
return &m_mathToolbox;
}
VariableBoxController * AppsContainer::variableBoxController() {
MathVariableBoxController * AppsContainer::variableBoxController() {
return &m_variableBoxController;
}
@@ -194,12 +220,19 @@ 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) {
if (Ion::USB::isPlugged()) {
if (GlobalPreferences::sharedGlobalPreferences()->examMode() == GlobalPreferences::ExamMode::Activate) {
displayExamModePopUp(false);
if (GlobalPreferences::sharedGlobalPreferences()->isInExamMode()) {
displayExamModePopUp(GlobalPreferences::ExamMode::Off);
window()->redraw();
} else {
Ion::USB::enable();
@@ -214,10 +247,28 @@ bool AppsContainer::processEvent(Ion::Events::Event event) {
switchTo(appSnapshotAtIndex(0));
return true;
}
if (event == Ion::Events::ShiftHome) {
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;
}
if (event == Ion::Events::BrightnessPlus || event == Ion::Events::BrightnessMinus) {
int delta = Ion::Backlight::MaxBrightness/GlobalPreferences::NumberOfBrightnessStates;
int direction = (event == Ion::Events::BrightnessPlus) ? Ion::Backlight::NumberOfStepsPerShortcut*delta : -delta*Ion::Backlight::NumberOfStepsPerShortcut;
GlobalPreferences::sharedGlobalPreferences()->setBrightnessLevel(GlobalPreferences::sharedGlobalPreferences()->brightnessLevel()+direction);
}
return false;
}
@@ -237,7 +288,15 @@ bool AppsContainer::switchTo(App::Snapshot * snapshot) {
}
void AppsContainer::run() {
window()->setFrame(KDRect(0, 0, Ion::Display::Width, Ion::Display::Height));
KDRect screenRect = KDRect(0, 0, Ion::Display::Width, Ion::Display::Height);
window()->setFrame(screenRect, false);
/* We push a white screen here, because fetching the exam mode takes some time
* and it is visible when reflashing a N0100 (there is some noise on the
* screen before the logo appears). */
Ion::Display::pushRectUniform(screenRect, KDColorWhite);
if (GlobalPreferences::sharedGlobalPreferences()->isInExamMode()) {
activateExamMode(GlobalPreferences::sharedGlobalPreferences()->examMode());
}
refreshPreferences();
/* ExceptionCheckpoint stores the value of the stack pointer when setjump is
@@ -279,6 +338,10 @@ void AppsContainer::run() {
switchTo(nullptr);
}
bool AppsContainer::updateClock() {
return m_window.updateClock();
}
bool AppsContainer::updateBatteryState() {
bool batteryLevelUpdated = m_window.updateBatteryLevel();
bool pluggedStateUpdated = m_window.updatePluggedState();
@@ -297,8 +360,8 @@ void AppsContainer::reloadTitleBarView() {
m_window.reloadTitleBarView();
}
void AppsContainer::displayExamModePopUp(bool activate) {
m_examPopUpController.setActivatingExamMode(activate);
void AppsContainer::displayExamModePopUp(GlobalPreferences::ExamMode mode) {
m_examPopUpController.setTargetExamMode(mode);
s_activeApp->displayModalViewController(&m_examPopUpController, 0.f, 0.f, Metric::ExamPopUpTopMargin, Metric::PopUpRightMargin, Metric::ExamPopUpBottomMargin, Metric::PopUpLeftMargin);
}
@@ -311,9 +374,9 @@ void AppsContainer::shutdownDueToLowBattery() {
* case. */
return;
}
while (Ion::Battery::level() == Ion::Battery::Charge::EMPTY) {
while (Ion::Battery::level() == Ion::Battery::Charge::EMPTY && !Ion::USB::isPlugged()) {
Ion::Backlight::setBrightness(0);
if (GlobalPreferences::sharedGlobalPreferences()->examMode() == GlobalPreferences::ExamMode::Deactivate) {
if (!GlobalPreferences::sharedGlobalPreferences()->isInExamMode()) {
/* Unless the LED is lit up for the exam mode, switch off the LED. IF the
* low battery event happened during the Power-On Self-Test, a LED might
* have stayed lit up. */
@@ -335,7 +398,7 @@ bool AppsContainer::updateAlphaLock() {
return m_window.updateAlphaLock();
}
OnBoarding::PopUpController * AppsContainer::promptController() {
OnBoarding::PromptController * AppsContainer::promptController() {
if (k_promptNumberOfMessages == 0) {
return nullptr;
}
@@ -346,6 +409,21 @@ void AppsContainer::redrawWindow(bool force) {
m_window.redraw(force);
}
void AppsContainer::activateExamMode(GlobalPreferences::ExamMode examMode) {
assert(examMode != GlobalPreferences::ExamMode::Off && examMode != GlobalPreferences::ExamMode::Unknown);
reset();
Ion::LED::setColor(KDColorRed);
/* The Dutch exam mode LED is supposed to be orange but we can only make
* blink "pure" colors: with RGB leds on or off (as the PWM is used for
* blinking). The closest "pure" color is Yellow. Moreover, Orange LED is
* already used when the battery is charging. Using yellow, we can assert
* that the yellow LED only means that Dutch exam mode is on and avoid
* confusing states when the battery is charging and states when the Dutch
* exam mode is on. */
// Ion::LED::setColor(examMode == GlobalPreferences::ExamMode::Dutch ? KDColorYellow : KDColorRed);
Ion::LED::setBlinking(1000, 0.1f);
}
void AppsContainer::examDeactivatingPopUpIsDismissed() {
if (Ion::USB::isPlugged()) {
Ion::USB::enable();
@@ -369,11 +447,11 @@ Window * AppsContainer::window() {
}
int AppsContainer::numberOfContainerTimers() {
return 3;
return 4;
}
Timer * AppsContainer::containerTimerAtIndex(int i) {
Timer * timers[3] = {&m_batteryTimer, &m_suspendTimer, &m_backlightDimmingTimer};
Timer * timers[4] = {&m_batteryTimer, &m_suspendTimer, &m_backlightDimmingTimer, &m_clockTimer};
return timers[i];
}

View File

@@ -8,14 +8,16 @@
#include "apps_window.h"
#include "empty_battery_window.h"
#include "math_toolbox.h"
#include "variable_box_controller.h"
#include "math_variable_box_controller.h"
#include "exam_pop_up_controller.h"
#include "exam_pop_up_controller_delegate.h"
#include "battery_timer.h"
#include "suspend_timer.h"
#include "global_preferences.h"
#include "backlight_dimming_timer.h"
#include "shared/global_context.h"
#include "on_boarding/pop_up_controller.h"
#include "clock_timer.h"
#include "on_boarding/prompt_controller.h"
#include <ion/events.h>
@@ -33,19 +35,21 @@ public:
void reset();
Poincare::Context * globalContext();
MathToolbox * mathToolbox();
VariableBoxController * variableBoxController();
MathVariableBoxController * variableBoxController();
void suspend(bool checkIfOnOffKeyReleased = false);
virtual bool dispatchEvent(Ion::Events::Event event) override;
bool dispatchEvent(Ion::Events::Event event) override;
bool switchTo(App::Snapshot * snapshot) override;
void run() override;
bool updateClock();
bool updateBatteryState();
void refreshPreferences();
void reloadTitleBarView();
void displayExamModePopUp(bool activate);
void displayExamModePopUp(GlobalPreferences::ExamMode mode);
void shutdownDueToLowBattery();
void setShiftAlphaStatus(Ion::Events::ShiftAlphaStatus newStatus);
OnBoarding::PopUpController * promptController();
OnBoarding::PromptController * promptController();
void redrawWindow(bool force = false);
void activateExamMode(GlobalPreferences::ExamMode examMode);
// Exam pop-up controller delegate
void examDeactivatingPopUpIsDismissed() override;
// Ion::StorageDelegate
@@ -62,18 +66,20 @@ private:
bool updateAlphaLock();
static I18n::Message k_promptMessages[];
static KDColor k_promptColors[];
static KDColor const * k_promptFGColors[];
static KDColor const * k_promptBGColors[];
static int k_promptNumberOfMessages;
AppsWindow m_window;
EmptyBatteryWindow m_emptyBatteryWindow;
Shared::GlobalContext m_globalContext;
MathToolbox m_mathToolbox;
VariableBoxController m_variableBoxController;
MathVariableBoxController m_variableBoxController;
ExamPopUpController m_examPopUpController;
OnBoarding::PopUpController m_promptController;
OnBoarding::PromptController m_promptController;
BatteryTimer m_batteryTimer;
SuspendTimer m_suspendTimer;
BacklightDimmingTimer m_backlightDimmingTimer;
ClockTimer m_clockTimer;
Home::App::Snapshot m_homeSnapshot;
OnBoarding::App::Snapshot m_onBoardingSnapshot;
HardwareTest::App::Snapshot m_hardwareTestSnapshot;

View File

@@ -10,14 +10,24 @@ I18n::Message AppsContainer::k_promptMessages[] = {
I18n::Message::BetaVersionMessage5,
I18n::Message::BetaVersionMessage6};
KDColor AppsContainer::k_promptColors[] = {
KDColorBlack,
KDColorBlack,
KDColorBlack,
KDColorBlack,
KDColorWhite,
KDColorBlack,
KDColorBlack,
Palette::AccentText};
KDColor AppsContainer::k_promptFGColors[] = {
&KDColorBlack,
&KDColorBlack,
&KDColorBlack,
&KDColorBlack,
&KDColorWhite,
&KDColorBlack,
&KDColorBlack,
*Palette::AccentText};
KDColor AppsContainer::k_promptBGColors[] = {
KDColorWhite,
KDColorWhite,
KDColorWhite,
KDColorWhite,
KDColorWhite,
KDColorWhite,
KDColorWhite,
KDColorWhite};
int AppsContainer::k_promptNumberOfMessages = 8;

View File

@@ -2,7 +2,8 @@
I18n::Message AppsContainer::k_promptMessages[] = {};
KDColor AppsContainer::k_promptColors[] = {};
KDColor const * AppsContainer::k_promptFGColors[] = {};
KDColor const * AppsContainer::k_promptBGColors[] = {};
int AppsContainer::k_promptNumberOfMessages = 0;

View File

@@ -8,12 +8,20 @@ I18n::Message AppsContainer::k_promptMessages[] = {
I18n::Message::UpdateMessage3,
I18n::Message::UpdateMessage4};
KDColor AppsContainer::k_promptColors[] = {
KDColorBlack,
KDColorBlack,
KDColorBlack,
KDColorWhite,
KDColorBlack,
Palette::AccentText};
KDColor const * AppsContainer::k_promptFGColors[] = {
&KDColorBlack,
&KDColorBlack,
&KDColorBlack,
&KDColorWhite,
&KDColorBlack,
*Palette::AccentText};
KDColor const * AppsContainer::k_promptBGColors[] = {
KDColorWhite,
KDColorWhite,
KDColorWhite,
KDColorBlack,
KDColorWhite,
KDColorBlack};
int AppsContainer::k_promptNumberOfMessages = 6;

View File

@@ -3,6 +3,7 @@
extern "C" {
#include <assert.h>
}
#include <ion/rtc.h>
AppsWindow::AppsWindow() :
Window(),
@@ -19,6 +20,11 @@ bool AppsWindow::updateBatteryLevel() {
return m_titleBarView.setChargeState(Ion::Battery::level());
}
bool AppsWindow::updateClock() {
Ion::RTC::DateTime dateTime = Ion::RTC::dateTime();
return m_titleBarView.setClock(dateTime.tm_hour, dateTime.tm_min, Ion::RTC::mode() != Ion::RTC::Mode::Disabled);
}
bool AppsWindow::updateIsChargingState() {
return m_titleBarView.setIsCharging(Ion::Battery::isCharging());
}
@@ -58,11 +64,11 @@ View * AppsWindow::subviewAtIndex(int index) {
return m_contentView;
}
void AppsWindow::layoutSubviews() {
void AppsWindow::layoutSubviews(bool force) {
KDCoordinate titleHeight = m_hideTitleBarView ? 0 : Metric::TitleBarHeight;
m_titleBarView.setFrame(KDRect(0, 0, bounds().width(), titleHeight));
m_titleBarView.setFrame(KDRect(0, 0, bounds().width(), titleHeight), force);
if (m_contentView != nullptr) {
m_contentView->setFrame(KDRect(0, titleHeight, bounds().width(), bounds().height()-titleHeight));
m_contentView->setFrame(KDRect(0, titleHeight, bounds().width(), bounds().height()-titleHeight), force);
}
}

View File

@@ -9,6 +9,7 @@ public:
AppsWindow();
void setTitle(I18n::Message title);
bool updateBatteryLevel();
bool updateClock();
bool updateIsChargingState();
bool updatePluggedState();
void refreshPreferences();
@@ -17,7 +18,7 @@ public:
void hideTitleBarView(bool hide);
private:
int numberOfSubviews() const override;
void layoutSubviews() override;
void layoutSubviews(bool force = false) override;
View * subviewAtIndex(int index) override;
TitleBarView m_titleBarView;
bool m_hideTitleBarView;

Submodule apps/atom deleted from c2f5630178

1
apps/atomic Submodule

Submodule apps/atomic added at ffafaaf311

View File

@@ -9,7 +9,7 @@ BatteryTimer::BatteryTimer() :
bool BatteryTimer::fire() {
AppsContainer * container = AppsContainer::sharedAppsContainer();
bool needRedrawing = container->updateBatteryState();
if (Ion::Battery::level() == Ion::Battery::Charge::EMPTY) {
if (Ion::Battery::level() == Ion::Battery::Charge::EMPTY && !Ion::USB::isPlugged()) {
container->shutdownDueToLowBattery();
}
return needRedrawing;

View File

@@ -54,50 +54,49 @@ bool BatteryView::setIsPlugged(bool isPlugged) {
return false;
}
KDColor s_flashWorkingBuffer[BatteryView::k_flashHeight*BatteryView::k_flashWidth];
KDColor s_tickWorkingBuffer[BatteryView::k_tickHeight*BatteryView::k_tickWidth];
void BatteryView::drawRect(KDContext * ctx, KDRect rect) const {
assert(m_chargeState != Ion::Battery::Charge::EMPTY);
/* We draw from left to right. The middle part representing the battery
*'content' depends on the charge */
// Draw the left part
ctx->fillRect(KDRect(0, 0, k_elementWidth, k_batteryHeight), Palette::Battery);
ctx->fillRect(KDRect(0, 0, k_elementWidth, k_batteryHeight), *Palette::Battery);
// Draw the middle part
constexpr KDCoordinate batteryInsideX = k_elementWidth+k_separatorThickness;
constexpr KDCoordinate batteryInsideWidth = k_batteryWidth-3*k_elementWidth-2*k_separatorThickness;
if (m_isCharging) {
// Charging: Yellow background with flash
ctx->fillRect(KDRect(batteryInsideX, 0, batteryInsideWidth, k_batteryHeight), Palette::BatteryInCharge);
ctx->fillRect(KDRect(batteryInsideX, 0, batteryInsideWidth, k_batteryHeight), *Palette::BatteryInCharge);
KDRect frame((k_batteryWidth-k_flashWidth)/2, 0, k_flashWidth, k_flashHeight);
ctx->blendRectWithMask(frame, Palette::Battery, (const uint8_t *)flashMask, s_flashWorkingBuffer);
KDColor flashWorkingBuffer[BatteryView::k_flashHeight*BatteryView::k_flashWidth];
ctx->blendRectWithMask(frame, *Palette::Battery, (const uint8_t *)flashMask, flashWorkingBuffer);
} else if (m_chargeState == Ion::Battery::Charge::LOW) {
assert(!m_isPlugged);
// Low: Quite empty battery
ctx->fillRect(KDRect(batteryInsideX, 0, 2*k_elementWidth, k_batteryHeight), Palette::BatteryLow);
ctx->fillRect(KDRect(3*k_elementWidth+k_separatorThickness, 0, k_batteryWidth-5*k_elementWidth-2*k_separatorThickness, k_batteryHeight), Palette::BatteryInCharge);
ctx->fillRect(KDRect(batteryInsideX, 0, 2*k_elementWidth, k_batteryHeight), *Palette::BatteryLow);
ctx->fillRect(KDRect(3*k_elementWidth+k_separatorThickness, 0, k_batteryWidth-5*k_elementWidth-2*k_separatorThickness, k_batteryHeight), KDColor::blend(*Palette::Toolbar, *Palette::Battery, 128));
} else if (m_chargeState == Ion::Battery::Charge::SOMEWHERE_INBETWEEN) {
assert(!m_isPlugged);
// Middle: Half full battery
constexpr KDCoordinate middleChargeWidth = batteryInsideWidth/2;
ctx->fillRect(KDRect(batteryInsideX, 0, middleChargeWidth, k_batteryHeight), Palette::Battery);
ctx->fillRect(KDRect(batteryInsideX+middleChargeWidth, 0, middleChargeWidth, k_batteryHeight), Palette::BatteryInCharge);
ctx->fillRect(KDRect(batteryInsideX, 0, middleChargeWidth, k_batteryHeight), *Palette::Battery);
ctx->fillRect(KDRect(batteryInsideX+middleChargeWidth, 0, middleChargeWidth, k_batteryHeight), KDColor::blend(*Palette::Toolbar, *Palette::Battery, 128));
} else {
assert(m_chargeState == Ion::Battery::Charge::FULL);
// Full but not plugged: Full battery
ctx->fillRect(KDRect(batteryInsideX, 0, batteryInsideWidth, k_batteryHeight), Palette::Battery);
ctx->fillRect(KDRect(batteryInsideX, 0, batteryInsideWidth, k_batteryHeight), *Palette::Battery);
if (m_isPlugged) {
// Plugged and full: Full battery with tick
KDRect frame((k_batteryWidth-k_tickWidth)/2, (k_batteryHeight-k_tickHeight)/2, k_tickWidth, k_tickHeight);
ctx->blendRectWithMask(frame, Palette::Toolbar, (const uint8_t *)tickMask, s_tickWorkingBuffer);
KDColor tickWorkingBuffer[BatteryView::k_tickHeight*BatteryView::k_tickWidth];
ctx->blendRectWithMask(frame, *Palette::Toolbar, (const uint8_t *)tickMask, tickWorkingBuffer);
}
}
// Draw the right part
ctx->fillRect(KDRect(k_batteryWidth-2*k_elementWidth, 0, k_elementWidth, k_batteryHeight), Palette::Battery);
ctx->fillRect(KDRect(k_batteryWidth-k_elementWidth, (k_batteryHeight-k_capHeight)/2, k_elementWidth, k_capHeight), Palette::Battery);
ctx->fillRect(KDRect(k_batteryWidth-2*k_elementWidth, 0, k_elementWidth, k_batteryHeight), *Palette::Battery);
ctx->fillRect(KDRect(k_batteryWidth-k_elementWidth, (k_batteryHeight-k_capHeight)/2, k_elementWidth, k_capHeight), *Palette::Battery);
}
KDSize BatteryView::minimalSizeForOptimalDisplay() const {

View File

@@ -7,25 +7,35 @@ app_calculation_test_src += $(addprefix apps/calculation/,\
)
app_calculation_src = $(addprefix apps/calculation/,\
additional_outputs/complex_graph_cell.cpp \
additional_outputs/complex_model.cpp \
additional_outputs/complex_list_controller.cpp \
additional_outputs/expression_with_equal_sign_view.cpp \
additional_outputs/expressions_list_controller.cpp \
additional_outputs/illustrated_list_controller.cpp \
additional_outputs/illustration_cell.cpp \
additional_outputs/integer_list_controller.cpp \
additional_outputs/scrollable_three_expressions_cell.cpp \
additional_outputs/list_controller.cpp \
additional_outputs/matrix_list_controller.cpp \
additional_outputs/rational_list_controller.cpp \
additional_outputs/second_degree_list_controller.cpp \
additional_outputs/trigonometry_graph_cell.cpp \
additional_outputs/trigonometry_list_controller.cpp \
additional_outputs/trigonometry_model.cpp \
additional_outputs/unit_list_controller.cpp \
app.cpp \
edit_expression_controller.cpp \
expression_field.cpp \
history_view_cell.cpp \
history_controller.cpp \
scrollable_expression_view.cpp \
selectable_table_view.cpp \
)
app_calculation_src += $(app_calculation_test_src)
app_src += $(app_calculation_src)
apps_src += $(app_calculation_src)
i18n_files += $(addprefix apps/calculation/,\
base.de.i18n\
base.en.i18n\
base.es.i18n\
base.fr.i18n\
base.pt.i18n\
)
i18n_files += $(call i18n_without_universal_for,calculation/base)
tests_src += $(addprefix apps/calculation/test/,\
calculation_store.cpp\

View File

@@ -0,0 +1,94 @@
#include "complex_graph_cell.h"
#include <escher/palette.h>
using namespace Shared;
using namespace Poincare;
namespace Calculation {
ComplexGraphView::ComplexGraphView(ComplexModel * complexModel) :
LabeledCurveView(complexModel),
m_complex(complexModel)
{
}
void ComplexGraphView::drawRect(KDContext * ctx, KDRect rect) const {
ctx->fillRect(rect, *Palette::BackgroundApps);
// Draw grid, axes and graduations
drawGrid(ctx, rect);
drawAxes(ctx, rect);
drawLabelsAndGraduations(ctx, rect, Axis::Vertical, true);
drawLabelsAndGraduations(ctx, rect, Axis::Horizontal, true);
float real = m_complex->real();
float imag = m_complex->imag();
assert(!std::isnan(real) && !std::isnan(imag) && !std::isinf(real) && !std::isinf(imag));
// Draw the segment from the origin to the dot (real, imag)
drawSegment(ctx, rect, 0.0f, 0.0f, m_complex->real(), m_complex->imag(), *Palette::SecondaryText, false);
/* Draw the partial ellipse indicating the angle θ
* - the ellipse parameters are a = |real|/5 and b = |imag|/5,
* - the parametric ellipse equation is x(t) = a*cos(th*t) and y(t) = b*sin(th*t)
* with th computed in order to be the intersection of the line forming an
* angle θ with the abscissa and the ellipsis
* - we draw the ellipse for t in [0,1] to represent it from the abscissa axis
* to the phase of the complex
*/
/* Compute th: th is the intersection of ellipsis of equation (a*cos(t), b*sin(t))
* and the line of equation (real*t,imag*t).
* (a*cos(t), b*sin(t)) = (real*t,imag*t) --> tan(t) = sign(a)*sign(b) (± π)
* --> t = π/4 [π/2] according to sign(a) and sign(b). */
float th = real < 0.0f ? (float)(3.0*M_PI_4) : (float)M_PI_4;
th = imag < 0.0f ? -th : th;
// Compute ellipsis parameters a and b
float factor = 5.0f;
float a = std::fabs(real)/factor;
float b = std::fabs(imag)/factor;
// Avoid flat ellipsis for edge cases (for real = 0, the case imag = 0 is excluded)
if (real == 0.0f) {
a = 1.0f/factor;
th = imag < 0.0f ? (float)-M_PI_2 : (float)M_PI_2;
}
std::complex<float> parameters(a,b);
drawCurve(ctx, rect, 0.0f, 1.0f, 0.01f,
[](float t, void * model, void * context) {
std::complex<float> parameters = *(std::complex<float> *)model;
float th = *(float *)context;
float a = parameters.real();
float b = parameters.imag();
return Poincare::Coordinate2D<float>(a*std::cos(t*th), b*std::sin(t*th));
}, &parameters, &th, false, *Palette::SecondaryText, false);
// Draw dashed segment to indicate real and imaginary
drawHorizontalOrVerticalSegment(ctx, rect, Axis::Vertical, real, 0.0f, imag, *Palette::CalculationTrigoAndComplexForeground, 1, 3);
drawHorizontalOrVerticalSegment(ctx, rect, Axis::Horizontal, imag, 0.0f, real, *Palette::CalculationTrigoAndComplexForeground, 1, 3);
// Draw complex position on the plan
drawDot(ctx, rect, real, imag, *Palette::CalculationTrigoAndComplexForeground, Size::Large);
// Draw labels
// 're(z)' label
drawLabel(ctx, rect, real, 0.0f, "re(z)", *Palette::CalculationTrigoAndComplexForeground, CurveView::RelativePosition::None, imag >= 0.0f ? CurveView::RelativePosition::Before : CurveView::RelativePosition::After);
// 'im(z)' label
drawLabel(ctx, rect, 0.0f, imag, "im(z)", *Palette::CalculationTrigoAndComplexForeground, real >= 0.0f ? CurveView::RelativePosition::Before : CurveView::RelativePosition::After, CurveView::RelativePosition::None);
// '|z|' label, the relative horizontal position of this label depends on the quadrant
CurveView::RelativePosition verticalPosition = real*imag < 0.0f ? CurveView::RelativePosition::Before : CurveView::RelativePosition::After;
if (real == 0.0f) {
// Edge case: pure imaginary
verticalPosition = CurveView::RelativePosition::None;
}
drawLabel(ctx, rect, real/2.0f, imag/2.0f, "|z|", *Palette::CalculationTrigoAndComplexForeground, CurveView::RelativePosition::None, verticalPosition);
// 'arg(z)' label, the absolute and relative horizontal/vertical positions of this label depends on the quadrant
CurveView::RelativePosition horizontalPosition = real >= 0.0f ? CurveView::RelativePosition::After : CurveView::RelativePosition::None;
verticalPosition = imag >= 0.0f ? CurveView::RelativePosition::After : CurveView::RelativePosition::Before;
/* anglePositionRatio is the ratio of the angle where we position the label
* For the right half plan, we position the label close to the abscissa axis
* and for the left half plan, we position the label at the half angle. The
* relative position is chosen accordingly. */
float anglePositionRatio = real >= 0.0f ? 0.0f : 0.5f;
drawLabel(ctx, rect, a*std::cos(anglePositionRatio*th), b*std::sin(anglePositionRatio*th), "arg(z)", *Palette::CalculationTrigoAndComplexForeground, horizontalPosition, verticalPosition);
}
}

View File

@@ -0,0 +1,32 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_GRAPH_CELL_H
#define CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_GRAPH_CELL_H
#include "../../shared/labeled_curve_view.h"
#include "complex_model.h"
#include "illustration_cell.h"
namespace Calculation {
class ComplexGraphView : public Shared::LabeledCurveView {
public:
ComplexGraphView(ComplexModel * complexModel);
void drawRect(KDContext * ctx, KDRect rect) const override;
private:
// '-' + significant digits + ".E-" + 2 digits (the represented dot is a float, so it is bounded by 1E38 and 1E-38
size_t labelMaxGlyphLengthSize() const override { return 1 + Poincare::Preferences::VeryShortNumberOfSignificantDigits + 3 + 2; }
ComplexModel * m_complex;
};
class ComplexGraphCell : public IllustrationCell {
public:
ComplexGraphCell(ComplexModel * complexModel) : m_view(complexModel) {}
void reload() { m_view.reload(); }
private:
View * view() override { return &m_view; }
ComplexGraphView m_view;
};
}
#endif

View File

@@ -0,0 +1,44 @@
#include "complex_list_controller.h"
#include "../app.h"
#include "../../shared/poincare_helpers.h"
#include <poincare/imaginary_part.h>
#include <poincare/real_part.h>
#include "complex_list_controller.h"
using namespace Poincare;
using namespace Shared;
namespace Calculation {
void ComplexListController::viewWillAppear() {
IllustratedListController::viewWillAppear();
m_complexGraphCell.reload(); // compute labels
}
void ComplexListController::setExpression(Poincare::Expression e) {
IllustratedListController::setExpression(e);
Poincare::Preferences * preferences = Poincare::Preferences::sharedPreferences();
Poincare::Preferences::ComplexFormat currentComplexFormat = preferences->complexFormat();
if (currentComplexFormat == Poincare::Preferences::ComplexFormat::Real) {
// Temporary change complex format to avoid all additional expressions to be "unreal"
preferences->setComplexFormat(Poincare::Preferences::ComplexFormat::Cartesian);
}
Poincare::Context * context = App::app()->localContext();
// Fill Calculation Store
m_calculationStore.push("im(z)", context, CalculationHeight);
m_calculationStore.push("re(z)", context, CalculationHeight);
m_calculationStore.push("arg(z)", context, CalculationHeight);
m_calculationStore.push("abs(z)", context, CalculationHeight);
// Set Complex illustration
// Compute a and b as in Expression::hasDefinedComplexApproximation to ensure the same defined result
float a = Shared::PoincareHelpers::ApproximateToScalar<float>(RealPart::Builder(e.clone()), context);
float b = Shared::PoincareHelpers::ApproximateToScalar<float>(ImaginaryPart::Builder(e.clone()), context);
m_model.setComplex(std::complex<float>(a,b));
// Reset complex format as before
preferences->setComplexFormat(currentComplexFormat);
}
}

View File

@@ -0,0 +1,30 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_LIST_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_LIST_CONTROLLER_H
#include "complex_graph_cell.h"
#include "complex_model.h"
#include "illustrated_list_controller.h"
namespace Calculation {
class ComplexListController : public IllustratedListController {
public:
ComplexListController(EditExpressionController * editExpressionController) :
IllustratedListController(editExpressionController),
m_complexGraphCell(&m_model) {}
// ViewController
void viewWillAppear() override;
void setExpression(Poincare::Expression e) override;
private:
CodePoint expressionSymbol() const override { return 'z'; }
HighlightCell * illustrationCell() override { return &m_complexGraphCell; }
ComplexGraphCell m_complexGraphCell;
ComplexModel m_model;
};
}
#endif

View File

@@ -0,0 +1,43 @@
#include "complex_model.h"
namespace Calculation {
ComplexModel::ComplexModel(std::complex<float> c) :
Shared::CurveViewRange(),
std::complex<float>(c)
{
}
float ComplexModel::rangeBound(float direction, bool horizontal) const {
float minFactor = k_minVerticalMarginFactor;
float maxFactor = k_maxVerticalMarginFactor;
float value = imag();
if (horizontal) {
minFactor = k_minHorizontalMarginFactor;
maxFactor = k_maxHorizontalMarginFactor;
value = real();
}
float factor = direction*value >= 0.0f ? maxFactor : minFactor;
if (std::isnan(value) || std::isinf(value) || value == 0.0f) {
return direction*factor;
}
return factor*value;
}
float ComplexModel::xMin() const {
return rangeBound(-1.0f, true);
}
float ComplexModel::xMax() const {
return rangeBound(1.0f, true);
}
float ComplexModel::yMin() const {
return rangeBound(-1.0f, false);
}
float ComplexModel::yMax() const {
return rangeBound(1.0f, false);
}
}

View File

@@ -0,0 +1,75 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_MODEL_H
#define CALCULATION_ADDITIONAL_OUTPUTS_COMPLEX_MODEL_H
#include "../../shared/curve_view_range.h"
#include "illustrated_list_controller.h"
#include <complex>
namespace Calculation {
class ComplexModel : public Shared::CurveViewRange, public std::complex<float> {
public:
ComplexModel(std::complex<float> c = std::complex<float>(NAN, NAN));
// CurveViewRange
float xMin() const override;
float xMax() const override;
float yMin() const override;
float yMax() const override;
void setComplex(std::complex<float> c) { *this = ComplexModel(c); }
/* The range is computed from these criteria:
* - The real part is centered horizontally
* - Both left and right margins are equal to the real length
* - The imaginary part is the same length as the real part
* - The remaining vertical margin are splitted as one third at the top, 2
* thirds at the bottom
*
* | | 1/3 * vertical_margin
* +----------+
* | / | |
* | / | | Imaginary
* | / | |
* | / | |
* ----------+----------+----------
* |
* | 2/3 * vertical_margin
* -----------
* Real
*
*/
// Horizontal range
static constexpr float k_minHorizontalMarginFactor = -1.0f;
static constexpr float k_maxHorizontalMarginFactor = 2.0f;
// Vertical range
static constexpr KDCoordinate k_width = Ion::Display::Width - Metric::PopUpRightMargin - Metric::PopUpLeftMargin;
static constexpr KDCoordinate k_height = IllustratedListController::k_illustrationHeight;
static constexpr KDCoordinate k_unit = k_width/3;
/*
* VerticalMaring = k_height - k_unit
*
* Values | Coordinates
* --------+----------------------------------
* imag | k_unit
* Ymax | k_unit + (1/3)*VerticalMargin
* Ymin | -(2/3)*VerticalMargin
*
* Thus:
* Ymin = -(2/3)*k_verticalMargin*imag/k_unit
* = -(2/3)*(k_height/k_unit - 1)*imag
* = 2/3*(1 - k_height/k_unit)*imag
* Ymax = (k_unit + (1/3)*VerticalMargin)*imag/k_unit
* = (1 + (1/3)*(k_height/k_unit - 1))*imag
* = 1/3*(2 + k_height/k_unit)*imag
*
* */
static constexpr float k_minVerticalMarginFactor = 2.0f/3.0f*(1.0f - (float)k_height/(float)k_unit);
static constexpr float k_maxVerticalMarginFactor = 1.0f/3.0f*(2.0f + (float)k_height/(float)k_unit);
private:
float rangeBound(float direction, bool horizontal) const;
};
}
#endif

View File

@@ -0,0 +1,33 @@
#include "expression_with_equal_sign_view.h"
namespace Calculation {
KDSize ExpressionWithEqualSignView::minimalSizeForOptimalDisplay() const {
KDSize expressionSize = ExpressionView::minimalSizeForOptimalDisplay();
KDSize equalSize = m_equalSign.minimalSizeForOptimalDisplay();
return KDSize(expressionSize.width() + equalSize.width() + Metric::CommonLargeMargin, expressionSize.height());
}
void ExpressionWithEqualSignView::drawRect(KDContext * ctx, KDRect rect) const {
if (m_layout.isUninitialized()) {
return;
}
// Do not color the whole background to avoid coloring behind the equal symbol
KDSize expressionSize = ExpressionView::minimalSizeForOptimalDisplay();
ctx->fillRect(KDRect(0, 0, expressionSize), m_backgroundColor);
m_layout.draw(ctx, drawingOrigin(), m_textColor, m_backgroundColor, m_selectionStart, m_selectionEnd, *Palette::Select);
}
View * ExpressionWithEqualSignView::subviewAtIndex(int index) {
assert(index == 0);
return &m_equalSign;
}
void ExpressionWithEqualSignView::layoutSubviews(bool force) {
KDSize expressionSize = ExpressionView::minimalSizeForOptimalDisplay();
KDSize equalSize = m_equalSign.minimalSizeForOptimalDisplay();
KDCoordinate expressionBaseline = layout().baseline();
m_equalSign.setFrame(KDRect(expressionSize.width() + Metric::CommonLargeMargin, expressionBaseline - equalSize.height()/2, equalSize), force);
}
}

View File

@@ -0,0 +1,27 @@
#ifndef CALCULATION_EXPRESSION_WITH_EQUAL_SIGN_VIEW_H
#define CALCULATION_EXPRESSION_WITH_EQUAL_SIGN_VIEW_H
#include <escher.h>
#include <apps/i18n.h>
#include <poincare/layout.h>
#include <escher/palette.h>
namespace Calculation {
class ExpressionWithEqualSignView : public ExpressionView {
public:
ExpressionWithEqualSignView() :
m_equalSign(KDFont::LargeFont, I18n::Message::Equal, 0.5f, 0.5f, *Palette::PrimaryText)
{}
KDSize minimalSizeForOptimalDisplay() const override;
void drawRect(KDContext * ctx, KDRect rect) const override;
private:
View * subviewAtIndex(int index) override;
void layoutSubviews(bool force = false) override;
int numberOfSubviews() const override { return 1; }
MessageTextView m_equalSign;
};
}
#endif

View File

@@ -0,0 +1,87 @@
#include "expressions_list_controller.h"
#include "../app.h"
using namespace Poincare;
namespace Calculation {
/* Expressions list controller */
ExpressionsListController::ExpressionsListController(EditExpressionController * editExpressionController) :
ListController(editExpressionController),
m_cells{}
{
for (int i = 0; i < k_maxNumberOfRows; i++) {
m_cells[i].setParentResponder(m_listController.selectableTableView());
}
}
void ExpressionsListController::didEnterResponderChain(Responder * previousFirstResponder) {
selectCellAtLocation(0, 0);
}
int ExpressionsListController::reusableCellCount(int type) {
return k_maxNumberOfRows;
}
void ExpressionsListController::viewDidDisappear() {
ListController::viewDidDisappear();
// Reset layout and cell memoization to avoid taking extra space in the pool
for (int i = 0; i < k_maxNumberOfRows; i++) {
m_cells[i].setLayout(Layout());
/* By reseting m_layouts, numberOfRow will go down to 0, and the highlighted
* cells won't be unselected. Therefore we unselect them here. */
m_cells[i].setHighlighted(false);
m_layouts[i] = Layout();
}
m_expression = Expression();
}
HighlightCell * ExpressionsListController::reusableCell(int index, int type) {
return &m_cells[index];
}
KDCoordinate ExpressionsListController::rowHeight(int j) {
Layout l = layoutAtIndex(j);
assert(!l.isUninitialized());
return l.layoutSize().height() + 2 * Metric::CommonSmallMargin + Metric::CellSeparatorThickness;
}
void ExpressionsListController::willDisplayCellForIndex(HighlightCell * cell, int index) {
/* Note : To further optimize memoization space in the pool, layout
* serialization could be memoized instead, and layout would be recomputed
* here, when setting cell's layout. */
ExpressionTableCellWithPointer * myCell = static_cast<ExpressionTableCellWithPointer *>(cell);
myCell->setLayout(layoutAtIndex(index));
myCell->setAccessoryMessage(messageAtIndex(index));
myCell->reloadScroll();
}
int ExpressionsListController::numberOfRows() const {
int nbOfRows = 0;
for (size_t i = 0; i < k_maxNumberOfRows; i++) {
if (!m_layouts[i].isUninitialized()) {
nbOfRows++;
}
}
return nbOfRows;
}
void ExpressionsListController::setExpression(Poincare::Expression e) {
// Reinitialize memoization
for (int i = 0; i < k_maxNumberOfRows; i++) {
m_layouts[i] = Layout();
}
m_expression = e;
}
Poincare::Layout ExpressionsListController::layoutAtIndex(int index) {
assert(!m_layouts[index].isUninitialized());
return m_layouts[index];
}
int ExpressionsListController::textAtIndex(char * buffer, size_t bufferSize, int index) {
return m_layouts[index].serializeParsedExpression(buffer, bufferSize, App::app()->localContext());
}
}

View File

@@ -0,0 +1,46 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_EXPRESSIONS_LIST_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_EXPRESSIONS_LIST_CONTROLLER_H
#include <escher.h>
#include <poincare/expression.h>
#include <apps/i18n.h>
#include "list_controller.h"
namespace Calculation {
class ExpressionsListController : public ListController {
public:
ExpressionsListController(EditExpressionController * editExpressionController);
// Responder
void viewDidDisappear() override;
void didEnterResponderChain(Responder * previousFirstResponder) override;
//ListViewDataSource
int reusableCellCount(int type) override;
HighlightCell * reusableCell(int index, int type) override;
KDCoordinate rowHeight(int j) override;
int typeAtLocation(int i, int j) override { return 0; }
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
int numberOfRows() const override;
// IllustratedListController
void setExpression(Poincare::Expression e) override;
protected:
constexpr static int k_maxNumberOfRows = 5;
int textAtIndex(char * buffer, size_t bufferSize, int index) override;
Poincare::Expression m_expression;
// Memoization of layouts
mutable Poincare::Layout m_layouts[k_maxNumberOfRows];
private:
Poincare::Layout layoutAtIndex(int index);
virtual I18n::Message messageAtIndex(int index) = 0;
// Cells
ExpressionTableCellWithPointer m_cells[k_maxNumberOfRows];
};
}
#endif

View File

@@ -0,0 +1,133 @@
#include "illustrated_list_controller.h"
#include <poincare/exception_checkpoint.h>
#include <poincare/symbol.h>
#include "../app.h"
using namespace Poincare;
namespace Calculation {
/* Illustrated list controller */
IllustratedListController::IllustratedListController(EditExpressionController * editExpressionController) :
ListController(editExpressionController, this),
m_calculationStore(m_calculationStoreBuffer, k_calculationStoreBufferSize),
m_additionalCalculationCells{}
{
for (int i = 0; i < k_maxNumberOfAdditionalCalculations; i++) {
m_additionalCalculationCells[i].setParentResponder(m_listController.selectableTableView());
}
}
void IllustratedListController::didEnterResponderChain(Responder * previousFirstResponder) {
// Select the left subview on all cells and reinitialize scroll
for (int i = 0; i < k_maxNumberOfAdditionalCalculations; i++) {
m_additionalCalculationCells[i].reinitSelection();
}
selectCellAtLocation(0, 1);
}
void IllustratedListController::viewDidDisappear() {
ListController::viewDidDisappear();
// Reset the context as it was before displaying the IllustratedListController
Poincare::Context * context = App::app()->localContext();
if (m_savedExpression.isUninitialized()) {
/* If no expression was stored in the symbol used by the
* IllustratedListController, we delete the record we stored */
char symbolName[3];
size_t length = UTF8Decoder::CodePointToChars(expressionSymbol(), symbolName, 3);
assert(length < 3);
symbolName[length] = 0;
const char * const extensions[2] = {"exp", "func"};
Ion::Storage::sharedStorage()->recordBaseNamedWithExtensions(symbolName, extensions, 2).destroy();
} else {
Poincare::Symbol s = Poincare::Symbol::Builder(expressionSymbol());
context->setExpressionForSymbolAbstract(m_savedExpression, s);
}
// Reset cell memoization to avoid taking extra space in the pool
for (int i = 0; i < k_maxNumberOfAdditionalCalculations; i++) {
m_additionalCalculationCells[i].resetMemoization();
}
}
int IllustratedListController::numberOfRows() const {
return m_calculationStore.numberOfCalculations() + 1;
}
int IllustratedListController::reusableCellCount(int type) {
assert(type < 2);
if (type == 0) {
return 1;
}
return k_maxNumberOfAdditionalCalculations;
}
HighlightCell * IllustratedListController::reusableCell(int index, int type) {
assert(type < 2);
assert(index >= 0);
if (type == 0) {
return illustrationCell();
}
return &m_additionalCalculationCells[index];
}
KDCoordinate IllustratedListController::rowHeight(int j) {
if (j == 0) {
return k_illustrationHeight;
}
int calculationIndex = j-1;
if (calculationIndex >= m_calculationStore.numberOfCalculations()) {
return 0;
}
Shared::ExpiringPointer<Calculation> calculation = m_calculationStore.calculationAtIndex(calculationIndex);
constexpr bool expanded = true;
return calculation->height(expanded) + Metric::CellSeparatorThickness;
}
int IllustratedListController::typeAtLocation(int i, int j) {
return j == 0 ? 0 : 1;
}
void IllustratedListController::willDisplayCellForIndex(HighlightCell * cell, int index) {
if (index == 0) {
return;
}
Poincare::Context * context = App::app()->localContext();
ScrollableThreeExpressionsCell * myCell = (ScrollableThreeExpressionsCell *)cell;
Calculation * c = m_calculationStore.calculationAtIndex(index-1).pointer();
myCell->setCalculation(c);
myCell->setDisplayCenter(c->displayOutput(context) != Calculation::DisplayOutput::ApproximateOnly);
}
void IllustratedListController::tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY, bool withinTemporarySelection) {
if (withinTemporarySelection) {
return;
}
// Forbid selecting Illustration cell
if (t->selectedRow() == 0) {
t->selectCellAtLocation(0, 1);
}
/* But scroll to the top when we select the first
* ScrollableThreeExpressionsCell in order display the
* illustration cell. */
if (t->selectedRow() == 1) {
t->scrollToCell(0, 0);
}
}
void IllustratedListController::setExpression(Poincare::Expression e) {
m_calculationStore.deleteAll();
Poincare::Context * context = App::app()->localContext();
Poincare::Symbol s = Poincare::Symbol::Builder(expressionSymbol());
m_savedExpression = context->expressionForSymbolAbstract(s, false);
context->setExpressionForSymbolAbstract(e, s);
}
int IllustratedListController::textAtIndex(char * buffer, size_t bufferSize, int index) {
ScrollableThreeExpressionsCell * myCell = static_cast<ScrollableThreeExpressionsCell *>(m_listController.selectableTableView()->selectedCell());
Shared::ExpiringPointer<Calculation> c = m_calculationStore.calculationAtIndex(index-1);
const char * text = myCell->selectedSubviewPosition() == ScrollableThreeExpressionsView::SubviewPosition::Right ? c->approximateOutputText(Calculation::NumberOfSignificantDigits::Maximal) : c->exactOutputText();
return strlcpy(buffer, text, bufferSize);
}
}

View File

@@ -0,0 +1,54 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_ILLUSTRATED_LIST_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_ILLUSTRATED_LIST_CONTROLLER_H
#include <escher.h>
#include "scrollable_three_expressions_cell.h"
#include "list_controller.h"
#include "../calculation_store.h"
#include <apps/i18n.h>
namespace Calculation {
class IllustratedListController : public ListController, public SelectableTableViewDelegate {
public:
IllustratedListController(EditExpressionController * editExpressionController);
// Responder
void viewDidDisappear() override;
void didEnterResponderChain(Responder * previousFirstResponder) override;
//ListViewDataSource
int numberOfRows() const override;
int reusableCellCount(int type) override;
HighlightCell * reusableCell(int index, int type) override;
KDCoordinate rowHeight(int j) override;
int typeAtLocation(int i, int j) override;
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
// SelectableTableViewDelegate
void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY, bool withinTemporarySelection) override;
// IllustratedListController
void setExpression(Poincare::Expression e) override;
constexpr static KDCoordinate k_illustrationHeight = 120;
protected:
static KDCoordinate CalculationHeight(Calculation * c, bool expanded) { return ScrollableThreeExpressionsCell::Height(c); }
Poincare::Expression m_savedExpression;
CalculationStore m_calculationStore;
private:
int textAtIndex(char * buffer, size_t bufferSize, int index) override;
virtual CodePoint expressionSymbol() const = 0;
// Set the size of the buffer needed to store the additional calculation
constexpr static int k_maxNumberOfAdditionalCalculations = 4;
constexpr static int k_calculationStoreBufferSize = k_maxNumberOfAdditionalCalculations * (sizeof(Calculation) + Calculation::k_numberOfExpressions * Constant::MaxSerializedExpressionSize + sizeof(Calculation *));
char m_calculationStoreBuffer[k_calculationStoreBufferSize];
// Cells
virtual HighlightCell * illustrationCell() = 0;
ScrollableThreeExpressionsCell m_additionalCalculationCells[k_maxNumberOfAdditionalCalculations];
};
}
#endif

View File

@@ -0,0 +1,16 @@
#include "illustration_cell.h"
using namespace Shared;
using namespace Poincare;
namespace Calculation {
void IllustrationCell::layoutSubviews(bool force) {
view()->setFrame(KDRect(Metric::CellSeparatorThickness, Metric::CellSeparatorThickness, bounds().width() - 2*Metric::CellSeparatorThickness, bounds().height() - 2*Metric::CellSeparatorThickness), force);
}
void IllustrationCell::drawRect(KDContext * ctx, KDRect rect) const {
drawBorderOfRect(ctx, bounds(), *Palette::ListCellBorder);
}
}

View File

@@ -0,0 +1,23 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_ILLUSTRATION_CELL_H
#define CALCULATION_ADDITIONAL_OUTPUTS_ILLUSTRATION_CELL_H
#include <escher/bordered.h>
#include <escher/highlight_cell.h>
namespace Calculation {
class IllustrationCell : public Bordered, public HighlightCell {
public:
void setHighlighted(bool highlight) override { return; }
void drawRect(KDContext * ctx, KDRect rect) const override;
private:
int numberOfSubviews() const override { return 1; }
View * subviewAtIndex(int index) override { return view(); }
void layoutSubviews(bool force = false) override;
virtual View * view() = 0;
};
}
#endif

View File

@@ -0,0 +1,55 @@
#include "integer_list_controller.h"
#include <poincare/based_integer.h>
#include <poincare/integer.h>
#include <poincare/empty_layout.h>
#include <poincare/factor.h>
#include "../app.h"
#include "../../shared/poincare_helpers.h"
using namespace Poincare;
using namespace Shared;
namespace Calculation {
Integer::Base baseAtIndex(int index) {
switch (index) {
case 0:
return Integer::Base::Decimal;
case 1:
return Integer::Base::Hexadecimal;
default:
assert(index == 2);
return Integer::Base::Binary;
}
}
void IntegerListController::setExpression(Poincare::Expression e) {
ExpressionsListController::setExpression(e);
static_assert(k_maxNumberOfRows >= k_indexOfFactorExpression + 1, "k_maxNumberOfRows must be greater than k_indexOfFactorExpression");
assert(!m_expression.isUninitialized() && m_expression.type() == ExpressionNode::Type::BasedInteger);
Integer integer = static_cast<BasedInteger &>(m_expression).integer();
for (int index = 0; index < k_indexOfFactorExpression; ++index) {
m_layouts[index] = integer.createLayout(baseAtIndex(index));
}
// Computing factorExpression
Expression factor = Factor::Builder(m_expression.clone());
PoincareHelpers::Simplify(&factor, App::app()->localContext(), ExpressionNode::ReductionTarget::User);
if (!factor.isUndefined()) {
m_layouts[k_indexOfFactorExpression] = PoincareHelpers::CreateLayout(factor);
}
}
I18n::Message IntegerListController::messageAtIndex(int index) {
switch (index) {
case 0:
return I18n::Message::DecimalBase;
case 1:
return I18n::Message::HexadecimalBase;
case 2:
return I18n::Message::BinaryBase;
default:
return I18n::Message::PrimeFactors;
}
}
}

View File

@@ -0,0 +1,24 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_INTEGER_LIST_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_INTEGER_LIST_CONTROLLER_H
#include "expressions_list_controller.h"
namespace Calculation {
class IntegerListController : public ExpressionsListController {
public:
IntegerListController(EditExpressionController * editExpressionController) :
ExpressionsListController(editExpressionController) {}
void setExpression(Poincare::Expression e) override;
private:
static constexpr int k_indexOfFactorExpression = 3;
I18n::Message messageAtIndex(int index) override;
};
}
#endif

View File

@@ -0,0 +1,50 @@
#include "list_controller.h"
#include "../edit_expression_controller.h"
using namespace Poincare;
namespace Calculation {
/* Inner List Controller */
ListController::InnerListController::InnerListController(ListController * dataSource, SelectableTableViewDelegate * delegate) :
ViewController(dataSource),
m_selectableTableView(this, dataSource, dataSource, delegate)
{
m_selectableTableView.setMargins(0);
m_selectableTableView.setDecoratorType(ScrollView::Decorator::Type::None);
}
void ListController::InnerListController::didBecomeFirstResponder() {
m_selectableTableView.reloadData();
}
/* List Controller */
ListController::ListController(EditExpressionController * editExpressionController, SelectableTableViewDelegate * delegate) :
StackViewController(nullptr, &m_listController, *Palette::ToolboxHeaderText, *Palette::ToolboxHeaderBackground, *Palette::ToolboxHeaderBorder),
m_listController(this, delegate),
m_editExpressionController(editExpressionController)
{
}
bool ListController::handleEvent(Ion::Events::Event event) {
if (event == Ion::Events::OK || event == Ion::Events::EXE) {
char buffer[Constant::MaxSerializedExpressionSize];
textAtIndex(buffer, Constant::MaxSerializedExpressionSize, selectedRow());
/* The order is important here: we dismiss the pop-up first because it
* clears the Poincare pool from the layouts used to display the pop-up.
* Thereby it frees memory to do Poincare computations required by
* insertTextBody. */
Container::activeApp()->dismissModalViewController();
m_editExpressionController->insertTextBody(buffer);
return true;
}
return false;
}
void ListController::didBecomeFirstResponder() {
Container::activeApp()->setFirstResponder(&m_listController);
}
}

View File

@@ -0,0 +1,41 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_LIST_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_LIST_CONTROLLER_H
#include <escher.h>
#include <apps/i18n.h>
namespace Calculation {
class EditExpressionController;
class ListController : public StackViewController, public ListViewDataSource, public SelectableTableViewDataSource {
public:
ListController(EditExpressionController * editExpressionController, SelectableTableViewDelegate * delegate = nullptr);
// Responder
bool handleEvent(Ion::Events::Event event) override;
void didBecomeFirstResponder() override;
// ListController
virtual void setExpression(Poincare::Expression e) = 0;
protected:
class InnerListController : public ViewController {
public:
InnerListController(ListController * dataSource, SelectableTableViewDelegate * delegate = nullptr);
const char * title() override { return I18n::translate(I18n::Message::AdditionalResults); }
View * view() override { return &m_selectableTableView; }
void didBecomeFirstResponder() override;
SelectableTableView * selectableTableView() { return &m_selectableTableView; }
private:
SelectableTableView m_selectableTableView;
};
virtual int textAtIndex(char * buffer, size_t bufferSize, int index) = 0;
InnerListController m_listController;
EditExpressionController * m_editExpressionController;
};
}
#endif

View File

@@ -0,0 +1,106 @@
#include "matrix_list_controller.h"
#include "../app.h"
#include "../../shared/poincare_helpers.h"
#include <apps/global_preferences.h>
#include <poincare_nodes.h>
#include <poincare/matrix.h>
#include <string.h>
using namespace Poincare;
using namespace Shared;
namespace Calculation {
void MatrixListController::setExpression(Poincare::Expression e) {
ExpressionsListController::setExpression(e);
assert(!m_expression.isUninitialized());
static_assert(k_maxNumberOfRows >= k_maxNumberOfOutputRows, "k_maxNumberOfRows must be greater than k_maxNumberOfOutputRows");
Poincare::Preferences * preferences = Poincare::Preferences::sharedPreferences();
Poincare::Preferences::ComplexFormat currentComplexFormat = preferences->complexFormat();
if (currentComplexFormat == Poincare::Preferences::ComplexFormat::Real) {
/* Temporary change complex format to avoid all additional expressions to be
* "unreal" (with [i] for instance). As additional results are computed from
* the output, which is built taking ComplexFormat into account, there are
* no risks of displaying additional results on an unreal output. */
preferences->setComplexFormat(Poincare::Preferences::ComplexFormat::Cartesian);
}
Context * context = App::app()->localContext();
ExpressionNode::ReductionContext reductionContext(
context,
preferences->complexFormat(),
preferences->angleUnit(),
GlobalPreferences::sharedGlobalPreferences()->unitFormat(),
ExpressionNode::ReductionTarget::SystemForApproximation,
ExpressionNode::SymbolicComputation::ReplaceAllSymbolsWithDefinitionsOrUndefined);
// The expression must be reduced to call methods such as determinant or trace
assert(m_expression.type() == ExpressionNode::Type::Matrix);
bool mIsSquared = (static_cast<Matrix &>(m_expression).numberOfRows() == static_cast<Matrix &>(m_expression).numberOfColumns());
size_t index = 0;
size_t messageIndex = 0;
// 1. Matrix determinant if square matrix
if (mIsSquared) {
/* Determinant is reduced so that a null determinant can be detected.
* However, some exceptions remain such as cos(x)^2+sin(x)^2-1 which will
* not be reduced to a rational, but will be null in theory. */
Expression determinant = Determinant::Builder(m_expression.clone()).reduce(reductionContext);
m_indexMessageMap[index] = messageIndex++;
m_layouts[index++] = getLayoutFromExpression(determinant, context, preferences);
// 2. Matrix inverse if invertible matrix
// A squared matrix is invertible if and only if determinant is non null
if (!determinant.isUndefined() && determinant.nullStatus(context) != ExpressionNode::NullStatus::Null) {
// TODO: Handle ExpressionNode::NullStatus::Unknown
m_indexMessageMap[index] = messageIndex++;
m_layouts[index++] = getLayoutFromExpression(MatrixInverse::Builder(m_expression.clone()), context, preferences);
}
}
// 3. Matrix row echelon form
messageIndex = 2;
Expression rowEchelonForm = MatrixRowEchelonForm::Builder(m_expression.clone());
m_indexMessageMap[index] = messageIndex++;
m_layouts[index++] = getLayoutFromExpression(rowEchelonForm, context, preferences);
/* 4. Matrix reduced row echelon form
* it can be computed from row echelon form to save computation time.*/
m_indexMessageMap[index] = messageIndex++;
m_layouts[index++] = getLayoutFromExpression(MatrixReducedRowEchelonForm::Builder(rowEchelonForm), context, preferences);
// 5. Matrix trace if square matrix
if (mIsSquared) {
m_indexMessageMap[index] = messageIndex++;
m_layouts[index++] = getLayoutFromExpression(MatrixTrace::Builder(m_expression.clone()), context, preferences);
}
// Reset complex format as before
preferences->setComplexFormat(currentComplexFormat);
}
Poincare::Layout MatrixListController::getLayoutFromExpression(Expression e, Context * context, Poincare::Preferences * preferences) {
assert(!e.isUninitialized());
// Simplify or approximate expression
Expression approximateExpression;
Expression simplifiedExpression;
e.simplifyAndApproximate(&simplifiedExpression, &approximateExpression, context,
preferences->complexFormat(), preferences->angleUnit(), GlobalPreferences::sharedGlobalPreferences()->unitFormat(),
ExpressionNode::SymbolicComputation::ReplaceAllSymbolsWithDefinitionsOrUndefined);
// simplify might have been interrupted, in which case we use approximate
if (simplifiedExpression.isUninitialized()) {
assert(!approximateExpression.isUninitialized());
return Shared::PoincareHelpers::CreateLayout(approximateExpression);
}
return Shared::PoincareHelpers::CreateLayout(simplifiedExpression);
}
I18n::Message MatrixListController::messageAtIndex(int index) {
// Message index is mapped in setExpression because it depends on the Matrix.
assert(index < k_maxNumberOfOutputRows && index >=0);
I18n::Message messages[k_maxNumberOfOutputRows] = {
I18n::Message::AdditionalDeterminant,
I18n::Message::AdditionalInverse,
I18n::Message::AdditionalRowEchelonForm,
I18n::Message::AdditionalReducedRowEchelonForm,
I18n::Message::AdditionalTrace};
return messages[m_indexMessageMap[index]];
}
}

View File

@@ -0,0 +1,27 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_MATRIX_LIST_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_MATRIX_LIST_CONTROLLER_H
#include "expressions_list_controller.h"
namespace Calculation {
class MatrixListController : public ExpressionsListController {
public:
MatrixListController(EditExpressionController * editExpressionController) :
ExpressionsListController(editExpressionController) {}
void setExpression(Poincare::Expression e) override;
private:
I18n::Message messageAtIndex(int index) override;
Poincare::Layout getLayoutFromExpression(Poincare::Expression e, Poincare::Context * context, Poincare::Preferences * preferences);
// Map from cell index to message index
constexpr static int k_maxNumberOfOutputRows = 5;
int m_indexMessageMap[k_maxNumberOfOutputRows];
};
}
#endif

View File

@@ -0,0 +1,60 @@
#include "rational_list_controller.h"
#include "../app.h"
#include "../../shared/poincare_helpers.h"
#include <poincare_nodes.h>
#include <string.h>
using namespace Poincare;
using namespace Shared;
namespace Calculation {
Integer extractInteger(const Expression e) {
assert(e.type() == ExpressionNode::Type::BasedInteger);
return static_cast<const BasedInteger &>(e).integer();
}
void RationalListController::setExpression(Poincare::Expression e) {
ExpressionsListController::setExpression(e);
assert(!m_expression.isUninitialized());
static_assert(k_maxNumberOfRows >= 2, "k_maxNumberOfRows must be greater than 2");
bool negative = false;
Expression div = m_expression;
if (m_expression.type() == ExpressionNode::Type::Opposite) {
negative = true;
div = m_expression.childAtIndex(0);
}
assert(div.type() == ExpressionNode::Type::Division);
Integer numerator = extractInteger(div.childAtIndex(0));
numerator.setNegative(negative);
Integer denominator = extractInteger(div.childAtIndex(1));
int index = 0;
m_layouts[index++] = PoincareHelpers::CreateLayout(Integer::CreateMixedFraction(numerator, denominator));
m_layouts[index++] = PoincareHelpers::CreateLayout(Integer::CreateEuclideanDivision(numerator, denominator));
}
I18n::Message RationalListController::messageAtIndex(int index) {
switch (index) {
case 0:
return I18n::Message::MixedFraction;
default:
return I18n::Message::EuclideanDivision;
}
}
int RationalListController::textAtIndex(char * buffer, size_t bufferSize, int index) {
int length = ExpressionsListController::textAtIndex(buffer, bufferSize, index);
if (index == 1) {
// Get rid of the left part of the equality
char * equalPosition = strchr(buffer, '=');
assert(equalPosition != nullptr);
strlcpy(buffer, equalPosition + 1, bufferSize);
return buffer + length - 1 - equalPosition;
}
return length;
}
}

View File

@@ -0,0 +1,24 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_RATIONAL_LIST_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_RATIONAL_LIST_CONTROLLER_H
#include "expressions_list_controller.h"
namespace Calculation {
class RationalListController : public ExpressionsListController {
public:
RationalListController(EditExpressionController * editExpressionController) :
ExpressionsListController(editExpressionController) {}
void setExpression(Poincare::Expression e) override;
private:
I18n::Message messageAtIndex(int index) override;
int textAtIndex(char * buffer, size_t bufferSize, int index) override;
};
}
#endif

View File

@@ -0,0 +1,101 @@
#include "scrollable_three_expressions_cell.h"
#include <poincare/exception_checkpoint.h>
#include "../app.h"
namespace Calculation {
void ScrollableThreeExpressionsView::resetMemoization() {
setLayouts(Poincare::Layout(), Poincare::Layout(), Poincare::Layout());
}
// TODO: factorize with HistoryViewCell!
void ScrollableThreeExpressionsView::setCalculation(Calculation * calculation, bool canChangeDisplayOutput) {
Poincare::Context * context = App::app()->localContext();
// Clean the layouts to make room in the pool
resetMemoization();
// Create the input layout
Poincare::Layout inputLayout = calculation->createInputLayout();
// Create the exact output layout
Poincare::Layout exactOutputLayout = Poincare::Layout();
if (Calculation::DisplaysExact(calculation->displayOutput(context))) {
bool couldNotCreateExactLayout = false;
exactOutputLayout = calculation->createExactOutputLayout(&couldNotCreateExactLayout);
if (couldNotCreateExactLayout) {
if (canChangeDisplayOutput && calculation->displayOutput(context) != ::Calculation::Calculation::DisplayOutput::ExactOnly) {
calculation->forceDisplayOutput(::Calculation::Calculation::DisplayOutput::ApproximateOnly);
} else {
Poincare::ExceptionCheckpoint::Raise();
}
}
}
Calculation::DisplayOutput displayOutput = calculation->displayOutput(context);
// Create the approximate output layout
Poincare::Layout approximateOutputLayout = Poincare::Layout();
if (displayOutput == Calculation::DisplayOutput::ExactOnly) {
approximateOutputLayout = exactOutputLayout;
} else {
bool couldNotCreateApproximateLayout = false;
approximateOutputLayout = calculation->createApproximateOutputLayout(context, &couldNotCreateApproximateLayout);
if (couldNotCreateApproximateLayout) {
if (canChangeDisplayOutput && calculation->displayOutput(context) != ::Calculation::Calculation::DisplayOutput::ApproximateOnly) {
/* Set the display output to ApproximateOnly, make room in the pool by
* erasing the exact layout, and retry to create the approximate layout */
calculation->forceDisplayOutput(::Calculation::Calculation::DisplayOutput::ApproximateOnly);
exactOutputLayout = Poincare::Layout();
couldNotCreateApproximateLayout = false;
approximateOutputLayout = calculation->createApproximateOutputLayout(context, &couldNotCreateApproximateLayout);
if (couldNotCreateApproximateLayout) {
Poincare::ExceptionCheckpoint::Raise();
}
} else {
Poincare::ExceptionCheckpoint::Raise();
}
}
}
setLayouts(inputLayout, exactOutputLayout, approximateOutputLayout);
I18n::Message equalMessage = calculation->exactAndApproximateDisplayedOutputsAreEqual(context) == Calculation::EqualSign::Equal ? I18n::Message::Equal : I18n::Message::AlmostEqual;
setEqualMessage(equalMessage);
/* The displayed input and outputs have changed. We need to re-layout the cell
* and re-initialize the scroll. */
layoutSubviews();
}
KDCoordinate ScrollableThreeExpressionsCell::Height(Calculation * calculation) {
ScrollableThreeExpressionsCell cell;
cell.setCalculation(calculation, true);
KDRect leftFrame = KDRectZero;
KDRect centerFrame = KDRectZero;
KDRect approximateSignFrame = KDRectZero;
KDRect rightFrame = KDRectZero;
cell.subviewFrames(&leftFrame, &centerFrame, &approximateSignFrame, &rightFrame);
KDRect unionedFrame = leftFrame.unionedWith(centerFrame).unionedWith(rightFrame);
return unionedFrame.height() + 2 * ScrollableThreeExpressionsView::k_margin;
}
void ScrollableThreeExpressionsCell::didBecomeFirstResponder() {
reinitSelection();
Container::activeApp()->setFirstResponder(&m_view);
}
void ScrollableThreeExpressionsCell::reinitSelection() {
m_view.setSelectedSubviewPosition(ScrollableThreeExpressionsView::SubviewPosition::Left);
m_view.reloadScroll();
}
void ScrollableThreeExpressionsCell::setCalculation(Calculation * calculation, bool canChangeDisplayOutput) {
m_view.setCalculation(calculation, canChangeDisplayOutput);
layoutSubviews();
}
void ScrollableThreeExpressionsCell::setDisplayCenter(bool display) {
m_view.setDisplayCenter(display);
layoutSubviews();
}
}

View File

@@ -0,0 +1,81 @@
#ifndef CALCULATION_SCROLLABLE_THREE_EXPRESSIONS_CELL_H
#define CALCULATION_SCROLLABLE_THREE_EXPRESSIONS_CELL_H
#include <escher.h>
#include "../../shared/scrollable_multiple_expressions_view.h"
#include "../calculation.h"
#include "expression_with_equal_sign_view.h"
#include <escher/palette.h>
namespace Calculation {
/* TODO There is factorizable code between this and Calculation::HistoryViewCell
* (at least setCalculation). */
class ScrollableThreeExpressionsView : public Shared::AbstractScrollableMultipleExpressionsView {
public:
static constexpr KDCoordinate k_margin = Metric::CommonSmallMargin;
ScrollableThreeExpressionsView(Responder * parentResponder) : Shared::AbstractScrollableMultipleExpressionsView(parentResponder, &m_contentCell), m_contentCell() {
setMargins(k_margin, k_margin, k_margin, k_margin); // Left Right margins are already added by TableCell
setBackgroundColor(*Palette::BackgroundApps);
}
void resetMemoization();
void setCalculation(Calculation * calculation, bool canChangeDisplayOutput);
void subviewFrames(KDRect * leftFrame, KDRect * centerFrame, KDRect * approximateSignFrame, KDRect * rightFrame) {
return m_contentCell.subviewFrames(leftFrame, centerFrame, approximateSignFrame, rightFrame);
}
private:
class ContentCell : public Shared::AbstractScrollableMultipleExpressionsView::ContentCell {
public:
ContentCell() : m_leftExpressionView() {}
KDColor backgroundColor() const override { return *Palette::BackgroundApps; }
void setEven(bool even) override { return; }
ExpressionView * leftExpressionView() const override { return const_cast<ExpressionWithEqualSignView *>(&m_leftExpressionView); }
private:
ExpressionWithEqualSignView m_leftExpressionView;
};
ContentCell * contentCell() override { return &m_contentCell; };
const ContentCell * constContentCell() const override { return &m_contentCell; };
ContentCell m_contentCell;
};
class ScrollableThreeExpressionsCell : public TableCell, public Responder {
public:
static KDCoordinate Height(Calculation * calculation);
ScrollableThreeExpressionsCell() :
Responder(nullptr),
m_view(this) {}
// Cell
Poincare::Layout layout() const override { return m_view.layout(); }
// Responder cell
Responder * responder() override {
return this;
}
void didBecomeFirstResponder() override;
// Table cell
View * labelView() const override { return (View *)&m_view; }
void setHighlighted(bool highlight) override { m_view.evenOddCell()->setHighlighted(highlight); }
void resetMemoization() { m_view.resetMemoization(); }
void setCalculation(Calculation * calculation, bool canChangeDisplayOutput = false);
void setDisplayCenter(bool display);
ScrollableThreeExpressionsView::SubviewPosition selectedSubviewPosition() { return m_view.selectedSubviewPosition(); }
void setSelectedSubviewPosition(ScrollableThreeExpressionsView::SubviewPosition subviewPosition) { m_view.setSelectedSubviewPosition(subviewPosition); }
void reinitSelection();
void subviewFrames(KDRect * leftFrame, KDRect * centerFrame, KDRect * approximateSignFrame, KDRect * rightFrame) {
return m_view.subviewFrames(leftFrame, centerFrame, approximateSignFrame, rightFrame);
}
private:
// Remove label margin added by TableCell because they're already handled by ScrollableThreeExpressionsView
KDCoordinate labelMargin() const override { return 0; }
ScrollableThreeExpressionsView m_view;
};
}
#endif

View File

@@ -0,0 +1,312 @@
#include "../app.h"
#include <apps/global_preferences.h>
#include "../../shared/poincare_helpers.h"
#include <poincare/layout_helper.h>
#include <poincare/code_point_layout.h>
#include <poincare/rational.h>
#include <poincare/opposite.h>
#include <poincare/addition.h>
#include <poincare/parenthesis.h>
#include <poincare/equal.h>
#include <poincare/subtraction.h>
#include <poincare/multiplication.h>
#include <poincare/division.h>
#include <poincare/square_root.h>
#include <poincare/symbol.h>
#include <poincare/power.h>
#include "second_degree_list_controller.h"
using namespace Poincare;
using namespace Shared;
namespace Calculation {
void SecondDegreeListController::setExpression(Poincare::Expression e) {
ExpressionsListController::setExpression(e);
assert(!m_expression.isUninitialized());
Expression polynomialCoefficients[Expression::k_maxNumberOfPolynomialCoefficients];
Context * context = App::app()->localContext();
Preferences * preferences = Preferences::sharedPreferences();
Poincare::ExpressionNode::ReductionContext reductionContext = Poincare::ExpressionNode::ReductionContext(context,
preferences->complexFormat(), preferences->angleUnit(),
GlobalPreferences::sharedGlobalPreferences()->unitFormat(),
ExpressionNode::ReductionTarget::SystemForApproximation,
ExpressionNode::SymbolicComputation::ReplaceAllDefinedSymbolsWithDefinition,
Poincare::ExpressionNode::UnitConversion::Default);
PoincareHelpers::Reduce(&m_expression, context, ExpressionNode::ReductionTarget::SystemForAnalysis);
int degree = m_expression.getPolynomialReducedCoefficients(
"x",
polynomialCoefficients,
context,
Expression::UpdatedComplexFormatWithExpressionInput(preferences->complexFormat(), m_expression, context),
preferences->angleUnit(),
GlobalPreferences::sharedGlobalPreferences()->unitFormat(),
ExpressionNode::SymbolicComputation::ReplaceAllDefinedSymbolsWithDefinition);
assert(degree == 2);
Expression a = polynomialCoefficients[2];
Expression b = polynomialCoefficients[1];
Expression c = polynomialCoefficients[0];
Expression delta = Subtraction::Builder(Power::Builder(b.clone(), Rational::Builder(2)), Multiplication::Builder(Rational::Builder(4), a.clone(), c.clone()));
PoincareHelpers::Simplify(&delta, context, ExpressionNode::ReductionTarget::SystemForApproximation);
// Alpha is -b/2a, but because after we use -α, we immediately store -α=-(-b/2a)=b/2a.
Expression minusAlpha = Division::Builder(b.clone(), Multiplication::Builder(Rational::Builder(2), a.clone()));
PoincareHelpers::Reduce(&minusAlpha, context, ExpressionNode::ReductionTarget::SystemForApproximation);
// Same thing for β
Expression minusBeta = Division::Builder(delta.clone(), Multiplication::Builder(Rational::Builder(4), a.clone()));
PoincareHelpers::Reduce(&minusBeta, context, ExpressionNode::ReductionTarget::SystemForApproximation);
enum MultiplicationTypeForA {
Nothing,
Minus,
Parenthesis,
Normal
};
MultiplicationTypeForA multiplicationTypeForA;
if (a.type() == ExpressionNode::Type::Rational && static_cast<const Rational &>(a).isOne()) {
multiplicationTypeForA = MultiplicationTypeForA::Nothing;
}
else if(a.type() == ExpressionNode::Type::Rational && static_cast<const Rational &>(a).isMinusOne()){
multiplicationTypeForA = MultiplicationTypeForA::Minus;
}
else if (a.type() == ExpressionNode::Type::Addition) {
multiplicationTypeForA = MultiplicationTypeForA::Parenthesis;
}
else {
multiplicationTypeForA = MultiplicationTypeForA::Normal;
}
PoincareHelpers::Simplify(&a, context, ExpressionNode::ReductionTarget::User);
/*
* Because when can't apply reduce or simplify to keep the
* canonized form we must beautify the expression manually
*/
Expression xMinusAlphaPowerTwo;
Expression alpha = getOppositeIfExists(minusAlpha, &reductionContext);
if (alpha.isUninitialized()) {
PoincareHelpers::Simplify(&minusAlpha, context, ExpressionNode::ReductionTarget::User);
xMinusAlphaPowerTwo = Power::Builder(Parenthesis::Builder(Addition::Builder(Symbol::Builder("x", strlen("x")), minusAlpha)), Rational::Builder(2));
}
else {
PoincareHelpers::Simplify(&alpha, context, ExpressionNode::ReductionTarget::User);
xMinusAlphaPowerTwo = Power::Builder(Parenthesis::Builder(Subtraction::Builder(Symbol::Builder("x", strlen("x")), alpha)), Rational::Builder(2));
}
Expression xMinusAlphaPowerTwoWithFactor;
switch (multiplicationTypeForA)
{
case MultiplicationTypeForA::Nothing:
xMinusAlphaPowerTwoWithFactor = xMinusAlphaPowerTwo;
break;
case MultiplicationTypeForA::Minus:
xMinusAlphaPowerTwoWithFactor = Multiplication::Builder(a.clone(), xMinusAlphaPowerTwo);
break;
case MultiplicationTypeForA::Parenthesis:
xMinusAlphaPowerTwoWithFactor = Multiplication::Builder(Parenthesis::Builder(a.clone()), xMinusAlphaPowerTwo);
break;
case MultiplicationTypeForA::Normal:
xMinusAlphaPowerTwoWithFactor = Multiplication::Builder(a.clone(), xMinusAlphaPowerTwo);
break;
default:
assert(false);
break;
}
Expression canonized;
Expression beta = getOppositeIfExists(minusBeta, &reductionContext);
if (beta.isUninitialized()) {
PoincareHelpers::Simplify(&minusBeta, context, ExpressionNode::ReductionTarget::User);
canonized = Subtraction::Builder(xMinusAlphaPowerTwoWithFactor, minusBeta);
}
else {
PoincareHelpers::Simplify(&beta, context, ExpressionNode::ReductionTarget::User);
canonized = Addition::Builder(xMinusAlphaPowerTwoWithFactor, beta);
}
Expression x0;
Expression x1;
if (delta.nullStatus(context) == ExpressionNode::NullStatus::Null) {
// x0 = x1 = -b/(2a)
x0 = Division::Builder(Opposite::Builder(b.clone()), Multiplication::Builder(Rational::Builder(2), a.clone()));
m_numberOfSolutions = 1;
PoincareHelpers::Simplify(&x0, context, ExpressionNode::ReductionTarget::SystemForApproximation);
}
else {
// x0 = (-b-sqrt(delta))/(2a)
x0 = Division::Builder(Subtraction::Builder(Opposite::Builder(b.clone()), SquareRoot::Builder(delta.clone())), Multiplication::Builder(Rational::Builder(2), a.clone()));
// x1 = (-b+sqrt(delta))/(2a)
x1 = Division::Builder(Addition::Builder(Opposite::Builder(b.clone()), SquareRoot::Builder(delta.clone())), Multiplication::Builder(Rational::Builder(2), a.clone()));
m_numberOfSolutions = 2;
PoincareHelpers::Simplify(&x0, context, ExpressionNode::ReductionTarget::SystemForApproximation);
PoincareHelpers::Simplify(&x1, context, ExpressionNode::ReductionTarget::SystemForApproximation);
if (x0.type() == ExpressionNode::Type::Unreal) {
assert(x1.type() == ExpressionNode::Type::Unreal);
m_numberOfSolutions = 0;
}
}
Expression factorized;
if (m_numberOfSolutions == 2) {
Expression firstFactor;
Expression secondFactor;
Expression x0Opposite = getOppositeIfExists(x0, &reductionContext);
if (x0Opposite.isUninitialized()) {
PoincareHelpers::Simplify(&x0, context, ExpressionNode::ReductionTarget::User);
firstFactor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), x0);
}
else {
PoincareHelpers::Simplify(&x0Opposite, context, ExpressionNode::ReductionTarget::User);
firstFactor = Addition::Builder(Symbol::Builder("x", strlen("x")), x0Opposite);
}
if (x0.type() == ExpressionNode::Type::Opposite) {
factorized = Parenthesis::Builder(Addition::Builder(Symbol::Builder("x", strlen("x")), x0.childAtIndex(0).clone()));
}
Expression x1Opposite = getOppositeIfExists(x1, &reductionContext);
if (x1Opposite.isUninitialized()) {
PoincareHelpers::Simplify(&x1, context, ExpressionNode::ReductionTarget::User);
secondFactor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), x1);
}
else {
PoincareHelpers::Simplify(&x1Opposite, context, ExpressionNode::ReductionTarget::User);
secondFactor = Addition::Builder(Symbol::Builder("x", strlen("x")), x1Opposite);
}
Expression solutionProduct = Multiplication::Builder(Parenthesis::Builder(firstFactor), Parenthesis::Builder(secondFactor));
switch (multiplicationTypeForA)
{
case MultiplicationTypeForA::Nothing:
factorized = solutionProduct;
break;
case MultiplicationTypeForA::Minus:
factorized = Multiplication::Builder(a.clone(), solutionProduct);
break;
case MultiplicationTypeForA::Parenthesis:
factorized = Multiplication::Builder(Parenthesis::Builder(a.clone()), solutionProduct);
break;
case MultiplicationTypeForA::Normal:
factorized = Multiplication::Builder(a.clone(), solutionProduct);
break;
default:
assert(false);
break;
}
}
else if (m_numberOfSolutions == 1) {
Expression x0Opposite = getOppositeIfExists(x0, &reductionContext);
Expression factor;
if (x0Opposite.isUninitialized()) {
PoincareHelpers::Simplify(&x0, context, ExpressionNode::ReductionTarget::User);
factor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), x0);
}
else {
PoincareHelpers::Simplify(&x0Opposite, context, ExpressionNode::ReductionTarget::User);
factor = Addition::Builder(Symbol::Builder("x", strlen("x")), x0Opposite);
}
Expression solutionProduct = Power::Builder(Parenthesis::Builder(factor), Rational::Builder(2));
switch (multiplicationTypeForA)
{
case MultiplicationTypeForA::Nothing:
factorized = solutionProduct;
break;
case MultiplicationTypeForA::Minus:
factorized = Multiplication::Builder(a.clone(), solutionProduct);
break;
case MultiplicationTypeForA::Parenthesis:
factorized = Multiplication::Builder(Parenthesis::Builder(a.clone()), solutionProduct);
break;
case MultiplicationTypeForA::Normal:
factorized = Multiplication::Builder(a.clone(), solutionProduct);
break;
default:
assert(false);
break;
}
}
PoincareHelpers::Simplify(&delta, context, ExpressionNode::ReductionTarget::User);
m_layouts[0] = PoincareHelpers::CreateLayout(canonized);
if (m_numberOfSolutions > 0) {
m_layouts[1] = PoincareHelpers::CreateLayout(factorized);
m_layouts[2] = PoincareHelpers::CreateLayout(delta);
m_layouts[3] = PoincareHelpers::CreateLayout(x0);
if (m_numberOfSolutions > 1) {
m_layouts[4] = PoincareHelpers::CreateLayout(x1);
}
}
else {
m_layouts[1] = PoincareHelpers::CreateLayout(delta);
}
}
Expression SecondDegreeListController::getOppositeIfExists(Expression e, Poincare::ExpressionNode::ReductionContext * reductionContext) {
if (e.isNumber() && e.sign(reductionContext->context()) == ExpressionNode::Sign::Negative) {
Number n = static_cast<Number&>(e);
return std::move(n.setSign(ExpressionNode::Sign::Positive));
}
else if (e.type() == ExpressionNode::Type::Multiplication && e.numberOfChildren() > 0 && e.childAtIndex(0).isNumber() && e.childAtIndex(0).sign(reductionContext->context()) == ExpressionNode::Sign::Negative) {
Multiplication m = static_cast<Multiplication&>(e);
if (m.childAtIndex(0).type() == ExpressionNode::Type::Rational && static_cast<Rational&>(e).isMinusOne()) {
// The negative numeral factor is -1, we just remove it
m.removeChildAtIndexInPlace(0);
} else {
Expression firstChild = m.childAtIndex(0);
Number n = static_cast<Number&>(firstChild);
m.childAtIndex(0).setChildrenInPlace(n.setSign(ExpressionNode::Sign::Positive));
}
PoincareHelpers::Simplify(&m, reductionContext->context(), ExpressionNode::ReductionTarget::User);
return std::move(m);
}
return Expression();
}
I18n::Message SecondDegreeListController::messageAtIndex(int index) {
if (m_numberOfSolutions > 0) {
if (index == 0) {
return I18n::Message::CanonicalForm;
}
if (index == 1) {
return I18n::Message::FactorizedForm;
}
if (index == 2) {
return I18n::Message::Discriminant;
}
if (index == 3) {
if (m_numberOfSolutions == 1) {
return I18n::Message::OnlyRoot;
}
else {
return I18n::Message::FirstRoot;
}
}
return I18n::Message::SecondRoot;
}
else {
switch (index) {
case 0:
return I18n::Message::CanonicalForm;
default:
return I18n::Message::Discriminant;
}
}
}
}

View File

@@ -0,0 +1,26 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_SECOND_DEGREE_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_SECOND_DEGREE_CONTROLLER_H
#include "expressions_list_controller.h"
namespace Calculation {
class SecondDegreeListController : public ExpressionsListController {
public:
SecondDegreeListController(EditExpressionController * editExpressionController) :
ExpressionsListController(editExpressionController),
m_numberOfSolutions(0) {}
void setExpression(Poincare::Expression e) override;
private:
Poincare::Expression getOppositeIfExists(Poincare::Expression e, Poincare::ExpressionNode::ReductionContext * reductionContext);
I18n::Message messageAtIndex(int index) override;
int m_numberOfSolutions;
};
}
#endif

View File

@@ -0,0 +1,38 @@
#include "trigonometry_graph_cell.h"
#include <escher/palette.h>
using namespace Shared;
using namespace Poincare;
namespace Calculation {
TrigonometryGraphView::TrigonometryGraphView(TrigonometryModel * model) :
CurveView(model),
m_model(model)
{
}
void TrigonometryGraphView::drawRect(KDContext * ctx, KDRect rect) const {
float s = std::sin(m_model->angle());
float c = std::cos(m_model->angle());
ctx->fillRect(rect, *Palette::BackgroundApps);
drawGrid(ctx, rect);
drawAxes(ctx, rect);
// Draw the circle
drawCurve(ctx, rect, 0.0f, 2.0f*M_PI, M_PI/180.0f, [](float t, void * model, void * context) {
return Poincare::Coordinate2D<float>(std::cos(t), std::sin(t));
}, nullptr, nullptr, true, *Palette::SecondaryText, false);
// Draw dashed segment to indicate sine and cosine
drawHorizontalOrVerticalSegment(ctx, rect, Axis::Vertical, c, 0.0f, s, *Palette::CalculationTrigoAndComplexForeground, 1, 3);
drawHorizontalOrVerticalSegment(ctx, rect, Axis::Horizontal, s, 0.0f, c, *Palette::CalculationTrigoAndComplexForeground, 1, 3);
// Draw angle position on the circle
drawDot(ctx, rect, c, s, *Palette::CalculationTrigoAndComplexForeground, Size::Large);
// Draw graduations
drawLabelsAndGraduations(ctx, rect, Axis::Vertical, false, true);
drawLabelsAndGraduations(ctx, rect, Axis::Horizontal, false, true);
// Draw labels
drawLabel(ctx, rect, 0.0f, s, "sin(θ)", *Palette::CalculationTrigoAndComplexForeground, c >= 0.0f ? CurveView::RelativePosition::Before : CurveView::RelativePosition::After, CurveView::RelativePosition::None);
drawLabel(ctx, rect, c, 0.0f, "cos(θ)", *Palette::CalculationTrigoAndComplexForeground, CurveView::RelativePosition::None, s >= 0.0f ? CurveView::RelativePosition::Before : CurveView::RelativePosition::After);
}
}

View File

@@ -0,0 +1,29 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_TRIGONOMETRY_GRAPH_CELL_H
#define CALCULATION_ADDITIONAL_OUTPUTS_TRIGONOMETRY_GRAPH_CELL_H
#include "../../shared/curve_view.h"
#include "trigonometry_model.h"
#include "illustration_cell.h"
namespace Calculation {
class TrigonometryGraphView : public Shared::CurveView {
public:
TrigonometryGraphView(TrigonometryModel * model);
void drawRect(KDContext * ctx, KDRect rect) const override;
private:
TrigonometryModel * m_model;
};
class TrigonometryGraphCell : public IllustrationCell {
public:
TrigonometryGraphCell(TrigonometryModel * model) : m_view(model) {}
private:
View * view() override { return &m_view; }
TrigonometryGraphView m_view;
};
}
#endif

View File

@@ -0,0 +1,23 @@
#include "trigonometry_list_controller.h"
#include "../app.h"
using namespace Poincare;
namespace Calculation {
void TrigonometryListController::setExpression(Poincare::Expression e) {
assert(e.type() == ExpressionNode::Type::Cosine || e.type() == ExpressionNode::Type::Sine);
IllustratedListController::setExpression(e.childAtIndex(0));
// Fill calculation store
Poincare::Context * context = App::app()->localContext();
m_calculationStore.push("sin(θ)", context, CalculationHeight);
m_calculationStore.push("cos(θ)", context, CalculationHeight);
m_calculationStore.push("θ", context, CalculationHeight);
// Set trigonometry illustration
float angle = Shared::PoincareHelpers::ApproximateToScalar<float>(m_calculationStore.calculationAtIndex(0)->approximateOutput(context, Calculation::NumberOfSignificantDigits::Maximal), context);
m_model.setAngle(angle);
}
}

View File

@@ -0,0 +1,25 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_TRIGONOMETRY_LIST_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_TRIGONOMETRY_LIST_CONTROLLER_H
#include "trigonometry_graph_cell.h"
#include "trigonometry_model.h"
#include "illustrated_list_controller.h"
namespace Calculation {
class TrigonometryListController : public IllustratedListController {
public:
TrigonometryListController(EditExpressionController * editExpressionController) :
IllustratedListController(editExpressionController),
m_graphCell(&m_model) {}
void setExpression(Poincare::Expression e) override;
private:
CodePoint expressionSymbol() const override { return UCodePointGreekSmallLetterTheta; }
HighlightCell * illustrationCell() override { return &m_graphCell; }
TrigonometryGraphCell m_graphCell;
TrigonometryModel m_model;
};
}
#endif

View File

@@ -0,0 +1,11 @@
#include "trigonometry_model.h"
namespace Calculation {
TrigonometryModel::TrigonometryModel() :
Shared::CurveViewRange(),
m_angle(NAN)
{
}
}

View File

@@ -0,0 +1,40 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_TRIGONOMETRY_MODEL_H
#define CALCULATION_ADDITIONAL_OUTPUTS_TRIGONOMETRY_MODEL_H
#include "../../shared/curve_view_range.h"
#include "illustrated_list_controller.h"
#include <complex>
#include <poincare/trigonometry.h>
namespace Calculation {
class TrigonometryModel : public Shared::CurveViewRange {
public:
TrigonometryModel();
// CurveViewRange
float xMin() const override { return -k_xHalfRange; }
float xMax() const override { return k_xHalfRange; }
float yMin() const override { return yCenter() - yHalfRange(); }
float yMax() const override { return yCenter() + yHalfRange(); }
void setAngle(float f) { m_angle = f; }
float angle() const { return m_angle*(float)M_PI/(float)Poincare::Trigonometry::PiInAngleUnit(Poincare::Preferences::sharedPreferences()->angleUnit()); }
private:
constexpr static float k_xHalfRange = 2.1f;
// We center the yRange around the semi-circle where the angle is
float yCenter() const { return std::sin(angle()) >= 0.0f ? 0.5f : -0.5f; }
/* We want to normalize the displayed trigonometry circle:
* - On the X axis, we display 4.4 units on an available pixel width of
* (Ion::Display::Width - Metric::PopUpRightMargin - Metric::PopUpLeftMargin)
* - On the Y axis, the available pixel height is
* IllustratedListController::k_illustrationHeight
*/
float yHalfRange() const { return IllustratedListController::k_illustrationHeight*k_xHalfRange/(Ion::Display::Width - Metric::PopUpRightMargin - Metric::PopUpLeftMargin); }
float m_angle;
};
}
#endif

View File

@@ -0,0 +1,96 @@
#include "unit_list_controller.h"
#include "../app.h"
#include "../../shared/poincare_helpers.h"
#include <poincare/unit_convert.h>
#include <poincare/multiplication.h>
#include <poincare/power.h>
#include <poincare/undefined.h>
#include <poincare/unit.h>
using namespace Poincare;
using namespace Shared;
namespace Calculation {
void UnitListController::setExpression(Poincare::Expression e) {
ExpressionsListController::setExpression(e);
assert(!m_expression.isUninitialized());
static_assert(k_maxNumberOfRows >= 3, "k_maxNumberOfRows must be greater than 3");
Poincare::Expression expressions[k_maxNumberOfRows];
// Initialize expressions
for (size_t i = 0; i < k_maxNumberOfRows; i++) {
expressions[i] = Expression();
}
/* 1. First rows: miscellaneous classic units for some dimensions, in both
* metric and imperial units. */
Expression copy = m_expression.clone();
Expression units;
// Reduce to be able to recognize units
PoincareHelpers::ReduceAndRemoveUnit(&copy, App::app()->localContext(), ExpressionNode::ReductionTarget::User, &units);
double value = Shared::PoincareHelpers::ApproximateToScalar<double>(copy, App::app()->localContext());
ExpressionNode::ReductionContext reductionContext(
App::app()->localContext(),
Preferences::sharedPreferences()->complexFormat(),
Preferences::sharedPreferences()->angleUnit(),
GlobalPreferences::sharedGlobalPreferences()->unitFormat(),
ExpressionNode::ReductionTarget::User,
ExpressionNode::SymbolicComputation::ReplaceAllSymbolsWithDefinitionsOrUndefined);
int numberOfExpressions = Unit::SetAdditionalExpressions(units, value, expressions, k_maxNumberOfRows, reductionContext);
// 2. SI units only
assert(numberOfExpressions < k_maxNumberOfRows - 1);
expressions[numberOfExpressions] = m_expression.clone();
Shared::PoincareHelpers::Simplify(&expressions[numberOfExpressions], App::app()->localContext(), ExpressionNode::ReductionTarget::User, Poincare::ExpressionNode::SymbolicComputation::ReplaceAllDefinedSymbolsWithDefinition, Poincare::ExpressionNode::UnitConversion::InternationalSystem);
numberOfExpressions++;
/* 3. Get rid of duplicates
* We find duplicates by comparing the serializations, to eliminate
* expressions that only differ by the types of their number nodes. */
Expression reduceExpression = m_expression.clone();
// Make m_expression comparable to expressions (turn BasedInteger into Rational for instance)
Shared::PoincareHelpers::Simplify(&reduceExpression, App::app()->localContext(), ExpressionNode::ReductionTarget::User, Poincare::ExpressionNode::SymbolicComputation::ReplaceAllDefinedSymbolsWithDefinition, Poincare::ExpressionNode::UnitConversion::None);
int currentExpressionIndex = 0;
while (currentExpressionIndex < numberOfExpressions) {
bool duplicateFound = false;
constexpr int buffersSize = Constant::MaxSerializedExpressionSize;
char buffer1[buffersSize];
int size1 = PoincareHelpers::Serialize(expressions[currentExpressionIndex], buffer1, buffersSize);
for (int i = 0; i < currentExpressionIndex + 1; i++) {
// Compare the currentExpression to all previous expressions and to m_expression
Expression comparedExpression = i == currentExpressionIndex ? reduceExpression : expressions[i];
assert(!comparedExpression.isUninitialized());
char buffer2[buffersSize];
int size2 = PoincareHelpers::Serialize(comparedExpression, buffer2, buffersSize);
if (size1 == size2 && strcmp(buffer1, buffer2) == 0) {
numberOfExpressions--;
// Shift next expressions
for (int j = currentExpressionIndex; j < numberOfExpressions; j++) {
expressions[j] = expressions[j+1];
}
// Remove last expression
expressions[numberOfExpressions] = Expression();
// The current expression has been discarded, no need to increment the current index
duplicateFound = true;
break;
}
}
if (!duplicateFound) {
// The current expression is not a duplicate, check next expression
currentExpressionIndex++;
}
}
// Memoize layouts
for (size_t i = 0; i < k_maxNumberOfRows; i++) {
if (!expressions[i].isUninitialized()) {
m_layouts[i] = Shared::PoincareHelpers::CreateLayout(expressions[i]);
}
}
}
I18n::Message UnitListController::messageAtIndex(int index) {
return (I18n::Message)0;
}
}

View File

@@ -0,0 +1,21 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_UNIT_LIST_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_UNIT_LIST_CONTROLLER_H
#include "expressions_list_controller.h"
namespace Calculation {
class UnitListController : public ExpressionsListController {
public:
UnitListController(EditExpressionController * editExpressionController) :
ExpressionsListController(editExpressionController) {}
void setExpression(Poincare::Expression e) override;
private:
I18n::Message messageAtIndex(int index) override;
};
}
#endif

View File

@@ -17,6 +17,10 @@ I18n::Message App::Descriptor::upperName() {
return I18n::Message::CalculAppCapital;
}
App::Descriptor::ExaminationLevel App::Descriptor::examinationLevel() {
return App::Descriptor::ExaminationLevel::Strict;
}
const Image * App::Descriptor::icon() {
return ImageStore::CalculationIcon;
}
@@ -27,6 +31,8 @@ App * App::Snapshot::unpack(Container * container) {
void App::Snapshot::reset() {
m_calculationStore.deleteAll();
m_cacheBuffer[0] = 0;
m_cacheBufferInformation = 0;
}
App::Descriptor * App::Snapshot::descriptor() {
@@ -34,14 +40,14 @@ App::Descriptor * App::Snapshot::descriptor() {
return &descriptor;
}
void App::Snapshot::tidy() {
m_calculationStore.tidy();
App::Snapshot::Snapshot() : m_calculationStore(m_calculationBuffer, k_calculationBufferSize)
{
}
App::App(Snapshot * snapshot) :
ExpressionFieldDelegateApp(snapshot, &m_editExpressionController),
m_historyController(&m_editExpressionController, snapshot->calculationStore()),
m_editExpressionController(&m_modalViewController, this, &m_historyController, snapshot->calculationStore())
m_editExpressionController(&m_modalViewController, this, snapshot->cacheBuffer(), snapshot->cacheBufferInformationAddress(), &m_historyController, snapshot->calculationStore())
{
}
@@ -62,11 +68,21 @@ bool App::layoutFieldDidReceiveEvent(::LayoutField * layoutField, Ion::Events::E
bool App::isAcceptableExpression(const Poincare::Expression expression) {
{
Expression ansExpression = static_cast<Snapshot *>(snapshot())->calculationStore()->ansExpression(localContext());
if (!TextFieldDelegateApp::ExpressionCanBeSerialized(expression, true, ansExpression)) {
if (!TextFieldDelegateApp::ExpressionCanBeSerialized(expression, true, ansExpression, localContext())) {
return false;
}
}
return !expression.isUninitialized();
}
void App::didBecomeActive(Window * window) {
m_editExpressionController.restoreInput();
Shared::ExpressionFieldDelegateApp::didBecomeActive(window);
}
void App::willBecomeInactive() {
m_editExpressionController.memoizeInput();
Shared::ExpressionFieldDelegateApp::willBecomeInactive();
}
}

View File

@@ -6,6 +6,7 @@
#include "history_controller.h"
#include "../shared/text_field_delegate_app.h"
#include <escher.h>
#include "../shared/shared_app.h"
namespace Calculation {
@@ -15,29 +16,40 @@ public:
public:
I18n::Message name() override;
I18n::Message upperName() override;
App::Descriptor::ExaminationLevel examinationLevel() override;
const Image * icon() override;
};
class Snapshot : public ::App::Snapshot {
class Snapshot : public ::SharedApp::Snapshot {
public:
Snapshot();
App * unpack(Container * container) override;
void reset() override;
Descriptor * descriptor() override;
CalculationStore * calculationStore() { return &m_calculationStore; }
char * cacheBuffer() { return m_cacheBuffer; }
size_t * cacheBufferInformationAddress() { return &m_cacheBufferInformation; }
private:
void tidy() override;
CalculationStore m_calculationStore;
// Set the size of the buffer needed to store the calculations
static constexpr int k_calculationBufferSize = 10 * (sizeof(Calculation) + Calculation::k_numberOfExpressions * Constant::MaxSerializedExpressionSize + sizeof(Calculation *));
char m_calculationBuffer[k_calculationBufferSize];
char m_cacheBuffer[EditExpressionController::k_cacheBufferSize];
size_t m_cacheBufferInformation;
};
static App * app() {
return static_cast<App *>(Container::activeApp());
}
TELEMETRY_ID("Calculation");
bool textFieldDidReceiveEvent(::TextField * textField, Ion::Events::Event event) override;
bool layoutFieldDidReceiveEvent(::LayoutField * layoutField, Ion::Events::Event event) override;
// TextFieldDelegateApp
bool isAcceptableExpression(const Poincare::Expression expression) override;
private:
App(Snapshot * snapshot);
HistoryController m_historyController;
void didBecomeActive(Window * window) override;
void willBecomeInactive() override;
EditExpressionController m_editExpressionController;
};

View File

@@ -1,2 +1,20 @@
CalculApp = "Berechnung"
CalculAppCapital = "BERECHNUNG"
AdditionalResults = "Weitere Ergebnisse"
DecimalBase = "Dezimal"
HexadecimalBase = "Hexadezimal"
BinaryBase = "Binär"
PrimeFactors = "Primfaktoren"
MixedFraction = "Gemischte Zahl"
EuclideanDivision = "Division mit Rest"
AdditionalDeterminant = "Determinante"
AdditionalInverse = "Inverse"
AdditionalRowEchelonForm = "Stufenform"
AdditionalReducedRowEchelonForm = "Reduzierte Stufenform"
AdditionalTrace = "Spur"
CanonicalForm = "Kanonische Form"
FactorizedForm = "Factorisierte Form"
Discriminant = "Diskriminante"
OnlyRoot = "Wurzel"
FirstRoot = "Erste Wurzel"
SecondRoot = "Zweite Wurzel"

View File

@@ -1,2 +1,20 @@
CalculApp = "Calculation"
CalculAppCapital = "CALCULATION"
AdditionalResults = "Additional results"
DecimalBase = "Decimal"
HexadecimalBase = "Hexadecimal"
BinaryBase = "Binary"
PrimeFactors = "Prime factors"
MixedFraction = "Mixed fraction"
EuclideanDivision = "Euclidean division"
AdditionalDeterminant = "Determinant"
AdditionalInverse = "Inverse"
AdditionalRowEchelonForm = "Row echelon form"
AdditionalReducedRowEchelonForm = "Reduced row echelon form"
AdditionalTrace = "Trace"
CanonicalForm = "Canonical form"
FactorizedForm = "Factorized form"
Discriminant = "Discriminant"
OnlyRoot = "Root"
FirstRoot = "First root"
SecondRoot = "Second root"

View File

@@ -1,2 +1,20 @@
CalculApp = "Cálculo"
CalculAppCapital = "CÁLCULO"
AdditionalResults = "Resultados adicionales"
DecimalBase = "Decimal"
HexadecimalBase = "Hexadecimal"
BinaryBase = "Binario"
PrimeFactors = "Factores primos"
MixedFraction = "Fracción mixta"
EuclideanDivision = "División euclidiana"
AdditionalDeterminant = "Determinante"
AdditionalInverse = "Inversa"
AdditionalRowEchelonForm = "Matriz escalonada"
AdditionalReducedRowEchelonForm = "Matriz escalonada reducida"
AdditionalTrace = "Traza"
CanonicalForm = "Forma canónica"
FactorizedForm = "Forma factorizada"
Discriminant = "Discriminante"
OnlyRoot = "Raíz"
FirstRoot = "Primera raíz"
SecondRoot = "Segunda raíz"

View File

@@ -1,2 +1,20 @@
CalculApp = "Calculs"
CalculAppCapital = "CALCULS"
AdditionalResults = "Résultats complémentaires"
DecimalBase = "Décimal"
HexadecimalBase = "Hexadécimal"
BinaryBase = "Binaire"
PrimeFactors = "Facteurs premiers"
MixedFraction = "Fraction mixte"
EuclideanDivision = "Division euclidienne"
AdditionalDeterminant = "Déterminant"
AdditionalInverse = "Inverse"
AdditionalRowEchelonForm = "Forme échelonnée"
AdditionalReducedRowEchelonForm = "Forme échelonnée réduite"
AdditionalTrace = "Trace"
CanonicalForm = "Forme canonique"
FactorizedForm = "Forme factorisée"
Discriminant = "Discriminant"
OnlyRoot = "Racine"
FirstRoot = "Première racine"
SecondRoot = "Seconde racine"

View File

@@ -0,0 +1,20 @@
CalculApp = "Számolás"
CalculAppCapital = "SZÁMOLÁS"
AdditionalResults = "További eredmények"
DecimalBase = "Decimális"
HexadecimalBase = "Hexadecimális"
BinaryBase = "Bináris"
PrimeFactors = "Alapvetö tényezök"
MixedFraction = "Vegyes frakció"
EuclideanDivision = "Euklideszi osztás"
AdditionalDeterminant = "Meghatározó"
AdditionalInverse = "inverz"
AdditionalRowEchelonForm = "Sor echelon forma"
AdditionalReducedRowEchelonForm = "Csökkentett sorú Echelon forma"
AdditionalTrace = "Nyomkövetés"
CanonicalForm = "Kanonikus forma"
FactorizedForm = "Factorizált forma"
Discriminant = "Discriminant"
OnlyRoot = "Gyökér"
FirstRoot = "Első gyökér"
SecondRoot = "Második gyökér"

View File

@@ -0,0 +1,20 @@
CalculApp = "Calcolo"
CalculAppCapital = "CALCOLO"
AdditionalResults = "Risultati complementari"
DecimalBase = "Decimale"
HexadecimalBase = "Esadecimale"
BinaryBase = "Binario"
PrimeFactors = "Fattorizzazione"
MixedFraction = "Frazione mista"
EuclideanDivision = "Divisione euclidea"
AdditionalDeterminant = "Determinante"
AdditionalInverse = "Inversa"
AdditionalRowEchelonForm = "Matrice a scalini"
AdditionalReducedRowEchelonForm = "Matrice ridotta a scalini"
AdditionalTrace = "Traccia"
CanonicalForm = "Forma canonica"
FactorizedForm = "Forma fattorizzata"
Discriminant = "Discriminante"
OnlyRoot = "Radice"
FirstRoot = "Prima radice"
SecondRoot = "Seconda radice"

View File

@@ -0,0 +1,20 @@
CalculApp = "Rekenen"
CalculAppCapital = "REKENEN"
AdditionalResults = "Aanvullende resultaten"
DecimalBase = "Decimaal"
HexadecimalBase = "Hexadecimaal"
BinaryBase = "Binair"
PrimeFactors = "Ontbinding"
MixedFraction = "Gemengde breuk"
EuclideanDivision = "Geheeltallige deling"
AdditionalDeterminant = "Determinant"
AdditionalInverse = "Inverse"
AdditionalRowEchelonForm = "Echelonvorm"
AdditionalReducedRowEchelonForm = "Gereduceerde echelonvorm"
AdditionalTrace = "Spoor"
CanonicalForm = "Canonische vorm"
FactorizedForm = "Factorized vorm"
Discriminant = "Discriminant"
OnlyRoot = "Wortel"
FirstRoot = "Eerste wortel"
SecondRoot = "Tweede wortel"

View File

@@ -1,2 +1,20 @@
CalculApp = "Cálculo"
CalculAppCapital = "CÁLCULO"
AdditionalResults = "Resultados adicionais"
DecimalBase = "Decimal"
HexadecimalBase = "Hexadecimal"
BinaryBase = "Binário"
PrimeFactors = "Fatorização"
MixedFraction = "Fração mista"
EuclideanDivision = "Divisão euclidiana"
AdditionalDeterminant = "Determinante"
AdditionalInverse = "Matriz inversa"
AdditionalRowEchelonForm = "Matriz escalonada"
AdditionalReducedRowEchelonForm = "Matriz escalonada reduzida"
AdditionalTrace = "Traço"
CanonicalForm = "Forma canónica"
FactorizedForm = "Factorized form"
Discriminant = "Discriminante"
OnlyRoot = "Raiz"
FirstRoot = "Primeira raiz"
SecondRoot = "Segunda raiz"

View File

@@ -1,21 +1,27 @@
#include "calculation.h"
#include "../shared/poincare_helpers.h"
#include "../shared/scrollable_multiple_expressions_view.h"
#include "../global_preferences.h"
#include "../exam_mode_configuration.h"
#include "app.h"
#include <poincare/exception_checkpoint.h>
#include <poincare/undefined.h>
#include <poincare/unit.h>
#include <poincare/unreal.h>
#include <poincare/symbol_abstract.h>
#include <string.h>
#include <cmath>
#include <algorithm>
using namespace Poincare;
using namespace Shared;
namespace Calculation {
static inline KDCoordinate maxCoordinate(KDCoordinate x, KDCoordinate y) { return x > y ? x : y; }
bool Calculation::operator==(const Calculation& c) {
return strcmp(inputText(), c.inputText()) == 0
&& strcmp(approximateOutputText(), c.approximateOutputText()) == 0
&& strcmp(approximateOutputText(NumberOfSignificantDigits::Maximal), c.approximateOutputText(NumberOfSignificantDigits::Maximal)) == 0
&& strcmp(approximateOutputText(NumberOfSignificantDigits::UserDefined), c.approximateOutputText(NumberOfSignificantDigits::UserDefined)) == 0
/* Some calculations can make appear trigonometric functions in their
* exact output. Their argument will be different with the angle unit
* preferences but both input and approximate output will be the same.
@@ -27,26 +33,23 @@ bool Calculation::operator==(const Calculation& c) {
Calculation * Calculation::next() const {
const char * result = reinterpret_cast<const char *>(this) + sizeof(Calculation);
for (int i = 0; i < 3; i++) {
result = result + strlen(result) + 1; // Pass inputText, exactOutputText, ApproximateOutputText
for (int i = 0; i < k_numberOfExpressions; i++) {
result = result + strlen(result) + 1; // Pass inputText, exactOutputText, ApproximateOutputText x2
}
return reinterpret_cast<Calculation *>(const_cast<char *>(result));
}
void Calculation::tidy() {
/* Reset height memoization (the complex format could have changed when
* re-entering Calculation app which would impact the heights). */
m_height = -1;
m_expandedHeight = -1;
}
const char * Calculation::approximateOutputText() const {
const char * Calculation::approximateOutputText(NumberOfSignificantDigits numberOfSignificantDigits) const {
const char * exactOutput = exactOutputText();
return exactOutput + strlen(exactOutput) + 1;
const char * approximateOutputTextWithMaxNumberOfDigits = exactOutput + strlen(exactOutput) + 1;
if (numberOfSignificantDigits == NumberOfSignificantDigits::Maximal) {
return approximateOutputTextWithMaxNumberOfDigits;
}
return approximateOutputTextWithMaxNumberOfDigits + strlen(approximateOutputTextWithMaxNumberOfDigits) + 1;
}
Expression Calculation::input() {
return Expression::Parse(m_inputText);
return Expression::Parse(m_inputText, nullptr);
}
Expression Calculation::exactOutput() {
@@ -54,67 +57,79 @@ Expression Calculation::exactOutput() {
* thereby avoid turning cos(Pi/4) into sqrt(2)/2 and displaying
* 'sqrt(2)/2 = 0.999906' (which is totally wrong) instead of
* 'cos(pi/4) = 0.999906' (which is true in degree). */
Expression exactOutput = Expression::Parse(exactOutputText());
Expression exactOutput = Expression::Parse(exactOutputText(), nullptr);
assert(!exactOutput.isUninitialized());
return exactOutput;
}
Expression Calculation::approximateOutput(Context * context) {
/* To ensure that the expression 'm_output' is a matrix or a complex, we
* call 'evaluate'. */
Expression exp = Expression::Parse(approximateOutputText());
Expression Calculation::approximateOutput(Context * context, NumberOfSignificantDigits numberOfSignificantDigits) {
Expression exp = Expression::Parse(approximateOutputText(numberOfSignificantDigits), nullptr);
assert(!exp.isUninitialized());
return PoincareHelpers::Approximate<double>(exp, context);
/* Warning:
* Since quite old versions of Epsilon, the Expression 'exp' was used to be
* approximated again to ensure its content was in the expected form - a
* linear combination of Decimal.
* However, since the approximate output may contain units and that a
* Poincare::Unit approximates to undef, thus it must not be approximated
* anymore.
* We have to keep two serializations of the approximation outputs:
* - one with the maximal significant digits, to be used by 'ans' or when
* handling 'OK' event on the approximation output.
* - one with the displayed number of significant digits that we parse to
* create the displayed layout. If we used the other serialization to
* create the layout, the result of the parsing could be an Integer which
* does not take the number of significant digits into account when creating
* its layout. This would lead to wrong number of significant digits in the
* layout.
* For instance:
* Number of asked significant digits: 7
* Input: "123456780", Approximate output: "1.234567E8"
*
* |--------------------------------------------------------------------------------------|
* | Number of significant digits | Approximate text | Parse expression | Layout |
* |------------------------------+------------------+---------------------+--------------|
* | Maximal | "123456780" | Integer(123456780) | "123456780" |
* |------------------------------+------------------+---------------------+--------------|
* | User defined | "1.234567E8" | Decimal(1.234567E8) | "1.234567E8" |
* |--------------------------------------------------------------------------------------|
*
*/
return exp;
}
Layout Calculation::createInputLayout() {
return input().createLayout(Preferences::PrintFloatMode::Decimal, PrintFloat::k_numberOfStoredSignificantDigits);
}
Layout Calculation::createExactOutputLayout() {
return PoincareHelpers::CreateLayout(exactOutput());
}
Layout Calculation::createApproximateOutputLayout(Context * context) {
return PoincareHelpers::CreateLayout(approximateOutput(context));
}
KDCoordinate Calculation::height(Context * context, bool expanded) {
KDCoordinate result = expanded ? m_expandedHeight : m_height;
if (result < 0) {
DisplayOutput display = displayOutput(context);
Layout inputLayout = createInputLayout();
KDCoordinate inputHeight = inputLayout.layoutSize().height();
if (display == DisplayOutput::ExactOnly) {
KDCoordinate exactOutputHeight = createExactOutputLayout().layoutSize().height();
result = inputHeight+exactOutputHeight;
} else if (display == DisplayOutput::ApproximateOnly || (!expanded && display == DisplayOutput::ExactAndApproximateToggle)) {
KDCoordinate approximateOutputHeight = createApproximateOutputLayout(context).layoutSize().height();
result = inputHeight+approximateOutputHeight;
} else {
assert(display == DisplayOutput::ExactAndApproximate || (display == DisplayOutput::ExactAndApproximateToggle && expanded));
Layout approximateLayout = createApproximateOutputLayout(context);
Layout exactLayout = createExactOutputLayout();
KDCoordinate approximateOutputHeight = approximateLayout.layoutSize().height();
KDCoordinate exactOutputHeight = exactLayout.layoutSize().height();
KDCoordinate outputHeight = maxCoordinate(exactLayout.baseline(), approximateLayout.baseline()) + maxCoordinate(exactOutputHeight-exactLayout.baseline(), approximateOutputHeight-approximateLayout.baseline());
result = inputHeight + outputHeight;
}
/* For all display output except ExactAndApproximateToggle, the selected
* height and the usual height are identical. We update both heights in
* theses cases. */
if (display != DisplayOutput::ExactAndApproximateToggle) {
m_height = result;
m_expandedHeight = result;
} else {
if (expanded) {
m_expandedHeight = result;
} else {
m_height = result;
}
}
Layout Calculation::createExactOutputLayout(bool * couldNotCreateExactLayout) {
Poincare::ExceptionCheckpoint ecp;
if (ExceptionRun(ecp)) {
return PoincareHelpers::CreateLayout(exactOutput());
} else {
*couldNotCreateExactLayout = true;
return Layout();
}
return result;
}
Layout Calculation::createApproximateOutputLayout(Context * context, bool * couldNotCreateApproximateLayout) {
Poincare::ExceptionCheckpoint ecp;
if (ExceptionRun(ecp)) {
return PoincareHelpers::CreateLayout(approximateOutput(context, NumberOfSignificantDigits::UserDefined));
} else {
*couldNotCreateApproximateLayout = true;
return Layout();
}
}
KDCoordinate Calculation::height(bool expanded) {
KDCoordinate h = expanded ? m_expandedHeight : m_height;
assert(h >= 0);
return h;
}
void Calculation::setHeights(KDCoordinate height, KDCoordinate expandedHeight) {
m_height = height;
m_expandedHeight = expandedHeight;
}
Calculation::DisplayOutput Calculation::displayOutput(Context * context) {
@@ -123,13 +138,31 @@ Calculation::DisplayOutput Calculation::displayOutput(Context * context) {
}
if (shouldOnlyDisplayExactOutput()) {
m_displayOutput = DisplayOutput::ExactOnly;
} else if (input().recursivelyMatches(
} else if (
/* If the exact and approximate outputs are equal (with the
* UserDefined number of significant digits), do not display the exact
* output. Indeed, in this case, the layouts are identical. */
strcmp(exactOutputText(), approximateOutputText(NumberOfSignificantDigits::UserDefined)) == 0
||
// If the approximate output is 'unreal' or the exact result is 'undef'
strcmp(exactOutputText(), Undefined::Name()) == 0 ||
strcmp(approximateOutputText(NumberOfSignificantDigits::Maximal), Unreal::Name()) == 0
||
/* If the approximate output is 'undef' and the input and exactOutput are
* equal */
(strcmp(approximateOutputText(NumberOfSignificantDigits::Maximal), Undefined::Name()) == 0 &&
strcmp(inputText(), exactOutputText()) == 0)
||
// Force all outputs to be ApproximateOnly if required by the exam mode configuration
ExamModeConfiguration::exactExpressionsAreForbidden(GlobalPreferences::sharedGlobalPreferences()->examMode())
||
/* If the input contains the following types, we only display the
* approximate output. */
input().recursivelyMatches(
[](const Expression e, Context * c) {
constexpr int approximateOnlyTypesCount = 9;
/* If the input contains the following types, we only display the
* approximate output. */
ExpressionNode::Type approximateOnlyTypes[approximateOnlyTypesCount] = {
ExpressionNode::Type approximateOnlyTypes[] = {
ExpressionNode::Type::Random,
ExpressionNode::Type::Unit,
ExpressionNode::Type::Round,
ExpressionNode::Type::FracPart,
ExpressionNode::Type::Integral,
@@ -137,29 +170,14 @@ Calculation::DisplayOutput Calculation::displayOutput(Context * context) {
ExpressionNode::Type::Sum,
ExpressionNode::Type::Derivative,
ExpressionNode::Type::ConfidenceInterval,
ExpressionNode::Type::PredictionInterval
ExpressionNode::Type::PredictionInterval,
ExpressionNode::Type::Sequence
};
return e.isOfType(approximateOnlyTypes, approximateOnlyTypesCount);
}, context, true))
return e.isOfType(approximateOnlyTypes, sizeof(approximateOnlyTypes)/sizeof(ExpressionNode::Type));
}, context)
)
{
m_displayOutput = DisplayOutput::ApproximateOnly;
} else if (strcmp(exactOutputText(), approximateOutputText()) == 0) {
/* If the exact and approximate results' texts are equal and their layouts
* too, do not display the exact result. If the two layouts are not equal
* because of the number of significant digits, we display both. */
m_displayOutput = exactAndApproximateDisplayedOutputsAreEqual(context) == Calculation::EqualSign::Equal ? DisplayOutput::ApproximateOnly : DisplayOutput::ExactAndApproximate;
} else if (strcmp(exactOutputText(), Undefined::Name()) == 0
|| strcmp(approximateOutputText(), Unreal::Name()) == 0
|| exactOutput().type() == ExpressionNode::Type::Undefined)
{
// If the approximate result is 'unreal' or the exact result is 'undef'
m_displayOutput = DisplayOutput::ApproximateOnly;
} else if (strcmp(approximateOutputText(), Undefined::Name()) == 0
&& strcmp(inputText(), exactOutputText()) == 0)
{
/* If the approximate result is 'undef' and the input and exactOutput are
* equal */
m_displayOutput = DisplayOutput::ApproximateOnly;
} else if (input().recursivelyMatches(Expression::IsApproximate, context)
|| exactOutput().recursivelyMatches(Expression::IsApproximate, context))
{
@@ -170,12 +188,18 @@ Calculation::DisplayOutput Calculation::displayOutput(Context * context) {
return m_displayOutput;
}
void Calculation::forceDisplayOutput(DisplayOutput d) {
// Heights haven't been computed yet
assert(m_height == -1 && m_expandedHeight == -1);
m_displayOutput = d;
}
bool Calculation::shouldOnlyDisplayExactOutput() {
/* If the input is a "store in a function", do not display the approximate
* result. This prevents x->f(x) from displaying x = undef. */
Expression i = input();
return i.type() == ExpressionNode::Type::Store
&& i.childAtIndex(1).type() == ExpressionNode::Type::Function;
return (i.type() == ExpressionNode::Type::Store && i.childAtIndex(1).type() == ExpressionNode::Type::Function)
|| strcmp(approximateOutputText(NumberOfSignificantDigits::Maximal), Undefined::Name()) == 0;
}
Calculation::EqualSign Calculation::exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context) {
@@ -193,15 +217,10 @@ Calculation::EqualSign Calculation::exactAndApproximateDisplayedOutputsAreEqual(
* Store in the exactOutput. */
Poincare::ExceptionCheckpoint ecp;
if (ExceptionRun(ecp)) {
constexpr int bufferSize = Constant::MaxSerializedExpressionSize + 30;
char buffer[bufferSize];
Preferences * preferences = Preferences::sharedPreferences();
Expression exactOutputExpression = PoincareHelpers::ParseAndSimplify(exactOutputText(), context, false);
if (exactOutputExpression.isUninitialized()) {
exactOutputExpression = Undefined::Builder();
}
// TODO: complex format should not be needed here (as it is not used to create layouts)
Preferences::ComplexFormat complexFormat = Expression::UpdatedComplexFormatWithTextInput(preferences->complexFormat(), m_inputText);
m_equalSign = exactOutputExpression.isEqualToItsApproximationLayout(approximateOutput(context), buffer, bufferSize, complexFormat, preferences->angleUnit(), preferences->displayMode(), preferences->numberOfSignificantDigits(), context) ? EqualSign::Equal : EqualSign::Approximation;
m_equalSign = Expression::ParsedExpressionsAreEqual(exactOutputText(), approximateOutputText(NumberOfSignificantDigits::UserDefined), context, complexFormat, preferences->angleUnit(), GlobalPreferences::sharedGlobalPreferences()->unitFormat()) ? EqualSign::Equal : EqualSign::Approximation;
return m_equalSign;
} else {
/* Do not override m_equalSign in case there is enough room in the pool
@@ -210,4 +229,54 @@ Calculation::EqualSign Calculation::exactAndApproximateDisplayedOutputsAreEqual(
}
}
Calculation::AdditionalInformationType Calculation::additionalInformationType(Context * context) {
if (ExamModeConfiguration::exactExpressionsAreForbidden(GlobalPreferences::sharedGlobalPreferences()->examMode())) {
return AdditionalInformationType::None;
}
Preferences * preferences = Preferences::sharedPreferences();
Preferences::ComplexFormat complexFormat = Expression::UpdatedComplexFormatWithTextInput(preferences->complexFormat(), m_inputText);
Expression i = input();
Expression o = exactOutput();
/* Special case for Equal and Store:
* Equal/Store nodes have to be at the root of the expression, which prevents
* from creating new expressions with equal/store node as a child. We don't
* return any additional outputs for them to avoid bothering with special
* cases. */
if (i.type() == ExpressionNode::Type::Equal || i.type() == ExpressionNode::Type::Store) {
return AdditionalInformationType::None;
}
/* Trigonometry additional results are displayed if either input or output is a sin or a cos. Indeed, we want to capture both cases:
* - > input: cos(60)
* > output: 1/2
* - > input: 2cos(2) - cos(2)
* > output: cos(2)
*/
if (input().isDefinedCosineOrSine(context, complexFormat, preferences->angleUnit()) || o.isDefinedCosineOrSine(context, complexFormat, preferences->angleUnit())) {
return AdditionalInformationType::Trigonometry;
}
if (o.hasUnit()) {
Expression unit;
PoincareHelpers::ReduceAndRemoveUnit(&o, App::app()->localContext(), ExpressionNode::ReductionTarget::User, &unit, ExpressionNode::SymbolicComputation::ReplaceAllSymbolsWithDefinitionsOrUndefined, ExpressionNode::UnitConversion::None);
double value = PoincareHelpers::ApproximateToScalar<double>(o, App::app()->localContext());
return (Unit::ShouldDisplayAdditionalOutputs(value, unit, GlobalPreferences::sharedGlobalPreferences()->unitFormat())) ? AdditionalInformationType::Unit : AdditionalInformationType::None;
}
if (o.isBasedIntegerCappedBy(k_maximalIntegerWithAdditionalInformation)) {
return AdditionalInformationType::Integer;
}
// Find forms like [12]/[23] or -[12]/[23]
if (o.isDivisionOfIntegers() || (o.type() == ExpressionNode::Type::Opposite && o.childAtIndex(0).isDivisionOfIntegers())) {
return AdditionalInformationType::Rational;
}
if (o.hasDefinedComplexApproximation(context, complexFormat, preferences->angleUnit())) {
return AdditionalInformationType::Complex;
}
if (o.type() == ExpressionNode::Type::Matrix) {
return AdditionalInformationType::Matrix;
}
if (o.polynomialDegree(context, "x") == 2) {
return AdditionalInformationType::SecondDegree;
}
return AdditionalInformationType::None;
}
}

View File

@@ -5,6 +5,7 @@
#include <escher.h>
#include <poincare/context.h>
#include <poincare/expression.h>
#include "../shared/poincare_helpers.h"
namespace Calculation {
@@ -18,7 +19,9 @@ class CalculationStore;
* */
class Calculation {
friend CalculationStore;
public:
static constexpr int k_numberOfExpressions = 4;
enum class EqualSign : uint8_t {
Unknown,
Approximation,
@@ -32,12 +35,23 @@ public:
ExactAndApproximate,
ExactAndApproximateToggle
};
enum class AdditionalInformationType {
None = 0,
Integer,
Rational,
SecondDegree,
Trigonometry,
Unit,
Matrix,
Complex
};
static bool DisplaysExact(DisplayOutput d) { return d != DisplayOutput::ApproximateOnly; }
/* It is not really the minimal size, but it clears enough space for most
* calculations instead of clearing less space, then fail to serialize, clear
* more space, fail to serialize, clear more space, etc., until reaching
* sufficient free space. */
static int MinimalSize() { return sizeof(uint8_t) + 2*sizeof(KDCoordinate) + sizeof(uint8_t) + 3*Constant::MaxSerializedExpressionSize; }
static int MinimalSize() { return sizeof(uint8_t) + 2*sizeof(KDCoordinate) + sizeof(uint8_t) + 3*Constant::MaxSerializedExpressionSize + sizeof(Calculation *); }
Calculation() :
m_displayOutput(DisplayOutput::Unknown),
@@ -50,29 +64,43 @@ public:
bool operator==(const Calculation& c);
Calculation * next() const;
void tidy();
// Texts
enum class NumberOfSignificantDigits {
Maximal,
UserDefined
};
const char * inputText() const { return m_inputText; }
const char * exactOutputText() const { return m_inputText + strlen(m_inputText) + 1; }
const char * approximateOutputText() const;
// See comment in approximateOutput implementation explaining the need of two approximateOutputTexts
const char * approximateOutputText(NumberOfSignificantDigits numberOfSignificantDigits) const;
// Expressions
Poincare::Expression input();
Poincare::Expression exactOutput();
Poincare::Expression approximateOutput(Poincare::Context * context);
Poincare::Expression approximateOutput(Poincare::Context * context, NumberOfSignificantDigits numberOfSignificantDigits);
// Layouts
Poincare::Layout createInputLayout();
Poincare::Layout createExactOutputLayout();
Poincare::Layout createApproximateOutputLayout(Poincare::Context * context);
Poincare::Layout createExactOutputLayout(bool * couldNotCreateExactLayout);
Poincare::Layout createApproximateOutputLayout(Poincare::Context * context, bool * couldNotCreateApproximateLayout);
KDCoordinate height(Poincare::Context * context, bool expanded = false);
// Heights
KDCoordinate height(bool expanded);
// Displayed output
DisplayOutput displayOutput(Poincare::Context * context);
void forceDisplayOutput(DisplayOutput d);
bool shouldOnlyDisplayExactOutput();
EqualSign exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context);
// Additional Information
AdditionalInformationType additionalInformationType(Poincare::Context * context);
private:
static constexpr KDCoordinate k_heightComputationFailureHeight = 50;
static constexpr const char * k_maximalIntegerWithAdditionalInformation = "10000000000000000";
void setHeights(KDCoordinate height, KDCoordinate expandedHeight);
/* Buffers holding text expressions have to be longer than the text written
* by user (of maximum length TextField::maxBufferSize()) because when we
* print an expression we add omitted signs (multiplications, parenthesis...) */

View File

@@ -1,8 +1,10 @@
#include "calculation_store.h"
#include "../shared/poincare_helpers.h"
#include "../global_preferences.h"
#include <poincare/rational.h>
#include <poincare/symbol.h>
#include <poincare/undefined.h>
#include "../exam_mode_configuration.h"
#include <assert.h>
using namespace Poincare;
@@ -10,58 +12,47 @@ using namespace Shared;
namespace Calculation {
CalculationStore::CalculationStore() :
m_bufferEnd(m_buffer),
m_numberOfCalculations(0),
m_slidedBuffer(false),
m_indexOfFirstMemoizedCalculationPointer(0)
CalculationStore::CalculationStore(char * buffer, int size) :
m_buffer(buffer),
m_bufferSize(size),
m_calculationAreaEnd(m_buffer),
m_numberOfCalculations(0)
{
resetMemoizedModelsAfterCalculationIndex(-1);
assert(m_buffer != nullptr);
assert(m_bufferSize > 0);
}
// Returns an expiring pointer to the calculation of index i
ExpiringPointer<Calculation> CalculationStore::calculationAtIndex(int i) {
assert(!m_slidedBuffer);
assert(i >= 0 && i < m_numberOfCalculations);
assert(m_indexOfFirstMemoizedCalculationPointer >= 0);
if (i >= m_indexOfFirstMemoizedCalculationPointer && i < m_indexOfFirstMemoizedCalculationPointer + k_numberOfMemoizedCalculationPointers) {
// The calculation is within the range of memoized calculations
Calculation * c = m_memoizedCalculationPointers[i-m_indexOfFirstMemoizedCalculationPointer];
if (c != nullptr) {
// The pointer was memoized
return ExpiringPointer<Calculation>(c);
}
c = bufferCalculationAtIndex(i);
m_memoizedCalculationPointers[i-m_indexOfFirstMemoizedCalculationPointer] = c;
return c;
// m_buffer is the adress of the oldest calculation in calculation store
Calculation * c = (Calculation *) m_buffer;
if (i != m_numberOfCalculations-1) {
// The calculation we want is not the oldest one so we get its pointer
c = *reinterpret_cast<Calculation**>(addressOfPointerToCalculationOfIndex(i+1));
}
// Slide the memoization buffer
if (i >= m_indexOfFirstMemoizedCalculationPointer) {
// Slide the memoization buffer to the left
memmove(m_memoizedCalculationPointers, m_memoizedCalculationPointers+1, (k_numberOfMemoizedCalculationPointers - 1) * sizeof(Calculation *));
m_memoizedCalculationPointers[k_numberOfMemoizedCalculationPointers - 1] = nullptr;
m_indexOfFirstMemoizedCalculationPointer++;
} else {
// Slide the memoization buffer to the right
memmove(m_memoizedCalculationPointers+1, m_memoizedCalculationPointers, (k_numberOfMemoizedCalculationPointers - 1) * sizeof(Calculation *));
m_memoizedCalculationPointers[0] = nullptr;
m_indexOfFirstMemoizedCalculationPointer--;
}
return calculationAtIndex(i);
return ExpiringPointer<Calculation>(c);
}
ExpiringPointer<Calculation> CalculationStore::push(const char * text, Context * context) {
/* Compute ans now, before the buffer is slided and before the calculation
// Pushes an expression in the store
ExpiringPointer<Calculation> CalculationStore::push(const char * text, Context * context, HeightComputer heightComputer) {
/* Compute ans now, before the buffer is updated and before the calculation
* might be deleted */
Expression ans = ansExpression(context);
// Prepare the buffer for the new calculation
int minSize = Calculation::MinimalSize();
assert(k_bufferSize > minSize);
while (remainingBufferSize() < minSize || m_numberOfCalculations > k_maxNumberOfCalculations) {
deleteLastCalculation();
/* Prepare the buffer for the new calculation
*The minimal size to store the new calculation is the minimal size of a calculation plus the pointer to its end */
int minSize = Calculation::MinimalSize() + sizeof(Calculation *);
assert(m_bufferSize > minSize);
while (remainingBufferSize() < minSize) {
// If there is no more space to store a calculation, we delete the oldest one
deleteOldestCalculation();
}
char * newCalculationsLocation = slideCalculationsToEndOfBuffer();
char * nextSerializationLocation = m_buffer;
// Getting the adresses of the limits of the free space
char * beginingOfFreeSpace = (char *)m_calculationAreaEnd;
char * endOfFreeSpace = beginingOfMemoizationArea();
char * previousCalc = beginingOfFreeSpace;
// Add the beginning of the calculation
{
@@ -69,89 +60,112 @@ ExpiringPointer<Calculation> CalculationStore::push(const char * text, Context *
* available, so this memmove will not overide anything. */
Calculation newCalc = Calculation();
size_t calcSize = sizeof(newCalc);
memmove(nextSerializationLocation, &newCalc, calcSize);
nextSerializationLocation += calcSize;
memcpy(beginingOfFreeSpace, &newCalc, calcSize);
beginingOfFreeSpace += calcSize;
}
/* Add the input expression.
* We do not store directly the text entered by the user because we do not
* want to keep Ans symbol in the calculation store. */
const char * inputSerialization = nextSerializationLocation;
const char * inputSerialization = beginingOfFreeSpace;
{
Expression input = Expression::Parse(text).replaceSymbolWithExpression(Symbol::Ans(), ans);
if (!serializeExpression(input, nextSerializationLocation, &newCalculationsLocation)) {
Expression input = Expression::Parse(text, context).replaceSymbolWithExpression(Symbol::Ans(), ans);
if (!pushSerializeExpression(input, beginingOfFreeSpace, &endOfFreeSpace)) {
/* If the input does not fit in the store (event if the current
* calculation is the only calculation), just replace the calculation with
* undef. */
return emptyStoreAndPushUndef(context);
return emptyStoreAndPushUndef(context, heightComputer);
}
nextSerializationLocation += strlen(nextSerializationLocation) + 1;
beginingOfFreeSpace += strlen(beginingOfFreeSpace) + 1;
}
// Compute and serialize the outputs
/* The serialized outputs are:
* - the exact ouput
* - the approximate output with the maximal number of significant digits
* - the approximate output with the displayed number of significant digits */
{
Expression outputs[] = {Expression(), Expression()};
PoincareHelpers::ParseAndSimplifyAndApproximate(inputSerialization, &(outputs[0]), &(outputs[1]), context, true); // Symbolic computation
for (int i = 0; i < 2; i++) {
if (!serializeExpression(outputs[i], nextSerializationLocation, &newCalculationsLocation)) {
// Outputs hold exact output, approximate output and its duplicate
constexpr static int numberOfOutputs = Calculation::k_numberOfExpressions - 1;
Expression outputs[numberOfOutputs] = {Expression(), Expression(), Expression()};
PoincareHelpers::ParseAndSimplifyAndApproximate(inputSerialization, &(outputs[0]), &(outputs[1]), context, GlobalPreferences::sharedGlobalPreferences()->isInExamModeSymbolic() ? Poincare::ExpressionNode::SymbolicComputation::ReplaceAllDefinedSymbolsWithDefinition : Poincare::ExpressionNode::SymbolicComputation::ReplaceAllSymbolsWithDefinitionsOrUndefined);
if (ExamModeConfiguration::exactExpressionsAreForbidden(GlobalPreferences::sharedGlobalPreferences()->examMode()) && outputs[1].hasUnit()) {
// Hide results with units on units if required by the exam mode configuration
outputs[1] = Undefined::Builder();
}
outputs[2] = outputs[1];
int numberOfSignificantDigits = Poincare::PrintFloat::k_numberOfStoredSignificantDigits;
for (int i = 0; i < numberOfOutputs; i++) {
if (i == numberOfOutputs - 1) {
numberOfSignificantDigits = Poincare::Preferences::sharedPreferences()->numberOfSignificantDigits();
}
if (!pushSerializeExpression(outputs[i], beginingOfFreeSpace, &endOfFreeSpace, numberOfSignificantDigits)) {
/* If the exat/approximate output does not fit in the store (event if the
* current calculation is the only calculation), replace the output with
* undef if it fits, else replace the whole calcualtion with undef. */
Expression undef = Undefined::Builder();
if (!serializeExpression(undef, nextSerializationLocation, &newCalculationsLocation)) {
return emptyStoreAndPushUndef(context);
if (!pushSerializeExpression(undef, beginingOfFreeSpace, &endOfFreeSpace)) {
return emptyStoreAndPushUndef(context, heightComputer);
}
}
nextSerializationLocation += strlen(nextSerializationLocation) + 1;
beginingOfFreeSpace += strlen(beginingOfFreeSpace) + 1;
}
}
// Storing the pointer of the end of the new calculation
memcpy(endOfFreeSpace-sizeof(Calculation*),&beginingOfFreeSpace,sizeof(beginingOfFreeSpace));
// Restore the other calculations
size_t slideSize = m_buffer + k_bufferSize - newCalculationsLocation;
memcpy(nextSerializationLocation, newCalculationsLocation, slideSize);
m_slidedBuffer = false;
// The new calculation is now stored
m_numberOfCalculations++;
m_bufferEnd+= nextSerializationLocation - m_buffer;
// Clean the memoization
resetMemoizedModelsAfterCalculationIndex(-1);
return ExpiringPointer<Calculation>(reinterpret_cast<Calculation *>(m_buffer));
// The end of the calculation storage area is updated
m_calculationAreaEnd += beginingOfFreeSpace - previousCalc;
ExpiringPointer<Calculation> calculation = ExpiringPointer<Calculation>(reinterpret_cast<Calculation *>(previousCalc));
/* Heights are computed now to make sure that the display output is decided
* accordingly to the remaining size in the Poincare pool. Once it is, it
* can't change anymore: the calculation heights are fixed which ensures that
* scrolling computation is right. */
calculation->setHeights(
heightComputer(calculation.pointer(), false),
heightComputer(calculation.pointer(), true));
return calculation;
}
// Delete the calculation of index i
void CalculationStore::deleteCalculationAtIndex(int i) {
assert(i >= 0 && i < m_numberOfCalculations);
assert(!m_slidedBuffer);
ExpiringPointer<Calculation> calcI = calculationAtIndex(i);
char * nextCalc = reinterpret_cast<char *>(calcI->next());
assert(m_bufferEnd >= nextCalc);
size_t slidingSize = m_bufferEnd - nextCalc;
memmove((char *)(calcI.pointer()), nextCalc, slidingSize);
m_bufferEnd -= (nextCalc - (char *)(calcI.pointer()));
m_numberOfCalculations--;
resetMemoizedModelsAfterCalculationIndex(i);
}
void CalculationStore::deleteAll() {
/* We might call deleteAll because the app closed due to a pool allocation
* failure, so we cannot assert that m_slidedBuffer is false. */
m_slidedBuffer = false;
m_bufferEnd = m_buffer;
m_numberOfCalculations = 0;
resetMemoizedModelsAfterCalculationIndex(-1);
}
void CalculationStore::tidy() {
if (m_slidedBuffer) {
deleteAll();
if (i == 0) {
ExpiringPointer<Calculation> lastCalculationPointer = calculationAtIndex(0);
m_calculationAreaEnd = (char *)(lastCalculationPointer.pointer());
m_numberOfCalculations--;
return;
}
resetMemoizedModelsAfterCalculationIndex(-1);
for (Calculation * c : *this) {
c->tidy();
}
char * calcI = (char *)calculationAtIndex(i).pointer();
char * nextCalc = (char *) calculationAtIndex(i-1).pointer();
assert(m_calculationAreaEnd >= nextCalc);
size_t slidingSize = m_calculationAreaEnd - nextCalc;
// Slide the i-1 most recent calculations right after the i+1'th
memmove(calcI, nextCalc, slidingSize);
m_calculationAreaEnd -= nextCalc - calcI;
// Recompute pointer to calculations after the i'th
recomputeMemoizedPointersAfterCalculationIndex(i);
m_numberOfCalculations--;
}
// Delete the oldest calculation in the store and returns the amount of space freed by the operation
size_t CalculationStore::deleteOldestCalculation() {
char * oldBufferEnd = (char *) m_calculationAreaEnd;
deleteCalculationAtIndex(numberOfCalculations()-1);
char * newBufferEnd = (char *) m_calculationAreaEnd;
return oldBufferEnd - newBufferEnd;
}
// Delete all calculations
void CalculationStore::deleteAll() {
m_calculationAreaEnd = m_buffer;
m_numberOfCalculations = 0;
}
// Replace "Ans" by its expression
Expression CalculationStore::ansExpression(Context * context) {
if (numberOfCalculations() == 0) {
return Rational::Builder(0);
@@ -162,107 +176,50 @@ Expression CalculationStore::ansExpression(Context * context) {
* To avoid turning 'ans->A' in '2->A->A' or '2=A->A' (which cannot be
* parsed), ans is replaced by the approximation output when any Store or
* Equal expression appears. */
bool exactOuptutInvolvesStoreEqual = mostRecentCalculation->exactOutput().recursivelyMatches([](const Expression e, Context * context) {
return e.type() == ExpressionNode::Type::Store || e.type() == ExpressionNode::Type::Equal;
}, context, false);
Expression e = mostRecentCalculation->exactOutput();
bool exactOuptutInvolvesStoreEqual = e.type() == ExpressionNode::Type::Store || e.type() == ExpressionNode::Type::Equal;
if (mostRecentCalculation->input().recursivelyMatches(Expression::IsApproximate, context) || exactOuptutInvolvesStoreEqual) {
return mostRecentCalculation->approximateOutput(context);
return mostRecentCalculation->approximateOutput(context, Calculation::NumberOfSignificantDigits::Maximal);
}
return mostRecentCalculation->exactOutput();
}
Calculation * CalculationStore::bufferCalculationAtIndex(int i) {
int currentIndex = 0;
for (Calculation * c : *this) {
if (currentIndex == i) {
return c;
}
currentIndex++;
}
assert(false);
return nullptr;
}
bool CalculationStore::serializeExpression(Expression e, char * location, char * * newCalculationsLocation) {
assert(m_slidedBuffer);
return pushExpression(
[](char * location, size_t locationSize, void * e) {
return PoincareHelpers::Serialize(*(Expression *)e, location, locationSize) < (int)locationSize-1;
}, &e, location, newCalculationsLocation);
}
char * CalculationStore::slideCalculationsToEndOfBuffer() {
int calculationsSize = m_bufferEnd - m_buffer;
char * calculationsNewPosition = m_buffer + k_bufferSize - calculationsSize;
memmove(calculationsNewPosition, m_buffer, calculationsSize);
m_slidedBuffer = true;
return calculationsNewPosition;
}
size_t CalculationStore::deleteLastCalculation(const char * calculationsStart) {
assert(m_numberOfCalculations > 0);
size_t result;
if (!m_slidedBuffer) {
assert(calculationsStart == nullptr);
const char * previousBufferEnd = m_bufferEnd;
m_bufferEnd = lastCalculationPosition(m_buffer);
assert(previousBufferEnd > m_bufferEnd);
result = previousBufferEnd - m_bufferEnd;
} else {
assert(calculationsStart != nullptr);
const char * lastCalc = lastCalculationPosition(calculationsStart);
assert(*lastCalc == 0);
result = m_buffer + k_bufferSize - lastCalc;
memmove(const_cast<char *>(calculationsStart + result), calculationsStart, m_buffer + k_bufferSize - calculationsStart - result);
}
m_numberOfCalculations--;
resetMemoizedModelsAfterCalculationIndex(-1);
return result;
}
const char * CalculationStore::lastCalculationPosition(const char * calculationsStart) const {
assert(calculationsStart >= m_buffer && calculationsStart < m_buffer + k_bufferSize);
Calculation * c = reinterpret_cast<Calculation *>(const_cast<char *>(calculationsStart));
int calculationIndex = 0;
while (calculationIndex < m_numberOfCalculations - 1) {
c = c->next();
calculationIndex++;
}
return reinterpret_cast<const char *>(c);
}
bool CalculationStore::pushExpression(ValueCreator valueCreator, Expression * expression, char * location, char * * newCalculationsLocation) {
assert(*newCalculationsLocation <= m_buffer + k_bufferSize);
// Push converted expression in the buffer
bool CalculationStore::pushSerializeExpression(Expression e, char * location, char * * newCalculationsLocation, int numberOfSignificantDigits) {
assert(*newCalculationsLocation <= m_buffer + m_bufferSize);
bool expressionIsPushed = false;
while (true) {
expressionIsPushed = valueCreator(location, *newCalculationsLocation - location, expression);
if (expressionIsPushed || *newCalculationsLocation >= m_buffer + k_bufferSize) {
size_t locationSize = *newCalculationsLocation - location;
expressionIsPushed = (PoincareHelpers::Serialize(e, location, locationSize, numberOfSignificantDigits) < (int)locationSize-1);
if (expressionIsPushed || *newCalculationsLocation >= m_buffer + m_bufferSize) {
break;
}
*newCalculationsLocation = *newCalculationsLocation + deleteLastCalculation();
assert(*newCalculationsLocation <= m_buffer + k_bufferSize);
*newCalculationsLocation = *newCalculationsLocation + deleteOldestCalculation();
assert(*newCalculationsLocation <= m_buffer + m_bufferSize);
}
return expressionIsPushed;
}
Shared::ExpiringPointer<Calculation> CalculationStore::emptyStoreAndPushUndef(Context * context) {
Shared::ExpiringPointer<Calculation> CalculationStore::emptyStoreAndPushUndef(Context * context, HeightComputer heightComputer) {
/* We end up here as a result of a failed calculation push. The store
* attributes are not necessarily clean, so we need to reset them. */
m_slidedBuffer = false;
deleteAll();
return push(Undefined::Name(), context);
return push(Undefined::Name(), context, heightComputer);
}
void CalculationStore::resetMemoizedModelsAfterCalculationIndex(int index) {
if (index < m_indexOfFirstMemoizedCalculationPointer) {
memset(&m_memoizedCalculationPointers, 0, k_numberOfMemoizedCalculationPointers * sizeof(Calculation *));
return;
}
if (index >= m_indexOfFirstMemoizedCalculationPointer + k_numberOfMemoizedCalculationPointers) {
return;
}
for (int i = index - m_indexOfFirstMemoizedCalculationPointer; i < k_numberOfMemoizedCalculationPointers; i++) {
m_memoizedCalculationPointers[i] = nullptr;
// Recompute memoized pointers to the calculations after index i
void CalculationStore::recomputeMemoizedPointersAfterCalculationIndex(int index) {
assert(index < m_numberOfCalculations);
// Clear pointer and recompute new ones
Calculation * c = calculationAtIndex(index).pointer();
Calculation * nextCalc;
while (index != 0) {
nextCalc = c->next();
memcpy(addressOfPointerToCalculationOfIndex(index), &nextCalc, sizeof(Calculation *));
c = nextCalc;
index--;
}
}

View File

@@ -3,39 +3,49 @@
#include "calculation.h"
#include <apps/shared/expiring_pointer.h>
#include <poincare/print_float.h>
namespace Calculation {
/* To optimize the storage space, we use one big buffer for all calculations.
*
* The previous solution was to keep 10 calculations, each containing 3 buffers
* (for input and outputs). To optimize the storage, we then wanted to put all
* outputs in a cache where they could be deleted to add a new entry, and
* recomputed on cache miss. However, the computation depends too much on the
* state of the memory for this to be possible. For instance:
* 6->a
* a+1
* Perform some big computations that remove a+1 from the cache
* Delete a from the variable box.
* Scroll up to display a+1 : a does not exist anymore so the outputs won't be
* recomputed correctly.
*
* Now we do not cap the number of calculations and just delete the oldests to
* create space for a new calculation. */
/*
To optimize the storage space, we use one big buffer for all calculations.
The calculations are stored one after another while pointers to the end of each
calculation are stored at the end of the buffer, in the opposite direction.
By doing so, we can memoize every calculation entered while not limiting
the number of calculation stored in the buffer.
If the remaining space is too small for storing a new calculation, we
delete the oldest one.
Memory layout :
<- Available space for new calculations ->
+--------------------------------------------------------------------------------------------------------------------+
| | | | | | | | | |
| Calculation 3 | Calculation 2 | Calculation 1 | Calculation O | |p0|p1|p2|p3|
| Oldest | | | | | | | | |
+--------------------------------------------------------------------------------------------------------------------+
^ ^ ^ ^ ^ ^
m_buffer p3 p2 p1 p0 a
m_calculationAreaEnd = p0
a = addressOfPointerToCalculation(0)
*/
class CalculationStore {
public:
CalculationStore();
CalculationStore(char * buffer, int size);
Shared::ExpiringPointer<Calculation> calculationAtIndex(int i);
Shared::ExpiringPointer<Calculation> push(const char * text, Poincare::Context * context);
typedef KDCoordinate (*HeightComputer)(Calculation * c, bool expanded);
Shared::ExpiringPointer<Calculation> push(const char * text, Poincare::Context * context, HeightComputer heightComputer);
void deleteCalculationAtIndex(int i);
void deleteAll();
int remainingBufferSize() const { assert(m_calculationAreaEnd >= m_buffer); return m_bufferSize - (m_calculationAreaEnd - m_buffer) - m_numberOfCalculations*sizeof(Calculation*); }
int numberOfCalculations() const { return m_numberOfCalculations; }
Poincare::Expression ansExpression(Poincare::Context * context);
void tidy();
int bufferSize() { return m_bufferSize; }
private:
static constexpr int k_maxNumberOfCalculations = 25;
static constexpr int k_bufferSize = 10 * 3 * Constant::MaxSerializedExpressionSize;
class CalculationIterator {
public:
@@ -51,28 +61,22 @@ private:
};
CalculationIterator begin() const { return CalculationIterator(m_buffer); }
CalculationIterator end() const { return CalculationIterator(m_bufferEnd); }
CalculationIterator end() const { return CalculationIterator(m_calculationAreaEnd); }
Calculation * bufferCalculationAtIndex(int i);
int remainingBufferSize() const { assert(m_bufferEnd >= m_buffer); return k_bufferSize - (m_bufferEnd - m_buffer); }
bool serializeExpression(Poincare::Expression e, char * location, char * * newCalculationsLocation);
char * slideCalculationsToEndOfBuffer(); // returns the new position of the calculations
size_t deleteLastCalculation(const char * calculationsStart = nullptr);
const char * lastCalculationPosition(const char * calculationsStart) const;
typedef bool (*ValueCreator)(char * location, size_t locationSize, void * e);
bool pushExpression(ValueCreator valueCrator, Poincare::Expression * expression, char * location, char * * newCalculationsLocation);
Shared::ExpiringPointer<Calculation> emptyStoreAndPushUndef(Poincare::Context * context);
bool pushSerializeExpression(Poincare::Expression e, char * location, char * * newCalculationsLocation, int numberOfSignificantDigits = Poincare::PrintFloat::k_numberOfStoredSignificantDigits);
Shared::ExpiringPointer<Calculation> emptyStoreAndPushUndef(Poincare::Context * context, HeightComputer heightComputer);
char m_buffer[k_bufferSize];
const char * m_bufferEnd;
char * m_buffer;
int m_bufferSize;
const char * m_calculationAreaEnd;
int m_numberOfCalculations;
bool m_slidedBuffer;
size_t deleteOldestCalculation();
char * addressOfPointerToCalculationOfIndex(int i) {return m_buffer + m_bufferSize - (m_numberOfCalculations - i)*sizeof(Calculation *);}
// Memoization
static constexpr int k_numberOfMemoizedCalculationPointers = 10;
void resetMemoizedModelsAfterCalculationIndex(int index);
int m_indexOfFirstMemoizedCalculationPointer;
mutable Calculation * m_memoizedCalculationPointers[k_numberOfMemoizedCalculationPointers];
char * beginingOfMemoizationArea() {return addressOfPointerToCalculationOfIndex(0);};
void recomputeMemoizedPointersAfterCalculationIndex(int index);
};
}

View File

@@ -9,7 +9,7 @@ using namespace Poincare;
namespace Calculation {
EditExpressionController::ContentView::ContentView(Responder * parentResponder, TableView * subview, InputEventHandlerDelegate * inputEventHandlerDelegate, TextFieldDelegate * textFieldDelegate, LayoutFieldDelegate * layoutFieldDelegate) :
EditExpressionController::ContentView::ContentView(Responder * parentResponder, CalculationSelectableTableView * subview, InputEventHandlerDelegate * inputEventHandlerDelegate, TextFieldDelegate * textFieldDelegate, LayoutFieldDelegate * layoutFieldDelegate) :
View(),
m_mainView(subview),
m_expressionField(parentResponder, inputEventHandlerDelegate, textFieldDelegate, layoutFieldDelegate)
@@ -25,12 +25,12 @@ View * EditExpressionController::ContentView::subviewAtIndex(int index) {
return &m_expressionField;
}
void EditExpressionController::ContentView::layoutSubviews() {
void EditExpressionController::ContentView::layoutSubviews(bool force) {
KDCoordinate inputViewFrameHeight = m_expressionField.minimalSizeForOptimalDisplay().height();
KDRect mainViewFrame(0, 0, bounds().width(), bounds().height() - inputViewFrameHeight);
m_mainView->setFrame(mainViewFrame);
m_mainView->setFrame(mainViewFrame, force);
KDRect inputViewFrame(0, bounds().height() - inputViewFrameHeight, bounds().width(), inputViewFrameHeight);
m_expressionField.setFrame(inputViewFrame);
m_expressionField.setFrame(inputViewFrame, force);
}
void EditExpressionController::ContentView::reload() {
@@ -38,29 +38,38 @@ void EditExpressionController::ContentView::reload() {
markRectAsDirty(bounds());
}
EditExpressionController::EditExpressionController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, HistoryController * historyController, CalculationStore * calculationStore) :
EditExpressionController::EditExpressionController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, char * cacheBuffer, size_t * cacheBufferInformation, HistoryController * historyController, CalculationStore * calculationStore) :
ViewController(parentResponder),
m_cacheBuffer(cacheBuffer),
m_cacheBufferInformation(cacheBufferInformation),
m_historyController(historyController),
m_calculationStore(calculationStore),
m_contentView(this, (TableView *)m_historyController->view(), inputEventHandlerDelegate, this, this),
m_inputViewHeightIsMaximal(false)
m_contentView(this, static_cast<CalculationSelectableTableView *>(m_historyController->view()), inputEventHandlerDelegate, this, this)
{
m_cacheBuffer[0] = 0;
}
View * EditExpressionController::view() {
return &m_contentView;
}
void EditExpressionController::insertTextBody(const char * text) {
((ContentView *)view())->expressionField()->handleEventWithText(text, false, true);
Container::activeApp()->setFirstResponder(this);
m_contentView.expressionField()->handleEventWithText(text, false, true);
}
void EditExpressionController::didBecomeFirstResponder() {
int lastRow = m_calculationStore->numberOfCalculations() > 0 ? m_calculationStore->numberOfCalculations()-1 : 0;
m_historyController->scrollToCell(0, lastRow);
((ContentView *)view())->expressionField()->setEditing(true, false);
Container::activeApp()->setFirstResponder(((ContentView *)view())->expressionField());
m_contentView.mainView()->scrollToBottom();
m_contentView.expressionField()->setEditing(true, false);
Container::activeApp()->setFirstResponder(m_contentView.expressionField());
}
void EditExpressionController::restoreInput() {
m_contentView.expressionField()->restoreContent(m_cacheBuffer, *m_cacheBufferInformation);
clearCacheBuffer();
}
void EditExpressionController::memoizeInput() {
*m_cacheBufferInformation = m_contentView.expressionField()->moveCursorAndDumpContent(m_cacheBuffer, k_cacheBufferSize);
}
void EditExpressionController::viewWillAppear() {
m_historyController->viewWillAppear();
}
bool EditExpressionController::textFieldDidReceiveEvent(::TextField * textField, Ion::Events::Event event) {
@@ -96,23 +105,23 @@ bool EditExpressionController::layoutFieldDidAbortEditing(::LayoutField * layout
}
void EditExpressionController::layoutFieldDidChangeSize(::LayoutField * layoutField) {
/* Reload the view only if the ExpressionField height actually changes, i.e.
* not if the height is already maximal and stays maximal. */
if (view()) {
bool newInputViewHeightIsMaximal = static_cast<ContentView *>(view())->expressionField()->heightIsMaximal();
if (!m_inputViewHeightIsMaximal || !newInputViewHeightIsMaximal) {
m_inputViewHeightIsMaximal = newInputViewHeightIsMaximal;
reloadView();
}
if (m_contentView.expressionField()->inputViewHeightDidChange()) {
/* Reload the whole view only if the ExpressionField's height did actually
* change. */
reloadView();
} else {
/* The input view is already at maximal size so we do not need to relayout
* the view underneath, but the view inside the input view might still need
* to be relayouted.
* We force the relayout because the frame stays the same but we need to
* propagate a relayout to the content of the field scroll view. */
m_contentView.expressionField()->layoutSubviews(true);
}
}
void EditExpressionController::reloadView() {
((ContentView *)view())->reload();
m_contentView.reload();
m_historyController->reload();
if (m_historyController->numberOfRows() > 0) {
((ContentView *)view())->mainView()->scrollToCell(0, m_historyController->numberOfRows()-1);
}
}
bool EditExpressionController::inputViewDidReceiveEvent(Ion::Events::Event event, bool shouldDuplicateLastCalculation) {
@@ -123,15 +132,14 @@ bool EditExpressionController::inputViewDidReceiveEvent(Ion::Events::Event event
if (!myApp->isAcceptableText(m_cacheBuffer)) {
return true;
}
m_calculationStore->push(m_cacheBuffer, myApp->localContext());
m_calculationStore->push(m_cacheBuffer, myApp->localContext(), HistoryViewCell::Height);
m_historyController->reload();
((ContentView *)view())->mainView()->scrollToCell(0, m_historyController->numberOfRows()-1);
return true;
}
if (event == Ion::Events::Up) {
if (m_calculationStore->numberOfCalculations() > 0) {
m_cacheBuffer[0] = 0;
((ContentView *)view())->expressionField()->setEditing(false, false);
clearCacheBuffer();
m_contentView.expressionField()->setEditing(false, false);
Container::activeApp()->setFirstResponder(m_historyController);
}
return true;
@@ -139,31 +147,27 @@ bool EditExpressionController::inputViewDidReceiveEvent(Ion::Events::Event event
return false;
}
bool EditExpressionController::inputViewDidFinishEditing(const char * text, Layout layoutR) {
Context * context = textFieldDelegateApp()->localContext();
if (layoutR.isUninitialized()) {
assert(text);
strlcpy(m_cacheBuffer, text, k_cacheBufferSize);
} else {
layoutR.serializeParsedExpression(m_cacheBuffer, k_cacheBufferSize);
layoutR.serializeParsedExpression(m_cacheBuffer, k_cacheBufferSize, context);
}
m_calculationStore->push(m_cacheBuffer, textFieldDelegateApp()->localContext());
m_calculationStore->push(m_cacheBuffer, context, HistoryViewCell::Height);
m_historyController->reload();
((ContentView *)view())->mainView()->scrollToCell(0, m_historyController->numberOfRows()-1);
((ContentView *)view())->expressionField()->setEditing(true, true);
m_contentView.expressionField()->setEditing(true, true);
telemetryReportEvent("Input", m_cacheBuffer);
return true;
}
bool EditExpressionController::inputViewDidAbortEditing(const char * text) {
if (text != nullptr) {
((ContentView *)view())->expressionField()->setEditing(true, true);
((ContentView *)view())->expressionField()->setText(text);
m_contentView.expressionField()->setEditing(true, true);
m_contentView.expressionField()->setText(text);
}
return false;
}
void EditExpressionController::viewDidDisappear() {
m_historyController->viewDidDisappear();
}
}

View File

@@ -7,19 +7,30 @@
#include "../shared/text_field_delegate.h"
#include "../shared/layout_field_delegate.h"
#include "history_controller.h"
#include "calculation_store.h"
#include "selectable_table_view.h"
namespace Calculation {
class HistoryController;
/* TODO: implement a split view */
class EditExpressionController : public ViewController, public Shared::TextFieldDelegate, public Shared::LayoutFieldDelegate {
public:
EditExpressionController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, HistoryController * historyController, CalculationStore * calculationStore);
View * view() override;
EditExpressionController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, char * cacheBuffer, size_t * cacheBufferInformation, HistoryController * historyController, CalculationStore * calculationStore);
/* k_layoutBufferMaxSize dictates the size under which the expression being
* edited can be remembered when the user leaves Calculation. */
static constexpr int k_layoutBufferMaxSize = 1024;
/* k_cacheBufferSize is the size of the array to which m_cacheBuffer points.
* It is used both as a way to buffer expression when pushing them the
* CalculationStore, and as a storage for the current input when leaving the
* application. */
static constexpr int k_cacheBufferSize = (k_layoutBufferMaxSize < Constant::MaxSerializedExpressionSize) ? Constant::MaxSerializedExpressionSize : k_layoutBufferMaxSize;
View * view() override { return &m_contentView; }
void didBecomeFirstResponder() override;
void viewDidDisappear() override;
void viewWillAppear() override;
void insertTextBody(const char * text);
void restoreInput();
void memoizeInput();
/* TextFieldDelegate */
bool textFieldDidReceiveEvent(::TextField * textField, Ion::Events::Event event) override;
@@ -35,28 +46,27 @@ public:
private:
class ContentView : public View {
public:
ContentView(Responder * parentResponder, TableView * subview, InputEventHandlerDelegate * inputEventHandlerDelegate, TextFieldDelegate * textFieldDelegate, LayoutFieldDelegate * layoutFieldDelegate);
ContentView(Responder * parentResponder, CalculationSelectableTableView * subview, InputEventHandlerDelegate * inputEventHandlerDelegate, TextFieldDelegate * textFieldDelegate, LayoutFieldDelegate * layoutFieldDelegate);
void reload();
TableView * mainView() { return m_mainView; }
CalculationSelectableTableView * mainView() { return m_mainView; }
ExpressionField * expressionField() { return &m_expressionField; }
/* View */
private:
int numberOfSubviews() const override { return 2; }
View * subviewAtIndex(int index) override;
void layoutSubviews() override;
private:
TableView * m_mainView;
void layoutSubviews(bool force = false) override;
CalculationSelectableTableView * m_mainView;
ExpressionField m_expressionField;
};
void reloadView();
void clearCacheBuffer() { m_cacheBuffer[0] = 0; *m_cacheBufferInformation = 0; }
bool inputViewDidReceiveEvent(Ion::Events::Event event, bool shouldDuplicateLastCalculation);
bool inputViewDidFinishEditing(const char * text, Poincare::Layout layoutR);
bool inputViewDidAbortEditing(const char * text);
static constexpr int k_cacheBufferSize = Constant::MaxSerializedExpressionSize;
char m_cacheBuffer[k_cacheBufferSize];
char * m_cacheBuffer;
size_t * m_cacheBufferInformation;
HistoryController * m_historyController;
CalculationStore * m_calculationStore;
ContentView m_contentView;
bool m_inputViewHeightIsMaximal;
};
}

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

@@ -7,7 +7,10 @@ namespace Calculation {
class ExpressionField : public ::ExpressionField {
public:
using ::ExpressionField::ExpressionField;
ExpressionField(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandler, TextFieldDelegate * textFieldDelegate, LayoutFieldDelegate * layoutFieldDelegate) :
::ExpressionField(parentResponder, inputEventHandler, textFieldDelegate, layoutFieldDelegate) {
setLayoutInsertionCursorEvent(Ion::Events::Up);
}
protected:
bool handleEvent(Ion::Events::Event event) override;
};

View File

@@ -1,16 +1,25 @@
#include "history_controller.h"
#include "app.h"
#include <poincare/exception_checkpoint.h>
#include <assert.h>
using namespace Shared;
using namespace Poincare;
namespace Calculation {
HistoryController::HistoryController(Responder * parentResponder, CalculationStore * calculationStore) :
ViewController(parentResponder),
HistoryController::HistoryController(EditExpressionController * editExpressionController, CalculationStore * calculationStore) :
ViewController(editExpressionController),
m_selectableTableView(this, this, this, this),
m_calculationHistory{},
m_calculationStore(calculationStore)
m_calculationStore(calculationStore),
m_complexController(editExpressionController),
m_integerController(editExpressionController),
m_rationalController(editExpressionController),
m_secondDegreeController(editExpressionController),
m_trigonometryController(editExpressionController),
m_unitController(editExpressionController),
m_matrixController(editExpressionController)
{
for (int i = 0; i < k_maxNumberOfDisplayedRows; i++) {
m_calculationHistory[i].setParentResponder(&m_selectableTableView);
@@ -19,7 +28,28 @@ HistoryController::HistoryController(Responder * parentResponder, CalculationSto
}
void HistoryController::reload() {
/* When reloading, we might not used anymore cell that hold previous layouts.
* We clean them all before reloading their content to avoid taking extra
* useless space in the Poincare pool. */
for (int i = 0; i < k_maxNumberOfDisplayedRows; i++) {
m_calculationHistory[i].resetMemoization();
}
m_selectableTableView.reloadData();
/* TODO
* Replace the following by selectCellAtLocation in order to avoid laying out
* the table view twice.
*/
if (numberOfRows() > 0) {
m_selectableTableView.scrollToBottom();
// Force to reload last added cell (hide the burger and exact output if necessary)
tableViewDidChangeSelectionAndDidScroll(&m_selectableTableView, 0, numberOfRows()-1);
}
}
void HistoryController::viewWillAppear() {
ViewController::viewWillAppear();
reload();
}
void HistoryController::didBecomeFirstResponder() {
@@ -28,6 +58,9 @@ void HistoryController::didBecomeFirstResponder() {
}
void HistoryController::willExitResponderChain(Responder * nextFirstResponder) {
if (nextFirstResponder == nullptr) {
return;
}
if (nextFirstResponder == parentResponder()) {
m_selectableTableView.deselectTable();
}
@@ -47,20 +80,47 @@ bool HistoryController::handleEvent(Ion::Events::Event event) {
HistoryViewCell * selectedCell = (HistoryViewCell *)m_selectableTableView.selectedCell();
SubviewType subviewType = selectedSubviewType();
EditExpressionController * editController = (EditExpressionController *)parentResponder();
m_selectableTableView.deselectTable();
Container::activeApp()->setFirstResponder(editController);
Shared::ExpiringPointer<Calculation> calculation = calculationAtIndex(focusRow);
if (subviewType == SubviewType::Input) {
editController->insertTextBody(calculation->inputText());
} else {
ScrollableExactApproximateExpressionsView::SubviewPosition outputSubviewPosition = selectedCell->outputView()->selectedSubviewPosition();
if (outputSubviewPosition == ScrollableExactApproximateExpressionsView::SubviewPosition::Right
m_selectableTableView.deselectTable();
editController->insertTextBody(calculationAtIndex(focusRow)->inputText());
} else if (subviewType == SubviewType::Output) {
m_selectableTableView.deselectTable();
Shared::ExpiringPointer<Calculation> calculation = calculationAtIndex(focusRow);
ScrollableTwoExpressionsView::SubviewPosition outputSubviewPosition = selectedCell->outputView()->selectedSubviewPosition();
if (outputSubviewPosition == ScrollableTwoExpressionsView::SubviewPosition::Right
&& !calculation->shouldOnlyDisplayExactOutput())
{
editController->insertTextBody(calculation->approximateOutputText());
editController->insertTextBody(calculation->approximateOutputText(Calculation::NumberOfSignificantDigits::Maximal));
} else {
editController->insertTextBody(calculation->exactOutputText());
}
} else {
assert(subviewType == SubviewType::Ellipsis);
Calculation::AdditionalInformationType additionalInfoType = selectedCell->additionalInformationType();
ListController * vc = nullptr;
Expression e = calculationAtIndex(focusRow)->exactOutput();
if (additionalInfoType == Calculation::AdditionalInformationType::Complex) {
vc = &m_complexController;
} else if (additionalInfoType == Calculation::AdditionalInformationType::SecondDegree) {
vc = &m_secondDegreeController;
} else if (additionalInfoType == Calculation::AdditionalInformationType::Trigonometry) {
vc = &m_trigonometryController;
// Find which of the input or output is the cosine/sine
ExpressionNode::Type t = e.type();
e = t == ExpressionNode::Type::Cosine || t == ExpressionNode::Type::Sine ? e : calculationAtIndex(focusRow)->input();
} else if (additionalInfoType == Calculation::AdditionalInformationType::Integer) {
vc = &m_integerController;
} else if (additionalInfoType == Calculation::AdditionalInformationType::Rational) {
vc = &m_rationalController;
} else if (additionalInfoType == Calculation::AdditionalInformationType::Unit) {
vc = &m_unitController;
} else if (additionalInfoType == Calculation::AdditionalInformationType::Matrix) {
vc = &m_matrixController;
}
if (vc) {
vc->setExpression(e);
Container::activeApp()->displayModalViewController(vc, 0.f, 0.f, Metric::CommonTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin);
}
}
return true;
}
@@ -68,24 +128,16 @@ bool HistoryController::handleEvent(Ion::Events::Event event) {
int focusRow = selectedRow();
SubviewType subviewType = selectedSubviewType();
m_selectableTableView.deselectTable();
EditExpressionController * editController = (EditExpressionController *)parentResponder();
m_calculationStore->deleteCalculationAtIndex(storeIndex(focusRow));
reload();
if (numberOfRows()== 0) {
Container::activeApp()->setFirstResponder(editController);
Container::activeApp()->setFirstResponder(parentResponder());
return true;
}
if (focusRow > 0) {
m_selectableTableView.selectCellAtLocation(0, focusRow-1);
} else {
m_selectableTableView.selectCellAtLocation(0, 0);
}
if (subviewType == SubviewType::Input) {
tableViewDidChangeSelection(&m_selectableTableView, 0, selectedRow());
} else {
tableViewDidChangeSelection(&m_selectableTableView, 0, -1);
}
m_selectableTableView.scrollToCell(0, selectedRow());
m_selectableTableView.selectCellAtLocation(0, focusRow > 0 ? focusRow - 1 : 0);
/* The parameters 'sameCell' and 'previousSelectedY' are chosen to enforce
* toggling of the output when necessary. */
setSelectedSubviewType(subviewType, false, 0, (subviewType == SubviewType::Input) ? selectedRow() : -1);
return true;
}
if (event == Ion::Events::Clear) {
@@ -96,9 +148,8 @@ bool HistoryController::handleEvent(Ion::Events::Event event) {
return true;
}
if (event == Ion::Events::Back) {
EditExpressionController * editController = (EditExpressionController *)parentResponder();
m_selectableTableView.deselectTable();
Container::activeApp()->setFirstResponder(editController);
Container::activeApp()->setFirstResponder(parentResponder());
return true;
}
return false;
@@ -108,18 +159,23 @@ Shared::ExpiringPointer<Calculation> HistoryController::calculationAtIndex(int i
return m_calculationStore->calculationAtIndex(storeIndex(i));
}
void HistoryController::tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY, bool withinTemporarySelection) {
void HistoryController::tableViewDidChangeSelectionAndDidScroll(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY, bool withinTemporarySelection) {
if (withinTemporarySelection || previousSelectedCellY == selectedRow()) {
return;
}
HistoryViewCell * cell = static_cast<HistoryViewCell *>(t->selectedCell());
if (previousSelectedCellY == -1) {
setSelectedSubviewType(SubviewType::Output, cell);
} else if (selectedRow() < previousSelectedCellY) {
setSelectedSubviewType(SubviewType::Output, cell);
} else if (selectedRow() > previousSelectedCellY) {
setSelectedSubviewType(SubviewType::Input, cell);
setSelectedSubviewType(SubviewType::Output, false, previousSelectedCellX, previousSelectedCellY);
} else if (selectedRow() == -1) {
setSelectedSubviewType(SubviewType::Input, false, previousSelectedCellX, previousSelectedCellY);
} else {
HistoryViewCell * selectedCell = (HistoryViewCell *)(t->selectedCell());
SubviewType nextSelectedSubviewType = selectedSubviewType();
if (selectedCell && !selectedCell->displaysSingleLine()) {
nextSelectedSubviewType = previousSelectedCellY < selectedRow() ? SubviewType::Input : SubviewType::Output;
}
setSelectedSubviewType(nextSelectedSubviewType, false, previousSelectedCellX, previousSelectedCellY);
}
// The selectedCell may change during setSelectedSubviewType
HistoryViewCell * selectedCell = (HistoryViewCell *)(t->selectedCell());
if (selectedCell == nullptr) {
return;
@@ -147,7 +203,7 @@ void HistoryController::willDisplayCellForIndex(HighlightCell * cell, int index)
HistoryViewCell * myCell = (HistoryViewCell *)cell;
myCell->setCalculation(calculationAtIndex(index).pointer(), index == selectedRow() && selectedSubviewType() == SubviewType::Output);
myCell->setEven(index%2 == 0);
myCell->setHighlighted(myCell->isHighlighted());
myCell->reloadSubviewHighlight();
}
KDCoordinate HistoryController::rowHeight(int j) {
@@ -155,21 +211,49 @@ KDCoordinate HistoryController::rowHeight(int j) {
return 0;
}
Shared::ExpiringPointer<Calculation> calculation = calculationAtIndex(j);
return calculation->height(App::app()->localContext(), j == selectedRow() && selectedSubviewType() == SubviewType::Output) + 4 * Metric::CommonSmallMargin;
bool expanded = j == selectedRow() && selectedSubviewType() == SubviewType::Output;
return calculation->height(expanded);
}
int HistoryController::typeAtLocation(int i, int j) {
return 0;
}
void HistoryController::scrollToCell(int i, int j) {
m_selectableTableView.scrollToCell(i, j);
bool HistoryController::calculationAtIndexToggles(int index) {
Context * context = App::app()->localContext();
return index >= 0 && index < m_calculationStore->numberOfCalculations() && calculationAtIndex(index)->displayOutput(context) == Calculation::DisplayOutput::ExactAndApproximateToggle;
}
void HistoryController::historyViewCellDidChangeSelection() {
/* Update the whole table as the height of the selected cell row might have
* changed. */
m_selectableTableView.reloadData();
void HistoryController::setSelectedSubviewType(SubviewType subviewType, bool sameCell, int previousSelectedX, int previousSelectedY) {
// Avoid selecting non-displayed ellipsis
HistoryViewCell * selectedCell = static_cast<HistoryViewCell *>(m_selectableTableView.selectedCell());
if (subviewType == SubviewType::Ellipsis && selectedCell && selectedCell->additionalInformationType() == Calculation::AdditionalInformationType::None) {
subviewType = SubviewType::Output;
}
HistoryViewCellDataSource::setSelectedSubviewType(subviewType, sameCell, previousSelectedX, previousSelectedY);
}
void HistoryController::historyViewCellDidChangeSelection(HistoryViewCell ** cell, HistoryViewCell ** previousCell, int previousSelectedCellX, int previousSelectedCellY, SubviewType type, SubviewType previousType) {
/* If the selection change triggers the toggling of the outputs, we update
* the whole table as the height of the selected cell row might have changed. */
if ((type == SubviewType::Output || previousType == SubviewType::Output) && (calculationAtIndexToggles(selectedRow()) || calculationAtIndexToggles(previousSelectedCellY))) {
m_selectableTableView.reloadData();
}
// It might be necessary to scroll to the sub type if the cell overflows the screen
if (selectedRow() >= 0) {
m_selectableTableView.scrollToSubviewOfTypeOfCellAtLocation(type, m_selectableTableView.selectedColumn(), m_selectableTableView.selectedRow());
}
// Fill the selected cell and the previous selected cell because cells repartition might have changed
*cell = static_cast<HistoryViewCell *>(m_selectableTableView.selectedCell());
*previousCell = static_cast<HistoryViewCell *>(m_selectableTableView.cellAtLocation(previousSelectedCellX, previousSelectedCellY));
/* 'reloadData' calls 'willDisplayCellForIndex' for each cell while the table
* has been deselected. To reload the expanded cell, we call one more time
* 'willDisplayCellForIndex' but once the right cell has been selected. */
if (*cell) {
willDisplayCellForIndex(*cell, selectedRow());
}
}
}

View File

@@ -5,6 +5,13 @@
#include "history_view_cell.h"
#include "calculation_store.h"
#include "selectable_table_view.h"
#include "additional_outputs/complex_list_controller.h"
#include "additional_outputs/integer_list_controller.h"
#include "additional_outputs/rational_list_controller.h"
#include "additional_outputs/second_degree_list_controller.h"
#include "additional_outputs/trigonometry_list_controller.h"
#include "additional_outputs/unit_list_controller.h"
#include "additional_outputs/matrix_list_controller.h"
namespace Calculation {
@@ -12,9 +19,11 @@ class App;
class HistoryController : public ViewController, public ListViewDataSource, public SelectableTableViewDataSource, public SelectableTableViewDelegate, public HistoryViewCellDataSource {
public:
HistoryController(Responder * parentResponder, CalculationStore * calculationStore);
HistoryController(EditExpressionController * editExpressionController, CalculationStore * calculationStore);
View * view() override { return &m_selectableTableView; }
bool handleEvent(Ion::Events::Event event) override;
void viewWillAppear() override;
TELEMETRY_ID("");
void didBecomeFirstResponder() override;
void willExitResponderChain(Responder * nextFirstResponder) override;
void reload();
@@ -24,17 +33,25 @@ public:
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
KDCoordinate rowHeight(int j) override;
int typeAtLocation(int i, int j) override;
void tableViewDidChangeSelection(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY, bool withinTemporarySelection = false) override;
void scrollToCell(int i, int j);
void setSelectedSubviewType(SubviewType subviewType, bool sameCell, int previousSelectedX = -1, int previousSelectedY = -1) override;
void tableViewDidChangeSelectionAndDidScroll(SelectableTableView * t, int previousSelectedCellX, int previousSelectedCellY, bool withinTemporarySelection = false) override;
private:
int storeIndex(int i) { return numberOfRows() - i - 1; }
Shared::ExpiringPointer<Calculation> calculationAtIndex(int i);
CalculationSelectableTableView * selectableTableView();
void historyViewCellDidChangeSelection() override;
constexpr static int k_maxNumberOfDisplayedRows = 5;
bool calculationAtIndexToggles(int index);
void historyViewCellDidChangeSelection(HistoryViewCell ** cell, HistoryViewCell ** previousCell, int previousSelectedCellX, int previousSelectedCellY, SubviewType type, SubviewType previousType) override;
constexpr static int k_maxNumberOfDisplayedRows = 8;
CalculationSelectableTableView m_selectableTableView;
HistoryViewCell m_calculationHistory[k_maxNumberOfDisplayedRows];
CalculationStore * m_calculationStore;
ComplexListController m_complexController;
IntegerListController m_integerController;
RationalListController m_rationalController;
SecondDegreeListController m_secondDegreeController;
TrigonometryListController m_trigonometryController;
UnitListController m_unitController;
MatrixListController m_matrixController;
};
}

View File

@@ -2,42 +2,58 @@
#include "app.h"
#include "../constant.h"
#include "selectable_table_view.h"
#include <poincare/exception_checkpoint.h>
#include <assert.h>
#include <string.h>
#include <algorithm>
namespace Calculation {
static inline KDCoordinate minCoordinate(KDCoordinate x, KDCoordinate y) { return x < y ? x : y; }
static inline KDCoordinate maxCoordinate(KDCoordinate x, KDCoordinate y) { return x > y ? x : y; }
/* HistoryViewCellDataSource */
HistoryViewCellDataSource::HistoryViewCellDataSource() :
m_selectedSubviewType(SubviewType::Output) {}
void HistoryViewCellDataSource::setSelectedSubviewType(SubviewType subviewType, HistoryViewCell * cell) {
void HistoryViewCellDataSource::setSelectedSubviewType(SubviewType subviewType, bool sameCell, int previousSelectedCellX, int previousSelectedCellY) {
HistoryViewCell * selectedCell = nullptr;
HistoryViewCell * previouslySelectedCell = nullptr;
SubviewType previousSubviewType = m_selectedSubviewType;
m_selectedSubviewType = subviewType;
if (cell) {
cell->setHighlighted(cell->isHighlighted());
cell->cellDidSelectSubview(subviewType);
/* We need to notify the whole table that the selection changed if it
* involves the selection/deselection of an output. Indeed, only them can
* trigger change in the displayed expressions. */
historyViewCellDidChangeSelection(&selectedCell, &previouslySelectedCell, previousSelectedCellX, previousSelectedCellY, subviewType, previousSubviewType);
previousSubviewType = sameCell ? previousSubviewType : SubviewType::None;
if (selectedCell) {
selectedCell->reloadSubviewHighlight();
selectedCell->cellDidSelectSubview(subviewType, previousSubviewType);
Container::activeApp()->setFirstResponder(selectedCell);
}
if (previouslySelectedCell) {
previouslySelectedCell->cellDidSelectSubview(SubviewType::Input);
}
historyViewCellDidChangeSelection();
}
/* HistoryViewCell */
HistoryViewCell::HistoryViewCell(Responder * parentResponder) :
Responder(parentResponder),
m_calculationDisplayOutput(Calculation::DisplayOutput::Unknown),
m_calculationExpanded(false),
m_inputView(this),
m_scrollableOutputView(this)
{
m_calculationCRC32 = 0;
KDCoordinate HistoryViewCell::Height(Calculation * calculation, bool expanded) {
HistoryViewCell cell(nullptr);
cell.setCalculation(calculation, expanded, true);
KDRect ellipsisFrame = KDRectZero;
KDRect inputFrame = KDRectZero;
KDRect outputFrame = KDRectZero;
cell.computeSubviewFrames(Ion::Display::Width, KDCOORDINATE_MAX, &ellipsisFrame, &inputFrame, &outputFrame);
return k_margin + inputFrame.unionedWith(outputFrame).height() + k_margin;
}
Shared::ScrollableExactApproximateExpressionsView * HistoryViewCell::outputView() {
return &m_scrollableOutputView;
HistoryViewCell::HistoryViewCell(Responder * parentResponder) :
Responder(parentResponder),
m_calculationCRC32(0),
m_calculationDisplayOutput(Calculation::DisplayOutput::Unknown),
m_calculationAdditionInformation(Calculation::AdditionalInformationType::None),
m_inputView(this, k_inputViewHorizontalMargin, k_inputOutputViewsVerticalMargin),
m_scrollableOutputView(this),
m_calculationExpanded(false),
m_calculationSingleLine(false)
{
}
void HistoryViewCell::setEven(bool even) {
@@ -45,18 +61,32 @@ void HistoryViewCell::setEven(bool even) {
m_inputView.setBackgroundColor(backgroundColor());
m_scrollableOutputView.setBackgroundColor(backgroundColor());
m_scrollableOutputView.evenOddCell()->setEven(even);
m_ellipsis.setEven(even);
}
void HistoryViewCell::setHighlighted(bool highlight) {
assert(m_dataSource);
if (m_highlighted == highlight) {
return;
}
m_highlighted = highlight;
reloadSubviewHighlight();
// Re-layout as the ellispsis subview might have appear/disappear
layoutSubviews();
}
void HistoryViewCell::reloadSubviewHighlight() {
assert(m_dataSource);
m_inputView.setExpressionBackgroundColor(backgroundColor());
m_scrollableOutputView.evenOddCell()->setHighlighted(false);
m_ellipsis.setHighlighted(false);
if (isHighlighted()) {
if (m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Input) {
m_inputView.setExpressionBackgroundColor(Palette::ListCellBackgroundSelected);
} else {
m_inputView.setExpressionBackgroundColor(*Palette::Select);
} else if (m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Output) {
m_scrollableOutputView.evenOddCell()->setHighlighted(true);
} else {
assert(m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Ellipsis);
m_ellipsis.setHighlighted(true);
}
}
}
@@ -75,30 +105,35 @@ void HistoryViewCell::reloadScroll() {
m_scrollableOutputView.reloadScroll();
}
void HistoryViewCell::reloadOutputSelection() {
void HistoryViewCell::reloadOutputSelection(HistoryViewCellDataSource::SubviewType previousType) {
/* Select the right output according to the calculation display output. This
* will reload the scroll to display the selected output. */
if (m_calculationDisplayOutput == Calculation::DisplayOutput::ExactAndApproximate) {
m_scrollableOutputView.setSelectedSubviewPosition(Shared::ScrollableExactApproximateExpressionsView::SubviewPosition::Left);
m_scrollableOutputView.setSelectedSubviewPosition(
previousType == HistoryViewCellDataSource::SubviewType::Ellipsis ?
Shared::ScrollableTwoExpressionsView::SubviewPosition::Right :
Shared::ScrollableTwoExpressionsView::SubviewPosition::Center
);
} else {
assert((m_calculationDisplayOutput == Calculation::DisplayOutput::ApproximateOnly)
|| (m_calculationDisplayOutput == Calculation::DisplayOutput::ExactAndApproximateToggle)
|| (m_calculationDisplayOutput == Calculation::DisplayOutput::ExactOnly));
m_scrollableOutputView.setSelectedSubviewPosition(Shared::ScrollableExactApproximateExpressionsView::SubviewPosition::Right);
m_scrollableOutputView.setSelectedSubviewPosition(Shared::ScrollableTwoExpressionsView::SubviewPosition::Right);
}
}
void HistoryViewCell::cellDidSelectSubview(HistoryViewCellDataSource::SubviewType type) {
void HistoryViewCell::cellDidSelectSubview(HistoryViewCellDataSource::SubviewType type, HistoryViewCellDataSource::SubviewType previousType) {
// Init output selection
if (type == HistoryViewCellDataSource::SubviewType::Output) {
reloadOutputSelection();
reloadOutputSelection(previousType);
}
// Update m_calculationExpanded
m_calculationExpanded = (type == HistoryViewCellDataSource::SubviewType::Output && m_calculationDisplayOutput == Calculation::DisplayOutput::ExactAndApproximateToggle);
/* The selected subview has changed. The displayed outputs might have changed.
* For example, for the calculation 1.2+2 --> 3.2, selecting the output would
* display 1.2+2 --> 16/5 = 3.2. */
m_calculationExpanded = (type == HistoryViewCellDataSource::SubviewType::Output);
m_scrollableOutputView.setDisplayLeftLayout(displayLeftLayout());
m_scrollableOutputView.setDisplayCenter(m_calculationDisplayOutput == Calculation::DisplayOutput::ExactAndApproximate || m_calculationExpanded);
/* The displayed outputs have changed. We need to re-layout the cell
* and re-initialize the scroll. */
@@ -106,62 +141,167 @@ void HistoryViewCell::cellDidSelectSubview(HistoryViewCellDataSource::SubviewTyp
reloadScroll();
}
KDColor HistoryViewCell::backgroundColor() const {
KDColor background = m_even ? Palette::CalculationBackgroundEven : Palette::CalculationBackgroundOdd;
return background;
}
int HistoryViewCell::numberOfSubviews() const {
return 2;
}
View * HistoryViewCell::subviewAtIndex(int index) {
View * views[2] = {&m_inputView, &m_scrollableOutputView};
/* The order of the subviews should not matter here as they don't overlap.
* However, the order determines the order of redrawing as well. For several
* reasons listed after, changing subview selection often redraws the entire
* m_scrollableOutputView even if it seems unecessary:
* - Before feeding new Layouts to ExpressionViews, we reset the hold layouts
* in order to empty the Poincare pool and have more space to compute new
* layouts.
* - Even if we did not do that, ExpressionView::setLayout doesn't avoid
* redrawing when the previous expression is identical (for reasons
* explained in expression_view.cpp)
* - Because of the toggling burger view, ExpressionViews often have the same
* absolute frame but a different relative frame which leads to redrawing
* them anyway.
* All these reasons cause a blinking which can be avoided if we redraw the
* output view before the input view (starting with redrawing the more
* complex view enables to redraw it before the vblank thereby preventing
* blinking).
* TODO: this is a dirty hack which should be fixed! */
View * views[3] = {&m_scrollableOutputView, &m_inputView, &m_ellipsis};
return views[index];
}
void HistoryViewCell::layoutSubviews() {
KDCoordinate maxFrameWidth = bounds().width();
KDSize inputSize = m_inputView.minimalSizeForOptimalDisplay();
m_inputView.setFrame(KDRect(
0,
0,
minCoordinate(maxFrameWidth, inputSize.width()),
inputSize.height()
));
KDSize outputSize = m_scrollableOutputView.minimalSizeForOptimalDisplay();
m_scrollableOutputView.setFrame(KDRect(
maxCoordinate(0, maxFrameWidth - outputSize.width()),
inputSize.height(),
minCoordinate(maxFrameWidth, outputSize.width()),
outputSize.height()
));
bool HistoryViewCell::ViewsCanBeSingleLine(KDCoordinate inputViewWidth, KDCoordinate outputViewWidth) {
// k_margin is the separation between the input and output.
return (inputViewWidth + k_margin + outputViewWidth) < Ion::Display::Width - Metric::EllipsisCellWidth;
}
void HistoryViewCell::setCalculation(Calculation * calculation, bool expanded) {
void HistoryViewCell::layoutSubviews(bool force) {
KDRect frameBounds = bounds();
if (bounds().width() <= 0 || bounds().height() <= 0) {
// TODO Make this behaviour in a non-virtual layoutSublviews, and all layout subviews should become privateLayoutSubviews
return;
}
KDRect ellipsisFrame = KDRectZero;
KDRect inputFrame = KDRectZero;
KDRect outputFrame = KDRectZero;
computeSubviewFrames(frameBounds.width(), frameBounds.height(), &ellipsisFrame, &inputFrame, &outputFrame);
m_ellipsis.setFrame(ellipsisFrame, force); // Required even if ellipsisFrame is KDRectZero, to mark previous rect as dirty
m_inputView.setFrame(inputFrame,force);
m_scrollableOutputView.setFrame(outputFrame, force);
}
void HistoryViewCell::computeSubviewFrames(KDCoordinate frameWidth, KDCoordinate frameHeight, KDRect * ellipsisFrame, KDRect * inputFrame, KDRect * outputFrame) {
assert(ellipsisFrame != nullptr && inputFrame != nullptr && outputFrame != nullptr);
if (displayedEllipsis()) {
*ellipsisFrame = KDRect(frameWidth - Metric::EllipsisCellWidth, 0, Metric::EllipsisCellWidth, frameHeight);
frameWidth -= Metric::EllipsisCellWidth;
} else {
*ellipsisFrame = KDRectZero;
}
KDSize inputSize = m_inputView.minimalSizeForOptimalDisplay();
KDSize outputSize = m_scrollableOutputView.minimalSizeForOptimalDisplay();
/* To compute if the calculation is on a single line, use the expanded width
* if there is both an exact and an approximate layout. */
m_calculationSingleLine = ViewsCanBeSingleLine(inputSize.width(), m_scrollableOutputView.minimalSizeForOptimalDisplayFullSize().width());
KDCoordinate inputY = k_margin;
KDCoordinate outputY = k_margin;
if (m_calculationSingleLine && !m_inputView.layout().isUninitialized()) {
KDCoordinate inputBaseline = m_inputView.layout().baseline();
KDCoordinate outputBaseline = m_scrollableOutputView.baseline();
KDCoordinate baselineDifference = outputBaseline - inputBaseline;
if (baselineDifference > 0) {
inputY += baselineDifference;
} else {
outputY += -baselineDifference;
}
} else {
outputY += inputSize.height();
}
*inputFrame = KDRect(
0,
inputY,
std::min(frameWidth, inputSize.width()),
inputSize.height());
*outputFrame = KDRect(
std::max(0, frameWidth - outputSize.width()),
outputY,
std::min(frameWidth, outputSize.width()),
outputSize.height());
}
void HistoryViewCell::resetMemoization() {
// Clean the layouts to make room in the pool
// TODO: maybe do this only when the layout won't change to avoid blinking
m_inputView.setLayout(Poincare::Layout());
m_scrollableOutputView.setLayouts(Poincare::Layout(), Poincare::Layout(), Poincare::Layout());
m_calculationCRC32 = 0;
}
void HistoryViewCell::setCalculation(Calculation * calculation, bool expanded, bool canChangeDisplayOutput) {
uint32_t newCalculationCRC = Ion::crc32Byte((const uint8_t *)calculation, ((char *)calculation->next()) - ((char *) calculation));
if (m_calculationExpanded == expanded && newCalculationCRC == m_calculationCRC32) {
if (newCalculationCRC == m_calculationCRC32 && m_calculationExpanded == expanded) {
return;
}
Poincare::Context * context = App::app()->localContext();
// Clean the layouts to make room in the pool
m_inputView.setLayout(Poincare::Layout());
m_scrollableOutputView.setLayouts(Poincare::Layout(), Poincare::Layout());
// TODO: maybe do this only when the layout won't change to avoid blinking
resetMemoization();
// Memoization
m_calculationCRC32 = newCalculationCRC;
m_calculationExpanded = expanded;
m_calculationDisplayOutput = calculation->displayOutput(context);
m_calculationExpanded = expanded && calculation->displayOutput(context) == ::Calculation::Calculation::DisplayOutput::ExactAndApproximateToggle;
m_calculationAdditionInformation = calculation->additionalInformationType(context);
m_inputView.setLayout(calculation->createInputLayout());
/* Both output expressions have to be updated at the same time. Otherwise,
/* All expressions have to be updated at the same time. Otherwise,
* when updating one layout, if the second one still points to a deleted
* layout, calling to layoutSubviews() would fail. */
Poincare::Layout leftOutputLayout = calculation->createExactOutputLayout();
Poincare::Layout rightOutputLayout = (m_calculationDisplayOutput == Calculation::DisplayOutput::ExactOnly) ? leftOutputLayout :
calculation->createApproximateOutputLayout(context);
m_scrollableOutputView.setDisplayLeftLayout(displayLeftLayout()); // Must be before the setLayouts fo the reload
m_scrollableOutputView.setLayouts(rightOutputLayout, leftOutputLayout);
// Create the exact output layout
Poincare::Layout exactOutputLayout = Poincare::Layout();
if (Calculation::DisplaysExact(calculation->displayOutput(context))) {
bool couldNotCreateExactLayout = false;
exactOutputLayout = calculation->createExactOutputLayout(&couldNotCreateExactLayout);
if (couldNotCreateExactLayout) {
if (canChangeDisplayOutput && calculation->displayOutput(context) != ::Calculation::Calculation::DisplayOutput::ExactOnly) {
calculation->forceDisplayOutput(::Calculation::Calculation::DisplayOutput::ApproximateOnly);
} else {
/* We should only display the exact result, but we cannot create it
* -> raise an exception. */
Poincare::ExceptionCheckpoint::Raise();
}
}
}
// Create the approximate output layout
Poincare::Layout approximateOutputLayout;
if (calculation->displayOutput(context) == ::Calculation::Calculation::DisplayOutput::ExactOnly) {
approximateOutputLayout = exactOutputLayout;
} else {
bool couldNotCreateApproximateLayout = false;
approximateOutputLayout = calculation->createApproximateOutputLayout(context, &couldNotCreateApproximateLayout);
if (couldNotCreateApproximateLayout) {
if (canChangeDisplayOutput && calculation->displayOutput(context) != ::Calculation::Calculation::DisplayOutput::ApproximateOnly) {
/* Set the display output to ApproximateOnly, make room in the pool by
* erasing the exact layout, and retry to create the approximate layout */
calculation->forceDisplayOutput(::Calculation::Calculation::DisplayOutput::ApproximateOnly);
exactOutputLayout = Poincare::Layout();
couldNotCreateApproximateLayout = false;
approximateOutputLayout = calculation->createApproximateOutputLayout(context, &couldNotCreateApproximateLayout);
if (couldNotCreateApproximateLayout) {
Poincare::ExceptionCheckpoint::Raise();
}
} else {
Poincare::ExceptionCheckpoint::Raise();
}
}
}
m_calculationDisplayOutput = calculation->displayOutput(context);
// We must set which subviews are displayed before setLayouts to mark the right rectangle as dirty
m_scrollableOutputView.setDisplayableCenter(m_calculationDisplayOutput == Calculation::DisplayOutput::ExactAndApproximate || m_calculationDisplayOutput == Calculation::DisplayOutput::ExactAndApproximateToggle);
m_scrollableOutputView.setDisplayCenter(m_calculationDisplayOutput == Calculation::DisplayOutput::ExactAndApproximate || m_calculationExpanded);
m_scrollableOutputView.setLayouts(Poincare::Layout(), exactOutputLayout, approximateOutputLayout);
I18n::Message equalMessage = calculation->exactAndApproximateDisplayedOutputsAreEqual(context) == Calculation::EqualSign::Equal ? I18n::Message::Equal : I18n::Message::AlmostEqual;
m_scrollableOutputView.setEqualMessage(equalMessage);
@@ -175,28 +315,47 @@ void HistoryViewCell::didBecomeFirstResponder() {
assert(m_dataSource);
if (m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Input) {
Container::activeApp()->setFirstResponder(&m_inputView);
} else {
} else if (m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Output) {
Container::activeApp()->setFirstResponder(&m_scrollableOutputView);
}
}
bool HistoryViewCell::handleEvent(Ion::Events::Event event) {
assert(m_dataSource);
if ((event == Ion::Events::Down && m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Input) ||
(event == Ion::Events::Up && m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Output)) {
HistoryViewCellDataSource::SubviewType otherSubviewType = m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Input ? HistoryViewCellDataSource::SubviewType::Output : HistoryViewCellDataSource::SubviewType::Input;
m_dataSource->setSelectedSubviewType(otherSubviewType, this);
CalculationSelectableTableView * tableView = (CalculationSelectableTableView *)parentResponder();
tableView->scrollToSubviewOfTypeOfCellAtLocation(otherSubviewType, tableView->selectedColumn(), tableView->selectedRow());
Container::activeApp()->setFirstResponder(this);
return true;
assert(m_dataSource != nullptr);
HistoryViewCellDataSource::SubviewType type = m_dataSource->selectedSubviewType();
assert(type != HistoryViewCellDataSource::SubviewType::None);
HistoryViewCellDataSource::SubviewType otherSubviewType = HistoryViewCellDataSource::SubviewType::None;
if (m_calculationSingleLine) {
static_assert(
static_cast<int>(HistoryViewCellDataSource::SubviewType::None) == 0
&& static_cast<int>(HistoryViewCellDataSource::SubviewType::Input) == 1
&& static_cast<int>(HistoryViewCellDataSource::SubviewType::Output) == 2
&& static_cast<int>(HistoryViewCellDataSource::SubviewType::Ellipsis) == 3,
"The array types is not well-formed anymore");
HistoryViewCellDataSource::SubviewType types[] = {
HistoryViewCellDataSource::SubviewType::None,
HistoryViewCellDataSource::SubviewType::Input,
HistoryViewCellDataSource::SubviewType::Output,
displayedEllipsis() ? HistoryViewCellDataSource::SubviewType::Ellipsis : HistoryViewCellDataSource::SubviewType::None,
HistoryViewCellDataSource::SubviewType::None,
};
if (event == Ion::Events::Right || event == Ion::Events::Left) {
otherSubviewType = types[static_cast<int>(type) + (event == Ion::Events::Right ? 1 : -1)];
}
} else if ((event == Ion::Events::Down && type == HistoryViewCellDataSource::SubviewType::Input)
|| (event == Ion::Events::Left && type == HistoryViewCellDataSource::SubviewType::Ellipsis))
{
otherSubviewType = HistoryViewCellDataSource::SubviewType::Output;
} else if (event == Ion::Events::Up && type == HistoryViewCellDataSource::SubviewType::Output) {
otherSubviewType = HistoryViewCellDataSource::SubviewType::Input;
} else if (event == Ion::Events::Right && type != HistoryViewCellDataSource::SubviewType::Ellipsis && displayedEllipsis()) {
otherSubviewType = HistoryViewCellDataSource::SubviewType::Ellipsis;
}
return false;
}
bool HistoryViewCell::displayLeftLayout() const {
return (m_calculationDisplayOutput == Calculation::DisplayOutput::ExactAndApproximate)
|| (m_calculationDisplayOutput == Calculation::DisplayOutput::ExactAndApproximateToggle && m_calculationExpanded);
if (otherSubviewType == HistoryViewCellDataSource::SubviewType::None) {
return false;
}
m_dataSource->setSelectedSubviewType(otherSubviewType, true);
return true;
}
}

View File

@@ -3,8 +3,7 @@
#include <escher.h>
#include "calculation.h"
#include "scrollable_expression_view.h"
#include "../shared/scrollable_exact_approximate_expressions_view.h"
#include "../shared/scrollable_multiple_expressions_view.h"
namespace Calculation {
@@ -13,50 +12,71 @@ class HistoryViewCell;
class HistoryViewCellDataSource {
public:
enum class SubviewType {
Input,
Output
None = 0,
Input = 1,
Output = 2,
Ellipsis = 3
};
HistoryViewCellDataSource();
void setSelectedSubviewType(SubviewType subviewType, HistoryViewCell * cell = nullptr);
SubviewType selectedSubviewType() { return m_selectedSubviewType; }
HistoryViewCellDataSource() : m_selectedSubviewType(SubviewType::Output) {}
virtual void setSelectedSubviewType(SubviewType subviewType, bool sameCell, int previousSelectedX = -1, int previousSelectedY = -1);
SubviewType selectedSubviewType() const { return m_selectedSubviewType; }
private:
/* This method should belong to a delegate instead of a data source but as
* both the data source and the delegate will be the same controller, we
* avoid keeping 2 pointers in HistoryViewCell. */
virtual void historyViewCellDidChangeSelection() = 0;
// It returns the selected cell at the end of the method
virtual void historyViewCellDidChangeSelection(HistoryViewCell ** cell, HistoryViewCell ** previousCell, int previousSelectedCellX, int previousSelectedCellY, SubviewType type, SubviewType previousType) = 0;
SubviewType m_selectedSubviewType;
};
class HistoryViewCell : public ::EvenOddCell, public Responder {
public:
constexpr static KDCoordinate k_margin = Metric::CommonSmallMargin;
constexpr static KDCoordinate k_inputOutputViewsVerticalMargin = k_margin;
constexpr static KDCoordinate k_inputViewHorizontalMargin = Shared::AbstractScrollableMultipleExpressionsView::k_horizontalMargin;
static KDCoordinate Height(Calculation * calculation, bool expanded);
HistoryViewCell(Responder * parentResponder = nullptr);
void cellDidSelectSubview(HistoryViewCellDataSource::SubviewType type);
static bool ViewsCanBeSingleLine(KDCoordinate inputViewWidth, KDCoordinate outputViewWidth);
void cellDidSelectSubview(HistoryViewCellDataSource::SubviewType type, HistoryViewCellDataSource::SubviewType previousType = HistoryViewCellDataSource::SubviewType::None);
void setEven(bool even) override;
void setHighlighted(bool highlight) override;
void reloadSubviewHighlight();
void setDataSource(HistoryViewCellDataSource * dataSource) { m_dataSource = dataSource; }
bool displaysSingleLine() const {
return m_calculationSingleLine;
}
Responder * responder() override {
return this;
}
Poincare::Layout layout() const override;
KDColor backgroundColor() const override;
void setCalculation(Calculation * calculation, bool expanded = false);
int numberOfSubviews() const override;
KDColor backgroundColor() const override { return m_even ? *Palette::CalculationBackgroundEven : *Palette::CalculationBackgroundOdd; }
void resetMemoization();
void setCalculation(Calculation * calculation, bool expanded, bool canChangeDisplayOutput = false);
int numberOfSubviews() const override { return 2 + displayedEllipsis(); }
View * subviewAtIndex(int index) override;
void layoutSubviews() override;
void layoutSubviews(bool force = false) override;
void didBecomeFirstResponder() override;
bool handleEvent(Ion::Events::Event event) override;
Shared::ScrollableExactApproximateExpressionsView * outputView();
Shared::ScrollableTwoExpressionsView * outputView() { return &m_scrollableOutputView; }
ScrollableExpressionView * inputView() { return &m_inputView; }
Calculation::AdditionalInformationType additionalInformationType() const { return m_calculationAdditionInformation; }
private:
constexpr static KDCoordinate k_resultWidth = 80;
void computeSubviewFrames(KDCoordinate frameWidth, KDCoordinate frameHeight, KDRect * ellipsisFrame, KDRect * inputFrame, KDRect * outputFrame);
void reloadScroll();
void reloadOutputSelection();
bool displayLeftLayout() const;
void reloadOutputSelection(HistoryViewCellDataSource::SubviewType previousType);
bool displayedEllipsis() const {
return m_highlighted && m_calculationAdditionInformation != Calculation::AdditionalInformationType::None;
}
uint32_t m_calculationCRC32;
Calculation::DisplayOutput m_calculationDisplayOutput;
bool m_calculationExpanded;
Calculation::AdditionalInformationType m_calculationAdditionInformation;
ScrollableExpressionView m_inputView;
Shared::ScrollableExactApproximateExpressionsView m_scrollableOutputView;
Shared::ScrollableTwoExpressionsView m_scrollableOutputView;
EvenOddCellWithEllipsis m_ellipsis;
HistoryViewCellDataSource * m_dataSource;
bool m_calculationExpanded;
bool m_calculationSingleLine;
};
}

View File

@@ -1,21 +0,0 @@
#ifndef CALCULATION_SCROLLABLE_EXPRESSION_VIEW_H
#define CALCULATION_SCROLLABLE_EXPRESSION_VIEW_H
#include <escher.h>
namespace Calculation {
class ScrollableExpressionView : public ScrollableView, public ScrollViewDataSource {
public:
ScrollableExpressionView(Responder * parentResponder);
Poincare::Layout layout() const;
void setLayout(Poincare::Layout layout);
void setBackgroundColor(KDColor backgroundColor) override;
void setExpressionBackgroundColor(KDColor backgroundColor);
private:
ExpressionView m_expressionView;
};
}
#endif

View File

@@ -1,4 +1,5 @@
#include "selectable_table_view.h"
#include <algorithm>
namespace Calculation {
@@ -11,30 +12,23 @@ CalculationSelectableTableView::CalculationSelectableTableView(Responder * paren
setDecoratorType(ScrollView::Decorator::Type::None);
}
void CalculationSelectableTableView::scrollToBottom() {
KDCoordinate contentOffsetX = contentOffset().x();
KDCoordinate contentOffsetY = dataSource()->cumulatedHeightFromIndex(dataSource()->numberOfRows()) - maxContentHeightDisplayableWithoutScrolling();
setContentOffset(KDPoint(contentOffsetX, contentOffsetY));
}
void CalculationSelectableTableView::scrollToCell(int i, int j) {
::SelectableTableView::scrollToCell(i, j);
if (m_contentView.bounds().height() < bounds().height()) {
setTopMargin(bounds().height() - m_contentView.bounds().height());
} else {
setTopMargin(0);
}
::SelectableTableView::scrollToCell(i, j);
ScrollView::layoutSubviews();
if (m_contentView.bounds().height() - contentOffset().y() < bounds().height()) {
KDCoordinate contentOffsetX = contentOffset().x();
KDCoordinate contentOffsetY = dataSource()->cumulatedHeightFromIndex(dataSource()->numberOfRows()) - maxContentHeightDisplayableWithoutScrolling();
setContentOffset(KDPoint(contentOffsetX, contentOffsetY));
}
if (dataSource()->numberOfRows() > j && dataSource()->numberOfColumns() > i && dataSource()->rowHeight(j) > bounds().height()) {
KDCoordinate contentOffsetX = contentOffset().x();
KDCoordinate contentOffsetY = contentOffset().y();
if (contentOffsetY > dataSource()->cumulatedHeightFromIndex(j) && contentOffsetY > dataSource()->cumulatedHeightFromIndex(j+1)) {
// Let's scroll the tableView to align the top of the cell to the top
contentOffsetY = dataSource()->cumulatedHeightFromIndex(j);
} else {
// Let's scroll the tableView to align the bottom of the cell to the bottom
contentOffsetY = dataSource()->cumulatedHeightFromIndex(j+1) - maxContentHeightDisplayableWithoutScrolling();
}
setContentOffset(KDPoint(contentOffsetX, contentOffsetY));
// Avoid empty space at the end of the table
scrollToBottom();
}
}
@@ -43,31 +37,66 @@ void CalculationSelectableTableView::scrollToSubviewOfTypeOfCellAtLocation(Histo
return;
}
/* As we scroll, the selected calculation does not use the same history view
* cell, thus, we want to deselect the previous used history view cell. */
if (selectedRow() >= 0) {
HighlightCell * previousCell = selectedCell();
previousCell->setHighlighted(false);
}
* cell, thus, we want to deselect the previous used history view cell. (*) */
unhighlightSelectedCell();
/* Main part of the scroll */
HistoryViewCell * cell = static_cast<HistoryViewCell *>(selectedCell());
assert(cell);
KDCoordinate contentOffsetX = contentOffset().x();
KDCoordinate contentOffsetY = dataSource()->cumulatedHeightFromIndex(j+1) - maxContentHeightDisplayableWithoutScrolling();
if (subviewType == HistoryViewCellDataSource::SubviewType::Input) {
if (j == 0) {
contentOffsetY = 0;
} else {
contentOffsetY = dataSource()->cumulatedHeightFromIndex(j);
}
KDCoordinate contentOffsetY = dataSource()->cumulatedHeightFromIndex(j);
if (cell->displaysSingleLine() && dataSource()->rowHeight(j) > maxContentHeightDisplayableWithoutScrolling()) {
/* If we cannot display the full calculation, we display the selected
* layout as close as possible to the top of the screen without drawing
* empty space between the history and the input field.
*
* Below are some values we can assign to contentOffsetY, and the kinds of
* display they entail :
* (the selected cell is at index j)
*
* 1 - cumulatedHeightFromIndex(j)
* Aligns the top of the cell with the top of the zone in which the
* history can be drawn.
*
* 2 - (cumulatedHeightFromIndex(j+1)
* - maxContentHeightDisplayableWithoutScrolling())
* Aligns the bottom of the cell with the top of the input field.
*
* 3 - cumulatedHeightFromIndex(j) + baseline1 - baseline2
* Aligns the top of the selected layout with the top of the screen (only
* used when the selected layout is the smallest).
*
* The following drawing shows where the calculation would be aligned with
* each value of contentOffsetY, for the calculation (1/3)/(4/2) = 1/6.
*
* (1) (2) (3)
* +--------------+ +--------------+ +--------------+
* | 1 | | --- - | | 3 1 |
* | - | | 4 6 | | --- - |
* | 3 1 | | - | | 4 6 |
* | --- - | | 2 | | - |
* +--------------+ +--------------+ +--------------+
* | (1/3)/(4/2) | | (1/3)/(4/2) | | (1/3)/(4/2) |
* +--------------+ +--------------+ +--------------+
*
* */
contentOffsetY += std::min(
dataSource()->rowHeight(j) - maxContentHeightDisplayableWithoutScrolling(),
std::max(0, (cell->inputView()->layout().baseline() - cell->outputView()->baseline()) * (subviewType == HistoryViewCellDataSource::SubviewType::Input ? -1 : 1)));
} else if (subviewType != HistoryViewCellDataSource::SubviewType::Input) {
contentOffsetY += dataSource()->rowHeight(j) - maxContentHeightDisplayableWithoutScrolling();
}
/* For the same reason, we have to rehighlight the new history view cell and
* inform the delegate which history view cell is highlighted even if the
* selected calculation has not changed. */
setContentOffset(KDPoint(contentOffsetX, contentOffsetY));
HighlightCell * cell = cellAtLocation(i, j);
/* For the same reason as (*), we have to rehighlight the new history view
* cell and reselect the first responder.
* We have to recall "selectedCell" because when the table might have been
* relayouted in "setContentOffset".*/
cell = static_cast<HistoryViewCell *>(selectedCell());
assert(cell);
cell->setHighlighted(true);
if (m_delegate) {
m_delegate->tableViewDidChangeSelection(this, selectedColumn(), selectedRow());
}
Container::activeApp()->setFirstResponder(cell);
}

View File

@@ -9,6 +9,7 @@ class CalculationSelectableTableView : public ::SelectableTableView {
public:
CalculationSelectableTableView(Responder * parentResponder, TableViewDataSource * dataSource,
SelectableTableViewDataSource * selectionDataSource, SelectableTableViewDelegate * delegate = nullptr);
void scrollToBottom();
void scrollToCell(int i, int j) override;
void scrollToSubviewOfTypeOfCellAtLocation(HistoryViewCellDataSource::SubviewType subviewType, int i, int j);
};

11
apps/calculation/test.py Normal file
View File

@@ -0,0 +1,11 @@
import sys, tty
def command_line():
tty.setraw(sys.stdin)
while True:
char = sys.stdin.read(1)
if ord(char) == 3: # CTRL-C
break;
print(ord(char))
sys.stdout.write(u"\u001b[1000D") # Move all the way left
command_line();

View File

@@ -5,112 +5,149 @@
#include <assert.h>
#include "../calculation_store.h"
typedef ::Calculation::Calculation::DisplayOutput DisplayOutput;
typedef ::Calculation::Calculation::EqualSign EqualSign ;
typedef ::Calculation::Calculation::NumberOfSignificantDigits NumberOfSignificantDigits;
using namespace Poincare;
using namespace Calculation;
static constexpr int calculationBufferSize = 10 * (sizeof(::Calculation::Calculation) + ::Calculation::Calculation::k_numberOfExpressions * ::Constant::MaxSerializedExpressionSize + sizeof(::Calculation::Calculation *));
char calculationBuffer[calculationBufferSize];
void assert_store_is(CalculationStore * store, const char * * result) {
for (int i = 0; i < store->numberOfCalculations(); i++) {
quiz_assert(strcmp(store->calculationAtIndex(i)->inputText(), result[i]) == 0);
}
}
KDCoordinate dummyHeight(::Calculation::Calculation * c, bool expanded) { return 0; }
QUIZ_CASE(calculation_store) {
Shared::GlobalContext globalContext;
CalculationStore store;
CalculationStore store(calculationBuffer,calculationBufferSize);
// Store is now {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
const char * result[] = {"9", "8", "7", "6", "5", "4", "3", "2", "1", "0"};
for (int i = 0; i < 10; i++) {
char text[2] = {(char)(i+'0'), 0};
store.push(text, &globalContext);
store.push(text, &globalContext, dummyHeight);
quiz_assert(store.numberOfCalculations() == i+1);
}
assert_store_is(&store, result);
for (int i = 9; i > 0; i = i-2) {
store.deleteCalculationAtIndex(i);
store.deleteCalculationAtIndex(i);
}
// Store is now {9, 7, 5, 3, 1}
const char * result2[] = {"9", "7", "5", "3", "1"};
assert_store_is(&store, result2);
store.deleteAll();
// Checking if the store handles correctly the delete of the oldest calculation when full
static int minSize = ::Calculation::Calculation::MinimalSize();
char text[2] = {'0', 0};
while (store.remainingBufferSize() > minSize) {
store.push(text, &globalContext, dummyHeight);
}
int numberOfCalculations1 = store.numberOfCalculations();
/* The buffer is now to full to push a new calculation.
* Trying to push a new one should delete the oldest one*/
store.push(text, &globalContext, dummyHeight);
int numberOfCalculations2 = store.numberOfCalculations();
// The numberOfCalculations should be the same
quiz_assert(numberOfCalculations1 == numberOfCalculations2);
store.deleteAll();
quiz_assert(store.remainingBufferSize() == store.bufferSize());
}
QUIZ_CASE(calculation_ans) {
Shared::GlobalContext globalContext;
CalculationStore store;
CalculationStore store(calculationBuffer,calculationBufferSize);
store.push("1+3/4", &globalContext);
store.push("ans+2/3", &globalContext);
store.push("1+3/4", &globalContext, dummyHeight);
store.push("ans+2/3", &globalContext, dummyHeight);
Shared::ExpiringPointer<::Calculation::Calculation> lastCalculation = store.calculationAtIndex(0);
quiz_assert(lastCalculation->displayOutput(&globalContext) == ::Calculation::Calculation::DisplayOutput::ExactAndApproximate);
quiz_assert(lastCalculation->displayOutput(&globalContext) == DisplayOutput::ExactAndApproximate);
quiz_assert(strcmp(lastCalculation->exactOutputText(),"29/12") == 0);
store.push("ans+0.22", &globalContext);
store.push("ans+0.22", &globalContext, dummyHeight);
lastCalculation = store.calculationAtIndex(0);
quiz_assert(lastCalculation->displayOutput(&globalContext) == ::Calculation::Calculation::DisplayOutput::ExactAndApproximateToggle);
quiz_assert(strcmp(lastCalculation->approximateOutputText(),"2.6366666666667") == 0);
quiz_assert(lastCalculation->displayOutput(&globalContext) == DisplayOutput::ExactAndApproximateToggle);
quiz_assert(strcmp(lastCalculation->approximateOutputText(NumberOfSignificantDigits::Maximal),"2.6366666666667") == 0);
store.deleteAll();
}
void assertCalculationDisplay(const char * input, ::Calculation::Calculation::DisplayOutput display, ::Calculation::Calculation::EqualSign sign, const char * exactOutput, const char * approximateOutput, Context * context, CalculationStore * store) {
store->push(input, context);
void assertCalculationIs(const char * input, DisplayOutput display, EqualSign sign, const char * exactOutput, const char * displayedApproximateOutput, const char * storedApproximateOutput, Context * context, CalculationStore * store) {
store->push(input, context, dummyHeight);
Shared::ExpiringPointer<::Calculation::Calculation> lastCalculation = store->calculationAtIndex(0);
quiz_assert(lastCalculation->displayOutput(context) == display);
if (sign != ::Calculation::Calculation::EqualSign::Unknown) {
if (sign != EqualSign::Unknown) {
quiz_assert(lastCalculation->exactAndApproximateDisplayedOutputsAreEqual(context) == sign);
}
if (exactOutput) {
quiz_assert_print_if_failure(strcmp(lastCalculation->exactOutputText(), exactOutput) == 0, input);
}
if (approximateOutput) {
quiz_assert_print_if_failure(strcmp(lastCalculation->approximateOutputText(), approximateOutput) == 0, input);
if (displayedApproximateOutput) {
quiz_assert_print_if_failure(strcmp(lastCalculation->approximateOutputText(NumberOfSignificantDigits::UserDefined), displayedApproximateOutput) == 0, input);
}
if (storedApproximateOutput) {
quiz_assert_print_if_failure(strcmp(lastCalculation->approximateOutputText(NumberOfSignificantDigits::Maximal), storedApproximateOutput) == 0, input);
}
store->deleteAll();
}
QUIZ_CASE(calculation_significant_digits) {
Shared::GlobalContext globalContext;
CalculationStore store(calculationBuffer,calculationBufferSize);
assertCalculationIs("123456789", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "123456789", "1.234568ᴇ8", "123456789", &globalContext, &store);
assertCalculationIs("1234567", DisplayOutput::ApproximateOnly, EqualSign::Equal, "1234567", "1234567", "1234567", &globalContext, &store);
}
QUIZ_CASE(calculation_display_exact_approximate) {
Shared::GlobalContext globalContext;
CalculationStore store;
CalculationStore store(calculationBuffer,calculationBufferSize);
assertCalculationDisplay("1/2", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Equal, nullptr, nullptr, &globalContext, &store);
assertCalculationDisplay("1/3", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Approximation, nullptr, nullptr, &globalContext, &store);
assertCalculationDisplay("1/0", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, "undef", "undef", &globalContext, &store);
assertCalculationDisplay("2x-x", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, "undef", "undef", &globalContext, &store);
assertCalculationDisplay("[[1,2,3]]", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, nullptr, &globalContext, &store);
assertCalculationDisplay("[[1,x,3]]", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "undef", &globalContext, &store);
assertCalculationDisplay("28^7", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Unknown, nullptr, nullptr, &globalContext, &store);
assertCalculationDisplay("3+√(2)→a", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Approximation, "√(2)+3", nullptr, &globalContext, &store);
assertCalculationIs("1/2", DisplayOutput::ExactAndApproximate, EqualSign::Equal, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("1/3", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("1/0", DisplayOutput::ExactOnly, EqualSign::Unknown, "undef", "undef", "undef", &globalContext, &store);
assertCalculationIs("2x-x", DisplayOutput::ExactOnly, EqualSign::Unknown, "x", "undef", "undef", &globalContext, &store);
assertCalculationIs("[[1,2,3]]", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("[[1,x,3]]", DisplayOutput::ExactAndApproximate, EqualSign::Unknown, nullptr, "[[1,undef,3]]", "[[1,undef,3]]", &globalContext, &store);
assertCalculationIs("28^7", DisplayOutput::ExactAndApproximate, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("3+√(2)→a", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "√(2)+3", nullptr, nullptr, &globalContext, &store);
Ion::Storage::sharedStorage()->recordNamed("a.exp").destroy();
assertCalculationDisplay("3+2→a", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Equal, "5", "5", &globalContext, &store);
assertCalculationIs("3+2→a", DisplayOutput::ApproximateOnly, EqualSign::Equal, "5", "5", "5", &globalContext, &store);
Ion::Storage::sharedStorage()->recordNamed("a.exp").destroy();
assertCalculationDisplay("3→a", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Equal, "3", "3", &globalContext, &store);
assertCalculationIs("3→a", DisplayOutput::ApproximateOnly, EqualSign::Equal, "3", "3", "3", &globalContext, &store);
Ion::Storage::sharedStorage()->recordNamed("a.exp").destroy();
assertCalculationDisplay("3+x→f(x)", ::Calculation::Calculation::DisplayOutput::ExactOnly, ::Calculation::Calculation::EqualSign::Unknown, "x+3", nullptr, &globalContext, &store);
assertCalculationIs("3+x→f(x)", DisplayOutput::ExactOnly, EqualSign::Unknown, "x+3", nullptr, nullptr, &globalContext, &store);
Ion::Storage::sharedStorage()->recordNamed("f.func").destroy();
assertCalculationDisplay("1+1+random()", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, nullptr, &globalContext, &store);
assertCalculationDisplay("1+1+round(1.343,2)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "3.34", &globalContext, &store);
assertCalculationDisplay("randint(2,2)+3", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, "5", "5", &globalContext, &store);
assertCalculationDisplay("confidence(0.5,2)+3", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, nullptr, &globalContext, &store);
assertCalculationDisplay("prediction(0.5,2)+3", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, nullptr, &globalContext, &store);
assertCalculationDisplay("prediction95(0.5,2)+3", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("1+1+random()", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("1+1+round(1.343,2)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "3.34", "3.34", &globalContext, &store);
assertCalculationIs("randint(2,2)+3", DisplayOutput::ApproximateOnly, EqualSign::Unknown, "5", "5", "5", &globalContext, &store);
assertCalculationIs("confidence(0.5,2)+3", DisplayOutput::ExactOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("prediction(0.5,2)+3", DisplayOutput::ExactOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("prediction95(0.5,2)+3", DisplayOutput::ExactOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
}
QUIZ_CASE(calculation_symbolic_computation) {
Shared::GlobalContext globalContext;
CalculationStore store;
CalculationStore store(calculationBuffer,calculationBufferSize);
assertCalculationDisplay("x+x+1+3+√(π)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, "undef", "undef", &globalContext, &store);
assertCalculationDisplay("f(x)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, "undef", "undef", &globalContext, &store);
assertCalculationDisplay("1+x→f(x)", ::Calculation::Calculation::DisplayOutput::ExactOnly, ::Calculation::Calculation::EqualSign::Unknown, "x+1", nullptr, &globalContext, &store);
assertCalculationDisplay("f(x)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, "undef", "undef", &globalContext, &store);
assertCalculationDisplay("f(2)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Equal, "3", "3", &globalContext, &store);
assertCalculationDisplay("2→x", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Equal, "2", nullptr, &globalContext, &store);
assertCalculationDisplay("f(x)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Equal, "3", nullptr, &globalContext, &store);
assertCalculationDisplay("x+x+1+3+√(π)", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Approximation, "√(π)+8", nullptr, &globalContext, &store);
assertCalculationIs("x+x+1+3+√(π)", DisplayOutput::ExactOnly, EqualSign::Unknown, "2×x+√(π)+4", "undef", "undef", &globalContext, &store);
assertCalculationIs("f(x)", DisplayOutput::ExactOnly, EqualSign::Unknown, "f×x", "undef", "undef", &globalContext, &store);
assertCalculationIs("1+x→f(x)", DisplayOutput::ExactOnly, EqualSign::Unknown, "x+1", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("f(x)", DisplayOutput::ExactOnly, EqualSign::Unknown, "x+1", "undef", "undef", &globalContext, &store);
assertCalculationIs("f(2)", DisplayOutput::ApproximateOnly, EqualSign::Equal, "3", "3", "3", &globalContext, &store);
assertCalculationIs("2→x", DisplayOutput::ApproximateOnly, EqualSign::Equal, "2", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("f(x)", DisplayOutput::ApproximateOnly, EqualSign::Equal, "3", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("x+x+1+3+√(π)", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "√(π)+8", nullptr, nullptr, &globalContext, &store);
Ion::Storage::sharedStorage()->recordNamed("f.func").destroy();
Ion::Storage::sharedStorage()->recordNamed("x.exp").destroy();
@@ -118,18 +155,18 @@ QUIZ_CASE(calculation_symbolic_computation) {
QUIZ_CASE(calculation_symbolic_computation_and_parametered_expressions) {
Shared::GlobalContext globalContext;
CalculationStore store;
CalculationStore store(calculationBuffer,calculationBufferSize);
assertCalculationDisplay("int((^(-x))-x^(0.5), x, 0, 3)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, nullptr, &globalContext, &store); // Tests a bug with symbolic computation
assertCalculationDisplay("int(x,x,0,2)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "2", &globalContext, &store);
assertCalculationDisplay("sum(x,x,0,2)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "3", &globalContext, &store);
assertCalculationDisplay("product(x,x,1,2)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "2", &globalContext, &store);
assertCalculationDisplay("diff(x^2,x,3)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "6", &globalContext, &store);
assertCalculationDisplay("2→x", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, nullptr, &globalContext, &store);
assertCalculationDisplay("int(x,x,0,2)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "2", &globalContext, &store);
assertCalculationDisplay("sum(x,x,0,2)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "3", &globalContext, &store);
assertCalculationDisplay("product(x,x,1,2)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "2", &globalContext, &store);
assertCalculationDisplay("diff(x^2,x,3)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "6", &globalContext, &store);
assertCalculationIs("int((^(-x))-x^(0.5), x, 0, 3)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store); // Tests a bug with symbolic computation
assertCalculationIs("int(x,x,0,2)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "2", "2", &globalContext, &store);
assertCalculationIs("sum(x,x,0,2)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "3", "3", &globalContext, &store);
assertCalculationIs("product(x,x,1,2)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "2", "2", &globalContext, &store);
assertCalculationIs("diff(x^2,x,3)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "6", "6", &globalContext, &store);
assertCalculationIs("2→x", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("int(x,x,0,2)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "2", "2", &globalContext, &store);
assertCalculationIs("sum(x,x,0,2)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "3", "3", &globalContext, &store);
assertCalculationIs("product(x,x,1,2)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "2", "2", &globalContext, &store);
assertCalculationIs("diff(x^2,x,3)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "6", "6", &globalContext, &store);
Ion::Storage::sharedStorage()->recordNamed("x.exp").destroy();
}
@@ -137,34 +174,34 @@ QUIZ_CASE(calculation_symbolic_computation_and_parametered_expressions) {
QUIZ_CASE(calculation_complex_format) {
Shared::GlobalContext globalContext;
CalculationStore store;
CalculationStore store(calculationBuffer,calculationBufferSize);
Poincare::Preferences::sharedPreferences()->setComplexFormat(Poincare::Preferences::ComplexFormat::Real);
assertCalculationDisplay("1+𝐢", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "1+𝐢", &globalContext, &store);
assertCalculationDisplay("√(-1)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, "unreal", nullptr, &globalContext, &store);
assertCalculationDisplay("ln(-2)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "unreal", &globalContext, &store);
assertCalculationDisplay("√(-1)×√(-1)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "unreal", &globalContext, &store);
assertCalculationDisplay("(-8)^(1/3)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "-2", &globalContext, &store);
assertCalculationDisplay("(-8)^(2/3)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "4", &globalContext, &store);
assertCalculationDisplay("(-2)^(1/4)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "unreal", &globalContext, &store);
assertCalculationIs("1+𝐢", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "1+𝐢", "1+𝐢", &globalContext, &store);
assertCalculationIs("√(-1)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, "unreal", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("ln(-2)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "unreal", "unreal", &globalContext, &store);
assertCalculationIs("√(-1)×√(-1)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "unreal", "unreal", &globalContext, &store);
assertCalculationIs("(-8)^(1/3)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "-2", "-2", &globalContext, &store);
assertCalculationIs("(-8)^(2/3)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "4", "4", &globalContext, &store);
assertCalculationIs("(-2)^(1/4)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "unreal", "unreal", &globalContext, &store);
Poincare::Preferences::sharedPreferences()->setComplexFormat(Poincare::Preferences::ComplexFormat::Cartesian);
assertCalculationDisplay("1+𝐢", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "1+𝐢", &globalContext, &store);
assertCalculationDisplay("√(-1)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "𝐢", &globalContext, &store);
assertCalculationDisplay("ln(-2)", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Approximation, "ln(-2)", nullptr, &globalContext, &store);
assertCalculationDisplay("√(-1)×√(-1)", ::Calculation::Calculation::DisplayOutput::ApproximateOnly, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "-1", &globalContext, &store);
assertCalculationDisplay("(-8)^(1/3)", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Approximation, "1+√(3)×𝐢", nullptr, &globalContext, &store);
assertCalculationDisplay("(-8)^(2/3)", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Approximation, "-2+2×√(3)×𝐢", nullptr, &globalContext, &store);
assertCalculationDisplay("(-2)^(1/4)", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Approximation, "root(8,4)/2+root(8,4)/2×𝐢", nullptr, &globalContext, &store);
assertCalculationIs("1+𝐢", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "1+𝐢", "1+𝐢", &globalContext, &store);
assertCalculationIs("√(-1)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "𝐢", "𝐢", &globalContext, &store);
assertCalculationIs("ln(-2)", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "ln(-2)", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("√(-1)×√(-1)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "-1", "-1", &globalContext, &store);
assertCalculationIs("(-8)^(1/3)", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "1+√(3)×𝐢", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("(-8)^(2/3)", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "-2+2×√(3)×𝐢", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("(-2)^(1/4)", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "root(8,4)/2+root(8,4)/2×𝐢", nullptr, nullptr, &globalContext, &store);
Poincare::Preferences::sharedPreferences()->setComplexFormat(Poincare::Preferences::ComplexFormat::Polar);
assertCalculationDisplay("1+𝐢", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Approximation, "√(2)×^\u0012π/4×𝐢\u0013", nullptr, &globalContext, &store);
assertCalculationDisplay("√(-1)", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Approximation, "^\u0012π/2×𝐢\u0013", nullptr, &globalContext, &store);
assertCalculationDisplay("ln(-2)", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Approximation, "ln(-2)", nullptr, &globalContext, &store);
assertCalculationDisplay("√(-1)×√(-1)", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Unknown, nullptr, "^\u00123.1415926535898×𝐢\u0013", &globalContext, &store);
assertCalculationDisplay("(-8)^(1/3)", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Approximation, "2×^\u0012π/3×𝐢\u0013", nullptr, &globalContext, &store);
assertCalculationDisplay("(-8)^(2/3)", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Approximation, "4×^\u0012\u00122×π\u0013/3×𝐢\u0013", nullptr, &globalContext, &store);
assertCalculationDisplay("(-2)^(1/4)", ::Calculation::Calculation::DisplayOutput::ExactAndApproximate, ::Calculation::Calculation::EqualSign::Approximation, "root(2,4)×^\u0012π/4×𝐢\u0013", nullptr, &globalContext, &store);
assertCalculationIs("1+𝐢", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "√(2)×^\u0012π/4×𝐢\u0013", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("√(-1)", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "^\u0012π/2×𝐢\u0013", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("ln(-2)", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "ln(-2)", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("√(-1)×√(-1)", DisplayOutput::ExactAndApproximate, EqualSign::Unknown, nullptr, "^\u00123.141593×𝐢\u0013", "^\u00123.1415926535898×𝐢\u0013", &globalContext, &store);
assertCalculationIs("(-8)^(1/3)", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "2×^\u0012π/3×𝐢\u0013", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("(-8)^(2/3)", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "4×^\u0012\u00122×π\u0013/3×𝐢\u0013", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("(-2)^(1/4)", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "root(2,4)×^\u0012π/4×𝐢\u0013", nullptr, nullptr, &globalContext, &store);
Poincare::Preferences::sharedPreferences()->setComplexFormat(Poincare::Preferences::ComplexFormat::Cartesian);
}

12
apps/clock_timer.cpp Normal file
View File

@@ -0,0 +1,12 @@
#include "clock_timer.h"
#include "apps_container.h"
ClockTimer::ClockTimer(AppsContainer * container) :
Timer(1),
m_container(container)
{
}
bool ClockTimer::fire() {
return m_container->updateClock();
}

16
apps/clock_timer.h Normal file
View File

@@ -0,0 +1,16 @@
#ifndef APPS_CLOCK_TIMER_H
#define APPS_CLOCK_TIMER_H
#include <escher.h>
class AppsContainer;
class ClockTimer : public Timer {
public:
ClockTimer(AppsContainer * container);
private:
bool fire() override;
AppsContainer * m_container;
};
#endif

View File

@@ -1,6 +1,8 @@
apps += Code::App
app_headers += apps/code/app.h
SFLAGS += -DHAS_CODE
app_code_src = $(addprefix apps/code/,\
app.cpp \
console_controller.cpp \
@@ -11,39 +13,33 @@ app_code_src = $(addprefix apps/code/,\
editor_view.cpp \
helpers.cpp \
menu_controller.cpp \
python_toolbox.cpp \
python_text_area.cpp \
sandbox_controller.cpp \
script.cpp \
script_name_cell.cpp \
script_node_cell.cpp \
script_parameter_controller.cpp \
toolbox_ion_keys.cpp \
)
app_code_test_src = $(addprefix apps/code/,\
python_toolbox.cpp \
script.cpp \
script_node_cell.cpp \
script_store.cpp \
script_template.cpp \
variable_box_empty_controller.cpp \
variable_box_controller.cpp \
)
app_src += $(app_code_src)
i18n_files += $(addprefix apps/code/,\
base.de.i18n\
base.en.i18n\
base.es.i18n\
base.fr.i18n\
base.pt.i18n\
base.universal.i18n\
catalog.de.i18n\
catalog.en.i18n\
catalog.es.i18n\
catalog.fr.i18n\
catalog.pt.i18n\
catalog.universal.i18n\
toolbox.de.i18n\
toolbox.en.i18n\
toolbox.es.i18n\
toolbox.fr.i18n\
toolbox.pt.i18n\
toolbox.universal.i18n\
tests_src += $(addprefix apps/code/test/,\
variable_box_controller.cpp\
toolbox_ion_keys_dummy.cpp \
)
app_code_src += $(app_code_test_src)
apps_src += $(app_code_src)
i18n_files += $(call i18n_with_universal_for,code/base)
i18n_files += $(call i18n_with_universal_for,code/catalog)
i18n_files += $(call i18n_with_universal_for,code/toolbox)
$(eval $(call depends_on_image,apps/code/app.cpp,apps/code/code_icon.png))

View File

@@ -14,6 +14,10 @@ I18n::Message App::Descriptor::upperName() {
return I18n::Message::CodeAppCapital;
}
App::Descriptor::ExaminationLevel App::Descriptor::examinationLevel() {
return App::Descriptor::ExaminationLevel::Basic;
}
const Image * App::Descriptor::icon() {
return ImageStore::CodeIcon;
}
@@ -21,6 +25,7 @@ const Image * App::Descriptor::icon() {
App::Snapshot::Snapshot() :
#if EPSILON_GETOPT
m_lockOnConsole(false),
m_hasBeenWiped(false),
#endif
m_scriptStore()
{
@@ -46,7 +51,11 @@ bool App::Snapshot::lockOnConsole() const {
void App::Snapshot::setOpt(const char * name, const char * value) {
if (strcmp(name, "script") == 0) {
m_scriptStore.deleteAllScripts();
if (!m_hasBeenWiped) {
m_hasBeenWiped = true;
m_scriptStore.deleteAllScripts();
}
char * separator = const_cast<char *>(UTF8Helper::CodePointSearch(value, ':'));
if (*separator == 0) {
return;
@@ -61,7 +70,7 @@ void App::Snapshot::setOpt(const char * name, const char * value) {
const char * scriptContent = separator;
Code::ScriptTemplate script(scriptName, scriptContent);
m_scriptStore.addScriptFromTemplate(&script);
m_scriptStore.scriptNamed(scriptName).toggleImportationStatus(); // set Importation Status to 1
ScriptStore::ScriptNamed(scriptName).toggleAutoimportationStatus(); // set Importation Status to 1
return;
}
if (strcmp(name, "lock-on-console") == 0) {
@@ -80,16 +89,18 @@ App::App(Snapshot * snapshot) :
, snapshot->lockOnConsole()
#endif
),
m_listFooter(&m_codeStackViewController, &m_menuController, &m_menuController, ButtonRowController::Position::Bottom, ButtonRowController::Style::EmbossedGrey, ButtonRowController::Size::Large),
m_listFooter(&m_codeStackViewController, &m_menuController, &m_menuController, ButtonRowController::Position::Bottom, ButtonRowController::Style::EmbossedGray, ButtonRowController::Size::Large),
m_menuController(&m_listFooter, this, snapshot->scriptStore(), &m_listFooter),
m_codeStackViewController(&m_modalViewController, &m_listFooter),
m_variableBoxController(snapshot->scriptStore())
{
Clipboard::sharedClipboard()->enterPython();
}
App::~App() {
assert(!m_consoleController.inputRunLoopActive());
deinitPython();
Clipboard::sharedClipboard()->exitPython();
}
bool App::handleEvent(Ion::Events::Event event) {
@@ -105,6 +116,10 @@ bool App::handleEvent(Ion::Events::Event event) {
return false;
}
void App::willExitResponderChain(Responder * nextFirstResponder) {
m_menuController.willExitApp();
}
Toolbox * App::toolboxForInputEventHandler(InputEventHandler * textInput) {
return &m_toolbox;
}

View File

@@ -9,6 +9,7 @@
#include "script_store.h"
#include "python_toolbox.h"
#include "variable_box_controller.h"
#include "../shared/shared_app.h"
namespace Code {
@@ -18,9 +19,10 @@ public:
public:
I18n::Message name() override;
I18n::Message upperName() override;
App::Descriptor::ExaminationLevel examinationLevel() override;
const Image * icon() override;
};
class Snapshot : public ::App::Snapshot {
class Snapshot : public SharedApp::Snapshot {
public:
Snapshot();
App * unpack(Container * container) override;
@@ -33,6 +35,7 @@ public:
private:
#if EPSILON_GETOPT
bool m_lockOnConsole;
bool m_hasBeenWiped;
#endif
ScriptStore m_scriptStore;
};
@@ -40,6 +43,7 @@ public:
return static_cast<App *>(Container::activeApp());
}
~App();
TELEMETRY_ID("Code");
bool prepareForExit() override {
if (m_consoleController.inputRunLoopActive()) {
m_consoleController.terminateInputLoop();
@@ -49,9 +53,11 @@ public:
}
StackViewController * stackViewController() { return &m_codeStackViewController; }
ConsoleController * consoleController() { return &m_consoleController; }
MenuController * menuController() { return &m_menuController; }
/* Responder */
bool handleEvent(Ion::Events::Event event) override;
void willExitResponderChain(Responder * nextFirstResponder) override;
/* InputEventHandlerDelegate */
Toolbox * toolboxForInputEventHandler(InputEventHandler * textInput) override;
@@ -68,13 +74,15 @@ public:
void deinitPython();
VariableBoxController * variableBoxController() { return &m_variableBoxController; }
static constexpr int k_pythonHeapSize = 67000;
private:
/* Python delegate:
* MicroPython requires a heap. To avoid dynamic allocation, we keep a working
* buffer here and we give to controllers that load Python environment. We
* also memoize the last Python user to avoid re-initiating MicroPython when
* unneeded. */
static constexpr int k_pythonHeapSize = 32768; // Default value: 16384
char m_pythonHeap[k_pythonHeapSize];
const void * m_pythonUser;

View File

@@ -1,8 +1,15 @@
Console = "Interaktive Konsole"
AddScript = "Skript hinzufügen"
ScriptOptions = "Skriptoptionen"
ExecuteScript = "Skript ausführen"
AutoImportScript = "Automatischer Import in Konsole"
DeleteScript = "Skript löschen"
FunctionsAndVariables = "Funktionen und Variablen"
AllowedCharactersaz09 = "Erlaubte Zeichen: a-z, 0-9, _"
Autocomplete = "Autovervollständigung"
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 = "Hier ist kein Wort verfügbar."
ScriptInProgress = "Aktuelles Skript"
ScriptOptions = "Skriptoptionen"
ScriptSize = "Skriptgröße"

View File

@@ -1,8 +1,15 @@
Console = "Python shell"
AddScript = "Add a script"
ScriptOptions = "Script options"
ExecuteScript = "Execute script"
AutoImportScript = "Auto import in shell"
DeleteScript = "Delete script"
FunctionsAndVariables = "Functions and variables"
AllowedCharactersaz09 = "Allowed characters: a-z, 0-9, _"
Autocomplete = "Autocomplete"
AutoImportScript = "Auto import in shell"
BuiltinsAndKeywords = "Builtins and keywords"
Console = "Python shell"
DeleteScript = "Delete script"
DuplicateScript = "Duplicate script"
ExecuteScript = "Execute script"
FunctionsAndVariables = "Functions and variables"
ImportedModulesAndScripts = "Imported modules and scripts"
NoWordAvailableHere = "No word available here."
ScriptInProgress = "Script in progress"
ScriptOptions = "Script options"
ScriptSize = "Script size"

View File

@@ -1,8 +1,15 @@
Console = "Interprete de comandos"
AddScript = "Agregar un archivo"
ScriptOptions = "Opciones del archivo"
ExecuteScript = "Ejecutar el archivo"
AutoImportScript = "Importación auto en intérprete"
DeleteScript = "Eliminar el archivo"
FunctionsAndVariables = "Funciones y variables"
AllowedCharactersaz09 = "Caracteres permitidos : a-z, 0-9, _"
Autocomplete = "Autocompleción"
AutoImportScript = "Importación auto en intérprete"
BuiltinsAndKeywords = "Funciones nativas y palabras clave"
Console = "Interprete de comandos"
DeleteScript = "Eliminar el archivo"
DuplicateScript = "Duplicar el guión"
ExecuteScript = "Ejecutar el archivo"
FunctionsAndVariables = "Funciones y variables"
ImportedModulesAndScripts = "Módulos y archivos importados"
NoWordAvailableHere = "No hay ninguna palabra disponible aquí."
ScriptInProgress = "Archivo en curso"
ScriptOptions = "Opciones del archivo"
ScriptSize = "Tamaño del script"

View File

@@ -1,8 +1,15 @@
Console = "Console d'exécution"
AddScript = "Ajouter un script"
ScriptOptions = "Options de script"
ExecuteScript = "Exécuter le script"
AutoImportScript = "Importation auto dans la console"
DeleteScript = "Supprimer le script"
FunctionsAndVariables = "Fonctions et variables"
AllowedCharactersaz09 = "Caractères autorisés : a-z, 0-9, _"
Autocomplete = "Auto-complétion"
AutoImportScript = "Importation auto dans la console"
BuiltinsAndKeywords = "Fonctions natives et mots-clés"
Console = "Console d'exécution"
DeleteScript = "Supprimer le script"
DuplicateScript = "Dupliquer le script"
ExecuteScript = "Exécuter le script"
FunctionsAndVariables = "Fonctions et variables"
ImportedModulesAndScripts = "Modules et scripts importés"
NoWordAvailableHere = "Aucun mot disponible à cet endroit."
ScriptInProgress = "Script en cours"
ScriptOptions = "Options de script"
ScriptSize = "Taille du script"

15
apps/code/base.hu.i18n Normal file
View File

@@ -0,0 +1,15 @@
AddScript = "Script hozzáadása"
AllowedCharactersaz09 = "Engedélyezett karakterek: a-z, 0-9, _"
Autocomplete = "Önkiegészítés"
AutoImportScript = "Script automata importálása"
BuiltinsAndKeywords = "Beépített fonkciók és szókincs"
Console = "Konzol"
DeleteScript = "Script törlése"
DuplicateScript = "Script másolása"
ExecuteScript = "Script indítása"
FunctionsAndVariables = "Fonktiók és változók"
ImportedModulesAndScripts = "Importált scriptek és modulok"
NoWordAvailableHere = "Nincs rendelkezésre álló szó."
ScriptInProgress = "Script müködésben"
ScriptOptions = "Script beállítások"
ScriptSize = "Script mérete"

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